agentic-orchestrator 0.1.6 → 0.1.7
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 +47 -46
- 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 +4 -21
- 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/help-command-handler.ts +61 -32
- package/apps/control-plane/src/cli/init-command-handler.ts +110 -54
- 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 +515 -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 +69 -32
- 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 +72 -48
- 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 +162 -67
- 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 +133 -102
- 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/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/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 +44 -33
- 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 +31 -20
- 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 +1 -1
- package/dist/apps/control-plane/providers/providers.js +31 -34
- 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 +187 -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_quality_adoption_execution_spec.md +29 -14
- package/spec-files/progress.md +186 -175
- package/tsconfig.json +2 -8
|
@@ -7,7 +7,11 @@ import type { AppError } from '../providers/providers.js';
|
|
|
7
7
|
import type { ToolClient } from '../mcp/tool-client.js';
|
|
8
8
|
import type { FeatureStatePayload } from './types.js';
|
|
9
9
|
import { callCliTool } from './tooling.js';
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
canonicalFeatureIdFromPath,
|
|
12
|
+
isCanonicalSpecPath,
|
|
13
|
+
isLegacyCanonicalSpecPath,
|
|
14
|
+
} from './spec-utils.js';
|
|
11
15
|
|
|
12
16
|
export class SpecIngestionService {
|
|
13
17
|
private readonly repoRoot: string;
|
|
@@ -26,7 +30,9 @@ export class SpecIngestionService {
|
|
|
26
30
|
|
|
27
31
|
for (const sourcePath of resolvedPaths) {
|
|
28
32
|
const canonical = isCanonicalSpecPath(this.repoRoot, sourcePath);
|
|
29
|
-
const legacyCanonical = canonical
|
|
33
|
+
const legacyCanonical = canonical
|
|
34
|
+
? null
|
|
35
|
+
: isLegacyCanonicalSpecPath(this.repoRoot, sourcePath);
|
|
30
36
|
let featureId: string;
|
|
31
37
|
let targetPath: string;
|
|
32
38
|
if (canonical) {
|
|
@@ -59,7 +65,7 @@ export class SpecIngestionService {
|
|
|
59
65
|
const sourceContent = await fs.readFile(sourcePath, 'utf8');
|
|
60
66
|
const sourceHash = stableHash(sourceContent);
|
|
61
67
|
const state = await callCliTool(this.toolClient, this.runId, TOOLS.FEATURE_STATE_GET, {
|
|
62
|
-
feature_id: featureId
|
|
68
|
+
feature_id: featureId,
|
|
63
69
|
});
|
|
64
70
|
const typedState = state.data as unknown as FeatureStatePayload;
|
|
65
71
|
|
|
@@ -70,16 +76,16 @@ export class SpecIngestionService {
|
|
|
70
76
|
front_matter: {
|
|
71
77
|
source: {
|
|
72
78
|
path: path.relative(this.repoRoot, sourcePath).replaceAll('\\\\', '/'),
|
|
73
|
-
hash: sourceHash
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
79
|
+
hash: sourceHash,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
77
83
|
});
|
|
78
84
|
|
|
79
85
|
items.push({
|
|
80
86
|
feature_id: featureId,
|
|
81
87
|
source_path: path.relative(this.repoRoot, sourcePath).replaceAll('\\\\', '/'),
|
|
82
|
-
canonical_spec_path: path.relative(this.repoRoot, targetPath).replaceAll('\\\\', '/')
|
|
88
|
+
canonical_spec_path: path.relative(this.repoRoot, targetPath).replaceAll('\\\\', '/'),
|
|
83
89
|
});
|
|
84
90
|
}
|
|
85
91
|
|
|
@@ -82,7 +82,12 @@ export class SpecInputResolver {
|
|
|
82
82
|
return markdownFiles;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
const discovered = await callCliTool(
|
|
85
|
+
const discovered = await callCliTool(
|
|
86
|
+
this.toolClient,
|
|
87
|
+
this.runId,
|
|
88
|
+
TOOLS.FEATURE_DISCOVER_SPECS,
|
|
89
|
+
{},
|
|
90
|
+
);
|
|
86
91
|
const specs = (discovered.data as unknown as DiscoveredSpecsPayload).specs ?? [];
|
|
87
92
|
if (specs.length === 0) {
|
|
88
93
|
const error = new Error(ERROR_CODES.NO_SPECS_FOUND) as AppError;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {ERROR_CODES} from '../core/error-codes.js';
|
|
3
|
-
import type {AppError} from '../providers/providers.js';
|
|
2
|
+
import { ERROR_CODES } from '../core/error-codes.js';
|
|
3
|
+
import type { AppError } from '../providers/providers.js';
|
|
4
4
|
|
|
5
5
|
export function canonicalFeatureIdFromPath(inputPath: string): string {
|
|
6
6
|
const basename = path.basename(inputPath);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {TOOLS} from '../core/constants.js';
|
|
2
|
-
import type {ToolClient} from '../mcp/tool-client.js';
|
|
3
|
-
import {callCliTool} from './tooling.js';
|
|
1
|
+
import { TOOLS } from '../core/constants.js';
|
|
2
|
+
import type { ToolClient } from '../mcp/tool-client.js';
|
|
3
|
+
import { callCliTool } from './tooling.js';
|
|
4
4
|
|
|
5
5
|
interface ProjectStatusEntry {
|
|
6
6
|
name: string;
|
|
@@ -55,7 +55,8 @@ function computeFeatureActivity(feature: DashboardFeature): ExtendedActivityStat
|
|
|
55
55
|
return feature.activity_state;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
const timestamp =
|
|
58
|
+
const timestamp =
|
|
59
|
+
feature.activity_last_event_at ?? feature.last_heartbeat_at ?? feature.last_run_at;
|
|
59
60
|
if (!timestamp) {
|
|
60
61
|
return 'unknown';
|
|
61
62
|
}
|
|
@@ -78,8 +79,8 @@ export class StatusCommandHandler {
|
|
|
78
79
|
return {
|
|
79
80
|
ok: true,
|
|
80
81
|
data: {
|
|
81
|
-
projects: options.projectStatuses
|
|
82
|
-
}
|
|
82
|
+
projects: options.projectStatuses,
|
|
83
|
+
},
|
|
83
84
|
};
|
|
84
85
|
}
|
|
85
86
|
|
|
@@ -94,9 +95,9 @@ export class StatusCommandHandler {
|
|
|
94
95
|
summary: features.map((f) => ({
|
|
95
96
|
feature_id: f.feature_id,
|
|
96
97
|
status: f.status ?? 'unknown',
|
|
97
|
-
activity: computeFeatureActivity(f)
|
|
98
|
-
}))
|
|
99
|
-
}
|
|
98
|
+
activity: computeFeatureActivity(f),
|
|
99
|
+
})),
|
|
100
|
+
},
|
|
100
101
|
};
|
|
101
102
|
}
|
|
102
103
|
|
|
@@ -109,9 +110,9 @@ export class StatusCommandHandler {
|
|
|
109
110
|
features: rawFeatures.map((f) => ({
|
|
110
111
|
...f,
|
|
111
112
|
activity: computeFeatureActivity(f),
|
|
112
|
-
...(f.pr !== undefined ? { pr_info: f.pr } : {})
|
|
113
|
-
}))
|
|
114
|
-
}
|
|
113
|
+
...(f.pr !== undefined ? { pr_info: f.pr } : {}),
|
|
114
|
+
})),
|
|
115
|
+
},
|
|
115
116
|
};
|
|
116
117
|
}
|
|
117
118
|
}
|
|
@@ -5,7 +5,7 @@ import { createOperationId, type ToolClient } from '../mcp/tool-client.js';
|
|
|
5
5
|
import { withOperationIdIfRequired } from '../application/tools/tool-metadata.js';
|
|
6
6
|
|
|
7
7
|
export function assertOkResponse<TData extends Record<string, unknown>>(
|
|
8
|
-
response: ToolResponse<TData
|
|
8
|
+
response: ToolResponse<TData>,
|
|
9
9
|
): OkResponse<TData> {
|
|
10
10
|
if (!response.ok) {
|
|
11
11
|
const failed = response as FailResponse;
|
|
@@ -21,7 +21,7 @@ export async function callCliTool(
|
|
|
21
21
|
toolClient: ToolClient,
|
|
22
22
|
runId: string,
|
|
23
23
|
toolName: string,
|
|
24
|
-
args: Record<string, unknown
|
|
24
|
+
args: Record<string, unknown>,
|
|
25
25
|
): Promise<OkResponse<Record<string, unknown>>> {
|
|
26
26
|
const payload = withOperationIdIfRequired(toolName, args, createOperationId);
|
|
27
27
|
|
|
@@ -29,7 +29,7 @@ export async function callCliTool(
|
|
|
29
29
|
run_id: runId,
|
|
30
30
|
session_id: 'bootstrap:cli',
|
|
31
31
|
actor_type: 'system',
|
|
32
|
-
actor_id: 'cli:system'
|
|
32
|
+
actor_id: 'cli:system',
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
return assertOkResponse(response);
|
|
@@ -41,23 +41,37 @@ function collectPlanFiles(plan: PlanShape): string[] {
|
|
|
41
41
|
return [
|
|
42
42
|
...(plan.files?.create ?? []),
|
|
43
43
|
...(plan.files?.modify ?? []),
|
|
44
|
-
...(plan.files?.delete ?? [])
|
|
44
|
+
...(plan.files?.delete ?? []),
|
|
45
45
|
];
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
export function detectPlanCollisions(
|
|
48
|
+
export function detectPlanCollisions(
|
|
49
|
+
candidate: PlanShape,
|
|
50
|
+
acceptedPlans: PlanShape[],
|
|
51
|
+
policy: PolicyShape,
|
|
52
|
+
): {
|
|
49
53
|
hasCollisions: boolean;
|
|
50
54
|
collisions: {
|
|
51
55
|
files: Array<{ with_feature_id: string; paths: string[] }>;
|
|
52
56
|
areas: Array<{ with_feature_id: string; overlaps: Array<[string, string]> }>;
|
|
53
|
-
contracts: Array<{
|
|
57
|
+
contracts: Array<{
|
|
58
|
+
with_feature_id: string;
|
|
59
|
+
contract: string;
|
|
60
|
+
candidate_mode: string;
|
|
61
|
+
other_mode: string;
|
|
62
|
+
}>;
|
|
54
63
|
};
|
|
55
64
|
fingerprint: string | null;
|
|
56
65
|
} {
|
|
57
66
|
const collisions = {
|
|
58
67
|
files: [] as Array<{ with_feature_id: string; paths: string[] }>,
|
|
59
68
|
areas: [] as Array<{ with_feature_id: string; overlaps: Array<[string, string]> }>,
|
|
60
|
-
contracts: [] as Array<{
|
|
69
|
+
contracts: [] as Array<{
|
|
70
|
+
with_feature_id: string;
|
|
71
|
+
contract: string;
|
|
72
|
+
candidate_mode: string;
|
|
73
|
+
other_mode: string;
|
|
74
|
+
}>,
|
|
61
75
|
};
|
|
62
76
|
|
|
63
77
|
const candidateFiles = collectPlanFiles(candidate);
|
|
@@ -71,7 +85,7 @@ export function detectPlanCollisions(candidate: PlanShape, acceptedPlans: PlanSh
|
|
|
71
85
|
if (fileOverlap.length > 0) {
|
|
72
86
|
collisions.files.push({
|
|
73
87
|
with_feature_id: plan.feature_id,
|
|
74
|
-
paths: fileOverlap
|
|
88
|
+
paths: fileOverlap,
|
|
75
89
|
});
|
|
76
90
|
}
|
|
77
91
|
|
|
@@ -80,12 +94,15 @@ export function detectPlanCollisions(candidate: PlanShape, acceptedPlans: PlanSh
|
|
|
80
94
|
const protectedAreas = policy.protected_areas ?? [];
|
|
81
95
|
const relevant = areaOverlap.filter(
|
|
82
96
|
([a, b]) =>
|
|
83
|
-
exclusives.includes(a) ||
|
|
97
|
+
exclusives.includes(a) ||
|
|
98
|
+
exclusives.includes(b) ||
|
|
99
|
+
protectedAreas.includes(a) ||
|
|
100
|
+
protectedAreas.includes(b),
|
|
84
101
|
);
|
|
85
102
|
if (relevant.length > 0) {
|
|
86
103
|
collisions.areas.push({
|
|
87
104
|
with_feature_id: plan.feature_id,
|
|
88
|
-
overlaps: relevant
|
|
105
|
+
overlaps: relevant,
|
|
89
106
|
});
|
|
90
107
|
}
|
|
91
108
|
|
|
@@ -99,7 +116,7 @@ export function detectPlanCollisions(candidate: PlanShape, acceptedPlans: PlanSh
|
|
|
99
116
|
with_feature_id: plan.feature_id,
|
|
100
117
|
contract,
|
|
101
118
|
candidate_mode: candidateMode,
|
|
102
|
-
other_mode: otherMode
|
|
119
|
+
other_mode: otherMode,
|
|
103
120
|
});
|
|
104
121
|
}
|
|
105
122
|
}
|
|
@@ -110,12 +127,12 @@ export function detectPlanCollisions(candidate: PlanShape, acceptedPlans: PlanSh
|
|
|
110
127
|
|
|
111
128
|
const fingerprintInput = JSON.stringify({
|
|
112
129
|
feature_id: candidate.feature_id,
|
|
113
|
-
collisions
|
|
130
|
+
collisions,
|
|
114
131
|
});
|
|
115
132
|
|
|
116
133
|
return {
|
|
117
134
|
hasCollisions,
|
|
118
135
|
collisions,
|
|
119
|
-
fingerprint: hasCollisions ? stableHash(fingerprintInput) : null
|
|
136
|
+
fingerprint: hasCollisions ? stableHash(fingerprintInput) : null,
|
|
120
137
|
};
|
|
121
138
|
}
|
|
@@ -8,7 +8,7 @@ export const STATUS = {
|
|
|
8
8
|
READY_TO_MERGE: 'ready_to_merge',
|
|
9
9
|
MERGED: 'merged',
|
|
10
10
|
FAILED: 'failed',
|
|
11
|
-
PAUSED_BUDGET: 'paused_budget'
|
|
11
|
+
PAUSED_BUDGET: 'paused_budget',
|
|
12
12
|
} as const;
|
|
13
13
|
|
|
14
14
|
export type FeatureStatus = (typeof STATUS)[keyof typeof STATUS];
|
|
@@ -17,7 +17,7 @@ export const ROLE_STATUS = {
|
|
|
17
17
|
READY: 'ready',
|
|
18
18
|
RUNNING: 'running',
|
|
19
19
|
BLOCKED: 'blocked',
|
|
20
|
-
DONE: 'done'
|
|
20
|
+
DONE: 'done',
|
|
21
21
|
} as const;
|
|
22
22
|
|
|
23
23
|
export const TOOLS = {
|
|
@@ -53,26 +53,32 @@ export const TOOLS = {
|
|
|
53
53
|
COST_RECORD: 'cost.record',
|
|
54
54
|
COST_GET: 'cost.get',
|
|
55
55
|
PERFORMANCE_RECORD_OUTCOME: 'performance.record_outcome',
|
|
56
|
-
PERFORMANCE_GET_ANALYTICS: 'performance.get_analytics'
|
|
56
|
+
PERFORMANCE_GET_ANALYTICS: 'performance.get_analytics',
|
|
57
57
|
} as const;
|
|
58
58
|
|
|
59
59
|
export const DEFAULT_CLUSTER = {
|
|
60
60
|
orchestrator_session_id: 'unknown',
|
|
61
61
|
planner_session_id: 'unknown',
|
|
62
62
|
builder_session_id: 'unknown',
|
|
63
|
-
qa_session_id: 'unknown'
|
|
63
|
+
qa_session_id: 'unknown',
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
export const DEFAULT_ROLE_STATUS = {
|
|
67
67
|
planner: ROLE_STATUS.READY,
|
|
68
68
|
builder: ROLE_STATUS.READY,
|
|
69
|
-
qa: ROLE_STATUS.READY
|
|
69
|
+
qa: ROLE_STATUS.READY,
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
export const GATE_RESULT = {
|
|
73
73
|
PASS: 'pass',
|
|
74
74
|
FAIL: 'fail',
|
|
75
|
-
NA: 'na'
|
|
75
|
+
NA: 'na',
|
|
76
76
|
} as const;
|
|
77
77
|
|
|
78
|
-
export const ALLOWED_ACTORS = new Set<string>([
|
|
78
|
+
export const ALLOWED_ACTORS = new Set<string>([
|
|
79
|
+
'orchestrator',
|
|
80
|
+
'planner',
|
|
81
|
+
'builder',
|
|
82
|
+
'qa',
|
|
83
|
+
'system',
|
|
84
|
+
]);
|
|
@@ -46,7 +46,7 @@ export const ERROR_CODES = {
|
|
|
46
46
|
INVALID_ARGUMENT: 'invalid_argument',
|
|
47
47
|
INTERNAL_ERROR: 'internal_error',
|
|
48
48
|
DEPENDENCY_UNRESOLVED: 'dependency_unresolved',
|
|
49
|
-
DEPENDENCY_CIRCULAR: 'dependency_circular'
|
|
49
|
+
DEPENDENCY_CIRCULAR: 'dependency_circular',
|
|
50
50
|
} as const;
|
|
51
51
|
|
|
52
52
|
export type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];
|
|
@@ -87,7 +87,7 @@ export class FileLockManager {
|
|
|
87
87
|
async withFileLock<T>(
|
|
88
88
|
lockPath: string,
|
|
89
89
|
operation: () => Promise<T>,
|
|
90
|
-
options: FileLockOptions = {}
|
|
90
|
+
options: FileLockOptions = {},
|
|
91
91
|
): Promise<T> {
|
|
92
92
|
const timeoutMs = options.timeoutMs ?? 30_000;
|
|
93
93
|
const initialBackoffMs = options.initialBackoffMs ?? 30;
|
|
@@ -103,10 +103,13 @@ export class FileLockManager {
|
|
|
103
103
|
const lockHandle = await fsp.open(
|
|
104
104
|
lockPath,
|
|
105
105
|
fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_RDWR,
|
|
106
|
-
0o644
|
|
106
|
+
0o644,
|
|
107
107
|
);
|
|
108
108
|
try {
|
|
109
|
-
await lockHandle.writeFile(
|
|
109
|
+
await lockHandle.writeFile(
|
|
110
|
+
JSON.stringify({ pid: process.pid, at: new Date().toISOString() }),
|
|
111
|
+
'utf8',
|
|
112
|
+
);
|
|
110
113
|
await lockHandle.sync();
|
|
111
114
|
} finally {
|
|
112
115
|
await lockHandle.close();
|
|
@@ -144,7 +147,10 @@ export async function pathExists(targetPath: string): Promise<boolean> {
|
|
|
144
147
|
return await pathFsAdapter.pathExists(targetPath);
|
|
145
148
|
}
|
|
146
149
|
|
|
147
|
-
export async function readJson<T = unknown>(
|
|
150
|
+
export async function readJson<T = unknown>(
|
|
151
|
+
filePath: string,
|
|
152
|
+
fallback: T | null = null,
|
|
153
|
+
): Promise<T | null> {
|
|
148
154
|
return await pathFsAdapter.readJson(filePath, fallback);
|
|
149
155
|
}
|
|
150
156
|
|
|
@@ -159,7 +165,7 @@ export async function atomicWriteJson(filePath: string, value: unknown): Promise
|
|
|
159
165
|
export async function withFileLock<T>(
|
|
160
166
|
lockPath: string,
|
|
161
167
|
operation: () => Promise<T>,
|
|
162
|
-
options: FileLockOptions = {}
|
|
168
|
+
options: FileLockOptions = {},
|
|
163
169
|
): Promise<T> {
|
|
164
170
|
return await fileLockManager.withFileLock(lockPath, operation, options);
|
|
165
171
|
}
|
|
@@ -73,7 +73,7 @@ class LcovCoverageParser implements CoverageParserStrategy {
|
|
|
73
73
|
return {
|
|
74
74
|
line: linesFound > 0 ? linesHit / linesFound : 1,
|
|
75
75
|
branch: branchesFound > 0 ? branchesHit / branchesFound : 1,
|
|
76
|
-
details: { linesFound, linesHit, branchesFound, branchesHit }
|
|
76
|
+
details: { linesFound, linesHit, branchesFound, branchesHit },
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
79
|
}
|
|
@@ -103,7 +103,7 @@ class JacocoXmlCoverageParser implements CoverageParserStrategy {
|
|
|
103
103
|
return {
|
|
104
104
|
line: lineCovered + lineMissed > 0 ? lineCovered / (lineCovered + lineMissed) : 1,
|
|
105
105
|
branch: branchCovered + branchMissed > 0 ? branchCovered / (branchCovered + branchMissed) : 1,
|
|
106
|
-
details: { lineMissed, lineCovered, branchMissed, branchCovered }
|
|
106
|
+
details: { lineMissed, lineCovered, branchMissed, branchCovered },
|
|
107
107
|
};
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -117,7 +117,7 @@ class CoberturaXmlCoverageParser implements CoverageParserStrategy {
|
|
|
117
117
|
return {
|
|
118
118
|
line: lineRate,
|
|
119
119
|
branch: branchRate,
|
|
120
|
-
details: { lineRate, branchRate }
|
|
120
|
+
details: { lineRate, branchRate },
|
|
121
121
|
};
|
|
122
122
|
}
|
|
123
123
|
}
|
|
@@ -145,10 +145,22 @@ export class CoverageParserRegistry {
|
|
|
145
145
|
export class CoverageThresholdPolicy {
|
|
146
146
|
merge(policy: PolicyShape, profileThresholds: Partial<GateThresholds> = {}): GateThresholds {
|
|
147
147
|
return {
|
|
148
|
-
coverage_line_min: Math.max(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
148
|
+
coverage_line_min: Math.max(
|
|
149
|
+
policy.testing.coverage.minimums.line,
|
|
150
|
+
profileThresholds.coverage_line_min ?? 0,
|
|
151
|
+
),
|
|
152
|
+
coverage_branch_min: Math.max(
|
|
153
|
+
policy.testing.coverage.minimums.branch,
|
|
154
|
+
profileThresholds.coverage_branch_min ?? 0,
|
|
155
|
+
),
|
|
156
|
+
coverage_line_target: Math.max(
|
|
157
|
+
policy.testing.coverage.targets.line,
|
|
158
|
+
profileThresholds.coverage_line_target ?? 0,
|
|
159
|
+
),
|
|
160
|
+
coverage_branch_target: Math.max(
|
|
161
|
+
policy.testing.coverage.targets.branch,
|
|
162
|
+
profileThresholds.coverage_branch_target ?? 0,
|
|
163
|
+
),
|
|
152
164
|
};
|
|
153
165
|
}
|
|
154
166
|
}
|
|
@@ -163,7 +175,10 @@ function pickAllowedEnv(envAllowlist: string[] = []): NodeJS.ProcessEnv {
|
|
|
163
175
|
return env;
|
|
164
176
|
}
|
|
165
177
|
|
|
166
|
-
export async function parseCoverage(
|
|
178
|
+
export async function parseCoverage(
|
|
179
|
+
parserConfig: ParserConfig | undefined,
|
|
180
|
+
worktreePath: string,
|
|
181
|
+
): Promise<CoverageMetrics | null> {
|
|
167
182
|
if (!parserConfig || parserConfig.type === 'none') {
|
|
168
183
|
return null;
|
|
169
184
|
}
|
|
@@ -221,17 +236,25 @@ export class GateExecutionService {
|
|
|
221
236
|
env: NodeJS.ProcessEnv;
|
|
222
237
|
worktreePath: string;
|
|
223
238
|
logDirectory: string;
|
|
224
|
-
}
|
|
239
|
+
},
|
|
225
240
|
): Promise<Record<string, unknown>> {
|
|
226
|
-
const timeoutSeconds = Number(
|
|
241
|
+
const timeoutSeconds = Number(
|
|
242
|
+
step.timeout_seconds ?? ctx.policy.execution.default_step_timeout_seconds,
|
|
243
|
+
);
|
|
227
244
|
const stepLogPath = path.join(
|
|
228
245
|
ctx.logDirectory,
|
|
229
|
-
`${Date.now()}-${ctx.mode}-${step.name.replaceAll(/[^a-zA-Z0-9_-]/g, '_')}.log
|
|
246
|
+
`${Date.now()}-${ctx.mode}-${step.name.replaceAll(/[^a-zA-Z0-9_-]/g, '_')}.log`,
|
|
230
247
|
);
|
|
231
248
|
|
|
232
249
|
const retryPolicy = ctx.policy.execution.retry_policy;
|
|
233
250
|
let attempts = 0;
|
|
234
|
-
let lastResult: CommandResult = {
|
|
251
|
+
let lastResult: CommandResult = {
|
|
252
|
+
code: 1,
|
|
253
|
+
signal: null,
|
|
254
|
+
stdout: '',
|
|
255
|
+
stderr: '',
|
|
256
|
+
timeout: false,
|
|
257
|
+
};
|
|
235
258
|
const maxAttempts = retryPolicy.transient_max_retries + 1;
|
|
236
259
|
|
|
237
260
|
while (attempts < maxAttempts) {
|
|
@@ -239,7 +262,7 @@ export class GateExecutionService {
|
|
|
239
262
|
const result = await runCommand(step.cmd[0], step.cmd.slice(1), {
|
|
240
263
|
cwd: step.cwd ? path.join(ctx.worktreePath, step.cwd) : ctx.worktreePath,
|
|
241
264
|
env: { ...ctx.env, ...step.env },
|
|
242
|
-
timeoutMs: timeoutSeconds * 1000
|
|
265
|
+
timeoutMs: timeoutSeconds * 1000,
|
|
243
266
|
});
|
|
244
267
|
|
|
245
268
|
lastResult = result;
|
|
@@ -252,7 +275,7 @@ export class GateExecutionService {
|
|
|
252
275
|
result.stdout,
|
|
253
276
|
'',
|
|
254
277
|
'## stderr',
|
|
255
|
-
result.stderr
|
|
278
|
+
result.stderr,
|
|
256
279
|
].join('\n');
|
|
257
280
|
await fs.writeFile(stepLogPath, `${logText}\n`, 'utf8');
|
|
258
281
|
|
|
@@ -272,7 +295,7 @@ export class GateExecutionService {
|
|
|
272
295
|
attempts,
|
|
273
296
|
exit_code: lastResult.code,
|
|
274
297
|
timeout: lastResult.timeout,
|
|
275
|
-
log_path: stepLogPath
|
|
298
|
+
log_path: stepLogPath,
|
|
276
299
|
};
|
|
277
300
|
}
|
|
278
301
|
|
|
@@ -284,7 +307,7 @@ export class GateExecutionService {
|
|
|
284
307
|
policy,
|
|
285
308
|
worktreePath,
|
|
286
309
|
logDirectory,
|
|
287
|
-
evidenceDirectory
|
|
310
|
+
evidenceDirectory,
|
|
288
311
|
}: {
|
|
289
312
|
featureId: string;
|
|
290
313
|
mode: string;
|
|
@@ -335,7 +358,7 @@ export class GateExecutionService {
|
|
|
335
358
|
skip_reason: 'dependency_failed',
|
|
336
359
|
parallel_group: step.parallel_group,
|
|
337
360
|
started_at: nowIso(),
|
|
338
|
-
finished_at: nowIso()
|
|
361
|
+
finished_at: nowIso(),
|
|
339
362
|
});
|
|
340
363
|
}
|
|
341
364
|
|
|
@@ -348,13 +371,13 @@ export class GateExecutionService {
|
|
|
348
371
|
policy,
|
|
349
372
|
env,
|
|
350
373
|
worktreePath,
|
|
351
|
-
logDirectory
|
|
374
|
+
logDirectory,
|
|
352
375
|
});
|
|
353
376
|
stepResult['parallel_group'] = step.parallel_group;
|
|
354
377
|
stepResult['started_at'] = startedAt;
|
|
355
378
|
stepResult['finished_at'] = nowIso();
|
|
356
379
|
return stepResult;
|
|
357
|
-
})
|
|
380
|
+
}),
|
|
358
381
|
);
|
|
359
382
|
|
|
360
383
|
for (const result of results) {
|
|
@@ -379,7 +402,7 @@ export class GateExecutionService {
|
|
|
379
402
|
policy,
|
|
380
403
|
env,
|
|
381
404
|
worktreePath,
|
|
382
|
-
logDirectory
|
|
405
|
+
logDirectory,
|
|
383
406
|
});
|
|
384
407
|
|
|
385
408
|
stepResults.push({ ...result, started_at: startedAt, finished_at: nowIso() });
|
|
@@ -397,14 +420,17 @@ export class GateExecutionService {
|
|
|
397
420
|
let coverageStatus = 'na';
|
|
398
421
|
let coverageFailure: Record<string, unknown> | null = null;
|
|
399
422
|
if (coverage) {
|
|
400
|
-
if (
|
|
423
|
+
if (
|
|
424
|
+
coverage.line < thresholds.coverage_line_min ||
|
|
425
|
+
coverage.branch < thresholds.coverage_branch_min
|
|
426
|
+
) {
|
|
401
427
|
coverageStatus = 'fail';
|
|
402
428
|
overall = 'fail';
|
|
403
429
|
coverageFailure = {
|
|
404
430
|
line: coverage.line,
|
|
405
431
|
branch: coverage.branch,
|
|
406
432
|
min_line: thresholds.coverage_line_min,
|
|
407
|
-
min_branch: thresholds.coverage_branch_min
|
|
433
|
+
min_branch: thresholds.coverage_branch_min,
|
|
408
434
|
};
|
|
409
435
|
} else {
|
|
410
436
|
coverageStatus = 'pass';
|
|
@@ -421,7 +447,7 @@ export class GateExecutionService {
|
|
|
421
447
|
coverage_failure: coverageFailure,
|
|
422
448
|
thresholds,
|
|
423
449
|
step_results: stepResults,
|
|
424
|
-
finished_at: nowIso()
|
|
450
|
+
finished_at: nowIso(),
|
|
425
451
|
};
|
|
426
452
|
|
|
427
453
|
const evidencePath = path.join(evidenceDirectory, `gate-${mode}-${Date.now()}.json`);
|
|
@@ -436,7 +462,7 @@ export class GateExecutionService {
|
|
|
436
462
|
coverage_status: coverageStatus,
|
|
437
463
|
evidence_path: evidencePath,
|
|
438
464
|
latest_path: latestPath,
|
|
439
|
-
thresholds
|
|
465
|
+
thresholds,
|
|
440
466
|
};
|
|
441
467
|
}
|
|
442
468
|
}
|
|
@@ -445,7 +471,7 @@ const defaultCoverageParserRegistry = new CoverageParserRegistry([
|
|
|
445
471
|
new LcovCoverageParser(),
|
|
446
472
|
new JunitXmlCoverageParser(),
|
|
447
473
|
new JacocoXmlCoverageParser(),
|
|
448
|
-
new CoberturaXmlCoverageParser()
|
|
474
|
+
new CoberturaXmlCoverageParser(),
|
|
449
475
|
]);
|
|
450
476
|
const defaultGateExecutionService = new GateExecutionService(new CoverageThresholdPolicy());
|
|
451
477
|
|
|
@@ -457,7 +483,7 @@ export async function runGateMode({
|
|
|
457
483
|
policy,
|
|
458
484
|
worktreePath,
|
|
459
485
|
logDirectory,
|
|
460
|
-
evidenceDirectory
|
|
486
|
+
evidenceDirectory,
|
|
461
487
|
}: {
|
|
462
488
|
featureId: string;
|
|
463
489
|
mode: string;
|
|
@@ -476,6 +502,6 @@ export async function runGateMode({
|
|
|
476
502
|
policy,
|
|
477
503
|
worktreePath,
|
|
478
504
|
logDirectory,
|
|
479
|
-
evidenceDirectory
|
|
505
|
+
evidenceDirectory,
|
|
480
506
|
});
|
|
481
507
|
}
|
|
@@ -32,7 +32,7 @@ export class NodeCommandRunner implements CommandRunner {
|
|
|
32
32
|
child = spawn(cmd, args, {
|
|
33
33
|
cwd: options.cwd,
|
|
34
34
|
env: options.env,
|
|
35
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
35
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
36
36
|
});
|
|
37
37
|
} catch (err) {
|
|
38
38
|
return resolve({
|
|
@@ -40,7 +40,7 @@ export class NodeCommandRunner implements CommandRunner {
|
|
|
40
40
|
signal: null,
|
|
41
41
|
stdout: '',
|
|
42
42
|
stderr: (err as Error).message,
|
|
43
|
-
timeout: false
|
|
43
|
+
timeout: false,
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
|
|
@@ -82,7 +82,7 @@ export class NodeCommandRunner implements CommandRunner {
|
|
|
82
82
|
signal,
|
|
83
83
|
stdout,
|
|
84
84
|
stderr,
|
|
85
|
-
timeout: killedByTimeout
|
|
85
|
+
timeout: killedByTimeout,
|
|
86
86
|
});
|
|
87
87
|
});
|
|
88
88
|
});
|
|
@@ -96,7 +96,11 @@ export class NodeGitClient implements GitClient {
|
|
|
96
96
|
this.commandRunner = commandRunner;
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
async runGit(
|
|
99
|
+
async runGit(
|
|
100
|
+
repoRoot: string,
|
|
101
|
+
args: string[],
|
|
102
|
+
options: RunCommandOptions = {},
|
|
103
|
+
): Promise<CommandResult> {
|
|
100
104
|
return await this.commandRunner.run('git', args, { ...options, cwd: options.cwd ?? repoRoot });
|
|
101
105
|
}
|
|
102
106
|
}
|
|
@@ -104,10 +108,18 @@ export class NodeGitClient implements GitClient {
|
|
|
104
108
|
export const commandRunner: CommandRunner = new NodeCommandRunner();
|
|
105
109
|
export const gitClient: GitClient = new NodeGitClient(commandRunner);
|
|
106
110
|
|
|
107
|
-
export function runCommand(
|
|
111
|
+
export function runCommand(
|
|
112
|
+
cmd: string,
|
|
113
|
+
args: string[],
|
|
114
|
+
options: RunCommandOptions = {},
|
|
115
|
+
): Promise<CommandResult> {
|
|
108
116
|
return commandRunner.run(cmd, args, options);
|
|
109
117
|
}
|
|
110
118
|
|
|
111
|
-
export async function runGit(
|
|
119
|
+
export async function runGit(
|
|
120
|
+
repoRoot: string,
|
|
121
|
+
args: string[],
|
|
122
|
+
options: RunCommandOptions = {},
|
|
123
|
+
): Promise<CommandResult> {
|
|
112
124
|
return await gitClient.runGit(repoRoot, args, options);
|
|
113
125
|
}
|