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
|
@@ -16,9 +16,9 @@ vi.mock('node:readline/promises', () => ({
|
|
|
16
16
|
default: {
|
|
17
17
|
createInterface: vi.fn(() => ({
|
|
18
18
|
question: readlineQuestionMock,
|
|
19
|
-
close: readlineCloseMock
|
|
20
|
-
}))
|
|
21
|
-
}
|
|
19
|
+
close: readlineCloseMock,
|
|
20
|
+
})),
|
|
21
|
+
},
|
|
22
22
|
}));
|
|
23
23
|
|
|
24
24
|
vi.mock('../src/core/kernel.js', () => {
|
|
@@ -59,7 +59,7 @@ vi.mock('../src/core/kernel.js', () => {
|
|
|
59
59
|
|
|
60
60
|
vi.mock('../src/mcp/runtime-factory.js', () => ({
|
|
61
61
|
createToolingRuntime: createToolingRuntimeMock,
|
|
62
|
-
resolveToolClient: resolveToolClientMock
|
|
62
|
+
resolveToolClient: resolveToolClientMock,
|
|
63
63
|
}));
|
|
64
64
|
|
|
65
65
|
vi.mock('../src/cli/init-command-handler.js', () => ({
|
|
@@ -73,11 +73,11 @@ vi.mock('../src/cli/init-command-handler.js', () => ({
|
|
|
73
73
|
updated: [],
|
|
74
74
|
skipped: [],
|
|
75
75
|
validation_warnings: [],
|
|
76
|
-
next_steps: []
|
|
77
|
-
}
|
|
76
|
+
next_steps: [],
|
|
77
|
+
},
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
|
-
}
|
|
80
|
+
},
|
|
81
81
|
}));
|
|
82
82
|
|
|
83
83
|
vi.mock('../src/cli/dashboard-command-handler.js', () => ({
|
|
@@ -85,7 +85,7 @@ vi.mock('../src/cli/dashboard-command-handler.js', () => ({
|
|
|
85
85
|
async execute() {
|
|
86
86
|
return { ok: true, data: { message: 'started', port: 3000 } };
|
|
87
87
|
}
|
|
88
|
-
}
|
|
88
|
+
},
|
|
89
89
|
}));
|
|
90
90
|
|
|
91
91
|
vi.mock('../src/cli/run-command-handler.js', () => ({
|
|
@@ -93,7 +93,7 @@ vi.mock('../src/cli/run-command-handler.js', () => ({
|
|
|
93
93
|
async execute() {
|
|
94
94
|
return { ok: true, data: { status: 'running' } };
|
|
95
95
|
}
|
|
96
|
-
}
|
|
96
|
+
},
|
|
97
97
|
}));
|
|
98
98
|
|
|
99
99
|
vi.mock('../src/cli/resume-command-handler.js', () => ({
|
|
@@ -101,7 +101,7 @@ vi.mock('../src/cli/resume-command-handler.js', () => ({
|
|
|
101
101
|
async execute() {
|
|
102
102
|
return { ok: true, data: { resumed: false } };
|
|
103
103
|
}
|
|
104
|
-
}
|
|
104
|
+
},
|
|
105
105
|
}));
|
|
106
106
|
|
|
107
107
|
// ── helpers ───────────────────────────────────────────────────────────────────
|
|
@@ -121,16 +121,22 @@ function asJsonWrites(spy: ReturnType<typeof vi.spyOn>): unknown[] {
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
async function writeMultiProjectYaml(dir: string, content: string): Promise<void> {
|
|
124
|
-
const configDir = path.join(dir, 'agentic', 'orchestrator');
|
|
124
|
+
const configDir = path.join(dir, 'config', 'agentic', 'orchestrator');
|
|
125
125
|
await fs.mkdir(configDir, { recursive: true });
|
|
126
126
|
await fs.writeFile(path.join(configDir, 'multi-project.yaml'), content, 'utf8');
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
async function writeSchemaFile(dir: string): Promise<void> {
|
|
130
|
-
const schemasDir = path.join(dir, 'agentic', 'orchestrator', 'schemas');
|
|
130
|
+
const schemasDir = path.join(dir, 'config', 'agentic', 'orchestrator', 'schemas');
|
|
131
131
|
await fs.mkdir(schemasDir, { recursive: true });
|
|
132
132
|
const repoRoot = path.resolve(import.meta.dirname, '../../../');
|
|
133
|
-
const srcSchema = path.join(
|
|
133
|
+
const srcSchema = path.join(
|
|
134
|
+
repoRoot,
|
|
135
|
+
'agentic',
|
|
136
|
+
'orchestrator',
|
|
137
|
+
'schemas',
|
|
138
|
+
'multi-project.schema.json',
|
|
139
|
+
);
|
|
134
140
|
const destSchema = path.join(schemasDir, 'multi-project.schema.json');
|
|
135
141
|
await fs.copyFile(srcSchema, destSchema);
|
|
136
142
|
}
|
|
@@ -168,7 +174,7 @@ describe('bootstrap runCli', () => {
|
|
|
168
174
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
169
175
|
const code = await runCli(['delete', '--feature-id', 'feat_x', '--yes'], {
|
|
170
176
|
cwd: '/tmp',
|
|
171
|
-
env: process.env
|
|
177
|
+
env: process.env,
|
|
172
178
|
});
|
|
173
179
|
|
|
174
180
|
const writes = asJsonWrites(stdoutSpy);
|
|
@@ -185,14 +191,14 @@ describe('bootstrap runCli', () => {
|
|
|
185
191
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
186
192
|
const code = await runCli(['retry', '--feature-id', 'feat_x'], {
|
|
187
193
|
cwd: '/tmp',
|
|
188
|
-
env: process.env
|
|
194
|
+
env: process.env,
|
|
189
195
|
});
|
|
190
196
|
|
|
191
197
|
const writes = asJsonWrites(stdoutSpy);
|
|
192
198
|
expect(code).toBe(0);
|
|
193
199
|
expect(writes[0]).toMatchObject({
|
|
194
200
|
ok: true,
|
|
195
|
-
data: { feature_id: 'feat_x', retry_count_reset: false, retry_executed: true }
|
|
201
|
+
data: { feature_id: 'feat_x', retry_count_reset: false, retry_executed: true },
|
|
196
202
|
});
|
|
197
203
|
expect(toolCallMock).toHaveBeenCalled();
|
|
198
204
|
});
|
|
@@ -203,7 +209,7 @@ describe('bootstrap runCli', () => {
|
|
|
203
209
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
204
210
|
const code = await runCli(['send', '--feature-id', 'feat_x', '--message', 'hello'], {
|
|
205
211
|
cwd: '/tmp',
|
|
206
|
-
env: process.env
|
|
212
|
+
env: process.env,
|
|
207
213
|
});
|
|
208
214
|
|
|
209
215
|
const writes = asJsonWrites(stdoutSpy);
|
|
@@ -227,7 +233,7 @@ describe('bootstrap runCli', () => {
|
|
|
227
233
|
expect(code).toBe(0);
|
|
228
234
|
expect(writes[0]).toMatchObject({
|
|
229
235
|
ok: true,
|
|
230
|
-
data: expect.objectContaining({ would_clean: expect.any(Array), cleaned: expect.any(Array) })
|
|
236
|
+
data: expect.objectContaining({ would_clean: expect.any(Array), cleaned: expect.any(Array) }),
|
|
231
237
|
});
|
|
232
238
|
});
|
|
233
239
|
|
|
@@ -239,7 +245,7 @@ describe('bootstrap runCli', () => {
|
|
|
239
245
|
expect(code).toBe(1);
|
|
240
246
|
expect(writes[0]).toMatchObject({
|
|
241
247
|
ok: false,
|
|
242
|
-
error: expect.objectContaining({ message: expect.stringContaining('unknown-command') })
|
|
248
|
+
error: expect.objectContaining({ message: expect.stringContaining('unknown-command') }),
|
|
243
249
|
});
|
|
244
250
|
});
|
|
245
251
|
|
|
@@ -281,7 +287,7 @@ describe('bootstrap runCli', () => {
|
|
|
281
287
|
|
|
282
288
|
it('GIVEN_ensureLoaded_throws_WHEN_run_command_executed_THEN_returns_exit_code_1', async () => {
|
|
283
289
|
ensureLoadedMock.mockRejectedValueOnce(
|
|
284
|
-
Object.assign(new Error('config load failed'), { code: 'CONFIG_LOAD_ERROR' })
|
|
290
|
+
Object.assign(new Error('config load failed'), { code: 'CONFIG_LOAD_ERROR' }),
|
|
285
291
|
);
|
|
286
292
|
|
|
287
293
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
@@ -289,7 +295,10 @@ describe('bootstrap runCli', () => {
|
|
|
289
295
|
|
|
290
296
|
const writes = asJsonWrites(stdoutSpy);
|
|
291
297
|
expect(code).toBe(1);
|
|
292
|
-
expect(writes[0]).toMatchObject({
|
|
298
|
+
expect(writes[0]).toMatchObject({
|
|
299
|
+
ok: false,
|
|
300
|
+
error: expect.objectContaining({ message: 'config load failed' }),
|
|
301
|
+
});
|
|
293
302
|
});
|
|
294
303
|
|
|
295
304
|
it('GIVEN_project_flag_with_no_multi_project_yaml_WHEN_executed_THEN_returns_exit_code_1', async () => {
|
|
@@ -301,7 +310,7 @@ describe('bootstrap runCli', () => {
|
|
|
301
310
|
expect(code).toBe(1);
|
|
302
311
|
expect(writes[0]).toMatchObject({
|
|
303
312
|
ok: false,
|
|
304
|
-
error: expect.objectContaining({ message: expect.stringContaining('multi-project.yaml') })
|
|
313
|
+
error: expect.objectContaining({ message: expect.stringContaining('multi-project.yaml') }),
|
|
305
314
|
});
|
|
306
315
|
});
|
|
307
316
|
});
|
|
@@ -341,7 +350,7 @@ projects:
|
|
|
341
350
|
path: ${proj1}
|
|
342
351
|
- name: proj2
|
|
343
352
|
path: ${proj2}
|
|
344
|
-
|
|
353
|
+
`,
|
|
345
354
|
);
|
|
346
355
|
|
|
347
356
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
@@ -354,9 +363,9 @@ projects:
|
|
|
354
363
|
data: {
|
|
355
364
|
projects: expect.arrayContaining([
|
|
356
365
|
expect.objectContaining({ name: 'proj1' }),
|
|
357
|
-
expect.objectContaining({ name: 'proj2' })
|
|
358
|
-
])
|
|
359
|
-
}
|
|
366
|
+
expect.objectContaining({ name: 'proj2' }),
|
|
367
|
+
]),
|
|
368
|
+
},
|
|
360
369
|
});
|
|
361
370
|
});
|
|
362
371
|
|
|
@@ -373,20 +382,25 @@ projects:
|
|
|
373
382
|
path: ${projGood}
|
|
374
383
|
- name: proj-bad
|
|
375
384
|
path: /nonexistent/path/that/will/fail
|
|
376
|
-
|
|
385
|
+
`,
|
|
377
386
|
);
|
|
378
387
|
|
|
379
388
|
// First project succeeds, second causes ensureLoaded to fail
|
|
380
389
|
ensureLoadedMock
|
|
381
390
|
.mockResolvedValueOnce(undefined)
|
|
382
|
-
.mockRejectedValueOnce(
|
|
391
|
+
.mockRejectedValueOnce(
|
|
392
|
+
Object.assign(new Error('project load error'), { code: 'CONFIG_LOAD_ERROR' }),
|
|
393
|
+
);
|
|
383
394
|
|
|
384
395
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
385
396
|
const code = await runCli(['status', '--all'], { cwd: tmpDir, env: process.env });
|
|
386
397
|
|
|
387
398
|
const writes = asJsonWrites(stdoutSpy);
|
|
388
399
|
expect(code).toBe(0);
|
|
389
|
-
const aggregate = writes[0] as {
|
|
400
|
+
const aggregate = writes[0] as {
|
|
401
|
+
ok: boolean;
|
|
402
|
+
data: { projects: Array<{ name: string; status: unknown }> };
|
|
403
|
+
};
|
|
390
404
|
expect(aggregate.ok).toBe(true);
|
|
391
405
|
expect(aggregate.data.projects).toHaveLength(2);
|
|
392
406
|
const badProject = aggregate.data.projects.find((p) => p.name === 'proj-bad');
|
|
@@ -417,7 +431,10 @@ describe('bootstrap multi-project selection branches', () => {
|
|
|
417
431
|
it('GIVEN_single_project_multi_yaml_WHEN_status_no_project_flag_THEN_auto_selects_only_project', async () => {
|
|
418
432
|
const proj1 = path.join(tmpDir, 'proj1');
|
|
419
433
|
await fs.mkdir(proj1, { recursive: true });
|
|
420
|
-
await writeMultiProjectYaml(
|
|
434
|
+
await writeMultiProjectYaml(
|
|
435
|
+
tmpDir,
|
|
436
|
+
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`,
|
|
437
|
+
);
|
|
421
438
|
|
|
422
439
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
423
440
|
const code = await runCli(['status'], { cwd: tmpDir, env: process.env });
|
|
@@ -431,7 +448,7 @@ describe('bootstrap multi-project selection branches', () => {
|
|
|
431
448
|
await fs.mkdir(proj2, { recursive: true });
|
|
432
449
|
await writeMultiProjectYaml(
|
|
433
450
|
tmpDir,
|
|
434
|
-
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n
|
|
451
|
+
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
|
|
435
452
|
);
|
|
436
453
|
|
|
437
454
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
@@ -447,7 +464,7 @@ describe('bootstrap multi-project selection branches', () => {
|
|
|
447
464
|
await fs.mkdir(proj2, { recursive: true });
|
|
448
465
|
await writeMultiProjectYaml(
|
|
449
466
|
tmpDir,
|
|
450
|
-
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\ndefaults:\n default_project: proj1\n
|
|
467
|
+
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\ndefaults:\n default_project: proj1\n`,
|
|
451
468
|
);
|
|
452
469
|
|
|
453
470
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
@@ -463,7 +480,7 @@ describe('bootstrap multi-project selection branches', () => {
|
|
|
463
480
|
await fs.mkdir(proj2, { recursive: true });
|
|
464
481
|
await writeMultiProjectYaml(
|
|
465
482
|
tmpDir,
|
|
466
|
-
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n
|
|
483
|
+
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
|
|
467
484
|
);
|
|
468
485
|
|
|
469
486
|
// Mock stdin/stdout to simulate non-TTY environment
|
|
@@ -479,17 +496,26 @@ describe('bootstrap multi-project selection branches', () => {
|
|
|
479
496
|
expect(code).toBe(1);
|
|
480
497
|
} finally {
|
|
481
498
|
Object.defineProperty(process.stdin, 'isTTY', { value: origStdinIsTTY, configurable: true });
|
|
482
|
-
Object.defineProperty(process.stdout, 'isTTY', {
|
|
499
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
500
|
+
value: origStdoutIsTTY,
|
|
501
|
+
configurable: true,
|
|
502
|
+
});
|
|
483
503
|
}
|
|
484
504
|
});
|
|
485
505
|
|
|
486
506
|
it('GIVEN_project_flag_and_project_not_found_WHEN_run_THEN_returns_exit_code_1', async () => {
|
|
487
507
|
const proj1 = path.join(tmpDir, 'proj1');
|
|
488
508
|
await fs.mkdir(proj1, { recursive: true });
|
|
489
|
-
await writeMultiProjectYaml(
|
|
509
|
+
await writeMultiProjectYaml(
|
|
510
|
+
tmpDir,
|
|
511
|
+
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`,
|
|
512
|
+
);
|
|
490
513
|
|
|
491
514
|
const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
|
|
492
|
-
const code = await runCli(['status', '--project', 'nonexistent'], {
|
|
515
|
+
const code = await runCli(['status', '--project', 'nonexistent'], {
|
|
516
|
+
cwd: tmpDir,
|
|
517
|
+
env: process.env,
|
|
518
|
+
});
|
|
493
519
|
expect(code).toBe(1);
|
|
494
520
|
});
|
|
495
521
|
|
|
@@ -514,7 +540,7 @@ describe('bootstrap multi-project selection branches', () => {
|
|
|
514
540
|
await fs.mkdir(proj2, { recursive: true });
|
|
515
541
|
await writeMultiProjectYaml(
|
|
516
542
|
tmpDir,
|
|
517
|
-
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n
|
|
543
|
+
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
|
|
518
544
|
);
|
|
519
545
|
|
|
520
546
|
// Simulate TTY and user entering '1' to select first project
|
|
@@ -532,7 +558,10 @@ describe('bootstrap multi-project selection branches', () => {
|
|
|
532
558
|
expect(readlineQuestionMock).toHaveBeenCalled();
|
|
533
559
|
} finally {
|
|
534
560
|
Object.defineProperty(process.stdin, 'isTTY', { value: origStdinIsTTY, configurable: true });
|
|
535
|
-
Object.defineProperty(process.stdout, 'isTTY', {
|
|
561
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
562
|
+
value: origStdoutIsTTY,
|
|
563
|
+
configurable: true,
|
|
564
|
+
});
|
|
536
565
|
readlineQuestionMock.mockReset();
|
|
537
566
|
}
|
|
538
567
|
});
|
|
@@ -544,7 +573,7 @@ describe('bootstrap multi-project selection branches', () => {
|
|
|
544
573
|
await fs.mkdir(proj2, { recursive: true });
|
|
545
574
|
await writeMultiProjectYaml(
|
|
546
575
|
tmpDir,
|
|
547
|
-
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n
|
|
576
|
+
`version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
|
|
548
577
|
);
|
|
549
578
|
|
|
550
579
|
// Simulate TTY and user entering 'abc' (invalid number)
|
|
@@ -561,7 +590,10 @@ describe('bootstrap multi-project selection branches', () => {
|
|
|
561
590
|
expect(code).toBe(1);
|
|
562
591
|
} finally {
|
|
563
592
|
Object.defineProperty(process.stdin, 'isTTY', { value: origStdinIsTTY, configurable: true });
|
|
564
|
-
Object.defineProperty(process.stdout, 'isTTY', {
|
|
593
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
594
|
+
value: origStdoutIsTTY,
|
|
595
|
+
configurable: true,
|
|
596
|
+
});
|
|
565
597
|
readlineQuestionMock.mockReset();
|
|
566
598
|
}
|
|
567
599
|
});
|
|
@@ -52,15 +52,19 @@ describe('CleanupCommandHandler', () => {
|
|
|
52
52
|
vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
|
|
53
53
|
|
|
54
54
|
const callMock = vi.fn();
|
|
55
|
-
const handler = new CleanupCommandHandler(
|
|
55
|
+
const handler = new CleanupCommandHandler(
|
|
56
|
+
makeToolClient(callMock) as never,
|
|
57
|
+
'run:test',
|
|
58
|
+
'/repo',
|
|
59
|
+
);
|
|
56
60
|
const result = await handler.execute({ command: 'cleanup', dry_run: true });
|
|
57
61
|
|
|
58
62
|
expect(result).toMatchObject({
|
|
59
63
|
ok: true,
|
|
60
64
|
data: {
|
|
61
65
|
would_clean: [{ feature_id: 'feature_a', reason: 'terminal status: merged' }],
|
|
62
|
-
cleaned: []
|
|
63
|
-
}
|
|
66
|
+
cleaned: [],
|
|
67
|
+
},
|
|
64
68
|
});
|
|
65
69
|
expect(callMock).not.toHaveBeenCalled();
|
|
66
70
|
});
|
|
@@ -81,20 +85,24 @@ describe('CleanupCommandHandler', () => {
|
|
|
81
85
|
vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
|
|
82
86
|
|
|
83
87
|
const callMock = vi.fn(async () => ({ ok: true, data: {} }));
|
|
84
|
-
const handler = new CleanupCommandHandler(
|
|
88
|
+
const handler = new CleanupCommandHandler(
|
|
89
|
+
makeToolClient(callMock) as never,
|
|
90
|
+
'run:test',
|
|
91
|
+
'/repo',
|
|
92
|
+
);
|
|
85
93
|
const result = await handler.execute({ command: 'cleanup', yes: true });
|
|
86
94
|
|
|
87
95
|
expect(result).toMatchObject({
|
|
88
96
|
ok: true,
|
|
89
97
|
data: {
|
|
90
98
|
would_clean: [{ feature_id: 'feature_a' }],
|
|
91
|
-
cleaned: [{ feature_id: 'feature_a' }]
|
|
92
|
-
}
|
|
99
|
+
cleaned: [{ feature_id: 'feature_a' }],
|
|
100
|
+
},
|
|
93
101
|
});
|
|
94
102
|
expect(callMock).toHaveBeenCalledWith(
|
|
95
103
|
TOOLS.FEATURE_DELETE,
|
|
96
104
|
expect.objectContaining({ feature_id: 'feature_a', confirm: true, dry_run: false }),
|
|
97
|
-
expect.any(Object)
|
|
105
|
+
expect.any(Object),
|
|
98
106
|
);
|
|
99
107
|
});
|
|
100
108
|
|
|
@@ -112,19 +120,23 @@ describe('CleanupCommandHandler', () => {
|
|
|
112
120
|
vi.spyOn(fs, 'readdir').mockResolvedValue([
|
|
113
121
|
{ name: 'orphan_feature', isDirectory: () => true },
|
|
114
122
|
{ name: 'feature_a', isDirectory: () => true },
|
|
115
|
-
{ name: 'not_a_dir.txt', isDirectory: () => false }
|
|
123
|
+
{ name: 'not_a_dir.txt', isDirectory: () => false },
|
|
116
124
|
] as never);
|
|
117
125
|
|
|
118
126
|
const callMock = vi.fn();
|
|
119
|
-
const handler = new CleanupCommandHandler(
|
|
127
|
+
const handler = new CleanupCommandHandler(
|
|
128
|
+
makeToolClient(callMock) as never,
|
|
129
|
+
'run:test',
|
|
130
|
+
'/repo',
|
|
131
|
+
);
|
|
120
132
|
const result = await handler.execute({ command: 'cleanup', dry_run: true });
|
|
121
133
|
|
|
122
134
|
expect(result).toMatchObject({
|
|
123
135
|
ok: true,
|
|
124
136
|
data: {
|
|
125
137
|
would_clean: [{ feature_id: 'orphan_feature', reason: 'orphan worktree' }],
|
|
126
|
-
cleaned: []
|
|
127
|
-
}
|
|
138
|
+
cleaned: [],
|
|
139
|
+
},
|
|
128
140
|
});
|
|
129
141
|
expect(callMock).not.toHaveBeenCalled();
|
|
130
142
|
});
|
|
@@ -145,7 +157,11 @@ describe('CleanupCommandHandler', () => {
|
|
|
145
157
|
vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
|
|
146
158
|
|
|
147
159
|
const callMock = vi.fn().mockRejectedValue(new Error('delete failed'));
|
|
148
|
-
const handler = new CleanupCommandHandler(
|
|
160
|
+
const handler = new CleanupCommandHandler(
|
|
161
|
+
makeToolClient(callMock) as never,
|
|
162
|
+
'run:test',
|
|
163
|
+
'/repo',
|
|
164
|
+
);
|
|
149
165
|
const result = await handler.execute({ command: 'cleanup', yes: true });
|
|
150
166
|
|
|
151
167
|
expect(result).toMatchObject({
|
|
@@ -153,8 +169,8 @@ describe('CleanupCommandHandler', () => {
|
|
|
153
169
|
data: {
|
|
154
170
|
would_clean: [{ feature_id: 'feature_a' }],
|
|
155
171
|
cleaned: [],
|
|
156
|
-
skipped: [{ feature_id: 'feature_a' }]
|
|
157
|
-
}
|
|
172
|
+
skipped: [{ feature_id: 'feature_a' }],
|
|
173
|
+
},
|
|
158
174
|
});
|
|
159
175
|
});
|
|
160
176
|
|
|
@@ -173,23 +189,35 @@ describe('CleanupCommandHandler', () => {
|
|
|
173
189
|
});
|
|
174
190
|
vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
|
|
175
191
|
|
|
176
|
-
const defaultHandler = new CleanupCommandHandler(
|
|
192
|
+
const defaultHandler = new CleanupCommandHandler(
|
|
193
|
+
makeToolClient() as never,
|
|
194
|
+
'run:test',
|
|
195
|
+
'/repo',
|
|
196
|
+
3600,
|
|
197
|
+
false,
|
|
198
|
+
);
|
|
177
199
|
const defaultResult = await defaultHandler.execute({ command: 'cleanup', dry_run: true });
|
|
178
200
|
expect(defaultResult).toMatchObject({
|
|
179
201
|
ok: true,
|
|
180
202
|
data: {
|
|
181
|
-
would_clean: []
|
|
182
|
-
}
|
|
203
|
+
would_clean: [],
|
|
204
|
+
},
|
|
183
205
|
});
|
|
184
206
|
|
|
185
|
-
const autoHandler = new CleanupCommandHandler(
|
|
207
|
+
const autoHandler = new CleanupCommandHandler(
|
|
208
|
+
makeToolClient() as never,
|
|
209
|
+
'run:test',
|
|
210
|
+
'/repo',
|
|
211
|
+
3600,
|
|
212
|
+
true,
|
|
213
|
+
);
|
|
186
214
|
const autoResult = await autoHandler.execute({ command: 'cleanup', dry_run: true });
|
|
187
215
|
expect(autoResult).toMatchObject({
|
|
188
216
|
ok: true,
|
|
189
217
|
data: {
|
|
190
218
|
would_clean: [{ feature_id: 'feature_merged', reason: 'terminal status: merged' }],
|
|
191
|
-
cleaned: []
|
|
192
|
-
}
|
|
219
|
+
cleaned: [],
|
|
220
|
+
},
|
|
193
221
|
});
|
|
194
222
|
});
|
|
195
223
|
});
|
|
@@ -219,14 +247,20 @@ describe('CleanupCommandHandler branch coverage', () => {
|
|
|
219
247
|
// Allow readdir to succeed with empty array so isRunLeaseInactive checks candidate paths
|
|
220
248
|
vi.spyOn(fs, 'readdir').mockResolvedValue([]);
|
|
221
249
|
|
|
222
|
-
const handler = new CleanupCommandHandler(
|
|
250
|
+
const handler = new CleanupCommandHandler(
|
|
251
|
+
makeToolClient() as never,
|
|
252
|
+
'run:test',
|
|
253
|
+
'/repo',
|
|
254
|
+
3600,
|
|
255
|
+
false,
|
|
256
|
+
);
|
|
223
257
|
const result = await handler.execute({ command: 'cleanup', dry_run: true });
|
|
224
258
|
expect(result).toMatchObject({
|
|
225
259
|
ok: true,
|
|
226
260
|
data: {
|
|
227
261
|
would_clean: [],
|
|
228
|
-
skipped: [{ feature_id: 'feature_active_lease', reason: 'run lease still active' }]
|
|
229
|
-
}
|
|
262
|
+
skipped: [{ feature_id: 'feature_active_lease', reason: 'run lease still active' }],
|
|
263
|
+
},
|
|
230
264
|
});
|
|
231
265
|
});
|
|
232
266
|
|
|
@@ -245,14 +279,20 @@ describe('CleanupCommandHandler branch coverage', () => {
|
|
|
245
279
|
});
|
|
246
280
|
vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
|
|
247
281
|
|
|
248
|
-
const handler = new CleanupCommandHandler(
|
|
282
|
+
const handler = new CleanupCommandHandler(
|
|
283
|
+
makeToolClient() as never,
|
|
284
|
+
'run:test',
|
|
285
|
+
'/repo',
|
|
286
|
+
3600,
|
|
287
|
+
false,
|
|
288
|
+
);
|
|
249
289
|
const result = await handler.execute({ command: 'cleanup', dry_run: true });
|
|
250
290
|
expect(result).toMatchObject({
|
|
251
291
|
ok: true,
|
|
252
292
|
data: {
|
|
253
293
|
would_clean: [],
|
|
254
|
-
skipped: [{ feature_id: 'feature_grace_period', reason: 'not eligible' }]
|
|
255
|
-
}
|
|
294
|
+
skipped: [{ feature_id: 'feature_grace_period', reason: 'not eligible' }],
|
|
295
|
+
},
|
|
256
296
|
});
|
|
257
297
|
});
|
|
258
298
|
|
|
@@ -266,13 +306,21 @@ describe('CleanupCommandHandler branch coverage', () => {
|
|
|
266
306
|
});
|
|
267
307
|
vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
|
|
268
308
|
|
|
269
|
-
const handler = new CleanupCommandHandler(
|
|
309
|
+
const handler = new CleanupCommandHandler(
|
|
310
|
+
makeToolClient() as never,
|
|
311
|
+
'run:test',
|
|
312
|
+
'/repo',
|
|
313
|
+
3600,
|
|
314
|
+
true,
|
|
315
|
+
);
|
|
270
316
|
const result = await handler.execute({ command: 'cleanup', dry_run: true });
|
|
271
317
|
expect(result).toMatchObject({
|
|
272
318
|
ok: true,
|
|
273
319
|
data: {
|
|
274
|
-
would_clean: [
|
|
275
|
-
|
|
320
|
+
would_clean: [
|
|
321
|
+
{ feature_id: 'feature_no_state', reason: 'merged residue with missing state' },
|
|
322
|
+
],
|
|
323
|
+
},
|
|
276
324
|
});
|
|
277
325
|
});
|
|
278
326
|
});
|
|
@@ -288,14 +336,20 @@ describe('CleanupCommandHandler state unreadable branch', () => {
|
|
|
288
336
|
});
|
|
289
337
|
vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
|
|
290
338
|
|
|
291
|
-
const handler = new CleanupCommandHandler(
|
|
339
|
+
const handler = new CleanupCommandHandler(
|
|
340
|
+
makeToolClient() as never,
|
|
341
|
+
'run:test',
|
|
342
|
+
'/repo',
|
|
343
|
+
3600,
|
|
344
|
+
false,
|
|
345
|
+
);
|
|
292
346
|
const result = await handler.execute({ command: 'cleanup', dry_run: true });
|
|
293
347
|
expect(result).toMatchObject({
|
|
294
348
|
ok: true,
|
|
295
349
|
data: {
|
|
296
350
|
would_clean: [],
|
|
297
|
-
skipped: [{ feature_id: 'feature_bad_state', reason: 'state unreadable' }]
|
|
298
|
-
}
|
|
351
|
+
skipped: [{ feature_id: 'feature_bad_state', reason: 'state unreadable' }],
|
|
352
|
+
},
|
|
299
353
|
});
|
|
300
354
|
});
|
|
301
355
|
});
|