6.6 KiB
Plugin SQL Target Executor Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Add a default-disabled, isolated, idempotent MySQL target Executor with a target-side receipt ledger.
Architecture: Transition Plan 1.2 freezes an idempotence declaration. A Druid-AST policy accepts only a repeatable SQL subset, a guarded connection factory proves the target differs from the control catalog, and sql-jdbc:v1 claims a target-side leased receipt before running normalized statements.
Tech Stack: Java 8, Spring Boot 2.5, Druid SQL AST 1.2.23, JDBC, MySQL 5.7-compatible DDL, H2 1.4.200 test scope, JUnit 4, Mockito, Vue 2.
Global Constraints
sql-jdbc:v1is disabled by default and never falls back to the control DataSource.- JDBC URL, username, and password must never appear in API responses or logs.
- Real SQL requires immutable
idempotent=trueand Transition Plan schema 1.2. - Only the SQL AST whitelist in the design may execute; no string-based SQL splitting is allowed.
- Existing plaintext development credentials and TLS verification settings remain out of scope by explicit user decision.
Task 1: Immutable Idempotence Contract
Files:
-
Modify:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/model/PluginContributionPayload.java -
Modify:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/model/PluginTransitionStep.java -
Modify:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/model/PluginTransitionPlan.java -
Modify:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/PluginTransitionPlanner.java -
Modify:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/ResolvedPluginContribution.java -
Modify:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/PluginContributionContentResolver.java -
Modify:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/PluginTransitionWorkResolver.java -
Test:
ruoyi-generator/src/test/java/com/ruoyi/generator/factory/plugin/PluginTransitionPlannerTest.java -
Test:
ruoyi-generator/src/test/java/com/ruoyi/generator/factory/plugin/execution/PluginContributionContentResolverTest.java -
Write failing tests for Plan 1.2 idempotence identity, changed declaration rejection, and 1.1 compensation compatibility.
-
Propagate and verify the immutable idempotence flag through payload, plan, and resolved contribution.
-
Run planner/resolver tests and confirm they pass.
Task 2: Target Configuration And Connection Isolation
Files:
-
Create:
ruoyi-generator/src/main/java/com/ruoyi/generator/config/PluginSqlTargetProperties.java -
Create:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/sql/PluginSqlTargetConnectionFactory.java -
Create:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/sql/ConfiguredPluginSqlTargetConnectionFactory.java -
Modify:
ruoyi-admin/src/main/resources/application.yml -
Test:
ruoyi-generator/src/test/java/com/ruoyi/generator/factory/plugin/execution/sql/PluginSqlTargetConfigurationTest.java -
Write failing tests for disabled defaults, bounded lease, required safe identifiers, MySQL URL restriction, catalog match, and control-target rejection.
-
Implement configuration validation and guarded DriverManager connection creation.
-
Run configuration tests and confirm they pass.
Task 3: Strict SQL AST Policy
Files:
-
Create:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/sql/PluginSqlMigrationParser.java -
Test:
ruoyi-generator/src/test/java/com/ruoyi/generator/factory/plugin/execution/sql/PluginSqlMigrationParserTest.java -
Write failing parser tests for allowed repeatable DDL/DML, literal semicolons, unsupported statements, missing idempotent clauses, statement limits, and cross-catalog references.
-
Implement Druid MySQL AST parsing, table-source inspection, and normalized statement output.
-
Run parser tests and confirm they pass.
Task 4: Target Receipt Ledger And Executor
Files:
-
Create:
sql/factory_plugin_sql_target.sql -
Create:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/sql/PluginSqlTargetReceiptClaim.java -
Create:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/sql/PluginSqlTargetReceiptLedger.java -
Create:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/sql/SqlJdbcPluginContributionTargetExecutor.java -
Modify:
ruoyi-generator/pom.xml -
Test:
ruoyi-generator/src/test/java/com/ruoyi/generator/factory/plugin/execution/sql/SqlJdbcPluginContributionTargetExecutorTest.java -
Write failing H2 MySQL-mode tests for first execution, deterministic receipt, duplicate success deduplication, active target lease rejection, expired/failed replay, and rollback contribution execution.
-
Implement target receipt claim/complete/fail transactions and the
sql-jdbc:v1Executor. -
Add the isolated target receipt DDL and H2 test dependency.
-
Run Executor tests and confirm they pass.
Task 5: Readiness Status And Admin UI
Files:
-
Modify:
ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/model/PluginRegistryStatus.java -
Modify:
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/FeaturePluginController.java -
Modify:
ruoyi-generator/src/test/java/com/ruoyi/generator/controller/FeaturePluginControllerTest.java -
Modify:
ruoyi-ui/src/views/generator/plugin/index.vue -
Modify:
ruoyi-ui/test/pluginRegistryView.test.mjs -
Write failing backend/frontend contracts for configured Executor and non-secret SQL target readiness.
-
Expose only executor code, enabled/readiness, environment code, and allowed catalog.
-
Add the concise target state to the existing Registry status band.
-
Run controller/static UI tests and the production build.
Task 6: Documentation And Regression
Files:
-
Modify:
docs/superpowers/specs/2026-07-10-ai-software-factory-roadmap.md -
Modify:
docs/superpowers/plans/2026-07-11-plugin-sql-target-executor.md -
Document D8e2b activation order, SQL whitelist, target receipt semantics, and remaining permission/menu boundary.
-
Run focused Plugin/Outbox/SQL Executor tests.
-
Run generator full regression and compare with the documented 18 baseline failures.
-
Run admin critical tests, frontend static tests, and the production build.
-
Confirm EasyCode and RuoYi UI endpoints still return HTTP 200.