agentic-orchestrator 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +10 -0
- package/.prettierrc.json +24 -0
- package/CLAUDE.md +3 -2
- package/README.md +71 -48
- package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
- package/agentic/orchestrator/prompts/planner.system.md +1 -0
- package/agentic/orchestrator/schemas/agents.schema.json +5 -22
- package/agentic/orchestrator/schemas/gates.schema.json +4 -19
- package/agentic/orchestrator/schemas/index.schema.json +3 -14
- package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
- package/agentic/orchestrator/schemas/plan.schema.json +6 -26
- package/agentic/orchestrator/schemas/policy.schema.json +19 -81
- package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
- package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
- package/agentic/orchestrator/schemas/state.schema.json +11 -61
- package/agentic/orchestrator/tools/catalog.json +33 -164
- package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
- package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
- package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
- package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
- package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
- package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
- package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
- package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
- package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
- package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
- package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
- package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
- package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
- package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
- package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
- package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
- package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
- package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
- package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
- package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
- package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
- package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
- package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
- package/apps/control-plane/src/application/services/gate-service.ts +64 -41
- package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
- package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
- package/apps/control-plane/src/application/services/lock-service.ts +75 -49
- package/apps/control-plane/src/application/services/merge-service.ts +91 -50
- package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
- package/apps/control-plane/src/application/services/patch-service.ts +73 -44
- package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
- package/apps/control-plane/src/application/services/plan-service.ts +148 -89
- package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
- package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
- package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
- package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
- package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
- package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
- package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
- package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
- package/apps/control-plane/src/cli/aop.ts +2 -2
- package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
- package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
- package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
- package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
- package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
- package/apps/control-plane/src/cli/env-file.ts +115 -0
- package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
- package/apps/control-plane/src/cli/init-command-handler.ts +182 -56
- package/apps/control-plane/src/cli/io.ts +7 -3
- package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
- package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
- package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
- package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
- package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
- package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
- package/apps/control-plane/src/cli/spec-utils.ts +2 -2
- package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
- package/apps/control-plane/src/cli/tooling.ts +3 -3
- package/apps/control-plane/src/cli/types.ts +1 -1
- package/apps/control-plane/src/core/collisions.ts +27 -10
- package/apps/control-plane/src/core/constants.ts +13 -7
- package/apps/control-plane/src/core/error-codes.ts +1 -1
- package/apps/control-plane/src/core/fs.ts +11 -5
- package/apps/control-plane/src/core/gates.ts +53 -27
- package/apps/control-plane/src/core/git.ts +18 -6
- package/apps/control-plane/src/core/kernel.ts +513 -227
- package/apps/control-plane/src/core/patch.ts +7 -3
- package/apps/control-plane/src/core/path-layout.ts +5 -1
- package/apps/control-plane/src/core/path-rules.ts +19 -5
- package/apps/control-plane/src/core/qa-index.ts +26 -12
- package/apps/control-plane/src/core/response.ts +9 -6
- package/apps/control-plane/src/core/schemas.ts +29 -10
- package/apps/control-plane/src/core/tool-caller.ts +1 -1
- package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
- package/apps/control-plane/src/index.ts +3 -9
- package/apps/control-plane/src/interfaces/cli/bootstrap.ts +79 -35
- package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
- package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
- package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
- package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
- package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
- package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
- package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
- package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
- package/apps/control-plane/src/mcp/tool-client.ts +17 -5
- package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
- package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
- package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
- package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
- package/apps/control-plane/src/providers/providers.ts +137 -54
- package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
- package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
- package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
- package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
- package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
- package/apps/control-plane/src/supervisor/runtime.ts +59 -35
- package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
- package/apps/control-plane/src/supervisor/types.ts +22 -7
- package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
- package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
- package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
- package/apps/control-plane/test/aop.spec.ts +4 -4
- package/apps/control-plane/test/batch-operations.spec.ts +20 -18
- package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
- package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
- package/apps/control-plane/test/bootstrap.spec.ts +72 -40
- package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
- package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
- package/apps/control-plane/test/cli.spec.ts +1 -1
- package/apps/control-plane/test/cli.unit.spec.ts +226 -167
- package/apps/control-plane/test/collision-queue.spec.ts +49 -40
- package/apps/control-plane/test/collisions.spec.ts +30 -30
- package/apps/control-plane/test/core-utils.spec.ts +29 -15
- package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
- package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
- package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
- package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
- package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
- package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
- package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
- package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
- package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
- package/apps/control-plane/test/gates.spec.ts +101 -81
- package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
- package/apps/control-plane/test/helpers.ts +10 -6
- package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
- package/apps/control-plane/test/init-wizard.spec.ts +328 -68
- package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
- package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
- package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
- package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
- package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
- package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
- package/apps/control-plane/test/kernel.spec.ts +134 -51
- package/apps/control-plane/test/lock-service.spec.ts +92 -68
- package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
- package/apps/control-plane/test/mcp.spec.ts +231 -115
- package/apps/control-plane/test/merge-service.spec.ts +142 -94
- package/apps/control-plane/test/multi-project.spec.ts +28 -22
- package/apps/control-plane/test/notifier-service.spec.ts +136 -92
- package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
- package/apps/control-plane/test/patch-service.spec.ts +128 -48
- package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
- package/apps/control-plane/test/plan-service.spec.ts +50 -39
- package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
- package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
- package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
- package/apps/control-plane/test/providers.spec.ts +208 -104
- package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
- package/apps/control-plane/test/qa-index.spec.ts +58 -61
- package/apps/control-plane/test/reactions.spec.ts +88 -45
- package/apps/control-plane/test/response.spec.ts +5 -5
- package/apps/control-plane/test/resume-command.spec.ts +121 -80
- package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
- package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
- package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
- package/apps/control-plane/test/services.spec.ts +147 -129
- package/apps/control-plane/test/session-management.spec.ts +136 -74
- package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
- package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
- package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
- package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
- package/apps/control-plane/test/supervisor.spec.ts +67 -43
- package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
- package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
- package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
- package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
- package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
- package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
- package/apps/control-plane/tsconfig.build.json +2 -7
- package/apps/control-plane/tsconfig.json +1 -5
- package/apps/control-plane/vitest.config.ts +7 -7
- package/config/agentic/orchestrator/adapters.yaml +3 -0
- package/config/agentic/orchestrator/agents.yaml +14 -0
- package/config/agentic/orchestrator/gates.yaml +28 -0
- package/config/agentic/orchestrator/policy.yaml +22 -0
- package/config/agentic/orchestrator/prompts/builder.system.md +1 -0
- package/config/agentic/orchestrator/prompts/planner.system.md +16 -0
- package/config/agentic/orchestrator/prompts/qa.system.md +1 -0
- package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
- package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
- package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
- package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
- package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
- package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
- package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
- package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
- package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
- package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
- package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-service.js +26 -26
- package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
- package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
- package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/lock-service.js +32 -32
- package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/merge-service.js +41 -27
- package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
- package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/patch-service.js +21 -19
- package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
- package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/plan-service.js +33 -33
- package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
- package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
- package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
- package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
- package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
- package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
- package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
- package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
- package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
- package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
- package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
- package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
- package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
- package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
- package/dist/apps/control-plane/cli/env-file.d.ts +4 -0
- package/dist/apps/control-plane/cli/env-file.js +89 -0
- package/dist/apps/control-plane/cli/env-file.js.map +1 -0
- package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
- package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/init-command-handler.js +97 -37
- package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/io.js +2 -2
- package/dist/apps/control-plane/cli/io.js.map +1 -1
- package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
- package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
- package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
- package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
- package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
- package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
- package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
- package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/tooling.js +1 -1
- package/dist/apps/control-plane/core/collisions.js +11 -8
- package/dist/apps/control-plane/core/collisions.js.map +1 -1
- package/dist/apps/control-plane/core/constants.js +13 -7
- package/dist/apps/control-plane/core/constants.js.map +1 -1
- package/dist/apps/control-plane/core/error-codes.js +1 -1
- package/dist/apps/control-plane/core/fs.js.map +1 -1
- package/dist/apps/control-plane/core/gates.d.ts +2 -2
- package/dist/apps/control-plane/core/gates.js +26 -19
- package/dist/apps/control-plane/core/gates.js.map +1 -1
- package/dist/apps/control-plane/core/git.js +3 -3
- package/dist/apps/control-plane/core/git.js.map +1 -1
- package/dist/apps/control-plane/core/kernel.d.ts +1 -0
- package/dist/apps/control-plane/core/kernel.js +134 -81
- package/dist/apps/control-plane/core/kernel.js.map +1 -1
- package/dist/apps/control-plane/core/patch.js +7 -3
- package/dist/apps/control-plane/core/patch.js.map +1 -1
- package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
- package/dist/apps/control-plane/core/path-layout.js +4 -1
- package/dist/apps/control-plane/core/path-layout.js.map +1 -1
- package/dist/apps/control-plane/core/path-rules.js +3 -1
- package/dist/apps/control-plane/core/path-rules.js.map +1 -1
- package/dist/apps/control-plane/core/qa-index.js +5 -5
- package/dist/apps/control-plane/core/qa-index.js.map +1 -1
- package/dist/apps/control-plane/core/response.js +3 -3
- package/dist/apps/control-plane/core/response.js.map +1 -1
- package/dist/apps/control-plane/core/schemas.js +10 -6
- package/dist/apps/control-plane/core/schemas.js.map +1 -1
- package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
- package/dist/apps/control-plane/index.d.ts +1 -1
- package/dist/apps/control-plane/index.js +1 -1
- package/dist/apps/control-plane/index.js.map +1 -1
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js +40 -23
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
- package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
- package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
- package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
- package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
- package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
- package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
- package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
- package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
- package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
- package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
- package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
- package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-client.js +2 -2
- package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
- package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
- package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
- package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
- package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
- package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
- package/dist/apps/control-plane/providers/providers.d.ts +3 -2
- package/dist/apps/control-plane/providers/providers.js +81 -39
- package/dist/apps/control-plane/providers/providers.js.map +1 -1
- package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
- package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
- package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/runtime.js +25 -21
- package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
- package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
- package/dist/apps/control-plane/supervisor/types.js.map +1 -1
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
- package/eslint.config.mjs +20 -20
- package/example-configurations/README.md +1 -1
- package/example-configurations/java/agents.yaml +3 -3
- package/example-configurations/java/policy.yaml +1 -1
- package/example-configurations/node/agents.yaml +3 -3
- package/example-configurations/node/policy.yaml +1 -1
- package/package.json +10 -5
- package/packages/web-dashboard/next.config.js +2 -2
- package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
- package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
- package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
- package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
- package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
- package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
- package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
- package/packages/web-dashboard/src/app/globals.css +10 -2
- package/packages/web-dashboard/src/app/page.tsx +100 -37
- package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
- package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
- package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
- package/packages/web-dashboard/tsconfig.json +3 -11
- package/scripts/nx-safe.mjs +10 -10
- package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
- package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +189 -90
- package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
- package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
- package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
- package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
- package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
- package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
- package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
- package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
- package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
- package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
- package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
- package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
- package/spec-files/outstanding/agentic_orchestrator_provider_auth_bootstrap_spec.md +384 -0
- package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
- package/spec-files/progress.md +186 -175
- package/tsconfig.json +2 -8
|
@@ -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
|
});
|
|
@@ -4,7 +4,11 @@ import { ERROR_CODES } from '../src/core/error-codes.js';
|
|
|
4
4
|
import { TOOLS } from '../src/core/constants.js';
|
|
5
5
|
import { CliArgumentParser } from '../src/cli/cli-argument-parser.js';
|
|
6
6
|
import { assertOkResponse, callCliTool } from '../src/cli/tooling.js';
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
canonicalFeatureIdFromPath,
|
|
9
|
+
isCanonicalSpecPath,
|
|
10
|
+
isLegacyCanonicalSpecPath,
|
|
11
|
+
} from '../src/cli/spec-utils.js';
|
|
8
12
|
import { RetryCommandHandler } from '../src/cli/retry-command-handler.js';
|
|
9
13
|
import { StatusCommandHandler } from '../src/cli/status-command-handler.js';
|
|
10
14
|
import { SendCommandHandler } from '../src/cli/send-command-handler.js';
|
|
@@ -29,7 +33,7 @@ describe('cli helper modules', () => {
|
|
|
29
33
|
'--batch',
|
|
30
34
|
'--takeover-stale-run',
|
|
31
35
|
'--message',
|
|
32
|
-
'hello world'
|
|
36
|
+
'hello world',
|
|
33
37
|
]);
|
|
34
38
|
expect(miscParsed).toMatchObject({
|
|
35
39
|
command: 'status',
|
|
@@ -43,7 +47,7 @@ describe('cli helper modules', () => {
|
|
|
43
47
|
auto: true,
|
|
44
48
|
batch: true,
|
|
45
49
|
takeover_stale_run: true,
|
|
46
|
-
message: 'hello world'
|
|
50
|
+
message: 'hello world',
|
|
47
51
|
});
|
|
48
52
|
// --port with non-numeric next token (no value consumed)
|
|
49
53
|
const portNoNum = parser.parse(['run', '--port', '--foreground']);
|
|
@@ -51,7 +55,7 @@ describe('cli helper modules', () => {
|
|
|
51
55
|
expect(portNoNum.foreground).toBe(true);
|
|
52
56
|
expect(parser.parse(['-fi', '.aop/features/feature_x/spec.md'])).toMatchObject({
|
|
53
57
|
command: 'run',
|
|
54
|
-
file_input: '.aop/features/feature_x/spec.md'
|
|
58
|
+
file_input: '.aop/features/feature_x/spec.md',
|
|
55
59
|
});
|
|
56
60
|
|
|
57
61
|
const parsed = parser.parse([
|
|
@@ -63,7 +67,7 @@ describe('cli helper modules', () => {
|
|
|
63
67
|
'--provider-config-env',
|
|
64
68
|
'AOP_PROVIDER_CFG',
|
|
65
69
|
'--transport',
|
|
66
|
-
'mcp'
|
|
70
|
+
'mcp',
|
|
67
71
|
]);
|
|
68
72
|
|
|
69
73
|
expect(parsed).toMatchObject({
|
|
@@ -71,7 +75,7 @@ describe('cli helper modules', () => {
|
|
|
71
75
|
agent_model: 'gpt-5',
|
|
72
76
|
agent_config: '{"command":"kiro-cli","args":["chat","--agent","dev"]}',
|
|
73
77
|
provider_config_env: 'AOP_PROVIDER_CFG',
|
|
74
|
-
transport: 'mcp'
|
|
78
|
+
transport: 'mcp',
|
|
75
79
|
});
|
|
76
80
|
const deleteParsed = parser.parse([
|
|
77
81
|
'delete',
|
|
@@ -83,7 +87,7 @@ describe('cli helper modules', () => {
|
|
|
83
87
|
'--remove-worktree',
|
|
84
88
|
'false',
|
|
85
89
|
'--remove-branch',
|
|
86
|
-
'force'
|
|
90
|
+
'force',
|
|
87
91
|
]);
|
|
88
92
|
expect(deleteParsed).toMatchObject({
|
|
89
93
|
command: 'delete',
|
|
@@ -91,18 +95,22 @@ describe('cli helper modules', () => {
|
|
|
91
95
|
yes: true,
|
|
92
96
|
dry_run: false,
|
|
93
97
|
remove_worktree: false,
|
|
94
|
-
remove_branch: 'force'
|
|
98
|
+
remove_branch: 'force',
|
|
95
99
|
});
|
|
96
|
-
const positionalSend = parser.parse([
|
|
100
|
+
const positionalSend = parser.parse([
|
|
101
|
+
'send',
|
|
102
|
+
'feature_positional',
|
|
103
|
+
'please rerun qa with latest fixes',
|
|
104
|
+
]);
|
|
97
105
|
expect(positionalSend).toMatchObject({
|
|
98
106
|
command: 'send',
|
|
99
107
|
feature_id: 'feature_positional',
|
|
100
|
-
message: 'please rerun qa with latest fixes'
|
|
108
|
+
message: 'please rerun qa with latest fixes',
|
|
101
109
|
});
|
|
102
110
|
const positionalAttach = parser.parse(['attach', 'feature_positional']);
|
|
103
111
|
expect(positionalAttach).toMatchObject({
|
|
104
112
|
command: 'attach',
|
|
105
|
-
feature_id: 'feature_positional'
|
|
113
|
+
feature_id: 'feature_positional',
|
|
106
114
|
});
|
|
107
115
|
expect(parser.resolveTransport('InProcess')).toBe('inprocess');
|
|
108
116
|
expect(parser.resolveTransport(undefined)).toBe('mcp');
|
|
@@ -111,16 +119,24 @@ describe('cli helper modules', () => {
|
|
|
111
119
|
it('GIVEN_noncanonical_paths_WHEN_deriving_feature_id_or_canonical_spec_THEN_throws_or_returns_null', () => {
|
|
112
120
|
expect(canonicalFeatureIdFromPath('feature_x.spec.md')).toBe('feature_x');
|
|
113
121
|
expect(canonicalFeatureIdFromPath('feature_x-spec.md')).toBe('feature_x');
|
|
114
|
-
expect(() => canonicalFeatureIdFromPath('INVALID Feature.md')).toThrow(
|
|
122
|
+
expect(() => canonicalFeatureIdFromPath('INVALID Feature.md')).toThrow(
|
|
123
|
+
ERROR_CODES.INVALID_FEATURE_SLUG,
|
|
124
|
+
);
|
|
115
125
|
|
|
116
126
|
expect(
|
|
117
|
-
isCanonicalSpecPath('/repo', path.join('/repo', '.aop', 'features', 'feature_a', 'spec.md'))
|
|
127
|
+
isCanonicalSpecPath('/repo', path.join('/repo', '.aop', 'features', 'feature_a', 'spec.md')),
|
|
118
128
|
).toBe('feature_a');
|
|
119
129
|
expect(
|
|
120
|
-
isLegacyCanonicalSpecPath(
|
|
130
|
+
isLegacyCanonicalSpecPath(
|
|
131
|
+
'/repo',
|
|
132
|
+
path.join('/repo', 'agentic', 'features', 'feature_a', 'spec.md'),
|
|
133
|
+
),
|
|
121
134
|
).toBe('feature_a');
|
|
122
135
|
expect(
|
|
123
|
-
isCanonicalSpecPath(
|
|
136
|
+
isCanonicalSpecPath(
|
|
137
|
+
'/repo',
|
|
138
|
+
path.join('/repo', 'agentic', 'features', 'feature_a', 'spec.md'),
|
|
139
|
+
),
|
|
124
140
|
).toBeNull();
|
|
125
141
|
expect(isCanonicalSpecPath('/repo', '/repo/spec-files/feature_a.md')).toBeNull();
|
|
126
142
|
});
|
|
@@ -129,17 +145,19 @@ describe('cli helper modules', () => {
|
|
|
129
145
|
expect(() =>
|
|
130
146
|
assertOkResponse({
|
|
131
147
|
ok: false,
|
|
132
|
-
error: {}
|
|
133
|
-
} as any)
|
|
148
|
+
error: {},
|
|
149
|
+
} as any),
|
|
134
150
|
).toThrow(ERROR_CODES.INTERNAL_ERROR);
|
|
135
151
|
});
|
|
136
152
|
|
|
137
153
|
it('GIVEN_tool_client_response_WHEN_calling_cli_tool_THEN_uses_system_identity_and_returns_ok_payload', async () => {
|
|
138
154
|
const toolClient = {
|
|
139
|
-
call: vi.fn(async () => ({ ok: true, data: { accepted: true } }))
|
|
155
|
+
call: vi.fn(async () => ({ ok: true, data: { accepted: true } })),
|
|
140
156
|
};
|
|
141
157
|
|
|
142
|
-
const response = await callCliTool(toolClient as any, 'run:cli', 'report.dashboard', {
|
|
158
|
+
const response = await callCliTool(toolClient as any, 'run:cli', 'report.dashboard', {
|
|
159
|
+
sample: true,
|
|
160
|
+
});
|
|
143
161
|
|
|
144
162
|
expect(response).toMatchObject({ ok: true, data: { accepted: true } });
|
|
145
163
|
expect(toolClient.call).toHaveBeenCalledWith(
|
|
@@ -149,8 +167,8 @@ describe('cli helper modules', () => {
|
|
|
149
167
|
run_id: 'run:cli',
|
|
150
168
|
session_id: 'bootstrap:cli',
|
|
151
169
|
actor_type: 'system',
|
|
152
|
-
actor_id: 'cli:system'
|
|
153
|
-
})
|
|
170
|
+
actor_id: 'cli:system',
|
|
171
|
+
}),
|
|
154
172
|
);
|
|
155
173
|
});
|
|
156
174
|
});
|
|
@@ -164,7 +182,7 @@ describe('RetryCommandHandler', () => {
|
|
|
164
182
|
const toolClient = { call: vi.fn() };
|
|
165
183
|
const handler = new RetryCommandHandler(toolClient as never, 'run:test');
|
|
166
184
|
await expect(handler.execute({ command: 'retry' })).rejects.toMatchObject({
|
|
167
|
-
code: ERROR_CODES.INVALID_CLI_ARGS
|
|
185
|
+
code: ERROR_CODES.INVALID_CLI_ARGS,
|
|
168
186
|
});
|
|
169
187
|
});
|
|
170
188
|
|
|
@@ -172,7 +190,7 @@ describe('RetryCommandHandler', () => {
|
|
|
172
190
|
const toolClient = { call: vi.fn() };
|
|
173
191
|
const handler = new RetryCommandHandler(toolClient as never, 'run:test');
|
|
174
192
|
await expect(
|
|
175
|
-
handler.execute({ command: 'retry', feature_id: 'INVALID Feature ID' })
|
|
193
|
+
handler.execute({ command: 'retry', feature_id: 'INVALID Feature ID' }),
|
|
176
194
|
).rejects.toMatchObject({ code: ERROR_CODES.INVALID_CLI_ARGS });
|
|
177
195
|
});
|
|
178
196
|
|
|
@@ -195,13 +213,13 @@ describe('RetryCommandHandler', () => {
|
|
|
195
213
|
retry_count_reset: false,
|
|
196
214
|
retry_executed: true,
|
|
197
215
|
retry_mode: 'full',
|
|
198
|
-
retry_outcome: 'pass'
|
|
199
|
-
}
|
|
216
|
+
retry_outcome: 'pass',
|
|
217
|
+
},
|
|
200
218
|
});
|
|
201
219
|
expect(callMock).toHaveBeenCalledWith(
|
|
202
220
|
TOOLS.GATES_RUN,
|
|
203
221
|
expect.objectContaining({ feature_id: 'feature_abc', mode: 'full' }),
|
|
204
|
-
expect.any(Object)
|
|
222
|
+
expect.any(Object),
|
|
205
223
|
);
|
|
206
224
|
});
|
|
207
225
|
|
|
@@ -216,26 +234,30 @@ describe('RetryCommandHandler', () => {
|
|
|
216
234
|
return { ok: true, data: {} };
|
|
217
235
|
});
|
|
218
236
|
const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
|
|
219
|
-
const result = await handler.execute({
|
|
237
|
+
const result = await handler.execute({
|
|
238
|
+
command: 'retry',
|
|
239
|
+
feature_id: 'feature_abc',
|
|
240
|
+
force: true,
|
|
241
|
+
});
|
|
220
242
|
|
|
221
243
|
expect(result).toMatchObject({
|
|
222
244
|
ok: true,
|
|
223
|
-
data: { feature_id: 'feature_abc', retry_count_reset: true }
|
|
245
|
+
data: { feature_id: 'feature_abc', retry_count_reset: true },
|
|
224
246
|
});
|
|
225
247
|
expect(callMock).toHaveBeenCalledWith(
|
|
226
248
|
TOOLS.FEATURE_STATE_GET,
|
|
227
249
|
expect.objectContaining({ feature_id: 'feature_abc' }),
|
|
228
|
-
expect.any(Object)
|
|
250
|
+
expect.any(Object),
|
|
229
251
|
);
|
|
230
252
|
expect(callMock).toHaveBeenCalledWith(
|
|
231
253
|
TOOLS.FEATURE_STATE_PATCH,
|
|
232
254
|
expect.objectContaining({ feature_id: 'feature_abc', expected_version: 5 }),
|
|
233
|
-
expect.any(Object)
|
|
255
|
+
expect.any(Object),
|
|
234
256
|
);
|
|
235
257
|
expect(callMock).toHaveBeenCalledWith(
|
|
236
258
|
TOOLS.GATES_RUN,
|
|
237
259
|
expect.objectContaining({ feature_id: 'feature_abc' }),
|
|
238
|
-
expect.any(Object)
|
|
260
|
+
expect.any(Object),
|
|
239
261
|
);
|
|
240
262
|
});
|
|
241
263
|
});
|
|
@@ -260,7 +282,7 @@ describe('StatusCommandHandler', () => {
|
|
|
260
282
|
const features = [
|
|
261
283
|
{ feature_id: 'no_ts', status: 'planning' },
|
|
262
284
|
{ feature_id: 'recent', status: 'building', last_heartbeat_at: recentTs },
|
|
263
|
-
{ feature_id: 'old_one', status: 'merged', last_run_at: oldTs }
|
|
285
|
+
{ feature_id: 'old_one', status: 'merged', last_run_at: oldTs },
|
|
264
286
|
];
|
|
265
287
|
const toolClient = { call: vi.fn(async () => ({ ok: true, data: { features } })) };
|
|
266
288
|
const handler = new StatusCommandHandler(toolClient as never, 'run:test');
|
|
@@ -272,9 +294,9 @@ describe('StatusCommandHandler', () => {
|
|
|
272
294
|
summary: [
|
|
273
295
|
{ feature_id: 'no_ts', status: 'planning', activity: 'unknown' },
|
|
274
296
|
{ feature_id: 'recent', status: 'building', activity: 'active' },
|
|
275
|
-
{ feature_id: 'old_one', status: 'merged', activity: 'idle' }
|
|
276
|
-
]
|
|
277
|
-
}
|
|
297
|
+
{ feature_id: 'old_one', status: 'merged', activity: 'idle' },
|
|
298
|
+
],
|
|
299
|
+
},
|
|
278
300
|
});
|
|
279
301
|
});
|
|
280
302
|
|
|
@@ -287,7 +309,7 @@ describe('StatusCommandHandler', () => {
|
|
|
287
309
|
merge_ready: true,
|
|
288
310
|
pending_review_threads: 0,
|
|
289
311
|
has_conflicts: false,
|
|
290
|
-
merge_score: 100
|
|
312
|
+
merge_score: 100,
|
|
291
313
|
};
|
|
292
314
|
const features = [{ feature_id: 'feature_a', status: 'review', pr: prData }];
|
|
293
315
|
const toolClient = { call: vi.fn(async () => ({ ok: true, data: { features } })) };
|
|
@@ -297,8 +319,8 @@ describe('StatusCommandHandler', () => {
|
|
|
297
319
|
expect(result).toMatchObject({
|
|
298
320
|
ok: true,
|
|
299
321
|
data: {
|
|
300
|
-
features: [expect.objectContaining({ feature_id: 'feature_a', pr_info: prData })]
|
|
301
|
-
}
|
|
322
|
+
features: [expect.objectContaining({ feature_id: 'feature_a', pr_info: prData })],
|
|
323
|
+
},
|
|
302
324
|
});
|
|
303
325
|
});
|
|
304
326
|
|
|
@@ -318,7 +340,7 @@ describe('SendCommandHandler', () => {
|
|
|
318
340
|
const toolClient = { call: vi.fn() };
|
|
319
341
|
const handler = new SendCommandHandler(toolClient as never, 'run:test');
|
|
320
342
|
await expect(
|
|
321
|
-
handler.execute({ command: 'send', feature_id: 'INVALID Feature ID', message: 'hello' })
|
|
343
|
+
handler.execute({ command: 'send', feature_id: 'INVALID Feature ID', message: 'hello' }),
|
|
322
344
|
).rejects.toMatchObject({ code: ERROR_CODES.INVALID_CLI_ARGS });
|
|
323
345
|
});
|
|
324
346
|
});
|
|
@@ -333,14 +355,19 @@ describe('RetryCommandHandler branch coverage', () => {
|
|
|
333
355
|
});
|
|
334
356
|
const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
|
|
335
357
|
await expect(
|
|
336
|
-
handler.execute({ command: 'retry', feature_id: 'feature_x' })
|
|
358
|
+
handler.execute({ command: 'retry', feature_id: 'feature_x' }),
|
|
337
359
|
).rejects.toMatchObject({ code: ERROR_CODES.INVALID_CLI_ARGS });
|
|
338
360
|
});
|
|
339
361
|
|
|
340
362
|
it('GIVEN_feature_blocked_with_forced_retry_fast_reason_WHEN_execute_called_THEN_infers_fast_mode', async () => {
|
|
341
363
|
const callMock = vi.fn().mockImplementation(async (toolName: string) => {
|
|
342
364
|
if (toolName === TOOLS.FEATURE_STATE_GET) {
|
|
343
|
-
return {
|
|
365
|
+
return {
|
|
366
|
+
ok: true,
|
|
367
|
+
data: {
|
|
368
|
+
front_matter: { version: 2, status: 'blocked', status_reason: 'forced_retry:fast' },
|
|
369
|
+
},
|
|
370
|
+
};
|
|
344
371
|
}
|
|
345
372
|
if (toolName === TOOLS.GATES_RUN) {
|
|
346
373
|
return { ok: true, data: { overall: 'pass' } };
|
|
@@ -348,7 +375,11 @@ describe('RetryCommandHandler branch coverage', () => {
|
|
|
348
375
|
return { ok: true, data: {} };
|
|
349
376
|
});
|
|
350
377
|
const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
|
|
351
|
-
const result = await handler.execute({
|
|
378
|
+
const result = (await handler.execute({
|
|
379
|
+
command: 'retry',
|
|
380
|
+
feature_id: 'feature_y',
|
|
381
|
+
force: true,
|
|
382
|
+
})) as Record<string, unknown>;
|
|
352
383
|
const data = result.data as Record<string, unknown>;
|
|
353
384
|
expect(data.retry_mode).toBe('fast');
|
|
354
385
|
});
|
|
@@ -356,7 +387,12 @@ describe('RetryCommandHandler branch coverage', () => {
|
|
|
356
387
|
it('GIVEN_feature_blocked_with_force_and_last_gate_mode_full_WHEN_execute_called_THEN_patches_status_to_qa', async () => {
|
|
357
388
|
const callMock = vi.fn().mockImplementation(async (toolName: string) => {
|
|
358
389
|
if (toolName === TOOLS.FEATURE_STATE_GET) {
|
|
359
|
-
return {
|
|
390
|
+
return {
|
|
391
|
+
ok: true,
|
|
392
|
+
data: {
|
|
393
|
+
front_matter: { version: 3, status: 'blocked', evidence: { last_gate_mode: 'full' } },
|
|
394
|
+
},
|
|
395
|
+
};
|
|
360
396
|
}
|
|
361
397
|
if (toolName === TOOLS.GATES_RUN) {
|
|
362
398
|
return { ok: true, data: { overall: 'pass' } };
|
|
@@ -364,22 +400,33 @@ describe('RetryCommandHandler branch coverage', () => {
|
|
|
364
400
|
return { ok: true, data: {} };
|
|
365
401
|
});
|
|
366
402
|
const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
|
|
367
|
-
const result = await handler.execute({
|
|
403
|
+
const result = (await handler.execute({
|
|
404
|
+
command: 'retry',
|
|
405
|
+
feature_id: 'feature_z',
|
|
406
|
+
force: true,
|
|
407
|
+
})) as Record<string, unknown>;
|
|
368
408
|
const data = result.data as Record<string, unknown>;
|
|
369
409
|
expect(data.retry_mode).toBe('full');
|
|
370
410
|
expect(data.forced_retry_executed).toBe(true);
|
|
371
411
|
// verify patch was called with status qa
|
|
372
412
|
expect(callMock).toHaveBeenCalledWith(
|
|
373
413
|
TOOLS.FEATURE_STATE_PATCH,
|
|
374
|
-
expect.objectContaining({
|
|
375
|
-
|
|
414
|
+
expect.objectContaining({
|
|
415
|
+
patch: expect.objectContaining({ front_matter: expect.objectContaining({ status: 'qa' }) }),
|
|
416
|
+
}),
|
|
417
|
+
expect.any(Object),
|
|
376
418
|
);
|
|
377
419
|
});
|
|
378
420
|
|
|
379
421
|
it('GIVEN_feature_blocked_with_force_and_merge_gate_mode_WHEN_execute_called_THEN_patches_status_to_ready_to_merge', async () => {
|
|
380
422
|
const callMock = vi.fn().mockImplementation(async (toolName: string) => {
|
|
381
423
|
if (toolName === TOOLS.FEATURE_STATE_GET) {
|
|
382
|
-
return {
|
|
424
|
+
return {
|
|
425
|
+
ok: true,
|
|
426
|
+
data: {
|
|
427
|
+
front_matter: { version: 4, status: 'blocked', evidence: { last_gate_mode: 'merge' } },
|
|
428
|
+
},
|
|
429
|
+
};
|
|
383
430
|
}
|
|
384
431
|
if (toolName === TOOLS.GATES_RUN) {
|
|
385
432
|
return { ok: true, data: { overall: 'pass' } };
|
|
@@ -387,13 +434,21 @@ describe('RetryCommandHandler branch coverage', () => {
|
|
|
387
434
|
return { ok: true, data: {} };
|
|
388
435
|
});
|
|
389
436
|
const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
|
|
390
|
-
const result = await handler.execute({
|
|
437
|
+
const result = (await handler.execute({
|
|
438
|
+
command: 'retry',
|
|
439
|
+
feature_id: 'feature_m',
|
|
440
|
+
force: true,
|
|
441
|
+
})) as Record<string, unknown>;
|
|
391
442
|
const data = result.data as Record<string, unknown>;
|
|
392
443
|
expect(data.retry_mode).toBe('merge');
|
|
393
444
|
expect(callMock).toHaveBeenCalledWith(
|
|
394
445
|
TOOLS.FEATURE_STATE_PATCH,
|
|
395
|
-
expect.objectContaining({
|
|
396
|
-
|
|
446
|
+
expect.objectContaining({
|
|
447
|
+
patch: expect.objectContaining({
|
|
448
|
+
front_matter: expect.objectContaining({ status: 'ready_to_merge' }),
|
|
449
|
+
}),
|
|
450
|
+
}),
|
|
451
|
+
expect.any(Object),
|
|
397
452
|
);
|
|
398
453
|
});
|
|
399
454
|
});
|
|
@@ -440,12 +495,10 @@ describe('HelpCommandHandler', () => {
|
|
|
440
495
|
|
|
441
496
|
describe('StatusCommandHandler feature with no timestamp', () => {
|
|
442
497
|
it('GIVEN_feature_with_no_timestamp_fields_WHEN_summary_THEN_activity_is_unknown', async () => {
|
|
443
|
-
const features = [
|
|
444
|
-
{ feature_id: 'feat_no_ts', status: 'planning' }
|
|
445
|
-
];
|
|
498
|
+
const features = [{ feature_id: 'feat_no_ts', status: 'planning' }];
|
|
446
499
|
const toolClient = { call: vi.fn(async () => ({ ok: true, data: { features } })) };
|
|
447
500
|
const handler = new StatusCommandHandler(toolClient as never, 'run:test');
|
|
448
|
-
const result = await handler.execute({ summary: true }) as any;
|
|
501
|
+
const result = (await handler.execute({ summary: true })) as any;
|
|
449
502
|
expect(result.ok).toBe(true);
|
|
450
503
|
const found = result.data.summary.find((f: any) => f.feature_id === 'feat_no_ts');
|
|
451
504
|
expect(found?.activity).toBe('unknown');
|
|
@@ -462,13 +515,13 @@ describe('StatusCommandHandler explicit activity_state branches', () => {
|
|
|
462
515
|
{ feature_id: 'feat_idle', status: 'building', activity_state: 'idle' },
|
|
463
516
|
{ feature_id: 'feat_waiting', status: 'building', activity_state: 'waiting_input' },
|
|
464
517
|
{ feature_id: 'feat_blocked', status: 'blocked', activity_state: 'blocked' },
|
|
465
|
-
{ feature_id: 'feat_exited', status: 'failed', activity_state: 'exited' }
|
|
466
|
-
]
|
|
467
|
-
}
|
|
468
|
-
}))
|
|
518
|
+
{ feature_id: 'feat_exited', status: 'failed', activity_state: 'exited' },
|
|
519
|
+
],
|
|
520
|
+
},
|
|
521
|
+
})),
|
|
469
522
|
};
|
|
470
523
|
const handler = new StatusCommandHandler(toolClient as never, 'run:test');
|
|
471
|
-
const result = await handler.execute({ summary: true }) as any;
|
|
524
|
+
const result = (await handler.execute({ summary: true })) as any;
|
|
472
525
|
expect(result.ok).toBe(true);
|
|
473
526
|
const idle = result.data.summary.find((f: any) => f.feature_id === 'feat_idle');
|
|
474
527
|
expect(idle?.activity).toBe('idle');
|
|
@@ -493,15 +546,15 @@ describe('StatusCommandHandler explicit activity_state branches', () => {
|
|
|
493
546
|
merge_ready: true,
|
|
494
547
|
pending_review_threads: 0,
|
|
495
548
|
has_conflicts: false,
|
|
496
|
-
merge_score: 1
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
]
|
|
500
|
-
}
|
|
501
|
-
}))
|
|
549
|
+
merge_score: 1,
|
|
550
|
+
},
|
|
551
|
+
},
|
|
552
|
+
],
|
|
553
|
+
},
|
|
554
|
+
})),
|
|
502
555
|
};
|
|
503
556
|
const handler = new StatusCommandHandler(toolClient as never, 'run:test');
|
|
504
|
-
const result = await handler.execute({}) as any;
|
|
557
|
+
const result = (await handler.execute({})) as any;
|
|
505
558
|
expect(result.ok).toBe(true);
|
|
506
559
|
expect(result.data.features[0].pr_info.number).toBe(42);
|
|
507
560
|
});
|