@opengsd/gsd-core 1.2.0-rc.1
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/LICENSE +21 -0
- package/README.ja-JP.md +870 -0
- package/README.ko-KR.md +861 -0
- package/README.md +301 -0
- package/README.pt-BR.md +492 -0
- package/README.zh-CN.md +842 -0
- package/agents/gsd-advisor-researcher.md +127 -0
- package/agents/gsd-ai-researcher.md +133 -0
- package/agents/gsd-assumptions-analyzer.md +105 -0
- package/agents/gsd-code-fixer.md +668 -0
- package/agents/gsd-code-reviewer.md +387 -0
- package/agents/gsd-codebase-mapper.md +853 -0
- package/agents/gsd-debug-session-manager.md +314 -0
- package/agents/gsd-debugger.md +1452 -0
- package/agents/gsd-doc-classifier.md +168 -0
- package/agents/gsd-doc-synthesizer.md +204 -0
- package/agents/gsd-doc-verifier.md +217 -0
- package/agents/gsd-doc-writer.md +615 -0
- package/agents/gsd-domain-researcher.md +153 -0
- package/agents/gsd-eval-auditor.md +191 -0
- package/agents/gsd-eval-planner.md +154 -0
- package/agents/gsd-executor.md +772 -0
- package/agents/gsd-framework-selector.md +160 -0
- package/agents/gsd-integration-checker.md +470 -0
- package/agents/gsd-intel-updater.md +342 -0
- package/agents/gsd-nyquist-auditor.md +203 -0
- package/agents/gsd-pattern-mapper.md +335 -0
- package/agents/gsd-phase-researcher.md +928 -0
- package/agents/gsd-plan-checker.md +978 -0
- package/agents/gsd-planner.md +1218 -0
- package/agents/gsd-project-researcher.md +677 -0
- package/agents/gsd-research-synthesizer.md +255 -0
- package/agents/gsd-roadmapper.md +688 -0
- package/agents/gsd-security-auditor.md +155 -0
- package/agents/gsd-ui-auditor.md +495 -0
- package/agents/gsd-ui-checker.md +309 -0
- package/agents/gsd-ui-researcher.md +380 -0
- package/agents/gsd-user-profiler.md +171 -0
- package/agents/gsd-verifier.md +917 -0
- package/bin/install.js +10936 -0
- package/bin/lib/ui-safety-gate.cjs +107 -0
- package/commands/gsd/add-tests.md +42 -0
- package/commands/gsd/ai-integration-phase.md +37 -0
- package/commands/gsd/audit-fix.md +34 -0
- package/commands/gsd/audit-milestone.md +37 -0
- package/commands/gsd/audit-uat.md +24 -0
- package/commands/gsd/autonomous.md +46 -0
- package/commands/gsd/capture.md +62 -0
- package/commands/gsd/cleanup.md +24 -0
- package/commands/gsd/code-review.md +59 -0
- package/commands/gsd/complete-milestone.md +143 -0
- package/commands/gsd/config.md +56 -0
- package/commands/gsd/debug.md +52 -0
- package/commands/gsd/discuss-phase.md +76 -0
- package/commands/gsd/docs-update.md +49 -0
- package/commands/gsd/eval-review.md +33 -0
- package/commands/gsd/execute-phase.md +64 -0
- package/commands/gsd/explore.md +27 -0
- package/commands/gsd/extract-learnings.md +23 -0
- package/commands/gsd/fast.md +31 -0
- package/commands/gsd/forensics.md +57 -0
- package/commands/gsd/graphify.md +199 -0
- package/commands/gsd/health.md +31 -0
- package/commands/gsd/help.md +28 -0
- package/commands/gsd/import.md +41 -0
- package/commands/gsd/inbox.md +39 -0
- package/commands/gsd/ingest-docs.md +42 -0
- package/commands/gsd/manager.md +45 -0
- package/commands/gsd/map-codebase.md +83 -0
- package/commands/gsd/milestone-summary.md +51 -0
- package/commands/gsd/mvp-phase.md +45 -0
- package/commands/gsd/new-milestone.md +45 -0
- package/commands/gsd/new-project.md +47 -0
- package/commands/gsd/ns-context.md +23 -0
- package/commands/gsd/ns-ideate.md +24 -0
- package/commands/gsd/ns-manage.md +29 -0
- package/commands/gsd/ns-project.md +22 -0
- package/commands/gsd/ns-review.md +26 -0
- package/commands/gsd/ns-workflow.md +28 -0
- package/commands/gsd/pause-work.md +43 -0
- package/commands/gsd/phase.md +56 -0
- package/commands/gsd/plan-phase.md +62 -0
- package/commands/gsd/plan-review-convergence.md +59 -0
- package/commands/gsd/pr-branch.md +26 -0
- package/commands/gsd/profile-user.md +46 -0
- package/commands/gsd/progress.md +47 -0
- package/commands/gsd/quick.md +174 -0
- package/commands/gsd/resume-work.md +30 -0
- package/commands/gsd/review-backlog.md +63 -0
- package/commands/gsd/review.md +41 -0
- package/commands/gsd/secure-phase.md +36 -0
- package/commands/gsd/settings.md +29 -0
- package/commands/gsd/ship.md +24 -0
- package/commands/gsd/sketch.md +60 -0
- package/commands/gsd/spec-phase.md +63 -0
- package/commands/gsd/spike.md +57 -0
- package/commands/gsd/stats.md +19 -0
- package/commands/gsd/surface.md +155 -0
- package/commands/gsd/thread.md +24 -0
- package/commands/gsd/ui-phase.md +35 -0
- package/commands/gsd/ui-review.md +33 -0
- package/commands/gsd/ultraplan-phase.md +34 -0
- package/commands/gsd/undo.md +35 -0
- package/commands/gsd/update.md +48 -0
- package/commands/gsd/validate-phase.md +36 -0
- package/commands/gsd/verify-work.md +39 -0
- package/commands/gsd/workspace.md +52 -0
- package/commands/gsd/workstreams.md +70 -0
- package/get-shit-done/bin/check-latest-version.cjs +106 -0
- package/get-shit-done/bin/gsd-tools.cjs +1676 -0
- package/get-shit-done/bin/lib/active-workstream-store.cjs +302 -0
- package/get-shit-done/bin/lib/adr-parser.cjs +394 -0
- package/get-shit-done/bin/lib/agent-command-router.cjs +65 -0
- package/get-shit-done/bin/lib/artifacts.cjs +53 -0
- package/get-shit-done/bin/lib/audit.cjs +755 -0
- package/get-shit-done/bin/lib/check-command-router.cjs +333 -0
- package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +118 -0
- package/get-shit-done/bin/lib/clock.cjs +96 -0
- package/get-shit-done/bin/lib/clusters.cjs +135 -0
- package/get-shit-done/bin/lib/code-review-flags.cjs +74 -0
- package/get-shit-done/bin/lib/command-aliases.cjs +815 -0
- package/get-shit-done/bin/lib/command-arg-projection.cjs +62 -0
- package/get-shit-done/bin/lib/command-routing-hub.cjs +388 -0
- package/get-shit-done/bin/lib/commands.cjs +1188 -0
- package/get-shit-done/bin/lib/config-schema.cjs +31 -0
- package/get-shit-done/bin/lib/config.cjs +728 -0
- package/get-shit-done/bin/lib/configuration.cjs +248 -0
- package/get-shit-done/bin/lib/context-utilization.cjs +47 -0
- package/get-shit-done/bin/lib/core.cjs +2121 -0
- package/get-shit-done/bin/lib/decisions.cjs +116 -0
- package/get-shit-done/bin/lib/docs.cjs +270 -0
- package/get-shit-done/bin/lib/drift.cjs +388 -0
- package/get-shit-done/bin/lib/fallow-runner.cjs +109 -0
- package/get-shit-done/bin/lib/frontmatter.cjs +389 -0
- package/get-shit-done/bin/lib/gap-checker.cjs +205 -0
- package/get-shit-done/bin/lib/graphify.cjs +592 -0
- package/get-shit-done/bin/lib/gsd2-import.cjs +514 -0
- package/get-shit-done/bin/lib/init-command-router.cjs +58 -0
- package/get-shit-done/bin/lib/init.cjs +2112 -0
- package/get-shit-done/bin/lib/install-profiles.cjs +603 -0
- package/get-shit-done/bin/lib/installer-migration-authoring.cjs +117 -0
- package/get-shit-done/bin/lib/installer-migration-report.cjs +354 -0
- package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
- package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
- package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
- package/get-shit-done/bin/lib/installer-migrations.cjs +778 -0
- package/get-shit-done/bin/lib/intel.cjs +708 -0
- package/get-shit-done/bin/lib/learnings.cjs +421 -0
- package/get-shit-done/bin/lib/milestone.cjs +314 -0
- package/get-shit-done/bin/lib/model-catalog.cjs +212 -0
- package/get-shit-done/bin/lib/model-profiles.cjs +31 -0
- package/get-shit-done/bin/lib/observability/event.cjs +82 -0
- package/get-shit-done/bin/lib/observability/logger.cjs +174 -0
- package/get-shit-done/bin/lib/observability/redaction.cjs +50 -0
- package/get-shit-done/bin/lib/package-identity.cjs +31 -0
- package/get-shit-done/bin/lib/phase-command-router.cjs +191 -0
- package/get-shit-done/bin/lib/phase-lifecycle.cjs +80 -0
- package/get-shit-done/bin/lib/phase.cjs +1607 -0
- package/get-shit-done/bin/lib/phases-command-router.cjs +39 -0
- package/get-shit-done/bin/lib/plan-scan.cjs +97 -0
- package/get-shit-done/bin/lib/planning-workspace.cjs +238 -0
- package/get-shit-done/bin/lib/profile-output.cjs +1141 -0
- package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
- package/get-shit-done/bin/lib/project-root.cjs +112 -0
- package/get-shit-done/bin/lib/prompt-budget.cjs +399 -0
- package/get-shit-done/bin/lib/review-reviewer-selection.cjs +125 -0
- package/get-shit-done/bin/lib/roadmap-command-router.cjs +28 -0
- package/get-shit-done/bin/lib/roadmap.cjs +650 -0
- package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +301 -0
- package/get-shit-done/bin/lib/runtime-homes.cjs +222 -0
- package/get-shit-done/bin/lib/runtime-name-policy.cjs +83 -0
- package/get-shit-done/bin/lib/runtime-slash.cjs +112 -0
- package/get-shit-done/bin/lib/schema-detect.cjs +165 -0
- package/get-shit-done/bin/lib/secrets.cjs +32 -0
- package/get-shit-done/bin/lib/security.cjs +600 -0
- package/get-shit-done/bin/lib/semver-compare.cjs +35 -0
- package/get-shit-done/bin/lib/shell-command-projection.cjs +500 -0
- package/get-shit-done/bin/lib/state-command-router.cjs +252 -0
- package/get-shit-done/bin/lib/state-document.cjs +263 -0
- package/get-shit-done/bin/lib/state.cjs +2038 -0
- package/get-shit-done/bin/lib/surface.cjs +470 -0
- package/get-shit-done/bin/lib/task-command-router.cjs +81 -0
- package/get-shit-done/bin/lib/template.cjs +228 -0
- package/get-shit-done/bin/lib/uat.cjs +289 -0
- package/get-shit-done/bin/lib/update-context.cjs +209 -0
- package/get-shit-done/bin/lib/validate-command-router.cjs +83 -0
- package/get-shit-done/bin/lib/validate.cjs +92 -0
- package/get-shit-done/bin/lib/verify-command-router.cjs +40 -0
- package/get-shit-done/bin/lib/verify.cjs +1511 -0
- package/get-shit-done/bin/lib/workstream-inventory-builder.cjs +74 -0
- package/get-shit-done/bin/lib/workstream-inventory.cjs +146 -0
- package/get-shit-done/bin/lib/workstream-name-policy.cjs +94 -0
- package/get-shit-done/bin/lib/workstream.cjs +389 -0
- package/get-shit-done/bin/lib/worktree-safety.cjs +985 -0
- package/get-shit-done/bin/shared/config-defaults.manifest.json +97 -0
- package/get-shit-done/bin/shared/config-schema.manifest.json +175 -0
- package/get-shit-done/bin/shared/model-catalog.json +122 -0
- package/get-shit-done/bin/shared/runtime-aliases.manifest.json +75 -0
- package/get-shit-done/bin/verify-reapply-patches.cjs +352 -0
- package/get-shit-done/contexts/dev.md +21 -0
- package/get-shit-done/contexts/research.md +22 -0
- package/get-shit-done/contexts/review.md +23 -0
- package/get-shit-done/references/agent-contracts.md +79 -0
- package/get-shit-done/references/ai-evals.md +156 -0
- package/get-shit-done/references/ai-frameworks.md +186 -0
- package/get-shit-done/references/artifact-types.md +131 -0
- package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
- package/get-shit-done/references/checkpoints.md +814 -0
- package/get-shit-done/references/common-bug-patterns.md +114 -0
- package/get-shit-done/references/context-budget.md +85 -0
- package/get-shit-done/references/continuation-format.md +253 -0
- package/get-shit-done/references/debugger-philosophy.md +76 -0
- package/get-shit-done/references/decimal-phase-calculation.md +64 -0
- package/get-shit-done/references/doc-conflict-engine.md +91 -0
- package/get-shit-done/references/domain-probes.md +125 -0
- package/get-shit-done/references/execute-mvp-tdd.md +81 -0
- package/get-shit-done/references/executor-examples.md +110 -0
- package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
- package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
- package/get-shit-done/references/gate-prompts.md +100 -0
- package/get-shit-done/references/gates.md +70 -0
- package/get-shit-done/references/git-integration.md +298 -0
- package/get-shit-done/references/git-planning-commit.md +40 -0
- package/get-shit-done/references/ios-scaffold.md +123 -0
- package/get-shit-done/references/mandatory-initial-read.md +2 -0
- package/get-shit-done/references/model-profile-resolution.md +38 -0
- package/get-shit-done/references/model-profiles.md +245 -0
- package/get-shit-done/references/mvp-concepts.md +49 -0
- package/get-shit-done/references/phase-argument-parsing.md +61 -0
- package/get-shit-done/references/planner-antipatterns.md +89 -0
- package/get-shit-done/references/planner-chunked.md +49 -0
- package/get-shit-done/references/planner-gap-closure.md +62 -0
- package/get-shit-done/references/planner-graphify-auto-update.md +67 -0
- package/get-shit-done/references/planner-human-verify-mode.md +57 -0
- package/get-shit-done/references/planner-interface-context.md +62 -0
- package/get-shit-done/references/planner-mvp-mode.md +53 -0
- package/get-shit-done/references/planner-reviews.md +39 -0
- package/get-shit-done/references/planner-revision.md +87 -0
- package/get-shit-done/references/planner-source-audit.md +73 -0
- package/get-shit-done/references/planning-config.md +471 -0
- package/get-shit-done/references/project-skills-discovery.md +19 -0
- package/get-shit-done/references/questioning.md +162 -0
- package/get-shit-done/references/revision-loop.md +97 -0
- package/get-shit-done/references/scout-codebase.md +51 -0
- package/get-shit-done/references/skeleton-template.md +48 -0
- package/get-shit-done/references/sketch-interactivity.md +41 -0
- package/get-shit-done/references/sketch-theme-system.md +94 -0
- package/get-shit-done/references/sketch-tooling.md +45 -0
- package/get-shit-done/references/sketch-variant-patterns.md +81 -0
- package/get-shit-done/references/spidr-splitting.md +69 -0
- package/get-shit-done/references/tdd.md +330 -0
- package/get-shit-done/references/thinking-models-debug.md +44 -0
- package/get-shit-done/references/thinking-models-execution.md +50 -0
- package/get-shit-done/references/thinking-models-planning.md +62 -0
- package/get-shit-done/references/thinking-models-research.md +50 -0
- package/get-shit-done/references/thinking-models-verification.md +55 -0
- package/get-shit-done/references/thinking-partner.md +96 -0
- package/get-shit-done/references/ui-brand.md +160 -0
- package/get-shit-done/references/universal-anti-patterns.md +63 -0
- package/get-shit-done/references/user-profiling.md +681 -0
- package/get-shit-done/references/user-story-template.md +58 -0
- package/get-shit-done/references/verification-overrides.md +227 -0
- package/get-shit-done/references/verification-patterns.md +612 -0
- package/get-shit-done/references/verify-mvp-mode.md +85 -0
- package/get-shit-done/references/workstream-flag.md +111 -0
- package/get-shit-done/references/worktree-path-safety.md +89 -0
- package/get-shit-done/templates/AI-SPEC.md +246 -0
- package/get-shit-done/templates/DEBUG.md +169 -0
- package/get-shit-done/templates/README.md +77 -0
- package/get-shit-done/templates/SECURITY.md +61 -0
- package/get-shit-done/templates/UAT.md +265 -0
- package/get-shit-done/templates/UI-SPEC.md +100 -0
- package/get-shit-done/templates/VALIDATION.md +76 -0
- package/get-shit-done/templates/claude-md.md +145 -0
- package/get-shit-done/templates/codebase/architecture.md +255 -0
- package/get-shit-done/templates/codebase/concerns.md +310 -0
- package/get-shit-done/templates/codebase/conventions.md +307 -0
- package/get-shit-done/templates/codebase/integrations.md +280 -0
- package/get-shit-done/templates/codebase/stack.md +186 -0
- package/get-shit-done/templates/codebase/structure.md +285 -0
- package/get-shit-done/templates/codebase/testing.md +480 -0
- package/get-shit-done/templates/config.json +62 -0
- package/get-shit-done/templates/context.md +352 -0
- package/get-shit-done/templates/continue-here.md +78 -0
- package/get-shit-done/templates/copilot-instructions.md +7 -0
- package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
- package/get-shit-done/templates/dev-preferences.md +21 -0
- package/get-shit-done/templates/discovery.md +146 -0
- package/get-shit-done/templates/discussion-log.md +63 -0
- package/get-shit-done/templates/milestone-archive.md +123 -0
- package/get-shit-done/templates/milestone.md +115 -0
- package/get-shit-done/templates/phase-prompt.md +610 -0
- package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
- package/get-shit-done/templates/project.md +186 -0
- package/get-shit-done/templates/requirements.md +231 -0
- package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
- package/get-shit-done/templates/research-project/FEATURES.md +147 -0
- package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
- package/get-shit-done/templates/research-project/STACK.md +120 -0
- package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
- package/get-shit-done/templates/research.md +592 -0
- package/get-shit-done/templates/retrospective.md +54 -0
- package/get-shit-done/templates/roadmap.md +202 -0
- package/get-shit-done/templates/spec.md +307 -0
- package/get-shit-done/templates/state.md +195 -0
- package/get-shit-done/templates/summary-complex.md +59 -0
- package/get-shit-done/templates/summary-minimal.md +41 -0
- package/get-shit-done/templates/summary-standard.md +48 -0
- package/get-shit-done/templates/summary.md +248 -0
- package/get-shit-done/templates/user-profile.md +146 -0
- package/get-shit-done/templates/user-setup.md +311 -0
- package/get-shit-done/templates/verification-report.md +322 -0
- package/get-shit-done/workflows/_runtime-launcher.snippet.sh +1 -0
- package/get-shit-done/workflows/add-backlog.md +91 -0
- package/get-shit-done/workflows/add-phase.md +113 -0
- package/get-shit-done/workflows/add-tests.md +355 -0
- package/get-shit-done/workflows/add-todo.md +161 -0
- package/get-shit-done/workflows/ai-integration-phase.md +295 -0
- package/get-shit-done/workflows/analyze-dependencies.md +96 -0
- package/get-shit-done/workflows/audit-fix.md +178 -0
- package/get-shit-done/workflows/audit-milestone.md +358 -0
- package/get-shit-done/workflows/audit-uat.md +110 -0
- package/get-shit-done/workflows/autonomous.md +795 -0
- package/get-shit-done/workflows/check-todos.md +180 -0
- package/get-shit-done/workflows/cleanup.md +155 -0
- package/get-shit-done/workflows/code-review-fix.md +502 -0
- package/get-shit-done/workflows/code-review.md +656 -0
- package/get-shit-done/workflows/complete-milestone.md +855 -0
- package/get-shit-done/workflows/debug.md +232 -0
- package/get-shit-done/workflows/diagnose-issues.md +241 -0
- package/get-shit-done/workflows/discovery-phase.md +291 -0
- package/get-shit-done/workflows/discuss-phase/modes/advisor.md +176 -0
- package/get-shit-done/workflows/discuss-phase/modes/all.md +28 -0
- package/get-shit-done/workflows/discuss-phase/modes/analyze.md +44 -0
- package/get-shit-done/workflows/discuss-phase/modes/auto.md +57 -0
- package/get-shit-done/workflows/discuss-phase/modes/batch.md +52 -0
- package/get-shit-done/workflows/discuss-phase/modes/chain.md +98 -0
- package/get-shit-done/workflows/discuss-phase/modes/default.md +141 -0
- package/get-shit-done/workflows/discuss-phase/modes/power.md +44 -0
- package/get-shit-done/workflows/discuss-phase/modes/text.md +55 -0
- package/get-shit-done/workflows/discuss-phase/templates/checkpoint.json +18 -0
- package/get-shit-done/workflows/discuss-phase/templates/context.md +136 -0
- package/get-shit-done/workflows/discuss-phase/templates/discussion-log.md +50 -0
- package/get-shit-done/workflows/discuss-phase-assumptions.md +675 -0
- package/get-shit-done/workflows/discuss-phase-power.md +291 -0
- package/get-shit-done/workflows/discuss-phase.md +499 -0
- package/get-shit-done/workflows/do.md +111 -0
- package/get-shit-done/workflows/docs-update.md +1162 -0
- package/get-shit-done/workflows/edit-phase.md +295 -0
- package/get-shit-done/workflows/eval-review.md +156 -0
- package/get-shit-done/workflows/execute-phase/steps/codebase-drift-gate.md +82 -0
- package/get-shit-done/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
- package/get-shit-done/workflows/execute-phase/steps/post-merge-gate.md +117 -0
- package/get-shit-done/workflows/execute-phase.md +1709 -0
- package/get-shit-done/workflows/execute-plan.md +526 -0
- package/get-shit-done/workflows/explore.md +144 -0
- package/get-shit-done/workflows/extract-learnings.md +243 -0
- package/get-shit-done/workflows/fast.md +124 -0
- package/get-shit-done/workflows/forensics.md +279 -0
- package/get-shit-done/workflows/graduation.md +196 -0
- package/get-shit-done/workflows/health.md +224 -0
- package/get-shit-done/workflows/help/modes/brief.md +22 -0
- package/get-shit-done/workflows/help/modes/default.md +50 -0
- package/get-shit-done/workflows/help/modes/full.md +784 -0
- package/get-shit-done/workflows/help/modes/topic.md +74 -0
- package/get-shit-done/workflows/help.md +24 -0
- package/get-shit-done/workflows/import.md +254 -0
- package/get-shit-done/workflows/inbox.md +387 -0
- package/get-shit-done/workflows/ingest-docs.md +339 -0
- package/get-shit-done/workflows/insert-phase.md +152 -0
- package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
- package/get-shit-done/workflows/list-workspaces.md +57 -0
- package/get-shit-done/workflows/manager.md +393 -0
- package/get-shit-done/workflows/map-codebase.md +444 -0
- package/get-shit-done/workflows/milestone-summary.md +224 -0
- package/get-shit-done/workflows/mvp-phase.md +222 -0
- package/get-shit-done/workflows/new-milestone.md +635 -0
- package/get-shit-done/workflows/new-project.md +1555 -0
- package/get-shit-done/workflows/new-workspace.md +240 -0
- package/get-shit-done/workflows/next.md +299 -0
- package/get-shit-done/workflows/node-repair.md +92 -0
- package/get-shit-done/workflows/note.md +158 -0
- package/get-shit-done/workflows/pause-work.md +244 -0
- package/get-shit-done/workflows/plan-milestone-gaps.md +281 -0
- package/get-shit-done/workflows/plan-phase.md +1809 -0
- package/get-shit-done/workflows/plan-review-convergence.md +346 -0
- package/get-shit-done/workflows/plant-seed.md +230 -0
- package/get-shit-done/workflows/pr-branch.md +157 -0
- package/get-shit-done/workflows/profile-user.md +453 -0
- package/get-shit-done/workflows/progress.md +699 -0
- package/get-shit-done/workflows/quick.md +1039 -0
- package/get-shit-done/workflows/reapply-patches.md +426 -0
- package/get-shit-done/workflows/remove-phase.md +156 -0
- package/get-shit-done/workflows/remove-workspace.md +108 -0
- package/get-shit-done/workflows/resume-project.md +332 -0
- package/get-shit-done/workflows/review.md +623 -0
- package/get-shit-done/workflows/scan.md +105 -0
- package/get-shit-done/workflows/secure-phase.md +180 -0
- package/get-shit-done/workflows/session-report.md +146 -0
- package/get-shit-done/workflows/settings-advanced.md +620 -0
- package/get-shit-done/workflows/settings-integrations.md +312 -0
- package/get-shit-done/workflows/settings.md +552 -0
- package/get-shit-done/workflows/ship.md +356 -0
- package/get-shit-done/workflows/sketch-wrap-up.md +286 -0
- package/get-shit-done/workflows/sketch.md +361 -0
- package/get-shit-done/workflows/spec-phase.md +262 -0
- package/get-shit-done/workflows/spike-wrap-up.md +307 -0
- package/get-shit-done/workflows/spike.md +453 -0
- package/get-shit-done/workflows/stats.md +80 -0
- package/get-shit-done/workflows/sync-skills.md +182 -0
- package/get-shit-done/workflows/thread.md +222 -0
- package/get-shit-done/workflows/transition.md +694 -0
- package/get-shit-done/workflows/ui-phase.md +328 -0
- package/get-shit-done/workflows/ui-review.md +193 -0
- package/get-shit-done/workflows/ultraplan-phase.md +199 -0
- package/get-shit-done/workflows/undo.md +314 -0
- package/get-shit-done/workflows/update.md +443 -0
- package/get-shit-done/workflows/validate-phase.md +179 -0
- package/get-shit-done/workflows/verify-phase.md +544 -0
- package/get-shit-done/workflows/verify-work.md +781 -0
- package/hooks/dist/gsd-check-update-worker.js +95 -0
- package/hooks/dist/gsd-check-update.js +64 -0
- package/hooks/dist/gsd-context-monitor.js +195 -0
- package/hooks/dist/gsd-graphify-update.sh +158 -0
- package/hooks/dist/gsd-phase-boundary.sh +47 -0
- package/hooks/dist/gsd-prompt-guard.js +97 -0
- package/hooks/dist/gsd-read-guard.js +101 -0
- package/hooks/dist/gsd-read-injection-scanner.js +203 -0
- package/hooks/dist/gsd-session-state.sh +59 -0
- package/hooks/dist/gsd-statusline.js +548 -0
- package/hooks/dist/gsd-update-banner.js +134 -0
- package/hooks/dist/gsd-validate-commit.sh +57 -0
- package/hooks/dist/gsd-workflow-guard.js +166 -0
- package/hooks/dist/lib/git-cmd.js +150 -0
- package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
- package/hooks/gsd-check-update-worker.js +95 -0
- package/hooks/gsd-check-update.js +64 -0
- package/hooks/gsd-context-monitor.js +195 -0
- package/hooks/gsd-graphify-update.sh +158 -0
- package/hooks/gsd-phase-boundary.sh +47 -0
- package/hooks/gsd-prompt-guard.js +97 -0
- package/hooks/gsd-read-guard.js +101 -0
- package/hooks/gsd-read-injection-scanner.js +203 -0
- package/hooks/gsd-session-state.sh +59 -0
- package/hooks/gsd-statusline.js +548 -0
- package/hooks/gsd-update-banner.js +134 -0
- package/hooks/gsd-validate-commit.sh +57 -0
- package/hooks/gsd-workflow-guard.js +166 -0
- package/hooks/lib/git-cmd.js +150 -0
- package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
- package/hooks/managed-hooks-registry.cjs +34 -0
- package/package.json +102 -0
- package/scripts/affected-tests-lib.cjs +541 -0
- package/scripts/audit-workflow-script-paths.cjs +73 -0
- package/scripts/base64-scan.sh +339 -0
- package/scripts/build-hooks.js +236 -0
- package/scripts/changeset/README.md +129 -0
- package/scripts/changeset/cli.cjs +392 -0
- package/scripts/changeset/github-release-notes.cjs +199 -0
- package/scripts/changeset/lint.cjs +110 -0
- package/scripts/changeset/new.cjs +137 -0
- package/scripts/changeset/parse.cjs +114 -0
- package/scripts/changeset/render.cjs +34 -0
- package/scripts/changeset/serialize.cjs +130 -0
- package/scripts/check-alias-drift.cjs +108 -0
- package/scripts/check-env.cjs +302 -0
- package/scripts/check-npm-integrity.cjs +209 -0
- package/scripts/ci-guard-runner.cjs +16 -0
- package/scripts/ci-prepare-test-scope.cjs +46 -0
- package/scripts/ci-rebase-check.cjs +85 -0
- package/scripts/ci-test-scope.cjs +302 -0
- package/scripts/command-contract-helpers.cjs +64 -0
- package/scripts/diff-touches-shipped-paths.cjs +147 -0
- package/scripts/fix-slash-commands.cjs +147 -0
- package/scripts/gen-inventory-manifest.cjs +109 -0
- package/scripts/generate-package-identity.cjs +104 -0
- package/scripts/lint-command-contract.cjs +108 -0
- package/scripts/lint-descriptions.cjs +83 -0
- package/scripts/lint-docs-required.cjs +222 -0
- package/scripts/lint-no-source-grep-extras.cjs +81 -0
- package/scripts/lint-no-source-grep.cjs +174 -0
- package/scripts/lint-package-identity-drift.cjs +141 -0
- package/scripts/lint-pr-check-project-dir.cjs +98 -0
- package/scripts/lint-shared-module-handsync.cjs +388 -0
- package/scripts/lint-shell-command-projection-drift.cjs +57 -0
- package/scripts/lint-skill-deps.cjs +180 -0
- package/scripts/lint-test-file-count.allowlist.json +36 -0
- package/scripts/lint-test-file-count.cjs +190 -0
- package/scripts/pr-template-policy.cjs +268 -0
- package/scripts/prompt-injection-scan.sh +203 -0
- package/scripts/release-tarball-smoke.cjs +627 -0
- package/scripts/run-affected-tests.cjs +6 -0
- package/scripts/run-cross-platform-tests.cjs +63 -0
- package/scripts/run-tests.cjs +282 -0
- package/scripts/secret-scan-lint.sh +231 -0
- package/scripts/secret-scan.sh +358 -0
- package/scripts/setup-branch-protection.sh +236 -0
- package/scripts/shared-module-handsync-allowlist.json +183 -0
- package/scripts/strip-prose-atrefs.cjs +106 -0
- package/scripts/sync-rulesets.sh +34 -0
- package/scripts/sync-runtime-launcher.cjs +402 -0
- package/scripts/test-failure-reasons.cjs +34 -0
- package/scripts/workflow-policy.cjs +450 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* DispatchLogger interface + default implementation — issue #177 (ADR-0174 P1.3).
|
|
5
|
+
*
|
|
6
|
+
* Interface:
|
|
7
|
+
* { onEvent(event: DispatchEvent): void }
|
|
8
|
+
*
|
|
9
|
+
* Default behaviour (createDefaultLogger):
|
|
10
|
+
* 1. Silent on success — no stdout/stderr when result.kind === 'ok'.
|
|
11
|
+
* 2. Structured JSON to stderr on error — one line per dispatch error.
|
|
12
|
+
* 3. Opt-in audit file — when GSD_AUDIT=1 OR config.audit.enabled===true,
|
|
13
|
+
* appends every event (success + error) as one JSON line to
|
|
14
|
+
* .planning/.gsd-trace.jsonl relative to `cwd`. Creates .planning/ if absent.
|
|
15
|
+
* 4. Args redaction — args omitted by default; included when GSD_AUDIT_ARGS=1.
|
|
16
|
+
*
|
|
17
|
+
* No-op logger (createNoOpLogger):
|
|
18
|
+
* Silent on all events. Used as the Hub default when no logger is injected.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
const fs = require('fs');
|
|
22
|
+
const path = require('path');
|
|
23
|
+
|
|
24
|
+
const { redactEvent, shouldIncludeArgs } = require('./redaction.cjs');
|
|
25
|
+
|
|
26
|
+
const AUDIT_FILE_NAME = '.gsd-trace.jsonl';
|
|
27
|
+
const PLANNING_DIR = '.planning';
|
|
28
|
+
|
|
29
|
+
// ─── helpers ─────────────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Safely serialise a value to JSON, falling back to a placeholder on circular refs.
|
|
33
|
+
* @param {unknown} value
|
|
34
|
+
* @returns {string}
|
|
35
|
+
*/
|
|
36
|
+
function _safeStringify(value) {
|
|
37
|
+
try {
|
|
38
|
+
return JSON.stringify(value);
|
|
39
|
+
} catch {
|
|
40
|
+
return JSON.stringify({ _serializationError: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Determine whether the audit file should be written to.
|
|
46
|
+
*
|
|
47
|
+
* @param {{ audit?: { enabled?: boolean } } | undefined} config
|
|
48
|
+
* @returns {boolean}
|
|
49
|
+
*/
|
|
50
|
+
function _isAuditEnabled(config) {
|
|
51
|
+
if (process.env.GSD_AUDIT === '1') return true;
|
|
52
|
+
if (config && config.audit && config.audit.enabled === true) return true;
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Build the redacted plain object for the audit file.
|
|
58
|
+
* Preserves the full DispatchEvent structure.
|
|
59
|
+
*
|
|
60
|
+
* @param {object} event - DispatchEvent
|
|
61
|
+
* @returns {object}
|
|
62
|
+
*/
|
|
63
|
+
function _toAuditRecord(event) {
|
|
64
|
+
return redactEvent(event);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Build the flattened stderr error line.
|
|
69
|
+
*
|
|
70
|
+
* Per ADR-0174 P1.3 contract: { "kind": "<variant>", "traceId": "<uuid>", ...typedPayload }
|
|
71
|
+
* The result's kind is promoted to top-level and the typed payload fields are spread in.
|
|
72
|
+
* The `result` wrapper is removed.
|
|
73
|
+
*
|
|
74
|
+
* @param {object} event - DispatchEvent with an error result
|
|
75
|
+
* @returns {object}
|
|
76
|
+
*/
|
|
77
|
+
function _toStderrRecord(event) {
|
|
78
|
+
const redacted = redactEvent(event);
|
|
79
|
+
const { result, ...eventWithoutResult } = redacted;
|
|
80
|
+
// Flatten: top-level gets kind + typed payload fields from result
|
|
81
|
+
const { kind, ...typedPayload } = result;
|
|
82
|
+
return Object.assign({}, eventWithoutResult, { kind }, typedPayload);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Append one JSON line to the audit file.
|
|
87
|
+
* Creates .planning/ directory if it does not exist.
|
|
88
|
+
*
|
|
89
|
+
* Uses synchronous fs API (crash-safe for v1 — dispatch is synchronous).
|
|
90
|
+
*
|
|
91
|
+
* @param {string} cwd - Project root directory.
|
|
92
|
+
* @param {object} event - Redacted DispatchEvent.
|
|
93
|
+
*/
|
|
94
|
+
function _appendAuditLine(cwd, event) {
|
|
95
|
+
const planningDir = path.join(cwd, PLANNING_DIR);
|
|
96
|
+
// Ensure the directory exists
|
|
97
|
+
if (!fs.existsSync(planningDir)) {
|
|
98
|
+
fs.mkdirSync(planningDir, { recursive: true });
|
|
99
|
+
}
|
|
100
|
+
const auditPath = path.join(planningDir, AUDIT_FILE_NAME);
|
|
101
|
+
fs.appendFileSync(auditPath, _safeStringify(event) + '\n', 'utf8');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ─── Public factories ─────────────────────────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Create a no-op logger. All events are silently dropped.
|
|
108
|
+
* This is the Hub's default when no logger is injected by the caller.
|
|
109
|
+
*
|
|
110
|
+
* @returns {{ onEvent(event: object): void }}
|
|
111
|
+
*/
|
|
112
|
+
function createNoOpLogger() {
|
|
113
|
+
return {
|
|
114
|
+
onEvent(_event) {
|
|
115
|
+
// intentionally empty
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Create the default DispatchLogger.
|
|
122
|
+
*
|
|
123
|
+
* @param {object} [opts]
|
|
124
|
+
* @param {string} [opts.cwd=process.cwd()] - Project root; audit file is written relative to this.
|
|
125
|
+
* @param {object} [opts.config] - GSD config object. config.audit.enabled triggers audit.
|
|
126
|
+
* @returns {{ onEvent(event: object): void }}
|
|
127
|
+
*/
|
|
128
|
+
function createDefaultLogger({ cwd = process.cwd(), config } = {}) {
|
|
129
|
+
return {
|
|
130
|
+
/**
|
|
131
|
+
* @param {object} event - A DispatchEvent from the Hub.
|
|
132
|
+
*/
|
|
133
|
+
onEvent(event) {
|
|
134
|
+
const isOk = event && event.result && event.result.kind === 'ok';
|
|
135
|
+
|
|
136
|
+
// ── Audit file (both ok and error) ────────────────────────────────────
|
|
137
|
+
if (_isAuditEnabled(config)) {
|
|
138
|
+
try {
|
|
139
|
+
const auditRecord = _toAuditRecord(event);
|
|
140
|
+
_appendAuditLine(cwd, auditRecord);
|
|
141
|
+
} catch (auditErr) {
|
|
142
|
+
// Audit errors must not surface to callers
|
|
143
|
+
process.stderr.write(
|
|
144
|
+
_safeStringify({
|
|
145
|
+
level: 'warn',
|
|
146
|
+
source: 'DispatchLogger',
|
|
147
|
+
message: 'audit file write failed: ' + String(auditErr && auditErr.message || auditErr),
|
|
148
|
+
}) + '\n'
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ── Stderr on error ───────────────────────────────────────────────────
|
|
154
|
+
if (!isOk) {
|
|
155
|
+
try {
|
|
156
|
+
const stderrRecord = _toStderrRecord(event);
|
|
157
|
+
process.stderr.write(_safeStringify(stderrRecord) + '\n');
|
|
158
|
+
} catch (stderrErr) {
|
|
159
|
+
// Last-resort: we cannot throw from the logger
|
|
160
|
+
process.stderr.write(
|
|
161
|
+
_safeStringify({
|
|
162
|
+
level: 'warn',
|
|
163
|
+
source: 'DispatchLogger',
|
|
164
|
+
message: 'stderr emit failed: ' + String(stderrErr && stderrErr.message || stderrErr),
|
|
165
|
+
}) + '\n'
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ── Silent on success (no else branch needed) ─────────────────────────
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
module.exports = { createDefaultLogger, createNoOpLogger };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Arg redaction policy — issue #177 (ADR-0174 P1.3).
|
|
5
|
+
*
|
|
6
|
+
* Privacy default: args are OMITTED from every emitted event (both stderr
|
|
7
|
+
* and file audit). Opt-in: set GSD_AUDIT_ARGS=1 to include args verbatim.
|
|
8
|
+
*
|
|
9
|
+
* This module is deliberately simple and has no side effects — redaction
|
|
10
|
+
* decisions are stateless reads of process.env at call time so that tests
|
|
11
|
+
* can toggle the env var without module-level caching issues.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Returns true when the caller has opted in to including args in events.
|
|
16
|
+
* Only GSD_AUDIT_ARGS === '1' enables inclusion; any other value (including
|
|
17
|
+
* empty string, 'true', 'yes') keeps the default of omitting args.
|
|
18
|
+
*
|
|
19
|
+
* @returns {boolean}
|
|
20
|
+
*/
|
|
21
|
+
function shouldIncludeArgs() {
|
|
22
|
+
return process.env.GSD_AUDIT_ARGS === '1';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Return a redacted copy of a DispatchEvent.
|
|
27
|
+
*
|
|
28
|
+
* If args should be omitted (default), strips the `args` field entirely.
|
|
29
|
+
* If args should be included (GSD_AUDIT_ARGS=1), passes the event through
|
|
30
|
+
* unchanged (args were already set by makeDispatchEvent with includeArgs:true,
|
|
31
|
+
* or absent — in which case they stay absent).
|
|
32
|
+
*
|
|
33
|
+
* The original event object is never mutated (it is frozen by makeDispatchEvent).
|
|
34
|
+
*
|
|
35
|
+
* @param {object} event - A DispatchEvent (frozen or plain).
|
|
36
|
+
* @returns {object} A new plain object with the same fields, minus args when redacted.
|
|
37
|
+
*/
|
|
38
|
+
function redactEvent(event) {
|
|
39
|
+
if (shouldIncludeArgs()) {
|
|
40
|
+
// Include path: return a shallow copy with args preserved if present
|
|
41
|
+
const copy = Object.assign({}, event);
|
|
42
|
+
return copy;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Exclude path: build a copy omitting `args`
|
|
46
|
+
const { args: _dropped, ...rest } = event;
|
|
47
|
+
return rest;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
module.exports = { shouldIncludeArgs, redactEvent };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// @generated by scripts/generate-package-identity.cjs from package.json — DO NOT EDIT.
|
|
2
|
+
// Single source for GSD package coordinates (issue #498). Regenerate with:
|
|
3
|
+
// node scripts/generate-package-identity.cjs
|
|
4
|
+
'use strict';
|
|
5
|
+
|
|
6
|
+
const packageName = "@opengsd/gsd-core";
|
|
7
|
+
const binName = "gsd-core";
|
|
8
|
+
const repoSlug = "open-gsd/gsd-core";
|
|
9
|
+
const repoUrl = "https://github.com/open-gsd/gsd-core";
|
|
10
|
+
const changelogRawUrl = "https://raw.githubusercontent.com/open-gsd/gsd-core/main/CHANGELOG.md";
|
|
11
|
+
|
|
12
|
+
function formatManualInstall({ packageName, binName, scope, runtime } = {}) {
|
|
13
|
+
const runtimeFlag = runtime ? ` --${runtime}` : '';
|
|
14
|
+
return `npx -y --package=${packageName}@latest -- ${binName}${runtimeFlag} --${scope}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function manualInstallCommand(opts = {}) {
|
|
18
|
+
return formatManualInstall({ packageName, binName, scope: opts.scope, runtime: opts.runtime });
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
module.exports = Object.freeze({
|
|
22
|
+
packageName,
|
|
23
|
+
// PACKAGE_NAME: back-compat alias for #516-era consumers. Baked here, so it
|
|
24
|
+
// survives the installed tree’s synthetic package.json (fixes the #378 undefined).
|
|
25
|
+
PACKAGE_NAME: packageName,
|
|
26
|
+
binName,
|
|
27
|
+
repoSlug,
|
|
28
|
+
repoUrl,
|
|
29
|
+
changelogRawUrl,
|
|
30
|
+
manualInstallCommand,
|
|
31
|
+
});
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { PHASE_SUBCOMMANDS } = require('./command-aliases.cjs');
|
|
4
|
+
|
|
5
|
+
// ─── CommandRoutingHub (issue #3788, simplified in #175, typed in #176) ───────
|
|
6
|
+
const { createHub, ERROR_KINDS, makeInvalidArgs } = require('./command-routing-hub.cjs');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Manifest-backed phase subcommand router.
|
|
10
|
+
* Keeps gsd-tools.cjs thin while preserving existing command semantics.
|
|
11
|
+
*
|
|
12
|
+
* Unsupported in this router:
|
|
13
|
+
* - scaffold: routed through top-level scaffold command.
|
|
14
|
+
*
|
|
15
|
+
* CJS-only subcommands: mvp-mode (dispatched directly, before hub).
|
|
16
|
+
*
|
|
17
|
+
* #3788: dispatch is mediated by CommandRoutingHub. The public entry point
|
|
18
|
+
* and observable CLI behaviour are unchanged.
|
|
19
|
+
*/
|
|
20
|
+
function routePhaseCommand({ phase, args, cwd, raw, error }) {
|
|
21
|
+
// ── Unsupported subcommands ─────────────────────────────────────────────────
|
|
22
|
+
// Resolved before dispatch so the error message stays deterministic.
|
|
23
|
+
const UNSUPPORTED = {
|
|
24
|
+
scaffold: 'phase scaffold is routed through the top-level scaffold command.',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const subcommand = args[1];
|
|
28
|
+
|
|
29
|
+
if (subcommand && UNSUPPORTED[subcommand]) {
|
|
30
|
+
error(UNSUPPORTED[subcommand]);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// ── No subcommand → reject early with helpful error ────────────────────────
|
|
35
|
+
// Pre-#3788 code resolved unknown subcommands via routeCjsCommandFamily which
|
|
36
|
+
// fell through to error() when no handler matched (including undefined).
|
|
37
|
+
// Post-#3788 the hub's manifest check is skipped for falsy subcommand, so we
|
|
38
|
+
// must guard here to preserve the deterministic "Available: ..." error message.
|
|
39
|
+
if (!subcommand) {
|
|
40
|
+
const available = PHASE_SUBCOMMANDS.filter(s => !UNSUPPORTED[s]).join(', ');
|
|
41
|
+
error(`Unknown phase subcommand. Available: ${available}`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ── CJS-only subcommands (dispatched directly, before hub) ─────────────────
|
|
46
|
+
// `mvp-mode` has a CJS-native implementation in phase.cmdPhaseMvpMode that
|
|
47
|
+
// differs from the SDK query layer (different ROADMAP scan + error codes).
|
|
48
|
+
// Dispatch it early to preserve pre-migration observable behaviour (correct
|
|
49
|
+
// exit code, correct JSON error reason code, correct ROADMAP scan).
|
|
50
|
+
if (subcommand === 'mvp-mode') {
|
|
51
|
+
phase.cmdPhaseMvpMode(cwd, args.slice(2), raw);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ── Build the CJS registry ──────────────────────────────────────────────────
|
|
56
|
+
// Each handler receives a ctx object from the hub and must return a HubResult.
|
|
57
|
+
const cjsRegistry = {
|
|
58
|
+
phase: {
|
|
59
|
+
'next-decimal': (_ctx) => {
|
|
60
|
+
phase.cmdPhaseNextDecimal(cwd, args[2], raw);
|
|
61
|
+
return { ok: true, data: null };
|
|
62
|
+
},
|
|
63
|
+
add: (_ctx) => {
|
|
64
|
+
let customId = null;
|
|
65
|
+
const descArgs = [];
|
|
66
|
+
for (let i = 2; i < args.length; i++) {
|
|
67
|
+
const token = args[i];
|
|
68
|
+
if (token === '--raw') {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (token === '--id') {
|
|
72
|
+
const id = args[i + 1];
|
|
73
|
+
if (!id || id.startsWith('--')) {
|
|
74
|
+
return makeInvalidArgs('--id', '--id requires a value');
|
|
75
|
+
}
|
|
76
|
+
customId = id;
|
|
77
|
+
i++;
|
|
78
|
+
} else if (token.startsWith('--')) {
|
|
79
|
+
return makeInvalidArgs(token, `phase add does not support ${token}`);
|
|
80
|
+
} else {
|
|
81
|
+
descArgs.push(token);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
phase.cmdPhaseAdd(cwd, descArgs.join(' '), raw, customId);
|
|
85
|
+
return { ok: true, data: null };
|
|
86
|
+
},
|
|
87
|
+
'add-batch': (_ctx) => {
|
|
88
|
+
const descFlagIdx = args.indexOf('--descriptions');
|
|
89
|
+
let descriptions;
|
|
90
|
+
if (descFlagIdx !== -1) {
|
|
91
|
+
const rawDescriptions = args[descFlagIdx + 1];
|
|
92
|
+
if (!rawDescriptions || rawDescriptions.startsWith('--')) {
|
|
93
|
+
return makeInvalidArgs('--descriptions', '--descriptions must be a JSON array');
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
descriptions = JSON.parse(rawDescriptions);
|
|
97
|
+
} catch {
|
|
98
|
+
return makeInvalidArgs('--descriptions', '--descriptions must be a JSON array');
|
|
99
|
+
}
|
|
100
|
+
if (!Array.isArray(descriptions)) {
|
|
101
|
+
return makeInvalidArgs('--descriptions', '--descriptions must be a JSON array');
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
descriptions = args.slice(2).filter(a => a !== '--raw');
|
|
105
|
+
}
|
|
106
|
+
phase.cmdPhaseAddBatch(cwd, descriptions, raw);
|
|
107
|
+
return { ok: true, data: null };
|
|
108
|
+
},
|
|
109
|
+
insert: (_ctx) => {
|
|
110
|
+
if (args.includes('--dry-run')) {
|
|
111
|
+
return makeInvalidArgs('--dry-run', 'phase insert does not support --dry-run');
|
|
112
|
+
}
|
|
113
|
+
phase.cmdPhaseInsert(cwd, args[2], args.slice(3).join(' '), raw);
|
|
114
|
+
return { ok: true, data: null };
|
|
115
|
+
},
|
|
116
|
+
remove: (_ctx) => {
|
|
117
|
+
const removeArgs = args.slice(2).filter(token => token !== '--raw');
|
|
118
|
+
let forceFlag = false;
|
|
119
|
+
const positional = [];
|
|
120
|
+
for (const token of removeArgs) {
|
|
121
|
+
if (token === '--force') {
|
|
122
|
+
forceFlag = true;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (token.startsWith('--')) {
|
|
126
|
+
return makeInvalidArgs(token, `phase remove does not support ${token}`);
|
|
127
|
+
}
|
|
128
|
+
positional.push(token);
|
|
129
|
+
}
|
|
130
|
+
if (positional.length !== 1) {
|
|
131
|
+
return makeInvalidArgs('<phase-number>', 'phase remove accepts exactly one phase number');
|
|
132
|
+
}
|
|
133
|
+
phase.cmdPhaseRemove(cwd, positional[0], { force: forceFlag }, raw);
|
|
134
|
+
return { ok: true, data: null };
|
|
135
|
+
},
|
|
136
|
+
complete: (_ctx) => {
|
|
137
|
+
phase.cmdPhaseComplete(cwd, args[2], raw);
|
|
138
|
+
return { ok: true, data: null };
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// ── Build manifest (available subcommands for UnknownCommand detection) ─────
|
|
144
|
+
// `availableSubcommands` is what the error message shows. It excludes
|
|
145
|
+
// unsupported commands (already handled above) but does NOT include 'mvp-mode'
|
|
146
|
+
// because it was absent from PHASE_SUBCOMMANDS in the original and was not
|
|
147
|
+
// shown in the "Available:" list there either.
|
|
148
|
+
//
|
|
149
|
+
// `manifestSubcommands` is the full routing set for the hub — it includes
|
|
150
|
+
// 'mvp-mode' (which the original code routed via a handler even without a
|
|
151
|
+
// manifest entry) so the hub's UnknownCommand check passes for it.
|
|
152
|
+
const availableSubcommands = PHASE_SUBCOMMANDS.filter(s => !UNSUPPORTED[s]);
|
|
153
|
+
const manifestSubcommands = ['mvp-mode', ...availableSubcommands];
|
|
154
|
+
const manifest = { phase: manifestSubcommands };
|
|
155
|
+
|
|
156
|
+
// ── Construct hub ──────────────────────────────────────────────────────────
|
|
157
|
+
// #175: Hub is CJS-only — no mode param, no sdkLoader.
|
|
158
|
+
const hub = createHub({ cjsRegistry, manifest });
|
|
159
|
+
|
|
160
|
+
// ── Dispatch ────────────────────────────────────────────────────────────────
|
|
161
|
+
const result = hub.dispatch({
|
|
162
|
+
family: 'phase',
|
|
163
|
+
subcommand,
|
|
164
|
+
args: args.slice(2),
|
|
165
|
+
cwd,
|
|
166
|
+
raw,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// ── Translate result → CLI output / error (adapter responsibility) ──────────
|
|
170
|
+
// CJS handlers call output() themselves (inside phase.cmdPhase*()).
|
|
171
|
+
// No further output call is needed here.
|
|
172
|
+
if (!result.ok) {
|
|
173
|
+
if (result.kind === ERROR_KINDS.UnknownCommand) {
|
|
174
|
+
const available = availableSubcommands.join(', ');
|
|
175
|
+
error(`Unknown phase subcommand. Available: ${available}`);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (result.kind === ERROR_KINDS.InvalidArgs || result.kind === ERROR_KINDS.HandlerRefusal) {
|
|
179
|
+
// #176: typed payload — reason holds the human-readable message
|
|
180
|
+
error(result.reason);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// HandlerFailure: message field
|
|
184
|
+
error(result.message);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
module.exports = {
|
|
190
|
+
routePhaseCommand,
|
|
191
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Phase Lifecycle Pure Helpers — pure-computation functions extracted from
|
|
5
|
+
* the phase-lifecycle SDK handler.
|
|
6
|
+
*
|
|
7
|
+
* I/O adapter pattern (ADR-3524 Section 4): each side supplies its own I/O
|
|
8
|
+
* (sync readFileSync for CJS, async readFile for SDK); the pure computation
|
|
9
|
+
* logic is shared via this generated artifact.
|
|
10
|
+
*
|
|
11
|
+
* Scope:
|
|
12
|
+
* - deriveProgressFromRoadmap(roadmapContent): count Complete rows => idempotent
|
|
13
|
+
* - clampPercent(completed, total): percent with 100 ceiling
|
|
14
|
+
*
|
|
15
|
+
* These two functions are the root-cause fix for issue #4.
|
|
16
|
+
*
|
|
17
|
+
* References:
|
|
18
|
+
* - ADR-3524 (docs/adr/3524-cjs-sdk-hard-seam.md)
|
|
19
|
+
* - Issue #4 (open-gsd/gsd-core)
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Derive completed_phases, total_phases, and total_plans from ROADMAP content.
|
|
24
|
+
* Root cause fix for issue #4 — see gen-phase-lifecycle.mjs for full documentation.
|
|
25
|
+
*/
|
|
26
|
+
function deriveProgressFromRoadmap(roadmapContent) {
|
|
27
|
+
let completedPhases = null;
|
|
28
|
+
let totalPhases = null;
|
|
29
|
+
let totalPlans = null;
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
// Count Complete rows in the progress table (Status column = "Complete").
|
|
33
|
+
// Pattern: row where the phase cell starts with a digit (data row, not header),
|
|
34
|
+
// followed by any cell content, then a "Complete" status cell.
|
|
35
|
+
// Handles both short form ("| 4. |") and long form ("| 01. Foundation |").
|
|
36
|
+
// See phase-lifecycle.ts ~line 1655 for the original SDK pattern.
|
|
37
|
+
const tableCompletePattern = /\|\s*\d+[^|]*\|\s*[^|]*\|\s*Complete\s*\|/gi;
|
|
38
|
+
const completeMatches = roadmapContent.match(tableCompletePattern);
|
|
39
|
+
completedPhases = completeMatches ? completeMatches.length : null;
|
|
40
|
+
|
|
41
|
+
// Count total phase rows in the progress table.
|
|
42
|
+
// Identify the table by looking for Phase|...|Status|...|Completed header.
|
|
43
|
+
const progressTableMatch = roadmapContent.match(
|
|
44
|
+
/\|\s*Phase\s*\|[^|]*\|[^|]*Status[^|]*\|[^|]*Completed[^|]*\|[\s\S]*?(?=\n\n|\n##|$)/i,
|
|
45
|
+
);
|
|
46
|
+
if (progressTableMatch) {
|
|
47
|
+
const tableText = progressTableMatch[0];
|
|
48
|
+
// Count data rows (rows starting with pipe then a phase number)
|
|
49
|
+
const dataRowPattern = /^\|\s*\d+/gm;
|
|
50
|
+
const dataRows = tableText.match(dataRowPattern);
|
|
51
|
+
totalPhases = dataRows ? dataRows.length : null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Sum plan counts from M/N columns in progress table
|
|
55
|
+
let totalPlansSum = 0;
|
|
56
|
+
const planCellPattern = /\|\s*\d+[^|]*\|\s*(\d+)\/(\d+)\s*\|/gi;
|
|
57
|
+
let pm;
|
|
58
|
+
// eslint-disable-next-line no-cond-assign
|
|
59
|
+
while ((pm = planCellPattern.exec(roadmapContent)) !== null) {
|
|
60
|
+
totalPlansSum += parseInt(pm[2], 10);
|
|
61
|
+
}
|
|
62
|
+
if (totalPlansSum > 0) totalPlans = totalPlansSum;
|
|
63
|
+
} catch { /* intentionally empty — fall through to existing values */ }
|
|
64
|
+
|
|
65
|
+
return { completedPhases, totalPhases, totalPlans };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Compute progress percent clamped to 100.
|
|
70
|
+
* Root cause fix for issue #4 — see gen-phase-lifecycle.mjs for full documentation.
|
|
71
|
+
*/
|
|
72
|
+
function clampPercent(completed, total) {
|
|
73
|
+
if (!total || total <= 0) return 0;
|
|
74
|
+
return Math.min(100, Math.round((completed / total) * 100));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
module.exports = {
|
|
78
|
+
deriveProgressFromRoadmap,
|
|
79
|
+
clampPercent,
|
|
80
|
+
};
|