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
|
@@ -8,11 +8,17 @@ import { fileURLToPath } from 'node:url';
|
|
|
8
8
|
import YAML from 'yaml';
|
|
9
9
|
import { SchemaRegistry } from '../core/schemas.js';
|
|
10
10
|
import { loadComposedPolicy } from '../application/services/policy-loader-service.js';
|
|
11
|
-
import {
|
|
11
|
+
import { readEnvFileValues, readNonEmptyEnvValue, upsertEnvFileValue } from './env-file.js';
|
|
12
|
+
import {
|
|
13
|
+
AGENT_PROVIDER_SLOT,
|
|
14
|
+
SCM_PROVIDER_SLOT,
|
|
15
|
+
globalAdapterRegistry,
|
|
16
|
+
} from '../application/adapters/adapter-registry.js';
|
|
12
17
|
|
|
13
18
|
const execFileAsync = promisify(execFile);
|
|
14
19
|
const MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
15
20
|
const TEMPLATE_ROOT = path.resolve(MODULE_DIR, '../../../../agentic/orchestrator');
|
|
21
|
+
const GENERATED_CONFIG_ROOT = 'config/agentic/orchestrator';
|
|
16
22
|
const DEFAULT_AGENT_PROVIDER = 'custom';
|
|
17
23
|
const DEFAULT_AGENT_MODEL = 'local-default';
|
|
18
24
|
const DEFAULT_SCM_PROVIDER = 'github';
|
|
@@ -42,6 +48,8 @@ interface WizardConfig {
|
|
|
42
48
|
framework: TestFramework;
|
|
43
49
|
defaultProvider: string;
|
|
44
50
|
defaultModel: string;
|
|
51
|
+
providerConfigEnv: string | null;
|
|
52
|
+
providerCredentialBootstrapped: boolean;
|
|
45
53
|
scmProvider: string;
|
|
46
54
|
notifications: {
|
|
47
55
|
desktop: boolean;
|
|
@@ -91,7 +99,7 @@ async function detectGitContext(repoRoot: string): Promise<GitContext> {
|
|
|
91
99
|
const { stdout } = await execFileAsync(
|
|
92
100
|
'git',
|
|
93
101
|
['-C', repoRoot, 'symbolic-ref', 'refs/remotes/origin/HEAD', '--short'],
|
|
94
|
-
{ timeout: 3000 }
|
|
102
|
+
{ timeout: 3000 },
|
|
95
103
|
);
|
|
96
104
|
const ref = stdout.trim();
|
|
97
105
|
const parts = ref.split('/');
|
|
@@ -113,7 +121,7 @@ async function detectTestFramework(repoRoot: string): Promise<TestFramework> {
|
|
|
113
121
|
: {}),
|
|
114
122
|
...(typeof pkg.devDependencies === 'object' && pkg.devDependencies !== null
|
|
115
123
|
? (pkg.devDependencies as Record<string, unknown>)
|
|
116
|
-
: {})
|
|
124
|
+
: {}),
|
|
117
125
|
};
|
|
118
126
|
if ('vitest' in deps) {
|
|
119
127
|
return 'vitest';
|
|
@@ -130,7 +138,7 @@ async function detectTestFramework(repoRoot: string): Promise<TestFramework> {
|
|
|
130
138
|
['pyproject.toml', 'pytest'],
|
|
131
139
|
['pom.xml', 'maven'],
|
|
132
140
|
['build.gradle', 'gradle'],
|
|
133
|
-
['build.gradle.kts', 'gradle']
|
|
141
|
+
['build.gradle.kts', 'gradle'],
|
|
134
142
|
];
|
|
135
143
|
|
|
136
144
|
for (const [file, framework] of buildFileChecks) {
|
|
@@ -145,7 +153,10 @@ async function detectTestFramework(repoRoot: string): Promise<TestFramework> {
|
|
|
145
153
|
return 'vitest';
|
|
146
154
|
}
|
|
147
155
|
|
|
148
|
-
function buildGateCommands(framework: TestFramework): {
|
|
156
|
+
function buildGateCommands(framework: TestFramework): {
|
|
157
|
+
test: string[];
|
|
158
|
+
testWithCoverage: string[];
|
|
159
|
+
} {
|
|
149
160
|
switch (framework) {
|
|
150
161
|
case 'jest':
|
|
151
162
|
return { test: ['npx', 'jest'], testWithCoverage: ['npx', 'jest', '--coverage'] };
|
|
@@ -156,7 +167,10 @@ function buildGateCommands(framework: TestFramework): { test: string[]; testWith
|
|
|
156
167
|
case 'gradle':
|
|
157
168
|
return { test: ['./gradlew', 'test'], testWithCoverage: ['./gradlew', 'check'] };
|
|
158
169
|
default:
|
|
159
|
-
return {
|
|
170
|
+
return {
|
|
171
|
+
test: ['npx', 'vitest', 'run'],
|
|
172
|
+
testWithCoverage: ['npx', 'vitest', 'run', '--coverage'],
|
|
173
|
+
};
|
|
160
174
|
}
|
|
161
175
|
}
|
|
162
176
|
|
|
@@ -169,7 +183,8 @@ function escapeYamlString(value: string): string {
|
|
|
169
183
|
}
|
|
170
184
|
|
|
171
185
|
function generateLeanPolicyYaml(wizard: WizardConfig): string {
|
|
172
|
-
const notificationsEnabled =
|
|
186
|
+
const notificationsEnabled =
|
|
187
|
+
wizard.notifications.desktop || wizard.notifications.slack || wizard.notifications.webhook;
|
|
173
188
|
return `version: 1
|
|
174
189
|
worktree:
|
|
175
190
|
base_branch: ${wizard.baseBranch}
|
|
@@ -196,7 +211,8 @@ notifications:
|
|
|
196
211
|
}
|
|
197
212
|
|
|
198
213
|
function generateFullPolicyYaml(context: GitContext, wizard: WizardConfig): string {
|
|
199
|
-
const notificationsEnabled =
|
|
214
|
+
const notificationsEnabled =
|
|
215
|
+
wizard.notifications.desktop || wizard.notifications.slack || wizard.notifications.webhook;
|
|
200
216
|
return `version: 1
|
|
201
217
|
commit_policy:
|
|
202
218
|
allow_commit: false
|
|
@@ -222,7 +238,7 @@ locks:
|
|
|
222
238
|
multiplier: 2
|
|
223
239
|
jitter_ms: 150
|
|
224
240
|
protected_areas:
|
|
225
|
-
- agentic/orchestrator/policy.yaml
|
|
241
|
+
- config/agentic/orchestrator/policy.yaml
|
|
226
242
|
required_modes:
|
|
227
243
|
- fast
|
|
228
244
|
- full
|
|
@@ -389,20 +405,22 @@ capabilities:
|
|
|
389
405
|
}
|
|
390
406
|
|
|
391
407
|
function generateAgentsYaml(wizard: WizardConfig): string {
|
|
408
|
+
const providerConfigEnvLine = wizard.providerConfigEnv
|
|
409
|
+
? ` provider_config_env: ${wizard.providerConfigEnv}\n`
|
|
410
|
+
: '';
|
|
392
411
|
return `version: 1
|
|
393
412
|
roles:
|
|
394
413
|
planner:
|
|
395
|
-
system_prompt_path: agentic/orchestrator/prompts/planner.system.md
|
|
414
|
+
system_prompt_path: config/agentic/orchestrator/prompts/planner.system.md
|
|
396
415
|
builder:
|
|
397
|
-
system_prompt_path: agentic/orchestrator/prompts/builder.system.md
|
|
416
|
+
system_prompt_path: config/agentic/orchestrator/prompts/builder.system.md
|
|
398
417
|
qa:
|
|
399
|
-
system_prompt_path: agentic/orchestrator/prompts/qa.system.md
|
|
418
|
+
system_prompt_path: config/agentic/orchestrator/prompts/qa.system.md
|
|
400
419
|
missing_prompt_behavior: ignore
|
|
401
420
|
runtime:
|
|
402
421
|
default_provider: ${wizard.defaultProvider}
|
|
403
422
|
default_model: ${wizard.defaultModel}
|
|
404
|
-
|
|
405
|
-
role_provider_overrides: {}
|
|
423
|
+
${providerConfigEnvLine} role_provider_overrides: {}
|
|
406
424
|
`;
|
|
407
425
|
}
|
|
408
426
|
|
|
@@ -434,26 +452,45 @@ function parseInteger(raw: string, fallback: number, min: number, max: number):
|
|
|
434
452
|
|
|
435
453
|
function parseFramework(raw: string, fallback: TestFramework): TestFramework {
|
|
436
454
|
const value = raw.trim().toLowerCase();
|
|
437
|
-
if (
|
|
455
|
+
if (
|
|
456
|
+
value === 'vitest' ||
|
|
457
|
+
value === 'jest' ||
|
|
458
|
+
value === 'pytest' ||
|
|
459
|
+
value === 'maven' ||
|
|
460
|
+
value === 'gradle'
|
|
461
|
+
) {
|
|
438
462
|
return value;
|
|
439
463
|
}
|
|
440
464
|
return fallback;
|
|
441
465
|
}
|
|
442
466
|
|
|
443
|
-
function parseNotificationChannels(raw: string): {
|
|
467
|
+
function parseNotificationChannels(raw: string): {
|
|
468
|
+
desktop: boolean;
|
|
469
|
+
slack: boolean;
|
|
470
|
+
webhook: boolean;
|
|
471
|
+
} {
|
|
444
472
|
const normalized = raw.trim().toLowerCase();
|
|
445
473
|
if (!normalized || normalized === 'none') {
|
|
446
474
|
return { desktop: false, slack: false, webhook: false };
|
|
447
475
|
}
|
|
448
|
-
const channels = new Set(
|
|
476
|
+
const channels = new Set(
|
|
477
|
+
normalized
|
|
478
|
+
.split(',')
|
|
479
|
+
.map((token) => token.trim())
|
|
480
|
+
.filter((token) => token.length > 0),
|
|
481
|
+
);
|
|
449
482
|
return {
|
|
450
483
|
desktop: channels.has('desktop'),
|
|
451
484
|
slack: channels.has('slack'),
|
|
452
|
-
webhook: channels.has('webhook')
|
|
485
|
+
webhook: channels.has('webhook'),
|
|
453
486
|
};
|
|
454
487
|
}
|
|
455
488
|
|
|
456
|
-
function parseAdapterName(
|
|
489
|
+
function parseAdapterName(
|
|
490
|
+
raw: string,
|
|
491
|
+
supportedNames: ReadonlySet<string>,
|
|
492
|
+
fallback: string,
|
|
493
|
+
): string {
|
|
457
494
|
const value = raw.trim();
|
|
458
495
|
if (supportedNames.has(value)) {
|
|
459
496
|
return value;
|
|
@@ -471,12 +508,35 @@ function resolveActivityDetector(defaultProvider: string): string {
|
|
|
471
508
|
return 'process-heuristic';
|
|
472
509
|
}
|
|
473
510
|
|
|
474
|
-
async function askWithDefault(
|
|
511
|
+
async function askWithDefault(
|
|
512
|
+
prompt: PromptSession,
|
|
513
|
+
label: string,
|
|
514
|
+
defaultValue: string,
|
|
515
|
+
): Promise<string> {
|
|
475
516
|
const raw = (await prompt.question(`${label} [${defaultValue}]: `)).trim();
|
|
476
517
|
return raw.length > 0 ? raw : defaultValue;
|
|
477
518
|
}
|
|
478
519
|
|
|
520
|
+
function parseYesNo(raw: string, fallback: boolean): boolean {
|
|
521
|
+
const normalized = raw.trim().toLowerCase();
|
|
522
|
+
if (normalized === 'yes' || normalized === 'y' || normalized === 'true') {
|
|
523
|
+
return true;
|
|
524
|
+
}
|
|
525
|
+
if (normalized === 'no' || normalized === 'n' || normalized === 'false') {
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
return fallback;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
function defaultProviderConfigEnvName(provider: string): string {
|
|
532
|
+
if (provider === 'gemini') {
|
|
533
|
+
return 'GEMINI_API_KEY';
|
|
534
|
+
}
|
|
535
|
+
return 'AOP_PROVIDER_CONFIG_ENV';
|
|
536
|
+
}
|
|
537
|
+
|
|
479
538
|
async function collectWizardConfig(
|
|
539
|
+
repoRoot: string,
|
|
480
540
|
defaults: {
|
|
481
541
|
branch: string;
|
|
482
542
|
framework: TestFramework;
|
|
@@ -484,36 +544,42 @@ async function collectWizardConfig(
|
|
|
484
544
|
defaultModel: string;
|
|
485
545
|
defaultScmProvider: string;
|
|
486
546
|
},
|
|
487
|
-
promptFactory: () => PromptSession
|
|
547
|
+
promptFactory: () => PromptSession,
|
|
488
548
|
): Promise<WizardConfig> {
|
|
489
549
|
const prompt = promptFactory();
|
|
490
550
|
try {
|
|
491
|
-
const
|
|
492
|
-
const
|
|
551
|
+
const envFilePath = path.join(repoRoot, '.env');
|
|
552
|
+
const envFileValues = await readEnvFileValues(envFilePath);
|
|
553
|
+
const supportedProviders = new Set(
|
|
554
|
+
globalAdapterRegistry.list(AGENT_PROVIDER_SLOT.name).map((adapter) => adapter.name),
|
|
555
|
+
);
|
|
556
|
+
const supportedScmProviders = new Set(
|
|
557
|
+
globalAdapterRegistry.list(SCM_PROVIDER_SLOT.name).map((adapter) => adapter.name),
|
|
558
|
+
);
|
|
493
559
|
|
|
494
560
|
const baseBranch = await askWithDefault(prompt, 'Worktree base branch', defaults.branch);
|
|
495
561
|
const defaultProviderRaw = await askWithDefault(
|
|
496
562
|
prompt,
|
|
497
563
|
`Default agent provider (${Array.from(supportedProviders).join('|')})`,
|
|
498
|
-
defaults.defaultProvider
|
|
564
|
+
defaults.defaultProvider,
|
|
499
565
|
);
|
|
500
566
|
const defaultModel = await askWithDefault(prompt, 'Default model', defaults.defaultModel);
|
|
501
567
|
const scmProviderRaw = await askWithDefault(
|
|
502
568
|
prompt,
|
|
503
569
|
`SCM provider (${Array.from(supportedScmProviders).join('|')})`,
|
|
504
|
-
defaults.defaultScmProvider
|
|
570
|
+
defaults.defaultScmProvider,
|
|
505
571
|
);
|
|
506
572
|
const maxParallelGateRunsRaw = await askWithDefault(prompt, 'Max parallel gate runs', '3');
|
|
507
573
|
const dashboardPortRaw = await askWithDefault(prompt, 'Dashboard port', '3000');
|
|
508
574
|
const channelsRaw = await askWithDefault(
|
|
509
575
|
prompt,
|
|
510
576
|
'Notification channels (comma-separated: desktop,slack,webhook,none)',
|
|
511
|
-
'none'
|
|
577
|
+
'none',
|
|
512
578
|
);
|
|
513
579
|
const frameworkRaw = await askWithDefault(
|
|
514
580
|
prompt,
|
|
515
581
|
'Test framework (vitest|jest|pytest|maven|gradle)',
|
|
516
|
-
defaults.framework
|
|
582
|
+
defaults.framework,
|
|
517
583
|
);
|
|
518
584
|
|
|
519
585
|
const channels = parseNotificationChannels(channelsRaw);
|
|
@@ -527,11 +593,57 @@ async function collectWizardConfig(
|
|
|
527
593
|
webhookUrl = (await prompt.question('Webhook URL []: ')).trim();
|
|
528
594
|
}
|
|
529
595
|
|
|
596
|
+
const localCliAnswer = await askWithDefault(
|
|
597
|
+
prompt,
|
|
598
|
+
'Will you use a local agent CLI (codex/claude-code/kiro-cli/copilot)? (yes/no)',
|
|
599
|
+
'yes',
|
|
600
|
+
);
|
|
601
|
+
const usesLocalCli = parseYesNo(localCliAnswer, true);
|
|
602
|
+
|
|
603
|
+
let providerConfigEnv: string | null = null;
|
|
604
|
+
let providerCredentialBootstrapped = false;
|
|
605
|
+
|
|
606
|
+
if (!usesLocalCli) {
|
|
607
|
+
const envVarName = await askWithDefault(
|
|
608
|
+
prompt,
|
|
609
|
+
'Provider config env var name',
|
|
610
|
+
defaultProviderConfigEnvName(defaultProviderRaw),
|
|
611
|
+
);
|
|
612
|
+
const envValue = readNonEmptyEnvValue(envVarName, process.env, envFileValues);
|
|
613
|
+
|
|
614
|
+
if (envValue) {
|
|
615
|
+
providerConfigEnv = envVarName;
|
|
616
|
+
} else {
|
|
617
|
+
output.write(
|
|
618
|
+
`Environment variable "${envVarName}" was not found in process env or ${envFilePath}.\n`,
|
|
619
|
+
);
|
|
620
|
+
let pastedKey = '';
|
|
621
|
+
while (pastedKey.length === 0) {
|
|
622
|
+
pastedKey = (
|
|
623
|
+
await prompt.question('Paste provider key to store in AOP_PROVIDER_CONFIG_ENV: ')
|
|
624
|
+
).trim();
|
|
625
|
+
}
|
|
626
|
+
await upsertEnvFileValue(envFilePath, 'AOP_PROVIDER_CONFIG_ENV', pastedKey);
|
|
627
|
+
providerConfigEnv = 'AOP_PROVIDER_CONFIG_ENV';
|
|
628
|
+
providerCredentialBootstrapped = true;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
530
632
|
return {
|
|
531
633
|
baseBranch,
|
|
532
|
-
defaultProvider: parseAdapterName(
|
|
634
|
+
defaultProvider: parseAdapterName(
|
|
635
|
+
defaultProviderRaw,
|
|
636
|
+
supportedProviders,
|
|
637
|
+
defaults.defaultProvider,
|
|
638
|
+
),
|
|
533
639
|
defaultModel,
|
|
534
|
-
|
|
640
|
+
providerConfigEnv,
|
|
641
|
+
providerCredentialBootstrapped,
|
|
642
|
+
scmProvider: parseAdapterName(
|
|
643
|
+
scmProviderRaw,
|
|
644
|
+
supportedScmProviders,
|
|
645
|
+
defaults.defaultScmProvider,
|
|
646
|
+
),
|
|
535
647
|
maxParallelGateRuns: parseInteger(maxParallelGateRunsRaw, 3, 1, 64),
|
|
536
648
|
dashboardPort: parseInteger(dashboardPortRaw, 3000, 1, 65535),
|
|
537
649
|
framework: parseFramework(frameworkRaw, defaults.framework),
|
|
@@ -540,8 +652,8 @@ async function collectWizardConfig(
|
|
|
540
652
|
slack: channels.slack,
|
|
541
653
|
webhook: channels.webhook,
|
|
542
654
|
slackWebhook,
|
|
543
|
-
webhookUrl
|
|
544
|
-
}
|
|
655
|
+
webhookUrl,
|
|
656
|
+
},
|
|
545
657
|
};
|
|
546
658
|
} finally {
|
|
547
659
|
prompt.close();
|
|
@@ -550,7 +662,7 @@ async function collectWizardConfig(
|
|
|
550
662
|
|
|
551
663
|
async function loadTemplateFiles(
|
|
552
664
|
subdir: 'prompts',
|
|
553
|
-
matcher: (filename: string) => boolean
|
|
665
|
+
matcher: (filename: string) => boolean,
|
|
554
666
|
): Promise<Array<{ rel: string; content: string }>> {
|
|
555
667
|
const sourceDir = path.join(TEMPLATE_ROOT, subdir);
|
|
556
668
|
const entries = await fs.readdir(sourceDir, { withFileTypes: true });
|
|
@@ -561,8 +673,8 @@ async function loadTemplateFiles(
|
|
|
561
673
|
}
|
|
562
674
|
const full = path.join(sourceDir, entry.name);
|
|
563
675
|
templates.push({
|
|
564
|
-
rel:
|
|
565
|
-
content: await fs.readFile(full, 'utf8')
|
|
676
|
+
rel: `${GENERATED_CONFIG_ROOT}/${subdir}/${entry.name}`,
|
|
677
|
+
content: await fs.readFile(full, 'utf8'),
|
|
566
678
|
});
|
|
567
679
|
}
|
|
568
680
|
return templates.sort((a, b) => a.rel.localeCompare(b.rel));
|
|
@@ -585,6 +697,8 @@ export class InitCommandHandler {
|
|
|
585
697
|
baseBranch: gitContext.defaultBranch,
|
|
586
698
|
defaultProvider: DEFAULT_AGENT_PROVIDER,
|
|
587
699
|
defaultModel: DEFAULT_AGENT_MODEL,
|
|
700
|
+
providerConfigEnv: null,
|
|
701
|
+
providerCredentialBootstrapped: false,
|
|
588
702
|
scmProvider: DEFAULT_SCM_PROVIDER,
|
|
589
703
|
maxParallelGateRuns: 3,
|
|
590
704
|
dashboardPort: 3000,
|
|
@@ -594,21 +708,22 @@ export class InitCommandHandler {
|
|
|
594
708
|
slack: false,
|
|
595
709
|
webhook: false,
|
|
596
710
|
slackWebhook: '',
|
|
597
|
-
webhookUrl: ''
|
|
598
|
-
}
|
|
711
|
+
webhookUrl: '',
|
|
712
|
+
},
|
|
599
713
|
}
|
|
600
714
|
: await collectWizardConfig(
|
|
715
|
+
this.repoRoot,
|
|
601
716
|
{
|
|
602
717
|
branch: gitContext.defaultBranch,
|
|
603
718
|
framework,
|
|
604
719
|
defaultProvider: DEFAULT_AGENT_PROVIDER,
|
|
605
720
|
defaultModel: DEFAULT_AGENT_MODEL,
|
|
606
|
-
defaultScmProvider: DEFAULT_SCM_PROVIDER
|
|
721
|
+
defaultScmProvider: DEFAULT_SCM_PROVIDER,
|
|
607
722
|
},
|
|
608
|
-
this.promptFactory
|
|
723
|
+
this.promptFactory,
|
|
609
724
|
);
|
|
610
725
|
|
|
611
|
-
const orchestratorDir = path.join(this.repoRoot, 'agentic', 'orchestrator');
|
|
726
|
+
const orchestratorDir = path.join(this.repoRoot, 'config', 'agentic', 'orchestrator');
|
|
612
727
|
await fs.mkdir(orchestratorDir, { recursive: true });
|
|
613
728
|
|
|
614
729
|
const policyContent = options.advanced_policy
|
|
@@ -617,14 +732,16 @@ export class InitCommandHandler {
|
|
|
617
732
|
|
|
618
733
|
const configFiles: Array<{ rel: string; content: string }> = [
|
|
619
734
|
{
|
|
620
|
-
rel:
|
|
621
|
-
content: policyContent
|
|
735
|
+
rel: `${GENERATED_CONFIG_ROOT}/policy.yaml`,
|
|
736
|
+
content: policyContent,
|
|
622
737
|
},
|
|
623
|
-
{ rel:
|
|
624
|
-
{ rel:
|
|
625
|
-
{ rel:
|
|
738
|
+
{ rel: `${GENERATED_CONFIG_ROOT}/gates.yaml`, content: generateGatesYaml(wizard.framework) },
|
|
739
|
+
{ rel: `${GENERATED_CONFIG_ROOT}/agents.yaml`, content: generateAgentsYaml(wizard) },
|
|
740
|
+
{ rel: `${GENERATED_CONFIG_ROOT}/adapters.yaml`, content: generateAdaptersYaml(wizard) },
|
|
626
741
|
];
|
|
627
|
-
const templateFiles = await loadTemplateFiles('prompts', (filename) =>
|
|
742
|
+
const templateFiles = await loadTemplateFiles('prompts', (filename) =>
|
|
743
|
+
filename.endsWith('.md'),
|
|
744
|
+
);
|
|
628
745
|
const writableFiles = [...configFiles, ...templateFiles];
|
|
629
746
|
|
|
630
747
|
const created: string[] = [];
|
|
@@ -660,19 +777,23 @@ export class InitCommandHandler {
|
|
|
660
777
|
|
|
661
778
|
// Validate policy.yaml via composition loader (merges user policy over bundled defaults
|
|
662
779
|
// then validates the merged result against the full schema).
|
|
663
|
-
const policyRel =
|
|
780
|
+
const policyRel = `${GENERATED_CONFIG_ROOT}/policy.yaml`;
|
|
664
781
|
if (!skipped.includes(policyRel)) {
|
|
665
782
|
try {
|
|
666
|
-
await loadComposedPolicy(
|
|
783
|
+
await loadComposedPolicy(
|
|
784
|
+
this.repoRoot,
|
|
785
|
+
path.join(this.repoRoot, policyRel),
|
|
786
|
+
schemaRegistry,
|
|
787
|
+
);
|
|
667
788
|
} catch (err) {
|
|
668
789
|
validationWarnings.push(`Failed to validate ${policyRel}: ${String(err)}`);
|
|
669
790
|
}
|
|
670
791
|
}
|
|
671
792
|
|
|
672
793
|
const nonPolicyTargets: Array<{ schema: string; rel: string }> = [
|
|
673
|
-
{ schema: 'gates.schema.json', rel:
|
|
674
|
-
{ schema: 'agents.schema.json', rel:
|
|
675
|
-
{ schema: 'adapters.schema.json', rel:
|
|
794
|
+
{ schema: 'gates.schema.json', rel: `${GENERATED_CONFIG_ROOT}/gates.yaml` },
|
|
795
|
+
{ schema: 'agents.schema.json', rel: `${GENERATED_CONFIG_ROOT}/agents.yaml` },
|
|
796
|
+
{ schema: 'adapters.schema.json', rel: `${GENERATED_CONFIG_ROOT}/adapters.yaml` },
|
|
676
797
|
];
|
|
677
798
|
|
|
678
799
|
for (const { schema, rel } of nonPolicyTargets) {
|
|
@@ -695,12 +816,17 @@ export class InitCommandHandler {
|
|
|
695
816
|
const policyMode = options.advanced_policy ? 'full (advanced)' : 'lean (common controls only)';
|
|
696
817
|
const nextSteps = [
|
|
697
818
|
`Generated policy.yaml in ${policyMode} mode`,
|
|
698
|
-
'Review generated files in agentic/orchestrator/{policy,gates,agents,adapters}.yaml',
|
|
699
|
-
'Verify prompts under agentic/orchestrator/prompts/',
|
|
700
|
-
'Run: aop run -fi <spec.md> to start orchestrating features'
|
|
819
|
+
'Review generated files in config/agentic/orchestrator/{policy,gates,agents,adapters}.yaml',
|
|
820
|
+
'Verify prompts under config/agentic/orchestrator/prompts/',
|
|
821
|
+
'Run: aop run -fi <spec.md> to start orchestrating features',
|
|
701
822
|
];
|
|
702
823
|
if (!options.advanced_policy) {
|
|
703
|
-
nextSteps.push(
|
|
824
|
+
nextSteps.push(
|
|
825
|
+
'To generate a full explicit policy with all advanced controls, re-run: aop init --advanced-policy --force',
|
|
826
|
+
);
|
|
827
|
+
}
|
|
828
|
+
if (wizard.providerCredentialBootstrapped) {
|
|
829
|
+
nextSteps.push('Stored provider credential in .env as AOP_PROVIDER_CONFIG_ENV.');
|
|
704
830
|
}
|
|
705
831
|
|
|
706
832
|
return {
|
|
@@ -711,8 +837,8 @@ export class InitCommandHandler {
|
|
|
711
837
|
updated,
|
|
712
838
|
skipped,
|
|
713
839
|
validation_warnings: validationWarnings,
|
|
714
|
-
next_steps: nextSteps
|
|
715
|
-
}
|
|
840
|
+
next_steps: nextSteps,
|
|
841
|
+
},
|
|
716
842
|
};
|
|
717
843
|
}
|
|
718
844
|
}
|
|
@@ -2,13 +2,17 @@ export function printPayload(payload: unknown): void {
|
|
|
2
2
|
process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
3
3
|
}
|
|
4
4
|
|
|
5
|
-
export function printError(
|
|
5
|
+
export function printError(
|
|
6
|
+
code: string,
|
|
7
|
+
message: string,
|
|
8
|
+
details: Record<string, unknown> = {},
|
|
9
|
+
): void {
|
|
6
10
|
printPayload({
|
|
7
11
|
ok: false,
|
|
8
12
|
error: {
|
|
9
13
|
code,
|
|
10
14
|
message,
|
|
11
|
-
details
|
|
12
|
-
}
|
|
15
|
+
details,
|
|
16
|
+
},
|
|
13
17
|
});
|
|
14
18
|
}
|
|
@@ -97,15 +97,15 @@ export class ResumeCommandHandler {
|
|
|
97
97
|
transport,
|
|
98
98
|
resumed: false,
|
|
99
99
|
recovery: recovery.data,
|
|
100
|
-
resume_plan: resumePlan
|
|
101
|
-
}
|
|
100
|
+
resume_plan: resumePlan,
|
|
101
|
+
},
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
const selection = resolveProviderSelection({
|
|
106
106
|
cli: options as unknown as Record<string, string | undefined>,
|
|
107
107
|
env,
|
|
108
|
-
agentsConfig: kernel.getAgentsConfig()
|
|
108
|
+
agentsConfig: kernel.getAgentsConfig(),
|
|
109
109
|
});
|
|
110
110
|
|
|
111
111
|
const provider = new NullWorkerProvider(selection);
|
|
@@ -114,13 +114,13 @@ export class ResumeCommandHandler {
|
|
|
114
114
|
max_parallel_gate_runs: 3,
|
|
115
115
|
run_id: resumePlan.run_id,
|
|
116
116
|
owner_instance_id: resumePlan.owner_instance_id,
|
|
117
|
-
takeover_stale_run: options.takeover_stale_run
|
|
117
|
+
takeover_stale_run: options.takeover_stale_run,
|
|
118
118
|
});
|
|
119
119
|
|
|
120
120
|
const startResult = await supervisor.start(
|
|
121
121
|
resumePlan.features.map((feature) => ({
|
|
122
|
-
feature_id: feature.feature_id
|
|
123
|
-
}))
|
|
122
|
+
feature_id: feature.feature_id,
|
|
123
|
+
})),
|
|
124
124
|
);
|
|
125
125
|
|
|
126
126
|
return {
|
|
@@ -134,8 +134,8 @@ export class ResumeCommandHandler {
|
|
|
134
134
|
runtime_status: startResult.status,
|
|
135
135
|
run_metadata: startResult.run_metadata,
|
|
136
136
|
dashboard: startResult.dashboard,
|
|
137
|
-
recovery: recovery.data
|
|
138
|
-
}
|
|
137
|
+
recovery: recovery.data,
|
|
138
|
+
},
|
|
139
139
|
};
|
|
140
140
|
}
|
|
141
141
|
|
|
@@ -177,7 +177,8 @@ export class ResumeCommandHandler {
|
|
|
177
177
|
try {
|
|
178
178
|
const state = await kernel.featureStateGet(featureId);
|
|
179
179
|
const frontMatter = asRecord(state.data.front_matter);
|
|
180
|
-
const status =
|
|
180
|
+
const status =
|
|
181
|
+
typeof frontMatter.status === 'string' ? frontMatter.status : STATUS.PLANNING;
|
|
181
182
|
if (isTerminalStatus(status)) {
|
|
182
183
|
continue;
|
|
183
184
|
}
|
|
@@ -186,7 +187,9 @@ export class ResumeCommandHandler {
|
|
|
186
187
|
feature_id: featureId,
|
|
187
188
|
status,
|
|
188
189
|
resume_phase: toResumePhase(status),
|
|
189
|
-
sources: [...(sourcesByFeature.get(featureId) ?? new Set<string>())].sort((a, b) =>
|
|
190
|
+
sources: [...(sourcesByFeature.get(featureId) ?? new Set<string>())].sort((a, b) =>
|
|
191
|
+
a.localeCompare(b),
|
|
192
|
+
),
|
|
190
193
|
});
|
|
191
194
|
} catch (_error) {
|
|
192
195
|
// Silently skip features with parse errors
|
|
@@ -201,7 +204,8 @@ export class ResumeCommandHandler {
|
|
|
201
204
|
return a.feature_id.localeCompare(b.feature_id);
|
|
202
205
|
});
|
|
203
206
|
|
|
204
|
-
const resolvedRunId =
|
|
207
|
+
const resolvedRunId =
|
|
208
|
+
runtimeSessions.run_id !== 'none' ? runtimeSessions.run_id : fallbackRunId;
|
|
205
209
|
const resolvedOwnerInstanceId =
|
|
206
210
|
runtimeSessions.owner_instance_id !== 'none'
|
|
207
211
|
? runtimeSessions.owner_instance_id
|
|
@@ -210,11 +214,15 @@ export class ResumeCommandHandler {
|
|
|
210
214
|
return {
|
|
211
215
|
run_id: resolvedRunId,
|
|
212
216
|
owner_instance_id: resolvedOwnerInstanceId,
|
|
213
|
-
features: resumable
|
|
217
|
+
features: resumable,
|
|
214
218
|
};
|
|
215
219
|
}
|
|
216
220
|
|
|
217
|
-
private addSource(
|
|
221
|
+
private addSource(
|
|
222
|
+
sourcesByFeature: Map<string, Set<string>>,
|
|
223
|
+
featureId: string,
|
|
224
|
+
source: string,
|
|
225
|
+
): void {
|
|
218
226
|
if (!featureId) {
|
|
219
227
|
return;
|
|
220
228
|
}
|
|
@@ -41,14 +41,14 @@ export class RetryCommandHandler {
|
|
|
41
41
|
if (!featureId) {
|
|
42
42
|
invalidCliArgs({
|
|
43
43
|
reason: '--feature-id is required for retry',
|
|
44
|
-
expected: '--feature-id <feature_id>'
|
|
44
|
+
expected: '--feature-id <feature_id>',
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
if (!isValidFeatureId(featureId)) {
|
|
48
48
|
invalidCliArgs({
|
|
49
49
|
reason: 'Invalid --feature-id value',
|
|
50
50
|
provided: featureId,
|
|
51
|
-
expected_pattern: '^[a-z0-9_][a-z0-9_-]*$'
|
|
51
|
+
expected_pattern: '^[a-z0-9_][a-z0-9_-]*$',
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
|
|
@@ -57,7 +57,7 @@ export class RetryCommandHandler {
|
|
|
57
57
|
let forcedRetryExecuted = false;
|
|
58
58
|
|
|
59
59
|
const current = await callCliTool(this.toolClient, this.runId, TOOLS.FEATURE_STATE_GET, {
|
|
60
|
-
feature_id: featureId
|
|
60
|
+
feature_id: featureId,
|
|
61
61
|
});
|
|
62
62
|
const statePayload = current.data as unknown as RetryFeatureStatePayload;
|
|
63
63
|
|
|
@@ -70,7 +70,8 @@ export class RetryCommandHandler {
|
|
|
70
70
|
? 'fast'
|
|
71
71
|
: status === 'qa' || status === 'ready_to_merge'
|
|
72
72
|
? 'full'
|
|
73
|
-
: status === 'blocked' &&
|
|
73
|
+
: status === 'blocked' &&
|
|
74
|
+
statePayload.front_matter.status_reason?.includes('forced_retry:fast')
|
|
74
75
|
? 'fast'
|
|
75
76
|
: 'full';
|
|
76
77
|
|
|
@@ -78,14 +79,14 @@ export class RetryCommandHandler {
|
|
|
78
79
|
invalidCliArgs({
|
|
79
80
|
reason: 'Cannot retry a terminal feature status without --force',
|
|
80
81
|
status,
|
|
81
|
-
expected_status: ['building', 'qa', 'ready_to_merge', 'blocked']
|
|
82
|
+
expected_status: ['building', 'qa', 'ready_to_merge', 'blocked'],
|
|
82
83
|
});
|
|
83
84
|
}
|
|
84
85
|
|
|
85
86
|
if (force) {
|
|
86
87
|
const frontMatterPatch: Record<string, unknown> = {
|
|
87
88
|
gate_retry_count: 0,
|
|
88
|
-
last_retry_at: null
|
|
89
|
+
last_retry_at: null,
|
|
89
90
|
};
|
|
90
91
|
if (status === 'blocked') {
|
|
91
92
|
frontMatterPatch.status =
|
|
@@ -103,8 +104,8 @@ export class RetryCommandHandler {
|
|
|
103
104
|
feature_id: featureId,
|
|
104
105
|
expected_version: statePayload.front_matter.version,
|
|
105
106
|
patch: {
|
|
106
|
-
front_matter: frontMatterPatch
|
|
107
|
-
}
|
|
107
|
+
front_matter: frontMatterPatch,
|
|
108
|
+
},
|
|
108
109
|
});
|
|
109
110
|
retryCountReset = true;
|
|
110
111
|
forcedRetryExecuted = true;
|
|
@@ -113,7 +114,7 @@ export class RetryCommandHandler {
|
|
|
113
114
|
const gate = await callCliTool(this.toolClient, this.runId, TOOLS.GATES_RUN, {
|
|
114
115
|
feature_id: featureId,
|
|
115
116
|
profile: null,
|
|
116
|
-
mode: inferredMode
|
|
117
|
+
mode: inferredMode,
|
|
117
118
|
});
|
|
118
119
|
const retryExecuted = true;
|
|
119
120
|
const retryMode = inferredMode;
|
|
@@ -128,8 +129,8 @@ export class RetryCommandHandler {
|
|
|
128
129
|
retry_executed: retryExecuted,
|
|
129
130
|
forced_retry_executed: forcedRetryExecuted,
|
|
130
131
|
retry_mode: retryMode,
|
|
131
|
-
retry_outcome: retryOutcome
|
|
132
|
-
}
|
|
132
|
+
retry_outcome: retryOutcome,
|
|
133
|
+
},
|
|
133
134
|
};
|
|
134
135
|
}
|
|
135
136
|
}
|