@bhargavvc/sdd-cc 1.35.0 → 1.42.3
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/README.ja-JP.md +54 -52
- package/README.ko-KR.md +47 -45
- package/README.md +86 -733
- package/README.pt-BR.md +14 -12
- package/README.zh-CN.md +31 -29
- package/agents/sdd-ai-researcher.md +2 -2
- package/agents/sdd-code-fixer.md +169 -17
- package/agents/sdd-code-reviewer.md +40 -8
- package/agents/sdd-codebase-mapper.md +89 -6
- package/agents/sdd-debug-session-manager.md +314 -0
- package/agents/sdd-debugger.md +147 -80
- package/agents/sdd-doc-classifier.md +168 -0
- package/agents/sdd-doc-synthesizer.md +204 -0
- package/agents/sdd-doc-verifier.md +20 -4
- package/agents/sdd-doc-writer.md +22 -9
- package/agents/sdd-domain-researcher.md +2 -2
- package/agents/sdd-eval-auditor.md +30 -3
- package/agents/sdd-eval-planner.md +2 -2
- package/agents/sdd-executor.md +203 -43
- package/agents/sdd-framework-selector.md +1 -1
- package/agents/sdd-integration-checker.md +30 -3
- package/agents/sdd-intel-updater.md +51 -23
- package/agents/sdd-nyquist-auditor.md +31 -4
- package/agents/sdd-pattern-mapper.md +335 -0
- package/agents/sdd-phase-researcher.md +195 -32
- package/agents/sdd-plan-checker.md +135 -24
- package/agents/sdd-planner.md +190 -205
- package/agents/sdd-project-researcher.md +7 -7
- package/agents/sdd-research-synthesizer.md +6 -6
- package/agents/sdd-roadmapper.md +19 -10
- package/agents/sdd-security-auditor.md +33 -6
- package/agents/sdd-ui-auditor.md +23 -7
- package/agents/sdd-ui-checker.md +16 -7
- package/agents/sdd-ui-researcher.md +8 -8
- package/agents/sdd-verifier.md +124 -27
- package/bin/install.js +5016 -372
- package/bin/sdd-sdk.js +37 -0
- package/commands/sdd/add-tests.md +5 -4
- package/commands/sdd/ai-integration-phase.md +4 -3
- package/commands/sdd/audit-fix.md +2 -1
- package/commands/sdd/audit-milestone.md +3 -2
- package/commands/sdd/autonomous.md +3 -3
- package/commands/sdd/capture.md +62 -0
- package/commands/sdd/cleanup.md +2 -1
- package/commands/sdd/code-review.md +8 -4
- package/commands/sdd/complete-milestone.md +15 -8
- package/commands/sdd/config.md +58 -0
- package/commands/sdd/debug.md +21 -155
- package/commands/sdd/discuss-phase.md +18 -11
- package/commands/sdd/docs-update.md +3 -2
- package/commands/sdd/eval-review.md +4 -3
- package/commands/sdd/execute-phase.md +5 -4
- package/commands/sdd/explore.md +3 -3
- package/commands/sdd/extract-learnings.md +23 -0
- package/commands/sdd/fast.md +4 -3
- package/commands/sdd/forensics.md +3 -2
- package/commands/sdd/graphify.md +199 -0
- package/commands/sdd/health.md +12 -3
- package/commands/sdd/help.md +1 -1
- package/commands/sdd/import.md +10 -5
- package/commands/sdd/inbox.md +39 -0
- package/commands/sdd/ingest-docs.md +42 -0
- package/commands/sdd/manager.md +8 -3
- package/commands/sdd/map-codebase.md +18 -6
- package/commands/sdd/milestone-summary.md +1 -1
- package/commands/sdd/mvp-phase.md +45 -0
- package/commands/sdd/new-milestone.md +4 -3
- package/commands/sdd/new-project.md +4 -3
- package/commands/sdd/ns-context.md +23 -0
- package/commands/sdd/ns-ideate.md +24 -0
- package/commands/sdd/ns-manage.md +29 -0
- package/commands/sdd/ns-project.md +22 -0
- package/commands/sdd/ns-review.md +26 -0
- package/commands/sdd/ns-workflow.md +28 -0
- package/commands/sdd/pause-work.md +6 -1
- package/commands/sdd/phase.md +56 -0
- package/commands/sdd/plan-phase.md +15 -5
- package/commands/sdd/plan-review-convergence.md +59 -0
- package/commands/sdd/pr-branch.md +2 -1
- package/commands/sdd/profile-user.md +1 -1
- package/commands/sdd/progress.md +27 -5
- package/commands/sdd/quick.md +128 -3
- package/commands/sdd/resume-work.md +2 -12
- package/commands/sdd/review-backlog.md +3 -2
- package/commands/sdd/review.md +3 -2
- package/commands/sdd/secure-phase.md +3 -2
- package/commands/sdd/settings.md +2 -9
- package/commands/sdd/ship.md +2 -1
- package/commands/sdd/sketch.md +60 -0
- package/commands/sdd/spec-phase.md +63 -0
- package/commands/sdd/spike.md +57 -0
- package/commands/sdd/stats.md +2 -1
- package/commands/sdd/surface.md +129 -0
- package/commands/sdd/thread.md +8 -111
- package/commands/sdd/ui-phase.md +3 -2
- package/commands/sdd/ui-review.md +3 -2
- package/commands/sdd/ultraplan-phase.md +34 -0
- package/commands/sdd/undo.md +2 -1
- package/commands/sdd/update.md +21 -10
- package/commands/sdd/validate-phase.md +3 -2
- package/commands/sdd/verify-work.md +5 -4
- package/commands/sdd/workspace.md +52 -0
- package/commands/sdd/workstreams.md +12 -11
- package/hooks/dist/sdd-check-update-worker.js +116 -0
- package/hooks/dist/sdd-check-update.js +13 -88
- package/hooks/dist/sdd-context-monitor.js +28 -1
- package/hooks/dist/sdd-phase-boundary.sh +23 -3
- package/hooks/dist/sdd-read-guard.js +21 -2
- package/hooks/dist/sdd-read-injection-scanner.js +152 -0
- package/hooks/dist/sdd-session-state.sh +38 -12
- package/hooks/dist/sdd-statusline.js +324 -28
- package/hooks/dist/sdd-update-banner.js +134 -0
- package/hooks/dist/sdd-validate-commit.sh +15 -5
- package/hooks/dist/sdd-workflow-guard.js +2 -2
- package/hooks/lib/git-cmd.js +150 -0
- package/hooks/sdd-check-update-worker.js +116 -0
- package/hooks/sdd-check-update.js +13 -88
- package/hooks/sdd-context-monitor.js +28 -1
- package/hooks/sdd-phase-boundary.sh +23 -3
- package/hooks/sdd-read-guard.js +21 -2
- package/hooks/sdd-read-injection-scanner.js +152 -0
- package/hooks/sdd-session-state.sh +38 -12
- package/hooks/sdd-statusline.js +324 -28
- package/hooks/sdd-update-banner.js +134 -0
- package/hooks/sdd-validate-commit.sh +15 -5
- package/hooks/sdd-workflow-guard.js +2 -2
- package/package.json +32 -7
- package/scripts/audit-workflow-script-paths.cjs +73 -0
- package/scripts/build-hooks.js +98 -4
- package/scripts/changeset/cli.cjs +269 -0
- package/scripts/changeset/github-release-notes.cjs +198 -0
- package/scripts/changeset/lint.cjs +110 -0
- package/scripts/changeset/new.cjs +137 -0
- package/scripts/changeset/parse.cjs +60 -0
- package/scripts/changeset/render.cjs +34 -0
- package/scripts/changeset/serialize.cjs +74 -0
- package/scripts/command-contract-helpers.cjs +61 -0
- package/scripts/diff-touches-shipped-paths.cjs +147 -0
- package/scripts/fix-slash-commands.cjs +106 -0
- package/scripts/gen-inventory-manifest.cjs +109 -0
- package/scripts/lint-command-contract.cjs +108 -0
- package/scripts/lint-descriptions.cjs +83 -0
- package/scripts/lint-no-source-grep-extras.cjs +81 -0
- package/scripts/lint-no-source-grep.cjs +174 -0
- package/scripts/lint-shell-command-projection-drift.cjs +57 -0
- package/scripts/lint-skill-deps.cjs +180 -0
- package/scripts/pr-template-policy.cjs +169 -0
- package/scripts/prompt-injection-scan.sh +2 -0
- package/scripts/rebrand-gsd-to-sdd.sh +4 -3
- package/scripts/strip-prose-atrefs.cjs +106 -0
- package/scripts/verify-tarball-sdk-dist.sh +69 -0
- package/sdd/bin/check-latest-version.cjs +104 -0
- package/sdd/bin/lib/active-workstream-store.cjs +85 -0
- package/sdd/bin/lib/adr-parser.cjs +394 -0
- package/sdd/bin/lib/artifacts.cjs +53 -0
- package/sdd/bin/lib/audit.cjs +755 -0
- package/sdd/bin/lib/cjs-command-router-adapter.cjs +39 -0
- package/sdd/bin/lib/clusters.cjs +135 -0
- package/sdd/bin/lib/command-aliases.generated.cjs +838 -0
- package/sdd/bin/lib/commands.cjs +108 -98
- package/sdd/bin/lib/config-schema.cjs +135 -0
- package/sdd/bin/lib/config.cjs +253 -68
- package/sdd/bin/lib/context-utilization.cjs +47 -0
- package/sdd/bin/lib/core.cjs +997 -607
- package/sdd/bin/lib/decisions.cjs +48 -0
- package/sdd/bin/lib/docs.cjs +36 -33
- package/sdd/bin/lib/drift.cjs +379 -0
- package/sdd/bin/lib/fallow-runner.cjs +109 -0
- package/sdd/bin/lib/frontmatter.cjs +19 -11
- package/sdd/bin/lib/gap-checker.cjs +197 -0
- package/sdd/bin/lib/graphify.cjs +577 -0
- package/sdd/bin/lib/init-command-router.cjs +70 -0
- package/sdd/bin/lib/init.cjs +603 -102
- package/sdd/bin/lib/install-profiles.cjs +572 -0
- package/sdd/bin/lib/installer-migration-authoring.cjs +117 -0
- package/sdd/bin/lib/installer-migration-report.cjs +328 -0
- package/sdd/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
- package/sdd/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
- package/sdd/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
- package/sdd/bin/lib/installer-migrations.cjs +703 -0
- package/sdd/bin/lib/intel.cjs +35 -52
- package/sdd/bin/lib/learnings.cjs +2 -1
- package/sdd/bin/lib/milestone.cjs +313 -283
- package/sdd/bin/lib/model-catalog.cjs +136 -0
- package/sdd/bin/lib/model-profiles.cjs +25 -70
- package/sdd/bin/lib/phase-command-router.cjs +96 -0
- package/sdd/bin/lib/phase.cjs +556 -102
- package/sdd/bin/lib/phases-command-router.cjs +39 -0
- package/sdd/bin/lib/plan-scan.cjs +138 -0
- package/sdd/bin/lib/planning-workspace.cjs +361 -0
- package/sdd/bin/lib/profile-output.cjs +109 -43
- package/sdd/bin/lib/profile-pipeline.cjs +1 -1
- package/sdd/bin/lib/review-reviewer-selection.cjs +125 -0
- package/sdd/bin/lib/roadmap-command-router.cjs +23 -0
- package/sdd/bin/lib/roadmap.cjs +278 -17
- package/sdd/bin/lib/runtime-homes.cjs +178 -0
- package/sdd/bin/lib/sdd2-import.cjs +3 -3
- package/sdd/bin/lib/secrets.cjs +33 -0
- package/sdd/bin/lib/security.cjs +8 -7
- package/sdd/bin/lib/shell-command-projection.cjs +548 -0
- package/sdd/bin/lib/state-command-router.cjs +100 -0
- package/sdd/bin/lib/state-document.cjs +12 -0
- package/sdd/bin/lib/state-document.generated.cjs +127 -0
- package/sdd/bin/lib/state.cjs +720 -218
- package/sdd/bin/lib/surface.cjs +398 -0
- package/sdd/bin/lib/template.cjs +4 -2
- package/sdd/bin/lib/uat.cjs +9 -2
- package/sdd/bin/lib/validate-command-router.cjs +55 -0
- package/sdd/bin/lib/verify-command-router.cjs +34 -0
- package/sdd/bin/lib/verify.cjs +464 -137
- package/sdd/bin/lib/workstream-inventory.cjs +159 -0
- package/sdd/bin/lib/workstream-name-policy.cjs +33 -0
- package/sdd/bin/lib/workstream.cjs +73 -195
- package/sdd/bin/lib/worktree-safety.cjs +563 -0
- package/sdd/bin/sdd-tools.cjs +386 -252
- package/sdd/bin/verify-reapply-patches.cjs +247 -0
- package/sdd/contexts/review.md +1 -0
- package/sdd/references/artifact-types.md +18 -0
- package/sdd/references/autonomous-smart-discuss.md +277 -0
- package/sdd/references/checkpoints.md +36 -0
- package/sdd/references/context-budget.md +85 -49
- package/sdd/references/continuation-format.md +26 -22
- package/sdd/references/debugger-philosophy.md +76 -0
- package/sdd/references/decimal-phase-calculation.md +5 -5
- package/sdd/references/doc-conflict-engine.md +91 -0
- package/sdd/references/domain-probes.md +1 -1
- package/sdd/references/execute-mvp-tdd.md +81 -0
- package/sdd/references/executor-examples.md +110 -0
- package/sdd/references/gate-prompts.md +2 -2
- package/sdd/references/git-integration.md +10 -7
- package/sdd/references/git-planning-commit.md +6 -4
- package/sdd/references/mandatory-initial-read.md +2 -0
- package/sdd/references/model-profiles.md +106 -6
- package/sdd/references/mvp-concepts.md +49 -0
- package/sdd/references/phase-argument-parsing.md +3 -3
- package/sdd/references/planner-antipatterns.md +89 -0
- package/sdd/references/planner-chunked.md +49 -0
- package/sdd/references/planner-human-verify-mode.md +57 -0
- package/sdd/references/planner-mvp-mode.md +53 -0
- package/sdd/references/planner-revision.md +1 -1
- package/sdd/references/planner-source-audit.md +73 -0
- package/sdd/references/planning-config.md +30 -13
- package/sdd/references/project-skills-discovery.md +19 -0
- package/sdd/references/scout-codebase.md +51 -0
- package/sdd/references/skeleton-template.md +48 -0
- package/sdd/references/sketch-interactivity.md +41 -0
- package/sdd/references/sketch-theme-system.md +94 -0
- package/sdd/references/sketch-tooling.md +45 -0
- package/sdd/references/sketch-variant-patterns.md +81 -0
- package/sdd/references/spidr-splitting.md +69 -0
- package/sdd/references/tdd.md +67 -0
- package/sdd/references/thinking-partner.md +1 -1
- package/sdd/references/universal-anti-patterns.md +4 -4
- package/sdd/references/user-story-template.md +58 -0
- package/sdd/references/verification-overrides.md +3 -3
- package/sdd/references/verify-mvp-mode.md +85 -0
- package/sdd/references/workstream-flag.md +11 -11
- package/sdd/references/worktree-path-safety.md +89 -0
- package/sdd/templates/AI-SPEC.md +1 -1
- package/sdd/templates/DEBUG.md +8 -3
- package/sdd/templates/README.md +77 -0
- package/sdd/templates/UAT.md +4 -4
- package/sdd/templates/VALIDATION.md +1 -1
- package/sdd/templates/claude-md.md +5 -5
- package/sdd/templates/config.json +16 -2
- package/sdd/templates/debug-subagent-prompt.md +1 -1
- package/sdd/templates/dev-preferences.md +1 -1
- package/sdd/templates/discovery.md +2 -2
- package/sdd/templates/phase-prompt.md +1 -1
- package/sdd/templates/planner-subagent-prompt.md +3 -3
- package/sdd/templates/project.md +1 -1
- package/sdd/templates/research.md +41 -1
- package/sdd/templates/spec.md +307 -0
- package/sdd/templates/state.md +9 -1
- package/sdd/workflows/add-backlog.md +90 -0
- package/sdd/workflows/add-phase.md +7 -7
- package/sdd/workflows/add-tests.md +12 -12
- package/sdd/workflows/add-todo.md +4 -4
- package/sdd/workflows/ai-integration-phase.md +26 -16
- package/sdd/workflows/analyze-dependencies.md +3 -3
- package/sdd/workflows/audit-fix.md +23 -3
- package/sdd/workflows/audit-milestone.md +37 -20
- package/sdd/workflows/audit-uat.md +3 -3
- package/sdd/workflows/autonomous.md +31 -301
- package/sdd/workflows/check-todos.md +6 -6
- package/sdd/workflows/cleanup.md +1 -1
- package/sdd/workflows/code-review-fix.md +20 -16
- package/sdd/workflows/code-review.md +114 -16
- package/sdd/workflows/complete-milestone.md +68 -15
- package/sdd/workflows/debug.md +231 -0
- package/sdd/workflows/diagnose-issues.md +8 -6
- package/sdd/workflows/discovery-phase.md +3 -3
- package/sdd/workflows/discuss-phase/modes/advisor.md +175 -0
- package/sdd/workflows/discuss-phase/modes/all.md +28 -0
- package/sdd/workflows/discuss-phase/modes/analyze.md +44 -0
- package/sdd/workflows/discuss-phase/modes/auto.md +56 -0
- package/sdd/workflows/discuss-phase/modes/batch.md +52 -0
- package/sdd/workflows/discuss-phase/modes/chain.md +97 -0
- package/sdd/workflows/discuss-phase/modes/default.md +141 -0
- package/sdd/workflows/discuss-phase/modes/power.md +44 -0
- package/sdd/workflows/discuss-phase/modes/text.md +55 -0
- package/sdd/workflows/discuss-phase/templates/checkpoint.json +18 -0
- package/sdd/workflows/discuss-phase/templates/context.md +136 -0
- package/sdd/workflows/discuss-phase/templates/discussion-log.md +50 -0
- package/sdd/workflows/discuss-phase-assumptions.md +24 -21
- package/sdd/workflows/discuss-phase-power.md +3 -3
- package/sdd/workflows/discuss-phase.md +203 -905
- package/sdd/workflows/do.md +25 -21
- package/sdd/workflows/docs-update.md +23 -17
- package/sdd/workflows/edit-phase.md +294 -0
- package/sdd/workflows/eval-review.md +7 -7
- package/sdd/workflows/execute-phase/steps/codebase-drift-gate.md +81 -0
- package/sdd/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
- package/sdd/workflows/execute-phase/steps/post-merge-gate.md +116 -0
- package/sdd/workflows/execute-phase.md +650 -252
- package/sdd/workflows/execute-plan.md +75 -35
- package/sdd/workflows/explore.md +7 -3
- package/sdd/workflows/extract-learnings.md +242 -0
- package/sdd/workflows/fast.md +5 -5
- package/sdd/workflows/forensics.md +19 -6
- package/sdd/workflows/graduation.md +195 -0
- package/sdd/workflows/health.md +49 -7
- package/sdd/workflows/help.md +323 -149
- package/sdd/workflows/import.md +20 -43
- package/sdd/workflows/inbox.md +5 -5
- package/sdd/workflows/ingest-docs.md +339 -0
- package/sdd/workflows/insert-phase.md +33 -12
- package/sdd/workflows/list-phase-assumptions.md +2 -2
- package/sdd/workflows/list-workspaces.md +2 -2
- package/sdd/workflows/manager.md +38 -11
- package/sdd/workflows/map-codebase.md +87 -23
- package/sdd/workflows/milestone-summary.md +8 -8
- package/sdd/workflows/mvp-phase.md +221 -0
- package/sdd/workflows/new-milestone.md +163 -23
- package/sdd/workflows/new-project.md +254 -53
- package/sdd/workflows/new-workspace.md +8 -8
- package/sdd/workflows/next.md +85 -18
- package/sdd/workflows/note.md +2 -2
- package/sdd/workflows/pause-work.md +13 -9
- package/sdd/workflows/plan-milestone-gaps.md +18 -11
- package/sdd/workflows/plan-phase.md +767 -94
- package/sdd/workflows/plan-review-convergence.md +329 -0
- package/sdd/workflows/plant-seed.md +146 -89
- package/sdd/workflows/pr-branch.md +1 -1
- package/sdd/workflows/profile-user.md +15 -15
- package/sdd/workflows/progress.md +198 -56
- package/sdd/workflows/quick.md +318 -54
- package/{commands/sdd → sdd/workflows}/reapply-patches.md +102 -23
- package/sdd/workflows/remove-phase.md +10 -10
- package/sdd/workflows/remove-workspace.md +21 -6
- package/sdd/workflows/resume-project.md +26 -23
- package/sdd/workflows/review.md +151 -20
- package/sdd/workflows/scan.md +5 -3
- package/sdd/workflows/secure-phase.md +26 -13
- package/sdd/workflows/settings-advanced.md +579 -0
- package/sdd/workflows/settings-integrations.md +281 -0
- package/sdd/workflows/settings.md +202 -23
- package/sdd/workflows/ship.md +131 -16
- package/sdd/workflows/sketch-wrap-up.md +285 -0
- package/sdd/workflows/sketch.md +360 -0
- package/sdd/workflows/spec-phase.md +262 -0
- package/sdd/workflows/spike-wrap-up.md +306 -0
- package/sdd/workflows/spike.md +452 -0
- package/sdd/workflows/stats.md +21 -2
- package/sdd/workflows/sync-skills.md +182 -0
- package/sdd/workflows/thread.md +221 -0
- package/sdd/workflows/transition.md +52 -30
- package/sdd/workflows/ui-phase.md +37 -20
- package/sdd/workflows/ui-review.md +12 -10
- package/sdd/workflows/ultraplan-phase.md +198 -0
- package/sdd/workflows/undo.md +9 -9
- package/sdd/workflows/update.md +187 -17
- package/sdd/workflows/validate-phase.md +12 -10
- package/sdd/workflows/verify-phase.md +112 -27
- package/sdd/workflows/verify-work.md +97 -28
- package/sdk/dist/cli-transport.d.ts +19 -0
- package/sdk/dist/cli-transport.d.ts.map +1 -0
- package/sdk/dist/cli-transport.js +104 -0
- package/sdk/dist/cli-transport.js.map +1 -0
- package/sdk/dist/cli.d.ts +46 -0
- package/sdk/dist/cli.d.ts.map +1 -0
- package/sdk/dist/cli.js +511 -0
- package/sdk/dist/cli.js.map +1 -0
- package/sdk/dist/config.d.ts +84 -0
- package/sdk/dist/config.d.ts.map +1 -0
- package/sdk/dist/config.js +135 -0
- package/sdk/dist/config.js.map +1 -0
- package/sdk/dist/context-engine.d.ts +49 -0
- package/sdk/dist/context-engine.d.ts.map +1 -0
- package/sdk/dist/context-engine.js +142 -0
- package/sdk/dist/context-engine.js.map +1 -0
- package/sdk/dist/context-truncation.d.ts +33 -0
- package/sdk/dist/context-truncation.d.ts.map +1 -0
- package/sdk/dist/context-truncation.js +197 -0
- package/sdk/dist/context-truncation.js.map +1 -0
- package/sdk/dist/errors.d.ts +46 -0
- package/sdk/dist/errors.d.ts.map +1 -0
- package/sdk/dist/errors.js +64 -0
- package/sdk/dist/errors.js.map +1 -0
- package/sdk/dist/event-stream.d.ts +53 -0
- package/sdk/dist/event-stream.d.ts.map +1 -0
- package/sdk/dist/event-stream.js +321 -0
- package/sdk/dist/event-stream.js.map +1 -0
- package/sdk/dist/golden/capture.d.ts +15 -0
- package/sdk/dist/golden/capture.d.ts.map +1 -0
- package/sdk/dist/golden/capture.js +67 -0
- package/sdk/dist/golden/capture.js.map +1 -0
- package/sdk/dist/golden/golden-integration-covered.d.ts +6 -0
- package/sdk/dist/golden/golden-integration-covered.d.ts.map +1 -0
- package/sdk/dist/golden/golden-integration-covered.js +30 -0
- package/sdk/dist/golden/golden-integration-covered.js.map +1 -0
- package/sdk/dist/golden/golden-mutation-covered.d.ts +7 -0
- package/sdk/dist/golden/golden-mutation-covered.d.ts.map +1 -0
- package/sdk/dist/golden/golden-mutation-covered.js +17 -0
- package/sdk/dist/golden/golden-mutation-covered.js.map +1 -0
- package/sdk/dist/golden/golden-policy.d.ts +10 -0
- package/sdk/dist/golden/golden-policy.d.ts.map +1 -0
- package/sdk/dist/golden/golden-policy.js +98 -0
- package/sdk/dist/golden/golden-policy.js.map +1 -0
- package/sdk/dist/golden/init-golden-normalize.d.ts +8 -0
- package/sdk/dist/golden/init-golden-normalize.d.ts.map +1 -0
- package/sdk/dist/golden/init-golden-normalize.js +14 -0
- package/sdk/dist/golden/init-golden-normalize.js.map +1 -0
- package/sdk/dist/golden/read-only-golden-rows.d.ts +20 -0
- package/sdk/dist/golden/read-only-golden-rows.d.ts.map +1 -0
- package/sdk/dist/golden/read-only-golden-rows.js +67 -0
- package/sdk/dist/golden/read-only-golden-rows.js.map +1 -0
- package/sdk/dist/golden/registry-canonical-commands.d.ts +6 -0
- package/sdk/dist/golden/registry-canonical-commands.d.ts.map +1 -0
- package/sdk/dist/golden/registry-canonical-commands.js +30 -0
- package/sdk/dist/golden/registry-canonical-commands.js.map +1 -0
- package/sdk/dist/index.d.ts +125 -0
- package/sdk/dist/index.d.ts.map +1 -0
- package/sdk/dist/index.js +298 -0
- package/sdk/dist/index.js.map +1 -0
- package/sdk/dist/init-runner.d.ts +90 -0
- package/sdk/dist/init-runner.d.ts.map +1 -0
- package/sdk/dist/init-runner.js +613 -0
- package/sdk/dist/init-runner.js.map +1 -0
- package/sdk/dist/logger.d.ts +50 -0
- package/sdk/dist/logger.d.ts.map +1 -0
- package/sdk/dist/logger.js +70 -0
- package/sdk/dist/logger.js.map +1 -0
- package/sdk/dist/model-catalog.d.ts +31 -0
- package/sdk/dist/model-catalog.d.ts.map +1 -0
- package/sdk/dist/model-catalog.js +31 -0
- package/sdk/dist/model-catalog.js.map +1 -0
- package/sdk/dist/phase-prompt.d.ts +72 -0
- package/sdk/dist/phase-prompt.d.ts.map +1 -0
- package/sdk/dist/phase-prompt.js +213 -0
- package/sdk/dist/phase-prompt.js.map +1 -0
- package/sdk/dist/phase-runner.d.ts +145 -0
- package/sdk/dist/phase-runner.d.ts.map +1 -0
- package/sdk/dist/phase-runner.js +1206 -0
- package/sdk/dist/phase-runner.js.map +1 -0
- package/sdk/dist/plan-parser.d.ts +55 -0
- package/sdk/dist/plan-parser.d.ts.map +1 -0
- package/sdk/dist/plan-parser.js +389 -0
- package/sdk/dist/plan-parser.js.map +1 -0
- package/sdk/dist/planning-journal.d.ts +64 -0
- package/sdk/dist/planning-journal.d.ts.map +1 -0
- package/sdk/dist/planning-journal.js +88 -0
- package/sdk/dist/planning-journal.js.map +1 -0
- package/sdk/dist/planning-runtime.d.ts +67 -0
- package/sdk/dist/planning-runtime.d.ts.map +1 -0
- package/sdk/dist/planning-runtime.js +58 -0
- package/sdk/dist/planning-runtime.js.map +1 -0
- package/sdk/dist/prompt-builder.d.ts +44 -0
- package/sdk/dist/prompt-builder.d.ts.map +1 -0
- package/sdk/dist/prompt-builder.js +180 -0
- package/sdk/dist/prompt-builder.js.map +1 -0
- package/sdk/dist/prompt-sanitizer.d.ts +35 -0
- package/sdk/dist/prompt-sanitizer.d.ts.map +1 -0
- package/sdk/dist/prompt-sanitizer.js +101 -0
- package/sdk/dist/prompt-sanitizer.js.map +1 -0
- package/sdk/dist/query/active-workstream-store.d.ts +7 -0
- package/sdk/dist/query/active-workstream-store.d.ts.map +1 -0
- package/sdk/dist/query/active-workstream-store.js +56 -0
- package/sdk/dist/query/active-workstream-store.js.map +1 -0
- package/sdk/dist/query/agent-failure-classifier.d.ts +38 -0
- package/sdk/dist/query/agent-failure-classifier.d.ts.map +1 -0
- package/sdk/dist/query/agent-failure-classifier.js +83 -0
- package/sdk/dist/query/agent-failure-classifier.js.map +1 -0
- package/sdk/dist/query/audit-open.d.ts +46 -0
- package/sdk/dist/query/audit-open.d.ts.map +1 -0
- package/sdk/dist/query/audit-open.js +662 -0
- package/sdk/dist/query/audit-open.js.map +1 -0
- package/sdk/dist/query/check-auto-mode.d.ts +13 -0
- package/sdk/dist/query/check-auto-mode.d.ts.map +1 -0
- package/sdk/dist/query/check-auto-mode.js +40 -0
- package/sdk/dist/query/check-auto-mode.js.map +1 -0
- package/sdk/dist/query/check-completion.d.ts +10 -0
- package/sdk/dist/query/check-completion.d.ts.map +1 -0
- package/sdk/dist/query/check-completion.js +157 -0
- package/sdk/dist/query/check-completion.js.map +1 -0
- package/sdk/dist/query/check-decision-coverage.d.ts +33 -0
- package/sdk/dist/query/check-decision-coverage.d.ts.map +1 -0
- package/sdk/dist/query/check-decision-coverage.js +472 -0
- package/sdk/dist/query/check-decision-coverage.js.map +1 -0
- package/sdk/dist/query/check-gates.d.ts +10 -0
- package/sdk/dist/query/check-gates.d.ts.map +1 -0
- package/sdk/dist/query/check-gates.js +89 -0
- package/sdk/dist/query/check-gates.js.map +1 -0
- package/sdk/dist/query/check-ship-ready.d.ts +10 -0
- package/sdk/dist/query/check-ship-ready.d.ts.map +1 -0
- package/sdk/dist/query/check-ship-ready.js +93 -0
- package/sdk/dist/query/check-ship-ready.js.map +1 -0
- package/sdk/dist/query/check-verification-status.d.ts +10 -0
- package/sdk/dist/query/check-verification-status.d.ts.map +1 -0
- package/sdk/dist/query/check-verification-status.js +142 -0
- package/sdk/dist/query/check-verification-status.js.map +1 -0
- package/sdk/dist/query/command-aliases.generated.d.ts +31 -0
- package/sdk/dist/query/command-aliases.generated.d.ts.map +1 -0
- package/sdk/dist/query/command-aliases.generated.js +135 -0
- package/sdk/dist/query/command-aliases.generated.js.map +1 -0
- package/sdk/dist/query/command-catalog.d.ts +9 -0
- package/sdk/dist/query/command-catalog.d.ts.map +1 -0
- package/sdk/dist/query/command-catalog.js +17 -0
- package/sdk/dist/query/command-catalog.js.map +1 -0
- package/sdk/dist/query/command-definition.d.ts +19 -0
- package/sdk/dist/query/command-definition.d.ts.map +1 -0
- package/sdk/dist/query/command-definition.js +44 -0
- package/sdk/dist/query/command-definition.js.map +1 -0
- package/sdk/dist/query/command-family-handlers.d.ts +3 -0
- package/sdk/dist/query/command-family-handlers.d.ts.map +1 -0
- package/sdk/dist/query/command-family-handlers.js +94 -0
- package/sdk/dist/query/command-family-handlers.js.map +1 -0
- package/sdk/dist/query/command-manifest.d.ts +2 -0
- package/sdk/dist/query/command-manifest.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.init.d.ts +6 -0
- package/sdk/dist/query/command-manifest.init.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.init.js +23 -0
- package/sdk/dist/query/command-manifest.init.js.map +1 -0
- package/sdk/dist/query/command-manifest.js +17 -0
- package/sdk/dist/query/command-manifest.js.map +1 -0
- package/sdk/dist/query/command-manifest.non-family.d.ts +9 -0
- package/sdk/dist/query/command-manifest.non-family.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.non-family.js +59 -0
- package/sdk/dist/query/command-manifest.non-family.js.map +1 -0
- package/sdk/dist/query/command-manifest.phase.d.ts +6 -0
- package/sdk/dist/query/command-manifest.phase.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.phase.js +15 -0
- package/sdk/dist/query/command-manifest.phase.js.map +1 -0
- package/sdk/dist/query/command-manifest.phases.d.ts +7 -0
- package/sdk/dist/query/command-manifest.phases.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.phases.js +10 -0
- package/sdk/dist/query/command-manifest.phases.js.map +1 -0
- package/sdk/dist/query/command-manifest.roadmap.d.ts +6 -0
- package/sdk/dist/query/command-manifest.roadmap.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.roadmap.js +10 -0
- package/sdk/dist/query/command-manifest.roadmap.js.map +1 -0
- package/sdk/dist/query/command-manifest.state.d.ts +9 -0
- package/sdk/dist/query/command-manifest.state.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.state.js +30 -0
- package/sdk/dist/query/command-manifest.state.js.map +1 -0
- package/sdk/dist/query/command-manifest.types.d.ts +12 -0
- package/sdk/dist/query/command-manifest.types.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.types.js +2 -0
- package/sdk/dist/query/command-manifest.types.js.map +1 -0
- package/sdk/dist/query/command-manifest.validate.d.ts +6 -0
- package/sdk/dist/query/command-manifest.validate.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.validate.js +10 -0
- package/sdk/dist/query/command-manifest.validate.js.map +1 -0
- package/sdk/dist/query/command-manifest.verify.d.ts +6 -0
- package/sdk/dist/query/command-manifest.verify.d.ts.map +1 -0
- package/sdk/dist/query/command-manifest.verify.js +14 -0
- package/sdk/dist/query/command-manifest.verify.js.map +1 -0
- package/sdk/dist/query/command-static-catalog-domain.d.ts +3 -0
- package/sdk/dist/query/command-static-catalog-domain.d.ts.map +1 -0
- package/sdk/dist/query/command-static-catalog-domain.js +116 -0
- package/sdk/dist/query/command-static-catalog-domain.js.map +1 -0
- package/sdk/dist/query/command-static-catalog-foundation.d.ts +7 -0
- package/sdk/dist/query/command-static-catalog-foundation.d.ts.map +1 -0
- package/sdk/dist/query/command-static-catalog-foundation.js +98 -0
- package/sdk/dist/query/command-static-catalog-foundation.js.map +1 -0
- package/sdk/dist/query/command-topology.d.ts +32 -0
- package/sdk/dist/query/command-topology.d.ts.map +1 -0
- package/sdk/dist/query/command-topology.js +66 -0
- package/sdk/dist/query/command-topology.js.map +1 -0
- package/sdk/dist/query/commands-list.d.ts +14 -0
- package/sdk/dist/query/commands-list.d.ts.map +1 -0
- package/sdk/dist/query/commands-list.js +18 -0
- package/sdk/dist/query/commands-list.js.map +1 -0
- package/sdk/dist/query/commit.d.ts +79 -0
- package/sdk/dist/query/commit.d.ts.map +1 -0
- package/sdk/dist/query/commit.js +340 -0
- package/sdk/dist/query/commit.js.map +1 -0
- package/sdk/dist/query/config-gates.d.ts +12 -0
- package/sdk/dist/query/config-gates.d.ts.map +1 -0
- package/sdk/dist/query/config-gates.js +66 -0
- package/sdk/dist/query/config-gates.js.map +1 -0
- package/sdk/dist/query/config-mutation.d.ts +86 -0
- package/sdk/dist/query/config-mutation.d.ts.map +1 -0
- package/sdk/dist/query/config-mutation.js +518 -0
- package/sdk/dist/query/config-mutation.js.map +1 -0
- package/sdk/dist/query/config-query.d.ts +57 -0
- package/sdk/dist/query/config-query.d.ts.map +1 -0
- package/sdk/dist/query/config-query.js +208 -0
- package/sdk/dist/query/config-query.js.map +1 -0
- package/sdk/dist/query/config-schema.d.ts +36 -0
- package/sdk/dist/query/config-schema.d.ts.map +1 -0
- package/sdk/dist/query/config-schema.js +147 -0
- package/sdk/dist/query/config-schema.js.map +1 -0
- package/sdk/dist/query/decisions.d.ts +58 -0
- package/sdk/dist/query/decisions.d.ts.map +1 -0
- package/sdk/dist/query/decisions.js +161 -0
- package/sdk/dist/query/decisions.js.map +1 -0
- package/sdk/dist/query/detect-custom-files.d.ts +11 -0
- package/sdk/dist/query/detect-custom-files.d.ts.map +1 -0
- package/sdk/dist/query/detect-custom-files.js +89 -0
- package/sdk/dist/query/detect-custom-files.js.map +1 -0
- package/sdk/dist/query/detect-phase-type.d.ts +9 -0
- package/sdk/dist/query/detect-phase-type.d.ts.map +1 -0
- package/sdk/dist/query/detect-phase-type.js +124 -0
- package/sdk/dist/query/detect-phase-type.js.map +1 -0
- package/sdk/dist/query/docs-init.d.ts +26 -0
- package/sdk/dist/query/docs-init.d.ts.map +1 -0
- package/sdk/dist/query/docs-init.js +231 -0
- package/sdk/dist/query/docs-init.js.map +1 -0
- package/sdk/dist/query/fallow-audit.d.ts +44 -0
- package/sdk/dist/query/fallow-audit.d.ts.map +1 -0
- package/sdk/dist/query/fallow-audit.js +44 -0
- package/sdk/dist/query/fallow-audit.js.map +1 -0
- package/sdk/dist/query/frontmatter-mutation.d.ts +77 -0
- package/sdk/dist/query/frontmatter-mutation.d.ts.map +1 -0
- package/sdk/dist/query/frontmatter-mutation.js +317 -0
- package/sdk/dist/query/frontmatter-mutation.js.map +1 -0
- package/sdk/dist/query/frontmatter.d.ts +93 -0
- package/sdk/dist/query/frontmatter.d.ts.map +1 -0
- package/sdk/dist/query/frontmatter.js +365 -0
- package/sdk/dist/query/frontmatter.js.map +1 -0
- package/sdk/dist/query/helpers.d.ts +191 -0
- package/sdk/dist/query/helpers.d.ts.map +1 -0
- package/sdk/dist/query/helpers.js +613 -0
- package/sdk/dist/query/helpers.js.map +1 -0
- package/sdk/dist/query/index.d.ts +8 -0
- package/sdk/dist/query/index.d.ts.map +1 -0
- package/sdk/dist/query/index.js +6 -0
- package/sdk/dist/query/index.js.map +1 -0
- package/sdk/dist/query/init-complex.d.ts +47 -0
- package/sdk/dist/query/init-complex.d.ts.map +1 -0
- package/sdk/dist/query/init-complex.js +718 -0
- package/sdk/dist/query/init-complex.js.map +1 -0
- package/sdk/dist/query/init.d.ts +106 -0
- package/sdk/dist/query/init.d.ts.map +1 -0
- package/sdk/dist/query/init.js +1159 -0
- package/sdk/dist/query/init.js.map +1 -0
- package/sdk/dist/query/intel.d.ts +43 -0
- package/sdk/dist/query/intel.d.ts.map +1 -0
- package/sdk/dist/query/intel.js +416 -0
- package/sdk/dist/query/intel.js.map +1 -0
- package/sdk/dist/query/mutation-event-decorator.d.ts +5 -0
- package/sdk/dist/query/mutation-event-decorator.d.ts.map +1 -0
- package/sdk/dist/query/mutation-event-decorator.js +28 -0
- package/sdk/dist/query/mutation-event-decorator.js.map +1 -0
- package/sdk/dist/query/mutation-event-mapper.d.ts +4 -0
- package/sdk/dist/query/mutation-event-mapper.d.ts.map +1 -0
- package/sdk/dist/query/mutation-event-mapper.js +70 -0
- package/sdk/dist/query/mutation-event-mapper.js.map +1 -0
- package/sdk/dist/query/mvp.d.ts +113 -0
- package/sdk/dist/query/mvp.d.ts.map +1 -0
- package/sdk/dist/query/mvp.js +225 -0
- package/sdk/dist/query/mvp.js.map +1 -0
- package/sdk/dist/query/phase-filesystem-adapter.d.ts +4 -0
- package/sdk/dist/query/phase-filesystem-adapter.d.ts.map +1 -0
- package/sdk/dist/query/phase-filesystem-adapter.js +33 -0
- package/sdk/dist/query/phase-filesystem-adapter.js.map +1 -0
- package/sdk/dist/query/phase-lifecycle-policy.d.ts +34 -0
- package/sdk/dist/query/phase-lifecycle-policy.d.ts.map +1 -0
- package/sdk/dist/query/phase-lifecycle-policy.js +138 -0
- package/sdk/dist/query/phase-lifecycle-policy.js.map +1 -0
- package/sdk/dist/query/phase-lifecycle.d.ts +116 -0
- package/sdk/dist/query/phase-lifecycle.d.ts.map +1 -0
- package/sdk/dist/query/phase-lifecycle.js +1486 -0
- package/sdk/dist/query/phase-lifecycle.js.map +1 -0
- package/sdk/dist/query/phase-list-queries.d.ts +18 -0
- package/sdk/dist/query/phase-list-queries.d.ts.map +1 -0
- package/sdk/dist/query/phase-list-queries.js +129 -0
- package/sdk/dist/query/phase-list-queries.js.map +1 -0
- package/sdk/dist/query/phase-ready.d.ts +9 -0
- package/sdk/dist/query/phase-ready.d.ts.map +1 -0
- package/sdk/dist/query/phase-ready.js +132 -0
- package/sdk/dist/query/phase-ready.js.map +1 -0
- package/sdk/dist/query/phase-roadmap-mutation.d.ts +13 -0
- package/sdk/dist/query/phase-roadmap-mutation.d.ts.map +1 -0
- package/sdk/dist/query/phase-roadmap-mutation.js +65 -0
- package/sdk/dist/query/phase-roadmap-mutation.js.map +1 -0
- package/sdk/dist/query/phase.d.ts +48 -0
- package/sdk/dist/query/phase.d.ts.map +1 -0
- package/sdk/dist/query/phase.js +451 -0
- package/sdk/dist/query/phase.js.map +1 -0
- package/sdk/dist/query/pipeline.d.ts +53 -0
- package/sdk/dist/query/pipeline.d.ts.map +1 -0
- package/sdk/dist/query/pipeline.js +198 -0
- package/sdk/dist/query/pipeline.js.map +1 -0
- package/sdk/dist/query/plan-scan.d.ts +14 -0
- package/sdk/dist/query/plan-scan.d.ts.map +1 -0
- package/sdk/dist/query/plan-scan.js +70 -0
- package/sdk/dist/query/plan-scan.js.map +1 -0
- package/sdk/dist/query/plan-task-structure.d.ts +9 -0
- package/sdk/dist/query/plan-task-structure.d.ts.map +1 -0
- package/sdk/dist/query/plan-task-structure.js +59 -0
- package/sdk/dist/query/plan-task-structure.js.map +1 -0
- package/sdk/dist/query/profile-extract-messages.d.ts +40 -0
- package/sdk/dist/query/profile-extract-messages.d.ts.map +1 -0
- package/sdk/dist/query/profile-extract-messages.js +195 -0
- package/sdk/dist/query/profile-extract-messages.js.map +1 -0
- package/sdk/dist/query/profile-output.d.ts +11 -0
- package/sdk/dist/query/profile-output.d.ts.map +1 -0
- package/sdk/dist/query/profile-output.js +873 -0
- package/sdk/dist/query/profile-output.js.map +1 -0
- package/sdk/dist/query/profile-questionnaire-data.d.ts +21 -0
- package/sdk/dist/query/profile-questionnaire-data.d.ts.map +1 -0
- package/sdk/dist/query/profile-questionnaire-data.js +171 -0
- package/sdk/dist/query/profile-questionnaire-data.js.map +1 -0
- package/sdk/dist/query/profile-sample.d.ts +22 -0
- package/sdk/dist/query/profile-sample.d.ts.map +1 -0
- package/sdk/dist/query/profile-sample.js +136 -0
- package/sdk/dist/query/profile-sample.js.map +1 -0
- package/sdk/dist/query/profile-scan-sessions.d.ts +49 -0
- package/sdk/dist/query/profile-scan-sessions.d.ts.map +1 -0
- package/sdk/dist/query/profile-scan-sessions.js +137 -0
- package/sdk/dist/query/profile-scan-sessions.js.map +1 -0
- package/sdk/dist/query/profile.d.ts +61 -0
- package/sdk/dist/query/profile.d.ts.map +1 -0
- package/sdk/dist/query/profile.js +307 -0
- package/sdk/dist/query/profile.js.map +1 -0
- package/sdk/dist/query/progress.d.ts +77 -0
- package/sdk/dist/query/progress.d.ts.map +1 -0
- package/sdk/dist/query/progress.js +481 -0
- package/sdk/dist/query/progress.js.map +1 -0
- package/sdk/dist/query/query-cli-adapter.d.ts +8 -0
- package/sdk/dist/query/query-cli-adapter.d.ts.map +1 -0
- package/sdk/dist/query/query-cli-adapter.js +32 -0
- package/sdk/dist/query/query-cli-adapter.js.map +1 -0
- package/sdk/dist/query/query-cli-output.d.ts +9 -0
- package/sdk/dist/query/query-cli-output.d.ts.map +1 -0
- package/sdk/dist/query/query-cli-output.js +28 -0
- package/sdk/dist/query/query-cli-output.js.map +1 -0
- package/sdk/dist/query/query-command-diagnosis.d.ts +6 -0
- package/sdk/dist/query/query-command-diagnosis.d.ts.map +1 -0
- package/sdk/dist/query/query-command-diagnosis.js +6 -0
- package/sdk/dist/query/query-command-diagnosis.js.map +1 -0
- package/sdk/dist/query/query-command-resolution-strategy.d.ts +29 -0
- package/sdk/dist/query/query-command-resolution-strategy.d.ts.map +1 -0
- package/sdk/dist/query/query-command-resolution-strategy.js +103 -0
- package/sdk/dist/query/query-command-resolution-strategy.js.map +1 -0
- package/sdk/dist/query/query-command-semantics.d.ts +7 -0
- package/sdk/dist/query/query-command-semantics.d.ts.map +1 -0
- package/sdk/dist/query/query-command-semantics.js +7 -0
- package/sdk/dist/query/query-command-semantics.js.map +1 -0
- package/sdk/dist/query/query-dispatch-contract.d.ts +21 -0
- package/sdk/dist/query/query-dispatch-contract.d.ts.map +1 -0
- package/sdk/dist/query/query-dispatch-contract.js +2 -0
- package/sdk/dist/query/query-dispatch-contract.js.map +1 -0
- package/sdk/dist/query/query-dispatch-error-mapper.d.ts +6 -0
- package/sdk/dist/query/query-dispatch-error-mapper.d.ts.map +1 -0
- package/sdk/dist/query/query-dispatch-error-mapper.js +6 -0
- package/sdk/dist/query/query-dispatch-error-mapper.js.map +1 -0
- package/sdk/dist/query/query-dispatch-formatting.d.ts +6 -0
- package/sdk/dist/query/query-dispatch-formatting.d.ts.map +1 -0
- package/sdk/dist/query/query-dispatch-formatting.js +6 -0
- package/sdk/dist/query/query-dispatch-formatting.js.map +1 -0
- package/sdk/dist/query/query-dispatch-input-validation.d.ts +6 -0
- package/sdk/dist/query/query-dispatch-input-validation.d.ts.map +1 -0
- package/sdk/dist/query/query-dispatch-input-validation.js +6 -0
- package/sdk/dist/query/query-dispatch-input-validation.js.map +1 -0
- package/sdk/dist/query/query-dispatch-observability.d.ts +2 -0
- package/sdk/dist/query/query-dispatch-observability.d.ts.map +1 -0
- package/sdk/dist/query/query-dispatch-observability.js +7 -0
- package/sdk/dist/query/query-dispatch-observability.js.map +1 -0
- package/sdk/dist/query/query-dispatch-plan.d.ts +6 -0
- package/sdk/dist/query/query-dispatch-plan.d.ts.map +1 -0
- package/sdk/dist/query/query-dispatch-plan.js +6 -0
- package/sdk/dist/query/query-dispatch-plan.js.map +1 -0
- package/sdk/dist/query/query-dispatch-result-builder.d.ts +6 -0
- package/sdk/dist/query/query-dispatch-result-builder.d.ts.map +1 -0
- package/sdk/dist/query/query-dispatch-result-builder.js +6 -0
- package/sdk/dist/query/query-dispatch-result-builder.js.map +1 -0
- package/sdk/dist/query/query-dispatch.d.ts +48 -0
- package/sdk/dist/query/query-dispatch.d.ts.map +1 -0
- package/sdk/dist/query/query-dispatch.js +175 -0
- package/sdk/dist/query/query-dispatch.js.map +1 -0
- package/sdk/dist/query/query-error-details-schema.d.ts +19 -0
- package/sdk/dist/query/query-error-details-schema.d.ts.map +1 -0
- package/sdk/dist/query/query-error-details-schema.js +10 -0
- package/sdk/dist/query/query-error-details-schema.js.map +1 -0
- package/sdk/dist/query/query-error-taxonomy.d.ts +38 -0
- package/sdk/dist/query/query-error-taxonomy.d.ts.map +1 -0
- package/sdk/dist/query/query-error-taxonomy.js +74 -0
- package/sdk/dist/query/query-error-taxonomy.js.map +1 -0
- package/sdk/dist/query/query-fallback-bridge-adapter.d.ts +14 -0
- package/sdk/dist/query/query-fallback-bridge-adapter.d.ts.map +1 -0
- package/sdk/dist/query/query-fallback-bridge-adapter.js +33 -0
- package/sdk/dist/query/query-fallback-bridge-adapter.js.map +1 -0
- package/sdk/dist/query/query-fallback-executor.d.ts +11 -0
- package/sdk/dist/query/query-fallback-executor.d.ts.map +1 -0
- package/sdk/dist/query/query-fallback-executor.js +31 -0
- package/sdk/dist/query/query-fallback-executor.js.map +1 -0
- package/sdk/dist/query/query-fallback-output-classifier.d.ts +6 -0
- package/sdk/dist/query/query-fallback-output-classifier.d.ts.map +1 -0
- package/sdk/dist/query/query-fallback-output-classifier.js +27 -0
- package/sdk/dist/query/query-fallback-output-classifier.js.map +1 -0
- package/sdk/dist/query/query-fallback-policy.d.ts +6 -0
- package/sdk/dist/query/query-fallback-policy.d.ts.map +1 -0
- package/sdk/dist/query/query-fallback-policy.js +7 -0
- package/sdk/dist/query/query-fallback-policy.js.map +1 -0
- package/sdk/dist/query/query-native-dispatch-adapter.d.ts +7 -0
- package/sdk/dist/query/query-native-dispatch-adapter.d.ts.map +1 -0
- package/sdk/dist/query/query-native-dispatch-adapter.js +6 -0
- package/sdk/dist/query/query-native-dispatch-adapter.js.map +1 -0
- package/sdk/dist/query/query-policy-capability.d.ts +10 -0
- package/sdk/dist/query/query-policy-capability.d.ts.map +1 -0
- package/sdk/dist/query/query-policy-capability.js +17 -0
- package/sdk/dist/query/query-policy-capability.js.map +1 -0
- package/sdk/dist/query/query-runtime-context.d.ts +19 -0
- package/sdk/dist/query/query-runtime-context.d.ts.map +1 -0
- package/sdk/dist/query/query-runtime-context.js +31 -0
- package/sdk/dist/query/query-runtime-context.js.map +1 -0
- package/sdk/dist/query/query-unknown-command-hints.d.ts +2 -0
- package/sdk/dist/query/query-unknown-command-hints.d.ts.map +1 -0
- package/sdk/dist/query/query-unknown-command-hints.js +6 -0
- package/sdk/dist/query/query-unknown-command-hints.js.map +1 -0
- package/sdk/dist/query/registry-assembly-descriptor.d.ts +12 -0
- package/sdk/dist/query/registry-assembly-descriptor.d.ts.map +1 -0
- package/sdk/dist/query/registry-assembly-descriptor.js +61 -0
- package/sdk/dist/query/registry-assembly-descriptor.js.map +1 -0
- package/sdk/dist/query/registry-assembly-invariants.d.ts +30 -0
- package/sdk/dist/query/registry-assembly-invariants.d.ts.map +1 -0
- package/sdk/dist/query/registry-assembly-invariants.js +77 -0
- package/sdk/dist/query/registry-assembly-invariants.js.map +1 -0
- package/sdk/dist/query/registry-assembly.d.ts +10 -0
- package/sdk/dist/query/registry-assembly.d.ts.map +1 -0
- package/sdk/dist/query/registry-assembly.js +53 -0
- package/sdk/dist/query/registry-assembly.js.map +1 -0
- package/sdk/dist/query/registry.d.ts +90 -0
- package/sdk/dist/query/registry.d.ts.map +1 -0
- package/sdk/dist/query/registry.js +129 -0
- package/sdk/dist/query/registry.js.map +1 -0
- package/sdk/dist/query/requirements-extract-from-plans.d.ts +9 -0
- package/sdk/dist/query/requirements-extract-from-plans.d.ts.map +1 -0
- package/sdk/dist/query/requirements-extract-from-plans.js +76 -0
- package/sdk/dist/query/requirements-extract-from-plans.js.map +1 -0
- package/sdk/dist/query/roadmap-update-plan-progress.d.ts +11 -0
- package/sdk/dist/query/roadmap-update-plan-progress.d.ts.map +1 -0
- package/sdk/dist/query/roadmap-update-plan-progress.js +124 -0
- package/sdk/dist/query/roadmap-update-plan-progress.js.map +1 -0
- package/sdk/dist/query/roadmap.d.ts +137 -0
- package/sdk/dist/query/roadmap.d.ts.map +1 -0
- package/sdk/dist/query/roadmap.js +753 -0
- package/sdk/dist/query/roadmap.js.map +1 -0
- package/sdk/dist/query/route-next-action.d.ts +9 -0
- package/sdk/dist/query/route-next-action.d.ts.map +1 -0
- package/sdk/dist/query/route-next-action.js +318 -0
- package/sdk/dist/query/route-next-action.js.map +1 -0
- package/sdk/dist/query/schema-detect.d.ts +21 -0
- package/sdk/dist/query/schema-detect.d.ts.map +1 -0
- package/sdk/dist/query/schema-detect.js +146 -0
- package/sdk/dist/query/schema-detect.js.map +1 -0
- package/sdk/dist/query/secrets.d.ts +27 -0
- package/sdk/dist/query/secrets.d.ts.map +1 -0
- package/sdk/dist/query/secrets.js +42 -0
- package/sdk/dist/query/secrets.js.map +1 -0
- package/sdk/dist/query/skill-manifest.d.ts +50 -0
- package/sdk/dist/query/skill-manifest.d.ts.map +1 -0
- package/sdk/dist/query/skill-manifest.js +171 -0
- package/sdk/dist/query/skill-manifest.js.map +1 -0
- package/sdk/dist/query/skills.d.ts +27 -0
- package/sdk/dist/query/skills.d.ts.map +1 -0
- package/sdk/dist/query/skills.js +137 -0
- package/sdk/dist/query/skills.js.map +1 -0
- package/sdk/dist/query/state-document.d.ts +14 -0
- package/sdk/dist/query/state-document.d.ts.map +1 -0
- package/sdk/dist/query/state-document.js +110 -0
- package/sdk/dist/query/state-document.js.map +1 -0
- package/sdk/dist/query/state-mutation.d.ts +224 -0
- package/sdk/dist/query/state-mutation.d.ts.map +1 -0
- package/sdk/dist/query/state-mutation.js +1539 -0
- package/sdk/dist/query/state-mutation.js.map +1 -0
- package/sdk/dist/query/state-project-load.d.ts +23 -0
- package/sdk/dist/query/state-project-load.d.ts.map +1 -0
- package/sdk/dist/query/state-project-load.js +75 -0
- package/sdk/dist/query/state-project-load.js.map +1 -0
- package/sdk/dist/query/state.d.ts +78 -0
- package/sdk/dist/query/state.d.ts.map +1 -0
- package/sdk/dist/query/state.js +430 -0
- package/sdk/dist/query/state.js.map +1 -0
- package/sdk/dist/query/summary.d.ts +18 -0
- package/sdk/dist/query/summary.d.ts.map +1 -0
- package/sdk/dist/query/summary.js +249 -0
- package/sdk/dist/query/summary.js.map +1 -0
- package/sdk/dist/query/template.d.ts +46 -0
- package/sdk/dist/query/template.d.ts.map +1 -0
- package/sdk/dist/query/template.js +210 -0
- package/sdk/dist/query/template.js.map +1 -0
- package/sdk/dist/query/uat.d.ts +34 -0
- package/sdk/dist/query/uat.d.ts.map +1 -0
- package/sdk/dist/query/uat.js +339 -0
- package/sdk/dist/query/uat.js.map +1 -0
- package/sdk/dist/query/utils.d.ts +59 -0
- package/sdk/dist/query/utils.d.ts.map +1 -0
- package/sdk/dist/query/utils.js +74 -0
- package/sdk/dist/query/utils.js.map +1 -0
- package/sdk/dist/query/validate.d.ts +67 -0
- package/sdk/dist/query/validate.d.ts.map +1 -0
- package/sdk/dist/query/validate.js +908 -0
- package/sdk/dist/query/validate.js.map +1 -0
- package/sdk/dist/query/verify.d.ts +110 -0
- package/sdk/dist/query/verify.d.ts.map +1 -0
- package/sdk/dist/query/verify.js +631 -0
- package/sdk/dist/query/verify.js.map +1 -0
- package/sdk/dist/query/websearch.d.ts +24 -0
- package/sdk/dist/query/websearch.d.ts.map +1 -0
- package/sdk/dist/query/websearch.js +68 -0
- package/sdk/dist/query/websearch.js.map +1 -0
- package/sdk/dist/query/workspace.d.ts +62 -0
- package/sdk/dist/query/workspace.d.ts.map +1 -0
- package/sdk/dist/query/workspace.js +104 -0
- package/sdk/dist/query/workspace.js.map +1 -0
- package/sdk/dist/query/workstream-inventory.d.ts +52 -0
- package/sdk/dist/query/workstream-inventory.d.ts.map +1 -0
- package/sdk/dist/query/workstream-inventory.js +141 -0
- package/sdk/dist/query/workstream-inventory.js.map +1 -0
- package/sdk/dist/query/workstream.d.ts +35 -0
- package/sdk/dist/query/workstream.d.ts.map +1 -0
- package/sdk/dist/query/workstream.js +298 -0
- package/sdk/dist/query/workstream.js.map +1 -0
- package/sdk/dist/query/worktree.d.ts +3 -0
- package/sdk/dist/query/worktree.d.ts.map +1 -0
- package/sdk/dist/query/worktree.js +36 -0
- package/sdk/dist/query/worktree.js.map +1 -0
- package/sdk/dist/query-command-executor.d.ts +22 -0
- package/sdk/dist/query-command-executor.d.ts.map +1 -0
- package/sdk/dist/query-command-executor.js +22 -0
- package/sdk/dist/query-command-executor.js.map +1 -0
- package/sdk/dist/query-execution-policy.d.ts +24 -0
- package/sdk/dist/query-execution-policy.d.ts.map +1 -0
- package/sdk/dist/query-execution-policy.js +27 -0
- package/sdk/dist/query-execution-policy.js.map +1 -0
- package/sdk/dist/query-failure-classification.d.ts +9 -0
- package/sdk/dist/query-failure-classification.d.ts.map +1 -0
- package/sdk/dist/query-failure-classification.js +32 -0
- package/sdk/dist/query-failure-classification.js.map +1 -0
- package/sdk/dist/query-hotpath-methods.d.ts +19 -0
- package/sdk/dist/query-hotpath-methods.d.ts.map +1 -0
- package/sdk/dist/query-hotpath-methods.js +34 -0
- package/sdk/dist/query-hotpath-methods.js.map +1 -0
- package/sdk/dist/query-native-direct-adapter.d.ts +20 -0
- package/sdk/dist/query-native-direct-adapter.d.ts.map +1 -0
- package/sdk/dist/query-native-direct-adapter.js +52 -0
- package/sdk/dist/query-native-direct-adapter.js.map +1 -0
- package/sdk/dist/query-native-hotpath-adapter.d.ts +15 -0
- package/sdk/dist/query-native-hotpath-adapter.d.ts.map +1 -0
- package/sdk/dist/query-native-hotpath-adapter.js +32 -0
- package/sdk/dist/query-native-hotpath-adapter.js.map +1 -0
- package/sdk/dist/query-raw-output-projection.d.ts +6 -0
- package/sdk/dist/query-raw-output-projection.d.ts.map +1 -0
- package/sdk/dist/query-raw-output-projection.js +67 -0
- package/sdk/dist/query-raw-output-projection.js.map +1 -0
- package/sdk/dist/query-runtime-bridge.d.ts +61 -0
- package/sdk/dist/query-runtime-bridge.d.ts.map +1 -0
- package/sdk/dist/query-runtime-bridge.js +144 -0
- package/sdk/dist/query-runtime-bridge.js.map +1 -0
- package/sdk/dist/query-sdd-tools-path.d.ts +2 -0
- package/sdk/dist/query-sdd-tools-path.d.ts.map +1 -0
- package/sdk/dist/query-sdd-tools-path.js +2 -0
- package/sdk/dist/query-sdd-tools-path.js.map +1 -0
- package/sdk/dist/query-sdd-tools-runtime.d.ts +20 -0
- package/sdk/dist/query-sdd-tools-runtime.d.ts.map +1 -0
- package/sdk/dist/query-sdd-tools-runtime.js +47 -0
- package/sdk/dist/query-sdd-tools-runtime.js.map +1 -0
- package/sdk/dist/query-subprocess-adapter.d.ts +18 -0
- package/sdk/dist/query-subprocess-adapter.d.ts.map +1 -0
- package/sdk/dist/query-subprocess-adapter.js +92 -0
- package/sdk/dist/query-subprocess-adapter.js.map +1 -0
- package/sdk/dist/query-tools-error-factory.d.ts +16 -0
- package/sdk/dist/query-tools-error-factory.d.ts.map +1 -0
- package/sdk/dist/query-tools-error-factory.js +33 -0
- package/sdk/dist/query-tools-error-factory.js.map +1 -0
- package/sdk/dist/research-gate.d.ts +24 -0
- package/sdk/dist/research-gate.d.ts.map +1 -0
- package/sdk/dist/research-gate.js +70 -0
- package/sdk/dist/research-gate.js.map +1 -0
- package/sdk/dist/runtime-gate.d.ts +14 -0
- package/sdk/dist/runtime-gate.d.ts.map +1 -0
- package/sdk/dist/runtime-gate.js +48 -0
- package/sdk/dist/runtime-gate.js.map +1 -0
- package/sdk/dist/sdd-tools-error.d.ts +23 -0
- package/sdk/dist/sdd-tools-error.d.ts.map +1 -0
- package/sdk/dist/sdd-tools-error.js +29 -0
- package/sdk/dist/sdd-tools-error.js.map +1 -0
- package/sdk/dist/sdd-tools.d.ts +97 -0
- package/sdk/dist/sdd-tools.d.ts.map +1 -0
- package/sdk/dist/sdd-tools.js +168 -0
- package/sdk/dist/sdd-tools.js.map +1 -0
- package/sdk/dist/sdd-transport-policy.d.ts +10 -0
- package/sdk/dist/sdd-transport-policy.d.ts.map +1 -0
- package/sdk/dist/sdd-transport-policy.js +32 -0
- package/sdk/dist/sdd-transport-policy.js.map +1 -0
- package/sdk/dist/sdd-transport.d.ts +39 -0
- package/sdk/dist/sdd-transport.d.ts.map +1 -0
- package/sdk/dist/sdd-transport.js +78 -0
- package/sdk/dist/sdd-transport.js.map +1 -0
- package/sdk/dist/sdk-package-compatibility.d.ts +38 -0
- package/sdk/dist/sdk-package-compatibility.d.ts.map +1 -0
- package/sdk/dist/sdk-package-compatibility.js +90 -0
- package/sdk/dist/sdk-package-compatibility.js.map +1 -0
- package/sdk/dist/session-runner.d.ts +40 -0
- package/sdk/dist/session-runner.d.ts.map +1 -0
- package/sdk/dist/session-runner.js +274 -0
- package/sdk/dist/session-runner.js.map +1 -0
- package/sdk/dist/tool-scoping.d.ts +31 -0
- package/sdk/dist/tool-scoping.d.ts.map +1 -0
- package/sdk/dist/tool-scoping.js +54 -0
- package/sdk/dist/tool-scoping.js.map +1 -0
- package/sdk/dist/types.d.ts +794 -0
- package/sdk/dist/types.d.ts.map +1 -0
- package/sdk/dist/types.js +77 -0
- package/sdk/dist/types.js.map +1 -0
- package/sdk/dist/workstream-name-policy.d.ts +13 -0
- package/sdk/dist/workstream-name-policy.d.ts.map +1 -0
- package/sdk/dist/workstream-name-policy.js +24 -0
- package/sdk/dist/workstream-name-policy.js.map +1 -0
- package/sdk/dist/workstream-utils.d.ts +15 -0
- package/sdk/dist/workstream-utils.d.ts.map +1 -0
- package/sdk/dist/workstream-utils.js +21 -0
- package/sdk/dist/workstream-utils.js.map +1 -0
- package/sdk/dist/ws-transport.d.ts +32 -0
- package/sdk/dist/ws-transport.d.ts.map +1 -0
- package/sdk/dist/ws-transport.js +84 -0
- package/sdk/dist/ws-transport.js.map +1 -0
- package/sdk/package-lock.json +2502 -0
- package/sdk/package.json +57 -0
- package/sdk/prompts/templates/project.md +186 -0
- package/sdk/prompts/templates/requirements.md +231 -0
- package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
- package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
- package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
- package/sdk/prompts/templates/research-project/STACK.md +120 -0
- package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
- package/sdk/prompts/templates/roadmap.md +202 -0
- package/sdk/prompts/templates/state.md +175 -0
- package/sdk/shared/model-catalog.json +122 -0
- package/sdk/src/assembled-prompts.test.ts +349 -0
- package/sdk/src/bug-3591-sddtools-runtime-workstream.test.ts +179 -0
- package/sdk/src/cli-transport.test.ts +388 -0
- package/sdk/src/cli-transport.ts +130 -0
- package/sdk/src/cli.test.ts +426 -0
- package/sdk/src/cli.ts +589 -0
- package/sdk/src/config.test.ts +271 -0
- package/sdk/src/config.ts +218 -0
- package/sdk/src/context-engine.test.ts +295 -0
- package/sdk/src/context-engine.ts +170 -0
- package/sdk/src/context-truncation.test.ts +163 -0
- package/sdk/src/context-truncation.ts +233 -0
- package/sdk/src/e2e.integration.test.ts +181 -0
- package/sdk/src/errors.ts +72 -0
- package/sdk/src/event-stream.test.ts +661 -0
- package/sdk/src/event-stream.ts +441 -0
- package/sdk/src/golden/capture.ts +95 -0
- package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
- package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
- package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
- package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
- package/sdk/src/golden/golden-integration-covered.ts +30 -0
- package/sdk/src/golden/golden-mutation-covered.ts +17 -0
- package/sdk/src/golden/golden-policy.test.ts +8 -0
- package/sdk/src/golden/golden-policy.ts +120 -0
- package/sdk/src/golden/golden.integration.test.ts +677 -0
- package/sdk/src/golden/init-golden-normalize.ts +15 -0
- package/sdk/src/golden/read-only-golden-rows.ts +77 -0
- package/sdk/src/golden/read-only-parity.integration.test.ts +133 -0
- package/sdk/src/golden/registry-canonical-commands.ts +31 -0
- package/sdk/src/index.ts +352 -0
- package/sdk/src/init-e2e.integration.test.ts +138 -0
- package/sdk/src/init-runner.test.ts +740 -0
- package/sdk/src/init-runner.ts +734 -0
- package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
- package/sdk/src/logger.test.ts +149 -0
- package/sdk/src/logger.ts +113 -0
- package/sdk/src/milestone-runner.test.ts +421 -0
- package/sdk/src/model-catalog.ts +70 -0
- package/sdk/src/phase-prompt.test.ts +535 -0
- package/sdk/src/phase-prompt.ts +259 -0
- package/sdk/src/phase-runner-types.test.ts +421 -0
- package/sdk/src/phase-runner.integration.test.ts +377 -0
- package/sdk/src/phase-runner.test.ts +2720 -0
- package/sdk/src/phase-runner.ts +1442 -0
- package/sdk/src/plan-parser.test.ts +579 -0
- package/sdk/src/plan-parser.ts +431 -0
- package/sdk/src/planning-journal.test.ts +70 -0
- package/sdk/src/planning-journal.ts +153 -0
- package/sdk/src/planning-runtime.test.ts +29 -0
- package/sdk/src/planning-runtime.ts +100 -0
- package/sdk/src/prompt-builder.test.ts +318 -0
- package/sdk/src/prompt-builder.ts +218 -0
- package/sdk/src/prompt-sanitizer.test.ts +260 -0
- package/sdk/src/prompt-sanitizer.ts +116 -0
- package/sdk/src/query/QUERY-HANDLERS.md +349 -0
- package/sdk/src/query/active-workstream-store.ts +50 -0
- package/sdk/src/query/agent-failure-classifier.test.ts +157 -0
- package/sdk/src/query/agent-failure-classifier.ts +105 -0
- package/sdk/src/query/audit-open.ts +722 -0
- package/sdk/src/query/check-auto-mode.test.ts +77 -0
- package/sdk/src/query/check-auto-mode.ts +49 -0
- package/sdk/src/query/check-completion.test.ts +113 -0
- package/sdk/src/query/check-completion.ts +182 -0
- package/sdk/src/query/check-decision-coverage.test.ts +519 -0
- package/sdk/src/query/check-decision-coverage.ts +554 -0
- package/sdk/src/query/check-gates.test.ts +103 -0
- package/sdk/src/query/check-gates.ts +112 -0
- package/sdk/src/query/check-ship-ready.test.ts +111 -0
- package/sdk/src/query/check-ship-ready.ts +104 -0
- package/sdk/src/query/check-verification-status.test.ts +143 -0
- package/sdk/src/query/check-verification-status.ts +160 -0
- package/sdk/src/query/command-aliases.generated.ts +156 -0
- package/sdk/src/query/command-catalog.ts +31 -0
- package/sdk/src/query/command-definition.test.ts +47 -0
- package/sdk/src/query/command-definition.ts +70 -0
- package/sdk/src/query/command-family-handlers.ts +117 -0
- package/sdk/src/query/command-manifest.init.ts +24 -0
- package/sdk/src/query/command-manifest.non-family.ts +85 -0
- package/sdk/src/query/command-manifest.phase.ts +16 -0
- package/sdk/src/query/command-manifest.phases.ts +11 -0
- package/sdk/src/query/command-manifest.roadmap.ts +11 -0
- package/sdk/src/query/command-manifest.state.ts +31 -0
- package/sdk/src/query/command-manifest.ts +17 -0
- package/sdk/src/query/command-manifest.types.ts +13 -0
- package/sdk/src/query/command-manifest.validate.ts +11 -0
- package/sdk/src/query/command-manifest.verify.ts +15 -0
- package/sdk/src/query/command-resolution.test.ts +70 -0
- package/sdk/src/query/command-seam-coverage.test.ts +118 -0
- package/sdk/src/query/command-static-catalog-domain.ts +117 -0
- package/sdk/src/query/command-static-catalog-foundation.ts +103 -0
- package/sdk/src/query/command-topology.test.ts +28 -0
- package/sdk/src/query/command-topology.ts +114 -0
- package/sdk/src/query/commands-list.test.ts +36 -0
- package/sdk/src/query/commands-list.ts +19 -0
- package/sdk/src/query/commit.test.ts +485 -0
- package/sdk/src/query/commit.ts +383 -0
- package/sdk/src/query/config-gates.test.ts +89 -0
- package/sdk/src/query/config-gates.ts +69 -0
- package/sdk/src/query/config-mutation.test.ts +598 -0
- package/sdk/src/query/config-mutation.ts +575 -0
- package/sdk/src/query/config-query.test.ts +367 -0
- package/sdk/src/query/config-query.ts +244 -0
- package/sdk/src/query/config-schema.ts +159 -0
- package/sdk/src/query/decisions.test.ts +215 -0
- package/sdk/src/query/decisions.ts +192 -0
- package/sdk/src/query/decomposed-handlers.test.ts +431 -0
- package/sdk/src/query/detect-custom-files.test.ts +115 -0
- package/sdk/src/query/detect-custom-files.ts +96 -0
- package/sdk/src/query/detect-phase-type.test.ts +105 -0
- package/sdk/src/query/detect-phase-type.ts +141 -0
- package/sdk/src/query/docs-init.ts +258 -0
- package/sdk/src/query/fallow-audit.ts +88 -0
- package/sdk/src/query/frontmatter-array.test.ts +14 -0
- package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
- package/sdk/src/query/frontmatter-mutation.ts +343 -0
- package/sdk/src/query/frontmatter.test.ts +326 -0
- package/sdk/src/query/frontmatter.ts +395 -0
- package/sdk/src/query/helpers.test.ts +615 -0
- package/sdk/src/query/helpers.ts +646 -0
- package/sdk/src/query/index-thin-seam.test.ts +16 -0
- package/sdk/src/query/index.ts +9 -0
- package/sdk/src/query/init-complex.test.ts +616 -0
- package/sdk/src/query/init-complex.ts +799 -0
- package/sdk/src/query/init-progress-precedence.test.ts +177 -0
- package/sdk/src/query/init-workstream-milestone-op.test.ts +321 -0
- package/sdk/src/query/init.test.ts +792 -0
- package/sdk/src/query/init.ts +1262 -0
- package/sdk/src/query/intel.test.ts +90 -0
- package/sdk/src/query/intel.ts +404 -0
- package/sdk/src/query/mutation-event-decorator.test.ts +45 -0
- package/sdk/src/query/mutation-event-decorator.ts +37 -0
- package/sdk/src/query/mutation-event-mapper.test.ts +33 -0
- package/sdk/src/query/mutation-event-mapper.ts +102 -0
- package/sdk/src/query/mvp.test.ts +335 -0
- package/sdk/src/query/mvp.ts +292 -0
- package/sdk/src/query/normalize-query-command.test.ts +102 -0
- package/sdk/src/query/phase-filesystem-adapter.ts +35 -0
- package/sdk/src/query/phase-lifecycle-policy.ts +171 -0
- package/sdk/src/query/phase-lifecycle.test.ts +1750 -0
- package/sdk/src/query/phase-lifecycle.ts +1833 -0
- package/sdk/src/query/phase-list-queries.test.ts +88 -0
- package/sdk/src/query/phase-list-queries.ts +152 -0
- package/sdk/src/query/phase-ready.test.ts +65 -0
- package/sdk/src/query/phase-ready.ts +159 -0
- package/sdk/src/query/phase-roadmap-mutation.ts +77 -0
- package/sdk/src/query/phase.test.ts +651 -0
- package/sdk/src/query/phase.ts +550 -0
- package/sdk/src/query/pipeline.test.ts +169 -0
- package/sdk/src/query/pipeline.ts +243 -0
- package/sdk/src/query/plan-scan.test.ts +35 -0
- package/sdk/src/query/plan-scan.ts +82 -0
- package/sdk/src/query/plan-task-structure.test.ts +65 -0
- package/sdk/src/query/plan-task-structure.ts +63 -0
- package/sdk/src/query/policy-convergence.test.ts +28 -0
- package/sdk/src/query/profile-extract-messages.ts +247 -0
- package/sdk/src/query/profile-output.ts +929 -0
- package/sdk/src/query/profile-questionnaire-data.ts +181 -0
- package/sdk/src/query/profile-sample.ts +184 -0
- package/sdk/src/query/profile-scan-sessions.ts +174 -0
- package/sdk/src/query/profile.test.ts +136 -0
- package/sdk/src/query/profile.ts +337 -0
- package/sdk/src/query/progress.test.ts +156 -0
- package/sdk/src/query/progress.ts +566 -0
- package/sdk/src/query/query-cli-adapter.test.ts +79 -0
- package/sdk/src/query/query-cli-adapter.ts +39 -0
- package/sdk/src/query/query-cli-output.test.ts +33 -0
- package/sdk/src/query/query-cli-output.ts +35 -0
- package/sdk/src/query/query-command-diagnosis.test.ts +22 -0
- package/sdk/src/query/query-command-diagnosis.ts +5 -0
- package/sdk/src/query/query-command-resolution-strategy.test.ts +34 -0
- package/sdk/src/query/query-command-resolution-strategy.ts +121 -0
- package/sdk/src/query/query-command-semantics.test.ts +22 -0
- package/sdk/src/query/query-command-semantics.ts +22 -0
- package/sdk/src/query/query-dispatch-contract.ts +30 -0
- package/sdk/src/query/query-dispatch-error-mapper.test.ts +62 -0
- package/sdk/src/query/query-dispatch-error-mapper.ts +5 -0
- package/sdk/src/query/query-dispatch-formatting.test.ts +28 -0
- package/sdk/src/query/query-dispatch-formatting.ts +5 -0
- package/sdk/src/query/query-dispatch-input-validation.test.ts +23 -0
- package/sdk/src/query/query-dispatch-input-validation.ts +5 -0
- package/sdk/src/query/query-dispatch-observability.test.ts +10 -0
- package/sdk/src/query/query-dispatch-observability.ts +6 -0
- package/sdk/src/query/query-dispatch-plan.test.ts +25 -0
- package/sdk/src/query/query-dispatch-plan.ts +5 -0
- package/sdk/src/query/query-dispatch-result-builder.test.ts +16 -0
- package/sdk/src/query/query-dispatch-result-builder.ts +5 -0
- package/sdk/src/query/query-dispatch.test.ts +399 -0
- package/sdk/src/query/query-dispatch.ts +243 -0
- package/sdk/src/query/query-error-details-schema.ts +29 -0
- package/sdk/src/query/query-error-taxonomy.test.ts +39 -0
- package/sdk/src/query/query-error-taxonomy.ts +117 -0
- package/sdk/src/query/query-fallback-bridge-adapter.test.ts +32 -0
- package/sdk/src/query/query-fallback-bridge-adapter.ts +54 -0
- package/sdk/src/query/query-fallback-executor.test.ts +82 -0
- package/sdk/src/query/query-fallback-executor.ts +44 -0
- package/sdk/src/query/query-fallback-output-classifier.test.ts +36 -0
- package/sdk/src/query/query-fallback-output-classifier.ts +31 -0
- package/sdk/src/query/query-fallback-policy.test.ts +13 -0
- package/sdk/src/query/query-fallback-policy.ts +11 -0
- package/sdk/src/query/query-native-dispatch-adapter.ts +16 -0
- package/sdk/src/query/query-policy-capability.test.ts +10 -0
- package/sdk/src/query/query-policy-capability.ts +26 -0
- package/sdk/src/query/query-policy-snapshot.test.ts +9 -0
- package/sdk/src/query/query-registry-capability.test.ts +14 -0
- package/sdk/src/query/query-runtime-context.ts +44 -0
- package/sdk/src/query/query-unknown-command-hints.test.ts +9 -0
- package/sdk/src/query/query-unknown-command-hints.ts +5 -0
- package/sdk/src/query/registry-assembly-descriptor.ts +87 -0
- package/sdk/src/query/registry-assembly-invariants.ts +127 -0
- package/sdk/src/query/registry-assembly.test.ts +138 -0
- package/sdk/src/query/registry-assembly.ts +78 -0
- package/sdk/src/query/registry.test.ts +208 -0
- package/sdk/src/query/registry.ts +142 -0
- package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
- package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
- package/sdk/src/query/roadmap-update-plan-progress.test.ts +233 -0
- package/sdk/src/query/roadmap-update-plan-progress.ts +159 -0
- package/sdk/src/query/roadmap.test.ts +1181 -0
- package/sdk/src/query/roadmap.ts +894 -0
- package/sdk/src/query/route-next-action.test.ts +61 -0
- package/sdk/src/query/route-next-action.ts +345 -0
- package/sdk/src/query/schema-detect.ts +189 -0
- package/sdk/src/query/secrets.test.ts +66 -0
- package/sdk/src/query/secrets.ts +43 -0
- package/sdk/src/query/skill-manifest.test.ts +62 -0
- package/sdk/src/query/skill-manifest.ts +216 -0
- package/sdk/src/query/skills.test.ts +234 -0
- package/sdk/src/query/skills.ts +143 -0
- package/sdk/src/query/state-document.test.ts +197 -0
- package/sdk/src/query/state-document.ts +129 -0
- package/sdk/src/query/state-mutation.test.ts +1198 -0
- package/sdk/src/query/state-mutation.ts +1718 -0
- package/sdk/src/query/state-project-load.ts +80 -0
- package/sdk/src/query/state.test.ts +616 -0
- package/sdk/src/query/state.ts +463 -0
- package/sdk/src/query/sub-repos-root.integration.test.ts +79 -0
- package/sdk/src/query/summary.test.ts +95 -0
- package/sdk/src/query/summary.ts +296 -0
- package/sdk/src/query/template.test.ts +180 -0
- package/sdk/src/query/template.ts +242 -0
- package/sdk/src/query/uat.test.ts +77 -0
- package/sdk/src/query/uat.ts +365 -0
- package/sdk/src/query/utils.test.ts +82 -0
- package/sdk/src/query/utils.ts +106 -0
- package/sdk/src/query/validate.test.ts +831 -0
- package/sdk/src/query/validate.ts +952 -0
- package/sdk/src/query/verify.test.ts +414 -0
- package/sdk/src/query/verify.ts +692 -0
- package/sdk/src/query/websearch.test.ts +31 -0
- package/sdk/src/query/websearch.ts +82 -0
- package/sdk/src/query/workspace.test.ts +120 -0
- package/sdk/src/query/workspace.ts +145 -0
- package/sdk/src/query/workstream-inventory.ts +195 -0
- package/sdk/src/query/workstream.test.ts +153 -0
- package/sdk/src/query/workstream.ts +324 -0
- package/sdk/src/query/worktree.ts +39 -0
- package/sdk/src/query-command-executor.ts +31 -0
- package/sdk/src/query-execution-policy.test.ts +52 -0
- package/sdk/src/query-execution-policy.ts +46 -0
- package/sdk/src/query-failure-classification.test.ts +23 -0
- package/sdk/src/query-failure-classification.ts +42 -0
- package/sdk/src/query-hotpath-methods.ts +48 -0
- package/sdk/src/query-native-direct-adapter.test.ts +35 -0
- package/sdk/src/query-native-direct-adapter.ts +70 -0
- package/sdk/src/query-native-hotpath-adapter.test.ts +43 -0
- package/sdk/src/query-native-hotpath-adapter.ts +45 -0
- package/sdk/src/query-raw-output-projection.test.ts +39 -0
- package/sdk/src/query-raw-output-projection.ts +74 -0
- package/sdk/src/query-runtime-bridge.test.ts +150 -0
- package/sdk/src/query-runtime-bridge.ts +215 -0
- package/sdk/src/query-runtime-seam-coverage.test.ts +20 -0
- package/sdk/src/query-sdd-tools-path.ts +1 -0
- package/sdk/src/query-sdd-tools-runtime.ts +89 -0
- package/sdk/src/query-subprocess-adapter.test.ts +84 -0
- package/sdk/src/query-subprocess-adapter.ts +146 -0
- package/sdk/src/query-tools-error-factory.test.ts +35 -0
- package/sdk/src/query-tools-error-factory.ts +76 -0
- package/sdk/src/research-gate.test.ts +190 -0
- package/sdk/src/research-gate.ts +94 -0
- package/sdk/src/runtime-bridge-options.test.ts +33 -0
- package/sdk/src/runtime-gate.test.ts +84 -0
- package/sdk/src/runtime-gate.ts +52 -0
- package/sdk/src/sdd-tools-error.test.ts +21 -0
- package/sdk/src/sdd-tools-error.ts +65 -0
- package/sdk/src/sdd-tools.test.ts +472 -0
- package/sdk/src/sdd-tools.ts +237 -0
- package/sdk/src/sdd-transport-policy.test.ts +34 -0
- package/sdk/src/sdd-transport-policy.ts +48 -0
- package/sdk/src/sdd-transport.test.ts +292 -0
- package/sdk/src/sdd-transport.ts +117 -0
- package/sdk/src/sdk-package-compatibility.test.ts +97 -0
- package/sdk/src/sdk-package-compatibility.ts +141 -0
- package/sdk/src/session-runner.test.ts +164 -0
- package/sdk/src/session-runner.ts +327 -0
- package/sdk/src/tool-scoping.test.ts +160 -0
- package/sdk/src/tool-scoping.ts +61 -0
- package/sdk/src/types.ts +927 -0
- package/sdk/src/workflow-agent-skills-consistency.test.ts +98 -0
- package/sdk/src/workstream-name-policy.ts +24 -0
- package/sdk/src/workstream-utils.ts +21 -0
- package/sdk/src/ws-flag.test.ts +285 -0
- package/sdk/src/ws-transport.test.ts +161 -0
- package/sdk/src/ws-transport.ts +93 -0
- package/sdk/tsconfig.json +20 -0
- package/commands/sdd/add-backlog.md +0 -76
- package/commands/sdd/add-phase.md +0 -43
- package/commands/sdd/add-todo.md +0 -47
- package/commands/sdd/analyze-dependencies.md +0 -34
- package/commands/sdd/check-todos.md +0 -45
- package/commands/sdd/code-review-fix.md +0 -52
- package/commands/sdd/do.md +0 -30
- package/commands/sdd/from-sdd2.md +0 -45
- package/commands/sdd/insert-phase.md +0 -32
- package/commands/sdd/intel.md +0 -179
- package/commands/sdd/join-discord.md +0 -19
- package/commands/sdd/list-phase-assumptions.md +0 -46
- package/commands/sdd/list-workspaces.md +0 -19
- package/commands/sdd/new-workspace.md +0 -44
- package/commands/sdd/next.md +0 -26
- package/commands/sdd/note.md +0 -34
- package/commands/sdd/plan-milestone-gaps.md +0 -34
- package/commands/sdd/plant-seed.md +0 -28
- package/commands/sdd/remove-phase.md +0 -31
- package/commands/sdd/remove-workspace.md +0 -26
- package/commands/sdd/research-phase.md +0 -195
- package/commands/sdd/scan.md +0 -26
- package/commands/sdd/session-report.md +0 -19
- package/commands/sdd/set-profile.md +0 -12
- package/scripts/sync-upstream.sh +0 -56
- package/sdd/workflows/research-phase.md +0 -82
package/sdd/bin/lib/phase.cjs
CHANGED
|
@@ -4,10 +4,64 @@
|
|
|
4
4
|
|
|
5
5
|
const fs = require('fs');
|
|
6
6
|
const path = require('path');
|
|
7
|
-
const { escapeRegex, loadConfig, normalizePhaseName, comparePhaseNum, findPhaseInternal, getArchivedPhaseDirs, generateSlugInternal, getMilestonePhaseFilter, stripShippedMilestones, extractCurrentMilestone, replaceInCurrentMilestone, toPosixPath,
|
|
7
|
+
const { escapeRegex, loadConfig, normalizePhaseName, phaseMarkdownRegexSource, comparePhaseNum, findPhaseInternal, getArchivedPhaseDirs, generateSlugInternal, getMilestonePhaseFilter, stripShippedMilestones, extractCurrentMilestone, replaceInCurrentMilestone, toPosixPath, output, error, readSubdirectories, phaseTokenMatches, ERROR_REASON } = require('./core.cjs');
|
|
8
|
+
const { platformWriteSync, platformReadSync, platformEnsureDir } = require('./shell-command-projection.cjs');
|
|
9
|
+
const { planningDir, withPlanningLock } = require('./planning-workspace.cjs');
|
|
8
10
|
const { extractFrontmatter } = require('./frontmatter.cjs');
|
|
9
11
|
const { writeStateMd, readModifyWriteStateMd, stateExtractField, stateReplaceField, stateReplaceFieldWithFallback, updatePerformanceMetricsSection } = require('./state.cjs');
|
|
10
12
|
|
|
13
|
+
// #2893 — strict canonical filter: `{padded_phase}-{NN}-PLAN.md` or `PLAN.md`.
|
|
14
|
+
// Documented in agents/sdd-planner.md (write_phase_prompt step). The wider
|
|
15
|
+
// "looks like a plan but isn't canonical" probe below is used to surface a
|
|
16
|
+
// loud warning instead of silently returning zero plans.
|
|
17
|
+
const isCanonicalPlanFile = (f) => f.endsWith('-PLAN.md') || f === 'PLAN.md';
|
|
18
|
+
|
|
19
|
+
// Any .md file with PLAN anywhere in the basename — the diagnostic net for
|
|
20
|
+
// catching agent deviations like `01-PLAN-01-foundation.md` (#2893).
|
|
21
|
+
// Excludes derivative files (`-PLAN-OUTLINE.md`, `*.pre-bounce.md`, etc.) that
|
|
22
|
+
// the planner legitimately produces alongside canonical plans.
|
|
23
|
+
const PLAN_OUTLINE_RE = /-PLAN-OUTLINE\.md$/i;
|
|
24
|
+
const PLAN_PRE_BOUNCE_RE = /-PLAN.*\.pre-bounce\.md$/i;
|
|
25
|
+
const looksLikePlanFile = (f) =>
|
|
26
|
+
/\.md$/i.test(f)
|
|
27
|
+
&& /PLAN/i.test(f)
|
|
28
|
+
&& !PLAN_OUTLINE_RE.test(f)
|
|
29
|
+
&& !PLAN_PRE_BOUNCE_RE.test(f);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Detect plan-shaped files that the canonical filter would reject. Returns
|
|
33
|
+
* a warning string when offenders exist, else null. Centralised so every
|
|
34
|
+
* read site (phase-plan-index, phases list --type plans, find-phase) emits
|
|
35
|
+
* the same message.
|
|
36
|
+
*
|
|
37
|
+
* @param {string[]} dirFiles — readdirSync output for one phase directory
|
|
38
|
+
* @param {string[]} matchedFiles — what the canonical filter accepted
|
|
39
|
+
* @returns {string|null}
|
|
40
|
+
*/
|
|
41
|
+
function describeNonCanonicalPlans(dirFiles, matchedFiles) {
|
|
42
|
+
const matched = new Set(matchedFiles);
|
|
43
|
+
const offenders = dirFiles.filter((f) => looksLikePlanFile(f) && !matched.has(f));
|
|
44
|
+
if (offenders.length === 0) return null;
|
|
45
|
+
return (
|
|
46
|
+
`Found ${offenders.length} plan-shaped file(s) in this phase that don't match the canonical ` +
|
|
47
|
+
`naming convention "{padded_phase}-{NN}-PLAN.md" (or bare "PLAN.md") and were skipped: ` +
|
|
48
|
+
offenders.map((f) => `"${f}"`).join(', ') +
|
|
49
|
+
`. Rename to the canonical form (e.g. "01-01-PLAN.md") so the executor can detect them. ` +
|
|
50
|
+
`See agents/sdd-planner.md write_phase_prompt step for the full contract.`
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function extractCanonicalPlanId(filename) {
|
|
55
|
+
const base = filename.replace(/-PLAN\.md$/i, '').replace(/-SUMMARY\.md$/i, '').replace(/\.md$/i, '');
|
|
56
|
+
const parts = base.split('-').filter(Boolean);
|
|
57
|
+
const tokenRe = /^\d+[A-Z]?(?:\.\d+)*$/i;
|
|
58
|
+
const phaseIdx = parts.findIndex(p => tokenRe.test(p));
|
|
59
|
+
if (phaseIdx >= 0 && phaseIdx + 1 < parts.length && tokenRe.test(parts[phaseIdx + 1])) {
|
|
60
|
+
return `${parts[phaseIdx]}-${parts[phaseIdx + 1]}`;
|
|
61
|
+
}
|
|
62
|
+
return base;
|
|
63
|
+
}
|
|
64
|
+
|
|
11
65
|
function cmdPhasesList(cwd, options, raw) {
|
|
12
66
|
const phasesDir = path.join(planningDir(cwd), 'phases');
|
|
13
67
|
const { type, phase, includeArchived } = options;
|
|
@@ -52,13 +106,18 @@ function cmdPhasesList(cwd, options, raw) {
|
|
|
52
106
|
// If listing files of a specific type
|
|
53
107
|
if (type) {
|
|
54
108
|
const files = [];
|
|
109
|
+
const warnings = [];
|
|
55
110
|
for (const dir of dirs) {
|
|
56
111
|
const dirPath = path.join(phasesDir, dir);
|
|
57
112
|
const dirFiles = fs.readdirSync(dirPath);
|
|
58
113
|
|
|
59
114
|
let filtered;
|
|
60
115
|
if (type === 'plans') {
|
|
61
|
-
filtered = dirFiles.filter(
|
|
116
|
+
filtered = dirFiles.filter(isCanonicalPlanFile);
|
|
117
|
+
// #2893 — surface plan-shaped files the canonical filter rejected
|
|
118
|
+
// so callers (executor init, etc.) don't silently see zero plans.
|
|
119
|
+
const w = describeNonCanonicalPlans(dirFiles, filtered);
|
|
120
|
+
if (w) warnings.push(`${dir}: ${w}`);
|
|
62
121
|
} else if (type === 'summaries') {
|
|
63
122
|
filtered = dirFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
|
|
64
123
|
} else {
|
|
@@ -73,6 +132,7 @@ function cmdPhasesList(cwd, options, raw) {
|
|
|
73
132
|
count: files.length,
|
|
74
133
|
phase_dir: phase ? dirs[0].replace(/^\d+(?:\.\d+)*-?/, '') : null,
|
|
75
134
|
};
|
|
135
|
+
if (warnings.length) result.warning = warnings.join(' | ');
|
|
76
136
|
output(result, raw, files.join('\n'));
|
|
77
137
|
return;
|
|
78
138
|
}
|
|
@@ -110,8 +170,10 @@ function cmdPhaseNextDecimal(cwd, basePhase, raw) {
|
|
|
110
170
|
if (fs.existsSync(roadmapPath)) {
|
|
111
171
|
try {
|
|
112
172
|
const roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
|
|
173
|
+
// #3537: padding-tolerant on both sides — `0*${escapeRegex(...)}`
|
|
174
|
+
// tolerated extra padding but not missing.
|
|
113
175
|
const phasePattern = new RegExp(
|
|
114
|
-
`#{2,4}\\s*Phase\\s
|
|
176
|
+
`#{2,4}\\s*Phase\\s+${phaseMarkdownRegexSource(normalized)}\\.(\\d+)\\s*:`, 'gi'
|
|
115
177
|
);
|
|
116
178
|
let pm;
|
|
117
179
|
while ((pm = phasePattern.exec(roadmapContent)) !== null) {
|
|
@@ -148,50 +210,128 @@ function cmdPhaseNextDecimal(cwd, basePhase, raw) {
|
|
|
148
210
|
}
|
|
149
211
|
}
|
|
150
212
|
|
|
213
|
+
function getRoadmapModeForPhase(cwd, phaseNum) {
|
|
214
|
+
const roadmapPath = path.join(planningDir(cwd), 'ROADMAP.md');
|
|
215
|
+
if (!fs.existsSync(roadmapPath)) return null;
|
|
216
|
+
|
|
217
|
+
const rawContent = fs.readFileSync(roadmapPath, 'utf-8');
|
|
218
|
+
const milestoneContent = extractCurrentMilestone(rawContent, cwd);
|
|
219
|
+
const fullContent = stripShippedMilestones(rawContent);
|
|
220
|
+
const escapedPhase = phaseMarkdownRegexSource(phaseNum);
|
|
221
|
+
const phaseHeader = new RegExp(`#{2,4}\\s*Phase\\s+${escapedPhase}\\s*:`, 'i');
|
|
222
|
+
|
|
223
|
+
for (const content of [milestoneContent, fullContent]) {
|
|
224
|
+
const headerMatch = content.match(phaseHeader);
|
|
225
|
+
if (!headerMatch || headerMatch.index === undefined) continue;
|
|
226
|
+
|
|
227
|
+
const sectionStart = headerMatch.index;
|
|
228
|
+
const rest = content.slice(sectionStart);
|
|
229
|
+
const nextHeader = rest.slice(headerMatch[0].length).match(/\n#{2,4}\s+Phase\s+\S/i);
|
|
230
|
+
const sectionEnd = nextHeader ? sectionStart + headerMatch[0].length + nextHeader.index : content.length;
|
|
231
|
+
const section = content.slice(sectionStart, sectionEnd);
|
|
232
|
+
const modeMatch = section.match(/\*\*Mode(?::\*\*|\*\*:)\s*([^\n]+)/i);
|
|
233
|
+
if (modeMatch) return modeMatch[1].trim().toLowerCase();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function cmdPhaseMvpMode(cwd, args, raw) {
|
|
240
|
+
const phaseNum = args[0];
|
|
241
|
+
if (!phaseNum) {
|
|
242
|
+
error('Usage: phase.mvp-mode <phase-number> [--cli-flag]', ERROR_REASON.USAGE);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const cliFlagPresent = args.includes('--cli-flag');
|
|
246
|
+
const roadmapMode = getRoadmapModeForPhase(cwd, phaseNum);
|
|
247
|
+
const config = loadConfig(cwd);
|
|
248
|
+
const configMvpMode = Boolean(config.mvp_mode);
|
|
249
|
+
|
|
250
|
+
let active = false;
|
|
251
|
+
let source = 'none';
|
|
252
|
+
if (cliFlagPresent) {
|
|
253
|
+
active = true;
|
|
254
|
+
source = 'cli_flag';
|
|
255
|
+
} else if (roadmapMode === 'mvp') {
|
|
256
|
+
active = true;
|
|
257
|
+
source = 'roadmap';
|
|
258
|
+
} else if (configMvpMode) {
|
|
259
|
+
active = true;
|
|
260
|
+
source = 'config';
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
output({
|
|
264
|
+
active,
|
|
265
|
+
source,
|
|
266
|
+
roadmap_mode: roadmapMode,
|
|
267
|
+
config_mvp_mode: configMvpMode,
|
|
268
|
+
cli_flag_present: cliFlagPresent,
|
|
269
|
+
}, raw);
|
|
270
|
+
}
|
|
271
|
+
|
|
151
272
|
function cmdFindPhase(cwd, phase, raw) {
|
|
152
273
|
if (!phase) {
|
|
153
274
|
error('phase identifier required');
|
|
154
275
|
}
|
|
155
276
|
|
|
156
|
-
const
|
|
277
|
+
const planBase = planningDir(cwd);
|
|
157
278
|
const normalized = normalizePhaseName(phase);
|
|
279
|
+
const notFound = { found: false, directory: null, phase_number: null, phase_name: null, plans: [], summaries: [], searched_directories: [] };
|
|
158
280
|
|
|
159
|
-
|
|
160
|
-
|
|
281
|
+
// Build candidate search dirs: flat layout first, then milestone-archive layout.
|
|
282
|
+
const searchDirs = [];
|
|
283
|
+
const flatPhasesDir = path.join(planBase, 'phases');
|
|
284
|
+
if (fs.existsSync(flatPhasesDir)) searchDirs.push(flatPhasesDir);
|
|
161
285
|
try {
|
|
162
|
-
const
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
return;
|
|
286
|
+
const milestonesDir = path.join(planBase, 'milestones');
|
|
287
|
+
const entries = fs.readdirSync(milestonesDir, { withFileTypes: true })
|
|
288
|
+
.filter(e => e.isDirectory() && /^v\d+.*-phases$/.test(e.name))
|
|
289
|
+
.sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));
|
|
290
|
+
for (const e of entries) {
|
|
291
|
+
searchDirs.push(path.join(milestonesDir, e.name));
|
|
169
292
|
}
|
|
293
|
+
} catch { /* no milestones dir */ }
|
|
170
294
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|| match.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);
|
|
174
|
-
const phaseNumber = dirMatch ? dirMatch[1] : normalized;
|
|
175
|
-
const phaseName = dirMatch && dirMatch[2] ? dirMatch[2] : null;
|
|
176
|
-
|
|
177
|
-
const phaseDir = path.join(phasesDir, match);
|
|
178
|
-
const phaseFiles = fs.readdirSync(phaseDir);
|
|
179
|
-
const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md').sort();
|
|
180
|
-
const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md').sort();
|
|
181
|
-
|
|
182
|
-
const result = {
|
|
183
|
-
found: true,
|
|
184
|
-
directory: toPosixPath(path.join(path.relative(cwd, planningDir(cwd)), 'phases', match)),
|
|
185
|
-
phase_number: phaseNumber,
|
|
186
|
-
phase_name: phaseName,
|
|
187
|
-
plans,
|
|
188
|
-
summaries,
|
|
189
|
-
};
|
|
295
|
+
notFound.searched_directories = searchDirs.map((searchDir) =>
|
|
296
|
+
toPosixPath(path.join(path.relative(cwd, planBase), path.relative(planBase, searchDir))));
|
|
190
297
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
298
|
+
for (const searchDir of searchDirs) {
|
|
299
|
+
try {
|
|
300
|
+
const entries = fs.readdirSync(searchDir, { withFileTypes: true });
|
|
301
|
+
const dirs = entries.filter(e => e.isDirectory()).map(e => e.name).sort((a, b) => comparePhaseNum(a, b));
|
|
302
|
+
|
|
303
|
+
const match = dirs.find(d => phaseTokenMatches(d, normalized));
|
|
304
|
+
if (!match) continue;
|
|
305
|
+
|
|
306
|
+
// Extract phase number — supports project-code-prefixed (CK-01-name), numeric (01-name), and custom IDs
|
|
307
|
+
const dirMatch = match.match(/^(?:[A-Z]{1,6}-)(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i)
|
|
308
|
+
|| match.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);
|
|
309
|
+
const phaseNumber = dirMatch ? dirMatch[1] : normalized;
|
|
310
|
+
const phaseName = dirMatch && dirMatch[2] ? dirMatch[2] : null;
|
|
311
|
+
|
|
312
|
+
const phaseDir = path.join(searchDir, match);
|
|
313
|
+
const phaseFiles = fs.readdirSync(phaseDir);
|
|
314
|
+
const plans = phaseFiles.filter(isCanonicalPlanFile).sort();
|
|
315
|
+
const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md').sort();
|
|
316
|
+
// #2893 — same diagnostic as phase-plan-index for consistency.
|
|
317
|
+
const planNamingWarning = describeNonCanonicalPlans(phaseFiles, plans);
|
|
318
|
+
|
|
319
|
+
const result = {
|
|
320
|
+
found: true,
|
|
321
|
+
directory: toPosixPath(path.join(path.relative(cwd, planBase), path.relative(planBase, searchDir), match)),
|
|
322
|
+
phase_number: phaseNumber,
|
|
323
|
+
phase_name: phaseName,
|
|
324
|
+
plans,
|
|
325
|
+
summaries,
|
|
326
|
+
};
|
|
327
|
+
if (planNamingWarning) result.warning = planNamingWarning;
|
|
328
|
+
|
|
329
|
+
output(result, raw, result.directory);
|
|
330
|
+
return;
|
|
331
|
+
} catch { continue; }
|
|
194
332
|
}
|
|
333
|
+
|
|
334
|
+
output(notFound, raw, '');
|
|
195
335
|
}
|
|
196
336
|
|
|
197
337
|
function extractObjective(content) {
|
|
@@ -229,18 +369,24 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
|
|
|
229
369
|
|
|
230
370
|
// Get all files in phase directory
|
|
231
371
|
const phaseFiles = fs.readdirSync(phaseDir);
|
|
232
|
-
const planFiles = phaseFiles.filter(
|
|
372
|
+
const planFiles = phaseFiles.filter(isCanonicalPlanFile).sort();
|
|
233
373
|
const summaryFiles = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
|
|
374
|
+
// #2893 — surface plan-shaped files the canonical filter rejected so a
|
|
375
|
+
// misnamed plan never silently produces plan_count: 0 at executor init.
|
|
376
|
+
const planNamingWarning = describeNonCanonicalPlans(phaseFiles, planFiles);
|
|
234
377
|
|
|
235
378
|
// Build set of plan IDs with summaries
|
|
236
379
|
const completedPlanIds = new Set(
|
|
237
|
-
summaryFiles.
|
|
380
|
+
summaryFiles.flatMap(s => {
|
|
381
|
+
const exact = s.replace('-SUMMARY.md', '').replace('SUMMARY.md', '');
|
|
382
|
+
const canonical = extractCanonicalPlanId(s);
|
|
383
|
+
return canonical === exact ? [exact] : [exact, canonical];
|
|
384
|
+
})
|
|
238
385
|
);
|
|
239
386
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
const
|
|
243
|
-
let hasCheckpoints = false;
|
|
387
|
+
// ── Pass 1: parse each plan file ─────────────────────────────────────────
|
|
388
|
+
|
|
389
|
+
const rawPlans = [];
|
|
244
390
|
|
|
245
391
|
for (const planFile of planFiles) {
|
|
246
392
|
const planId = planFile.replace('-PLAN.md', '').replace('PLAN.md', '');
|
|
@@ -253,8 +399,20 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
|
|
|
253
399
|
const mdTasks = content.match(/##\s*Task\s*\d+/gi) || [];
|
|
254
400
|
const taskCount = xmlTasks.length || mdTasks.length;
|
|
255
401
|
|
|
256
|
-
// Parse wave as integer
|
|
257
|
-
|
|
402
|
+
// Parse wave as integer — use nullish handling so wave: 0 is preserved.
|
|
403
|
+
// parseInt returns NaN for missing/non-numeric values; fall back to null
|
|
404
|
+
// (meaning "no declared wave") so downstream can apply the topo default.
|
|
405
|
+
const parsedWave = parseInt(fm.wave, 10);
|
|
406
|
+
const declaredWave = Number.isNaN(parsedWave) ? null : parsedWave;
|
|
407
|
+
|
|
408
|
+
// Parse depends_on — normalise to string[]
|
|
409
|
+
let dependsOn = [];
|
|
410
|
+
const fmDeps = fm['depends_on'];
|
|
411
|
+
if (Array.isArray(fmDeps)) {
|
|
412
|
+
dependsOn = fmDeps.map(String);
|
|
413
|
+
} else if (typeof fmDeps === 'string' && fmDeps.trim() !== '') {
|
|
414
|
+
dependsOn = [fmDeps];
|
|
415
|
+
}
|
|
258
416
|
|
|
259
417
|
// Parse autonomous (default true if not specified)
|
|
260
418
|
let autonomous = true;
|
|
@@ -262,10 +420,6 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
|
|
|
262
420
|
autonomous = fm.autonomous === 'true' || fm.autonomous === true;
|
|
263
421
|
}
|
|
264
422
|
|
|
265
|
-
if (!autonomous) {
|
|
266
|
-
hasCheckpoints = true;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
423
|
// Parse files_modified (underscore is canonical; also accept hyphenated for compat)
|
|
270
424
|
let filesModified = [];
|
|
271
425
|
const fmFiles = fm['files_modified'] || fm['files-modified'];
|
|
@@ -273,29 +427,130 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
|
|
|
273
427
|
filesModified = Array.isArray(fmFiles) ? fmFiles : [fmFiles];
|
|
274
428
|
}
|
|
275
429
|
|
|
276
|
-
const hasSummary = completedPlanIds.has(planId);
|
|
277
|
-
if (!hasSummary) {
|
|
278
|
-
incomplete.push(planId);
|
|
279
|
-
}
|
|
430
|
+
const hasSummary = completedPlanIds.has(planId) || completedPlanIds.has(extractCanonicalPlanId(planFile));
|
|
280
431
|
|
|
281
|
-
|
|
432
|
+
rawPlans.push({
|
|
282
433
|
id: planId,
|
|
283
|
-
|
|
434
|
+
declaredWave,
|
|
435
|
+
dependsOn,
|
|
284
436
|
autonomous,
|
|
285
437
|
objective: extractObjective(content) || fm.objective || null,
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
438
|
+
filesModified,
|
|
439
|
+
taskCount,
|
|
440
|
+
hasSummary,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// ── Pass 2: topological level assignment via depends_on DAG ──────────────
|
|
445
|
+
|
|
446
|
+
// Build a map from plan ID → raw plan for fast lookup.
|
|
447
|
+
// Deps that reference plans outside this phase are treated as external and ignored.
|
|
448
|
+
const planMap = new Map(rawPlans.map(p => [p.id, p]));
|
|
449
|
+
// Secondary index: canonical prefix → full plan ID, so depends_on: ['03-01'] resolves
|
|
450
|
+
// to '03-01-auth-hardening-PLAN.md'-derived ID '03-01-auth-hardening' (k015).
|
|
451
|
+
const canonicalToId = new Map(rawPlans.map(p => [extractCanonicalPlanId(p.id), p.id]));
|
|
452
|
+
|
|
453
|
+
// Kahn's algorithm — compute in-degree and adjacency for in-phase deps only.
|
|
454
|
+
const level = new Map();
|
|
455
|
+
const inDeg = new Map();
|
|
456
|
+
const adj = new Map();
|
|
457
|
+
|
|
458
|
+
for (const p of rawPlans) {
|
|
459
|
+
if (!inDeg.has(p.id)) inDeg.set(p.id, 0);
|
|
460
|
+
if (!adj.has(p.id)) adj.set(p.id, []);
|
|
461
|
+
for (const dep of p.dependsOn) {
|
|
462
|
+
// Accept both full-stem ('03-01-auth-hardening') and canonical-prefix ('03-01') forms.
|
|
463
|
+
const resolvedDep = planMap.has(dep) ? dep : canonicalToId.get(dep);
|
|
464
|
+
if (!resolvedDep) continue; // external dep — ignore
|
|
465
|
+
if (!adj.has(resolvedDep)) adj.set(resolvedDep, []);
|
|
466
|
+
adj.get(resolvedDep).push(p.id);
|
|
467
|
+
inDeg.set(p.id, (inDeg.get(p.id) ?? 0) + 1);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// Start with nodes that have no in-phase dependencies.
|
|
472
|
+
const queue = [];
|
|
473
|
+
for (const p of rawPlans) {
|
|
474
|
+
if ((inDeg.get(p.id) ?? 0) === 0) {
|
|
475
|
+
queue.push(p.id);
|
|
476
|
+
level.set(p.id, 0);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
let visited = 0;
|
|
481
|
+
while (queue.length > 0) {
|
|
482
|
+
const cur = queue.shift();
|
|
483
|
+
visited++;
|
|
484
|
+
const curLevel = level.get(cur);
|
|
485
|
+
for (const dep of (adj.get(cur) ?? [])) {
|
|
486
|
+
const newLevel = curLevel + 1;
|
|
487
|
+
if (newLevel > (level.get(dep) ?? -1)) {
|
|
488
|
+
level.set(dep, newLevel);
|
|
489
|
+
}
|
|
490
|
+
inDeg.set(dep, inDeg.get(dep) - 1);
|
|
491
|
+
if (inDeg.get(dep) === 0) {
|
|
492
|
+
queue.push(dep);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// Cycle detection — any node not visited has a cycle.
|
|
498
|
+
if (visited < rawPlans.length) {
|
|
499
|
+
const cycleNodes = rawPlans.filter(p => !level.has(p.id)).map(p => p.id);
|
|
500
|
+
error(`depends_on cycle detected in phase ${normalized} — cycle involves: ${cycleNodes.join(', ')}`);
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// ── Pass 3: determine lowest bucket key and build output ─────────────────
|
|
505
|
+
|
|
506
|
+
// If any plan has declared wave: 0, the lowest level maps to "0"; otherwise "1".
|
|
507
|
+
const anyWaveZero = rawPlans.some(p => p.declaredWave === 0);
|
|
508
|
+
const levelOffset = anyWaveZero ? 0 : 1;
|
|
509
|
+
|
|
510
|
+
const plans = [];
|
|
511
|
+
const waves = {};
|
|
512
|
+
const incomplete = [];
|
|
513
|
+
let hasCheckpoints = false;
|
|
514
|
+
const warnings = [];
|
|
515
|
+
|
|
516
|
+
for (const raw of rawPlans) {
|
|
517
|
+
if (!raw.autonomous) {
|
|
518
|
+
hasCheckpoints = true;
|
|
519
|
+
}
|
|
520
|
+
if (!raw.hasSummary) {
|
|
521
|
+
incomplete.push(raw.id);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Computed wave = topological level + offset (so lowest level → 0 or 1).
|
|
525
|
+
const computedWave = (level.get(raw.id) ?? 0) + levelOffset;
|
|
526
|
+
|
|
527
|
+
// The effective wave used for bucketing is always the computed topo level.
|
|
528
|
+
// If the plan declared a wave that disagrees, emit a non-fatal warning.
|
|
529
|
+
const effectiveWave = computedWave;
|
|
530
|
+
if (raw.declaredWave !== null && raw.declaredWave !== computedWave) {
|
|
531
|
+
warnings.push(
|
|
532
|
+
`Plan ${raw.id}: declared wave: ${raw.declaredWave} but depends_on DAG places it in wave ${computedWave}`,
|
|
533
|
+
);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
const plan = {
|
|
537
|
+
id: raw.id,
|
|
538
|
+
wave: effectiveWave,
|
|
539
|
+
depends_on: raw.dependsOn,
|
|
540
|
+
autonomous: raw.autonomous,
|
|
541
|
+
objective: raw.objective,
|
|
542
|
+
files_modified: raw.filesModified,
|
|
543
|
+
task_count: raw.taskCount,
|
|
544
|
+
has_summary: raw.hasSummary,
|
|
289
545
|
};
|
|
290
546
|
|
|
291
547
|
plans.push(plan);
|
|
292
548
|
|
|
293
|
-
|
|
294
|
-
const waveKey = String(wave);
|
|
549
|
+
const waveKey = String(effectiveWave);
|
|
295
550
|
if (!waves[waveKey]) {
|
|
296
551
|
waves[waveKey] = [];
|
|
297
552
|
}
|
|
298
|
-
waves[waveKey].push(
|
|
553
|
+
waves[waveKey].push(raw.id);
|
|
299
554
|
}
|
|
300
555
|
|
|
301
556
|
const result = {
|
|
@@ -305,6 +560,8 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
|
|
|
305
560
|
incomplete,
|
|
306
561
|
has_checkpoints: hasCheckpoints,
|
|
307
562
|
};
|
|
563
|
+
if (planNamingWarning) result.warning = planNamingWarning;
|
|
564
|
+
if (warnings.length > 0) result.warnings = warnings;
|
|
308
565
|
|
|
309
566
|
output(result, raw);
|
|
310
567
|
}
|
|
@@ -376,12 +633,12 @@ function cmdPhaseAdd(cwd, description, raw, customId) {
|
|
|
376
633
|
const dirPath = path.join(planningDir(cwd), 'phases', _dirName);
|
|
377
634
|
|
|
378
635
|
// Create directory with .gitkeep so git tracks empty folders
|
|
379
|
-
|
|
380
|
-
|
|
636
|
+
platformEnsureDir(dirPath);
|
|
637
|
+
platformWriteSync(path.join(dirPath, '.gitkeep'), '');
|
|
381
638
|
|
|
382
639
|
// Build phase entry
|
|
383
640
|
const dependsOn = config.phase_naming === 'custom' ? '' : `\n**Depends on:** Phase ${typeof _newPhaseId === 'number' ? _newPhaseId - 1 : 'TBD'}`;
|
|
384
|
-
const phaseEntry = `\n### Phase ${_newPhaseId}: ${description}\n\n**Goal:** [To be planned]\n**Requirements**: TBD${dependsOn}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd
|
|
641
|
+
const phaseEntry = `\n### Phase ${_newPhaseId}: ${description}\n\n**Goal:** [To be planned]\n**Requirements**: TBD${dependsOn}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd:plan-phase ${_newPhaseId} to break down)\n`;
|
|
385
642
|
|
|
386
643
|
// Find insertion point: before last "---" or at end
|
|
387
644
|
let updatedContent;
|
|
@@ -392,7 +649,7 @@ function cmdPhaseAdd(cwd, description, raw, customId) {
|
|
|
392
649
|
updatedContent = rawContent + phaseEntry;
|
|
393
650
|
}
|
|
394
651
|
|
|
395
|
-
|
|
652
|
+
platformWriteSync(roadmapPath, updatedContent);
|
|
396
653
|
return { newPhaseId: _newPhaseId, dirName: _dirName };
|
|
397
654
|
});
|
|
398
655
|
|
|
@@ -408,6 +665,76 @@ function cmdPhaseAdd(cwd, description, raw, customId) {
|
|
|
408
665
|
output(result, raw, result.padded);
|
|
409
666
|
}
|
|
410
667
|
|
|
668
|
+
function cmdPhaseAddBatch(cwd, descriptions, raw) {
|
|
669
|
+
if (!Array.isArray(descriptions) || descriptions.length === 0) {
|
|
670
|
+
error('descriptions array required for phase add-batch');
|
|
671
|
+
}
|
|
672
|
+
const config = loadConfig(cwd);
|
|
673
|
+
const roadmapPath = path.join(planningDir(cwd), 'ROADMAP.md');
|
|
674
|
+
if (!fs.existsSync(roadmapPath)) { error('ROADMAP.md not found'); }
|
|
675
|
+
const projectCode = config.project_code || '';
|
|
676
|
+
const prefix = projectCode ? `${projectCode}-` : '';
|
|
677
|
+
|
|
678
|
+
const results = withPlanningLock(cwd, () => {
|
|
679
|
+
let rawContent = fs.readFileSync(roadmapPath, 'utf-8');
|
|
680
|
+
const content = extractCurrentMilestone(rawContent, cwd);
|
|
681
|
+
let maxPhase = 0;
|
|
682
|
+
if (config.phase_naming !== 'custom') {
|
|
683
|
+
const phasePattern = /#{2,4}\s*Phase\s+(\d+)[A-Z]?(?:\.\d+)*:/gi;
|
|
684
|
+
let m;
|
|
685
|
+
while ((m = phasePattern.exec(content)) !== null) {
|
|
686
|
+
const num = parseInt(m[1], 10);
|
|
687
|
+
if (num >= 999) continue;
|
|
688
|
+
if (num > maxPhase) maxPhase = num;
|
|
689
|
+
}
|
|
690
|
+
const phasesOnDisk = path.join(planningDir(cwd), 'phases');
|
|
691
|
+
if (fs.existsSync(phasesOnDisk)) {
|
|
692
|
+
const dirNumPattern = /^(?:[A-Z][A-Z0-9]*-)?(\d+)-/;
|
|
693
|
+
for (const entry of fs.readdirSync(phasesOnDisk)) {
|
|
694
|
+
const match = entry.match(dirNumPattern);
|
|
695
|
+
if (!match) continue;
|
|
696
|
+
const num = parseInt(match[1], 10);
|
|
697
|
+
if (num >= 999) continue;
|
|
698
|
+
if (num > maxPhase) maxPhase = num;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
const added = [];
|
|
703
|
+
for (const description of descriptions) {
|
|
704
|
+
const slug = generateSlugInternal(description);
|
|
705
|
+
let newPhaseId, dirName;
|
|
706
|
+
if (config.phase_naming === 'custom') {
|
|
707
|
+
newPhaseId = slug.toUpperCase().replace(/-/g, '-');
|
|
708
|
+
dirName = `${prefix}${newPhaseId}-${slug}`;
|
|
709
|
+
} else {
|
|
710
|
+
maxPhase += 1;
|
|
711
|
+
newPhaseId = maxPhase;
|
|
712
|
+
dirName = `${prefix}${String(newPhaseId).padStart(2, '0')}-${slug}`;
|
|
713
|
+
}
|
|
714
|
+
const dirPath = path.join(planningDir(cwd), 'phases', dirName);
|
|
715
|
+
platformEnsureDir(dirPath);
|
|
716
|
+
platformWriteSync(path.join(dirPath, '.gitkeep'), '');
|
|
717
|
+
const dependsOn = config.phase_naming === 'custom' ? '' : `\n**Depends on:** Phase ${typeof newPhaseId === 'number' ? newPhaseId - 1 : 'TBD'}`;
|
|
718
|
+
const phaseEntry = `\n### Phase ${newPhaseId}: ${description}\n\n**Goal:** [To be planned]\n**Requirements**: TBD${dependsOn}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd:plan-phase ${newPhaseId} to break down)\n`;
|
|
719
|
+
const lastSeparator = rawContent.lastIndexOf('\n---');
|
|
720
|
+
rawContent = lastSeparator > 0
|
|
721
|
+
? rawContent.slice(0, lastSeparator) + phaseEntry + rawContent.slice(lastSeparator)
|
|
722
|
+
: rawContent + phaseEntry;
|
|
723
|
+
added.push({
|
|
724
|
+
phase_number: typeof newPhaseId === 'number' ? newPhaseId : String(newPhaseId),
|
|
725
|
+
padded: typeof newPhaseId === 'number' ? String(newPhaseId).padStart(2, '0') : String(newPhaseId),
|
|
726
|
+
name: description,
|
|
727
|
+
slug,
|
|
728
|
+
directory: toPosixPath(path.join(path.relative(cwd, planningDir(cwd)), 'phases', dirName)),
|
|
729
|
+
naming_mode: config.phase_naming,
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
platformWriteSync(roadmapPath, rawContent);
|
|
733
|
+
return added;
|
|
734
|
+
});
|
|
735
|
+
output({ phases: results, count: results.length }, raw);
|
|
736
|
+
}
|
|
737
|
+
|
|
411
738
|
function cmdPhaseInsert(cwd, afterPhase, description, raw) {
|
|
412
739
|
if (!afterPhase || !description) {
|
|
413
740
|
error('after-phase and description required for phase insert');
|
|
@@ -425,12 +752,17 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
|
|
|
425
752
|
const rawContent = fs.readFileSync(roadmapPath, 'utf-8');
|
|
426
753
|
const content = extractCurrentMilestone(rawContent, cwd);
|
|
427
754
|
|
|
428
|
-
// Normalize input then
|
|
755
|
+
// Normalize input then route through canonical padding-tolerant fragment
|
|
756
|
+
// (#3537). The prior hand-rolled `0*${unpadded}` worked for the integer
|
|
757
|
+
// base but duplicated logic — funnel it through the shared helper.
|
|
429
758
|
const normalizedAfter = normalizePhaseName(afterPhase);
|
|
430
|
-
const
|
|
431
|
-
const
|
|
432
|
-
const targetPattern = new RegExp(`#{2,4}\\s*Phase\\s+0*${afterPhaseEscaped}:`, 'i');
|
|
759
|
+
const afterPhaseEscaped = phaseMarkdownRegexSource(normalizedAfter);
|
|
760
|
+
const targetPattern = new RegExp(`#{2,4}\\s*Phase\\s+${afterPhaseEscaped}:`, 'i');
|
|
433
761
|
if (!targetPattern.test(content)) {
|
|
762
|
+
const checklistPattern = new RegExp(`-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${afterPhaseEscaped}:`, 'i');
|
|
763
|
+
if (checklistPattern.test(content)) {
|
|
764
|
+
error(`Phase ${afterPhase} exists in roadmap summary but is missing a detail section (### Phase ${afterPhase}: ...).`);
|
|
765
|
+
}
|
|
434
766
|
error(`Phase ${afterPhase} not found in ROADMAP.md`);
|
|
435
767
|
}
|
|
436
768
|
|
|
@@ -449,9 +781,11 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
|
|
|
449
781
|
}
|
|
450
782
|
} catch { /* intentionally empty */ }
|
|
451
783
|
|
|
452
|
-
// Also scan ROADMAP.md content (already loaded) for decimal entries
|
|
784
|
+
// Also scan ROADMAP.md content (already loaded) for decimal entries.
|
|
785
|
+
// #3537: padding-tolerant fragment so un-padded `Phase 2.7:` is found
|
|
786
|
+
// when caller passes the padded base `02`.
|
|
453
787
|
const rmPhasePattern = new RegExp(
|
|
454
|
-
`#{2,4}\\s*Phase\\s
|
|
788
|
+
`#{2,4}\\s*Phase\\s+${phaseMarkdownRegexSource(normalizedBase)}\\.(\\d+)\\s*:`, 'gi'
|
|
455
789
|
);
|
|
456
790
|
let rmMatch;
|
|
457
791
|
while ((rmMatch = rmPhasePattern.exec(rawContent)) !== null) {
|
|
@@ -468,14 +802,14 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
|
|
|
468
802
|
const dirPath = path.join(planningDir(cwd), 'phases', _dirName);
|
|
469
803
|
|
|
470
804
|
// Create directory with .gitkeep so git tracks empty folders
|
|
471
|
-
|
|
472
|
-
|
|
805
|
+
platformEnsureDir(dirPath);
|
|
806
|
+
platformWriteSync(path.join(dirPath, '.gitkeep'), '');
|
|
473
807
|
|
|
474
808
|
// Build phase entry
|
|
475
|
-
const phaseEntry = `\n### Phase ${_decimalPhase}: ${description} (INSERTED)\n\n**Goal:** [Urgent work - to be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${afterPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd
|
|
809
|
+
const phaseEntry = `\n### Phase ${_decimalPhase}: ${description} (INSERTED)\n\n**Goal:** [Urgent work - to be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${afterPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd:plan-phase ${_decimalPhase} to break down)\n`;
|
|
476
810
|
|
|
477
811
|
// Insert after the target phase section
|
|
478
|
-
const headerPattern = new RegExp(`(#{2,4}\\s*Phase\\s
|
|
812
|
+
const headerPattern = new RegExp(`(#{2,4}\\s*Phase\\s+${afterPhaseEscaped}:[^\\n]*\\n)`, 'i');
|
|
479
813
|
const headerMatch = rawContent.match(headerPattern);
|
|
480
814
|
if (!headerMatch) {
|
|
481
815
|
error(`Could not find Phase ${afterPhase} header`);
|
|
@@ -493,7 +827,7 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
|
|
|
493
827
|
}
|
|
494
828
|
|
|
495
829
|
const updatedContent = rawContent.slice(0, insertIdx) + phaseEntry + rawContent.slice(insertIdx);
|
|
496
|
-
|
|
830
|
+
platformWriteSync(roadmapPath, updatedContent);
|
|
497
831
|
return { decimalPhase: _decimalPhase, dirName: _dirName };
|
|
498
832
|
});
|
|
499
833
|
|
|
@@ -515,10 +849,12 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
|
|
|
515
849
|
*/
|
|
516
850
|
function renameDecimalPhases(phasesDir, baseInt, removedDecimal) {
|
|
517
851
|
const renamedDirs = [], renamedFiles = [];
|
|
518
|
-
|
|
852
|
+
// Capture the zero-padded prefix (e.g. "06" from "06.3-slug") so the renamed
|
|
853
|
+
// directory preserves the original padding format.
|
|
854
|
+
const decPattern = new RegExp(`^(0*${baseInt})\\.(\\d+)-(.+)$`);
|
|
519
855
|
const dirs = readSubdirectories(phasesDir, true);
|
|
520
856
|
const toRename = dirs
|
|
521
|
-
.map(dir => { const m = dir.match(decPattern); return m ? { dir, oldDecimal: parseInt(m[
|
|
857
|
+
.map(dir => { const m = dir.match(decPattern); return m ? { dir, prefix: m[1], oldDecimal: parseInt(m[2], 10), slug: m[3] } : null; })
|
|
522
858
|
.filter(item => item && item.oldDecimal > removedDecimal)
|
|
523
859
|
.sort((a, b) => b.oldDecimal - a.oldDecimal); // descending to avoid conflicts
|
|
524
860
|
|
|
@@ -526,7 +862,7 @@ function renameDecimalPhases(phasesDir, baseInt, removedDecimal) {
|
|
|
526
862
|
const newDecimal = item.oldDecimal - 1;
|
|
527
863
|
const oldPhaseId = `${baseInt}.${item.oldDecimal}`;
|
|
528
864
|
const newPhaseId = `${baseInt}.${newDecimal}`;
|
|
529
|
-
const newDirName = `${
|
|
865
|
+
const newDirName = `${item.prefix}.${newDecimal}-${item.slug}`;
|
|
530
866
|
fs.renameSync(path.join(phasesDir, item.dir), path.join(phasesDir, newDirName));
|
|
531
867
|
renamedDirs.push({ from: item.dir, to: newDirName });
|
|
532
868
|
for (const f of fs.readdirSync(path.join(phasesDir, newDirName))) {
|
|
@@ -553,7 +889,7 @@ function renameIntegerPhases(phasesDir, removedInt) {
|
|
|
553
889
|
const m = dir.match(/^(\d+)([A-Z])?(?:\.(\d+))?-(.+)$/i);
|
|
554
890
|
if (!m) return null;
|
|
555
891
|
const dirInt = parseInt(m[1], 10);
|
|
556
|
-
return dirInt > removedInt ? { dir, oldInt: dirInt, letter: m[2] ? m[2].toUpperCase() : '', decimal: m[3] ? parseInt(m[3], 10) : null, slug: m[4] } : null;
|
|
892
|
+
return (dirInt > removedInt && dirInt < 999) ? { dir, oldInt: dirInt, letter: m[2] ? m[2].toUpperCase() : '', decimal: m[3] ? parseInt(m[3], 10) : null, slug: m[4] } : null;
|
|
557
893
|
})
|
|
558
894
|
.filter(Boolean)
|
|
559
895
|
.sort((a, b) => a.oldInt !== b.oldInt ? b.oldInt - a.oldInt : (b.decimal || 0) - (a.decimal || 0));
|
|
@@ -580,6 +916,26 @@ function renameIntegerPhases(phasesDir, removedInt) {
|
|
|
580
916
|
return { renamedDirs, renamedFiles };
|
|
581
917
|
}
|
|
582
918
|
|
|
919
|
+
function decrementRoadmapPhaseNumber(raw, removedInt) {
|
|
920
|
+
const num = parseInt(raw, 10);
|
|
921
|
+
if (!Number.isInteger(num) || num <= removedInt || num >= 999) return raw;
|
|
922
|
+
return String(num - 1);
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
function decrementRoadmapPhaseToken(raw, removedInt) {
|
|
926
|
+
const match = String(raw).match(/^(\d+)(\.\d+)?$/);
|
|
927
|
+
if (!match) return raw;
|
|
928
|
+
const num = parseInt(match[1], 10);
|
|
929
|
+
if (!Number.isInteger(num) || num <= removedInt || num >= 999) return raw;
|
|
930
|
+
return `${num - 1}${match[2] || ''}`;
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
function decrementRoadmapPaddedPhaseNumber(raw, removedInt) {
|
|
934
|
+
const num = parseInt(raw, 10);
|
|
935
|
+
if (!Number.isInteger(num) || num <= removedInt || num >= 999) return raw;
|
|
936
|
+
return String(num - 1).padStart(raw.length, '0');
|
|
937
|
+
}
|
|
938
|
+
|
|
583
939
|
/**
|
|
584
940
|
* Remove a phase section from ROADMAP.md and renumber all subsequent integer phases.
|
|
585
941
|
*/
|
|
@@ -589,25 +945,64 @@ function updateRoadmapAfterPhaseRemoval(roadmapPath, targetPhase, isDecimal, rem
|
|
|
589
945
|
let content = fs.readFileSync(roadmapPath, 'utf-8');
|
|
590
946
|
const escaped = escapeRegex(targetPhase);
|
|
591
947
|
|
|
592
|
-
|
|
948
|
+
// #3601: the end-of-section lookahead is depth-aware. It captures the
|
|
949
|
+
// hash count of the header being removed and stops only at a subsequent
|
|
950
|
+
// header of the SAME depth, whether integer or decimal. This preserves
|
|
951
|
+
// two existing contracts:
|
|
952
|
+
//
|
|
953
|
+
// (#3601 case) Remove `### Phase 2:` and stop at `### Phase 2.1:` —
|
|
954
|
+
// `Phase 2.1` is a peer-level decimal phase (depth 3) and must be
|
|
955
|
+
// preserved.
|
|
956
|
+
//
|
|
957
|
+
// (#3355 case) Remove `### Phase 27:` and continue past
|
|
958
|
+
// `#### Phase 27.1:` (depth 4 — a child of Phase 27) until the next
|
|
959
|
+
// depth-3 header. The child decimal is part of the integer phase
|
|
960
|
+
// being removed.
|
|
961
|
+
//
|
|
962
|
+
// The `(?!#)` negative lookahead after the backreference prevents the
|
|
963
|
+
// depth-3 match from being satisfied by a depth-4+ header that starts
|
|
964
|
+
// with the same three hashes.
|
|
965
|
+
content = content.replace(new RegExp(`\\n?(?<h>#{2,4})\\s*Phase\\s+${escaped}\\s*:[\\s\\S]*?(?=\\n\\k<h>(?!#)\\s+Phase\\s+[^\\n:]+\\s*:|$)`, 'i'), '');
|
|
593
966
|
content = content.replace(new RegExp(`\\n?-\\s*\\[[ x]\\]\\s*.*Phase\\s+${escaped}[:\\s][^\\n]*`, 'gi'), '');
|
|
594
967
|
content = content.replace(new RegExp(`\\n?\\|\\s*${escaped}\\.?\\s[^|]*\\|[^\\n]*`, 'gi'), '');
|
|
595
968
|
|
|
596
969
|
if (!isDecimal) {
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
970
|
+
content = content.replace(
|
|
971
|
+
/(#{2,4}\s*Phase\s+)(\d+(?:\.\d+)?)(\s*:)/gi,
|
|
972
|
+
(_match, prefix, num, suffix) => `${prefix}${decrementRoadmapPhaseToken(num, removedInt)}${suffix}`
|
|
973
|
+
);
|
|
974
|
+
content = content.replace(
|
|
975
|
+
/(-\s*\[[ x]\]\s*.*?Phase\s+)(\d+)(\s*:|\s+)/gi,
|
|
976
|
+
(_match, prefix, num, suffix) => `${prefix}${decrementRoadmapPhaseNumber(num, removedInt)}${suffix}`
|
|
977
|
+
);
|
|
978
|
+
content = content.replace(
|
|
979
|
+
/(\|\s*)(\d+)(\.\s)/g,
|
|
980
|
+
(_match, prefix, num, suffix) => `${prefix}${decrementRoadmapPhaseNumber(num, removedInt)}${suffix}`
|
|
981
|
+
);
|
|
982
|
+
// #3602: extend the suffix lookahead so slugged plan filenames like
|
|
983
|
+
// `07-01-cherry-pick-foundation-PLAN.md` match too. The previous
|
|
984
|
+
// pattern only allowed a compact `-(PLAN|SUMMARY).md` immediately
|
|
985
|
+
// after the plan number (or no suffix at all); a slug between the
|
|
986
|
+
// number and the `-PLAN.md` / `-SUMMARY.md` suffix made the
|
|
987
|
+
// lookahead fail and left the stale `07-01-` prefix in ROADMAP
|
|
988
|
+
// text while the on-disk file was already renamed to `06-01-…`.
|
|
989
|
+
// The slug segment `(?:-[A-Za-z][A-Za-z0-9-]*)*` allows any number
|
|
990
|
+
// of kebab-case tokens before the canonical PLAN/SUMMARY suffix.
|
|
991
|
+
content = content.replace(
|
|
992
|
+
/(?<![0-9-])(\d{2})-(\d{2})(?=(?:(?:-[A-Za-z][A-Za-z0-9-]*)*-(?:PLAN|SUMMARY)\.md)|(?![0-9-]))/g,
|
|
993
|
+
(_match, phaseNum, planNum) => `${decrementRoadmapPaddedPhaseNumber(phaseNum, removedInt)}-${planNum}`
|
|
994
|
+
);
|
|
995
|
+
content = content.replace(
|
|
996
|
+
/(\*\*Depends on\*\*\s*:\s*Phase\s+)(\d+(?:\.\d+)?)\b/gi,
|
|
997
|
+
(_match, prefix, num) => `${prefix}${decrementRoadmapPhaseToken(num, removedInt)}`
|
|
998
|
+
);
|
|
999
|
+
content = content.replace(
|
|
1000
|
+
/(Depends on:\*\*\s*Phase\s+)(\d+(?:\.\d+)?)\b/gi,
|
|
1001
|
+
(_match, prefix, num) => `${prefix}${decrementRoadmapPhaseToken(num, removedInt)}`
|
|
1002
|
+
);
|
|
608
1003
|
}
|
|
609
1004
|
|
|
610
|
-
|
|
1005
|
+
platformWriteSync(roadmapPath, content);
|
|
611
1006
|
});
|
|
612
1007
|
}
|
|
613
1008
|
|
|
@@ -642,7 +1037,7 @@ function cmdPhaseRemove(cwd, targetPhase, options, raw) {
|
|
|
642
1037
|
let renamedDirs = [], renamedFiles = [];
|
|
643
1038
|
try {
|
|
644
1039
|
const renamed = isDecimal
|
|
645
|
-
? renameDecimalPhases(phasesDir, normalized.split('.')[0], parseInt(normalized.split('.')[1], 10))
|
|
1040
|
+
? renameDecimalPhases(phasesDir, parseInt(normalized.split('.')[0], 10), parseInt(normalized.split('.')[1], 10))
|
|
646
1041
|
: renameIntegerPhases(phasesDir, parseInt(normalized, 10));
|
|
647
1042
|
renamedDirs = renamed.renamedDirs;
|
|
648
1043
|
renamedFiles = renamed.renamedFiles;
|
|
@@ -725,14 +1120,16 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
|
|
|
725
1120
|
let roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
|
|
726
1121
|
|
|
727
1122
|
// Checkbox: - [ ] Phase N: → - [x] Phase N: (...completed DATE)
|
|
1123
|
+
// #3537: padding-tolerant fragment so the caller-resolved padded id
|
|
1124
|
+
// matches un-padded ROADMAP prose.
|
|
1125
|
+
const phaseEscaped = phaseMarkdownRegexSource(phaseNum);
|
|
728
1126
|
const checkboxPattern = new RegExp(
|
|
729
|
-
`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${
|
|
1127
|
+
`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${phaseEscaped}[:\\s][^\\n]*)`,
|
|
730
1128
|
'i'
|
|
731
1129
|
);
|
|
732
1130
|
roadmapContent = roadmapContent.replace(checkboxPattern, `$1x$2 (completed ${today})`);
|
|
733
1131
|
|
|
734
1132
|
// Progress table: update Status to Complete, add date (handles 4 or 5 column tables)
|
|
735
|
-
const phaseEscaped = escapeRegex(phaseNum);
|
|
736
1133
|
const tableRowPattern = new RegExp(
|
|
737
1134
|
`^(\\|\\s*${phaseEscaped}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,
|
|
738
1135
|
'im'
|
|
@@ -756,7 +1153,7 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
|
|
|
756
1153
|
// Update plan count in phase section.
|
|
757
1154
|
// Use direct .replace() rather than replaceInCurrentMilestone() so this
|
|
758
1155
|
// works when the current milestone section is itself inside a <details>
|
|
759
|
-
// block (the standard /sdd
|
|
1156
|
+
// block (the standard /sdd:new-project layout). replaceInCurrentMilestone
|
|
760
1157
|
// scopes to content after the last </details>, which misses content inside
|
|
761
1158
|
// the current milestone's own <details> wrapper (#2005).
|
|
762
1159
|
// The phase-scoped heading pattern is specific enough to avoid matching
|
|
@@ -783,24 +1180,31 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
|
|
|
783
1180
|
roadmapContent = roadmapContent.replace(planCheckboxPattern, '$1x$2');
|
|
784
1181
|
}
|
|
785
1182
|
|
|
786
|
-
|
|
1183
|
+
platformWriteSync(roadmapPath, roadmapContent);
|
|
787
1184
|
|
|
788
1185
|
// Update REQUIREMENTS.md traceability for this phase's requirements
|
|
789
1186
|
const reqPath = path.join(planningDir(cwd), 'REQUIREMENTS.md');
|
|
790
1187
|
if (fs.existsSync(reqPath)) {
|
|
791
|
-
// Extract the current phase section from roadmap (scoped to avoid cross-phase matching)
|
|
792
|
-
|
|
1188
|
+
// Extract the current phase section from roadmap (scoped to avoid cross-phase matching).
|
|
1189
|
+
// #3537: padding-tolerant fragment so an un-padded `Phase 2.7:` heading
|
|
1190
|
+
// is found when caller resolved to padded `02.7`.
|
|
1191
|
+
const phaseEsc = phaseMarkdownRegexSource(phaseNum);
|
|
793
1192
|
const currentMilestoneRoadmap = extractCurrentMilestone(roadmapContent, cwd);
|
|
794
1193
|
const phaseSectionMatch = currentMilestoneRoadmap.match(
|
|
795
1194
|
new RegExp(`(#{2,4}\\s*Phase\\s+${phaseEsc}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`, 'i')
|
|
796
1195
|
);
|
|
797
1196
|
|
|
798
1197
|
const sectionText = phaseSectionMatch ? phaseSectionMatch[1] : '';
|
|
799
|
-
|
|
1198
|
+
// Accept all bold/colon variants (#2769) — the previous pattern only
|
|
1199
|
+
// matched **Requirements:** (colon inside bold) and silently skipped
|
|
1200
|
+
// **Requirements**: (colon outside), preventing the matching REQ-IDs
|
|
1201
|
+
// from being ticked off in REQUIREMENTS.md on phase completion.
|
|
1202
|
+
const reqMatch = sectionText.match(/\*\*Requirements:?\*\*[^\S\n]*:?[^\S\n]*([^\n]+)/i);
|
|
1203
|
+
|
|
1204
|
+
let reqContent = fs.readFileSync(reqPath, 'utf-8');
|
|
800
1205
|
|
|
801
1206
|
if (reqMatch) {
|
|
802
1207
|
const reqIds = reqMatch[1].replace(/[\[\]]/g, '').split(/[,\s]+/).map(r => r.trim()).filter(Boolean);
|
|
803
|
-
let reqContent = fs.readFileSync(reqPath, 'utf-8');
|
|
804
1208
|
|
|
805
1209
|
for (const reqId of reqIds) {
|
|
806
1210
|
const reqEscaped = escapeRegex(reqId);
|
|
@@ -815,10 +1219,40 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
|
|
|
815
1219
|
'$1 Complete $2'
|
|
816
1220
|
);
|
|
817
1221
|
}
|
|
1222
|
+
}
|
|
818
1223
|
|
|
819
|
-
|
|
820
|
-
|
|
1224
|
+
// Scan body for all **REQ-ID** patterns, warn about any missing from the Traceability table.
|
|
1225
|
+
// Always runs regardless of whether the roadmap has a Requirements: line.
|
|
1226
|
+
const bodyReqIds = [];
|
|
1227
|
+
const bodyReqPattern = /\*\*([A-Z][A-Z0-9]*-\d+)\*\*/g;
|
|
1228
|
+
let bodyMatch;
|
|
1229
|
+
while ((bodyMatch = bodyReqPattern.exec(reqContent)) !== null) {
|
|
1230
|
+
const id = bodyMatch[1];
|
|
1231
|
+
if (!bodyReqIds.includes(id)) bodyReqIds.push(id);
|
|
821
1232
|
}
|
|
1233
|
+
|
|
1234
|
+
// Collect REQ-IDs present in the Traceability section only, to avoid
|
|
1235
|
+
// picking up IDs from other tables in the document.
|
|
1236
|
+
const traceabilityHeadingMatch = reqContent.match(/^#{1,6}\s+Traceability\b/im);
|
|
1237
|
+
const traceabilitySection = traceabilityHeadingMatch
|
|
1238
|
+
? reqContent.slice(traceabilityHeadingMatch.index)
|
|
1239
|
+
: '';
|
|
1240
|
+
const tableReqIds = new Set();
|
|
1241
|
+
const tableRowPattern = /^\|\s*([A-Z][A-Z0-9]*-\d+)\s*\|/gm;
|
|
1242
|
+
let tableMatch;
|
|
1243
|
+
while ((tableMatch = tableRowPattern.exec(traceabilitySection)) !== null) {
|
|
1244
|
+
tableReqIds.add(tableMatch[1]);
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
const unregistered = bodyReqIds.filter(id => !tableReqIds.has(id));
|
|
1248
|
+
if (unregistered.length > 0) {
|
|
1249
|
+
warnings.push(
|
|
1250
|
+
`REQUIREMENTS.md: ${unregistered.length} REQ-ID(s) found in body but missing from Traceability table: ${unregistered.join(', ')} — add them manually to keep traceability in sync`
|
|
1251
|
+
);
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
platformWriteSync(reqPath, reqContent);
|
|
1255
|
+
requirementsUpdated = true;
|
|
822
1256
|
}
|
|
823
1257
|
});
|
|
824
1258
|
}
|
|
@@ -838,9 +1272,11 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
|
|
|
838
1272
|
.sort((a, b) => comparePhaseNum(a, b));
|
|
839
1273
|
|
|
840
1274
|
// Find the next phase directory after current
|
|
1275
|
+
// Skip backlog phases (999.x) — they are parked ideas, not sequential work (#2129)
|
|
841
1276
|
for (const dir of dirs) {
|
|
842
1277
|
const dm = dir.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);
|
|
843
1278
|
if (dm) {
|
|
1279
|
+
if (/^999(?:\.|$)/.test(dm[1])) continue;
|
|
844
1280
|
if (comparePhaseNum(dm[1], phaseNum) > 0) {
|
|
845
1281
|
nextPhaseNum = dm[1];
|
|
846
1282
|
nextPhaseName = dm[2] || null;
|
|
@@ -937,6 +1373,21 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
|
|
|
937
1373
|
}, cwd);
|
|
938
1374
|
}
|
|
939
1375
|
|
|
1376
|
+
// Auto-prune STATE.md on phase boundary when configured (#2087)
|
|
1377
|
+
let autoPruned = false;
|
|
1378
|
+
try {
|
|
1379
|
+
const configPath = path.join(planningDir(cwd), 'config.json');
|
|
1380
|
+
if (fs.existsSync(configPath)) {
|
|
1381
|
+
const rawConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
1382
|
+
const autoPruneEnabled = rawConfig.workflow && rawConfig.workflow.auto_prune_state === true;
|
|
1383
|
+
if (autoPruneEnabled && fs.existsSync(statePath)) {
|
|
1384
|
+
const { cmdStatePrune } = require('./state.cjs');
|
|
1385
|
+
cmdStatePrune(cwd, { keepRecent: '3', dryRun: false, silent: true }, true);
|
|
1386
|
+
autoPruned = true;
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
} catch { /* intentionally empty — auto-prune is best-effort */ }
|
|
1390
|
+
|
|
940
1391
|
const result = {
|
|
941
1392
|
completed_phase: phaseNum,
|
|
942
1393
|
phase_name: phaseInfo.phase_name,
|
|
@@ -948,6 +1399,7 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
|
|
|
948
1399
|
roadmap_updated: fs.existsSync(roadmapPath),
|
|
949
1400
|
state_updated: fs.existsSync(statePath),
|
|
950
1401
|
requirements_updated: requirementsUpdated,
|
|
1402
|
+
auto_pruned: autoPruned,
|
|
951
1403
|
warnings,
|
|
952
1404
|
has_warnings: warnings.length > 0,
|
|
953
1405
|
};
|
|
@@ -961,6 +1413,8 @@ module.exports = {
|
|
|
961
1413
|
cmdFindPhase,
|
|
962
1414
|
cmdPhasePlanIndex,
|
|
963
1415
|
cmdPhaseAdd,
|
|
1416
|
+
cmdPhaseAddBatch,
|
|
1417
|
+
cmdPhaseMvpMode,
|
|
964
1418
|
cmdPhaseInsert,
|
|
965
1419
|
cmdPhaseRemove,
|
|
966
1420
|
cmdPhaseComplete,
|