@bhargavvc/sdd-cc 1.30.1 → 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 +165 -129
- package/README.ko-KR.md +161 -123
- package/README.md +103 -679
- package/README.pt-BR.md +92 -52
- package/README.zh-CN.md +145 -103
- package/agents/sdd-advisor-researcher.md +23 -0
- package/agents/sdd-ai-researcher.md +133 -0
- package/agents/sdd-code-fixer.md +668 -0
- package/agents/sdd-code-reviewer.md +387 -0
- package/agents/sdd-codebase-mapper.md +86 -3
- package/agents/sdd-debug-session-manager.md +314 -0
- package/agents/sdd-debugger.md +157 -78
- package/agents/sdd-doc-classifier.md +168 -0
- package/agents/sdd-doc-synthesizer.md +204 -0
- package/agents/sdd-doc-verifier.md +217 -0
- package/agents/sdd-doc-writer.md +615 -0
- package/agents/sdd-domain-researcher.md +153 -0
- package/agents/sdd-eval-auditor.md +191 -0
- package/agents/sdd-eval-planner.md +154 -0
- package/agents/sdd-executor.md +283 -40
- package/agents/sdd-framework-selector.md +160 -0
- package/agents/sdd-integration-checker.md +30 -3
- package/agents/sdd-intel-updater.md +342 -0
- package/agents/sdd-nyquist-auditor.md +31 -4
- package/agents/sdd-pattern-mapper.md +335 -0
- package/agents/sdd-phase-researcher.md +254 -24
- package/agents/sdd-plan-checker.md +223 -18
- package/agents/sdd-planner.md +286 -362
- package/agents/sdd-project-researcher.md +28 -5
- package/agents/sdd-research-synthesizer.md +4 -4
- package/agents/sdd-roadmapper.md +14 -5
- package/agents/sdd-security-auditor.md +155 -0
- package/agents/sdd-ui-auditor.md +60 -4
- package/agents/sdd-ui-checker.md +11 -2
- package/agents/sdd-ui-researcher.md +27 -4
- package/agents/sdd-user-profiler.md +2 -2
- package/agents/sdd-verifier.md +258 -41
- package/bin/install.js +6862 -618
- package/bin/sdd-sdk.js +37 -0
- package/commands/sdd/add-tests.md +3 -2
- package/commands/sdd/ai-integration-phase.md +37 -0
- package/commands/sdd/audit-fix.md +34 -0
- package/commands/sdd/audit-milestone.md +3 -2
- package/commands/sdd/autonomous.md +10 -5
- package/commands/sdd/capture.md +62 -0
- package/commands/sdd/cleanup.md +7 -1
- package/commands/sdd/code-review.md +59 -0
- package/commands/sdd/complete-milestone.md +11 -4
- package/commands/sdd/config.md +58 -0
- package/commands/sdd/debug.md +23 -144
- package/commands/sdd/discuss-phase.md +22 -10
- package/commands/sdd/docs-update.md +49 -0
- package/commands/sdd/eval-review.md +33 -0
- package/commands/sdd/execute-phase.md +9 -4
- package/commands/sdd/explore.md +27 -0
- package/commands/sdd/extract-learnings.md +23 -0
- package/commands/sdd/fast.md +2 -1
- 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 +3 -1
- package/commands/sdd/import.md +41 -0
- package/commands/sdd/inbox.md +39 -0
- package/commands/sdd/ingest-docs.md +42 -0
- package/commands/sdd/manager.md +9 -3
- package/commands/sdd/map-codebase.md +15 -3
- package/commands/sdd/milestone-summary.md +1 -1
- package/commands/sdd/mvp-phase.md +45 -0
- package/commands/sdd/new-milestone.md +3 -2
- package/commands/sdd/new-project.md +7 -2
- 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 +19 -4
- package/commands/sdd/plan-review-convergence.md +59 -0
- package/commands/sdd/pr-branch.md +2 -1
- package/commands/sdd/profile-user.md +2 -2
- package/commands/sdd/progress.md +27 -5
- package/commands/sdd/quick.md +132 -5
- package/commands/sdd/resume-work.md +2 -12
- package/commands/sdd/review-backlog.md +4 -2
- package/commands/sdd/review.md +7 -3
- package/commands/sdd/secure-phase.md +36 -0
- package/commands/sdd/settings.md +2 -9
- package/commands/sdd/ship.md +1 -0
- 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 +35 -0
- package/commands/sdd/update.md +21 -10
- package/commands/sdd/validate-phase.md +3 -2
- package/commands/sdd/verify-work.md +4 -3
- package/commands/sdd/workspace.md +52 -0
- package/commands/sdd/workstreams.md +15 -8
- package/hooks/dist/sdd-check-update-worker.js +116 -0
- package/hooks/dist/sdd-check-update.js +19 -69
- package/hooks/dist/sdd-context-monitor.js +43 -7
- package/hooks/dist/sdd-phase-boundary.sh +47 -0
- package/hooks/dist/sdd-prompt-guard.js +1 -0
- package/hooks/dist/sdd-read-guard.js +101 -0
- package/hooks/dist/sdd-read-injection-scanner.js +152 -0
- package/hooks/dist/sdd-session-state.sh +59 -0
- package/hooks/dist/sdd-statusline.js +439 -21
- package/hooks/dist/sdd-update-banner.js +134 -0
- package/hooks/dist/sdd-validate-commit.sh +57 -0
- 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 +64 -0
- package/hooks/sdd-context-monitor.js +192 -0
- package/hooks/sdd-phase-boundary.sh +47 -0
- package/hooks/sdd-prompt-guard.js +97 -0
- package/hooks/sdd-read-guard.js +101 -0
- package/hooks/sdd-read-injection-scanner.js +152 -0
- package/hooks/sdd-session-state.sh +59 -0
- package/hooks/sdd-statusline.js +537 -0
- package/hooks/sdd-update-banner.js +134 -0
- package/hooks/sdd-validate-commit.sh +57 -0
- package/hooks/sdd-workflow-guard.js +94 -0
- package/package.json +34 -9
- package/scripts/audit-workflow-script-paths.cjs +73 -0
- package/scripts/build-hooks.js +114 -9
- 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 +3 -0
- package/scripts/rebrand-gsd-to-sdd.sh +222 -220
- package/scripts/run-tests.cjs +5 -1
- 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 +179 -107
- package/sdd/bin/lib/config-schema.cjs +135 -0
- package/sdd/bin/lib/config.cjs +313 -86
- package/sdd/bin/lib/context-utilization.cjs +47 -0
- package/sdd/bin/lib/core.cjs +1146 -391
- package/sdd/bin/lib/decisions.cjs +48 -0
- package/sdd/bin/lib/docs.cjs +270 -0
- package/sdd/bin/lib/drift.cjs +379 -0
- package/sdd/bin/lib/fallow-runner.cjs +109 -0
- package/sdd/bin/lib/frontmatter.cjs +389 -336
- 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 +692 -97
- 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 +643 -0
- package/sdd/bin/lib/learnings.cjs +379 -0
- package/sdd/bin/lib/milestone.cjs +313 -252
- package/sdd/bin/lib/model-catalog.cjs +136 -0
- package/sdd/bin/lib/model-profiles.cjs +25 -68
- package/sdd/bin/lib/phase-command-router.cjs +96 -0
- package/sdd/bin/lib/phase.cjs +868 -335
- 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 +197 -35
- 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 +416 -124
- package/sdd/bin/lib/runtime-homes.cjs +178 -0
- package/sdd/bin/lib/schema-detect.cjs +238 -0
- package/sdd/bin/lib/sdd2-import.cjs +511 -0
- package/sdd/bin/lib/secrets.cjs +33 -0
- package/sdd/bin/lib/security.cjs +131 -9
- 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 +1253 -367
- package/sdd/bin/lib/surface.cjs +398 -0
- package/sdd/bin/lib/template.cjs +11 -5
- 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 +648 -140
- 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 +78 -196
- package/sdd/bin/lib/worktree-safety.cjs +563 -0
- package/sdd/bin/sdd-tools.cjs +528 -222
- package/sdd/bin/verify-reapply-patches.cjs +247 -0
- package/sdd/contexts/dev.md +21 -0
- package/sdd/contexts/research.md +22 -0
- package/sdd/contexts/review.md +23 -0
- package/sdd/references/agent-contracts.md +79 -0
- package/sdd/references/ai-evals.md +156 -0
- package/sdd/references/ai-frameworks.md +186 -0
- package/sdd/references/artifact-types.md +131 -0
- package/sdd/references/autonomous-smart-discuss.md +277 -0
- package/sdd/references/checkpoints.md +36 -0
- package/sdd/references/common-bug-patterns.md +114 -0
- package/sdd/references/context-budget.md +85 -0
- package/sdd/references/continuation-format.md +30 -26
- 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 +125 -0
- package/sdd/references/execute-mvp-tdd.md +81 -0
- package/sdd/references/executor-examples.md +110 -0
- package/sdd/references/few-shot-examples/plan-checker.md +73 -0
- package/sdd/references/few-shot-examples/verifier.md +109 -0
- package/sdd/references/gate-prompts.md +100 -0
- package/sdd/references/gates.md +70 -0
- package/sdd/references/git-integration.md +9 -6
- package/sdd/references/git-planning-commit.md +6 -4
- package/sdd/references/ios-scaffold.md +123 -0
- package/sdd/references/mandatory-initial-read.md +2 -0
- package/sdd/references/model-profile-resolution.md +2 -0
- package/sdd/references/model-profiles.md +128 -22
- 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-gap-closure.md +62 -0
- package/sdd/references/planner-human-verify-mode.md +57 -0
- package/sdd/references/planner-mvp-mode.md +53 -0
- package/sdd/references/planner-reviews.md +39 -0
- package/sdd/references/planner-revision.md +87 -0
- package/sdd/references/planner-source-audit.md +73 -0
- package/sdd/references/planning-config.md +276 -7
- package/sdd/references/project-skills-discovery.md +19 -0
- package/sdd/references/revision-loop.md +97 -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-models-debug.md +44 -0
- package/sdd/references/thinking-models-execution.md +50 -0
- package/sdd/references/thinking-models-planning.md +62 -0
- package/sdd/references/thinking-models-research.md +50 -0
- package/sdd/references/thinking-models-verification.md +55 -0
- package/sdd/references/thinking-partner.md +96 -0
- package/sdd/references/ui-brand.md +4 -4
- package/sdd/references/universal-anti-patterns.md +63 -0
- package/sdd/references/user-story-template.md +58 -0
- package/sdd/references/verification-overrides.md +227 -0
- package/sdd/references/verify-mvp-mode.md +85 -0
- package/sdd/references/workstream-flag.md +63 -10
- package/sdd/references/worktree-path-safety.md +89 -0
- package/sdd/templates/AI-SPEC.md +246 -0
- package/sdd/templates/DEBUG.md +7 -2
- package/sdd/templates/README.md +77 -0
- package/sdd/templates/SECURITY.md +61 -0
- package/sdd/templates/VALIDATION.md +3 -3
- package/sdd/templates/claude-md.md +27 -4
- package/sdd/templates/config.json +20 -2
- package/sdd/templates/discovery.md +2 -2
- package/sdd/templates/research.md +40 -0
- package/sdd/templates/spec.md +307 -0
- package/sdd/templates/state.md +10 -2
- package/sdd/workflows/add-backlog.md +90 -0
- package/sdd/workflows/add-phase.md +12 -12
- package/sdd/workflows/add-tests.md +6 -3
- package/sdd/workflows/add-todo.md +8 -6
- package/sdd/workflows/ai-integration-phase.md +294 -0
- package/sdd/workflows/analyze-dependencies.md +96 -0
- package/sdd/workflows/audit-fix.md +177 -0
- package/sdd/workflows/audit-milestone.md +35 -18
- package/sdd/workflows/audit-uat.md +1 -1
- package/sdd/workflows/autonomous.md +202 -304
- package/sdd/workflows/check-todos.md +12 -10
- package/sdd/workflows/cleanup.md +3 -1
- package/sdd/workflows/code-review-fix.md +501 -0
- package/sdd/workflows/code-review.md +613 -0
- package/sdd/workflows/complete-milestone.md +115 -28
- package/sdd/workflows/debug.md +231 -0
- package/sdd/workflows/diagnose-issues.md +14 -5
- package/sdd/workflows/discovery-phase.md +3 -1
- 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 +41 -20
- package/sdd/workflows/discuss-phase-power.md +291 -0
- package/sdd/workflows/discuss-phase.md +242 -792
- package/sdd/workflows/do.md +13 -7
- package/sdd/workflows/docs-update.md +1161 -0
- package/sdd/workflows/edit-phase.md +294 -0
- package/sdd/workflows/eval-review.md +155 -0
- 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 +1062 -108
- package/sdd/workflows/execute-plan.md +118 -107
- package/sdd/workflows/explore.md +143 -0
- package/sdd/workflows/extract-learnings.md +242 -0
- package/sdd/workflows/forensics.md +17 -4
- package/sdd/workflows/graduation.md +195 -0
- package/sdd/workflows/health.md +45 -3
- package/sdd/workflows/help.md +265 -88
- package/sdd/workflows/import.md +253 -0
- package/sdd/workflows/inbox.md +387 -0
- package/sdd/workflows/ingest-docs.md +339 -0
- package/sdd/workflows/insert-phase.md +37 -16
- package/sdd/workflows/list-phase-assumptions.md +2 -2
- package/sdd/workflows/list-workspaces.md +3 -3
- package/sdd/workflows/manager.md +62 -32
- package/sdd/workflows/map-codebase.md +90 -24
- package/sdd/workflows/milestone-summary.md +6 -6
- package/sdd/workflows/mvp-phase.md +221 -0
- package/sdd/workflows/new-milestone.md +168 -20
- package/sdd/workflows/new-project.md +273 -47
- package/sdd/workflows/new-workspace.md +8 -6
- package/sdd/workflows/next.md +127 -4
- package/sdd/workflows/note.md +7 -5
- package/sdd/workflows/pause-work.md +79 -12
- package/sdd/workflows/plan-milestone-gaps.md +14 -7
- package/sdd/workflows/plan-phase.md +987 -62
- package/sdd/workflows/plan-review-convergence.md +329 -0
- package/sdd/workflows/plant-seed.md +145 -85
- package/sdd/workflows/pr-branch.md +41 -13
- package/sdd/workflows/profile-user.md +20 -18
- package/sdd/workflows/progress.md +186 -44
- package/sdd/workflows/quick.md +470 -58
- package/sdd/workflows/reapply-patches.md +390 -0
- package/sdd/workflows/remove-phase.md +12 -12
- package/sdd/workflows/remove-workspace.md +24 -7
- package/sdd/workflows/resume-project.md +18 -15
- package/sdd/workflows/review.md +242 -11
- package/sdd/workflows/scan.md +104 -0
- package/sdd/workflows/secure-phase.md +179 -0
- package/sdd/workflows/session-report.md +2 -2
- package/sdd/workflows/settings-advanced.md +579 -0
- package/sdd/workflows/settings-integrations.md +281 -0
- package/sdd/workflows/settings.md +221 -16
- package/sdd/workflows/ship.md +140 -13
- 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 +20 -1
- package/sdd/workflows/sync-skills.md +182 -0
- package/sdd/workflows/thread.md +221 -0
- package/sdd/workflows/transition.md +44 -22
- package/sdd/workflows/ui-phase.md +39 -14
- package/sdd/workflows/ui-review.md +33 -6
- package/sdd/workflows/ultraplan-phase.md +198 -0
- package/sdd/workflows/undo.md +314 -0
- package/sdd/workflows/update.md +350 -29
- package/sdd/workflows/validate-phase.md +10 -6
- package/sdd/workflows/verify-phase.md +307 -18
- package/sdd/workflows/verify-work.md +153 -10
- 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/check-todos.md +0 -45
- package/commands/sdd/do.md +0 -30
- package/commands/sdd/insert-phase.md +0 -32
- package/commands/sdd/join-discord.md +0 -18
- 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 -24
- 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/reapply-patches.md +0 -123
- 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/session-report.md +0 -19
- package/commands/sdd/set-profile.md +0 -12
- package/scripts/sync-upstream.sh +0 -56
- package/sdd/commands/sdd/workstreams.md +0 -63
- package/sdd/workflows/research-phase.md +0 -82
package/sdd/bin/lib/init.cjs
CHANGED
|
@@ -4,24 +4,38 @@
|
|
|
4
4
|
|
|
5
5
|
const fs = require('fs');
|
|
6
6
|
const path = require('path');
|
|
7
|
-
const {
|
|
8
|
-
const { loadConfig, resolveModelInternal, findPhaseInternal, getRoadmapPhaseInternal, pathExistsInternal, generateSlugInternal, getMilestoneInfo, getMilestonePhaseFilter, stripShippedMilestones, extractCurrentMilestone, normalizePhaseName,
|
|
7
|
+
const { execGit, platformWriteSync, platformReadSync } = require('./shell-command-projection.cjs');
|
|
8
|
+
const { loadConfig, resolveModelInternal, findPhaseInternal, getRoadmapPhaseInternal, pathExistsInternal, gitWorktreeInfoInternal, generateSlugInternal, getMilestoneInfo, getMilestonePhaseFilter, stripShippedMilestones, extractCurrentMilestone, normalizePhaseName, toPosixPath, output, error, checkAgentsInstalled, phaseTokenMatches } = require('./core.cjs');
|
|
9
|
+
const { planningPaths, planningDir, planningRoot } = require('./planning-workspace.cjs');
|
|
10
|
+
const { maskIfSecret } = require('./secrets.cjs');
|
|
11
|
+
const scanPhasePlans = require('./plan-scan.cjs');
|
|
12
|
+
const { stateExtractField } = require('./state-document.cjs');
|
|
13
|
+
const { determinePhaseStatus } = require('./commands.cjs');
|
|
14
|
+
|
|
15
|
+
// Accept all bold/colon variants of the Requirements header (#2769):
|
|
16
|
+
// **Requirements:** / **Requirements**: / **Requirements** : render the
|
|
17
|
+
// same in markdown but differ textually.
|
|
18
|
+
const REQUIREMENTS_HEADER_RE = /^\*\*Requirements:?\*\*[^\S\n]*:?[^\S\n]*([^\n]*)$/m;
|
|
19
|
+
|
|
20
|
+
function listPhaseSummaryFiles(phaseDir) {
|
|
21
|
+
return scanPhasePlans(phaseDir).summaryFiles;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function listPhasePlanFiles(phaseDir) {
|
|
25
|
+
return scanPhasePlans(phaseDir).planFiles;
|
|
26
|
+
}
|
|
9
27
|
|
|
10
28
|
function getLatestCompletedMilestone(cwd) {
|
|
11
29
|
const milestonesPath = path.join(planningRoot(cwd), 'MILESTONES.md');
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
};
|
|
22
|
-
} catch {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
30
|
+
const content = platformReadSync(milestonesPath);
|
|
31
|
+
if (content === null) return null;
|
|
32
|
+
|
|
33
|
+
const match = content.match(/^##\s+(v[\d.]+)\s+(.+?)\s+\(Shipped:/m);
|
|
34
|
+
if (!match) return null;
|
|
35
|
+
return {
|
|
36
|
+
version: match[1],
|
|
37
|
+
name: match[2].trim(),
|
|
38
|
+
};
|
|
25
39
|
}
|
|
26
40
|
|
|
27
41
|
/**
|
|
@@ -37,10 +51,31 @@ function withProjectRoot(cwd, result) {
|
|
|
37
51
|
const agentStatus = checkAgentsInstalled();
|
|
38
52
|
result.agents_installed = agentStatus.agents_installed;
|
|
39
53
|
result.missing_agents = agentStatus.missing_agents;
|
|
54
|
+
// Inject response_language into all init outputs (#1399).
|
|
55
|
+
// Workflows propagate this to subagent prompts so user-facing questions
|
|
56
|
+
// stay in the configured language across phase boundaries.
|
|
57
|
+
const config = loadConfig(cwd);
|
|
58
|
+
if (config.response_language) {
|
|
59
|
+
result.response_language = config.response_language;
|
|
60
|
+
}
|
|
61
|
+
// Inject project identity into all init outputs so handoff blocks
|
|
62
|
+
// can include project context for cross-session continuity.
|
|
63
|
+
if (config.project_code) {
|
|
64
|
+
result.project_code = config.project_code;
|
|
65
|
+
}
|
|
66
|
+
// Extract project title from PROJECT.md first H1 heading.
|
|
67
|
+
const projectMdPath = path.join(planningDir(cwd), 'PROJECT.md');
|
|
68
|
+
const content = platformReadSync(projectMdPath);
|
|
69
|
+
if (content) {
|
|
70
|
+
const h1Match = content.match(/^#\s+(.+)$/m);
|
|
71
|
+
if (h1Match) {
|
|
72
|
+
result.project_title = h1Match[1].trim();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
40
75
|
return result;
|
|
41
76
|
}
|
|
42
77
|
|
|
43
|
-
function cmdInitExecutePhase(cwd, phase, raw) {
|
|
78
|
+
function cmdInitExecutePhase(cwd, phase, raw, options = {}) {
|
|
44
79
|
if (!phase) {
|
|
45
80
|
error('phase required for init execute-phase');
|
|
46
81
|
}
|
|
@@ -51,6 +86,16 @@ function cmdInitExecutePhase(cwd, phase, raw) {
|
|
|
51
86
|
|
|
52
87
|
const roadmapPhase = getRoadmapPhaseInternal(cwd, phase);
|
|
53
88
|
|
|
89
|
+
// If findPhaseInternal matched an archived phase from a prior milestone, but
|
|
90
|
+
// the phase exists in the current milestone's ROADMAP.md, ignore the archive
|
|
91
|
+
// match — we are initializing a new phase in the current milestone that
|
|
92
|
+
// happens to share a number with an archived one. Without this, phase_dir,
|
|
93
|
+
// phase_slug and related fields would point at artifacts from a previous
|
|
94
|
+
// milestone.
|
|
95
|
+
if (phaseInfo?.archived && roadmapPhase?.found) {
|
|
96
|
+
phaseInfo = null;
|
|
97
|
+
}
|
|
98
|
+
|
|
54
99
|
// Fallback to ROADMAP.md if no phase directory exists yet
|
|
55
100
|
if (!phaseInfo && roadmapPhase?.found) {
|
|
56
101
|
const phaseName = roadmapPhase.phase_name;
|
|
@@ -69,7 +114,7 @@ function cmdInitExecutePhase(cwd, phase, raw) {
|
|
|
69
114
|
has_reviews: false,
|
|
70
115
|
};
|
|
71
116
|
}
|
|
72
|
-
const reqMatch = roadmapPhase?.section?.match(
|
|
117
|
+
const reqMatch = roadmapPhase?.section?.match(REQUIREMENTS_HEADER_RE);
|
|
73
118
|
const reqExtracted = reqMatch
|
|
74
119
|
? reqMatch[1].replace(/[\[\]]/g, '').split(',').map(s => s.trim()).filter(Boolean).join(', ')
|
|
75
120
|
: null;
|
|
@@ -81,6 +126,7 @@ function cmdInitExecutePhase(cwd, phase, raw) {
|
|
|
81
126
|
verifier_model: resolveModelInternal(cwd, 'sdd-verifier'),
|
|
82
127
|
|
|
83
128
|
// Config flags
|
|
129
|
+
tdd_mode: options.tdd || config.tdd_mode || false,
|
|
84
130
|
commit_docs: config.commit_docs,
|
|
85
131
|
sub_repos: config.sub_repos,
|
|
86
132
|
parallelization: config.parallelization,
|
|
@@ -108,6 +154,7 @@ function cmdInitExecutePhase(cwd, phase, raw) {
|
|
|
108
154
|
// Branch name (pre-computed)
|
|
109
155
|
branch_name: config.branching_strategy === 'phase' && phaseInfo
|
|
110
156
|
? config.phase_branch_template
|
|
157
|
+
.replace('{project}', config.project_code || '')
|
|
111
158
|
.replace('{phase}', phaseInfo.phase_number)
|
|
112
159
|
.replace('{slug}', phaseInfo.phase_slug || 'phase')
|
|
113
160
|
: config.branching_strategy === 'milestone'
|
|
@@ -131,10 +178,34 @@ function cmdInitExecutePhase(cwd, phase, raw) {
|
|
|
131
178
|
config_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'config.json'))),
|
|
132
179
|
};
|
|
133
180
|
|
|
181
|
+
// Optional --validate: run state validation and include warnings (#1627)
|
|
182
|
+
if (options.validate) {
|
|
183
|
+
try {
|
|
184
|
+
const statePath = path.join(planningDir(cwd), 'STATE.md');
|
|
185
|
+
const stateContent = platformReadSync(statePath);
|
|
186
|
+
if (stateContent !== null) {
|
|
187
|
+
const status = stateExtractField(stateContent, 'Status') || '';
|
|
188
|
+
result.state_validation_ran = true;
|
|
189
|
+
// Simple inline validation — check for obvious drift
|
|
190
|
+
const warnings = [];
|
|
191
|
+
const phasesPath = planningPaths(cwd).phases;
|
|
192
|
+
if (phaseInfo && phaseInfo.directory && fs.existsSync(path.join(cwd, phaseInfo.directory))) {
|
|
193
|
+
const diskPlans = listPhasePlanFiles(path.join(cwd, phaseInfo.directory)).length;
|
|
194
|
+
const totalPlansRaw = stateExtractField(stateContent, 'Total Plans in Phase');
|
|
195
|
+
const totalPlansInPhase = totalPlansRaw ? parseInt(totalPlansRaw, 10) : null;
|
|
196
|
+
if (totalPlansInPhase !== null && diskPlans !== totalPlansInPhase) {
|
|
197
|
+
warnings.push(`Plan count mismatch: STATE.md says ${totalPlansInPhase}, disk has ${diskPlans}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
result.state_warnings = warnings;
|
|
201
|
+
}
|
|
202
|
+
} catch { /* intentionally empty */ }
|
|
203
|
+
}
|
|
204
|
+
|
|
134
205
|
output(withProjectRoot(cwd, result), raw);
|
|
135
206
|
}
|
|
136
207
|
|
|
137
|
-
function cmdInitPlanPhase(cwd, phase, raw) {
|
|
208
|
+
function cmdInitPlanPhase(cwd, phase, raw, options = {}) {
|
|
138
209
|
if (!phase) {
|
|
139
210
|
error('phase required for init plan-phase');
|
|
140
211
|
}
|
|
@@ -144,6 +215,16 @@ function cmdInitPlanPhase(cwd, phase, raw) {
|
|
|
144
215
|
|
|
145
216
|
const roadmapPhase = getRoadmapPhaseInternal(cwd, phase);
|
|
146
217
|
|
|
218
|
+
// If findPhaseInternal matched an archived phase from a prior milestone, but
|
|
219
|
+
// the phase exists in the current milestone's ROADMAP.md, ignore the archive
|
|
220
|
+
// match — we are planning a new phase in the current milestone that happens
|
|
221
|
+
// to share a number with an archived one. Without this, phase_dir,
|
|
222
|
+
// phase_slug, has_context and has_research would point at artifacts from a
|
|
223
|
+
// previous milestone.
|
|
224
|
+
if (phaseInfo?.archived && roadmapPhase?.found) {
|
|
225
|
+
phaseInfo = null;
|
|
226
|
+
}
|
|
227
|
+
|
|
147
228
|
// Fallback to ROADMAP.md if no phase directory exists yet
|
|
148
229
|
if (!phaseInfo && roadmapPhase?.found) {
|
|
149
230
|
const phaseName = roadmapPhase.phase_name;
|
|
@@ -162,12 +243,29 @@ function cmdInitPlanPhase(cwd, phase, raw) {
|
|
|
162
243
|
has_reviews: false,
|
|
163
244
|
};
|
|
164
245
|
}
|
|
165
|
-
const reqMatch = roadmapPhase?.section?.match(
|
|
246
|
+
const reqMatch = roadmapPhase?.section?.match(REQUIREMENTS_HEADER_RE);
|
|
166
247
|
const reqExtracted = reqMatch
|
|
167
248
|
? reqMatch[1].replace(/[\[\]]/g, '').split(',').map(s => s.trim()).filter(Boolean).join(', ')
|
|
168
249
|
: null;
|
|
169
250
|
const phase_req_ids = (reqExtracted && reqExtracted !== 'TBD') ? reqExtracted : null;
|
|
170
251
|
|
|
252
|
+
// #3287: compute the canonical directory name with project_code prefix so
|
|
253
|
+
// the first-touch mkdir in /sdd:plan-phase stays consistent with phase.add.
|
|
254
|
+
const phaseDirPlan = phaseInfo?.directory || null;
|
|
255
|
+
const phaseNumberPlan = phaseInfo?.phase_number || null;
|
|
256
|
+
const phaseNamePlan = phaseInfo?.phase_name || null;
|
|
257
|
+
const rawProjectCodePlan = config.project_code || '';
|
|
258
|
+
let expectedPhaseDirPlan = null;
|
|
259
|
+
if (!phaseDirPlan && phaseNumberPlan && phaseNamePlan) {
|
|
260
|
+
const paddedNum = normalizePhaseName(phaseNumberPlan);
|
|
261
|
+
const slug = generateSlugInternal(phaseNamePlan).substring(0, 60);
|
|
262
|
+
if (slug) {
|
|
263
|
+
const prefix = rawProjectCodePlan ? `${rawProjectCodePlan}-` : '';
|
|
264
|
+
const dirName = `${prefix}${paddedNum}-${slug}`;
|
|
265
|
+
expectedPhaseDirPlan = toPosixPath(path.relative(cwd, path.join(planningPaths(cwd).phases, dirName)));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
171
269
|
const result = {
|
|
172
270
|
// Models
|
|
173
271
|
researcher_model: resolveModelInternal(cwd, 'sdd-phase-researcher'),
|
|
@@ -175,21 +273,43 @@ function cmdInitPlanPhase(cwd, phase, raw) {
|
|
|
175
273
|
checker_model: resolveModelInternal(cwd, 'sdd-plan-checker'),
|
|
176
274
|
|
|
177
275
|
// Workflow flags
|
|
276
|
+
tdd_mode: options.tdd || config.tdd_mode || false,
|
|
178
277
|
research_enabled: config.research,
|
|
179
278
|
plan_checker_enabled: config.plan_checker,
|
|
180
279
|
nyquist_validation_enabled: config.nyquist_validation,
|
|
181
280
|
commit_docs: config.commit_docs,
|
|
182
281
|
text_mode: config.text_mode,
|
|
282
|
+
// Auto-advance config — included so workflows don't need separate config-get
|
|
283
|
+
// calls for these values, which causes infinite config-read loops on some models
|
|
284
|
+
// (e.g. Kimi K2.5). See #2192.
|
|
285
|
+
auto_advance: !!(config.auto_advance),
|
|
286
|
+
auto_chain_active: !!(config._auto_chain_active),
|
|
287
|
+
mode: config.mode || 'interactive',
|
|
183
288
|
|
|
184
289
|
// Phase info
|
|
185
290
|
phase_found: !!phaseInfo,
|
|
186
|
-
phase_dir:
|
|
187
|
-
|
|
188
|
-
|
|
291
|
+
phase_dir: phaseDirPlan,
|
|
292
|
+
expected_phase_dir: expectedPhaseDirPlan,
|
|
293
|
+
phase_number: phaseNumberPlan,
|
|
294
|
+
phase_name: phaseNamePlan,
|
|
189
295
|
phase_slug: phaseInfo?.phase_slug || null,
|
|
190
|
-
padded_phase:
|
|
296
|
+
padded_phase: phaseNumberPlan ? normalizePhaseName(phaseNumberPlan) : null,
|
|
191
297
|
phase_req_ids,
|
|
192
298
|
|
|
299
|
+
// #3569: surface phase lifecycle status so /sdd:plan-phase can short-circuit
|
|
300
|
+
// on closed (Complete) phases instead of silently replanning over shipped
|
|
301
|
+
// code. Reuses determinePhaseStatus — the project-wide vocabulary
|
|
302
|
+
// (Pending | Planned | In Progress | Executed | Complete | Needs Review).
|
|
303
|
+
// No directory yet → Pending (phase has not been started).
|
|
304
|
+
phase_status: phaseDirPlan
|
|
305
|
+
? determinePhaseStatus(
|
|
306
|
+
phaseInfo?.plans?.length || 0,
|
|
307
|
+
phaseInfo?.summaries?.length || 0,
|
|
308
|
+
path.join(cwd, phaseDirPlan),
|
|
309
|
+
'Pending',
|
|
310
|
+
)
|
|
311
|
+
: 'Pending',
|
|
312
|
+
|
|
193
313
|
// Existing artifacts
|
|
194
314
|
has_research: phaseInfo?.has_research || false,
|
|
195
315
|
has_context: phaseInfo?.has_context || false,
|
|
@@ -205,6 +325,9 @@ function cmdInitPlanPhase(cwd, phase, raw) {
|
|
|
205
325
|
state_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'STATE.md'))),
|
|
206
326
|
roadmap_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'ROADMAP.md'))),
|
|
207
327
|
requirements_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'REQUIREMENTS.md'))),
|
|
328
|
+
|
|
329
|
+
// Pattern mapper output (null until PATTERNS.md exists in phase dir)
|
|
330
|
+
patterns_path: null,
|
|
208
331
|
};
|
|
209
332
|
|
|
210
333
|
if (phaseInfo?.directory) {
|
|
@@ -232,6 +355,28 @@ function cmdInitPlanPhase(cwd, phase, raw) {
|
|
|
232
355
|
if (reviewsFile) {
|
|
233
356
|
result.reviews_path = toPosixPath(path.join(phaseInfo.directory, reviewsFile));
|
|
234
357
|
}
|
|
358
|
+
const patternsFile = files.find(f => f.endsWith('-PATTERNS.md') || f === 'PATTERNS.md');
|
|
359
|
+
if (patternsFile) {
|
|
360
|
+
result.patterns_path = toPosixPath(path.join(phaseInfo.directory, patternsFile));
|
|
361
|
+
}
|
|
362
|
+
} catch { /* intentionally empty */ }
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Optional --validate: run state validation and include warnings (#1627)
|
|
366
|
+
if (options.validate) {
|
|
367
|
+
try {
|
|
368
|
+
const statePath = path.join(planningDir(cwd), 'STATE.md');
|
|
369
|
+
const stateContent = platformReadSync(statePath);
|
|
370
|
+
if (stateContent !== null) {
|
|
371
|
+
const warnings = [];
|
|
372
|
+
result.state_validation_ran = true;
|
|
373
|
+
const totalPlansRaw = stateExtractField(stateContent, 'Total Plans in Phase');
|
|
374
|
+
const totalPlansInPhase = totalPlansRaw ? parseInt(totalPlansRaw, 10) : null;
|
|
375
|
+
if (totalPlansInPhase !== null && phaseInfo && totalPlansInPhase !== (phaseInfo.plans?.length || 0)) {
|
|
376
|
+
warnings.push(`Plan count mismatch: STATE.md says ${totalPlansInPhase}, disk has ${phaseInfo.plans?.length || 0}`);
|
|
377
|
+
}
|
|
378
|
+
result.state_warnings = warnings;
|
|
379
|
+
}
|
|
235
380
|
} catch { /* intentionally empty */ }
|
|
236
381
|
}
|
|
237
382
|
|
|
@@ -275,7 +420,7 @@ function cmdInitNewProject(cwd, raw) {
|
|
|
275
420
|
'.ex', '.exs', // Elixir
|
|
276
421
|
'.clj', // Clojure
|
|
277
422
|
]);
|
|
278
|
-
const skipDirs = new Set(['node_modules', '.git', '.planning', '.claude', '__pycache__', 'target', 'dist', 'build']);
|
|
423
|
+
const skipDirs = new Set(['node_modules', '.git', '.planning', '.claude', '.codex', '__pycache__', 'target', 'dist', 'build']);
|
|
279
424
|
function findCodeFiles(dir, depth) {
|
|
280
425
|
if (depth > 3) return false;
|
|
281
426
|
let entries;
|
|
@@ -328,8 +473,17 @@ function cmdInitNewProject(cwd, raw) {
|
|
|
328
473
|
is_brownfield: hasCode || hasPackageFile,
|
|
329
474
|
needs_codebase_map: (hasCode || hasPackageFile) && !pathExistsInternal(cwd, '.planning/codebase'),
|
|
330
475
|
|
|
331
|
-
// Git state
|
|
332
|
-
|
|
476
|
+
// Git state (Bug #3491: detect parent worktree to avoid nested .git init)
|
|
477
|
+
...(() => {
|
|
478
|
+
const info = gitWorktreeInfoInternal(cwd);
|
|
479
|
+
const worktreeRoot = info.worktreeRoot;
|
|
480
|
+
const inNestedSubdir = info.inside && worktreeRoot !== null && worktreeRoot !== cwd;
|
|
481
|
+
return {
|
|
482
|
+
has_git: info.inside,
|
|
483
|
+
git_worktree_root: worktreeRoot,
|
|
484
|
+
in_nested_subdir: inNestedSubdir,
|
|
485
|
+
};
|
|
486
|
+
})(),
|
|
333
487
|
|
|
334
488
|
// Enhanced search
|
|
335
489
|
brave_search_available: hasBraveSearch,
|
|
@@ -352,8 +506,11 @@ function cmdInitNewMilestone(cwd, raw) {
|
|
|
352
506
|
|
|
353
507
|
try {
|
|
354
508
|
if (fs.existsSync(phasesDir)) {
|
|
509
|
+
// Bug #2445: filter phase dirs to current milestone only so stale dirs
|
|
510
|
+
// from a prior milestone that were not archived don't inflate the count.
|
|
511
|
+
const isDirInMilestone = getMilestonePhaseFilter(cwd);
|
|
355
512
|
phaseDirCount = fs.readdirSync(phasesDir, { withFileTypes: true })
|
|
356
|
-
.filter(entry => entry.isDirectory())
|
|
513
|
+
.filter(entry => entry.isDirectory() && isDirInMilestone(entry.name))
|
|
357
514
|
.length;
|
|
358
515
|
}
|
|
359
516
|
} catch {}
|
|
@@ -448,14 +605,42 @@ function cmdInitQuick(cwd, description, raw) {
|
|
|
448
605
|
output(withProjectRoot(cwd, result), raw);
|
|
449
606
|
}
|
|
450
607
|
|
|
608
|
+
/**
|
|
609
|
+
* Init handler for ingest-docs workflow (#2801).
|
|
610
|
+
*
|
|
611
|
+
* Returns the minimal set of fields that ingest-docs.md needs to detect
|
|
612
|
+
* whether a project/planning dir exists and choose new vs merge mode.
|
|
613
|
+
* Mirrors the initIngestDocs SDK handler in sdk/src/query/init.ts.
|
|
614
|
+
*/
|
|
615
|
+
function cmdInitIngestDocs(cwd, raw) {
|
|
616
|
+
const config = loadConfig(cwd);
|
|
617
|
+
const result = {
|
|
618
|
+
project_exists: pathExistsInternal(cwd, '.planning/PROJECT.md'),
|
|
619
|
+
planning_exists: fs.existsSync(planningRoot(cwd)),
|
|
620
|
+
...(() => {
|
|
621
|
+
// Bug #3491 — see cmdInitNewProject above. Same shallow-check bug.
|
|
622
|
+
const info = gitWorktreeInfoInternal(cwd);
|
|
623
|
+
const worktreeRoot = info.worktreeRoot;
|
|
624
|
+
const inNestedSubdir = info.inside && worktreeRoot !== null && worktreeRoot !== cwd;
|
|
625
|
+
return {
|
|
626
|
+
has_git: info.inside,
|
|
627
|
+
git_worktree_root: worktreeRoot,
|
|
628
|
+
in_nested_subdir: inNestedSubdir,
|
|
629
|
+
};
|
|
630
|
+
})(),
|
|
631
|
+
project_path: '.planning/PROJECT.md',
|
|
632
|
+
commit_docs: config.commit_docs,
|
|
633
|
+
};
|
|
634
|
+
output(withProjectRoot(cwd, result), raw);
|
|
635
|
+
}
|
|
636
|
+
|
|
451
637
|
function cmdInitResume(cwd, raw) {
|
|
452
638
|
const config = loadConfig(cwd);
|
|
453
639
|
|
|
454
640
|
// Check for interrupted agent
|
|
455
641
|
let interruptedAgentId = null;
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
} catch { /* intentionally empty */ }
|
|
642
|
+
const agentIdRaw = platformReadSync(path.join(planningRoot(cwd), 'current-agent-id.txt'));
|
|
643
|
+
if (agentIdRaw !== null) interruptedAgentId = agentIdRaw.trim();
|
|
459
644
|
|
|
460
645
|
const result = {
|
|
461
646
|
// File existence
|
|
@@ -488,6 +673,16 @@ function cmdInitVerifyWork(cwd, phase, raw) {
|
|
|
488
673
|
const config = loadConfig(cwd);
|
|
489
674
|
let phaseInfo = findPhaseInternal(cwd, phase);
|
|
490
675
|
|
|
676
|
+
// If findPhaseInternal matched an archived phase from a prior milestone, but
|
|
677
|
+
// the phase exists in the current milestone's ROADMAP.md, ignore the archive
|
|
678
|
+
// match — same pattern as cmdInitPhaseOp.
|
|
679
|
+
if (phaseInfo?.archived) {
|
|
680
|
+
const roadmapPhase = getRoadmapPhaseInternal(cwd, phase);
|
|
681
|
+
if (roadmapPhase?.found) {
|
|
682
|
+
phaseInfo = null;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
|
|
491
686
|
// Fallback to ROADMAP.md if no phase directory exists yet
|
|
492
687
|
if (!phaseInfo) {
|
|
493
688
|
const roadmapPhase = getRoadmapPhaseInternal(cwd, phase);
|
|
@@ -578,20 +773,42 @@ function cmdInitPhaseOp(cwd, phase, raw) {
|
|
|
578
773
|
}
|
|
579
774
|
}
|
|
580
775
|
|
|
776
|
+
// #3287: compute the canonical directory name with project_code prefix so
|
|
777
|
+
// the first-touch mkdir in /sdd:discuss-phase stays consistent with phase.add.
|
|
778
|
+
const phaseDir = phaseInfo?.directory || null;
|
|
779
|
+
const phaseNumber = phaseInfo?.phase_number || null;
|
|
780
|
+
const phaseName = phaseInfo?.phase_name || null;
|
|
781
|
+
const rawProjectCode = config.project_code || '';
|
|
782
|
+
let expectedPhaseDir = null;
|
|
783
|
+
if (!phaseDir && phaseNumber && phaseName) {
|
|
784
|
+
const paddedNum = normalizePhaseName(phaseNumber);
|
|
785
|
+
const slug = generateSlugInternal(phaseName).substring(0, 60);
|
|
786
|
+
if (slug) {
|
|
787
|
+
const prefix = rawProjectCode ? `${rawProjectCode}-` : '';
|
|
788
|
+
const dirName = `${prefix}${paddedNum}-${slug}`;
|
|
789
|
+
expectedPhaseDir = toPosixPath(path.relative(cwd, path.join(planningPaths(cwd).phases, dirName)));
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
581
793
|
const result = {
|
|
582
794
|
// Config
|
|
583
795
|
commit_docs: config.commit_docs,
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
796
|
+
// #2997: secret config keys may be either booleans (availability flags) or
|
|
797
|
+
// string API keys (when user did `sdd-tools config-set brave_search XXX`).
|
|
798
|
+
// Pass booleans through; mask string values so the init bundle never echoes
|
|
799
|
+
// plaintext credentials. SDK init.ts mirrors this masking.
|
|
800
|
+
brave_search: typeof config.brave_search === 'string' ? maskIfSecret('brave_search', config.brave_search) : config.brave_search,
|
|
801
|
+
firecrawl: typeof config.firecrawl === 'string' ? maskIfSecret('firecrawl', config.firecrawl) : config.firecrawl,
|
|
802
|
+
exa_search: typeof config.exa_search === 'string' ? maskIfSecret('exa_search', config.exa_search) : config.exa_search,
|
|
587
803
|
|
|
588
804
|
// Phase info
|
|
589
805
|
phase_found: !!phaseInfo,
|
|
590
|
-
phase_dir:
|
|
591
|
-
|
|
592
|
-
|
|
806
|
+
phase_dir: phaseDir,
|
|
807
|
+
expected_phase_dir: expectedPhaseDir,
|
|
808
|
+
phase_number: phaseNumber,
|
|
809
|
+
phase_name: phaseName,
|
|
593
810
|
phase_slug: phaseInfo?.phase_slug || null,
|
|
594
|
-
padded_phase:
|
|
811
|
+
padded_phase: phaseNumber ? normalizePhaseName(phaseNumber) : null,
|
|
595
812
|
|
|
596
813
|
// Existing artifacts
|
|
597
814
|
has_research: phaseInfo?.has_research || false,
|
|
@@ -653,8 +870,9 @@ function cmdInitTodos(cwd, area, raw) {
|
|
|
653
870
|
try {
|
|
654
871
|
const files = fs.readdirSync(pendingDir).filter(f => f.endsWith('.md'));
|
|
655
872
|
for (const file of files) {
|
|
873
|
+
const content = platformReadSync(path.join(pendingDir, file));
|
|
874
|
+
if (content === null) continue;
|
|
656
875
|
try {
|
|
657
|
-
const content = fs.readFileSync(path.join(pendingDir, file), 'utf-8');
|
|
658
876
|
const createdMatch = content.match(/^created:\s*(.+)$/m);
|
|
659
877
|
const titleMatch = content.match(/^title:\s*(.+)$/m);
|
|
660
878
|
const areaMatch = content.match(/^area:\s*(.+)$/m);
|
|
@@ -708,20 +926,68 @@ function cmdInitMilestoneOp(cwd, raw) {
|
|
|
708
926
|
let phaseCount = 0;
|
|
709
927
|
let completedPhases = 0;
|
|
710
928
|
const phasesDir = path.join(planningDir(cwd), 'phases');
|
|
929
|
+
|
|
930
|
+
// Bug #2633 — ROADMAP.md (current milestone section) is the authority for
|
|
931
|
+
// phase counts, NOT the on-disk `.planning/phases/` directory. After
|
|
932
|
+
// `phases clear` between milestones, on-disk dirs will be a subset of the
|
|
933
|
+
// roadmap until each phase is materialized; reading from disk causes
|
|
934
|
+
// `all_phases_complete: true` to fire prematurely.
|
|
935
|
+
let roadmapPhaseNumbers = [];
|
|
936
|
+
try {
|
|
937
|
+
const roadmapPath = path.join(planningDir(cwd), 'ROADMAP.md');
|
|
938
|
+
const roadmapRaw = fs.readFileSync(roadmapPath, 'utf-8');
|
|
939
|
+
const currentSection = extractCurrentMilestone(roadmapRaw, cwd);
|
|
940
|
+
const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi;
|
|
941
|
+
let m;
|
|
942
|
+
while ((m = phasePattern.exec(currentSection)) !== null) {
|
|
943
|
+
roadmapPhaseNumbers.push(m[1]);
|
|
944
|
+
}
|
|
945
|
+
} catch { /* intentionally empty */ }
|
|
946
|
+
|
|
947
|
+
// Canonicalize a phase token by stripping leading zeros from the integer
|
|
948
|
+
// head while preserving any [A-Z]? suffix and dotted segments. So "03" →
|
|
949
|
+
// "3", "03A" → "3A", "03.1" → "3.1", "3A" → "3A". Disk dirs that pad
|
|
950
|
+
// ("03-alpha") then match roadmap tokens ("Phase 3") without ever
|
|
951
|
+
// collapsing distinct tokens like "3" / "3A" / "3.1" into the same bucket.
|
|
952
|
+
const canonicalizePhase = (tok) => {
|
|
953
|
+
const m = tok.match(/^(\d+)([A-Z]?(?:\.\d+)*)$/);
|
|
954
|
+
return m ? String(parseInt(m[1], 10)) + m[2] : tok;
|
|
955
|
+
};
|
|
956
|
+
const diskPhaseDirs = new Map();
|
|
711
957
|
try {
|
|
712
958
|
const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
|
|
713
|
-
const
|
|
714
|
-
|
|
959
|
+
for (const e of entries) {
|
|
960
|
+
if (!e.isDirectory()) continue;
|
|
961
|
+
const m = e.name.match(/^(\d+[A-Z]?(?:\.\d+)*)/);
|
|
962
|
+
if (!m) continue;
|
|
963
|
+
diskPhaseDirs.set(canonicalizePhase(m[1]), e.name);
|
|
964
|
+
}
|
|
965
|
+
} catch { /* intentionally empty */ }
|
|
715
966
|
|
|
716
|
-
|
|
717
|
-
|
|
967
|
+
if (roadmapPhaseNumbers.length > 0) {
|
|
968
|
+
phaseCount = roadmapPhaseNumbers.length;
|
|
969
|
+
for (const num of roadmapPhaseNumbers) {
|
|
970
|
+
const dirName = diskPhaseDirs.get(canonicalizePhase(num));
|
|
971
|
+
if (!dirName) continue;
|
|
718
972
|
try {
|
|
719
|
-
const
|
|
720
|
-
const hasSummary = phaseFiles.some(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
|
|
973
|
+
const hasSummary = listPhaseSummaryFiles(path.join(phasesDir, dirName)).length > 0;
|
|
721
974
|
if (hasSummary) completedPhases++;
|
|
722
975
|
} catch { /* intentionally empty */ }
|
|
723
976
|
}
|
|
724
|
-
}
|
|
977
|
+
} else {
|
|
978
|
+
// Fallback: no parseable ROADMAP — preserve legacy on-disk behavior.
|
|
979
|
+
try {
|
|
980
|
+
const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
|
|
981
|
+
const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
|
|
982
|
+
phaseCount = dirs.length;
|
|
983
|
+
for (const dir of dirs) {
|
|
984
|
+
try {
|
|
985
|
+
const hasSummary = listPhaseSummaryFiles(path.join(phasesDir, dir)).length > 0;
|
|
986
|
+
if (hasSummary) completedPhases++;
|
|
987
|
+
} catch { /* intentionally empty */ }
|
|
988
|
+
}
|
|
989
|
+
} catch { /* intentionally empty */ }
|
|
990
|
+
}
|
|
725
991
|
|
|
726
992
|
// Check archive
|
|
727
993
|
const archiveDir = path.join(planningRoot(cwd), 'archive');
|
|
@@ -763,6 +1029,7 @@ function cmdInitMilestoneOp(cwd, raw) {
|
|
|
763
1029
|
|
|
764
1030
|
function cmdInitMapCodebase(cwd, raw) {
|
|
765
1031
|
const config = loadConfig(cwd);
|
|
1032
|
+
const now = new Date();
|
|
766
1033
|
|
|
767
1034
|
// Check for existing codebase maps
|
|
768
1035
|
const codebaseDir = path.join(planningRoot(cwd), 'codebase');
|
|
@@ -779,6 +1046,11 @@ function cmdInitMapCodebase(cwd, raw) {
|
|
|
779
1046
|
commit_docs: config.commit_docs,
|
|
780
1047
|
search_gitignored: config.search_gitignored,
|
|
781
1048
|
parallelization: config.parallelization,
|
|
1049
|
+
subagent_timeout: config.subagent_timeout,
|
|
1050
|
+
|
|
1051
|
+
// Timestamps
|
|
1052
|
+
date: now.toISOString().split('T')[0],
|
|
1053
|
+
timestamp: now.toISOString(),
|
|
782
1054
|
|
|
783
1055
|
// Paths
|
|
784
1056
|
codebase_dir: '.planning/codebase',
|
|
@@ -814,6 +1086,23 @@ function cmdInitManager(cwd, raw) {
|
|
|
814
1086
|
const phasesDir = paths.phases;
|
|
815
1087
|
const isDirInMilestone = getMilestonePhaseFilter(cwd);
|
|
816
1088
|
|
|
1089
|
+
// Pre-compute directory listing once (avoids O(N) readdirSync per phase)
|
|
1090
|
+
const _phaseDirEntries = (() => {
|
|
1091
|
+
try {
|
|
1092
|
+
return fs.readdirSync(phasesDir, { withFileTypes: true })
|
|
1093
|
+
.filter(e => e.isDirectory())
|
|
1094
|
+
.map(e => e.name);
|
|
1095
|
+
} catch { return []; }
|
|
1096
|
+
})();
|
|
1097
|
+
|
|
1098
|
+
// Pre-extract all checkbox states in a single pass (avoids O(N) regex per phase)
|
|
1099
|
+
const _checkboxStates = new Map();
|
|
1100
|
+
const _cbPattern = /-\s*\[(x| )\]\s*.*Phase\s+(\d+[A-Z]?(?:\.\d+)*)[:\s]/gi;
|
|
1101
|
+
let _cbMatch;
|
|
1102
|
+
while ((_cbMatch = _cbPattern.exec(content)) !== null) {
|
|
1103
|
+
_checkboxStates.set(_cbMatch[2], _cbMatch[1].toLowerCase() === 'x');
|
|
1104
|
+
}
|
|
1105
|
+
|
|
817
1106
|
const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi;
|
|
818
1107
|
const phases = [];
|
|
819
1108
|
let match;
|
|
@@ -844,15 +1133,14 @@ function cmdInitManager(cwd, raw) {
|
|
|
844
1133
|
let isActive = false;
|
|
845
1134
|
|
|
846
1135
|
try {
|
|
847
|
-
const
|
|
848
|
-
const
|
|
849
|
-
const dirMatch = dirs.find(d => d.startsWith(normalized + '-') || d === normalized);
|
|
1136
|
+
const dirs = _phaseDirEntries.filter(isDirInMilestone);
|
|
1137
|
+
const dirMatch = dirs.find(d => phaseTokenMatches(d, normalized));
|
|
850
1138
|
|
|
851
1139
|
if (dirMatch) {
|
|
852
1140
|
const fullDir = path.join(phasesDir, dirMatch);
|
|
853
1141
|
const phaseFiles = fs.readdirSync(fullDir);
|
|
854
|
-
planCount =
|
|
855
|
-
summaryCount =
|
|
1142
|
+
planCount = listPhasePlanFiles(fullDir).length;
|
|
1143
|
+
summaryCount = listPhaseSummaryFiles(fullDir).length;
|
|
856
1144
|
hasContext = phaseFiles.some(f => f.endsWith('-CONTEXT.md') || f === 'CONTEXT.md');
|
|
857
1145
|
hasResearch = phaseFiles.some(f => f.endsWith('-RESEARCH.md') || f === 'RESEARCH.md');
|
|
858
1146
|
|
|
@@ -879,10 +1167,8 @@ function cmdInitManager(cwd, raw) {
|
|
|
879
1167
|
}
|
|
880
1168
|
} catch { /* intentionally empty */ }
|
|
881
1169
|
|
|
882
|
-
// Check ROADMAP checkbox status
|
|
883
|
-
const
|
|
884
|
-
const checkboxMatch = content.match(checkboxPattern);
|
|
885
|
-
const roadmapComplete = checkboxMatch ? checkboxMatch[1] === 'x' : false;
|
|
1170
|
+
// Check ROADMAP checkbox status (pre-extracted above the loop)
|
|
1171
|
+
const roadmapComplete = _checkboxStates.get(phaseNum) || false;
|
|
886
1172
|
if (roadmapComplete && diskStatus !== 'complete') {
|
|
887
1173
|
diskStatus = 'complete';
|
|
888
1174
|
}
|
|
@@ -915,6 +1201,17 @@ function cmdInitManager(cwd, raw) {
|
|
|
915
1201
|
|
|
916
1202
|
// Dependency satisfaction: check if all depends_on phases are complete
|
|
917
1203
|
const completedNums = new Set(phases.filter(p => p.disk_status === 'complete').map(p => p.number));
|
|
1204
|
+
|
|
1205
|
+
// Also include phases from previously shipped milestones — they are all
|
|
1206
|
+
// complete by definition (a milestone only ships when all phases are done).
|
|
1207
|
+
// rawContent is the full ROADMAP.md (including <details>-wrapped shipped
|
|
1208
|
+
// milestone sections that extractCurrentMilestone strips out).
|
|
1209
|
+
const _allCompletedPattern = /-\s*\[x\]\s*.*Phase\s+(\d+[A-Z]?(?:\.\d+)*)[:\s]/gi;
|
|
1210
|
+
let _allMatch;
|
|
1211
|
+
while ((_allMatch = _allCompletedPattern.exec(rawContent)) !== null) {
|
|
1212
|
+
completedNums.add(_allMatch[1]);
|
|
1213
|
+
}
|
|
1214
|
+
|
|
918
1215
|
for (const phase of phases) {
|
|
919
1216
|
if (!phase.depends_on || /^none$/i.test(phase.depends_on.trim())) {
|
|
920
1217
|
phase.deps_satisfied = true;
|
|
@@ -933,30 +1230,28 @@ function cmdInitManager(cwd, raw) {
|
|
|
933
1230
|
: '—';
|
|
934
1231
|
}
|
|
935
1232
|
|
|
936
|
-
// Sliding window: discuss is sequential — only the first undiscussed phase is available
|
|
937
|
-
let foundNextToDiscuss = false;
|
|
938
1233
|
for (const phase of phases) {
|
|
939
|
-
|
|
940
|
-
phase.
|
|
941
|
-
|
|
942
|
-
} else {
|
|
943
|
-
phase.is_next_to_discuss = false;
|
|
944
|
-
}
|
|
1234
|
+
phase.is_next_to_discuss =
|
|
1235
|
+
(phase.disk_status === 'empty' || phase.disk_status === 'no_directory') &&
|
|
1236
|
+
phase.deps_satisfied;
|
|
945
1237
|
}
|
|
946
1238
|
|
|
947
1239
|
// Check for WAITING.json signal
|
|
948
1240
|
let waitingSignal = null;
|
|
949
1241
|
try {
|
|
950
1242
|
const waitingPath = path.join(cwd, '.planning', 'WAITING.json');
|
|
951
|
-
|
|
952
|
-
|
|
1243
|
+
const waitingRaw = platformReadSync(waitingPath);
|
|
1244
|
+
if (waitingRaw !== null) {
|
|
1245
|
+
waitingSignal = JSON.parse(waitingRaw);
|
|
953
1246
|
}
|
|
954
1247
|
} catch { /* intentionally empty */ }
|
|
955
1248
|
|
|
956
1249
|
// Compute recommended actions (execute > plan > discuss)
|
|
1250
|
+
// Skip BACKLOG phases (999.x numbering) — they are parked ideas, not active work
|
|
957
1251
|
const recommendedActions = [];
|
|
958
1252
|
for (const phase of phases) {
|
|
959
1253
|
if (phase.disk_status === 'complete') continue;
|
|
1254
|
+
if (/^999(?:\.|$)/.test(phase.number)) continue;
|
|
960
1255
|
|
|
961
1256
|
if (phase.disk_status === 'planned' && phase.deps_satisfied) {
|
|
962
1257
|
recommendedActions.push({
|
|
@@ -1023,7 +1318,30 @@ function cmdInitManager(cwd, raw) {
|
|
|
1023
1318
|
return true;
|
|
1024
1319
|
});
|
|
1025
1320
|
|
|
1026
|
-
|
|
1321
|
+
// Exclude backlog phases (999.x) from completion accounting (#2129)
|
|
1322
|
+
const nonBacklogPhases = phases.filter(p => !/^999(?:\.|$)/.test(p.number));
|
|
1323
|
+
const completedCount = nonBacklogPhases.filter(p => p.disk_status === 'complete').length;
|
|
1324
|
+
|
|
1325
|
+
// Read manager flags from config (passthrough flags for each step)
|
|
1326
|
+
// Validate: flags must be CLI-safe (only --flags, alphanumeric, hyphens, spaces)
|
|
1327
|
+
const sanitizeFlags = (raw) => {
|
|
1328
|
+
const val = typeof raw === 'string' ? raw : '';
|
|
1329
|
+
if (!val) return '';
|
|
1330
|
+
// Allow only --flag patterns with alphanumeric/hyphen values separated by spaces
|
|
1331
|
+
const tokens = val.split(/\s+/).filter(Boolean);
|
|
1332
|
+
const safe = tokens.every(t => /^--[a-zA-Z0-9][-a-zA-Z0-9]*$/.test(t) || /^[a-zA-Z0-9][-a-zA-Z0-9_.]*$/.test(t));
|
|
1333
|
+
if (!safe) {
|
|
1334
|
+
process.stderr.write(`sdd-tools: warning: manager.flags contains invalid tokens, ignoring: ${val}\n`);
|
|
1335
|
+
return '';
|
|
1336
|
+
}
|
|
1337
|
+
return val;
|
|
1338
|
+
};
|
|
1339
|
+
const managerFlags = {
|
|
1340
|
+
discuss: sanitizeFlags(config.manager && config.manager.flags && config.manager.flags.discuss),
|
|
1341
|
+
plan: sanitizeFlags(config.manager && config.manager.flags && config.manager.flags.plan),
|
|
1342
|
+
execute: sanitizeFlags(config.manager && config.manager.flags && config.manager.flags.execute),
|
|
1343
|
+
};
|
|
1344
|
+
|
|
1027
1345
|
const result = {
|
|
1028
1346
|
milestone_version: milestone.version,
|
|
1029
1347
|
milestone_name: milestone.name,
|
|
@@ -1033,16 +1351,21 @@ function cmdInitManager(cwd, raw) {
|
|
|
1033
1351
|
in_progress_count: phases.filter(p => ['partial', 'planned', 'discussed', 'researched'].includes(p.disk_status)).length,
|
|
1034
1352
|
recommended_actions: filteredActions,
|
|
1035
1353
|
waiting_signal: waitingSignal,
|
|
1036
|
-
all_complete: completedCount ===
|
|
1354
|
+
all_complete: completedCount === nonBacklogPhases.length && nonBacklogPhases.length > 0,
|
|
1037
1355
|
project_exists: pathExistsInternal(cwd, '.planning/PROJECT.md'),
|
|
1038
1356
|
roadmap_exists: true,
|
|
1039
1357
|
state_exists: true,
|
|
1358
|
+
manager_flags: managerFlags,
|
|
1040
1359
|
};
|
|
1041
1360
|
|
|
1042
1361
|
output(withProjectRoot(cwd, result), raw);
|
|
1043
1362
|
}
|
|
1044
1363
|
|
|
1045
1364
|
function cmdInitProgress(cwd, raw) {
|
|
1365
|
+
try {
|
|
1366
|
+
const { pruneOrphanedWorktrees } = require('./core.cjs');
|
|
1367
|
+
pruneOrphanedWorktrees(cwd);
|
|
1368
|
+
} catch (_) {}
|
|
1046
1369
|
const config = loadConfig(cwd);
|
|
1047
1370
|
const milestone = getMilestoneInfo(cwd);
|
|
1048
1371
|
|
|
@@ -1055,6 +1378,7 @@ function cmdInitProgress(cwd, raw) {
|
|
|
1055
1378
|
// Build set of phases defined in ROADMAP for the current milestone
|
|
1056
1379
|
const roadmapPhaseNums = new Set();
|
|
1057
1380
|
const roadmapPhaseNames = new Map();
|
|
1381
|
+
const roadmapCheckboxStates = new Map();
|
|
1058
1382
|
try {
|
|
1059
1383
|
const roadmapContent = extractCurrentMilestone(
|
|
1060
1384
|
fs.readFileSync(path.join(planningDir(cwd), 'ROADMAP.md'), 'utf-8'), cwd
|
|
@@ -1065,6 +1389,13 @@ function cmdInitProgress(cwd, raw) {
|
|
|
1065
1389
|
roadmapPhaseNums.add(hm[1]);
|
|
1066
1390
|
roadmapPhaseNames.set(hm[1], hm[2].replace(/\(INSERTED\)/i, '').trim());
|
|
1067
1391
|
}
|
|
1392
|
+
// #2646: parse `- [x] Phase N` checkbox states so ROADMAP-only phases
|
|
1393
|
+
// inherit completion from the ROADMAP when no phase directory exists.
|
|
1394
|
+
const cbPattern = /-\s*\[(x| )\]\s*.*Phase\s+(\d+[A-Z]?(?:\.\d+)*)[:\s]/gi;
|
|
1395
|
+
let cbm;
|
|
1396
|
+
while ((cbm = cbPattern.exec(roadmapContent)) !== null) {
|
|
1397
|
+
roadmapCheckboxStates.set(cbm[2], cbm[1].toLowerCase() === 'x');
|
|
1398
|
+
}
|
|
1068
1399
|
} catch { /* intentionally empty */ }
|
|
1069
1400
|
|
|
1070
1401
|
const isDirInMilestone = getMilestonePhaseFilter(cwd);
|
|
@@ -1090,8 +1421,8 @@ function cmdInitProgress(cwd, raw) {
|
|
|
1090
1421
|
const phasePath = path.join(phasesDir, dir);
|
|
1091
1422
|
const phaseFiles = fs.readdirSync(phasePath);
|
|
1092
1423
|
|
|
1093
|
-
const plans =
|
|
1094
|
-
const summaries =
|
|
1424
|
+
const plans = listPhasePlanFiles(phasePath);
|
|
1425
|
+
const summaries = listPhaseSummaryFiles(phasePath);
|
|
1095
1426
|
const hasResearch = phaseFiles.some(f => f.endsWith('-RESEARCH.md') || f === 'RESEARCH.md');
|
|
1096
1427
|
|
|
1097
1428
|
const status = summaries.length >= plans.length && plans.length > 0 ? 'complete' :
|
|
@@ -1120,21 +1451,27 @@ function cmdInitProgress(cwd, raw) {
|
|
|
1120
1451
|
}
|
|
1121
1452
|
} catch { /* intentionally empty */ }
|
|
1122
1453
|
|
|
1123
|
-
// Add phases defined in ROADMAP but not yet scaffolded to disk
|
|
1454
|
+
// Add phases defined in ROADMAP but not yet scaffolded to disk. When the
|
|
1455
|
+
// ROADMAP has a `- [x] Phase N` checkbox, honor it as 'complete' so
|
|
1456
|
+
// completed_count and status reflect the ROADMAP source of truth (#2646).
|
|
1124
1457
|
for (const [num, name] of roadmapPhaseNames) {
|
|
1125
1458
|
const stripped = num.replace(/^0+/, '') || '0';
|
|
1126
1459
|
if (!seenPhaseNums.has(stripped)) {
|
|
1460
|
+
const checkboxComplete =
|
|
1461
|
+
roadmapCheckboxStates.get(num) === true ||
|
|
1462
|
+
roadmapCheckboxStates.get(stripped) === true;
|
|
1463
|
+
const status = checkboxComplete ? 'complete' : 'not_started';
|
|
1127
1464
|
const phaseInfo = {
|
|
1128
1465
|
number: num,
|
|
1129
1466
|
name: name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, ''),
|
|
1130
1467
|
directory: null,
|
|
1131
|
-
status
|
|
1468
|
+
status,
|
|
1132
1469
|
plan_count: 0,
|
|
1133
1470
|
summary_count: 0,
|
|
1134
1471
|
has_research: false,
|
|
1135
1472
|
};
|
|
1136
1473
|
phases.push(phaseInfo);
|
|
1137
|
-
if (!nextPhase && !currentPhase) {
|
|
1474
|
+
if (!nextPhase && !currentPhase && status !== 'complete') {
|
|
1138
1475
|
nextPhase = phaseInfo;
|
|
1139
1476
|
}
|
|
1140
1477
|
}
|
|
@@ -1145,11 +1482,11 @@ function cmdInitProgress(cwd, raw) {
|
|
|
1145
1482
|
|
|
1146
1483
|
// Check for paused work
|
|
1147
1484
|
let pausedAt = null;
|
|
1148
|
-
|
|
1149
|
-
|
|
1485
|
+
const state = platformReadSync(path.join(planningDir(cwd), 'STATE.md'));
|
|
1486
|
+
if (state !== null) {
|
|
1150
1487
|
const pauseMatch = state.match(/\*\*Paused At:\*\*\s*(.+)/);
|
|
1151
1488
|
if (pauseMatch) pausedAt = pauseMatch[1].trim();
|
|
1152
|
-
}
|
|
1489
|
+
}
|
|
1153
1490
|
|
|
1154
1491
|
const result = {
|
|
1155
1492
|
// Models
|
|
@@ -1203,11 +1540,8 @@ function detectChildRepos(dir) {
|
|
|
1203
1540
|
const fullPath = path.join(dir, entry.name);
|
|
1204
1541
|
const gitDir = path.join(fullPath, '.git');
|
|
1205
1542
|
if (fs.existsSync(gitDir)) {
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
const status = execSync('git status --porcelain', { cwd: fullPath, encoding: 'utf8', timeout: 5000 });
|
|
1209
|
-
hasUncommitted = status.trim().length > 0;
|
|
1210
|
-
} catch { /* best-effort */ }
|
|
1543
|
+
const statusResult = execGit(['status', '--porcelain'], { cwd: fullPath, timeout: 5000 });
|
|
1544
|
+
const hasUncommitted = statusResult.exitCode === 0 && statusResult.stdout.length > 0;
|
|
1211
1545
|
repos.push({ name: entry.name, path: fullPath, has_uncommitted: hasUncommitted });
|
|
1212
1546
|
}
|
|
1213
1547
|
}
|
|
@@ -1222,11 +1556,8 @@ function cmdInitNewWorkspace(cwd, raw) {
|
|
|
1222
1556
|
const childRepos = detectChildRepos(cwd);
|
|
1223
1557
|
|
|
1224
1558
|
// Check if git worktree is available
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
execSync('git --version', { encoding: 'utf8', timeout: 5000, stdio: 'pipe' });
|
|
1228
|
-
worktreeAvailable = true;
|
|
1229
|
-
} catch { /* no git at all */ }
|
|
1559
|
+
const gitVersion = execGit(['--version'], { timeout: 5000 });
|
|
1560
|
+
const worktreeAvailable = gitVersion.exitCode === 0;
|
|
1230
1561
|
|
|
1231
1562
|
const result = {
|
|
1232
1563
|
default_workspace_base: defaultBase,
|
|
@@ -1257,14 +1588,14 @@ function cmdInitListWorkspaces(cwd, raw) {
|
|
|
1257
1588
|
let repoCount = 0;
|
|
1258
1589
|
let hasProject = false;
|
|
1259
1590
|
let strategy = 'unknown';
|
|
1260
|
-
|
|
1261
|
-
|
|
1591
|
+
const manifest = platformReadSync(manifestPath);
|
|
1592
|
+
if (manifest !== null) {
|
|
1262
1593
|
const strategyMatch = manifest.match(/^Strategy:\s*(.+)$/m);
|
|
1263
1594
|
if (strategyMatch) strategy = strategyMatch[1].trim();
|
|
1264
1595
|
// Count table rows (lines starting with |, excluding header and separator)
|
|
1265
1596
|
const tableRows = manifest.split('\n').filter(l => l.match(/^\|\s*\w/) && !l.includes('Repo') && !l.includes('---'));
|
|
1266
1597
|
repoCount = tableRows.length;
|
|
1267
|
-
}
|
|
1598
|
+
}
|
|
1268
1599
|
hasProject = fs.existsSync(path.join(wsPath, '.planning', 'PROJECT.md'));
|
|
1269
1600
|
|
|
1270
1601
|
workspaces.push({
|
|
@@ -1304,9 +1635,10 @@ function cmdInitRemoveWorkspace(cwd, name, raw) {
|
|
|
1304
1635
|
// Parse manifest for repo info
|
|
1305
1636
|
const repos = [];
|
|
1306
1637
|
let strategy = 'unknown';
|
|
1307
|
-
|
|
1638
|
+
const manifestContent = platformReadSync(manifestPath);
|
|
1639
|
+
if (manifestContent !== null) {
|
|
1308
1640
|
try {
|
|
1309
|
-
const manifest =
|
|
1641
|
+
const manifest = manifestContent;
|
|
1310
1642
|
const strategyMatch = manifest.match(/^Strategy:\s*(.+)$/m);
|
|
1311
1643
|
if (strategyMatch) strategy = strategyMatch[1].trim();
|
|
1312
1644
|
|
|
@@ -1326,12 +1658,10 @@ function cmdInitRemoveWorkspace(cwd, name, raw) {
|
|
|
1326
1658
|
for (const repo of repos) {
|
|
1327
1659
|
const repoPath = path.join(wsPath, repo.name);
|
|
1328
1660
|
if (!fs.existsSync(repoPath)) continue;
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
}
|
|
1334
|
-
} catch { /* best-effort */ }
|
|
1661
|
+
const statusResult = execGit(['status', '--porcelain'], { cwd: repoPath, timeout: 5000 });
|
|
1662
|
+
if (statusResult.exitCode === 0 && statusResult.stdout.length > 0) {
|
|
1663
|
+
dirtyRepos.push(repo.name);
|
|
1664
|
+
}
|
|
1335
1665
|
}
|
|
1336
1666
|
|
|
1337
1667
|
const result = {
|
|
@@ -1362,6 +1692,10 @@ function cmdInitRemoveWorkspace(cwd, name, raw) {
|
|
|
1362
1692
|
*/
|
|
1363
1693
|
function buildAgentSkillsBlock(config, agentType, projectRoot) {
|
|
1364
1694
|
const { validatePath } = require('./security.cjs');
|
|
1695
|
+
const os = require('os');
|
|
1696
|
+
const { getGlobalSkillDir, getGlobalSkillDisplayPath } = require('./runtime-homes.cjs');
|
|
1697
|
+
const runtime = (config && config.runtime) || 'claude';
|
|
1698
|
+
const globalSkillsBase = require('./runtime-homes.cjs').getGlobalSkillsBase(runtime);
|
|
1365
1699
|
|
|
1366
1700
|
if (!config || !config.agent_skills || !agentType) return '';
|
|
1367
1701
|
|
|
@@ -1376,6 +1710,43 @@ function buildAgentSkillsBlock(config, agentType, projectRoot) {
|
|
|
1376
1710
|
for (const skillPath of skillPaths) {
|
|
1377
1711
|
if (typeof skillPath !== 'string') continue;
|
|
1378
1712
|
|
|
1713
|
+
// Support global: prefix for skills installed at the runtime's global skills directory (#1992, #3126)
|
|
1714
|
+
if (skillPath.startsWith('global:')) {
|
|
1715
|
+
const skillName = skillPath.slice(7);
|
|
1716
|
+
// Explicit empty-name guard before regex for clearer error message
|
|
1717
|
+
if (!skillName) {
|
|
1718
|
+
process.stderr.write(`[agent-skills] WARNING: "global:" prefix with empty skill name — skipping\n`);
|
|
1719
|
+
continue;
|
|
1720
|
+
}
|
|
1721
|
+
// Sanitize: skill name must be alphanumeric, hyphens, or underscores only
|
|
1722
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(skillName)) {
|
|
1723
|
+
process.stderr.write(`[agent-skills] WARNING: Invalid global skill name "${skillName}" — skipping\n`);
|
|
1724
|
+
continue;
|
|
1725
|
+
}
|
|
1726
|
+
// Cline is rules-based and has no global skills directory
|
|
1727
|
+
if (globalSkillsBase === null) {
|
|
1728
|
+
process.stderr.write(`[agent-skills] WARNING: Runtime "${runtime}" does not use a skills directory — "global:${skillName}" is not supported on this runtime\n`);
|
|
1729
|
+
continue;
|
|
1730
|
+
}
|
|
1731
|
+
const globalSkillDir = getGlobalSkillDir(runtime, skillName);
|
|
1732
|
+
const globalSkillMd = path.join(globalSkillDir, 'SKILL.md');
|
|
1733
|
+
const displayPath = getGlobalSkillDisplayPath(runtime, skillName);
|
|
1734
|
+
if (!fs.existsSync(globalSkillMd)) {
|
|
1735
|
+
process.stderr.write(`[agent-skills] WARNING: Global skill not found at "${displayPath}/SKILL.md" — skipping\n`);
|
|
1736
|
+
continue;
|
|
1737
|
+
}
|
|
1738
|
+
// Symlink escape guard: validatePath resolves symlinks and enforces
|
|
1739
|
+
// containment within globalSkillsBase. Prevents a skill directory
|
|
1740
|
+
// symlinked to an arbitrary location from being injected (#1992).
|
|
1741
|
+
const pathCheck = validatePath(globalSkillMd, globalSkillsBase, { allowAbsolute: true });
|
|
1742
|
+
if (!pathCheck.safe) {
|
|
1743
|
+
process.stderr.write(`[agent-skills] WARNING: Global skill "${skillName}" failed path check (symlink escape?) — skipping\n`);
|
|
1744
|
+
continue;
|
|
1745
|
+
}
|
|
1746
|
+
validPaths.push({ ref: `${globalSkillDir}/SKILL.md`, display: displayPath });
|
|
1747
|
+
continue;
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1379
1750
|
// Validate path safety — must resolve within project root
|
|
1380
1751
|
const pathCheck = validatePath(skillPath, projectRoot);
|
|
1381
1752
|
if (!pathCheck.safe) {
|
|
@@ -1390,12 +1761,12 @@ function buildAgentSkillsBlock(config, agentType, projectRoot) {
|
|
|
1390
1761
|
continue;
|
|
1391
1762
|
}
|
|
1392
1763
|
|
|
1393
|
-
validPaths.push(skillPath);
|
|
1764
|
+
validPaths.push({ ref: `${skillPath}/SKILL.md`, display: skillPath });
|
|
1394
1765
|
}
|
|
1395
1766
|
|
|
1396
1767
|
if (validPaths.length === 0) return '';
|
|
1397
1768
|
|
|
1398
|
-
const lines = validPaths.map(p => `- @${p}
|
|
1769
|
+
const lines = validPaths.map(p => `- @${p.ref}`).join('\n');
|
|
1399
1770
|
return `<agent_skills>\nRead these user-configured skills:\n${lines}\n</agent_skills>`;
|
|
1400
1771
|
}
|
|
1401
1772
|
|
|
@@ -1419,12 +1790,234 @@ function cmdAgentSkills(cwd, agentType, raw) {
|
|
|
1419
1790
|
process.exit(0);
|
|
1420
1791
|
}
|
|
1421
1792
|
|
|
1793
|
+
/**
|
|
1794
|
+
* Generate a skill manifest from a skills directory.
|
|
1795
|
+
*
|
|
1796
|
+
* Scans the canonical skill discovery roots and returns a normalized
|
|
1797
|
+
* inventory object with discovered skills, root metadata, and installation
|
|
1798
|
+
* summary flags. A legacy `skillsDir` override is still accepted for focused
|
|
1799
|
+
* scans, but the default mode is multi-root discovery.
|
|
1800
|
+
*
|
|
1801
|
+
* @param {string} cwd - Project root directory
|
|
1802
|
+
* @param {string|null} [skillsDir] - Optional absolute path to a specific skills directory
|
|
1803
|
+
* @returns {{
|
|
1804
|
+
* skills: Array<{name: string, description: string, triggers: string[], path: string, file_path: string, root: string, scope: string, installed: boolean, deprecated: boolean}>,
|
|
1805
|
+
* roots: Array<{root: string, path: string, scope: string, present: boolean, skill_count?: number, command_count?: number, deprecated?: boolean}>,
|
|
1806
|
+
* installation: { sdd_skills_installed: boolean, legacy_claude_commands_installed: boolean },
|
|
1807
|
+
* counts: { skills: number, roots: number }
|
|
1808
|
+
* }}
|
|
1809
|
+
*/
|
|
1810
|
+
function buildSkillManifest(cwd, skillsDir = null) {
|
|
1811
|
+
const { extractFrontmatter } = require('./frontmatter.cjs');
|
|
1812
|
+
const { getGlobalSkillsBase } = require('./runtime-homes.cjs');
|
|
1813
|
+
const os = require('os');
|
|
1814
|
+
|
|
1815
|
+
const canonicalRoots = skillsDir ? [{
|
|
1816
|
+
root: path.resolve(skillsDir),
|
|
1817
|
+
path: path.resolve(skillsDir),
|
|
1818
|
+
scope: 'custom',
|
|
1819
|
+
present: fs.existsSync(skillsDir),
|
|
1820
|
+
kind: 'skills',
|
|
1821
|
+
}] : [
|
|
1822
|
+
{
|
|
1823
|
+
root: '.claude/skills',
|
|
1824
|
+
path: path.join(cwd, '.claude', 'skills'),
|
|
1825
|
+
scope: 'project',
|
|
1826
|
+
kind: 'skills',
|
|
1827
|
+
},
|
|
1828
|
+
{
|
|
1829
|
+
root: '.agents/skills',
|
|
1830
|
+
path: path.join(cwd, '.agents', 'skills'),
|
|
1831
|
+
scope: 'project',
|
|
1832
|
+
kind: 'skills',
|
|
1833
|
+
},
|
|
1834
|
+
{
|
|
1835
|
+
root: '.cursor/skills',
|
|
1836
|
+
path: path.join(cwd, '.cursor', 'skills'),
|
|
1837
|
+
scope: 'project',
|
|
1838
|
+
kind: 'skills',
|
|
1839
|
+
},
|
|
1840
|
+
{
|
|
1841
|
+
root: '.github/skills',
|
|
1842
|
+
path: path.join(cwd, '.github', 'skills'),
|
|
1843
|
+
scope: 'project',
|
|
1844
|
+
kind: 'skills',
|
|
1845
|
+
},
|
|
1846
|
+
{
|
|
1847
|
+
root: '.codex/skills',
|
|
1848
|
+
path: path.join(cwd, '.codex', 'skills'),
|
|
1849
|
+
scope: 'project',
|
|
1850
|
+
kind: 'skills',
|
|
1851
|
+
},
|
|
1852
|
+
{
|
|
1853
|
+
root: '~/.claude/skills',
|
|
1854
|
+
path: getGlobalSkillsBase('claude'),
|
|
1855
|
+
scope: 'global',
|
|
1856
|
+
kind: 'skills',
|
|
1857
|
+
},
|
|
1858
|
+
{
|
|
1859
|
+
root: '~/.codex/skills',
|
|
1860
|
+
path: getGlobalSkillsBase('codex'),
|
|
1861
|
+
scope: 'global',
|
|
1862
|
+
kind: 'skills',
|
|
1863
|
+
},
|
|
1864
|
+
{
|
|
1865
|
+
root: '.claude/sdd/skills',
|
|
1866
|
+
path: path.join(os.homedir(), '.claude', 'sdd', 'skills'),
|
|
1867
|
+
scope: 'import-only',
|
|
1868
|
+
kind: 'skills',
|
|
1869
|
+
deprecated: true,
|
|
1870
|
+
},
|
|
1871
|
+
{
|
|
1872
|
+
root: '.claude/commands/sdd',
|
|
1873
|
+
path: path.join(os.homedir(), '.claude', 'commands', 'sdd'),
|
|
1874
|
+
scope: 'legacy-commands',
|
|
1875
|
+
kind: 'commands',
|
|
1876
|
+
deprecated: true,
|
|
1877
|
+
},
|
|
1878
|
+
];
|
|
1879
|
+
|
|
1880
|
+
const skills = [];
|
|
1881
|
+
const roots = [];
|
|
1882
|
+
let legacyClaudeCommandsInstalled = false;
|
|
1883
|
+
for (const rootInfo of canonicalRoots) {
|
|
1884
|
+
const rootPath = rootInfo.path;
|
|
1885
|
+
const rootSummary = {
|
|
1886
|
+
root: rootInfo.root,
|
|
1887
|
+
path: rootPath,
|
|
1888
|
+
scope: rootInfo.scope,
|
|
1889
|
+
present: fs.existsSync(rootPath),
|
|
1890
|
+
deprecated: !!rootInfo.deprecated,
|
|
1891
|
+
};
|
|
1892
|
+
|
|
1893
|
+
if (!rootSummary.present) {
|
|
1894
|
+
roots.push(rootSummary);
|
|
1895
|
+
continue;
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1898
|
+
if (rootInfo.kind === 'commands') {
|
|
1899
|
+
let entries = [];
|
|
1900
|
+
try {
|
|
1901
|
+
entries = fs.readdirSync(rootPath, { withFileTypes: true });
|
|
1902
|
+
} catch {
|
|
1903
|
+
roots.push(rootSummary);
|
|
1904
|
+
continue;
|
|
1905
|
+
}
|
|
1906
|
+
|
|
1907
|
+
const commandFiles = entries.filter(entry => entry.isFile() && entry.name.endsWith('.md'));
|
|
1908
|
+
rootSummary.command_count = commandFiles.length;
|
|
1909
|
+
if (rootSummary.command_count > 0) legacyClaudeCommandsInstalled = true;
|
|
1910
|
+
roots.push(rootSummary);
|
|
1911
|
+
continue;
|
|
1912
|
+
}
|
|
1913
|
+
|
|
1914
|
+
let entries;
|
|
1915
|
+
try {
|
|
1916
|
+
entries = fs.readdirSync(rootPath, { withFileTypes: true });
|
|
1917
|
+
} catch {
|
|
1918
|
+
roots.push(rootSummary);
|
|
1919
|
+
continue;
|
|
1920
|
+
}
|
|
1921
|
+
|
|
1922
|
+
let skillCount = 0;
|
|
1923
|
+
for (const entry of entries) {
|
|
1924
|
+
if (!entry.isDirectory()) continue;
|
|
1925
|
+
|
|
1926
|
+
const skillMdPath = path.join(rootPath, entry.name, 'SKILL.md');
|
|
1927
|
+
const content = platformReadSync(skillMdPath);
|
|
1928
|
+
if (content === null) continue;
|
|
1929
|
+
|
|
1930
|
+
const frontmatter = extractFrontmatter(content);
|
|
1931
|
+
const name = frontmatter.name || entry.name;
|
|
1932
|
+
const description = frontmatter.description || '';
|
|
1933
|
+
|
|
1934
|
+
// Extract trigger lines from body text (after frontmatter)
|
|
1935
|
+
const triggers = [];
|
|
1936
|
+
const bodyMatch = content.match(/^---[\s\S]*?---\s*\n([\s\S]*)$/);
|
|
1937
|
+
if (bodyMatch) {
|
|
1938
|
+
const body = bodyMatch[1];
|
|
1939
|
+
const triggerLines = body.match(/^TRIGGER\s+when:\s*(.+)$/gmi);
|
|
1940
|
+
if (triggerLines) {
|
|
1941
|
+
for (const line of triggerLines) {
|
|
1942
|
+
const m = line.match(/^TRIGGER\s+when:\s*(.+)$/i);
|
|
1943
|
+
if (m) triggers.push(m[1].trim());
|
|
1944
|
+
}
|
|
1945
|
+
}
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1948
|
+
skills.push({
|
|
1949
|
+
name,
|
|
1950
|
+
description,
|
|
1951
|
+
triggers,
|
|
1952
|
+
path: entry.name,
|
|
1953
|
+
file_path: `${entry.name}/SKILL.md`,
|
|
1954
|
+
root: rootInfo.root,
|
|
1955
|
+
scope: rootInfo.scope,
|
|
1956
|
+
installed: rootInfo.scope !== 'import-only',
|
|
1957
|
+
deprecated: !!rootInfo.deprecated,
|
|
1958
|
+
});
|
|
1959
|
+
skillCount++;
|
|
1960
|
+
}
|
|
1961
|
+
|
|
1962
|
+
rootSummary.skill_count = skillCount;
|
|
1963
|
+
roots.push(rootSummary);
|
|
1964
|
+
}
|
|
1965
|
+
|
|
1966
|
+
skills.sort((a, b) => {
|
|
1967
|
+
const rootCmp = a.root.localeCompare(b.root);
|
|
1968
|
+
return rootCmp !== 0 ? rootCmp : a.name.localeCompare(b.name);
|
|
1969
|
+
});
|
|
1970
|
+
|
|
1971
|
+
const sddSkillsInstalled = skills.some(skill => skill.name.startsWith('sdd-'));
|
|
1972
|
+
|
|
1973
|
+
return {
|
|
1974
|
+
skills,
|
|
1975
|
+
roots,
|
|
1976
|
+
installation: {
|
|
1977
|
+
sdd_skills_installed: sddSkillsInstalled,
|
|
1978
|
+
legacy_claude_commands_installed: legacyClaudeCommandsInstalled,
|
|
1979
|
+
},
|
|
1980
|
+
counts: {
|
|
1981
|
+
skills: skills.length,
|
|
1982
|
+
roots: roots.length,
|
|
1983
|
+
},
|
|
1984
|
+
};
|
|
1985
|
+
}
|
|
1986
|
+
|
|
1987
|
+
/**
|
|
1988
|
+
* Command: generate skill manifest JSON.
|
|
1989
|
+
*
|
|
1990
|
+
* Options:
|
|
1991
|
+
* --skills-dir <path> Optional absolute path to a single skills directory
|
|
1992
|
+
* --write Also write to .planning/skill-manifest.json
|
|
1993
|
+
*/
|
|
1994
|
+
function cmdSkillManifest(cwd, args, raw) {
|
|
1995
|
+
const skillsDirIdx = args.indexOf('--skills-dir');
|
|
1996
|
+
const skillsDir = skillsDirIdx >= 0 && args[skillsDirIdx + 1]
|
|
1997
|
+
? args[skillsDirIdx + 1]
|
|
1998
|
+
: null;
|
|
1999
|
+
|
|
2000
|
+
const manifest = buildSkillManifest(cwd, skillsDir);
|
|
2001
|
+
|
|
2002
|
+
// Optionally write to .planning/skill-manifest.json
|
|
2003
|
+
if (args.includes('--write')) {
|
|
2004
|
+
const planningDir = path.join(cwd, '.planning');
|
|
2005
|
+
if (fs.existsSync(planningDir)) {
|
|
2006
|
+
const manifestPath = path.join(planningDir, 'skill-manifest.json');
|
|
2007
|
+
platformWriteSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
2008
|
+
}
|
|
2009
|
+
}
|
|
2010
|
+
|
|
2011
|
+
output(manifest, raw);
|
|
2012
|
+
}
|
|
2013
|
+
|
|
1422
2014
|
module.exports = {
|
|
1423
2015
|
cmdInitExecutePhase,
|
|
1424
2016
|
cmdInitPlanPhase,
|
|
1425
2017
|
cmdInitNewProject,
|
|
1426
2018
|
cmdInitNewMilestone,
|
|
1427
2019
|
cmdInitQuick,
|
|
2020
|
+
cmdInitIngestDocs,
|
|
1428
2021
|
cmdInitResume,
|
|
1429
2022
|
cmdInitVerifyWork,
|
|
1430
2023
|
cmdInitPhaseOp,
|
|
@@ -1439,4 +2032,6 @@ module.exports = {
|
|
|
1439
2032
|
detectChildRepos,
|
|
1440
2033
|
buildAgentSkillsBlock,
|
|
1441
2034
|
cmdAgentSkills,
|
|
2035
|
+
buildSkillManifest,
|
|
2036
|
+
cmdSkillManifest,
|
|
1442
2037
|
};
|