agentic-orchestrator 0.1.28 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +46 -1
- package/.cortexrc +28 -0
- package/.github/agents/copilot-instructions.md +29 -0
- package/.github/copilot-instructions.md +93 -0
- package/.vscode/settings.json +13 -0
- package/.vscode/tms.code-snippets +223 -0
- package/AGENTS.md +72 -1
- package/Agentic-Orchestrator.iml +12 -11
- package/CLAUDE.md +72 -1
- package/CONSTITUTION.md +504 -0
- package/FUTURE-ENHANCEMENTS.md +85 -0
- package/NEXT-TASKS.md +25 -0
- package/PROMPTS.md +161 -0
- package/README.md +126 -29
- package/agentic/orchestrator/agents.yaml +4 -3
- package/agentic/orchestrator/defaults/policy.defaults.yaml +39 -3
- package/agentic/orchestrator/gates.yaml +15 -3
- package/agentic/orchestrator/policy.yaml +47 -3
- package/agentic/orchestrator/prompts/builder.system.md +69 -20
- package/agentic/orchestrator/prompts/planner-intake.system.md +149 -0
- package/agentic/orchestrator/prompts/planner.system.md +113 -40
- package/agentic/orchestrator/prompts/qa.system.md +73 -18
- package/agentic/orchestrator/prompts/reconciler.system.md +119 -0
- package/agentic/orchestrator/schemas/agents.schema.json +89 -1
- package/agentic/orchestrator/schemas/execution-control.schema.json +242 -0
- package/agentic/orchestrator/schemas/index.schema.json +234 -0
- package/agentic/orchestrator/schemas/intake.review.schema.json +82 -0
- package/agentic/orchestrator/schemas/organizer-ordering-artifact.schema.json +75 -0
- package/agentic/orchestrator/schemas/plan.schema.json +44 -0
- package/agentic/orchestrator/schemas/policy.schema.json +238 -9
- package/agentic/orchestrator/schemas/policy.user.schema.json +129 -1
- package/agentic/orchestrator/schemas/spec.manifest.bootstrap.schema.json +101 -0
- package/agentic/orchestrator/schemas/spec.manifest.verified.schema.json +80 -0
- package/agentic/orchestrator/schemas/state.schema.json +298 -3
- package/agentic/orchestrator/tools/catalog.json +145 -15
- package/agentic/orchestrator/tools/schemas/input/doctor.run.input.schema.json +18 -0
- package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +4 -0
- package/agentic/orchestrator/tools/schemas/input/evidence.verify_chain.input.schema.json +13 -0
- package/agentic/orchestrator/tools/schemas/input/feature.intake_submit.input.schema.json +11 -0
- package/agentic/orchestrator/tools/schemas/input/feature.question_answer.input.schema.json +15 -0
- package/agentic/orchestrator/tools/schemas/input/feature.question_create.input.schema.json +21 -0
- package/agentic/orchestrator/tools/schemas/input/feature.question_list.input.schema.json +13 -0
- package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +5 -0
- package/agentic/orchestrator/tools/schemas/input/feature.send_message.input.schema.json +1 -1
- package/agentic/orchestrator/tools/schemas/input/replay.timeline_get.input.schema.json +32 -0
- package/agentic/orchestrator/tools/schemas/input/repo.conflict_abort.input.schema.json +16 -0
- package/agentic/orchestrator/tools/schemas/input/repo.conflict_files.input.schema.json +16 -0
- package/agentic/orchestrator/tools/schemas/input/repo.reconcile_mainline.input.schema.json +37 -0
- package/agentic/orchestrator/tools/schemas/input/repo.resolve_conflict.input.schema.json +40 -0
- package/agentic/orchestrator/tools/schemas/input/runtime.execution_request_list.input.schema.json +7 -0
- package/agentic/orchestrator/tools/schemas/input/runtime.execution_request_submit.input.schema.json +25 -0
- package/agentic/orchestrator/tools/schemas/output/doctor.run.output.schema.json +34 -0
- package/agentic/orchestrator/tools/schemas/output/evidence.verify_chain.output.schema.json +23 -0
- package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +62 -2
- package/agentic/orchestrator/tools/schemas/output/feature.intake_submit.output.schema.json +24 -0
- package/agentic/orchestrator/tools/schemas/output/feature.question_answer.output.schema.json +21 -0
- package/agentic/orchestrator/tools/schemas/output/feature.question_create.output.schema.json +12 -0
- package/agentic/orchestrator/tools/schemas/output/feature.question_list.output.schema.json +14 -0
- package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +31 -0
- package/agentic/orchestrator/tools/schemas/output/feature.send_message.output.schema.json +8 -18
- package/agentic/orchestrator/tools/schemas/output/replay.timeline_get.output.schema.json +64 -0
- package/agentic/orchestrator/tools/schemas/output/repo.conflict_abort.output.schema.json +16 -0
- package/agentic/orchestrator/tools/schemas/output/repo.conflict_files.output.schema.json +22 -0
- package/agentic/orchestrator/tools/schemas/output/repo.reconcile_mainline.output.schema.json +61 -0
- package/agentic/orchestrator/tools/schemas/output/repo.resolve_conflict.output.schema.json +19 -0
- package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +26 -0
- package/agentic/orchestrator/tools/schemas/output/runtime.execution_request_list.output.schema.json +17 -0
- package/agentic/orchestrator/tools/schemas/output/runtime.execution_request_submit.output.schema.json +24 -0
- package/agentic/orchestrator/tools.md +13 -0
- package/apps/control-plane/scripts/validate-mcp-contracts.ts +1 -1
- package/apps/control-plane/src/application/kernel-tool-wiring.ts +140 -2
- package/apps/control-plane/src/application/services/activity-monitor-service.ts +44 -1
- package/apps/control-plane/src/application/services/bootstrap-manifest-generator-service.ts +251 -0
- package/apps/control-plane/src/application/services/checkpoint-service.ts +87 -27
- package/apps/control-plane/src/application/services/collision-override-service.ts +906 -0
- package/apps/control-plane/src/application/services/collision-queue-service.ts +129 -38
- package/apps/control-plane/src/application/services/cost-tracking-service.ts +94 -0
- package/apps/control-plane/src/application/services/execution-control-service.ts +599 -0
- package/apps/control-plane/src/application/services/feature-deletion-service.ts +37 -1
- package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +182 -4
- package/apps/control-plane/src/application/services/feature-send-message-service.ts +17 -8
- package/apps/control-plane/src/application/services/feature-state-service.ts +191 -6
- package/apps/control-plane/src/application/services/gate-service.ts +121 -2
- package/apps/control-plane/src/application/services/git-reconciliation-service.ts +1591 -0
- package/apps/control-plane/src/application/services/intake-service.ts +1468 -0
- package/apps/control-plane/src/application/services/merge-service.ts +308 -17
- package/apps/control-plane/src/application/services/notifier-service.ts +3 -1
- package/apps/control-plane/src/application/services/performance-analytics-service.ts +75 -0
- package/apps/control-plane/src/application/services/plan-service.ts +336 -20
- package/apps/control-plane/src/application/services/question-service.ts +693 -0
- package/apps/control-plane/src/application/services/reactions-service.ts +73 -17
- package/apps/control-plane/src/application/services/replay-timeline-service.ts +295 -0
- package/apps/control-plane/src/application/services/reporting-service.ts +194 -10
- package/apps/control-plane/src/application/services/run-lease-service.ts +121 -5
- package/apps/control-plane/src/application/services/worktree-watchdog-service.ts +95 -8
- package/apps/control-plane/src/application/tools/tool-metadata.ts +7 -0
- package/apps/control-plane/src/application/usage-types.ts +138 -0
- package/apps/control-plane/src/cli/add-command-handler.ts +162 -0
- package/apps/control-plane/src/cli/answer-command-handler.ts +113 -0
- package/apps/control-plane/src/cli/attach-command-handler.ts +12 -3
- package/apps/control-plane/src/cli/cli-argument-parser.ts +133 -11
- package/apps/control-plane/src/cli/collision-command-handler.ts +113 -0
- package/apps/control-plane/src/cli/command-catalog.ts +479 -0
- package/apps/control-plane/src/cli/complete-command-handler.ts +23 -0
- package/apps/control-plane/src/cli/completion-command-handler.ts +25 -0
- package/apps/control-plane/src/cli/completion-resolver.ts +319 -0
- package/apps/control-plane/src/cli/completion-shell-renderer.ts +58 -0
- package/apps/control-plane/src/cli/dashboard-command-handler.ts +111 -1
- package/apps/control-plane/src/cli/dashboard-runtime-runner.ts +1036 -0
- package/apps/control-plane/src/cli/dashboard-runtime.ts +31 -0
- package/apps/control-plane/src/cli/help-command-handler.ts +17 -185
- package/apps/control-plane/src/cli/init-command-handler.ts +51 -6
- package/apps/control-plane/src/cli/merge-command-handler.ts +200 -0
- package/apps/control-plane/src/cli/questions-command-handler.ts +70 -0
- package/apps/control-plane/src/cli/replay-command-handler.ts +98 -0
- package/apps/control-plane/src/cli/resume-command-handler.ts +231 -16
- package/apps/control-plane/src/cli/retry-command-handler.ts +229 -17
- package/apps/control-plane/src/cli/retry-resume-decision.ts +75 -0
- package/apps/control-plane/src/cli/rollback-command-handler.ts +4 -2
- package/apps/control-plane/src/cli/run-command-handler.ts +35 -1
- package/apps/control-plane/src/cli/spec-ingestion-service.ts +45 -55
- package/apps/control-plane/src/cli/spec-preparation.ts +114 -0
- package/apps/control-plane/src/cli/spec-utils.ts +90 -11
- package/apps/control-plane/src/cli/status-command-handler.ts +122 -0
- package/apps/control-plane/src/cli/types.ts +41 -3
- package/apps/control-plane/src/core/collisions.ts +150 -31
- package/apps/control-plane/src/core/constants.ts +18 -1
- package/apps/control-plane/src/core/error-codes.ts +39 -0
- package/apps/control-plane/src/core/execution-control.ts +56 -0
- package/apps/control-plane/src/core/feature-resume-phase.ts +118 -0
- package/apps/control-plane/src/core/gate-freshness.ts +359 -0
- package/apps/control-plane/src/core/gate-log-extractor.ts +97 -0
- package/apps/control-plane/src/core/gates.ts +90 -1
- package/apps/control-plane/src/core/intake-artifacts.ts +295 -0
- package/apps/control-plane/src/core/kernel-types.ts +11 -0
- package/apps/control-plane/src/core/kernel.ts +604 -16
- package/apps/control-plane/src/core/mainline-conflict.ts +22 -0
- package/apps/control-plane/src/core/merge-repair.ts +149 -0
- package/apps/control-plane/src/core/path-layout.ts +46 -2
- package/apps/control-plane/src/core/path-rules.ts +11 -3
- package/apps/control-plane/src/core/plan-submit-recovery.ts +130 -0
- package/apps/control-plane/src/core/questions.ts +49 -0
- package/apps/control-plane/src/core/runtime-sessions.ts +4 -0
- package/apps/control-plane/src/core/schemas.ts +40 -1
- package/apps/control-plane/src/core/tool-caller.ts +25 -1
- package/apps/control-plane/src/core/utils/index-normalizer.ts +25 -4
- package/apps/control-plane/src/core/worktree-diff.ts +66 -0
- package/apps/control-plane/src/index.ts +29 -1
- package/apps/control-plane/src/interfaces/cli/bootstrap.ts +300 -6
- package/apps/control-plane/src/mcp/kernel-tool-executor.ts +17 -0
- package/apps/control-plane/src/mcp/tool-runtime.ts +63 -4
- package/apps/control-plane/src/providers/api-worker-provider.ts +62 -15
- package/apps/control-plane/src/providers/cli-worker-provider.ts +1037 -61
- package/apps/control-plane/src/providers/output-parsers/generic-output-parser.ts +99 -1
- package/apps/control-plane/src/providers/output-parsers/types.ts +2 -0
- package/apps/control-plane/src/providers/provider-defaults.ts +116 -7
- package/apps/control-plane/src/providers/providers.ts +225 -21
- package/apps/control-plane/src/providers/worker-provider-factory.ts +26 -2
- package/apps/control-plane/src/supervisor/artifact-stager.ts +52 -0
- package/apps/control-plane/src/supervisor/build-wave-executor.ts +477 -166
- package/apps/control-plane/src/supervisor/execution-enrollment-service.ts +408 -0
- package/apps/control-plane/src/supervisor/organizer-enrollment-scheduler.ts +117 -0
- package/apps/control-plane/src/supervisor/organizer-sidecar-service.ts +394 -0
- package/apps/control-plane/src/supervisor/plan-conformance-scorer.ts +2 -5
- package/apps/control-plane/src/supervisor/planner-phase.ts +85 -0
- package/apps/control-plane/src/supervisor/planning-wave-executor.ts +993 -64
- package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +20 -1
- package/apps/control-plane/src/supervisor/qa-wave-executor.ts +384 -177
- package/apps/control-plane/src/supervisor/run-coordinator.ts +723 -20
- package/apps/control-plane/src/supervisor/runtime.ts +485 -9
- package/apps/control-plane/src/supervisor/session-orchestrator.ts +220 -1
- package/apps/control-plane/src/supervisor/types.ts +152 -1
- package/apps/control-plane/src/supervisor/worker-decision-loop.ts +1030 -92
- package/apps/control-plane/test/activity-monitor.spec.ts +76 -0
- package/apps/control-plane/test/add-command-handler.spec.ts +189 -0
- package/apps/control-plane/test/application/services/feature-state-service.spec.ts +208 -0
- package/apps/control-plane/test/artifact-stager.spec.ts +93 -0
- package/apps/control-plane/test/batch-operations.spec.ts +58 -0
- package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +50 -2
- package/apps/control-plane/test/bootstrap-manifest-generator-service.spec.ts +99 -0
- package/apps/control-plane/test/bootstrap.spec.ts +177 -4
- package/apps/control-plane/test/checkpoint-service.spec.ts +977 -29
- package/apps/control-plane/test/cli-argument-parser.spec.ts +119 -0
- package/apps/control-plane/test/cli-helpers.spec.ts +1202 -12
- package/apps/control-plane/test/cli.unit.spec.ts +797 -16
- package/apps/control-plane/test/collision-command-handler.spec.ts +182 -0
- package/apps/control-plane/test/collision-override-service.spec.ts +878 -0
- package/apps/control-plane/test/collision-queue.spec.ts +430 -2
- package/apps/control-plane/test/collisions.spec.ts +209 -1
- package/apps/control-plane/test/core-utils.spec.ts +61 -0
- package/apps/control-plane/test/cost-tracking.spec.ts +224 -0
- package/apps/control-plane/test/dashboard-api.integration.spec.ts +185 -5
- package/apps/control-plane/test/dashboard-client.spec.ts +948 -0
- package/apps/control-plane/test/dashboard-command.spec.ts +138 -6
- package/apps/control-plane/test/dashboard-runtime-runner.spec.ts +1550 -0
- package/apps/control-plane/test/dashboard-runtime.spec.ts +138 -0
- package/apps/control-plane/test/dashboard-ui-utils.spec.ts +56 -12
- package/apps/control-plane/test/dependency-scheduler.spec.ts +7 -1
- package/apps/control-plane/test/env-file.spec.ts +76 -0
- package/apps/control-plane/test/execution-control-service.spec.ts +535 -0
- package/apps/control-plane/test/execution-enrollment-service.spec.ts +648 -0
- package/apps/control-plane/test/feature-lifecycle.spec.ts +126 -0
- package/apps/control-plane/test/feature-resume-phase.spec.ts +164 -0
- package/apps/control-plane/test/feature-send-message-service.spec.ts +161 -0
- package/apps/control-plane/test/feature-state-service.spec.ts +295 -0
- package/apps/control-plane/test/fs.spec.ts +80 -0
- package/apps/control-plane/test/gate-freshness.spec.ts +590 -0
- package/apps/control-plane/test/gate-log-extractor.spec.ts +170 -0
- package/apps/control-plane/test/gates.spec.ts +108 -0
- package/apps/control-plane/test/git-reconciliation-service.spec.ts +2307 -0
- package/apps/control-plane/test/helpers.ts +65 -0
- package/apps/control-plane/test/incremental-gates.spec.ts +271 -0
- package/apps/control-plane/test/index-normalizer.spec.ts +98 -0
- package/apps/control-plane/test/init-wizard.spec.ts +17 -0
- package/apps/control-plane/test/intake-artifacts.spec.ts +203 -0
- package/apps/control-plane/test/intake-service.spec.ts +3176 -0
- package/apps/control-plane/test/kernel-collision-replay.spec.ts +3 -2
- package/apps/control-plane/test/kernel-tool-executor.spec.ts +77 -0
- package/apps/control-plane/test/kernel-tool-wiring.spec.ts +279 -0
- package/apps/control-plane/test/kernel.branches.spec.ts +15 -2
- package/apps/control-plane/test/kernel.coverage.spec.ts +7 -3
- package/apps/control-plane/test/kernel.coverage2.spec.ts +731 -2
- package/apps/control-plane/test/kernel.spec.ts +464 -2
- package/apps/control-plane/test/mainline-conflict.spec.ts +66 -0
- package/apps/control-plane/test/mcp-helpers.spec.ts +79 -0
- package/apps/control-plane/test/mcp.spec.ts +177 -13
- package/apps/control-plane/test/merge-command-handler.spec.ts +531 -0
- package/apps/control-plane/test/merge-service.spec.ts +570 -4
- package/apps/control-plane/test/notifier-service.spec.ts +26 -0
- package/apps/control-plane/test/organizer-enrollment-scheduler.spec.ts +340 -0
- package/apps/control-plane/test/organizer-ordering-artifact.spec.ts +95 -0
- package/apps/control-plane/test/organizer-sidecar-service.spec.ts +468 -0
- package/apps/control-plane/test/output-loop-detector.spec.ts +6 -0
- package/apps/control-plane/test/path-layout.spec.ts +70 -0
- package/apps/control-plane/test/performance-analytics.spec.ts +124 -0
- package/apps/control-plane/test/plan-conformance-scorer.spec.ts +53 -0
- package/apps/control-plane/test/plan-service.spec.ts +686 -4
- package/apps/control-plane/test/planning-wave-executor.spec.ts +3272 -86
- package/apps/control-plane/test/policy-loader-service.spec.ts +5 -0
- package/apps/control-plane/test/prompt-overlay.spec.ts +65 -0
- package/apps/control-plane/test/provider-command-runner-epipe.spec.ts +64 -0
- package/apps/control-plane/test/providers/api-worker-provider.spec.ts +129 -0
- package/apps/control-plane/test/providers/cli-worker-provider.spec.ts +148 -0
- package/apps/control-plane/test/providers/usage-types.spec.ts +98 -0
- package/apps/control-plane/test/providers.spec.ts +293 -16
- package/apps/control-plane/test/question-command-handlers.spec.ts +156 -0
- package/apps/control-plane/test/question-service.spec.ts +1119 -0
- package/apps/control-plane/test/reactions.spec.ts +114 -0
- package/apps/control-plane/test/replay-command-handler.spec.ts +144 -0
- package/apps/control-plane/test/replay-timeline-service.spec.ts +459 -0
- package/apps/control-plane/test/response.spec.ts +31 -0
- package/apps/control-plane/test/resume-command.spec.ts +757 -9
- package/apps/control-plane/test/retry-resume-decision.spec.ts +133 -0
- package/apps/control-plane/test/rollback-command-handler.spec.ts +334 -0
- package/apps/control-plane/test/rollback-command.spec.ts +120 -0
- package/apps/control-plane/test/run-coordinator.spec.ts +3062 -404
- package/apps/control-plane/test/schemas/state.schema.spec.ts +71 -0
- package/apps/control-plane/test/service-retry-paths.spec.ts +112 -0
- package/apps/control-plane/test/services.spec.ts +472 -2
- package/apps/control-plane/test/session-management.spec.ts +346 -1
- package/apps/control-plane/test/spec-ingestion.spec.ts +102 -28
- package/apps/control-plane/test/spec-preparation.spec.ts +182 -0
- package/apps/control-plane/test/supervisor-collaborators.spec.ts +191 -3
- package/apps/control-plane/test/supervisor.calltool.spec.ts +198 -0
- package/apps/control-plane/test/supervisor.spec.ts +95 -16
- package/apps/control-plane/test/supervisor.unit.spec.ts +385 -18
- package/apps/control-plane/test/tool-runtime.spec.ts +122 -0
- package/apps/control-plane/test/worker-decision-loop.spec.ts +3479 -476
- package/apps/control-plane/test/worker-execution-policy.spec.ts +1416 -6
- package/apps/control-plane/test/worker-provider-adapters.spec.ts +1894 -37
- package/apps/control-plane/test/worker-provider-factory.spec.ts +81 -0
- package/apps/control-plane/test/worktree-watchdog-service.spec.ts +125 -0
- package/apps/control-plane/vitest.config.ts +5 -0
- package/config/agentic/orchestrator/agents.yaml +22 -1
- package/config/agentic/orchestrator/gates.yaml +24 -7
- package/config/agentic/orchestrator/policy.yaml +23 -1
- package/config/agentic/orchestrator/prompts/builder.system.md +69 -20
- package/config/agentic/orchestrator/prompts/organizer.system.md +85 -0
- package/config/agentic/orchestrator/prompts/overrides/builder.claude.md +28 -0
- package/config/agentic/orchestrator/prompts/overrides/builder.codex.md +28 -0
- package/config/agentic/orchestrator/prompts/overrides/planner.claude.md +20 -0
- package/config/agentic/orchestrator/prompts/overrides/planner.codex.md +20 -0
- package/config/agentic/orchestrator/prompts/planner-intake.system.md +149 -0
- package/config/agentic/orchestrator/prompts/planner.system.md +113 -40
- package/config/agentic/orchestrator/prompts/qa.system.md +75 -18
- package/config/agentic/orchestrator/prompts/reconciler.system.md +119 -0
- package/dist/apps/control-plane/application/kernel-tool-wiring.d.ts +26 -2
- package/dist/apps/control-plane/application/kernel-tool-wiring.js +40 -2
- package/dist/apps/control-plane/application/kernel-tool-wiring.js.map +1 -1
- package/dist/apps/control-plane/application/services/activity-monitor-service.js +37 -1
- package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.d.ts +4 -0
- package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.js +188 -0
- package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/checkpoint-service.d.ts +5 -0
- package/dist/apps/control-plane/application/services/checkpoint-service.js +69 -24
- package/dist/apps/control-plane/application/services/checkpoint-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/collision-override-service.d.ts +139 -0
- package/dist/apps/control-plane/application/services/collision-override-service.js +568 -0
- package/dist/apps/control-plane/application/services/collision-override-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/collision-queue-service.d.ts +15 -0
- package/dist/apps/control-plane/application/services/collision-queue-service.js +92 -33
- package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/cost-tracking-service.d.ts +11 -0
- package/dist/apps/control-plane/application/services/cost-tracking-service.js +75 -0
- package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/execution-control-service.d.ts +75 -0
- package/dist/apps/control-plane/application/services/execution-control-service.js +421 -0
- package/dist/apps/control-plane/application/services/execution-control-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/feature-deletion-service.d.ts +1 -0
- package/dist/apps/control-plane/application/services/feature-deletion-service.js +23 -1
- package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.d.ts +24 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +132 -3
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-send-message-service.js +16 -8
- package/dist/apps/control-plane/application/services/feature-send-message-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-state-service.d.ts +36 -0
- package/dist/apps/control-plane/application/services/feature-state-service.js +163 -6
- package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-service.d.ts +2 -1
- package/dist/apps/control-plane/application/services/gate-service.js +95 -5
- package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/git-reconciliation-service.d.ts +92 -0
- package/dist/apps/control-plane/application/services/git-reconciliation-service.js +1097 -0
- package/dist/apps/control-plane/application/services/git-reconciliation-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/intake-service.d.ts +63 -0
- package/dist/apps/control-plane/application/services/intake-service.js +1050 -0
- package/dist/apps/control-plane/application/services/intake-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/merge-service.d.ts +5 -1
- package/dist/apps/control-plane/application/services/merge-service.js +233 -18
- package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.d.ts +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.js +1 -0
- package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/performance-analytics-service.d.ts +11 -0
- package/dist/apps/control-plane/application/services/performance-analytics-service.js +59 -0
- package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/plan-service.d.ts +5 -0
- package/dist/apps/control-plane/application/services/plan-service.js +254 -15
- package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/question-service.d.ts +72 -0
- package/dist/apps/control-plane/application/services/question-service.js +507 -0
- package/dist/apps/control-plane/application/services/question-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/reactions-service.d.ts +2 -0
- package/dist/apps/control-plane/application/services/reactions-service.js +60 -17
- package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/replay-timeline-service.d.ts +39 -0
- package/dist/apps/control-plane/application/services/replay-timeline-service.js +205 -0
- package/dist/apps/control-plane/application/services/replay-timeline-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/reporting-service.d.ts +59 -0
- package/dist/apps/control-plane/application/services/reporting-service.js +121 -9
- package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/run-lease-service.d.ts +20 -0
- package/dist/apps/control-plane/application/services/run-lease-service.js +81 -4
- package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/worktree-watchdog-service.d.ts +10 -0
- package/dist/apps/control-plane/application/services/worktree-watchdog-service.js +65 -8
- package/dist/apps/control-plane/application/services/worktree-watchdog-service.js.map +1 -1
- package/dist/apps/control-plane/application/tools/tool-metadata.js +7 -0
- package/dist/apps/control-plane/application/tools/tool-metadata.js.map +1 -1
- package/dist/apps/control-plane/application/usage-types.d.ts +65 -0
- package/dist/apps/control-plane/application/usage-types.js +75 -0
- package/dist/apps/control-plane/application/usage-types.js.map +1 -0
- package/dist/apps/control-plane/cli/add-command-handler.d.ts +18 -0
- package/dist/apps/control-plane/cli/add-command-handler.js +110 -0
- package/dist/apps/control-plane/cli/add-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/answer-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/answer-command-handler.js +96 -0
- package/dist/apps/control-plane/cli/answer-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/attach-command-handler.js +8 -3
- package/dist/apps/control-plane/cli/attach-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/cli-argument-parser.js +131 -11
- package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
- package/dist/apps/control-plane/cli/collision-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/collision-command-handler.js +90 -0
- package/dist/apps/control-plane/cli/collision-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/command-catalog.d.ts +21 -0
- package/dist/apps/control-plane/cli/command-catalog.js +416 -0
- package/dist/apps/control-plane/cli/command-catalog.js.map +1 -0
- package/dist/apps/control-plane/cli/complete-command-handler.d.ts +15 -0
- package/dist/apps/control-plane/cli/complete-command-handler.js +26 -0
- package/dist/apps/control-plane/cli/complete-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/completion-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/completion-command-handler.js +20 -0
- package/dist/apps/control-plane/cli/completion-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/completion-resolver.d.ts +1 -0
- package/dist/apps/control-plane/cli/completion-resolver.js +250 -0
- package/dist/apps/control-plane/cli/completion-resolver.js.map +1 -0
- package/dist/apps/control-plane/cli/completion-shell-renderer.d.ts +3 -0
- package/dist/apps/control-plane/cli/completion-shell-renderer.js +53 -0
- package/dist/apps/control-plane/cli/completion-shell-renderer.js.map +1 -0
- package/dist/apps/control-plane/cli/dashboard-command-handler.d.ts +1 -0
- package/dist/apps/control-plane/cli/dashboard-command-handler.js +84 -1
- package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/dashboard-runtime-runner.d.ts +81 -0
- package/dist/apps/control-plane/cli/dashboard-runtime-runner.js +724 -0
- package/dist/apps/control-plane/cli/dashboard-runtime-runner.js.map +1 -0
- package/dist/apps/control-plane/cli/dashboard-runtime.d.ts +1 -0
- package/dist/apps/control-plane/cli/dashboard-runtime.js +26 -0
- package/dist/apps/control-plane/cli/dashboard-runtime.js.map +1 -0
- package/dist/apps/control-plane/cli/help-command-handler.js +13 -172
- package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/init-command-handler.js +51 -6
- package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/merge-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/merge-command-handler.js +139 -0
- package/dist/apps/control-plane/cli/merge-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/questions-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/questions-command-handler.js +59 -0
- package/dist/apps/control-plane/cli/questions-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/replay-command-handler.d.ts +15 -0
- package/dist/apps/control-plane/cli/replay-command-handler.js +55 -0
- package/dist/apps/control-plane/cli/replay-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/resume-command-handler.d.ts +2 -0
- package/dist/apps/control-plane/cli/resume-command-handler.js +180 -17
- package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-command-handler.js +202 -16
- package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-resume-decision.d.ts +26 -0
- package/dist/apps/control-plane/cli/retry-resume-decision.js +61 -0
- package/dist/apps/control-plane/cli/retry-resume-decision.js.map +1 -0
- package/dist/apps/control-plane/cli/rollback-command-handler.js +3 -2
- package/dist/apps/control-plane/cli/rollback-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/run-command-handler.js +26 -2
- package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-ingestion-service.d.ts +2 -0
- package/dist/apps/control-plane/cli/spec-ingestion-service.js +37 -48
- package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-preparation.d.ts +14 -0
- package/dist/apps/control-plane/cli/spec-preparation.js +81 -0
- package/dist/apps/control-plane/cli/spec-preparation.js.map +1 -0
- package/dist/apps/control-plane/cli/spec-utils.d.ts +4 -0
- package/dist/apps/control-plane/cli/spec-utils.js +70 -11
- package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
- package/dist/apps/control-plane/cli/status-command-handler.js +69 -0
- package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/types.d.ts +41 -4
- package/dist/apps/control-plane/cli/types.js +9 -1
- package/dist/apps/control-plane/cli/types.js.map +1 -1
- package/dist/apps/control-plane/core/collisions.d.ts +37 -19
- package/dist/apps/control-plane/core/collisions.js +87 -12
- package/dist/apps/control-plane/core/collisions.js.map +1 -1
- package/dist/apps/control-plane/core/constants.d.ts +17 -1
- package/dist/apps/control-plane/core/constants.js +18 -1
- package/dist/apps/control-plane/core/constants.js.map +1 -1
- package/dist/apps/control-plane/core/error-codes.d.ts +39 -0
- package/dist/apps/control-plane/core/error-codes.js +39 -0
- package/dist/apps/control-plane/core/error-codes.js.map +1 -1
- package/dist/apps/control-plane/core/execution-control.d.ts +45 -0
- package/dist/apps/control-plane/core/execution-control.js +2 -0
- package/dist/apps/control-plane/core/execution-control.js.map +1 -0
- package/dist/apps/control-plane/core/feature-resume-phase.d.ts +3 -0
- package/dist/apps/control-plane/core/feature-resume-phase.js +88 -0
- package/dist/apps/control-plane/core/feature-resume-phase.js.map +1 -0
- package/dist/apps/control-plane/core/gate-freshness.d.ts +48 -0
- package/dist/apps/control-plane/core/gate-freshness.js +267 -0
- package/dist/apps/control-plane/core/gate-freshness.js.map +1 -0
- package/dist/apps/control-plane/core/gate-log-extractor.d.ts +22 -0
- package/dist/apps/control-plane/core/gate-log-extractor.js +66 -0
- package/dist/apps/control-plane/core/gate-log-extractor.js.map +1 -0
- package/dist/apps/control-plane/core/gates.d.ts +11 -2
- package/dist/apps/control-plane/core/gates.js +67 -3
- package/dist/apps/control-plane/core/gates.js.map +1 -1
- package/dist/apps/control-plane/core/intake-artifacts.d.ts +109 -0
- package/dist/apps/control-plane/core/intake-artifacts.js +143 -0
- package/dist/apps/control-plane/core/intake-artifacts.js.map +1 -0
- package/dist/apps/control-plane/core/kernel-types.d.ts +8 -0
- package/dist/apps/control-plane/core/kernel.d.ts +256 -8
- package/dist/apps/control-plane/core/kernel.js +400 -14
- package/dist/apps/control-plane/core/kernel.js.map +1 -1
- package/dist/apps/control-plane/core/mainline-conflict.d.ts +7 -0
- package/dist/apps/control-plane/core/mainline-conflict.js +20 -0
- package/dist/apps/control-plane/core/mainline-conflict.js.map +1 -0
- package/dist/apps/control-plane/core/merge-repair.d.ts +35 -0
- package/dist/apps/control-plane/core/merge-repair.js +99 -0
- package/dist/apps/control-plane/core/merge-repair.js.map +1 -0
- package/dist/apps/control-plane/core/path-layout.d.ts +10 -0
- package/dist/apps/control-plane/core/path-layout.js +32 -2
- package/dist/apps/control-plane/core/path-layout.js.map +1 -1
- package/dist/apps/control-plane/core/path-rules.js +9 -3
- package/dist/apps/control-plane/core/path-rules.js.map +1 -1
- package/dist/apps/control-plane/core/plan-submit-recovery.d.ts +22 -0
- package/dist/apps/control-plane/core/plan-submit-recovery.js +78 -0
- package/dist/apps/control-plane/core/plan-submit-recovery.js.map +1 -0
- package/dist/apps/control-plane/core/questions.d.ts +40 -0
- package/dist/apps/control-plane/core/questions.js +2 -0
- package/dist/apps/control-plane/core/questions.js.map +1 -0
- package/dist/apps/control-plane/core/runtime-sessions.d.ts +4 -0
- package/dist/apps/control-plane/core/schemas.d.ts +2 -0
- package/dist/apps/control-plane/core/schemas.js +31 -1
- package/dist/apps/control-plane/core/schemas.js.map +1 -1
- package/dist/apps/control-plane/core/tool-caller.d.ts +18 -1
- package/dist/apps/control-plane/core/utils/index-normalizer.js +17 -4
- package/dist/apps/control-plane/core/utils/index-normalizer.js.map +1 -1
- package/dist/apps/control-plane/core/worktree-diff.d.ts +4 -0
- package/dist/apps/control-plane/core/worktree-diff.js +52 -0
- package/dist/apps/control-plane/core/worktree-diff.js.map +1 -0
- package/dist/apps/control-plane/index.d.ts +10 -2
- package/dist/apps/control-plane/index.js +9 -2
- package/dist/apps/control-plane/index.js.map +1 -1
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js +236 -6
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js +16 -0
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-runtime.d.ts +5 -0
- package/dist/apps/control-plane/mcp/tool-runtime.js +40 -5
- package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
- package/dist/apps/control-plane/providers/api-worker-provider.d.ts +2 -2
- package/dist/apps/control-plane/providers/api-worker-provider.js +40 -9
- package/dist/apps/control-plane/providers/api-worker-provider.js.map +1 -1
- package/dist/apps/control-plane/providers/cli-worker-provider.d.ts +59 -3
- package/dist/apps/control-plane/providers/cli-worker-provider.js +758 -46
- package/dist/apps/control-plane/providers/cli-worker-provider.js.map +1 -1
- package/dist/apps/control-plane/providers/output-parsers/generic-output-parser.js +91 -1
- package/dist/apps/control-plane/providers/output-parsers/generic-output-parser.js.map +1 -1
- package/dist/apps/control-plane/providers/output-parsers/types.d.ts +2 -0
- package/dist/apps/control-plane/providers/provider-defaults.d.ts +12 -0
- package/dist/apps/control-plane/providers/provider-defaults.js +103 -7
- package/dist/apps/control-plane/providers/provider-defaults.js.map +1 -1
- package/dist/apps/control-plane/providers/providers.d.ts +50 -4
- package/dist/apps/control-plane/providers/providers.js +145 -14
- package/dist/apps/control-plane/providers/providers.js.map +1 -1
- package/dist/apps/control-plane/providers/worker-provider-factory.d.ts +2 -0
- package/dist/apps/control-plane/providers/worker-provider-factory.js +8 -1
- package/dist/apps/control-plane/providers/worker-provider-factory.js.map +1 -1
- package/dist/apps/control-plane/supervisor/artifact-stager.d.ts +5 -0
- package/dist/apps/control-plane/supervisor/artifact-stager.js +45 -0
- package/dist/apps/control-plane/supervisor/artifact-stager.js.map +1 -0
- package/dist/apps/control-plane/supervisor/build-wave-executor.d.ts +24 -1
- package/dist/apps/control-plane/supervisor/build-wave-executor.js +362 -150
- package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/execution-enrollment-service.d.ts +41 -0
- package/dist/apps/control-plane/supervisor/execution-enrollment-service.js +311 -0
- package/dist/apps/control-plane/supervisor/execution-enrollment-service.js.map +1 -0
- package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.d.ts +15 -0
- package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.js +93 -0
- package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.js.map +1 -0
- package/dist/apps/control-plane/supervisor/organizer-sidecar-service.d.ts +44 -0
- package/dist/apps/control-plane/supervisor/organizer-sidecar-service.js +311 -0
- package/dist/apps/control-plane/supervisor/organizer-sidecar-service.js.map +1 -0
- package/dist/apps/control-plane/supervisor/plan-conformance-scorer.js +2 -5
- package/dist/apps/control-plane/supervisor/plan-conformance-scorer.js.map +1 -1
- package/dist/apps/control-plane/supervisor/planner-phase.d.ts +3 -0
- package/dist/apps/control-plane/supervisor/planner-phase.js +70 -0
- package/dist/apps/control-plane/supervisor/planner-phase.js.map +1 -0
- package/dist/apps/control-plane/supervisor/planning-wave-executor.d.ts +42 -0
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js +753 -55
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +19 -1
- package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js.map +1 -1
- package/dist/apps/control-plane/supervisor/qa-wave-executor.d.ts +21 -0
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js +287 -156
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.d.ts +30 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.js +561 -17
- package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/runtime.d.ts +84 -0
- package/dist/apps/control-plane/supervisor/runtime.js +393 -3
- package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.d.ts +54 -0
- package/dist/apps/control-plane/supervisor/session-orchestrator.js +176 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/types.d.ts +142 -1
- package/dist/apps/control-plane/supervisor/types.js.map +1 -1
- package/dist/apps/control-plane/supervisor/worker-decision-loop.d.ts +68 -2
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js +723 -89
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
- package/docs/core/ARCHITECTURE.md +227 -0
- package/docs/core/DECISIONS.md +94 -0
- package/docs/core/DOMAIN-LOGIC.md +60 -0
- package/docs/core/PATTERNS.md +201 -0
- package/docs/core/TROUBLESHOOTING.md +347 -0
- package/docs/core/intentgraph-dependencies.json +39860 -0
- package/docs/core/intentgraph.index.json +46580 -0
- package/docs/plans/2026-03-10-gate-failure-targeted-repair-design.md +224 -0
- package/docs/plans/2026-03-10-gate-failure-targeted-repair.md +1032 -0
- package/docs/superpowers/plans/2026-03-16-provider-cli-config.md +743 -0
- package/docs/superpowers/plans/2026-03-23-reconcile-divergence-fix.md +777 -0
- package/docs/superpowers/plans/2026-03-28-ordering-agent-implementation.md +1754 -0
- package/docs/superpowers/plans/2026-03-29-drop-zone-and-provider-optimization.md +1108 -0
- package/docs/superpowers/plans/2026-03-29-merge-target-feature-branch.md +685 -0
- package/docs/superpowers/plans/2026-03-29-organizer-sidecar-runtime-loop.md +1289 -0
- package/docs/superpowers/specs/2026-03-23-reconcile-divergence-fix-design.md +118 -0
- package/docs/superpowers/specs/2026-03-28-ordering-agent-spec-audit-design.md +50 -0
- package/docs/superpowers/specs/2026-03-29-drop-zone-and-provider-optimization-design.md +254 -0
- package/docs/superpowers/specs/2026-03-29-merge-target-feature-branch-design.md +152 -0
- package/docs/superpowers/specs/2026-03-29-organizer-sidecar-runtime-loop-design.md +225 -0
- package/package.json +3 -2
- package/packages/web-dashboard/package.json +2 -1
- package/packages/web-dashboard/src/app/analytics/page.tsx +36 -2
- package/packages/web-dashboard/src/app/api/actions/route.ts +274 -63
- package/packages/web-dashboard/src/app/api/actions/status/route.ts +35 -0
- package/packages/web-dashboard/src/app/api/analytics/provider/route.ts +18 -0
- package/packages/web-dashboard/src/app/api/collisions/approve/route.ts +58 -0
- package/packages/web-dashboard/src/app/api/features/[id]/checkpoint-diff/route.ts +36 -0
- package/packages/web-dashboard/src/app/api/features/[id]/checkpoints/route.ts +29 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/abort/route.ts +29 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/files/route.ts +30 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/resolve/route.ts +51 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/route.ts +75 -0
- package/packages/web-dashboard/src/app/api/features/[id]/diff/route.ts +16 -2
- package/packages/web-dashboard/src/app/api/features/[id]/files/route.ts +26 -0
- package/packages/web-dashboard/src/app/api/features/[id]/gate-history/route.ts +27 -0
- package/packages/web-dashboard/src/app/api/features/[id]/genealogy/route.ts +26 -0
- package/packages/web-dashboard/src/app/api/features/[id]/history/run/[runId]/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/history/runs/route.ts +34 -0
- package/packages/web-dashboard/src/app/api/features/[id]/intake-workspace/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/live-output/route.ts +74 -0
- package/packages/web-dashboard/src/app/api/features/[id]/plan/amend/route.ts +21 -0
- package/packages/web-dashboard/src/app/api/features/[id]/plan-progress/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/planner-artifacts/[artifact]/route.ts +78 -0
- package/packages/web-dashboard/src/app/api/features/[id]/planner-lifecycle/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/planning-workspace/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/questions/[questionId]/answer/route.ts +27 -0
- package/packages/web-dashboard/src/app/api/features/[id]/questions/route.ts +18 -0
- package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +14 -7
- package/packages/web-dashboard/src/app/api/features/[id]/route.ts +57 -2
- package/packages/web-dashboard/src/app/api/features/[id]/spec/route.ts +30 -0
- package/packages/web-dashboard/src/app/api/features/[id]/triage/route.ts +83 -0
- package/packages/web-dashboard/src/app/api/features/[id]/worker-events/route.ts +40 -0
- package/packages/web-dashboard/src/app/api/launch/preview/route.ts +86 -0
- package/packages/web-dashboard/src/app/api/launch/submit/route.ts +180 -0
- package/packages/web-dashboard/src/app/api/mainline/status/route.ts +74 -0
- package/packages/web-dashboard/src/app/api/merge-queue/route.ts +13 -0
- package/packages/web-dashboard/src/app/api/policy/budget/route.ts +14 -0
- package/packages/web-dashboard/src/app/api/projects/route.ts +11 -7
- package/packages/web-dashboard/src/app/api/reconciler/queue/route.ts +47 -0
- package/packages/web-dashboard/src/app/api/run/route.ts +26 -2
- package/packages/web-dashboard/src/app/api/runtime/events/route.ts +227 -0
- package/packages/web-dashboard/src/app/api/runtime/operations/route.ts +269 -0
- package/packages/web-dashboard/src/app/api/runtime/questions/route.ts +11 -0
- package/packages/web-dashboard/src/app/api/runtime/runs/route.ts +80 -0
- package/packages/web-dashboard/src/app/api/status/route.ts +4 -2
- package/packages/web-dashboard/src/app/feature/[id]/page.tsx +32 -42
- package/packages/web-dashboard/src/app/globals.css +34 -3
- package/packages/web-dashboard/src/app/launch/page.tsx +362 -0
- package/packages/web-dashboard/src/app/layout.tsx +23 -1
- package/packages/web-dashboard/src/app/page.tsx +263 -272
- package/packages/web-dashboard/src/components/dashboard/attention-strip.tsx +52 -0
- package/packages/web-dashboard/src/components/dashboard/collision-approval-drawer.tsx +185 -0
- package/packages/web-dashboard/src/components/dashboard/command-center-header.tsx +102 -0
- package/packages/web-dashboard/src/components/dashboard/mainline-status-banner.tsx +84 -0
- package/packages/web-dashboard/src/components/dashboard/merged-archive.tsx +36 -0
- package/packages/web-dashboard/src/components/dashboard/prioritized-queues.tsx +98 -0
- package/packages/web-dashboard/src/components/dashboard/reconciler-queue-card.tsx +115 -0
- package/packages/web-dashboard/src/components/dashboard/secondary-diagnostics-rail.tsx +48 -0
- package/packages/web-dashboard/src/components/dashboard/task-filter-bar.tsx +74 -0
- package/packages/web-dashboard/src/components/dashboard/triage-drawer.tsx +455 -0
- package/packages/web-dashboard/src/components/diff-viewer.tsx +19 -3
- package/packages/web-dashboard/src/components/evidence-viewer.tsx +65 -51
- package/packages/web-dashboard/src/components/feature-card.tsx +90 -7
- package/packages/web-dashboard/src/components/feature-cost-panel.tsx +112 -11
- package/packages/web-dashboard/src/components/feature-list-view.tsx +25 -4
- package/packages/web-dashboard/src/components/features/runtime-inspector/EventsTimelineView.tsx +260 -0
- package/packages/web-dashboard/src/components/features/runtime-inspector/OperationsListView.tsx +172 -0
- package/packages/web-dashboard/src/components/features/runtime-inspector/RuntimeInspectorPanel.tsx +896 -0
- package/packages/web-dashboard/src/components/filter-bar.tsx +7 -39
- package/packages/web-dashboard/src/components/focus/ActionableRiskList.tsx +46 -0
- package/packages/web-dashboard/src/components/focus/AgentRolePerformanceCard.tsx +200 -0
- package/packages/web-dashboard/src/components/focus/BlockedGuidanceBanner.tsx +149 -0
- package/packages/web-dashboard/src/components/focus/CheckpointInspector.tsx +123 -0
- package/packages/web-dashboard/src/components/focus/CheckpointRail.tsx +118 -0
- package/packages/web-dashboard/src/components/focus/CheckpointScrubber.tsx +249 -0
- package/packages/web-dashboard/src/components/focus/CollisionApprovalBanner.tsx +192 -0
- package/packages/web-dashboard/src/components/focus/CollisionRadar.tsx +136 -0
- package/packages/web-dashboard/src/components/focus/ConflictStatusCard.tsx +52 -0
- package/packages/web-dashboard/src/components/focus/ContextSidebar.tsx +108 -0
- package/packages/web-dashboard/src/components/focus/DiagnosisPanel.tsx +68 -0
- package/packages/web-dashboard/src/components/focus/FeatureDecisionBanner.tsx +68 -0
- package/packages/web-dashboard/src/components/focus/FeatureQuestionAnswerPanel.tsx +167 -0
- package/packages/web-dashboard/src/components/focus/FocusHeader.tsx +54 -0
- package/packages/web-dashboard/src/components/focus/FocusLayout.tsx +283 -0
- package/packages/web-dashboard/src/components/focus/GateFlakinessSummary.tsx +144 -0
- package/packages/web-dashboard/src/components/focus/GenealogyTree.tsx +34 -0
- package/packages/web-dashboard/src/components/focus/HeroBlock.tsx +67 -0
- package/packages/web-dashboard/src/components/focus/LiveAgentConsole.tsx +277 -0
- package/packages/web-dashboard/src/components/focus/MergeQueueCard.tsx +78 -0
- package/packages/web-dashboard/src/components/focus/OperationalSummaryCard.tsx +227 -0
- package/packages/web-dashboard/src/components/focus/PinnedActions.tsx +96 -0
- package/packages/web-dashboard/src/components/focus/PlanAmendmentPanel.tsx +250 -0
- package/packages/web-dashboard/src/components/focus/PlanProgressPanel.tsx +133 -0
- package/packages/web-dashboard/src/components/focus/PlannerArtifactViewer.tsx +158 -0
- package/packages/web-dashboard/src/components/focus/PlannerLifecycleHeader.tsx +141 -0
- package/packages/web-dashboard/src/components/focus/ProgressSnapshotCard.tsx +113 -0
- package/packages/web-dashboard/src/components/focus/RecentMaterialChanges.tsx +69 -0
- package/packages/web-dashboard/src/components/focus/RoleLogViewer.tsx +436 -0
- package/packages/web-dashboard/src/components/focus/RunHistoryBrowser.tsx +62 -0
- package/packages/web-dashboard/src/components/focus/SpecViewer.tsx +172 -0
- package/packages/web-dashboard/src/components/focus/TabBar.tsx +33 -0
- package/packages/web-dashboard/src/components/focus/UsageBurnChart.tsx +212 -0
- package/packages/web-dashboard/src/components/focus/VerificationSummaryCard.tsx +122 -0
- package/packages/web-dashboard/src/components/focus/tabs/ChangesTab.tsx +325 -0
- package/packages/web-dashboard/src/components/focus/tabs/ConflictsTab.tsx +395 -0
- package/packages/web-dashboard/src/components/focus/tabs/GatesQaTab.tsx +38 -0
- package/packages/web-dashboard/src/components/focus/tabs/HistoryTab.tsx +213 -0
- package/packages/web-dashboard/src/components/focus/tabs/IntakeTab.tsx +429 -0
- package/packages/web-dashboard/src/components/focus/tabs/OverviewTab.tsx +217 -0
- package/packages/web-dashboard/src/components/focus/tabs/PlanningTab.tsx +390 -0
- package/packages/web-dashboard/src/components/focus/tabs/ReviewTab.tsx +497 -0
- package/packages/web-dashboard/src/components/focus/tabs/RuntimeTab.tsx +213 -0
- package/packages/web-dashboard/src/components/focus/tabs/TranscriptTab.tsx +315 -0
- package/packages/web-dashboard/src/components/gate-results.tsx +2 -2
- package/packages/web-dashboard/src/components/human-input-panel.tsx +33 -57
- package/packages/web-dashboard/src/components/kanban-board.tsx +4 -0
- package/packages/web-dashboard/src/components/launch/launch-draft-card.tsx +154 -0
- package/packages/web-dashboard/src/components/plan-viewer.tsx +147 -69
- package/packages/web-dashboard/src/components/quick-launch-panel.tsx +20 -47
- package/packages/web-dashboard/src/components/summary-bar.tsx +30 -76
- package/packages/web-dashboard/src/lib/aop-client.ts +2484 -36
- package/packages/web-dashboard/src/lib/blocked-state-guidance.ts +475 -0
- package/packages/web-dashboard/src/lib/collision-radar.ts +136 -0
- package/packages/web-dashboard/src/lib/dashboard-action-states.ts +204 -0
- package/packages/web-dashboard/src/lib/dashboard-runtime-client.ts +439 -0
- package/packages/web-dashboard/src/lib/dashboard-utils.ts +179 -18
- package/packages/web-dashboard/src/lib/drop-zone-utils.ts +92 -0
- package/packages/web-dashboard/src/lib/focus-detail-derivations.ts +958 -0
- package/packages/web-dashboard/src/lib/focus-view.ts +300 -0
- package/packages/web-dashboard/src/lib/health-diagnosis.ts +356 -0
- package/packages/web-dashboard/src/lib/launch-contracts.ts +77 -0
- package/packages/web-dashboard/src/lib/launch-markdown.ts +103 -0
- package/packages/web-dashboard/src/lib/launch-page-preview.ts +89 -0
- package/packages/web-dashboard/src/lib/live-feed.ts +1 -1
- package/packages/web-dashboard/src/lib/multi-project-config.ts +33 -0
- package/packages/web-dashboard/src/lib/orchestrator-tools.ts +881 -60
- package/packages/web-dashboard/src/lib/planner-workspace.ts +1285 -0
- package/packages/web-dashboard/src/lib/review-contracts.ts +5 -3
- package/packages/web-dashboard/src/lib/runtime-files.ts +285 -0
- package/packages/web-dashboard/src/lib/tool-catalog.ts +51 -0
- package/packages/web-dashboard/src/lib/types.ts +731 -3
- package/packages/web-dashboard/src/lib/usage-burn.ts +175 -0
- package/packages/web-dashboard/src/lib/worktree-diff.ts +128 -0
- package/packages/web-dashboard/src/styles/dashboard.module.css +1742 -459
- package/packages/web-dashboard/test/api/actions/route.spec.ts +675 -0
- package/packages/web-dashboard/test/api/features/diff.route.spec.ts +57 -0
- package/packages/web-dashboard/test/api/features/feature.route.spec.ts +99 -0
- package/packages/web-dashboard/test/api/features/live-output.route.spec.ts +123 -0
- package/packages/web-dashboard/test/api/features/plan-amend.route.spec.ts +95 -0
- package/packages/web-dashboard/test/api/features/planner-workspaces.route.spec.ts +162 -0
- package/packages/web-dashboard/test/api/features/question-answer.route.spec.ts +99 -0
- package/packages/web-dashboard/test/api/features/triage.route.spec.ts +195 -0
- package/packages/web-dashboard/test/api/launch/preview.route.spec.ts +149 -0
- package/packages/web-dashboard/test/api/launch/submit.route.spec.ts +382 -0
- package/packages/web-dashboard/test/api/runtime/events/route.spec.ts +164 -0
- package/packages/web-dashboard/test/api/runtime/operations/route.spec.ts +156 -0
- package/packages/web-dashboard/test/api/runtime/runs/route.spec.ts +112 -0
- package/packages/web-dashboard/test/components/changes-tab.spec.tsx +76 -0
- package/packages/web-dashboard/test/components/command-center-root.spec.tsx +87 -0
- package/packages/web-dashboard/test/components/diagnosis-panel.spec.tsx +59 -0
- package/packages/web-dashboard/test/components/feature-card.spec.tsx +45 -0
- package/packages/web-dashboard/test/components/focus-layout.spec.tsx +299 -0
- package/packages/web-dashboard/test/components/gate-results.spec.tsx +39 -0
- package/packages/web-dashboard/test/components/gates-qa-tab.spec.tsx +118 -0
- package/packages/web-dashboard/test/components/human-input-panel.spec.tsx +54 -0
- package/packages/web-dashboard/test/components/intake-tab.spec.tsx +210 -0
- package/packages/web-dashboard/test/components/kanban-board.spec.tsx +35 -0
- package/packages/web-dashboard/test/components/launch-draft-card.spec.tsx +114 -0
- package/packages/web-dashboard/test/components/launch-page.spec.tsx +79 -0
- package/packages/web-dashboard/test/components/overview-tab.spec.tsx +236 -0
- package/packages/web-dashboard/test/components/planning-tab.spec.tsx +202 -0
- package/packages/web-dashboard/test/components/review-tab.spec.tsx +169 -0
- package/packages/web-dashboard/test/components/role-log-viewer.spec.ts +42 -0
- package/packages/web-dashboard/test/components/runtime-inspector.spec.tsx +22 -0
- package/packages/web-dashboard/test/components/runtime-tab.spec.tsx +133 -0
- package/packages/web-dashboard/test/components/transcript-tab.spec.tsx +46 -0
- package/packages/web-dashboard/test/components/triage-drawer.spec.tsx +159 -0
- package/packages/web-dashboard/test/lib/aop-client.spec.ts +235 -0
- package/packages/web-dashboard/test/lib/dashboard-runtime-client.spec.ts +144 -0
- package/packages/web-dashboard/test/lib/focus-detail-derivations.spec.ts +314 -0
- package/packages/web-dashboard/test/lib/focus-view.spec.ts +248 -0
- package/packages/web-dashboard/test/lib/health-diagnosis.spec.ts +277 -0
- package/packages/web-dashboard/test/lib/launch-markdown.spec.ts +36 -0
- package/packages/web-dashboard/test/lib/multi-project-config.spec.ts +54 -0
- package/packages/web-dashboard/test/lib/orchestrator-tools.spec.ts +352 -0
- package/packages/web-dashboard/test/lib/planner-workspace.spec.ts +289 -0
- package/packages/web-dashboard/test/lib/worktree-diff.spec.ts +119 -0
- package/packages/web-dashboard/vitest.config.ts +2 -0
- package/spec-files/completed/agentic_orchestrator_add_feature_to_active_execution_spec.md +557 -0
- package/spec-files/completed/agentic_orchestrator_dashboard_command_center_redesign_spec.md +1147 -0
- package/spec-files/completed/agentic_orchestrator_execution_mode_spec.md +18 -16
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_a_spec.md +672 -0
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_b_spec.md +794 -0
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_c_decision_centric_remediation_spec.md +1037 -0
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_ux_redesign_spec.md +1432 -0
- package/spec-files/completed/agentic_orchestrator_focus_plan_tab_intake_planning_workspace_spec.md +921 -0
- package/spec-files/completed/agentic_orchestrator_intentional_collision_override_spec.md +584 -0
- package/spec-files/completed/agentic_orchestrator_interactive_planning_intake_and_requirements_verification_spec.md +1185 -0
- package/spec-files/completed/agentic_orchestrator_reactive_execution_enrollment_spec.md +864 -0
- package/spec-files/{outstanding → completed}/agentic_orchestrator_runtime_inspection_spec.md +92 -19
- package/spec-files/completed/agentic_orchestrator_scope_aware_run_lease_spec.md +408 -0
- package/spec-files/completed/git-reconciliation-engine.md +827 -0
- package/spec-files/outstanding/agentic_orchestrator_dashboard_quick_launch_and_control_surface_spec.md +331 -0
- package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +16 -6
- package/spec-files/outstanding/agentic_orchestrator_evidence_integrity_doctor_spec.md +60 -9
- package/spec-files/outstanding/agentic_orchestrator_focus_plan_tab_execution_contract_workspace_spec.md +616 -0
- package/spec-files/outstanding/agentic_orchestrator_headless_standby_dashboard_runtime_spec.md +310 -0
- package/spec-files/outstanding/agentic_orchestrator_human_input_interaction_protocol_spec.md +175 -72
- package/spec-files/outstanding/agentic_orchestrator_interactive_rename_cleanup_spec.md +197 -0
- package/spec-files/outstanding/agentic_orchestrator_interactive_resume_and_reconciliation_disposition_spec.md +412 -0
- package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +166 -137
- package/spec-files/outstanding/agentic_orchestrator_observability_replay_spec.md +3 -3
- package/spec-files/outstanding/agentic_orchestrator_phase_specific_agent_profiles_and_token_telemetry_spec.md +303 -0
- package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +18 -5
- package/spec-files/outstanding/agentic_orchestrator_policy_stratification_spec.md +225 -0
- package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +77 -50
- package/spec-files/outstanding/agentic_orchestrator_ready_to_merge_branch_handoff_spec.md +724 -0
- package/spec-files/outstanding/agentic_orchestrator_remove_deterministic_mode_spec.md +263 -0
- package/spec-files/outstanding/agentic_orchestrator_request_more_context_and_dashboard_human_input_spec.md +456 -0
- package/spec-files/outstanding/agentic_orchestrator_spec_coverage_and_reconciliation_enforcement_spec.md +1411 -0
- package/spec-files/outstanding/agentic_orchestrator_spec_ordering_agent_spec.md +370 -0
- package/spec-files/outstanding/shadow_workspace_implementation_spec.md +1 -1
- package/spec-files/progress.md +2026 -120
- package/specs/001-runtime-inspection/checklists/requirements.md +35 -0
- package/specs/001-runtime-inspection/design.md +338 -0
- package/specs/001-runtime-inspection/spec.md +95 -0
- package/specs/002-scope-aware-lease/checklists/requirements.md +35 -0
- package/specs/002-scope-aware-lease/contracts/lease-registry.schema.json +101 -0
- package/specs/002-scope-aware-lease/data-model.md +236 -0
- package/specs/002-scope-aware-lease/plan.md +766 -0
- package/specs/002-scope-aware-lease/quickstart.md +150 -0
- package/specs/002-scope-aware-lease/research.md +135 -0
- package/specs/002-scope-aware-lease/spec.md +128 -0
- package/specs/002-scope-aware-lease/tasks.md +767 -0
- package/tsconfig.json +1 -1
- package/vitest.config.ts +28 -0
- package/ARCHITECTURE_ADHERENCE_ANALYSIS.md +0 -871
- package/packages/web-dashboard/next-env.d.ts +0 -6
- package/packages/web-dashboard/src/components/detail-panel.tsx +0 -1124
- package/packages/web-dashboard/src/components/review-workspace.tsx +0 -1162
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_artifact_database_publishing_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_cli_shell_tab_completion_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_dashboard_diff_and_agent_console_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_performance_improvements_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_persistent_worker_runtime_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_provider_auth_bootstrap_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_real_worker_provider_execution_spec.md +0 -0
|
@@ -0,0 +1,1108 @@
|
|
|
1
|
+
# Drop Zone File Loading & Provider-Specific Agent Optimization — Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **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.
|
|
4
|
+
|
|
5
|
+
**Goal:** Add drag-and-drop file/folder loading to the Launch Workspace UI and a prompt overlay system that lets the orchestrator leverage provider-specific capabilities (Claude's planner, Codex's task model) during planning and building phases.
|
|
6
|
+
|
|
7
|
+
**Architecture:** Two independent feature tracks in one plan. Track A (Tasks 1-2) adds HTML5 drag-and-drop to the Next.js Launch Workspace, feeding into the existing draft pipeline. Track B (Tasks 3-8) adds a prompt overlay resolver to the CLI worker provider, an artifact stager service for builder worktrees, overlay prompt files for Claude and Codex, and schema/config updates. Both tracks can be implemented in any order.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** Next.js 16 (React 18), TypeScript, Vitest, AJV JSON Schema validation, Node.js fs
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## File Map
|
|
14
|
+
|
|
15
|
+
### New Files
|
|
16
|
+
|
|
17
|
+
| File | Responsibility |
|
|
18
|
+
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
|
|
19
|
+
| `packages/web-dashboard/src/lib/drop-zone-utils.ts` | Pure async utility: recursively collect `.md` files from `DataTransferItem[]` entries |
|
|
20
|
+
| `apps/control-plane/src/supervisor/artifact-stager.ts` | Copies spec/plan artifacts into `.aop/context/` in builder worktree |
|
|
21
|
+
| `apps/control-plane/test/artifact-stager.spec.ts` | Unit tests for artifact stager |
|
|
22
|
+
| `apps/control-plane/test/prompt-overlay.spec.ts` | Unit tests for prompt overlay resolution |
|
|
23
|
+
| `config/agentic/orchestrator/prompts/overrides/planner.claude.md` | Claude planner overlay: use /plan mode, extended thinking |
|
|
24
|
+
| `config/agentic/orchestrator/prompts/overrides/planner.codex.md` | Codex planner overlay: structured task decomposition |
|
|
25
|
+
| `config/agentic/orchestrator/prompts/overrides/builder.claude.md` | Claude builder overlay: read staged artifacts, task checklist workflow |
|
|
26
|
+
| `config/agentic/orchestrator/prompts/overrides/builder.codex.md` | Codex builder overlay: read staged artifacts, apply-patch model |
|
|
27
|
+
|
|
28
|
+
### Modified Files
|
|
29
|
+
|
|
30
|
+
| File | Change |
|
|
31
|
+
| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
32
|
+
| `packages/web-dashboard/src/app/launch/page.tsx` | Add drag-and-drop handlers, drop zone overlay, `dragActive` state |
|
|
33
|
+
| `packages/web-dashboard/src/styles/dashboard.module.css` | Add `.dropZoneOverlay` and `.dropZoneActive` CSS classes |
|
|
34
|
+
| `apps/control-plane/src/providers/cli-worker-provider.ts` | Add `resolvePromptOverlay()` function, call it in `runWorker()` before `buildWorkerPrompt()`. Update builder file guidance in `buildInteractiveWorkerPrompt()` to include `.aop/context/` paths. |
|
|
35
|
+
| `apps/control-plane/src/supervisor/build-wave-executor.ts` | Import and call `ArtifactStager.stage()` before builder dispatch |
|
|
36
|
+
| `config/agentic/orchestrator/agents.yaml` | Add `prompt_overlay_dir` field under `runtime` |
|
|
37
|
+
| `agentic/orchestrator/schemas/agents.schema.json` | Add `prompt_overlay_dir` property to `runtime` object |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
### Task 1: Drop Zone Utility — `collectMarkdownFiles`
|
|
42
|
+
|
|
43
|
+
**Files:**
|
|
44
|
+
|
|
45
|
+
- Create: `packages/web-dashboard/src/lib/drop-zone-utils.ts`
|
|
46
|
+
|
|
47
|
+
- [ ] **Step 1: Create the utility file with types and the recursive collector**
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
// packages/web-dashboard/src/lib/drop-zone-utils.ts
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Recursively collects .md files from a list of DataTransferItem entries.
|
|
54
|
+
* Handles both direct file drops and folder drops via webkitGetAsEntry().
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
function isMarkdownFile(name: string): boolean {
|
|
58
|
+
return name.endsWith('.md');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function readEntriesPromise(reader: FileSystemDirectoryReader): Promise<FileSystemEntry[]> {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
reader.readEntries(resolve, reject);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function fileEntryToFile(entry: FileSystemFileEntry): Promise<File> {
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
entry.file(resolve, reject);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function walkEntry(entry: FileSystemEntry, files: File[]): Promise<void> {
|
|
74
|
+
if (entry.isFile) {
|
|
75
|
+
if (isMarkdownFile(entry.name)) {
|
|
76
|
+
const file = await fileEntryToFile(entry as FileSystemFileEntry);
|
|
77
|
+
files.push(file);
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (entry.isDirectory) {
|
|
82
|
+
const reader = (entry as FileSystemDirectoryEntry).createReader();
|
|
83
|
+
let batch = await readEntriesPromise(reader);
|
|
84
|
+
while (batch.length > 0) {
|
|
85
|
+
for (const child of batch) {
|
|
86
|
+
await walkEntry(child, files);
|
|
87
|
+
}
|
|
88
|
+
batch = await readEntriesPromise(reader);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface DropResult {
|
|
94
|
+
markdownFiles: File[];
|
|
95
|
+
skippedNonMarkdownCount: number;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export async function collectMarkdownFromDrop(items: DataTransferItemList): Promise<DropResult> {
|
|
99
|
+
const files: File[] = [];
|
|
100
|
+
let skippedNonMarkdownCount = 0;
|
|
101
|
+
|
|
102
|
+
const entries: Array<{ entry: FileSystemEntry | null; item: DataTransferItem }> = [];
|
|
103
|
+
for (let i = 0; i < items.length; i++) {
|
|
104
|
+
const item = items[i];
|
|
105
|
+
if (item.kind !== 'file') {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const entry = typeof item.webkitGetAsEntry === 'function' ? item.webkitGetAsEntry() : null;
|
|
109
|
+
entries.push({ entry, item });
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
for (const { entry, item } of entries) {
|
|
113
|
+
if (entry?.isDirectory) {
|
|
114
|
+
await walkEntry(entry, files);
|
|
115
|
+
} else if (entry?.isFile) {
|
|
116
|
+
if (isMarkdownFile(entry.name)) {
|
|
117
|
+
const file = await fileEntryToFile(entry as FileSystemFileEntry);
|
|
118
|
+
files.push(file);
|
|
119
|
+
} else {
|
|
120
|
+
skippedNonMarkdownCount++;
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
// Fallback: no webkitGetAsEntry support — use getAsFile()
|
|
124
|
+
const file = item.getAsFile();
|
|
125
|
+
if (file) {
|
|
126
|
+
if (isMarkdownFile(file.name)) {
|
|
127
|
+
files.push(file);
|
|
128
|
+
} else {
|
|
129
|
+
skippedNonMarkdownCount++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return { markdownFiles: files, skippedNonMarkdownCount };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function supportsDirectoryDrop(): boolean {
|
|
139
|
+
if (typeof DataTransferItem === 'undefined') {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
return typeof DataTransferItem.prototype.webkitGetAsEntry === 'function';
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
- [ ] **Step 2: Verify the file compiles**
|
|
147
|
+
|
|
148
|
+
Run: `npx tsc --noEmit --project packages/web-dashboard/tsconfig.json 2>&1 | head -20`
|
|
149
|
+
Expected: Clean or only pre-existing warnings (the `FileSystemEntry` types come from `lib.dom.d.ts`).
|
|
150
|
+
|
|
151
|
+
Note: If `FileSystemEntry` types are missing, check `packages/web-dashboard/tsconfig.json` includes `"lib": ["dom"]`. If so, these types are available. If not, add type declarations inline — but this is extremely unlikely with Next.js 16.
|
|
152
|
+
|
|
153
|
+
- [ ] **Step 3: Commit**
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
git add packages/web-dashboard/src/lib/drop-zone-utils.ts
|
|
157
|
+
git commit -m "feat: add drop zone utility for recursive markdown file collection"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
### Task 2: Drop Zone UI — Launch Workspace Integration
|
|
163
|
+
|
|
164
|
+
**Files:**
|
|
165
|
+
|
|
166
|
+
- Modify: `packages/web-dashboard/src/app/launch/page.tsx`
|
|
167
|
+
- Modify: `packages/web-dashboard/src/styles/dashboard.module.css`
|
|
168
|
+
|
|
169
|
+
- [ ] **Step 1: Add CSS classes for the drop zone overlay**
|
|
170
|
+
|
|
171
|
+
Append to the end of `packages/web-dashboard/src/styles/dashboard.module.css` (before the final closing brace if there is one, or at the very end):
|
|
172
|
+
|
|
173
|
+
```css
|
|
174
|
+
.dropZoneOverlay {
|
|
175
|
+
position: fixed;
|
|
176
|
+
inset: 0;
|
|
177
|
+
z-index: 100;
|
|
178
|
+
display: flex;
|
|
179
|
+
flex-direction: column;
|
|
180
|
+
align-items: center;
|
|
181
|
+
justify-content: center;
|
|
182
|
+
background: rgba(45, 106, 79, 0.1);
|
|
183
|
+
border: 3px dashed var(--accent-green, #2d6a4f);
|
|
184
|
+
border-radius: 1rem;
|
|
185
|
+
margin: 0.75rem;
|
|
186
|
+
pointer-events: none;
|
|
187
|
+
backdrop-filter: blur(2px);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.dropZoneOverlay h2 {
|
|
191
|
+
font-size: 1.35rem;
|
|
192
|
+
font-weight: 600;
|
|
193
|
+
color: var(--accent-green, #4ade80);
|
|
194
|
+
margin: 0;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.dropZoneOverlay p {
|
|
198
|
+
font-size: 0.9rem;
|
|
199
|
+
color: var(--text-muted, #888);
|
|
200
|
+
margin: 0.5rem 0 0;
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
- [ ] **Step 2: Add drag-and-drop state and handlers to `LaunchPageContent`**
|
|
205
|
+
|
|
206
|
+
In `packages/web-dashboard/src/app/launch/page.tsx`, add the import at the top with the other imports:
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
import { collectMarkdownFromDrop } from '@/lib/drop-zone-utils.js';
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Inside the `LaunchPageContent` function, after the existing `useState` declarations (around line 79), add:
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
const [dragActive, setDragActive] = useState(false);
|
|
216
|
+
const dragCounterRef = React.useRef(0);
|
|
217
|
+
|
|
218
|
+
const handleDragEnter = (event: React.DragEvent) => {
|
|
219
|
+
event.preventDefault();
|
|
220
|
+
event.stopPropagation();
|
|
221
|
+
dragCounterRef.current += 1;
|
|
222
|
+
if (dragCounterRef.current === 1) {
|
|
223
|
+
setDragActive(true);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
const handleDragLeave = (event: React.DragEvent) => {
|
|
228
|
+
event.preventDefault();
|
|
229
|
+
event.stopPropagation();
|
|
230
|
+
dragCounterRef.current -= 1;
|
|
231
|
+
if (dragCounterRef.current <= 0) {
|
|
232
|
+
dragCounterRef.current = 0;
|
|
233
|
+
setDragActive(false);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
const handleDragOver = (event: React.DragEvent) => {
|
|
238
|
+
event.preventDefault();
|
|
239
|
+
event.stopPropagation();
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const handleDrop = async (event: React.DragEvent) => {
|
|
243
|
+
event.preventDefault();
|
|
244
|
+
event.stopPropagation();
|
|
245
|
+
dragCounterRef.current = 0;
|
|
246
|
+
setDragActive(false);
|
|
247
|
+
|
|
248
|
+
if (!event.dataTransfer?.items) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const result = await collectMarkdownFromDrop(event.dataTransfer.items);
|
|
253
|
+
if (result.markdownFiles.length === 0 && result.skippedNonMarkdownCount > 0) {
|
|
254
|
+
setStatusMessage(
|
|
255
|
+
`Skipped ${result.skippedNonMarkdownCount} non-markdown file${result.skippedNonMarkdownCount === 1 ? '' : 's'}. Only .md files are accepted.`,
|
|
256
|
+
);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (result.markdownFiles.length === 0) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const loadedDrafts = await Promise.all(
|
|
264
|
+
result.markdownFiles.map(async (file) => createDraft(file.name, await file.text(), 'upload')),
|
|
265
|
+
);
|
|
266
|
+
setDrafts((current) => [...current, ...loadedDrafts]);
|
|
267
|
+
|
|
268
|
+
const parts: string[] = [
|
|
269
|
+
`Added ${loadedDrafts.length} draft${loadedDrafts.length === 1 ? '' : 's'} from drop`,
|
|
270
|
+
];
|
|
271
|
+
if (result.skippedNonMarkdownCount > 0) {
|
|
272
|
+
parts.push(
|
|
273
|
+
`(skipped ${result.skippedNonMarkdownCount} non-markdown file${result.skippedNonMarkdownCount === 1 ? '' : 's'})`,
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
setStatusMessage(parts.join(' '));
|
|
277
|
+
};
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
- [ ] **Step 3: Attach drag event handlers and add overlay to the JSX**
|
|
281
|
+
|
|
282
|
+
In the same file, modify the root `<div>` in the return statement. Change:
|
|
283
|
+
|
|
284
|
+
```tsx
|
|
285
|
+
<div className={styles.dashboardRoot}>
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
to:
|
|
289
|
+
|
|
290
|
+
```tsx
|
|
291
|
+
<div
|
|
292
|
+
className={styles.dashboardRoot}
|
|
293
|
+
onDragEnter={handleDragEnter}
|
|
294
|
+
onDragLeave={handleDragLeave}
|
|
295
|
+
onDragOver={handleDragOver}
|
|
296
|
+
onDrop={(event) => { void handleDrop(event); }}
|
|
297
|
+
>
|
|
298
|
+
{dragActive ? (
|
|
299
|
+
<div className={styles.dropZoneOverlay}>
|
|
300
|
+
<h2>Drop .md files or folders</h2>
|
|
301
|
+
<p>Folders will be scanned for .md files</p>
|
|
302
|
+
</div>
|
|
303
|
+
) : null}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
- [ ] **Step 4: Verify the page compiles**
|
|
307
|
+
|
|
308
|
+
Run: `npx tsc --noEmit --project packages/web-dashboard/tsconfig.json 2>&1 | head -20`
|
|
309
|
+
Expected: Clean compilation.
|
|
310
|
+
|
|
311
|
+
- [ ] **Step 5: Commit**
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
git add packages/web-dashboard/src/app/launch/page.tsx packages/web-dashboard/src/styles/dashboard.module.css
|
|
315
|
+
git commit -m "feat: add drag-and-drop file/folder loading to Launch Workspace"
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
### Task 3: Agents Schema — Add `prompt_overlay_dir`
|
|
321
|
+
|
|
322
|
+
**Files:**
|
|
323
|
+
|
|
324
|
+
- Modify: `agentic/orchestrator/schemas/agents.schema.json`
|
|
325
|
+
- Modify: `config/agentic/orchestrator/agents.yaml`
|
|
326
|
+
|
|
327
|
+
- [ ] **Step 1: Add `prompt_overlay_dir` to the schema**
|
|
328
|
+
|
|
329
|
+
In `agentic/orchestrator/schemas/agents.schema.json`, inside the `runtime.properties` object, add the new field. Find the `"provider_cli_config"` property (around line 195) and add the new property **before** it:
|
|
330
|
+
|
|
331
|
+
```json
|
|
332
|
+
"prompt_overlay_dir": {
|
|
333
|
+
"type": "string",
|
|
334
|
+
"description": "Directory (relative to repo root) containing provider-specific prompt overlay files. Files are named <role>.<provider>.md (e.g. builder.claude.md). When present, the overlay is appended to the base role prompt. Defaults to config/agentic/orchestrator/prompts/overrides.",
|
|
335
|
+
"default": "config/agentic/orchestrator/prompts/overrides"
|
|
336
|
+
},
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
- [ ] **Step 2: Add `prompt_overlay_dir` to agents.yaml**
|
|
340
|
+
|
|
341
|
+
In `config/agentic/orchestrator/agents.yaml`, inside the `runtime:` block, add after the `execution_mode: interactive` line:
|
|
342
|
+
|
|
343
|
+
```yaml
|
|
344
|
+
prompt_overlay_dir: config/agentic/orchestrator/prompts/overrides
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
- [ ] **Step 3: Validate the schema**
|
|
348
|
+
|
|
349
|
+
Run: `npm run validate:mcp-contracts 2>&1 | tail -5`
|
|
350
|
+
Expected: Clean validation (no errors).
|
|
351
|
+
|
|
352
|
+
Run: `npm run build 2>&1 | tail -10`
|
|
353
|
+
Expected: Clean build.
|
|
354
|
+
|
|
355
|
+
- [ ] **Step 4: Commit**
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
git add agentic/orchestrator/schemas/agents.schema.json config/agentic/orchestrator/agents.yaml
|
|
359
|
+
git commit -m "feat: add prompt_overlay_dir config for provider-specific prompt overlays"
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
### Task 4: Prompt Overlay Resolver — Unit Tests
|
|
365
|
+
|
|
366
|
+
**Files:**
|
|
367
|
+
|
|
368
|
+
- Create: `apps/control-plane/test/prompt-overlay.spec.ts`
|
|
369
|
+
|
|
370
|
+
- [ ] **Step 1: Write the test file**
|
|
371
|
+
|
|
372
|
+
The overlay resolver will be a pure function exported from `cli-worker-provider.ts`. We test it in isolation by calling it directly. Since `cli-worker-provider.ts` uses the filesystem to read overlay files, we'll use a temp directory approach.
|
|
373
|
+
|
|
374
|
+
```typescript
|
|
375
|
+
// apps/control-plane/test/prompt-overlay.spec.ts
|
|
376
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
377
|
+
import fs from 'node:fs/promises';
|
|
378
|
+
import path from 'node:path';
|
|
379
|
+
import os from 'node:os';
|
|
380
|
+
import { resolvePromptOverlay } from '../src/providers/cli-worker-provider.js';
|
|
381
|
+
|
|
382
|
+
describe('resolvePromptOverlay', () => {
|
|
383
|
+
let tmpDir: string;
|
|
384
|
+
|
|
385
|
+
beforeEach(async () => {
|
|
386
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'overlay-test-'));
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
afterEach(async () => {
|
|
390
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
it('GIVEN_overlay_file_exists_WHEN_resolved_THEN_returns_overlay_content', async () => {
|
|
394
|
+
const overlayContent = '## Claude Builder Instructions\n\nUse /plan mode.';
|
|
395
|
+
await fs.mkdir(path.join(tmpDir, 'overrides'), { recursive: true });
|
|
396
|
+
await fs.writeFile(path.join(tmpDir, 'overrides', 'builder.claude.md'), overlayContent);
|
|
397
|
+
|
|
398
|
+
const result = await resolvePromptOverlay(path.join(tmpDir, 'overrides'), 'builder', 'claude');
|
|
399
|
+
|
|
400
|
+
expect(result).toBe(overlayContent);
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
it('GIVEN_no_overlay_file_WHEN_resolved_THEN_returns_null', async () => {
|
|
404
|
+
await fs.mkdir(path.join(tmpDir, 'overrides'), { recursive: true });
|
|
405
|
+
|
|
406
|
+
const result = await resolvePromptOverlay(path.join(tmpDir, 'overrides'), 'builder', 'codex');
|
|
407
|
+
|
|
408
|
+
expect(result).toBeNull();
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
it('GIVEN_no_overlay_directory_WHEN_resolved_THEN_returns_null', async () => {
|
|
412
|
+
const result = await resolvePromptOverlay(
|
|
413
|
+
path.join(tmpDir, 'nonexistent'),
|
|
414
|
+
'builder',
|
|
415
|
+
'claude',
|
|
416
|
+
);
|
|
417
|
+
|
|
418
|
+
expect(result).toBeNull();
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
it('GIVEN_planner_role_with_claude_WHEN_resolved_THEN_reads_planner_claude_md', async () => {
|
|
422
|
+
const overlayContent = '## Claude Planner Instructions';
|
|
423
|
+
await fs.mkdir(path.join(tmpDir, 'overrides'), { recursive: true });
|
|
424
|
+
await fs.writeFile(path.join(tmpDir, 'overrides', 'planner.claude.md'), overlayContent);
|
|
425
|
+
|
|
426
|
+
const result = await resolvePromptOverlay(path.join(tmpDir, 'overrides'), 'planner', 'claude');
|
|
427
|
+
|
|
428
|
+
expect(result).toBe(overlayContent);
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
it('GIVEN_empty_overlay_file_WHEN_resolved_THEN_returns_null', async () => {
|
|
432
|
+
await fs.mkdir(path.join(tmpDir, 'overrides'), { recursive: true });
|
|
433
|
+
await fs.writeFile(path.join(tmpDir, 'overrides', 'builder.claude.md'), ' \n ');
|
|
434
|
+
|
|
435
|
+
const result = await resolvePromptOverlay(path.join(tmpDir, 'overrides'), 'builder', 'claude');
|
|
436
|
+
|
|
437
|
+
expect(result).toBeNull();
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
- [ ] **Step 2: Run the tests — they should fail because `resolvePromptOverlay` doesn't exist yet**
|
|
443
|
+
|
|
444
|
+
Run: `npx vitest run apps/control-plane/test/prompt-overlay.spec.ts 2>&1 | tail -15`
|
|
445
|
+
Expected: FAIL — cannot find `resolvePromptOverlay` export.
|
|
446
|
+
|
|
447
|
+
- [ ] **Step 3: Commit the failing tests**
|
|
448
|
+
|
|
449
|
+
```bash
|
|
450
|
+
git add apps/control-plane/test/prompt-overlay.spec.ts
|
|
451
|
+
git commit -m "test: add failing tests for prompt overlay resolver"
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
### Task 5: Prompt Overlay Resolver — Implementation
|
|
457
|
+
|
|
458
|
+
**Files:**
|
|
459
|
+
|
|
460
|
+
- Modify: `apps/control-plane/src/providers/cli-worker-provider.ts`
|
|
461
|
+
|
|
462
|
+
- [ ] **Step 1: Add the `resolvePromptOverlay` function**
|
|
463
|
+
|
|
464
|
+
In `apps/control-plane/src/providers/cli-worker-provider.ts`, add the following exported function after the existing `buildWorkerPrompt` function (after line 291):
|
|
465
|
+
|
|
466
|
+
```typescript
|
|
467
|
+
export async function resolvePromptOverlay(
|
|
468
|
+
overlayDir: string,
|
|
469
|
+
role: string,
|
|
470
|
+
provider: string,
|
|
471
|
+
): Promise<string | null> {
|
|
472
|
+
const filename = `${role}.${provider}.md`;
|
|
473
|
+
const overlayPath = path.join(overlayDir, filename);
|
|
474
|
+
try {
|
|
475
|
+
const content = await fs.readFile(overlayPath, 'utf8');
|
|
476
|
+
return content.trim().length > 0 ? content : null;
|
|
477
|
+
} catch {
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
- [ ] **Step 2: Integrate overlay resolution into `runWorker()`**
|
|
484
|
+
|
|
485
|
+
In the same file, in the `runWorker` method (around line 913), modify the prompt assembly. Find these lines (around lines 952-954):
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
const systemPrompt = this.systemPromptsBySession.get(sessionId) ?? null;
|
|
489
|
+
const prompt = buildWorkerPrompt(promptPayload, systemPrompt, executionMode);
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
Replace them with:
|
|
493
|
+
|
|
494
|
+
```typescript
|
|
495
|
+
const baseSystemPrompt = this.systemPromptsBySession.get(sessionId) ?? null;
|
|
496
|
+
let systemPrompt = baseSystemPrompt;
|
|
497
|
+
if (baseSystemPrompt && this.overlayDir) {
|
|
498
|
+
const overlay = await resolvePromptOverlay(
|
|
499
|
+
this.overlayDir,
|
|
500
|
+
input.role,
|
|
501
|
+
effectiveSelection.provider,
|
|
502
|
+
);
|
|
503
|
+
if (overlay) {
|
|
504
|
+
systemPrompt = `${baseSystemPrompt}\n\n---\n\n## Provider-Specific Instructions\n\n${overlay}`;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
const prompt = buildWorkerPrompt(promptPayload, systemPrompt, executionMode);
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
- [ ] **Step 3: Add the `overlayDir` property to `CliWorkerProviderOptions` and constructor**
|
|
511
|
+
|
|
512
|
+
In the `CliWorkerProviderOptions` interface (around line 25), add:
|
|
513
|
+
|
|
514
|
+
```typescript
|
|
515
|
+
overlayDir?: string;
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
In the `CliWorkerProvider` class, add a private field after the other private fields (around line 765):
|
|
519
|
+
|
|
520
|
+
```typescript
|
|
521
|
+
private readonly overlayDir: string | null;
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
In the constructor (around line 824), after the line `this.repoRoot = options.repoRoot ?? null;` add:
|
|
525
|
+
|
|
526
|
+
```typescript
|
|
527
|
+
this.overlayDir = options.overlayDir ?? null;
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
- [ ] **Step 4: Run the overlay tests**
|
|
531
|
+
|
|
532
|
+
Run: `npx vitest run apps/control-plane/test/prompt-overlay.spec.ts 2>&1 | tail -15`
|
|
533
|
+
Expected: All 5 tests PASS.
|
|
534
|
+
|
|
535
|
+
- [ ] **Step 5: Run the full test suite**
|
|
536
|
+
|
|
537
|
+
Run: `npm run test 2>&1 | tail -20`
|
|
538
|
+
Expected: All existing tests still pass.
|
|
539
|
+
|
|
540
|
+
- [ ] **Step 6: Commit**
|
|
541
|
+
|
|
542
|
+
```bash
|
|
543
|
+
git add apps/control-plane/src/providers/cli-worker-provider.ts
|
|
544
|
+
git commit -m "feat: add prompt overlay resolver for provider-specific instructions"
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
### Task 6: Wire `overlayDir` Through the Runtime
|
|
550
|
+
|
|
551
|
+
**Files:**
|
|
552
|
+
|
|
553
|
+
- Modify: `apps/control-plane/src/supervisor/runtime.ts`
|
|
554
|
+
- Modify: `apps/control-plane/src/providers/worker-provider-factory.ts`
|
|
555
|
+
|
|
556
|
+
The `overlayDir` needs to flow from `agents.yaml` config through to the `CliWorkerProvider` constructor. The worker provider is created in the `WorkerProviderFactory`.
|
|
557
|
+
|
|
558
|
+
- [ ] **Step 1: Find where `CliWorkerProviderOptions` is constructed in the factory**
|
|
559
|
+
|
|
560
|
+
Read `apps/control-plane/src/providers/worker-provider-factory.ts` to find where `CliWorkerProvider` is instantiated. The factory constructs the provider with its options. Add `overlayDir` to the options passed through.
|
|
561
|
+
|
|
562
|
+
In the `DefaultWorkerProviderFactory`, find where `CliWorkerProviderOptions` is assembled and add:
|
|
563
|
+
|
|
564
|
+
```typescript
|
|
565
|
+
overlayDir: this.overlayDir,
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
Add a private `overlayDir` field and accept it in the factory constructor/options.
|
|
569
|
+
|
|
570
|
+
- [ ] **Step 2: Pass `overlayDir` from runtime.ts to the factory**
|
|
571
|
+
|
|
572
|
+
In `apps/control-plane/src/supervisor/runtime.ts`, where the `WorkerProviderFactory` is constructed, resolve the overlay dir from the agents config:
|
|
573
|
+
|
|
574
|
+
```typescript
|
|
575
|
+
const agentsConfig = kernel.getAgentsConfig();
|
|
576
|
+
const overlayDir = agentsConfig.runtime?.prompt_overlay_dir
|
|
577
|
+
? path.join(kernel.getRepoRoot(), agentsConfig.runtime.prompt_overlay_dir)
|
|
578
|
+
: path.join(kernel.getRepoRoot(), 'config/agentic/orchestrator/prompts/overrides');
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
Pass this `overlayDir` to the factory and then through to the provider.
|
|
582
|
+
|
|
583
|
+
- [ ] **Step 3: Run the full test suite**
|
|
584
|
+
|
|
585
|
+
Run: `npm run test 2>&1 | tail -20`
|
|
586
|
+
Expected: All tests pass. The overlay dir is optional so existing test mocks are unaffected.
|
|
587
|
+
|
|
588
|
+
- [ ] **Step 4: Commit**
|
|
589
|
+
|
|
590
|
+
```bash
|
|
591
|
+
git add apps/control-plane/src/providers/worker-provider-factory.ts apps/control-plane/src/supervisor/runtime.ts
|
|
592
|
+
git commit -m "feat: wire prompt overlay directory from agents config to worker provider"
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
### Task 7: Artifact Stager — Tests and Implementation
|
|
598
|
+
|
|
599
|
+
**Files:**
|
|
600
|
+
|
|
601
|
+
- Create: `apps/control-plane/src/supervisor/artifact-stager.ts`
|
|
602
|
+
- Create: `apps/control-plane/test/artifact-stager.spec.ts`
|
|
603
|
+
|
|
604
|
+
- [ ] **Step 1: Write the failing tests**
|
|
605
|
+
|
|
606
|
+
```typescript
|
|
607
|
+
// apps/control-plane/test/artifact-stager.spec.ts
|
|
608
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
609
|
+
import fs from 'node:fs/promises';
|
|
610
|
+
import path from 'node:path';
|
|
611
|
+
import os from 'node:os';
|
|
612
|
+
import { ArtifactStager } from '../src/supervisor/artifact-stager.js';
|
|
613
|
+
|
|
614
|
+
describe('ArtifactStager', () => {
|
|
615
|
+
let repoRoot: string;
|
|
616
|
+
let worktreePath: string;
|
|
617
|
+
const featureId = 'feat-abc-123';
|
|
618
|
+
|
|
619
|
+
beforeEach(async () => {
|
|
620
|
+
repoRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'stager-repo-'));
|
|
621
|
+
worktreePath = await fs.mkdtemp(path.join(os.tmpdir(), 'stager-wt-'));
|
|
622
|
+
|
|
623
|
+
const featureDir = path.join(repoRoot, '.aop', 'features', featureId);
|
|
624
|
+
await fs.mkdir(featureDir, { recursive: true });
|
|
625
|
+
await fs.writeFile(path.join(featureDir, 'spec.md'), '# Feature Spec\n\nBuild the thing.');
|
|
626
|
+
await fs.writeFile(path.join(featureDir, 'plan.md'), '# Plan\n\n1. Do step one.');
|
|
627
|
+
await fs.writeFile(
|
|
628
|
+
path.join(featureDir, 'plan.json'),
|
|
629
|
+
JSON.stringify({ version: 1, tasks: [] }),
|
|
630
|
+
);
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
afterEach(async () => {
|
|
634
|
+
await fs.rm(repoRoot, { recursive: true, force: true });
|
|
635
|
+
await fs.rm(worktreePath, { recursive: true, force: true });
|
|
636
|
+
});
|
|
637
|
+
|
|
638
|
+
it('GIVEN_all_artifacts_exist_WHEN_staged_THEN_copies_to_context_dir', async () => {
|
|
639
|
+
const stager = new ArtifactStager(repoRoot);
|
|
640
|
+
await stager.stage(featureId, worktreePath);
|
|
641
|
+
|
|
642
|
+
const contextDir = path.join(worktreePath, '.aop', 'context');
|
|
643
|
+
const specContent = await fs.readFile(path.join(contextDir, 'spec.md'), 'utf8');
|
|
644
|
+
const planMdContent = await fs.readFile(path.join(contextDir, 'plan.md'), 'utf8');
|
|
645
|
+
const planJsonContent = await fs.readFile(path.join(contextDir, 'plan.json'), 'utf8');
|
|
646
|
+
|
|
647
|
+
expect(specContent).toBe('# Feature Spec\n\nBuild the thing.');
|
|
648
|
+
expect(planMdContent).toBe('# Plan\n\n1. Do step one.');
|
|
649
|
+
expect(JSON.parse(planJsonContent)).toEqual({ version: 1, tasks: [] });
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
it('GIVEN_qa_test_index_exists_WHEN_staged_THEN_also_copies_it', async () => {
|
|
653
|
+
const featureDir = path.join(repoRoot, '.aop', 'features', featureId);
|
|
654
|
+
await fs.writeFile(
|
|
655
|
+
path.join(featureDir, 'qa_test_index.json'),
|
|
656
|
+
JSON.stringify({ tests: ['test1'] }),
|
|
657
|
+
);
|
|
658
|
+
|
|
659
|
+
const stager = new ArtifactStager(repoRoot);
|
|
660
|
+
await stager.stage(featureId, worktreePath);
|
|
661
|
+
|
|
662
|
+
const contextDir = path.join(worktreePath, '.aop', 'context');
|
|
663
|
+
const qaContent = await fs.readFile(path.join(contextDir, 'qa_test_index.json'), 'utf8');
|
|
664
|
+
expect(JSON.parse(qaContent)).toEqual({ tests: ['test1'] });
|
|
665
|
+
});
|
|
666
|
+
|
|
667
|
+
it('GIVEN_qa_test_index_missing_WHEN_staged_THEN_no_error_and_other_files_copied', async () => {
|
|
668
|
+
const stager = new ArtifactStager(repoRoot);
|
|
669
|
+
await stager.stage(featureId, worktreePath);
|
|
670
|
+
|
|
671
|
+
const contextDir = path.join(worktreePath, '.aop', 'context');
|
|
672
|
+
await expect(fs.access(path.join(contextDir, 'qa_test_index.json'))).rejects.toThrow();
|
|
673
|
+
// But other files exist
|
|
674
|
+
await expect(fs.access(path.join(contextDir, 'spec.md'))).resolves.toBeUndefined();
|
|
675
|
+
await expect(fs.access(path.join(contextDir, 'plan.md'))).resolves.toBeUndefined();
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
it('GIVEN_context_dir_already_exists_WHEN_staged_THEN_overwrites_cleanly', async () => {
|
|
679
|
+
const contextDir = path.join(worktreePath, '.aop', 'context');
|
|
680
|
+
await fs.mkdir(contextDir, { recursive: true });
|
|
681
|
+
await fs.writeFile(path.join(contextDir, 'spec.md'), 'old content');
|
|
682
|
+
|
|
683
|
+
const stager = new ArtifactStager(repoRoot);
|
|
684
|
+
await stager.stage(featureId, worktreePath);
|
|
685
|
+
|
|
686
|
+
const specContent = await fs.readFile(path.join(contextDir, 'spec.md'), 'utf8');
|
|
687
|
+
expect(specContent).toBe('# Feature Spec\n\nBuild the thing.');
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
it('GIVEN_staged_WHEN_readme_checked_THEN_readme_exists_with_content', async () => {
|
|
691
|
+
const stager = new ArtifactStager(repoRoot);
|
|
692
|
+
await stager.stage(featureId, worktreePath);
|
|
693
|
+
|
|
694
|
+
const contextDir = path.join(worktreePath, '.aop', 'context');
|
|
695
|
+
const readme = await fs.readFile(path.join(contextDir, 'README.md'), 'utf8');
|
|
696
|
+
expect(readme).toContain('spec.md');
|
|
697
|
+
expect(readme).toContain('plan.md');
|
|
698
|
+
expect(readme).toContain('plan.json');
|
|
699
|
+
});
|
|
700
|
+
});
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
- [ ] **Step 2: Run tests to verify they fail**
|
|
704
|
+
|
|
705
|
+
Run: `npx vitest run apps/control-plane/test/artifact-stager.spec.ts 2>&1 | tail -15`
|
|
706
|
+
Expected: FAIL — cannot import `ArtifactStager`.
|
|
707
|
+
|
|
708
|
+
- [ ] **Step 3: Implement the `ArtifactStager`**
|
|
709
|
+
|
|
710
|
+
```typescript
|
|
711
|
+
// apps/control-plane/src/supervisor/artifact-stager.ts
|
|
712
|
+
import fs from 'node:fs/promises';
|
|
713
|
+
import path from 'node:path';
|
|
714
|
+
|
|
715
|
+
const REQUIRED_ARTIFACTS = ['spec.md', 'plan.md', 'plan.json'] as const;
|
|
716
|
+
const OPTIONAL_ARTIFACTS = ['qa_test_index.json'] as const;
|
|
717
|
+
|
|
718
|
+
const CONTEXT_README = `# Staged Artifacts
|
|
719
|
+
|
|
720
|
+
These files are read-only copies staged by the orchestrator for the builder agent.
|
|
721
|
+
|
|
722
|
+
| File | Description |
|
|
723
|
+
|---|---|
|
|
724
|
+
| spec.md | Original feature specification — read this to understand the "why" |
|
|
725
|
+
| plan.md | Human-readable implementation plan |
|
|
726
|
+
| plan.json | Structured plan with tasks and acceptance criteria |
|
|
727
|
+
| qa_test_index.json | Test expectations (if available) |
|
|
728
|
+
|
|
729
|
+
Do not edit these files. They are copied from the canonical feature directory.
|
|
730
|
+
`;
|
|
731
|
+
|
|
732
|
+
export class ArtifactStager {
|
|
733
|
+
private readonly repoRoot: string;
|
|
734
|
+
|
|
735
|
+
constructor(repoRoot: string) {
|
|
736
|
+
this.repoRoot = repoRoot;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
async stage(featureId: string, worktreePath: string): Promise<void> {
|
|
740
|
+
const featureDir = path.join(this.repoRoot, '.aop', 'features', featureId);
|
|
741
|
+
const contextDir = path.join(worktreePath, '.aop', 'context');
|
|
742
|
+
|
|
743
|
+
await fs.mkdir(contextDir, { recursive: true });
|
|
744
|
+
|
|
745
|
+
for (const artifact of REQUIRED_ARTIFACTS) {
|
|
746
|
+
const src = path.join(featureDir, artifact);
|
|
747
|
+
const dst = path.join(contextDir, artifact);
|
|
748
|
+
await fs.copyFile(src, dst);
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
for (const artifact of OPTIONAL_ARTIFACTS) {
|
|
752
|
+
const src = path.join(featureDir, artifact);
|
|
753
|
+
const dst = path.join(contextDir, artifact);
|
|
754
|
+
try {
|
|
755
|
+
await fs.copyFile(src, dst);
|
|
756
|
+
} catch {
|
|
757
|
+
// Optional — skip if not present
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
await fs.writeFile(path.join(contextDir, 'README.md'), CONTEXT_README);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
- [ ] **Step 4: Run the tests**
|
|
767
|
+
|
|
768
|
+
Run: `npx vitest run apps/control-plane/test/artifact-stager.spec.ts 2>&1 | tail -15`
|
|
769
|
+
Expected: All 5 tests PASS.
|
|
770
|
+
|
|
771
|
+
- [ ] **Step 5: Commit**
|
|
772
|
+
|
|
773
|
+
```bash
|
|
774
|
+
git add apps/control-plane/src/supervisor/artifact-stager.ts apps/control-plane/test/artifact-stager.spec.ts
|
|
775
|
+
git commit -m "feat: add artifact stager to copy spec/plan into builder worktree"
|
|
776
|
+
```
|
|
777
|
+
|
|
778
|
+
---
|
|
779
|
+
|
|
780
|
+
### Task 8: Wire Artifact Stager into Build Wave Executor
|
|
781
|
+
|
|
782
|
+
**Files:**
|
|
783
|
+
|
|
784
|
+
- Modify: `apps/control-plane/src/supervisor/build-wave-executor.ts`
|
|
785
|
+
- Modify: `apps/control-plane/src/providers/cli-worker-provider.ts`
|
|
786
|
+
|
|
787
|
+
- [ ] **Step 1: Add `ArtifactStager` to `BuildWaveExecutorDependencies`**
|
|
788
|
+
|
|
789
|
+
In `apps/control-plane/src/supervisor/build-wave-executor.ts`, add the import:
|
|
790
|
+
|
|
791
|
+
```typescript
|
|
792
|
+
import { ArtifactStager } from './artifact-stager.js';
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
In the `BuildWaveExecutorDependencies` interface (around line 39), add:
|
|
796
|
+
|
|
797
|
+
```typescript
|
|
798
|
+
artifactStager?: ArtifactStager;
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
In the constructor, store the stager as a private field:
|
|
802
|
+
|
|
803
|
+
```typescript
|
|
804
|
+
private readonly artifactStager: ArtifactStager | null;
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
In the constructor body, add:
|
|
808
|
+
|
|
809
|
+
```typescript
|
|
810
|
+
this.artifactStager = deps.artifactStager ?? null;
|
|
811
|
+
```
|
|
812
|
+
|
|
813
|
+
- [ ] **Step 2: Call `stage()` before builder dispatch**
|
|
814
|
+
|
|
815
|
+
In the `run()` method, find where `this.workerDecisionRunner.execute()` is called for the builder (around line 226). Add the staging call **before** the worker execute call. Find the context fetch and add staging after it:
|
|
816
|
+
|
|
817
|
+
After the line:
|
|
818
|
+
|
|
819
|
+
```typescript
|
|
820
|
+
const context = await this.toolCaller.callTool('builder', TOOLS.FEATURE_GET_CONTEXT, {
|
|
821
|
+
feature_id: featureId,
|
|
822
|
+
});
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
And before the `let decision;` line, add:
|
|
826
|
+
|
|
827
|
+
```typescript
|
|
828
|
+
if (this.artifactStager && this.providerMode === 'live') {
|
|
829
|
+
const worktreePath = context.data?.working_directory as string | undefined;
|
|
830
|
+
if (worktreePath) {
|
|
831
|
+
try {
|
|
832
|
+
await this.artifactStager.stage(featureId, worktreePath);
|
|
833
|
+
} catch {
|
|
834
|
+
// Non-fatal: builder can still function without staged artifacts
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
```
|
|
839
|
+
|
|
840
|
+
Note: The `working_directory` may not be on the context data directly. Check where the worktree path comes from. If it's resolved in the `WorkerDecisionLoop` instead, the staging call should happen there. The implementer should verify by reading how `resolveWorktreePath` works in `worker-decision-loop.ts` and adjust the staging call location accordingly. The key contract is: staging must happen before the builder's `runWorker()` is called, and it needs access to the worktree path.
|
|
841
|
+
|
|
842
|
+
- [ ] **Step 3: Update builder file guidance in `buildInteractiveWorkerPrompt()`**
|
|
843
|
+
|
|
844
|
+
In `apps/control-plane/src/providers/cli-worker-provider.ts`, find the builder file guidance section (around line 158-167). Change the builder block from:
|
|
845
|
+
|
|
846
|
+
```typescript
|
|
847
|
+
} else if (role === 'builder') {
|
|
848
|
+
lines.push(
|
|
849
|
+
'',
|
|
850
|
+
'Implementation artifacts are on disk — use these files as the execution baseline:',
|
|
851
|
+
` ${featureDir}/state.md — current status and front matter`,
|
|
852
|
+
` ${featureDir}/plan.md — canonical planning baseline`,
|
|
853
|
+
` ${featureDir}/plan.json — machine-readable plan`,
|
|
854
|
+
` ${featureDir}/evidence/ — gate run results`,
|
|
855
|
+
` ${featureDir}/decisions.md — decision history`,
|
|
856
|
+
);
|
|
857
|
+
```
|
|
858
|
+
|
|
859
|
+
to:
|
|
860
|
+
|
|
861
|
+
```typescript
|
|
862
|
+
} else if (role === 'builder') {
|
|
863
|
+
const contextDir = workingDir ? `${workingDir}/.aop/context` : `${featureDir}/.aop/context`;
|
|
864
|
+
lines.push(
|
|
865
|
+
'',
|
|
866
|
+
'Staged artifacts (read these first for context):',
|
|
867
|
+
` ${contextDir}/spec.md — original feature specification`,
|
|
868
|
+
` ${contextDir}/plan.md — human-readable implementation plan`,
|
|
869
|
+
` ${contextDir}/plan.json — structured plan with tasks and acceptance criteria`,
|
|
870
|
+
` ${contextDir}/qa_test_index.json — test expectations (if available)`,
|
|
871
|
+
'',
|
|
872
|
+
'Runtime artifacts:',
|
|
873
|
+
` ${featureDir}/state.md — current status and front matter`,
|
|
874
|
+
` ${featureDir}/evidence/ — gate run results`,
|
|
875
|
+
` ${featureDir}/decisions.md — decision history`,
|
|
876
|
+
);
|
|
877
|
+
```
|
|
878
|
+
|
|
879
|
+
- [ ] **Step 4: Wire the stager in runtime.ts**
|
|
880
|
+
|
|
881
|
+
In `apps/control-plane/src/supervisor/runtime.ts`, where the `BuildWaveExecutor` is constructed (around line 466), add the artifact stager:
|
|
882
|
+
|
|
883
|
+
```typescript
|
|
884
|
+
import { ArtifactStager } from './artifact-stager.js';
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
Before the `BuildWaveExecutor` construction, create the stager:
|
|
888
|
+
|
|
889
|
+
```typescript
|
|
890
|
+
const artifactStager = new ArtifactStager(this.kernel.getRepoRoot());
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
Then add it to the dependencies object:
|
|
894
|
+
|
|
895
|
+
```typescript
|
|
896
|
+
this.buildWaveExecutor = new BuildWaveExecutor({
|
|
897
|
+
// ... existing deps ...
|
|
898
|
+
artifactStager,
|
|
899
|
+
});
|
|
900
|
+
```
|
|
901
|
+
|
|
902
|
+
- [ ] **Step 5: Run full test suite**
|
|
903
|
+
|
|
904
|
+
Run: `npm run test 2>&1 | tail -20`
|
|
905
|
+
Expected: All tests pass.
|
|
906
|
+
|
|
907
|
+
Run: `npm run build 2>&1 | tail -10`
|
|
908
|
+
Expected: Clean build.
|
|
909
|
+
|
|
910
|
+
- [ ] **Step 6: Commit**
|
|
911
|
+
|
|
912
|
+
```bash
|
|
913
|
+
git add apps/control-plane/src/supervisor/build-wave-executor.ts apps/control-plane/src/providers/cli-worker-provider.ts apps/control-plane/src/supervisor/runtime.ts
|
|
914
|
+
git commit -m "feat: wire artifact stager into build wave and update builder file guidance"
|
|
915
|
+
```
|
|
916
|
+
|
|
917
|
+
---
|
|
918
|
+
|
|
919
|
+
### Task 9: Provider Overlay Prompt Files
|
|
920
|
+
|
|
921
|
+
**Files:**
|
|
922
|
+
|
|
923
|
+
- Create: `config/agentic/orchestrator/prompts/overrides/planner.claude.md`
|
|
924
|
+
- Create: `config/agentic/orchestrator/prompts/overrides/planner.codex.md`
|
|
925
|
+
- Create: `config/agentic/orchestrator/prompts/overrides/builder.claude.md`
|
|
926
|
+
- Create: `config/agentic/orchestrator/prompts/overrides/builder.codex.md`
|
|
927
|
+
|
|
928
|
+
- [ ] **Step 1: Create the overrides directory**
|
|
929
|
+
|
|
930
|
+
```bash
|
|
931
|
+
mkdir -p config/agentic/orchestrator/prompts/overrides
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
- [ ] **Step 2: Write `planner.claude.md`**
|
|
935
|
+
|
|
936
|
+
```markdown
|
|
937
|
+
## Claude-Specific Planning Instructions
|
|
938
|
+
|
|
939
|
+
You are running inside Claude Code. Leverage its native capabilities:
|
|
940
|
+
|
|
941
|
+
### Planning approach
|
|
942
|
+
|
|
943
|
+
1. **Use extended thinking** for complex architectural decisions. When analyzing the spec, take time to reason through trade-offs before committing to an approach.
|
|
944
|
+
|
|
945
|
+
2. **Read the codebase** before planning. Use your file reading and search tools to understand existing patterns, conventions, and architecture. The plan must work within the existing codebase, not against it.
|
|
946
|
+
|
|
947
|
+
3. **Create structured, actionable plans** where each task maps to a discrete, testable change. Claude Code excels at file-level precision — every task should name exact files to create or modify.
|
|
948
|
+
|
|
949
|
+
4. **Reference the spec as source of truth.** The feature specification is staged at `.aop/context/spec.md` in the working directory. Read it before beginning the planning process. Every plan task should trace back to a spec requirement.
|
|
950
|
+
|
|
951
|
+
### Plan quality
|
|
952
|
+
|
|
953
|
+
- Each plan task should produce a commit-worthy change
|
|
954
|
+
- Include test expectations alongside implementation tasks
|
|
955
|
+
- Name exact file paths — do not use placeholder paths
|
|
956
|
+
- Include acceptance criteria that can be mechanically verified
|
|
957
|
+
```
|
|
958
|
+
|
|
959
|
+
- [ ] **Step 3: Write `planner.codex.md`**
|
|
960
|
+
|
|
961
|
+
```markdown
|
|
962
|
+
## Codex-Specific Planning Instructions
|
|
963
|
+
|
|
964
|
+
You are running inside Codex CLI.
|
|
965
|
+
|
|
966
|
+
### Planning approach
|
|
967
|
+
|
|
968
|
+
1. **Emphasize file-level granularity.** Codex works best with explicit file lists per task. Every plan task must name the exact files to create or modify.
|
|
969
|
+
|
|
970
|
+
2. **Keep tasks small and isolated.** Each task should touch a minimal set of files and produce a self-contained, testable change.
|
|
971
|
+
|
|
972
|
+
3. **Read existing patterns first.** Before planning, examine the files adjacent to where changes will be made. Follow established conventions.
|
|
973
|
+
|
|
974
|
+
4. **Reference the spec.** The feature specification is the source of truth for what to build. Every plan task should trace to a spec requirement.
|
|
975
|
+
|
|
976
|
+
### Plan quality
|
|
977
|
+
|
|
978
|
+
- Prefer explicit file paths over directory-level descriptions
|
|
979
|
+
- Each task should produce a commit-worthy change
|
|
980
|
+
- Include test expectations alongside implementation tasks
|
|
981
|
+
- Include acceptance criteria that can be mechanically verified
|
|
982
|
+
```
|
|
983
|
+
|
|
984
|
+
- [ ] **Step 4: Write `builder.claude.md`**
|
|
985
|
+
|
|
986
|
+
```markdown
|
|
987
|
+
## Claude-Specific Build Instructions
|
|
988
|
+
|
|
989
|
+
You are running inside Claude Code. Leverage its native capabilities for implementation.
|
|
990
|
+
|
|
991
|
+
### Before starting work
|
|
992
|
+
|
|
993
|
+
1. **Read the staged plan and spec.** These files are in your working directory:
|
|
994
|
+
- `.aop/context/spec.md` — the original feature specification (the "why")
|
|
995
|
+
- `.aop/context/plan.md` — the human-readable implementation plan
|
|
996
|
+
- `.aop/context/plan.json` — the structured plan with tasks and acceptance criteria
|
|
997
|
+
|
|
998
|
+
2. **Treat the plan as a task checklist.** Work through tasks sequentially. Each task in the plan corresponds to a discrete change. Complete one task fully (including tests) before moving to the next.
|
|
999
|
+
|
|
1000
|
+
### While working
|
|
1001
|
+
|
|
1002
|
+
3. **Use Claude Code's native tools.** Edit files directly using your file editing tools. Do not emit raw patches or diffs — make the changes on disk.
|
|
1003
|
+
|
|
1004
|
+
4. **Commit after each task.** Each plan task should produce its own commit. This makes the work reviewable and reversible.
|
|
1005
|
+
|
|
1006
|
+
5. **Run tests after each change.** Verify your work passes before moving to the next task.
|
|
1007
|
+
|
|
1008
|
+
6. **Check acceptance criteria.** The plan's acceptance criteria are the definition of done. Before marking a task complete, verify each criterion is met.
|
|
1009
|
+
|
|
1010
|
+
### Quality checks
|
|
1011
|
+
|
|
1012
|
+
7. **Stay within planned scope.** Only modify files listed in the plan's `allowed_areas` and `files` lists. If you need to touch an unplanned file, return a `REQUEST.action=more_context` instead.
|
|
1013
|
+
|
|
1014
|
+
8. **Follow existing patterns.** Read adjacent code to match conventions, import styles, error handling patterns, and test structure.
|
|
1015
|
+
```
|
|
1016
|
+
|
|
1017
|
+
- [ ] **Step 5: Write `builder.codex.md`**
|
|
1018
|
+
|
|
1019
|
+
```markdown
|
|
1020
|
+
## Codex-Specific Build Instructions
|
|
1021
|
+
|
|
1022
|
+
You are running inside Codex CLI.
|
|
1023
|
+
|
|
1024
|
+
### Before starting work
|
|
1025
|
+
|
|
1026
|
+
1. **Read the staged plan and spec.** These files are in your working directory:
|
|
1027
|
+
- `.aop/context/spec.md` — the original feature specification (the "why")
|
|
1028
|
+
- `.aop/context/plan.md` — the human-readable implementation plan
|
|
1029
|
+
- `.aop/context/plan.json` — the structured plan with tasks and acceptance criteria
|
|
1030
|
+
|
|
1031
|
+
2. **Treat the plan as a task checklist.** Work through tasks sequentially. Complete one task fully before moving to the next.
|
|
1032
|
+
|
|
1033
|
+
### While working
|
|
1034
|
+
|
|
1035
|
+
3. **Edit files directly.** Make changes on disk in the working directory. Do not emit raw diffs or patches.
|
|
1036
|
+
|
|
1037
|
+
4. **Commit after each task.** Each plan task should produce its own commit.
|
|
1038
|
+
|
|
1039
|
+
5. **Stay within the plan's `allowed_areas` and `files` lists.** If you need to modify files outside the plan, return `REQUEST.action=more_context`.
|
|
1040
|
+
|
|
1041
|
+
6. **Check acceptance criteria.** The plan's acceptance criteria are the definition of done for each task.
|
|
1042
|
+
|
|
1043
|
+
### Quality checks
|
|
1044
|
+
|
|
1045
|
+
7. **Follow existing patterns.** Read adjacent code to match conventions, import styles, and test structure.
|
|
1046
|
+
|
|
1047
|
+
8. **Run tests after each change.** Verify your work passes before moving to the next task.
|
|
1048
|
+
```
|
|
1049
|
+
|
|
1050
|
+
- [ ] **Step 6: Verify the overlay files are loadable**
|
|
1051
|
+
|
|
1052
|
+
Run: `ls -la config/agentic/orchestrator/prompts/overrides/`
|
|
1053
|
+
Expected: Four `.md` files listed.
|
|
1054
|
+
|
|
1055
|
+
Run: `wc -l config/agentic/orchestrator/prompts/overrides/*.md`
|
|
1056
|
+
Expected: All files have content (non-zero line counts).
|
|
1057
|
+
|
|
1058
|
+
- [ ] **Step 7: Commit**
|
|
1059
|
+
|
|
1060
|
+
```bash
|
|
1061
|
+
git add config/agentic/orchestrator/prompts/overrides/
|
|
1062
|
+
git commit -m "feat: add provider-specific prompt overlays for Claude and Codex"
|
|
1063
|
+
```
|
|
1064
|
+
|
|
1065
|
+
---
|
|
1066
|
+
|
|
1067
|
+
### Task 10: Final Verification
|
|
1068
|
+
|
|
1069
|
+
**Files:** None (verification only)
|
|
1070
|
+
|
|
1071
|
+
- [ ] **Step 1: Run full test suite**
|
|
1072
|
+
|
|
1073
|
+
Run: `npm run test 2>&1 | tail -30`
|
|
1074
|
+
Expected: All tests pass at ≥90% coverage thresholds.
|
|
1075
|
+
|
|
1076
|
+
- [ ] **Step 2: Run lint**
|
|
1077
|
+
|
|
1078
|
+
Run: `npm run lint 2>&1 | tail -10`
|
|
1079
|
+
Expected: Clean (zero warnings).
|
|
1080
|
+
|
|
1081
|
+
- [ ] **Step 3: Run typecheck**
|
|
1082
|
+
|
|
1083
|
+
Run: `npm run typecheck 2>&1 | tail -10`
|
|
1084
|
+
Expected: Clean compilation.
|
|
1085
|
+
|
|
1086
|
+
- [ ] **Step 4: Run validators**
|
|
1087
|
+
|
|
1088
|
+
Run: `npm run validate:mcp-contracts 2>&1 | tail -5`
|
|
1089
|
+
Expected: Clean.
|
|
1090
|
+
|
|
1091
|
+
Run: `npm run validate:architecture 2>&1 | tail -5`
|
|
1092
|
+
Expected: Clean.
|
|
1093
|
+
|
|
1094
|
+
- [ ] **Step 5: Update progress.md**
|
|
1095
|
+
|
|
1096
|
+
Append entries to `spec-files/progress.md` covering:
|
|
1097
|
+
|
|
1098
|
+
- Drop zone utility and UI integration
|
|
1099
|
+
- Prompt overlay resolver and schema update
|
|
1100
|
+
- Artifact stager implementation and wiring
|
|
1101
|
+
- Provider-specific overlay prompt files
|
|
1102
|
+
|
|
1103
|
+
- [ ] **Step 6: Commit progress.md**
|
|
1104
|
+
|
|
1105
|
+
```bash
|
|
1106
|
+
git add spec-files/progress.md
|
|
1107
|
+
git commit -m "docs: update progress.md with drop zone and provider optimization entries"
|
|
1108
|
+
```
|