agentic-orchestrator 0.1.6 → 0.1.8
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/.prettierignore +10 -0
- package/.prettierrc.json +24 -0
- package/CLAUDE.md +3 -2
- package/README.md +71 -48
- package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
- package/agentic/orchestrator/prompts/planner.system.md +1 -0
- package/agentic/orchestrator/schemas/agents.schema.json +5 -22
- package/agentic/orchestrator/schemas/gates.schema.json +4 -19
- package/agentic/orchestrator/schemas/index.schema.json +3 -14
- package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
- package/agentic/orchestrator/schemas/plan.schema.json +6 -26
- package/agentic/orchestrator/schemas/policy.schema.json +19 -81
- package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
- package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
- package/agentic/orchestrator/schemas/state.schema.json +11 -61
- package/agentic/orchestrator/tools/catalog.json +33 -164
- package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
- package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
- package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
- package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
- package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
- package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
- package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
- package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
- package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
- package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
- package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
- package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
- package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
- package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
- package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
- package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
- package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
- package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
- package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
- package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
- package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
- package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
- package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
- package/apps/control-plane/src/application/services/gate-service.ts +64 -41
- package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
- package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
- package/apps/control-plane/src/application/services/lock-service.ts +75 -49
- package/apps/control-plane/src/application/services/merge-service.ts +91 -50
- package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
- package/apps/control-plane/src/application/services/patch-service.ts +73 -44
- package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
- package/apps/control-plane/src/application/services/plan-service.ts +148 -89
- package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
- package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
- package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
- package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
- package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
- package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
- package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
- package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
- package/apps/control-plane/src/cli/aop.ts +2 -2
- package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
- package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
- package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
- package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
- package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
- package/apps/control-plane/src/cli/env-file.ts +115 -0
- package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
- package/apps/control-plane/src/cli/init-command-handler.ts +182 -56
- package/apps/control-plane/src/cli/io.ts +7 -3
- package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
- package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
- package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
- package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
- package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
- package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
- package/apps/control-plane/src/cli/spec-utils.ts +2 -2
- package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
- package/apps/control-plane/src/cli/tooling.ts +3 -3
- package/apps/control-plane/src/cli/types.ts +1 -1
- package/apps/control-plane/src/core/collisions.ts +27 -10
- package/apps/control-plane/src/core/constants.ts +13 -7
- package/apps/control-plane/src/core/error-codes.ts +1 -1
- package/apps/control-plane/src/core/fs.ts +11 -5
- package/apps/control-plane/src/core/gates.ts +53 -27
- package/apps/control-plane/src/core/git.ts +18 -6
- package/apps/control-plane/src/core/kernel.ts +513 -227
- package/apps/control-plane/src/core/patch.ts +7 -3
- package/apps/control-plane/src/core/path-layout.ts +5 -1
- package/apps/control-plane/src/core/path-rules.ts +19 -5
- package/apps/control-plane/src/core/qa-index.ts +26 -12
- package/apps/control-plane/src/core/response.ts +9 -6
- package/apps/control-plane/src/core/schemas.ts +29 -10
- package/apps/control-plane/src/core/tool-caller.ts +1 -1
- package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
- package/apps/control-plane/src/index.ts +3 -9
- package/apps/control-plane/src/interfaces/cli/bootstrap.ts +79 -35
- package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
- package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
- package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
- package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
- package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
- package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
- package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
- package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
- package/apps/control-plane/src/mcp/tool-client.ts +17 -5
- package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
- package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
- package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
- package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
- package/apps/control-plane/src/providers/providers.ts +137 -54
- package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
- package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
- package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
- package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
- package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
- package/apps/control-plane/src/supervisor/runtime.ts +59 -35
- package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
- package/apps/control-plane/src/supervisor/types.ts +22 -7
- package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
- package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
- package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
- package/apps/control-plane/test/aop.spec.ts +4 -4
- package/apps/control-plane/test/batch-operations.spec.ts +20 -18
- package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
- package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
- package/apps/control-plane/test/bootstrap.spec.ts +72 -40
- package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
- package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
- package/apps/control-plane/test/cli.spec.ts +1 -1
- package/apps/control-plane/test/cli.unit.spec.ts +226 -167
- package/apps/control-plane/test/collision-queue.spec.ts +49 -40
- package/apps/control-plane/test/collisions.spec.ts +30 -30
- package/apps/control-plane/test/core-utils.spec.ts +29 -15
- package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
- package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
- package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
- package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
- package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
- package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
- package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
- package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
- package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
- package/apps/control-plane/test/gates.spec.ts +101 -81
- package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
- package/apps/control-plane/test/helpers.ts +10 -6
- package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
- package/apps/control-plane/test/init-wizard.spec.ts +328 -68
- package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
- package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
- package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
- package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
- package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
- package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
- package/apps/control-plane/test/kernel.spec.ts +134 -51
- package/apps/control-plane/test/lock-service.spec.ts +92 -68
- package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
- package/apps/control-plane/test/mcp.spec.ts +231 -115
- package/apps/control-plane/test/merge-service.spec.ts +142 -94
- package/apps/control-plane/test/multi-project.spec.ts +28 -22
- package/apps/control-plane/test/notifier-service.spec.ts +136 -92
- package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
- package/apps/control-plane/test/patch-service.spec.ts +128 -48
- package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
- package/apps/control-plane/test/plan-service.spec.ts +50 -39
- package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
- package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
- package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
- package/apps/control-plane/test/providers.spec.ts +208 -104
- package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
- package/apps/control-plane/test/qa-index.spec.ts +58 -61
- package/apps/control-plane/test/reactions.spec.ts +88 -45
- package/apps/control-plane/test/response.spec.ts +5 -5
- package/apps/control-plane/test/resume-command.spec.ts +121 -80
- package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
- package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
- package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
- package/apps/control-plane/test/services.spec.ts +147 -129
- package/apps/control-plane/test/session-management.spec.ts +136 -74
- package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
- package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
- package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
- package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
- package/apps/control-plane/test/supervisor.spec.ts +67 -43
- package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
- package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
- package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
- package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
- package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
- package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
- package/apps/control-plane/tsconfig.build.json +2 -7
- package/apps/control-plane/tsconfig.json +1 -5
- package/apps/control-plane/vitest.config.ts +7 -7
- package/config/agentic/orchestrator/adapters.yaml +3 -0
- package/config/agentic/orchestrator/agents.yaml +14 -0
- package/config/agentic/orchestrator/gates.yaml +28 -0
- package/config/agentic/orchestrator/policy.yaml +22 -0
- package/config/agentic/orchestrator/prompts/builder.system.md +1 -0
- package/config/agentic/orchestrator/prompts/planner.system.md +16 -0
- package/config/agentic/orchestrator/prompts/qa.system.md +1 -0
- package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
- package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
- package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
- package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
- package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
- package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
- package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
- package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
- package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
- package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
- package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-service.js +26 -26
- package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
- package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
- package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/lock-service.js +32 -32
- package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/merge-service.js +41 -27
- package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
- package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/patch-service.js +21 -19
- package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
- package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/plan-service.js +33 -33
- package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
- package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
- package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
- package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
- package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
- package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
- package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
- package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
- package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
- package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
- package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
- package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
- package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
- package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
- package/dist/apps/control-plane/cli/env-file.d.ts +4 -0
- package/dist/apps/control-plane/cli/env-file.js +89 -0
- package/dist/apps/control-plane/cli/env-file.js.map +1 -0
- package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
- package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/init-command-handler.js +97 -37
- package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/io.js +2 -2
- package/dist/apps/control-plane/cli/io.js.map +1 -1
- package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
- package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
- package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
- package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
- package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
- package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
- package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
- package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/tooling.js +1 -1
- package/dist/apps/control-plane/core/collisions.js +11 -8
- package/dist/apps/control-plane/core/collisions.js.map +1 -1
- package/dist/apps/control-plane/core/constants.js +13 -7
- package/dist/apps/control-plane/core/constants.js.map +1 -1
- package/dist/apps/control-plane/core/error-codes.js +1 -1
- package/dist/apps/control-plane/core/fs.js.map +1 -1
- package/dist/apps/control-plane/core/gates.d.ts +2 -2
- package/dist/apps/control-plane/core/gates.js +26 -19
- package/dist/apps/control-plane/core/gates.js.map +1 -1
- package/dist/apps/control-plane/core/git.js +3 -3
- package/dist/apps/control-plane/core/git.js.map +1 -1
- package/dist/apps/control-plane/core/kernel.d.ts +1 -0
- package/dist/apps/control-plane/core/kernel.js +134 -81
- package/dist/apps/control-plane/core/kernel.js.map +1 -1
- package/dist/apps/control-plane/core/patch.js +7 -3
- package/dist/apps/control-plane/core/patch.js.map +1 -1
- package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
- package/dist/apps/control-plane/core/path-layout.js +4 -1
- package/dist/apps/control-plane/core/path-layout.js.map +1 -1
- package/dist/apps/control-plane/core/path-rules.js +3 -1
- package/dist/apps/control-plane/core/path-rules.js.map +1 -1
- package/dist/apps/control-plane/core/qa-index.js +5 -5
- package/dist/apps/control-plane/core/qa-index.js.map +1 -1
- package/dist/apps/control-plane/core/response.js +3 -3
- package/dist/apps/control-plane/core/response.js.map +1 -1
- package/dist/apps/control-plane/core/schemas.js +10 -6
- package/dist/apps/control-plane/core/schemas.js.map +1 -1
- package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
- package/dist/apps/control-plane/index.d.ts +1 -1
- package/dist/apps/control-plane/index.js +1 -1
- package/dist/apps/control-plane/index.js.map +1 -1
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js +40 -23
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
- package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
- package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
- package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
- package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
- package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
- package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
- package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
- package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
- package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
- package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
- package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
- package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-client.js +2 -2
- package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
- package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
- package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
- package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
- package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
- package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
- package/dist/apps/control-plane/providers/providers.d.ts +3 -2
- package/dist/apps/control-plane/providers/providers.js +81 -39
- package/dist/apps/control-plane/providers/providers.js.map +1 -1
- package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
- package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
- package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/runtime.js +25 -21
- package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
- package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
- package/dist/apps/control-plane/supervisor/types.js.map +1 -1
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
- package/eslint.config.mjs +20 -20
- package/example-configurations/README.md +1 -1
- package/example-configurations/java/agents.yaml +3 -3
- package/example-configurations/java/policy.yaml +1 -1
- package/example-configurations/node/agents.yaml +3 -3
- package/example-configurations/node/policy.yaml +1 -1
- package/package.json +10 -5
- package/packages/web-dashboard/next.config.js +2 -2
- package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
- package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
- package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
- package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
- package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
- package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
- package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
- package/packages/web-dashboard/src/app/globals.css +10 -2
- package/packages/web-dashboard/src/app/page.tsx +100 -37
- package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
- package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
- package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
- package/packages/web-dashboard/tsconfig.json +3 -11
- package/scripts/nx-safe.mjs +10 -10
- package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
- package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +189 -90
- package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
- package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
- package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
- package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
- package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
- package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
- package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
- package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
- package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
- package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
- package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
- package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
- package/spec-files/outstanding/agentic_orchestrator_provider_auth_bootstrap_spec.md +384 -0
- package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
- package/spec-files/progress.md +186 -175
- package/tsconfig.json +2 -8
|
@@ -51,14 +51,14 @@ export class AttachCommandHandler {
|
|
|
51
51
|
if (!featureId) {
|
|
52
52
|
invalidCliArgs({
|
|
53
53
|
reason: '<feature_id> is required for attach',
|
|
54
|
-
expected: 'aop attach <feature_id>'
|
|
54
|
+
expected: 'aop attach <feature_id>',
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
if (!isValidFeatureId(featureId)) {
|
|
58
58
|
invalidCliArgs({
|
|
59
59
|
reason: 'Invalid feature id',
|
|
60
60
|
provided: featureId,
|
|
61
|
-
expected_pattern: '^[a-z0-9_][a-z0-9_-]*$'
|
|
61
|
+
expected_pattern: '^[a-z0-9_][a-z0-9_-]*$',
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
64
|
|
|
@@ -67,12 +67,12 @@ export class AttachCommandHandler {
|
|
|
67
67
|
if (!featureSessions) {
|
|
68
68
|
invalidCliArgs({
|
|
69
69
|
reason: `No active session cluster found for ${featureId}`,
|
|
70
|
-
feature_id: featureId
|
|
70
|
+
feature_id: featureId,
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
const rawState = await callCliTool(this.toolClient, this.runId, TOOLS.FEATURE_STATE_GET, {
|
|
75
|
-
feature_id: featureId
|
|
75
|
+
feature_id: featureId,
|
|
76
76
|
});
|
|
77
77
|
const state = rawState.data as unknown as FeatureStatePayload;
|
|
78
78
|
const status = state.front_matter.status;
|
|
@@ -80,7 +80,7 @@ export class AttachCommandHandler {
|
|
|
80
80
|
const sessionByRole = {
|
|
81
81
|
planner: featureSessions.planner_session_id,
|
|
82
82
|
builder: featureSessions.builder_session_id,
|
|
83
|
-
qa: featureSessions.qa_session_id
|
|
83
|
+
qa: featureSessions.qa_session_id,
|
|
84
84
|
};
|
|
85
85
|
const selectedSessionId = sessionByRole[role];
|
|
86
86
|
const sessionId =
|
|
@@ -91,7 +91,7 @@ export class AttachCommandHandler {
|
|
|
91
91
|
if (!sessionId || sessionId === 'unknown' || sessionId === 'unassigned') {
|
|
92
92
|
invalidCliArgs({
|
|
93
93
|
reason: `No attachable session found for ${featureId}`,
|
|
94
|
-
feature_id: featureId
|
|
94
|
+
feature_id: featureId,
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
|
|
@@ -99,7 +99,7 @@ export class AttachCommandHandler {
|
|
|
99
99
|
invalidCliArgs({
|
|
100
100
|
reason: `Provider ${this.provider.selection.provider} does not support interactive attach`,
|
|
101
101
|
feature_id: featureId,
|
|
102
|
-
provider: this.provider.selection.provider
|
|
102
|
+
provider: this.provider.selection.provider,
|
|
103
103
|
});
|
|
104
104
|
}
|
|
105
105
|
|
|
@@ -113,8 +113,8 @@ export class AttachCommandHandler {
|
|
|
113
113
|
status,
|
|
114
114
|
role,
|
|
115
115
|
session_id: sessionId,
|
|
116
|
-
attached: true
|
|
117
|
-
}
|
|
116
|
+
attached: true,
|
|
117
|
+
},
|
|
118
118
|
};
|
|
119
119
|
}
|
|
120
120
|
}
|
|
@@ -32,7 +32,7 @@ export class CleanupCommandHandler {
|
|
|
32
32
|
runId: string,
|
|
33
33
|
repoRoot: string,
|
|
34
34
|
gracePeriodSeconds = DEFAULT_GRACE_PERIOD_SECONDS,
|
|
35
|
-
autoAfterMerge = false
|
|
35
|
+
autoAfterMerge = false,
|
|
36
36
|
) {
|
|
37
37
|
this.toolClient = toolClient;
|
|
38
38
|
this.runId = runId;
|
|
@@ -45,7 +45,7 @@ export class CleanupCommandHandler {
|
|
|
45
45
|
const runtimeRoot = path.join(this.repoRoot, '.aop', 'runtime');
|
|
46
46
|
const candidateLeasePaths = [
|
|
47
47
|
path.join(runtimeRoot, 'default', 'run-lease.json'),
|
|
48
|
-
path.join(runtimeRoot, 'run-lease.json')
|
|
48
|
+
path.join(runtimeRoot, 'run-lease.json'),
|
|
49
49
|
];
|
|
50
50
|
|
|
51
51
|
try {
|
|
@@ -64,7 +64,8 @@ export class CleanupCommandHandler {
|
|
|
64
64
|
const raw = await fs.readFile(leasePath, 'utf8');
|
|
65
65
|
const lease = JSON.parse(raw) as { run_id?: string; lease_expires_at?: string };
|
|
66
66
|
const runId = typeof lease.run_id === 'string' ? lease.run_id : 'none';
|
|
67
|
-
const leaseExpiresAt =
|
|
67
|
+
const leaseExpiresAt =
|
|
68
|
+
typeof lease.lease_expires_at === 'string' ? lease.lease_expires_at : null;
|
|
68
69
|
const leaseExpiryMs = leaseExpiresAt ? new Date(leaseExpiresAt).getTime() : NaN;
|
|
69
70
|
if (runId !== 'none' && Number.isFinite(leaseExpiryMs) && leaseExpiryMs > Date.now()) {
|
|
70
71
|
return false;
|
|
@@ -92,7 +93,7 @@ export class CleanupCommandHandler {
|
|
|
92
93
|
const allIndexedIds = new Set([
|
|
93
94
|
...(indexData.active ?? []),
|
|
94
95
|
...(indexData.blocked ?? []),
|
|
95
|
-
...(indexData.merged ?? [])
|
|
96
|
+
...(indexData.merged ?? []),
|
|
96
97
|
]);
|
|
97
98
|
|
|
98
99
|
const eligible: CleanupDetail[] = [];
|
|
@@ -103,7 +104,7 @@ export class CleanupCommandHandler {
|
|
|
103
104
|
const candidateIds = [
|
|
104
105
|
...(indexData.active ?? []),
|
|
105
106
|
...(indexData.blocked ?? []),
|
|
106
|
-
...(this.autoAfterMerge ? (indexData.merged ?? []) : [])
|
|
107
|
+
...(this.autoAfterMerge ? (indexData.merged ?? []) : []),
|
|
107
108
|
];
|
|
108
109
|
for (const featureId of candidateIds) {
|
|
109
110
|
const statePath = path.join(this.repoRoot, '.aop', 'features', featureId, 'state.md');
|
|
@@ -124,7 +125,11 @@ export class CleanupCommandHandler {
|
|
|
124
125
|
}
|
|
125
126
|
skipped.push({ feature_id: featureId, reason: 'not eligible' });
|
|
126
127
|
} catch {
|
|
127
|
-
if (
|
|
128
|
+
if (
|
|
129
|
+
this.autoAfterMerge &&
|
|
130
|
+
(indexData.merged ?? []).includes(featureId) &&
|
|
131
|
+
runLeaseInactive
|
|
132
|
+
) {
|
|
128
133
|
eligible.push({ feature_id: featureId, reason: 'merged residue with missing state' });
|
|
129
134
|
continue;
|
|
130
135
|
}
|
|
@@ -154,8 +159,8 @@ export class CleanupCommandHandler {
|
|
|
154
159
|
data: {
|
|
155
160
|
would_clean: eligible,
|
|
156
161
|
cleaned: [],
|
|
157
|
-
skipped
|
|
158
|
-
}
|
|
162
|
+
skipped,
|
|
163
|
+
},
|
|
159
164
|
};
|
|
160
165
|
}
|
|
161
166
|
|
|
@@ -170,7 +175,7 @@ export class CleanupCommandHandler {
|
|
|
170
175
|
dry_run: false,
|
|
171
176
|
confirm: true,
|
|
172
177
|
remove_worktree: true,
|
|
173
|
-
remove_branch: 'none'
|
|
178
|
+
remove_branch: 'none',
|
|
174
179
|
});
|
|
175
180
|
cleaned.push(item);
|
|
176
181
|
} catch {
|
|
@@ -183,8 +188,8 @@ export class CleanupCommandHandler {
|
|
|
183
188
|
data: {
|
|
184
189
|
would_clean: eligible,
|
|
185
190
|
cleaned,
|
|
186
|
-
skipped: [...skipped, ...failedToClean]
|
|
187
|
-
}
|
|
191
|
+
skipped: [...skipped, ...failedToClean],
|
|
192
|
+
},
|
|
188
193
|
};
|
|
189
194
|
}
|
|
190
195
|
}
|
|
@@ -23,7 +23,7 @@ export class CliArgumentParser {
|
|
|
23
23
|
const rawCommand = isHelpFlag ? CliCommand.Help : isKnownCommand ? first : CliCommand.Run;
|
|
24
24
|
const tokens = isHelpFlag || isKnownCommand ? rest : argv;
|
|
25
25
|
const options: CliOptions = {
|
|
26
|
-
command: rawCommand ?? CliCommand.Run
|
|
26
|
+
command: rawCommand ?? CliCommand.Run,
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
for (let index = 0; index < tokens.length; index += 1) {
|
|
@@ -159,7 +159,10 @@ export class CliArgumentParser {
|
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
if (!token.startsWith('-')) {
|
|
162
|
-
if (
|
|
162
|
+
if (
|
|
163
|
+
(options.command === CliCommand.Send || options.command === CliCommand.Attach) &&
|
|
164
|
+
!options.feature_id
|
|
165
|
+
) {
|
|
163
166
|
options.feature_id = token;
|
|
164
167
|
continue;
|
|
165
168
|
}
|
|
@@ -184,7 +187,7 @@ export class CliArgumentParser {
|
|
|
184
187
|
error.details = {
|
|
185
188
|
reason: 'Invalid --transport value',
|
|
186
189
|
provided: option,
|
|
187
|
-
expected: ['inprocess', 'mcp']
|
|
190
|
+
expected: ['inprocess', 'mcp'],
|
|
188
191
|
};
|
|
189
192
|
throw error;
|
|
190
193
|
}
|
|
@@ -7,17 +7,30 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
7
7
|
const execFileAsync = promisify(execFile);
|
|
8
8
|
|
|
9
9
|
export class DashboardCommandHandler {
|
|
10
|
-
async execute(options: {
|
|
10
|
+
async execute(options: {
|
|
11
|
+
port?: number;
|
|
12
|
+
foreground?: boolean;
|
|
13
|
+
dev?: boolean;
|
|
14
|
+
}): Promise<Record<string, unknown>> {
|
|
11
15
|
const port = options.port ?? 3000;
|
|
12
16
|
const repoRoot = path.resolve(__dirname, '../../../../');
|
|
13
17
|
const dashboardWorkspace = '@aop/web-dashboard';
|
|
14
18
|
const devMode = options.dev === true;
|
|
15
19
|
const foreground = options.foreground === true || devMode;
|
|
16
20
|
|
|
17
|
-
const env = {
|
|
21
|
+
const env = {
|
|
22
|
+
...process.env,
|
|
23
|
+
PORT: String(port),
|
|
24
|
+
HOSTNAME: '0.0.0.0',
|
|
25
|
+
AOP_ROOT: process.cwd(),
|
|
26
|
+
};
|
|
18
27
|
|
|
19
28
|
if (devMode) {
|
|
20
|
-
const child = spawn('npm', ['run', '--workspace', dashboardWorkspace, 'dev'], {
|
|
29
|
+
const child = spawn('npm', ['run', '--workspace', dashboardWorkspace, 'dev'], {
|
|
30
|
+
cwd: repoRoot,
|
|
31
|
+
env,
|
|
32
|
+
stdio: 'inherit',
|
|
33
|
+
});
|
|
21
34
|
await new Promise<void>((resolve, reject) => {
|
|
22
35
|
child.on('close', resolve);
|
|
23
36
|
child.on('error', reject);
|
|
@@ -25,10 +38,17 @@ export class DashboardCommandHandler {
|
|
|
25
38
|
return { ok: true, data: { message: 'Dashboard stopped', port, mode: 'dev' } };
|
|
26
39
|
}
|
|
27
40
|
|
|
28
|
-
await execFileAsync('npm', ['run', '--workspace', dashboardWorkspace, 'build'], {
|
|
41
|
+
await execFileAsync('npm', ['run', '--workspace', dashboardWorkspace, 'build'], {
|
|
42
|
+
cwd: repoRoot,
|
|
43
|
+
env,
|
|
44
|
+
});
|
|
29
45
|
|
|
30
46
|
if (foreground) {
|
|
31
|
-
const child = spawn('npm', ['run', '--workspace', dashboardWorkspace, 'start'], {
|
|
47
|
+
const child = spawn('npm', ['run', '--workspace', dashboardWorkspace, 'start'], {
|
|
48
|
+
cwd: repoRoot,
|
|
49
|
+
env,
|
|
50
|
+
stdio: 'inherit',
|
|
51
|
+
});
|
|
32
52
|
await new Promise<void>((resolve, reject) => {
|
|
33
53
|
child.on('close', resolve);
|
|
34
54
|
child.on('error', reject);
|
|
@@ -40,7 +60,7 @@ export class DashboardCommandHandler {
|
|
|
40
60
|
cwd: repoRoot,
|
|
41
61
|
env,
|
|
42
62
|
detached: true,
|
|
43
|
-
stdio: 'ignore'
|
|
63
|
+
stdio: 'ignore',
|
|
44
64
|
});
|
|
45
65
|
child.unref();
|
|
46
66
|
return {
|
|
@@ -50,8 +70,8 @@ export class DashboardCommandHandler {
|
|
|
50
70
|
port,
|
|
51
71
|
background: true,
|
|
52
72
|
built: true,
|
|
53
|
-
mode: 'production'
|
|
54
|
-
}
|
|
73
|
+
mode: 'production',
|
|
74
|
+
},
|
|
55
75
|
};
|
|
56
76
|
}
|
|
57
77
|
}
|
|
@@ -40,14 +40,14 @@ export class DeleteCommandHandler {
|
|
|
40
40
|
if (!featureId) {
|
|
41
41
|
invalidCliArgs({
|
|
42
42
|
reason: '--feature-id is required for delete',
|
|
43
|
-
expected: '--feature-id <feature_id>'
|
|
43
|
+
expected: '--feature-id <feature_id>',
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
if (!isValidFeatureId(featureId)) {
|
|
47
47
|
invalidCliArgs({
|
|
48
48
|
reason: 'Invalid --feature-id value',
|
|
49
49
|
provided: featureId,
|
|
50
|
-
expected_pattern: '^[a-z0-9_][a-z0-9_-]*$'
|
|
50
|
+
expected_pattern: '^[a-z0-9_][a-z0-9_-]*$',
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -56,14 +56,14 @@ export class DeleteCommandHandler {
|
|
|
56
56
|
invalidCliArgs({
|
|
57
57
|
reason: 'Invalid --remove-branch value',
|
|
58
58
|
provided: options.remove_branch,
|
|
59
|
-
expected: ['none', 'safe', 'force']
|
|
59
|
+
expected: ['none', 'safe', 'force'],
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
if (options.yes !== true && options.dry_run === false) {
|
|
64
64
|
invalidCliArgs({
|
|
65
65
|
reason: 'Destructive delete requires --yes',
|
|
66
|
-
expected: 'Provide --yes or omit --dry-run=false'
|
|
66
|
+
expected: 'Provide --yes or omit --dry-run=false',
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -76,15 +76,15 @@ export class DeleteCommandHandler {
|
|
|
76
76
|
dry_run: dryRun,
|
|
77
77
|
confirm,
|
|
78
78
|
remove_worktree: removeWorktree,
|
|
79
|
-
remove_branch: removeBranch
|
|
79
|
+
remove_branch: removeBranch,
|
|
80
80
|
});
|
|
81
81
|
|
|
82
82
|
return {
|
|
83
83
|
ok: true,
|
|
84
84
|
data: {
|
|
85
85
|
command: 'delete',
|
|
86
|
-
...(response.data ?? {})
|
|
87
|
-
}
|
|
86
|
+
...(response.data ?? {}),
|
|
87
|
+
},
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
90
|
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
|
|
3
|
+
export type EnvFileValues = Record<string, string>;
|
|
4
|
+
|
|
5
|
+
const SAFE_UNQUOTED_ENV_VALUE = /^[A-Za-z0-9_./:@+=-]+$/;
|
|
6
|
+
|
|
7
|
+
function unquoteValue(raw: string): string {
|
|
8
|
+
const trimmed = raw.trim();
|
|
9
|
+
if (
|
|
10
|
+
(trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
11
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'"))
|
|
12
|
+
) {
|
|
13
|
+
return trimmed.slice(1, -1);
|
|
14
|
+
}
|
|
15
|
+
return trimmed;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function parseEnvLine(line: string): { key: string; value: string } | null {
|
|
19
|
+
const trimmed = line.trim();
|
|
20
|
+
if (trimmed.length === 0 || trimmed.startsWith('#')) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const normalized = trimmed.startsWith('export ') ? trimmed.slice('export '.length) : trimmed;
|
|
25
|
+
const separatorIndex = normalized.indexOf('=');
|
|
26
|
+
if (separatorIndex <= 0) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const key = normalized.slice(0, separatorIndex).trim();
|
|
31
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const value = normalized.slice(separatorIndex + 1);
|
|
36
|
+
return { key, value: unquoteValue(value) };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function formatEnvValue(value: string): string {
|
|
40
|
+
if (SAFE_UNQUOTED_ENV_VALUE.test(value)) {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
return JSON.stringify(value);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function readEnvFileValues(envPath: string): Promise<EnvFileValues> {
|
|
47
|
+
let content: string;
|
|
48
|
+
try {
|
|
49
|
+
content = await fs.readFile(envPath, 'utf8');
|
|
50
|
+
} catch {
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const values: EnvFileValues = {};
|
|
55
|
+
for (const line of content.split(/\r?\n/)) {
|
|
56
|
+
const parsed = parseEnvLine(line);
|
|
57
|
+
if (!parsed) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
values[parsed.key] = parsed.value;
|
|
61
|
+
}
|
|
62
|
+
return values;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function readNonEmptyEnvValue(
|
|
66
|
+
key: string,
|
|
67
|
+
runtimeEnv: NodeJS.ProcessEnv,
|
|
68
|
+
envFileValues: EnvFileValues,
|
|
69
|
+
): string | null {
|
|
70
|
+
const runtimeValue = runtimeEnv[key];
|
|
71
|
+
if (typeof runtimeValue === 'string' && runtimeValue.trim().length > 0) {
|
|
72
|
+
return runtimeValue;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const fileValue = envFileValues[key];
|
|
76
|
+
if (typeof fileValue === 'string' && fileValue.trim().length > 0) {
|
|
77
|
+
return fileValue;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function upsertEnvFileValue(
|
|
84
|
+
envPath: string,
|
|
85
|
+
key: string,
|
|
86
|
+
value: string,
|
|
87
|
+
): Promise<void> {
|
|
88
|
+
let content = '';
|
|
89
|
+
try {
|
|
90
|
+
content = await fs.readFile(envPath, 'utf8');
|
|
91
|
+
} catch {
|
|
92
|
+
// create file from scratch
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const lines = content.length > 0 ? content.split(/\r?\n/) : [];
|
|
96
|
+
const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
97
|
+
const matcher = new RegExp(`^\\s*(?:export\\s+)?${escapedKey}\\s*=`);
|
|
98
|
+
const nextLine = `${key}=${formatEnvValue(value)}`;
|
|
99
|
+
|
|
100
|
+
let replaced = false;
|
|
101
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
102
|
+
if (matcher.test(lines[index])) {
|
|
103
|
+
lines[index] = nextLine;
|
|
104
|
+
replaced = true;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (!replaced) {
|
|
110
|
+
lines.push(nextLine);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const normalized = `${lines.join('\n').replace(/\n*$/, '')}\n`;
|
|
114
|
+
await fs.writeFile(envPath, normalized, 'utf8');
|
|
115
|
+
}
|
|
@@ -13,15 +13,24 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
|
|
|
13
13
|
flags: [
|
|
14
14
|
{ flag: '-fi <PATH>', description: 'Input spec file path' },
|
|
15
15
|
{ flag: '-fl <PATH>', description: 'Input spec folder path' },
|
|
16
|
-
{
|
|
17
|
-
|
|
16
|
+
{
|
|
17
|
+
flag: '--batch',
|
|
18
|
+
description: 'Batch-ingest all specs in the folder (skip already-active features)',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
flag: '--agent-provider <name>',
|
|
22
|
+
description: 'Override agent provider (claude, codex, gemini, …)',
|
|
23
|
+
},
|
|
18
24
|
{ flag: '--agent-model <name>', description: 'Override agent model' },
|
|
19
25
|
{ flag: '--agent-config <PATH>', description: 'Path to agent config file' },
|
|
20
|
-
{
|
|
26
|
+
{
|
|
27
|
+
flag: '--provider-config-env <var>',
|
|
28
|
+
description: 'Env var name used for API-backed provider auth/config',
|
|
29
|
+
},
|
|
21
30
|
{ flag: '--transport <inprocess|mcp>', description: 'Tool transport layer (default: mcp)' },
|
|
22
31
|
{ flag: '--takeover-stale-run', description: 'Take over a stale run lease' },
|
|
23
|
-
{ flag: '--project <name>', description: 'Select project from multi-project.yaml' }
|
|
24
|
-
]
|
|
32
|
+
{ flag: '--project <name>', description: 'Select project from multi-project.yaml' },
|
|
33
|
+
],
|
|
25
34
|
},
|
|
26
35
|
[CliCommand.Status]: {
|
|
27
36
|
usage: 'aop status [flags]',
|
|
@@ -29,8 +38,8 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
|
|
|
29
38
|
flags: [
|
|
30
39
|
{ flag: '--summary', description: 'Print a condensed one-line-per-feature summary' },
|
|
31
40
|
{ flag: '--all', description: 'Aggregate status across all projects in multi-project.yaml' },
|
|
32
|
-
{ flag: '--project <name>', description: 'Scope to a specific project' }
|
|
33
|
-
]
|
|
41
|
+
{ flag: '--project <name>', description: 'Scope to a specific project' },
|
|
42
|
+
],
|
|
34
43
|
},
|
|
35
44
|
[CliCommand.Resume]: {
|
|
36
45
|
usage: 'aop resume [flags]',
|
|
@@ -38,12 +47,12 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
|
|
|
38
47
|
flags: [
|
|
39
48
|
{ flag: '--feature-id <id>', description: 'Resume a specific feature' },
|
|
40
49
|
{ flag: '--force', description: 'Force-resume even if the feature is not blocked' },
|
|
41
|
-
{ flag: '--transport <inprocess|mcp>', description: 'Tool transport layer (default: mcp)' }
|
|
42
|
-
]
|
|
50
|
+
{ flag: '--transport <inprocess|mcp>', description: 'Tool transport layer (default: mcp)' },
|
|
51
|
+
],
|
|
43
52
|
},
|
|
44
53
|
[CliCommand.Stop]: {
|
|
45
54
|
usage: 'aop stop',
|
|
46
|
-
description: 'Signal the running supervisor to stop gracefully.'
|
|
55
|
+
description: 'Signal the running supervisor to stop gracefully.',
|
|
47
56
|
},
|
|
48
57
|
[CliCommand.Delete]: {
|
|
49
58
|
usage: 'aop delete [flags]',
|
|
@@ -51,8 +60,8 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
|
|
|
51
60
|
flags: [
|
|
52
61
|
{ flag: '--feature-id <id>', description: 'Feature to delete' },
|
|
53
62
|
{ flag: '--all', description: 'Delete all features' },
|
|
54
|
-
{ flag: '--dry-run', description: 'Preview what would be deleted without making changes' }
|
|
55
|
-
]
|
|
63
|
+
{ flag: '--dry-run', description: 'Preview what would be deleted without making changes' },
|
|
64
|
+
],
|
|
56
65
|
},
|
|
57
66
|
[CliCommand.Cleanup]: {
|
|
58
67
|
usage: 'aop cleanup [flags]',
|
|
@@ -61,10 +70,13 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
|
|
|
61
70
|
{ flag: '--feature-id <id>', description: 'Clean up a specific feature' },
|
|
62
71
|
{ flag: '--all', description: 'Clean up all eligible features' },
|
|
63
72
|
{ flag: '--remove-worktree', description: 'Remove the git worktree after cleanup' },
|
|
64
|
-
{
|
|
73
|
+
{
|
|
74
|
+
flag: '--remove-branch <none|safe|force>',
|
|
75
|
+
description: 'Branch removal mode after cleanup',
|
|
76
|
+
},
|
|
65
77
|
{ flag: '--dry-run', description: 'Preview what would be cleaned without making changes' },
|
|
66
|
-
{ flag: '--yes', description: 'Skip confirmation prompts' }
|
|
67
|
-
]
|
|
78
|
+
{ flag: '--yes', description: 'Skip confirmation prompts' },
|
|
79
|
+
],
|
|
68
80
|
},
|
|
69
81
|
[CliCommand.Init]: {
|
|
70
82
|
usage: 'aop init [flags]',
|
|
@@ -72,8 +84,12 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
|
|
|
72
84
|
flags: [
|
|
73
85
|
{ flag: '--auto', description: 'Run non-interactively with defaults' },
|
|
74
86
|
{ flag: '--force', description: 'Overwrite existing configuration' },
|
|
75
|
-
{
|
|
76
|
-
|
|
87
|
+
{
|
|
88
|
+
flag: '--advanced-policy',
|
|
89
|
+
description:
|
|
90
|
+
'Generate full explicit policy.yaml with all advanced controls (default: lean policy)',
|
|
91
|
+
},
|
|
92
|
+
],
|
|
77
93
|
},
|
|
78
94
|
[CliCommand.Dashboard]: {
|
|
79
95
|
usage: 'aop dashboard [flags]',
|
|
@@ -81,37 +97,46 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
|
|
|
81
97
|
flags: [
|
|
82
98
|
{ flag: '--port <number>', description: 'Port to listen on (default: 3000)' },
|
|
83
99
|
{ flag: '--foreground', description: 'Keep the server in the foreground' },
|
|
84
|
-
{ flag: '--dev', description: 'Start in Next.js dev mode' }
|
|
85
|
-
]
|
|
100
|
+
{ flag: '--dev', description: 'Start in Next.js dev mode' },
|
|
101
|
+
],
|
|
86
102
|
},
|
|
87
103
|
[CliCommand.Retry]: {
|
|
88
104
|
usage: 'aop retry [flags]',
|
|
89
105
|
description: 'Retry a failed gate or step for a feature.',
|
|
90
106
|
flags: [
|
|
91
107
|
{ flag: '--feature-id <id>', description: 'Feature to retry' },
|
|
92
|
-
{ flag: '--force', description: 'Force retry even if the feature is not in a failed state' }
|
|
93
|
-
]
|
|
108
|
+
{ flag: '--force', description: 'Force retry even if the feature is not in a failed state' },
|
|
109
|
+
],
|
|
94
110
|
},
|
|
95
111
|
[CliCommand.Send]: {
|
|
96
112
|
usage: 'aop send <feature-id> <message>',
|
|
97
113
|
description: 'Send a message to an active agent for a feature.',
|
|
98
114
|
flags: [
|
|
99
|
-
{
|
|
100
|
-
|
|
101
|
-
|
|
115
|
+
{
|
|
116
|
+
flag: '--feature-id <id>',
|
|
117
|
+
description: 'Target feature (can also be the first positional argument)',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
flag: '--message <text>',
|
|
121
|
+
description: 'Message to deliver (can also be the remaining positional arguments)',
|
|
122
|
+
},
|
|
123
|
+
],
|
|
102
124
|
},
|
|
103
125
|
[CliCommand.Attach]: {
|
|
104
126
|
usage: 'aop attach <feature-id>',
|
|
105
127
|
description: 'Attach to the running agent session for a feature (interactive).',
|
|
106
128
|
flags: [
|
|
107
|
-
{
|
|
108
|
-
|
|
129
|
+
{
|
|
130
|
+
flag: '--feature-id <id>',
|
|
131
|
+
description: 'Feature to attach to (can also be the first positional argument)',
|
|
132
|
+
},
|
|
133
|
+
],
|
|
109
134
|
},
|
|
110
135
|
[CliCommand.Help]: {
|
|
111
136
|
usage: 'aop help [command]',
|
|
112
137
|
description: 'Show this help text, or detailed help for a specific command.',
|
|
113
|
-
flags: [{ flag: '--help, -h', description: 'Can also be used with any command' }]
|
|
114
|
-
}
|
|
138
|
+
flags: [{ flag: '--help, -h', description: 'Can also be used with any command' }],
|
|
139
|
+
},
|
|
115
140
|
};
|
|
116
141
|
|
|
117
142
|
function pad(str: string, width: number): string {
|
|
@@ -149,14 +174,18 @@ export class HelpCommandHandler {
|
|
|
149
174
|
'',
|
|
150
175
|
'Usage: aop <command> [flags]',
|
|
151
176
|
'',
|
|
152
|
-
'Commands:'
|
|
177
|
+
'Commands:',
|
|
153
178
|
];
|
|
154
179
|
|
|
155
|
-
const commandLines = (Object.entries(COMMAND_HELP) as Array<[CliCommand, CommandHelp]>).map(
|
|
156
|
-
renderCommand(cmd, help)
|
|
180
|
+
const commandLines = (Object.entries(COMMAND_HELP) as Array<[CliCommand, CommandHelp]>).map(
|
|
181
|
+
([cmd, help]) => renderCommand(cmd, help),
|
|
157
182
|
);
|
|
158
183
|
|
|
159
|
-
const footer = [
|
|
184
|
+
const footer = [
|
|
185
|
+
'',
|
|
186
|
+
'Run `aop help <command>` for detailed help on any command.',
|
|
187
|
+
'Flags: --help, -h',
|
|
188
|
+
];
|
|
160
189
|
|
|
161
190
|
const help = [...header, ...commandLines, ...footer].join('\n');
|
|
162
191
|
return { ok: true, data: { help } };
|