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
|
@@ -6,12 +6,15 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
|
6
6
|
const runGateModeMock = vi.hoisted(() => vi.fn());
|
|
7
7
|
|
|
8
8
|
vi.mock('../src/core/gates.js', () => ({
|
|
9
|
-
runGateMode: runGateModeMock
|
|
9
|
+
runGateMode: runGateModeMock,
|
|
10
10
|
}));
|
|
11
11
|
|
|
12
12
|
import { GateService } from '../src/application/services/gate-service.js';
|
|
13
13
|
import type { GateServicePort } from '../src/application/services/gate-service.js';
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
interpolateGateCommands,
|
|
16
|
+
isIncrementalMode,
|
|
17
|
+
} from '../src/application/services/gate-interpolation-service.js';
|
|
15
18
|
|
|
16
19
|
describe('incremental gate execution', () => {
|
|
17
20
|
let tempDir: string;
|
|
@@ -39,22 +42,36 @@ describe('incremental gate execution', () => {
|
|
|
39
42
|
evidence_path: path.join(tempDir, 'evidence.json'),
|
|
40
43
|
latest_path: path.join(tempDir, 'latest.json'),
|
|
41
44
|
coverage: null,
|
|
42
|
-
thresholds: {}
|
|
45
|
+
thresholds: {},
|
|
43
46
|
});
|
|
44
47
|
|
|
45
48
|
const profile = {
|
|
46
49
|
modes: {
|
|
47
|
-
full: [
|
|
50
|
+
full: [
|
|
51
|
+
{
|
|
52
|
+
name: 'test_full',
|
|
53
|
+
cmd: ['npx', 'vitest', 'run', '--changed', '{base_branch}'],
|
|
54
|
+
timeout_seconds: 60,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
48
57
|
},
|
|
49
|
-
thresholds: {}
|
|
58
|
+
thresholds: {},
|
|
50
59
|
};
|
|
51
60
|
|
|
52
61
|
const port: GateServicePort = buildPort(tempDir, { profiles: { default: profile } });
|
|
53
62
|
const service = new GateService(port);
|
|
54
63
|
await service.gatesRun('feature-abc', 'default', 'full');
|
|
55
64
|
|
|
56
|
-
const callArgs = runGateModeMock.mock.calls[0][0] as {
|
|
57
|
-
|
|
65
|
+
const callArgs = runGateModeMock.mock.calls[0][0] as {
|
|
66
|
+
profile: { modes: { full: Array<{ cmd: string[] }> } };
|
|
67
|
+
};
|
|
68
|
+
expect(callArgs.profile.modes.full[0].cmd).toEqual([
|
|
69
|
+
'npx',
|
|
70
|
+
'vitest',
|
|
71
|
+
'run',
|
|
72
|
+
'--changed',
|
|
73
|
+
'{base_branch}',
|
|
74
|
+
]);
|
|
58
75
|
});
|
|
59
76
|
|
|
60
77
|
it('GIVEN feature_id in command WHEN interpolateGateCommands called THEN feature_id substituted correctly', () => {
|
|
@@ -78,7 +95,11 @@ describe('incremental gate execution', () => {
|
|
|
78
95
|
it('GIVEN gate run in fast mode with base_branch command WHEN GateService runs THEN command has base_branch interpolated', async () => {
|
|
79
96
|
const evidenceFile = path.join(tempDir, 'gate-fast-123.json');
|
|
80
97
|
const latestFile = path.join(tempDir, 'latest-fast.json');
|
|
81
|
-
const initialEvidence = JSON.stringify({
|
|
98
|
+
const initialEvidence = JSON.stringify({
|
|
99
|
+
feature_id: 'feature-123',
|
|
100
|
+
mode: 'fast',
|
|
101
|
+
overall: 'pass',
|
|
102
|
+
});
|
|
82
103
|
await fs.writeFile(evidenceFile, initialEvidence, 'utf8');
|
|
83
104
|
await fs.writeFile(latestFile, initialEvidence, 'utf8');
|
|
84
105
|
|
|
@@ -88,14 +109,20 @@ describe('incremental gate execution', () => {
|
|
|
88
109
|
evidence_path: evidenceFile,
|
|
89
110
|
latest_path: latestFile,
|
|
90
111
|
coverage: null,
|
|
91
|
-
thresholds: {}
|
|
112
|
+
thresholds: {},
|
|
92
113
|
});
|
|
93
114
|
|
|
94
115
|
const profile = {
|
|
95
116
|
modes: {
|
|
96
|
-
fast: [
|
|
117
|
+
fast: [
|
|
118
|
+
{
|
|
119
|
+
name: 'test_incremental',
|
|
120
|
+
cmd: ['npx', 'vitest', 'run', '--changed', '{base_branch}'],
|
|
121
|
+
timeout_seconds: 60,
|
|
122
|
+
},
|
|
123
|
+
],
|
|
97
124
|
},
|
|
98
|
-
thresholds: {}
|
|
125
|
+
thresholds: {},
|
|
99
126
|
};
|
|
100
127
|
|
|
101
128
|
const port: GateServicePort = buildPort(tempDir, { profiles: { default: profile } });
|
|
@@ -103,11 +130,22 @@ describe('incremental gate execution', () => {
|
|
|
103
130
|
await service.gatesRun('feature-123', 'default', 'fast');
|
|
104
131
|
|
|
105
132
|
expect(runGateModeMock).toHaveBeenCalledOnce();
|
|
106
|
-
const callArgs = runGateModeMock.mock.calls[0][0] as {
|
|
107
|
-
|
|
133
|
+
const callArgs = runGateModeMock.mock.calls[0][0] as {
|
|
134
|
+
profile: { modes: { fast: Array<{ cmd: string[] }> } };
|
|
135
|
+
};
|
|
136
|
+
expect(callArgs.profile.modes.fast[0].cmd).toEqual([
|
|
137
|
+
'npx',
|
|
138
|
+
'vitest',
|
|
139
|
+
'run',
|
|
140
|
+
'--changed',
|
|
141
|
+
'main',
|
|
142
|
+
]);
|
|
108
143
|
|
|
109
144
|
// Verify evidence files were augmented with incremental metadata
|
|
110
|
-
const updatedEvidence = JSON.parse(await fs.readFile(evidenceFile, 'utf8')) as Record<
|
|
145
|
+
const updatedEvidence = JSON.parse(await fs.readFile(evidenceFile, 'utf8')) as Record<
|
|
146
|
+
string,
|
|
147
|
+
unknown
|
|
148
|
+
>;
|
|
111
149
|
expect(updatedEvidence['skipped_reason']).toBe('incremental_mode');
|
|
112
150
|
expect(updatedEvidence['base_branch']).toBe('main');
|
|
113
151
|
});
|
|
@@ -122,16 +160,17 @@ function buildPort(tempDir: string, gatesConfig: Record<string, unknown>): GateS
|
|
|
122
160
|
execution: {
|
|
123
161
|
retry_policy: { transient_max_retries: 0, transient_error_codes: [] },
|
|
124
162
|
env_allowlist: [],
|
|
125
|
-
default_step_timeout_seconds: 60
|
|
163
|
+
default_step_timeout_seconds: 60,
|
|
126
164
|
},
|
|
127
|
-
testing: { coverage: { minimums: { line: 0, branch: 0 }, targets: { line: 1, branch: 1 } } }
|
|
128
|
-
}),
|
|
129
|
-
readState: (_featureId: string) => Promise.resolve({
|
|
130
|
-
frontMatter: { status: 'building', version: 1, gate_profile: 'default', gates: {} }
|
|
165
|
+
testing: { coverage: { minimums: { line: 0, branch: 0 }, targets: { line: 1, branch: 1 } } },
|
|
131
166
|
}),
|
|
167
|
+
readState: (_featureId: string) =>
|
|
168
|
+
Promise.resolve({
|
|
169
|
+
frontMatter: { status: 'building', version: 1, gate_profile: 'default', gates: {} },
|
|
170
|
+
}),
|
|
132
171
|
updateState: vi.fn().mockResolvedValue({}),
|
|
133
172
|
worktreePath: () => tempDir,
|
|
134
173
|
logsPath: () => tempDir,
|
|
135
|
-
evidencePath: () => tempDir
|
|
174
|
+
evidencePath: () => tempDir,
|
|
136
175
|
};
|
|
137
176
|
}
|
|
@@ -8,13 +8,19 @@ const execFileMock = vi.hoisted(() => vi.fn());
|
|
|
8
8
|
|
|
9
9
|
vi.mock('node:child_process', () => ({
|
|
10
10
|
execFile: (...args: unknown[]) => {
|
|
11
|
-
const cb = args[args.length - 1] as (
|
|
12
|
-
|
|
11
|
+
const cb = args[args.length - 1] as (
|
|
12
|
+
err: null | Error,
|
|
13
|
+
result?: { stdout: string; stderr: string },
|
|
14
|
+
) => void;
|
|
15
|
+
const promise = execFileMock(...args.slice(0, -1)) as Promise<{
|
|
16
|
+
stdout: string;
|
|
17
|
+
stderr: string;
|
|
18
|
+
}>;
|
|
13
19
|
void promise.then(
|
|
14
20
|
(result) => cb(null, result),
|
|
15
|
-
(err: Error) => cb(err)
|
|
21
|
+
(err: Error) => cb(err),
|
|
16
22
|
);
|
|
17
|
-
}
|
|
23
|
+
},
|
|
18
24
|
}));
|
|
19
25
|
|
|
20
26
|
import { InitCommandHandler } from '../src/cli/init-command-handler.js';
|
|
@@ -46,7 +52,7 @@ describe('InitCommandHandler', () => {
|
|
|
46
52
|
await fs.writeFile(
|
|
47
53
|
path.join(cwd, '.git', 'config'),
|
|
48
54
|
`[core]\n repositoryformatversion = 0\n[remote "origin"]\n url = https://github.com/example/repo.git\n fetch = +refs/heads/*:refs/remotes/origin/*\n`,
|
|
49
|
-
'utf8'
|
|
55
|
+
'utf8',
|
|
50
56
|
);
|
|
51
57
|
|
|
52
58
|
// Mock git symbolic-ref to return origin/main
|
|
@@ -57,47 +63,68 @@ describe('InitCommandHandler', () => {
|
|
|
57
63
|
|
|
58
64
|
expect(result.ok).toBe(true);
|
|
59
65
|
expect(result.data.command).toBe('init');
|
|
60
|
-
expect(result.data.created).toContain('agentic/orchestrator/policy.yaml');
|
|
61
|
-
expect(result.data.created).toContain('agentic/orchestrator/gates.yaml');
|
|
62
|
-
expect(result.data.created).toContain('agentic/orchestrator/agents.yaml');
|
|
63
|
-
expect(result.data.created).toContain('agentic/orchestrator/adapters.yaml');
|
|
64
|
-
expect(result.data.created).toContain('agentic/orchestrator/prompts/planner.system.md');
|
|
66
|
+
expect(result.data.created).toContain('config/agentic/orchestrator/policy.yaml');
|
|
67
|
+
expect(result.data.created).toContain('config/agentic/orchestrator/gates.yaml');
|
|
68
|
+
expect(result.data.created).toContain('config/agentic/orchestrator/agents.yaml');
|
|
69
|
+
expect(result.data.created).toContain('config/agentic/orchestrator/adapters.yaml');
|
|
70
|
+
expect(result.data.created).toContain('config/agentic/orchestrator/prompts/planner.system.md');
|
|
65
71
|
expect(result.data.skipped).toHaveLength(0);
|
|
66
72
|
expect(result.data.updated).toHaveLength(0);
|
|
67
73
|
expect(result.data.validation_warnings).toHaveLength(0);
|
|
68
74
|
|
|
69
75
|
// Verify files were created
|
|
70
|
-
const policyContent = await fs.readFile(
|
|
76
|
+
const policyContent = await fs.readFile(
|
|
77
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
78
|
+
'utf8',
|
|
79
|
+
);
|
|
71
80
|
expect(policyContent).toContain('base_branch: main');
|
|
72
81
|
// lean policy does not include advanced fields like testing.framework
|
|
73
82
|
expect(policyContent).not.toContain('framework: vitest');
|
|
74
83
|
expect(policyContent).toContain('notifications:');
|
|
75
84
|
|
|
76
|
-
const gatesContent = await fs.readFile(
|
|
85
|
+
const gatesContent = await fs.readFile(
|
|
86
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
|
|
87
|
+
'utf8',
|
|
88
|
+
);
|
|
77
89
|
expect(gatesContent).toContain('version: 1');
|
|
78
90
|
expect(gatesContent).toContain('profiles:');
|
|
79
91
|
|
|
80
|
-
const agentsContent = await fs.readFile(
|
|
92
|
+
const agentsContent = await fs.readFile(
|
|
93
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'agents.yaml'),
|
|
94
|
+
'utf8',
|
|
95
|
+
);
|
|
81
96
|
expect(agentsContent).toContain('version: 1');
|
|
82
97
|
expect(agentsContent).toContain('roles:');
|
|
83
98
|
expect(agentsContent).toContain('default_provider: custom');
|
|
84
99
|
expect(agentsContent).toContain('default_model: local-default');
|
|
85
100
|
|
|
86
|
-
const adaptersContent = await fs.readFile(
|
|
101
|
+
const adaptersContent = await fs.readFile(
|
|
102
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'adapters.yaml'),
|
|
103
|
+
'utf8',
|
|
104
|
+
);
|
|
87
105
|
expect(adaptersContent).toContain('activity-detector: process-heuristic');
|
|
88
106
|
expect(adaptersContent).toContain('scm-provider: github');
|
|
89
107
|
|
|
90
108
|
await expect(
|
|
91
|
-
fs.readFile(
|
|
109
|
+
fs.readFile(
|
|
110
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'prompts', 'planner.system.md'),
|
|
111
|
+
'utf8',
|
|
112
|
+
),
|
|
92
113
|
).resolves.toContain('planner');
|
|
93
|
-
await expect(
|
|
114
|
+
await expect(
|
|
115
|
+
fs.stat(path.join(cwd, 'config', 'agentic', 'orchestrator', 'schemas')),
|
|
116
|
+
).rejects.toThrow();
|
|
94
117
|
});
|
|
95
118
|
|
|
96
119
|
it('GIVEN_existing_config_WHEN_init_without_force_THEN_skips_existing_files', async () => {
|
|
97
120
|
// Pre-create the orchestrator directory and policy.yaml
|
|
98
|
-
const orchestratorDir = path.join(cwd, 'agentic', 'orchestrator');
|
|
121
|
+
const orchestratorDir = path.join(cwd, 'config', 'agentic', 'orchestrator');
|
|
99
122
|
await fs.mkdir(orchestratorDir, { recursive: true });
|
|
100
|
-
await fs.writeFile(
|
|
123
|
+
await fs.writeFile(
|
|
124
|
+
path.join(orchestratorDir, 'policy.yaml'),
|
|
125
|
+
'version: 1\n# existing\n',
|
|
126
|
+
'utf8',
|
|
127
|
+
);
|
|
101
128
|
|
|
102
129
|
execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
|
|
103
130
|
|
|
@@ -105,9 +132,9 @@ describe('InitCommandHandler', () => {
|
|
|
105
132
|
const result = await handler.execute({ auto: true });
|
|
106
133
|
|
|
107
134
|
expect(result.ok).toBe(true);
|
|
108
|
-
expect(result.data.skipped).toContain('agentic/orchestrator/policy.yaml');
|
|
109
|
-
expect(result.data.created).not.toContain('agentic/orchestrator/policy.yaml');
|
|
110
|
-
expect(result.data.updated).not.toContain('agentic/orchestrator/policy.yaml');
|
|
135
|
+
expect(result.data.skipped).toContain('config/agentic/orchestrator/policy.yaml');
|
|
136
|
+
expect(result.data.created).not.toContain('config/agentic/orchestrator/policy.yaml');
|
|
137
|
+
expect(result.data.updated).not.toContain('config/agentic/orchestrator/policy.yaml');
|
|
111
138
|
|
|
112
139
|
// Verify file was NOT overwritten
|
|
113
140
|
const content = await fs.readFile(path.join(orchestratorDir, 'policy.yaml'), 'utf8');
|
|
@@ -116,9 +143,13 @@ describe('InitCommandHandler', () => {
|
|
|
116
143
|
|
|
117
144
|
it('GIVEN_existing_config_WHEN_init_with_force_THEN_overwrites_files', async () => {
|
|
118
145
|
// Pre-create the orchestrator directory and policy.yaml
|
|
119
|
-
const orchestratorDir = path.join(cwd, 'agentic', 'orchestrator');
|
|
146
|
+
const orchestratorDir = path.join(cwd, 'config', 'agentic', 'orchestrator');
|
|
120
147
|
await fs.mkdir(orchestratorDir, { recursive: true });
|
|
121
|
-
await fs.writeFile(
|
|
148
|
+
await fs.writeFile(
|
|
149
|
+
path.join(orchestratorDir, 'policy.yaml'),
|
|
150
|
+
'version: 1\n# existing\n',
|
|
151
|
+
'utf8',
|
|
152
|
+
);
|
|
122
153
|
|
|
123
154
|
execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
|
|
124
155
|
|
|
@@ -126,8 +157,8 @@ describe('InitCommandHandler', () => {
|
|
|
126
157
|
const result = await handler.execute({ auto: true, force: true });
|
|
127
158
|
|
|
128
159
|
expect(result.ok).toBe(true);
|
|
129
|
-
expect(result.data.updated).toContain('agentic/orchestrator/policy.yaml');
|
|
130
|
-
expect(result.data.skipped).not.toContain('agentic/orchestrator/policy.yaml');
|
|
160
|
+
expect(result.data.updated).toContain('config/agentic/orchestrator/policy.yaml');
|
|
161
|
+
expect(result.data.skipped).not.toContain('config/agentic/orchestrator/policy.yaml');
|
|
131
162
|
|
|
132
163
|
// Verify file WAS overwritten with generated content (lean policy by default)
|
|
133
164
|
const content = await fs.readFile(path.join(orchestratorDir, 'policy.yaml'), 'utf8');
|
|
@@ -144,11 +175,14 @@ describe('InitCommandHandler', () => {
|
|
|
144
175
|
const result = await handler.execute({ auto: true });
|
|
145
176
|
|
|
146
177
|
expect(result.ok).toBe(true);
|
|
147
|
-
expect(result.data.created).toContain('agentic/orchestrator/policy.yaml');
|
|
178
|
+
expect(result.data.created).toContain('config/agentic/orchestrator/policy.yaml');
|
|
148
179
|
expect(result.data.validation_warnings).toHaveLength(0);
|
|
149
180
|
|
|
150
181
|
// Should default to main branch
|
|
151
|
-
const policyContent = await fs.readFile(
|
|
182
|
+
const policyContent = await fs.readFile(
|
|
183
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
184
|
+
'utf8',
|
|
185
|
+
);
|
|
152
186
|
expect(policyContent).toContain('base_branch: main');
|
|
153
187
|
});
|
|
154
188
|
|
|
@@ -156,7 +190,7 @@ describe('InitCommandHandler', () => {
|
|
|
156
190
|
await fs.writeFile(
|
|
157
191
|
path.join(cwd, 'package.json'),
|
|
158
192
|
JSON.stringify({ devDependencies: { jest: '^29.0.0' } }),
|
|
159
|
-
'utf8'
|
|
193
|
+
'utf8',
|
|
160
194
|
);
|
|
161
195
|
execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
|
|
162
196
|
|
|
@@ -164,20 +198,30 @@ describe('InitCommandHandler', () => {
|
|
|
164
198
|
const result = await handler.execute({ auto: true });
|
|
165
199
|
|
|
166
200
|
expect(result.ok).toBe(true);
|
|
167
|
-
const gatesContent = await fs.readFile(
|
|
201
|
+
const gatesContent = await fs.readFile(
|
|
202
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
|
|
203
|
+
'utf8',
|
|
204
|
+
);
|
|
168
205
|
expect(gatesContent).toContain('"npx"');
|
|
169
206
|
expect(gatesContent).toContain('"jest"');
|
|
170
207
|
});
|
|
171
208
|
|
|
172
209
|
it('GIVEN_pyproject_toml_WHEN_init_THEN_generates_pytest_gate_commands', async () => {
|
|
173
|
-
await fs.writeFile(
|
|
210
|
+
await fs.writeFile(
|
|
211
|
+
path.join(cwd, 'pyproject.toml'),
|
|
212
|
+
'[tool.poetry]\nname = "myproject"\n',
|
|
213
|
+
'utf8',
|
|
214
|
+
);
|
|
174
215
|
execFileMock.mockRejectedValue(new Error('not git'));
|
|
175
216
|
|
|
176
217
|
const handler = new InitCommandHandler(cwd);
|
|
177
218
|
const result = await handler.execute({ auto: true });
|
|
178
219
|
|
|
179
220
|
expect(result.ok).toBe(true);
|
|
180
|
-
const gatesContent = await fs.readFile(
|
|
221
|
+
const gatesContent = await fs.readFile(
|
|
222
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
|
|
223
|
+
'utf8',
|
|
224
|
+
);
|
|
181
225
|
expect(gatesContent).toContain('"pytest"');
|
|
182
226
|
});
|
|
183
227
|
|
|
@@ -189,7 +233,10 @@ describe('InitCommandHandler', () => {
|
|
|
189
233
|
const result = await handler.execute({ auto: true });
|
|
190
234
|
|
|
191
235
|
expect(result.ok).toBe(true);
|
|
192
|
-
const gatesContent = await fs.readFile(
|
|
236
|
+
const gatesContent = await fs.readFile(
|
|
237
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
|
|
238
|
+
'utf8',
|
|
239
|
+
);
|
|
193
240
|
expect(gatesContent).toContain('"mvn"');
|
|
194
241
|
});
|
|
195
242
|
|
|
@@ -201,7 +248,10 @@ describe('InitCommandHandler', () => {
|
|
|
201
248
|
const result = await handler.execute({ auto: true });
|
|
202
249
|
|
|
203
250
|
expect(result.ok).toBe(true);
|
|
204
|
-
const gatesContent = await fs.readFile(
|
|
251
|
+
const gatesContent = await fs.readFile(
|
|
252
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
|
|
253
|
+
'utf8',
|
|
254
|
+
);
|
|
205
255
|
expect(gatesContent).toContain('"./gradlew"');
|
|
206
256
|
});
|
|
207
257
|
|
|
@@ -210,7 +260,7 @@ describe('InitCommandHandler', () => {
|
|
|
210
260
|
await fs.writeFile(
|
|
211
261
|
path.join(cwd, '.git', 'config'),
|
|
212
262
|
'[core]\n repositoryformatversion = 0\n',
|
|
213
|
-
'utf8'
|
|
263
|
+
'utf8',
|
|
214
264
|
);
|
|
215
265
|
execFileMock.mockResolvedValue({ stdout: 'origin/develop\n', stderr: '' });
|
|
216
266
|
|
|
@@ -218,7 +268,10 @@ describe('InitCommandHandler', () => {
|
|
|
218
268
|
const result = await handler.execute({ auto: true });
|
|
219
269
|
|
|
220
270
|
expect(result.ok).toBe(true);
|
|
221
|
-
const policyContent = await fs.readFile(
|
|
271
|
+
const policyContent = await fs.readFile(
|
|
272
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
273
|
+
'utf8',
|
|
274
|
+
);
|
|
222
275
|
expect(policyContent).toContain('base_branch: develop');
|
|
223
276
|
});
|
|
224
277
|
|
|
@@ -231,7 +284,10 @@ describe('InitCommandHandler', () => {
|
|
|
231
284
|
const result = await handler.execute({ auto: true });
|
|
232
285
|
|
|
233
286
|
expect(result.ok).toBe(true);
|
|
234
|
-
const policyContent = await fs.readFile(
|
|
287
|
+
const policyContent = await fs.readFile(
|
|
288
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
289
|
+
'utf8',
|
|
290
|
+
);
|
|
235
291
|
expect(policyContent).toContain('base_branch: master');
|
|
236
292
|
});
|
|
237
293
|
|
|
@@ -261,7 +317,7 @@ describe('InitCommandHandler', () => {
|
|
|
261
317
|
'4500',
|
|
262
318
|
'desktop,slack',
|
|
263
319
|
'jest',
|
|
264
|
-
'https://hooks.slack.example/webhook'
|
|
320
|
+
'https://hooks.slack.example/webhook',
|
|
265
321
|
]);
|
|
266
322
|
const handler = new InitCommandHandler(cwd, prompts.factory);
|
|
267
323
|
const result = await handler.execute({ auto: false });
|
|
@@ -270,7 +326,10 @@ describe('InitCommandHandler', () => {
|
|
|
270
326
|
expect(prompts.factory).toHaveBeenCalledTimes(1);
|
|
271
327
|
expect(prompts.close).toHaveBeenCalledTimes(1);
|
|
272
328
|
|
|
273
|
-
const policyContent = await fs.readFile(
|
|
329
|
+
const policyContent = await fs.readFile(
|
|
330
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
331
|
+
'utf8',
|
|
332
|
+
);
|
|
274
333
|
expect(policyContent).toContain('base_branch: release');
|
|
275
334
|
expect(policyContent).toContain('max_parallel_gate_runs: 4');
|
|
276
335
|
expect(policyContent).toContain('port: 4500');
|
|
@@ -278,15 +337,24 @@ describe('InitCommandHandler', () => {
|
|
|
278
337
|
expect(policyContent).toContain('enabled: true');
|
|
279
338
|
expect(policyContent).toContain('webhook: "https://hooks.slack.example/webhook"');
|
|
280
339
|
|
|
281
|
-
const gatesContent = await fs.readFile(
|
|
340
|
+
const gatesContent = await fs.readFile(
|
|
341
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
|
|
342
|
+
'utf8',
|
|
343
|
+
);
|
|
282
344
|
expect(gatesContent).toContain('"npx"');
|
|
283
345
|
expect(gatesContent).toContain('"jest"');
|
|
284
346
|
|
|
285
|
-
const agentsContent = await fs.readFile(
|
|
347
|
+
const agentsContent = await fs.readFile(
|
|
348
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'agents.yaml'),
|
|
349
|
+
'utf8',
|
|
350
|
+
);
|
|
286
351
|
expect(agentsContent).toContain('default_provider: claude');
|
|
287
352
|
expect(agentsContent).toContain('default_model: sonnet-4.5');
|
|
288
353
|
|
|
289
|
-
const adaptersContent = await fs.readFile(
|
|
354
|
+
const adaptersContent = await fs.readFile(
|
|
355
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'adapters.yaml'),
|
|
356
|
+
'utf8',
|
|
357
|
+
);
|
|
290
358
|
expect(adaptersContent).toContain('activity-detector: claude-jsonl');
|
|
291
359
|
expect(adaptersContent).toContain('scm-provider: github');
|
|
292
360
|
});
|
|
@@ -306,7 +374,7 @@ describe('InitCommandHandler validation branches', () => {
|
|
|
306
374
|
});
|
|
307
375
|
|
|
308
376
|
it('GIVEN_skipped_file_WHEN_validation_loop_runs_THEN_skipped_rel_is_not_validated', async () => {
|
|
309
|
-
const orchestratorDir = path.join(cwd, 'agentic', 'orchestrator');
|
|
377
|
+
const orchestratorDir = path.join(cwd, 'config', 'agentic', 'orchestrator');
|
|
310
378
|
await fs.mkdir(orchestratorDir, { recursive: true });
|
|
311
379
|
// Pre-create policy.yaml so it gets skipped (no --force)
|
|
312
380
|
await fs.writeFile(path.join(orchestratorDir, 'policy.yaml'), '# existing\n', 'utf8');
|
|
@@ -317,7 +385,7 @@ describe('InitCommandHandler validation branches', () => {
|
|
|
317
385
|
|
|
318
386
|
expect(result.ok).toBe(true);
|
|
319
387
|
// policy.yaml was skipped, so the validation loop skipped it too (no error about it)
|
|
320
|
-
expect(result.data.skipped).toContain('agentic/orchestrator/policy.yaml');
|
|
388
|
+
expect(result.data.skipped).toContain('config/agentic/orchestrator/policy.yaml');
|
|
321
389
|
// Validation warnings should be empty (skipped file is not validated)
|
|
322
390
|
expect(result.data.validation_warnings).toHaveLength(0);
|
|
323
391
|
});
|
|
@@ -327,7 +395,7 @@ describe('InitCommandHandler validation branches', () => {
|
|
|
327
395
|
const { SchemaRegistry } = await import('../src/core/schemas.js');
|
|
328
396
|
const validateSpy = vi.spyOn(SchemaRegistry.prototype, 'validate').mockResolvedValue({
|
|
329
397
|
valid: false,
|
|
330
|
-
errors: [{ message: 'test-schema-error' } as any]
|
|
398
|
+
errors: [{ message: 'test-schema-error' } as any],
|
|
331
399
|
});
|
|
332
400
|
|
|
333
401
|
const handler = new InitCommandHandler(cwd);
|
|
@@ -342,9 +410,9 @@ describe('InitCommandHandler validation branches', () => {
|
|
|
342
410
|
it('GIVEN_schema_registry_throws_WHEN_init_runs_THEN_adds_catch_validation_warning', async () => {
|
|
343
411
|
execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
|
|
344
412
|
const { SchemaRegistry } = await import('../src/core/schemas.js');
|
|
345
|
-
const validateSpy = vi
|
|
346
|
-
|
|
347
|
-
|
|
413
|
+
const validateSpy = vi
|
|
414
|
+
.spyOn(SchemaRegistry.prototype, 'validate')
|
|
415
|
+
.mockRejectedValue(new Error('schema-load-failure'));
|
|
348
416
|
|
|
349
417
|
const handler = new InitCommandHandler(cwd);
|
|
350
418
|
const result = await handler.execute({ auto: true });
|
|
@@ -356,19 +424,27 @@ describe('InitCommandHandler validation branches', () => {
|
|
|
356
424
|
});
|
|
357
425
|
|
|
358
426
|
it('GIVEN_skipped_non_policy_files_WHEN_validation_loop_runs_THEN_skipped_rels_are_not_validated', async () => {
|
|
359
|
-
const orchestratorDir = path.join(cwd, 'agentic', 'orchestrator');
|
|
427
|
+
const orchestratorDir = path.join(cwd, 'config', 'agentic', 'orchestrator');
|
|
360
428
|
await fs.mkdir(orchestratorDir, { recursive: true });
|
|
361
429
|
// Pre-create gates.yaml and agents.yaml so they get skipped (no --force)
|
|
362
|
-
await fs.writeFile(
|
|
363
|
-
|
|
430
|
+
await fs.writeFile(
|
|
431
|
+
path.join(orchestratorDir, 'gates.yaml'),
|
|
432
|
+
'version: 1\n# existing gates\n',
|
|
433
|
+
'utf8',
|
|
434
|
+
);
|
|
435
|
+
await fs.writeFile(
|
|
436
|
+
path.join(orchestratorDir, 'agents.yaml'),
|
|
437
|
+
'version: 1\n# existing agents\n',
|
|
438
|
+
'utf8',
|
|
439
|
+
);
|
|
364
440
|
execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
|
|
365
441
|
|
|
366
442
|
const handler = new InitCommandHandler(cwd);
|
|
367
443
|
const result = await handler.execute({ auto: true });
|
|
368
444
|
|
|
369
445
|
expect(result.ok).toBe(true);
|
|
370
|
-
expect(result.data.skipped).toContain('agentic/orchestrator/gates.yaml');
|
|
371
|
-
expect(result.data.skipped).toContain('agentic/orchestrator/agents.yaml');
|
|
446
|
+
expect(result.data.skipped).toContain('config/agentic/orchestrator/gates.yaml');
|
|
447
|
+
expect(result.data.skipped).toContain('config/agentic/orchestrator/agents.yaml');
|
|
372
448
|
// Skipped files are not validated — no errors from their existing (partial) content
|
|
373
449
|
expect(result.data.validation_warnings).toHaveLength(0);
|
|
374
450
|
});
|
|
@@ -400,13 +476,16 @@ describe('InitCommandHandler codex activity detector branch', () => {
|
|
|
400
476
|
'3',
|
|
401
477
|
'3000',
|
|
402
478
|
'none',
|
|
403
|
-
'vitest'
|
|
479
|
+
'vitest',
|
|
404
480
|
]);
|
|
405
481
|
const handler = new InitCommandHandler(cwd, prompts.factory);
|
|
406
482
|
const result = await handler.execute({ auto: false });
|
|
407
483
|
|
|
408
484
|
expect(result.ok).toBe(true);
|
|
409
|
-
const adaptersContent = await fs.readFile(
|
|
485
|
+
const adaptersContent = await fs.readFile(
|
|
486
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'adapters.yaml'),
|
|
487
|
+
'utf8',
|
|
488
|
+
);
|
|
410
489
|
expect(adaptersContent).toContain('activity-detector: codex-rpc');
|
|
411
490
|
});
|
|
412
491
|
});
|
|
@@ -438,13 +517,16 @@ describe('InitCommandHandler webhook channel branch', () => {
|
|
|
438
517
|
'3000',
|
|
439
518
|
'webhook',
|
|
440
519
|
'jest',
|
|
441
|
-
'https://example.com/my-webhook'
|
|
520
|
+
'https://example.com/my-webhook',
|
|
442
521
|
]);
|
|
443
522
|
const handler = new InitCommandHandler(cwd, prompts.factory);
|
|
444
523
|
const result = await handler.execute({ auto: false });
|
|
445
524
|
|
|
446
525
|
expect(result.ok).toBe(true);
|
|
447
|
-
const policyContent = await fs.readFile(
|
|
526
|
+
const policyContent = await fs.readFile(
|
|
527
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
528
|
+
'utf8',
|
|
529
|
+
);
|
|
448
530
|
expect(policyContent).toContain('url: "https://example.com/my-webhook"');
|
|
449
531
|
});
|
|
450
532
|
});
|
|
@@ -475,13 +557,16 @@ describe('InitCommandHandler parseNotificationChannels none branch', () => {
|
|
|
475
557
|
'3',
|
|
476
558
|
'3000',
|
|
477
559
|
'none',
|
|
478
|
-
'jest'
|
|
560
|
+
'jest',
|
|
479
561
|
]);
|
|
480
562
|
const handler = new InitCommandHandler(cwd, prompts.factory);
|
|
481
563
|
const result = await handler.execute({ auto: false });
|
|
482
564
|
|
|
483
565
|
expect(result.ok).toBe(true);
|
|
484
|
-
const policyContent = await fs.readFile(
|
|
566
|
+
const policyContent = await fs.readFile(
|
|
567
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
568
|
+
'utf8',
|
|
569
|
+
);
|
|
485
570
|
expect(policyContent).toContain('notifications:');
|
|
486
571
|
});
|
|
487
572
|
});
|
|
@@ -505,8 +590,9 @@ describe('InitCommandHandler loadTemplateFiles non-file entry', () => {
|
|
|
505
590
|
execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
|
|
506
591
|
|
|
507
592
|
const readdirSpy = vi.spyOn(fs, 'readdir').mockImplementation(async (dirPath, opts) => {
|
|
508
|
-
const originalReaddir = (await vi.importActual<typeof FsPromises>('node:fs/promises'))
|
|
509
|
-
|
|
593
|
+
const originalReaddir = (await vi.importActual<typeof FsPromises>('node:fs/promises'))
|
|
594
|
+
.readdir;
|
|
595
|
+
const entries = await originalReaddir(dirPath, opts as never);
|
|
510
596
|
const fakeDir = {
|
|
511
597
|
name: 'subdir',
|
|
512
598
|
isFile: () => false,
|
|
@@ -517,7 +603,7 @@ describe('InitCommandHandler loadTemplateFiles non-file entry', () => {
|
|
|
517
603
|
isSocket: () => false,
|
|
518
604
|
isSymbolicLink: () => false,
|
|
519
605
|
parentPath: String(dirPath),
|
|
520
|
-
path: String(dirPath)
|
|
606
|
+
path: String(dirPath),
|
|
521
607
|
};
|
|
522
608
|
return [...entries, fakeDir] as never;
|
|
523
609
|
});
|
|
@@ -553,16 +639,19 @@ describe('InitCommandHandler parseInteger out-of-range and parseFramework fallba
|
|
|
553
639
|
'custom',
|
|
554
640
|
'local-default',
|
|
555
641
|
'github',
|
|
556
|
-
'0',
|
|
642
|
+
'0', // out of range (min=1) → parseInteger returns fallback 3
|
|
557
643
|
'3000',
|
|
558
644
|
'none',
|
|
559
|
-
'vitest'
|
|
645
|
+
'vitest',
|
|
560
646
|
]);
|
|
561
647
|
const handler = new InitCommandHandler(cwd, prompts.factory);
|
|
562
648
|
const result = await handler.execute({ auto: false });
|
|
563
649
|
|
|
564
650
|
expect(result.ok).toBe(true);
|
|
565
|
-
const policyContent = await fs.readFile(
|
|
651
|
+
const policyContent = await fs.readFile(
|
|
652
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
653
|
+
'utf8',
|
|
654
|
+
);
|
|
566
655
|
// Falls back to default 3
|
|
567
656
|
expect(policyContent).toContain('max_parallel_gate_runs: 3');
|
|
568
657
|
});
|
|
@@ -580,7 +669,7 @@ describe('InitCommandHandler parseInteger out-of-range and parseFramework fallba
|
|
|
580
669
|
'3',
|
|
581
670
|
'3000',
|
|
582
671
|
'none',
|
|
583
|
-
'unknown_framework'
|
|
672
|
+
'unknown_framework', // not vitest/jest/pytest/maven/gradle → parseFramework returns fallback
|
|
584
673
|
]);
|
|
585
674
|
const handler = new InitCommandHandler(cwd, prompts.factory);
|
|
586
675
|
const result = await handler.execute({ auto: false });
|
|
@@ -611,7 +700,10 @@ describe('InitCommandHandler lean vs advanced policy', () => {
|
|
|
611
700
|
expect(result.ok).toBe(true);
|
|
612
701
|
expect(result.data.validation_warnings).toHaveLength(0);
|
|
613
702
|
|
|
614
|
-
const policyContent = await fs.readFile(
|
|
703
|
+
const policyContent = await fs.readFile(
|
|
704
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
705
|
+
'utf8',
|
|
706
|
+
);
|
|
615
707
|
// Lean policy contains common controls
|
|
616
708
|
expect(policyContent).toContain('worktree:');
|
|
617
709
|
expect(policyContent).toContain('base_branch:');
|
|
@@ -638,7 +730,10 @@ describe('InitCommandHandler lean vs advanced policy', () => {
|
|
|
638
730
|
expect(result.ok).toBe(true);
|
|
639
731
|
expect(result.data.validation_warnings).toHaveLength(0);
|
|
640
732
|
|
|
641
|
-
const policyContent = await fs.readFile(
|
|
733
|
+
const policyContent = await fs.readFile(
|
|
734
|
+
path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
|
|
735
|
+
'utf8',
|
|
736
|
+
);
|
|
642
737
|
// Full policy contains advanced controls
|
|
643
738
|
expect(policyContent).toContain('commit_policy:');
|
|
644
739
|
expect(policyContent).toContain('patch_policy:');
|