@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,252 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { STATE_SUBCOMMANDS } = require('./command-aliases.cjs');
|
|
4
|
+
const { routeHubCommandFamily, cjsFallbackHandler } = require('./cjs-command-router-adapter.cjs');
|
|
5
|
+
const { parseNamedArgs } = require('./command-arg-projection.cjs');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Manifest-backed state subcommand router.
|
|
9
|
+
* Keeps gsd-tools.cjs thin while preserving existing command semantics.
|
|
10
|
+
*
|
|
11
|
+
* Phase 5.1: handlers that have SDK equivalents are dispatched via
|
|
12
|
+
* executeForCjs (the sync bridge). CJS fallback is retained for:
|
|
13
|
+
* - complete-phase: no SDK counterpart.
|
|
14
|
+
* - Any command when GSD_WORKSTREAM is active (GSDTransport forces subprocess
|
|
15
|
+
* for workstream requests; subprocess is disabled in the sync bridge worker).
|
|
16
|
+
* - Any command when the SDK is not available (build not present).
|
|
17
|
+
*/
|
|
18
|
+
function routeStateCommand({ state, args, cwd, raw, error }) {
|
|
19
|
+
const parsePlans = (plans) => {
|
|
20
|
+
const parsedPlans = plans == null ? null : Number.parseInt(plans, 10);
|
|
21
|
+
if (plans != null && Number.isNaN(parsedPlans)) {
|
|
22
|
+
error('Invalid --plans value. Expected an integer.');
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return parsedPlans;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
routeHubCommandFamily({
|
|
29
|
+
family: 'state',
|
|
30
|
+
args,
|
|
31
|
+
subcommands: ['load', 'complete-phase', ...STATE_SUBCOMMANDS.filter((s) => s !== 'load')],
|
|
32
|
+
defaultSubcommand: 'load',
|
|
33
|
+
unsupported: {
|
|
34
|
+
'add-roadmap-evolution': 'state add-roadmap-evolution is SDK-only. Use: gsd-tools query state.add-roadmap-evolution ...',
|
|
35
|
+
},
|
|
36
|
+
error,
|
|
37
|
+
cwd,
|
|
38
|
+
raw,
|
|
39
|
+
unknownMessage: (subcommand, available) => `Unknown state subcommand: "${subcommand}". Available: ${available.join(', ')}`,
|
|
40
|
+
handlers: {
|
|
41
|
+
load: cjsFallbackHandler(
|
|
42
|
+
'state.load',
|
|
43
|
+
[],
|
|
44
|
+
args.slice(1),
|
|
45
|
+
null,
|
|
46
|
+
() => state.cmdStateLoad(cwd, raw),
|
|
47
|
+
),
|
|
48
|
+
json: cjsFallbackHandler(
|
|
49
|
+
'state.json',
|
|
50
|
+
[],
|
|
51
|
+
args.slice(1),
|
|
52
|
+
null,
|
|
53
|
+
() => state.cmdStateJson(cwd, raw),
|
|
54
|
+
),
|
|
55
|
+
get: cjsFallbackHandler(
|
|
56
|
+
'state.get',
|
|
57
|
+
args.slice(2),
|
|
58
|
+
args.slice(1),
|
|
59
|
+
null,
|
|
60
|
+
() => state.cmdStateGet(cwd, args[2], raw),
|
|
61
|
+
),
|
|
62
|
+
update: cjsFallbackHandler(
|
|
63
|
+
'state.update',
|
|
64
|
+
args.slice(2),
|
|
65
|
+
args.slice(1),
|
|
66
|
+
null,
|
|
67
|
+
() => state.cmdStateUpdate(cwd, args[2], args[3]),
|
|
68
|
+
),
|
|
69
|
+
patch: cjsFallbackHandler(
|
|
70
|
+
'state.patch',
|
|
71
|
+
args.slice(2),
|
|
72
|
+
args.slice(1),
|
|
73
|
+
null,
|
|
74
|
+
() => {
|
|
75
|
+
const patches = {};
|
|
76
|
+
if (args.length === 3 && typeof args[2] === 'string' && args[2].trim().startsWith('{')) {
|
|
77
|
+
let parsed;
|
|
78
|
+
try {
|
|
79
|
+
parsed = JSON.parse(args[2]);
|
|
80
|
+
} catch (err) {
|
|
81
|
+
error(`state patch: invalid JSON object: ${err.message}`);
|
|
82
|
+
}
|
|
83
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
84
|
+
error('state patch: JSON input must be an object of field/value pairs.');
|
|
85
|
+
}
|
|
86
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
87
|
+
if (key && value !== undefined) {
|
|
88
|
+
patches[key] = String(value);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
for (let i = 2; i < args.length; i += 2) {
|
|
93
|
+
const key = args[i].replace(/^--/, '');
|
|
94
|
+
const value = args[i + 1];
|
|
95
|
+
if (key && value !== undefined) {
|
|
96
|
+
patches[key] = value;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
state.cmdStatePatch(cwd, patches, raw);
|
|
101
|
+
},
|
|
102
|
+
),
|
|
103
|
+
'advance-plan': cjsFallbackHandler(
|
|
104
|
+
'state.advance-plan',
|
|
105
|
+
[],
|
|
106
|
+
args.slice(1),
|
|
107
|
+
null,
|
|
108
|
+
() => state.cmdStateAdvancePlan(cwd, raw),
|
|
109
|
+
),
|
|
110
|
+
'record-metric': cjsFallbackHandler(
|
|
111
|
+
'state.record-metric',
|
|
112
|
+
args.slice(2),
|
|
113
|
+
args.slice(1),
|
|
114
|
+
null,
|
|
115
|
+
() => {
|
|
116
|
+
const { phase: p, plan, duration, tasks, files } = parseNamedArgs(args, ['phase', 'plan', 'duration', 'tasks', 'files']);
|
|
117
|
+
state.cmdStateRecordMetric(cwd, { phase: p, plan, duration, tasks, files }, raw);
|
|
118
|
+
},
|
|
119
|
+
),
|
|
120
|
+
'update-progress': cjsFallbackHandler(
|
|
121
|
+
'state.update-progress',
|
|
122
|
+
[],
|
|
123
|
+
args.slice(1),
|
|
124
|
+
null,
|
|
125
|
+
() => state.cmdStateUpdateProgress(cwd, raw),
|
|
126
|
+
),
|
|
127
|
+
'add-decision': cjsFallbackHandler(
|
|
128
|
+
'state.add-decision',
|
|
129
|
+
args.slice(2),
|
|
130
|
+
args.slice(1),
|
|
131
|
+
null,
|
|
132
|
+
() => {
|
|
133
|
+
const { phase: p, summary, 'summary-file': summary_file, rationale, 'rationale-file': rationale_file } = parseNamedArgs(args, ['phase', 'summary', 'summary-file', 'rationale', 'rationale-file']);
|
|
134
|
+
state.cmdStateAddDecision(cwd, { phase: p, summary, summary_file, rationale: rationale || '', rationale_file }, raw);
|
|
135
|
+
},
|
|
136
|
+
),
|
|
137
|
+
'add-blocker': cjsFallbackHandler(
|
|
138
|
+
'state.add-blocker',
|
|
139
|
+
args.slice(2),
|
|
140
|
+
args.slice(1),
|
|
141
|
+
null,
|
|
142
|
+
() => {
|
|
143
|
+
const { text, 'text-file': text_file } = parseNamedArgs(args, ['text', 'text-file']);
|
|
144
|
+
state.cmdStateAddBlocker(cwd, { text, text_file }, raw);
|
|
145
|
+
},
|
|
146
|
+
),
|
|
147
|
+
'resolve-blocker': cjsFallbackHandler(
|
|
148
|
+
'state.resolve-blocker',
|
|
149
|
+
args.slice(2),
|
|
150
|
+
args.slice(1),
|
|
151
|
+
null,
|
|
152
|
+
() => state.cmdStateResolveBlocker(cwd, parseNamedArgs(args, ['text']).text, raw),
|
|
153
|
+
),
|
|
154
|
+
'record-session': cjsFallbackHandler(
|
|
155
|
+
'state.record-session',
|
|
156
|
+
args.slice(2),
|
|
157
|
+
args.slice(1),
|
|
158
|
+
null,
|
|
159
|
+
() => {
|
|
160
|
+
const { 'stopped-at': stopped_at, 'resume-file': resume_file } = parseNamedArgs(args, ['stopped-at', 'resume-file']);
|
|
161
|
+
// Pass resume_file as-is (undefined when --resume-file was not provided) so
|
|
162
|
+
// cmdStateRecordSession can distinguish "caller explicitly passed a value" from
|
|
163
|
+
// "option was not supplied" and apply the template-default-only replacement guard.
|
|
164
|
+
state.cmdStateRecordSession(cwd, { stopped_at, resume_file }, raw);
|
|
165
|
+
},
|
|
166
|
+
),
|
|
167
|
+
'begin-phase': cjsFallbackHandler(
|
|
168
|
+
'state.begin-phase',
|
|
169
|
+
args.slice(2),
|
|
170
|
+
args.slice(1),
|
|
171
|
+
null,
|
|
172
|
+
() => {
|
|
173
|
+
const { phase: p, name, plans } = parseNamedArgs(args, ['phase', 'name', 'plans']);
|
|
174
|
+
state.cmdStateBeginPhase(cwd, p, name, parsePlans(plans), raw);
|
|
175
|
+
},
|
|
176
|
+
),
|
|
177
|
+
'signal-waiting': cjsFallbackHandler(
|
|
178
|
+
'state.signal-waiting',
|
|
179
|
+
args.slice(2),
|
|
180
|
+
args.slice(1),
|
|
181
|
+
null,
|
|
182
|
+
() => {
|
|
183
|
+
const { type, question, options, phase: p } = parseNamedArgs(args, ['type', 'question', 'options', 'phase']);
|
|
184
|
+
state.cmdSignalWaiting(cwd, type, question, options, p, raw);
|
|
185
|
+
},
|
|
186
|
+
),
|
|
187
|
+
'signal-resume': cjsFallbackHandler(
|
|
188
|
+
'state.signal-resume',
|
|
189
|
+
[],
|
|
190
|
+
args.slice(1),
|
|
191
|
+
null,
|
|
192
|
+
() => state.cmdSignalResume(cwd, raw),
|
|
193
|
+
),
|
|
194
|
+
'planned-phase': cjsFallbackHandler(
|
|
195
|
+
'state.planned-phase',
|
|
196
|
+
args.slice(2),
|
|
197
|
+
args.slice(1),
|
|
198
|
+
null,
|
|
199
|
+
() => {
|
|
200
|
+
const { phase: p, plans } = parseNamedArgs(args, ['phase', 'name', 'plans']);
|
|
201
|
+
state.cmdStatePlannedPhase(cwd, p, parsePlans(plans), raw);
|
|
202
|
+
},
|
|
203
|
+
),
|
|
204
|
+
validate: cjsFallbackHandler(
|
|
205
|
+
'state.validate',
|
|
206
|
+
[],
|
|
207
|
+
args.slice(1),
|
|
208
|
+
null,
|
|
209
|
+
() => state.cmdStateValidate(cwd, raw),
|
|
210
|
+
),
|
|
211
|
+
sync: cjsFallbackHandler(
|
|
212
|
+
'state.sync',
|
|
213
|
+
args.slice(2),
|
|
214
|
+
args.slice(1),
|
|
215
|
+
null,
|
|
216
|
+
() => {
|
|
217
|
+
const { verify } = parseNamedArgs(args, [], ['verify']);
|
|
218
|
+
state.cmdStateSync(cwd, { verify }, raw);
|
|
219
|
+
},
|
|
220
|
+
),
|
|
221
|
+
prune: cjsFallbackHandler(
|
|
222
|
+
'state.prune',
|
|
223
|
+
args.slice(2),
|
|
224
|
+
args.slice(1),
|
|
225
|
+
null,
|
|
226
|
+
() => {
|
|
227
|
+
const { 'keep-recent': keepRecent, 'dry-run': dryRun } = parseNamedArgs(args, ['keep-recent'], ['dry-run']);
|
|
228
|
+
state.cmdStatePrune(cwd, { keepRecent: keepRecent || '3', dryRun: !!dryRun }, raw);
|
|
229
|
+
},
|
|
230
|
+
),
|
|
231
|
+
// complete-phase: CJS-only — no SDK counterpart.
|
|
232
|
+
'complete-phase': () => {
|
|
233
|
+
const { phase: p } = parseNamedArgs(args, ['phase']);
|
|
234
|
+
state.cmdStateCompletePhase(cwd, raw, p || args[2]);
|
|
235
|
+
},
|
|
236
|
+
'milestone-switch': cjsFallbackHandler(
|
|
237
|
+
'state.milestone-switch',
|
|
238
|
+
args.slice(2),
|
|
239
|
+
args.slice(1),
|
|
240
|
+
null,
|
|
241
|
+
() => {
|
|
242
|
+
const { milestone, name } = parseNamedArgs(args, ['milestone', 'name']);
|
|
243
|
+
state.cmdStateMilestoneSwitch(cwd, milestone, name, raw);
|
|
244
|
+
},
|
|
245
|
+
),
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
module.exports = {
|
|
251
|
+
routeStateCommand,
|
|
252
|
+
};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* STATE.md Document Module — pure transforms for STATE.md text.
|
|
5
|
+
* This module does not read the filesystem and does not own persistence or locking.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Internal helpers
|
|
9
|
+
function escapeRegex(str) {
|
|
10
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function toFiniteNumber(value) {
|
|
14
|
+
const number = Number(value);
|
|
15
|
+
return Number.isFinite(number) ? number : null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function existingProgressExceedsDerived(existingProgress, derivedProgress, key) {
|
|
19
|
+
const existing = toFiniteNumber(existingProgress[key]);
|
|
20
|
+
const derived = toFiniteNumber(derivedProgress[key]);
|
|
21
|
+
return existing !== null && derived !== null && existing > derived;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function stateExtractField(content, fieldName) {
|
|
25
|
+
const escaped = escapeRegex(fieldName);
|
|
26
|
+
const boldPattern = new RegExp(`\\*\\*${escaped}:\\*\\*[ \\t]*(.+)`, 'i');
|
|
27
|
+
const boldMatch = content.match(boldPattern);
|
|
28
|
+
if (boldMatch)
|
|
29
|
+
return boldMatch[1].trim();
|
|
30
|
+
const plainPattern = new RegExp(`^${escaped}:[ \\t]*(.+)`, 'im');
|
|
31
|
+
const plainMatch = content.match(plainPattern);
|
|
32
|
+
return plainMatch ? plainMatch[1].trim() : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function stateReplaceField(content, fieldName, newValue) {
|
|
36
|
+
const escaped = escapeRegex(fieldName);
|
|
37
|
+
const boldPattern = new RegExp(`(\\*\\*${escaped}:\\*\\*\\s*)(.*)`, 'i');
|
|
38
|
+
if (boldPattern.test(content)) {
|
|
39
|
+
return content.replace(boldPattern, (_match, prefix) => `${prefix}${newValue}`);
|
|
40
|
+
}
|
|
41
|
+
const plainPattern = new RegExp(`(^${escaped}:\\s*)(.*)`, 'im');
|
|
42
|
+
if (plainPattern.test(content)) {
|
|
43
|
+
return content.replace(plainPattern, (_match, prefix) => `${prefix}${newValue}`);
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function stateReplaceFieldWithFallback(content, primary, fallback, value) {
|
|
49
|
+
let result = stateReplaceField(content, primary, value);
|
|
50
|
+
if (result)
|
|
51
|
+
return result;
|
|
52
|
+
if (fallback) {
|
|
53
|
+
result = stateReplaceField(content, fallback, value);
|
|
54
|
+
if (result)
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
return content;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function normalizeStateStatus(status, pausedAt) {
|
|
61
|
+
let normalizedStatus = status || 'unknown';
|
|
62
|
+
const statusLower = (status || '').toLowerCase();
|
|
63
|
+
if (statusLower.includes('paused') || statusLower.includes('stopped') || pausedAt) {
|
|
64
|
+
normalizedStatus = 'paused';
|
|
65
|
+
}
|
|
66
|
+
else if (statusLower.includes('executing') || statusLower.includes('in progress')) {
|
|
67
|
+
normalizedStatus = 'executing';
|
|
68
|
+
}
|
|
69
|
+
else if (statusLower.includes('planning') || statusLower.includes('ready to plan')) {
|
|
70
|
+
normalizedStatus = 'planning';
|
|
71
|
+
}
|
|
72
|
+
else if (statusLower.includes('discussing')) {
|
|
73
|
+
normalizedStatus = 'discussing';
|
|
74
|
+
}
|
|
75
|
+
else if (statusLower.includes('verif')) {
|
|
76
|
+
normalizedStatus = 'verifying';
|
|
77
|
+
}
|
|
78
|
+
else if (statusLower.includes('complete') || statusLower.includes('done')) {
|
|
79
|
+
normalizedStatus = 'completed';
|
|
80
|
+
}
|
|
81
|
+
else if (statusLower.includes('ready to execute')) {
|
|
82
|
+
normalizedStatus = 'executing';
|
|
83
|
+
}
|
|
84
|
+
return normalizedStatus;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function computeProgressPercent(completedPlans, totalPlans, completedPhases, totalPhases) {
|
|
88
|
+
const hasPlanData = totalPlans !== null && totalPlans > 0 && completedPlans !== null;
|
|
89
|
+
const hasPhaseData = totalPhases !== null && totalPhases > 0 && completedPhases !== null;
|
|
90
|
+
if (!hasPlanData && !hasPhaseData)
|
|
91
|
+
return null;
|
|
92
|
+
const planFraction = hasPlanData ? completedPlans / totalPlans : 1;
|
|
93
|
+
const phaseFraction = hasPhaseData ? completedPhases / totalPhases : 1;
|
|
94
|
+
return Math.min(100, Math.round(Math.min(planFraction, phaseFraction) * 100));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function shouldPreserveExistingProgress(existingProgress, derivedProgress) {
|
|
98
|
+
if (!existingProgress || typeof existingProgress !== 'object')
|
|
99
|
+
return false;
|
|
100
|
+
if (!derivedProgress || typeof derivedProgress !== 'object')
|
|
101
|
+
return false;
|
|
102
|
+
const existing = existingProgress;
|
|
103
|
+
const derived = derivedProgress;
|
|
104
|
+
return (existingProgressExceedsDerived(existing, derived, 'total_phases') ||
|
|
105
|
+
existingProgressExceedsDerived(existing, derived, 'completed_phases') ||
|
|
106
|
+
existingProgressExceedsDerived(existing, derived, 'total_plans') ||
|
|
107
|
+
existingProgressExceedsDerived(existing, derived, 'completed_plans'));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function normalizeProgressNumbers(progress) {
|
|
111
|
+
if (!progress || typeof progress !== 'object')
|
|
112
|
+
return progress;
|
|
113
|
+
const normalized = { ...progress };
|
|
114
|
+
for (const key of ['total_phases', 'completed_phases', 'total_plans', 'completed_plans', 'percent']) {
|
|
115
|
+
const number = toFiniteNumber(normalized[key]);
|
|
116
|
+
if (number !== null)
|
|
117
|
+
normalized[key] = number;
|
|
118
|
+
}
|
|
119
|
+
return normalized;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* KNOWN_TEMPLATE_DEFAULTS — per-field table of string values that were written
|
|
124
|
+
* by a GSD handler (not by an executor / human). A value that appears in this
|
|
125
|
+
* list is safe to overwrite on the next handler call. Any other value was
|
|
126
|
+
* authored by the executor and must be preserved (Knuth invariant:
|
|
127
|
+
* handler-owns-transition-between-known-template-defaults).
|
|
128
|
+
*
|
|
129
|
+
* Keys must match the canonical field name as it appears in STATE.md.
|
|
130
|
+
* Comparison is case-insensitive so "None" and "none" both match.
|
|
131
|
+
*
|
|
132
|
+
* For Status, exact strings are supplemented by a pattern list
|
|
133
|
+
* (KNOWN_STATUS_PATTERNS) that matches handler-generated values whose exact
|
|
134
|
+
* text is variable (e.g. "Executing Phase 5").
|
|
135
|
+
*/
|
|
136
|
+
const KNOWN_TEMPLATE_DEFAULTS = {
|
|
137
|
+
'Resume File': ['None'],
|
|
138
|
+
'Status': [
|
|
139
|
+
'Ready to execute',
|
|
140
|
+
'Phase complete — ready for verification',
|
|
141
|
+
'Ready to plan',
|
|
142
|
+
'Defining requirements',
|
|
143
|
+
'Planning complete',
|
|
144
|
+
// Legacy / abbreviated handler values present in older STATE.md files
|
|
145
|
+
'Executing',
|
|
146
|
+
'In progress',
|
|
147
|
+
'Planning',
|
|
148
|
+
'Verifying',
|
|
149
|
+
'Completed',
|
|
150
|
+
'Done',
|
|
151
|
+
'Active',
|
|
152
|
+
'Paused',
|
|
153
|
+
'unknown',
|
|
154
|
+
],
|
|
155
|
+
// Last Activity is a date field; ISO date-only strings (YYYY-MM-DD) are the
|
|
156
|
+
// handler-generated form. We detect them by shape rather than an exhaustive
|
|
157
|
+
// list because the date changes every day.
|
|
158
|
+
// NOTE: entries here are matched by isStateTemplateDefault using the date regex
|
|
159
|
+
// in addition to exact string equality.
|
|
160
|
+
'Last Activity': [],
|
|
161
|
+
'Last activity': [],
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Regex patterns that match handler-generated Status values whose text includes
|
|
166
|
+
* a variable component (e.g. phase number). Checked after the KNOWN_TEMPLATE_DEFAULTS
|
|
167
|
+
* exact-match list in isStateTemplateDefault.
|
|
168
|
+
*/
|
|
169
|
+
const KNOWN_STATUS_PATTERNS = [
|
|
170
|
+
/^Executing Phase\s+\d+/i,
|
|
171
|
+
/^Planning Phase\s+\d+/i,
|
|
172
|
+
/^Phase\s+\d+\s+complete/i,
|
|
173
|
+
/^Verifying Phase\s+\d+/i,
|
|
174
|
+
/^Phase complete/i,
|
|
175
|
+
];
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Returns true when the given value is a known template default for the field,
|
|
179
|
+
* meaning a GSD handler wrote it and a subsequent handler may replace it.
|
|
180
|
+
*
|
|
181
|
+
* A value is considered a template default when:
|
|
182
|
+
* (a) it appears in KNOWN_TEMPLATE_DEFAULTS[field] (exact, case-insensitive), OR
|
|
183
|
+
* (b) it matches the ISO date-only shape (YYYY-MM-DD) for Last Activity fields
|
|
184
|
+
* (handlers always write bare dates; executors write narrative prose).
|
|
185
|
+
*
|
|
186
|
+
* @param {string} field - Canonical field name (case-sensitive key lookup attempted
|
|
187
|
+
* first, then case-insensitive fallback).
|
|
188
|
+
* @param {string} value - The current value extracted from STATE.md.
|
|
189
|
+
* @returns {boolean}
|
|
190
|
+
*/
|
|
191
|
+
function isStateTemplateDefault(field, value) {
|
|
192
|
+
if (value === null || value === undefined) return true; // absent → initial write
|
|
193
|
+
const v = String(value).trim();
|
|
194
|
+
if (v === '') return true; // blank → treat as absent
|
|
195
|
+
|
|
196
|
+
// Look up the defaults list, trying exact key first then case-insensitive.
|
|
197
|
+
let defaults = KNOWN_TEMPLATE_DEFAULTS[field];
|
|
198
|
+
if (!defaults) {
|
|
199
|
+
const fieldLower = field.toLowerCase();
|
|
200
|
+
const matchKey = Object.keys(KNOWN_TEMPLATE_DEFAULTS).find(k => k.toLowerCase() === fieldLower);
|
|
201
|
+
defaults = matchKey ? KNOWN_TEMPLATE_DEFAULTS[matchKey] : null;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (defaults && defaults.some(d => d.toLowerCase() === v.toLowerCase())) {
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const fieldLower = field.toLowerCase();
|
|
209
|
+
|
|
210
|
+
// Status: also check pattern list for variable handler-generated values
|
|
211
|
+
// (e.g. "Executing Phase 5", "Planning Phase 3").
|
|
212
|
+
if (fieldLower === 'status') {
|
|
213
|
+
if (KNOWN_STATUS_PATTERNS.some(p => p.test(v))) return true;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Last Activity / Last activity: bare ISO date (YYYY-MM-DD) is handler-generated.
|
|
217
|
+
if (fieldLower === 'last activity') {
|
|
218
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(v)) return true;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Replaces a field in STATE.md content only when the existing value is a known
|
|
226
|
+
* template default (or the field is absent). If the existing value is
|
|
227
|
+
* executor-authored, the content is returned unchanged.
|
|
228
|
+
*
|
|
229
|
+
* When `newValue` is null or undefined the function is a no-op (returns content).
|
|
230
|
+
*
|
|
231
|
+
* @param {string} content - Full STATE.md text.
|
|
232
|
+
* @param {string} field - Field name as it appears in STATE.md.
|
|
233
|
+
* @param {string[]} knownDefaults - The defaults list to check against (typically
|
|
234
|
+
* KNOWN_TEMPLATE_DEFAULTS[field]).
|
|
235
|
+
* @param {string} newValue - Value to write when replacement is permitted.
|
|
236
|
+
* @returns {string} - Updated content (or original if skipped).
|
|
237
|
+
*/
|
|
238
|
+
function stateReplaceFieldIfTemplate(content, field, knownDefaults, newValue) {
|
|
239
|
+
if (newValue === null || newValue === undefined) return content;
|
|
240
|
+
const existing = stateExtractField(content, field);
|
|
241
|
+
// Build a temporary KNOWN_TEMPLATE_DEFAULTS-compatible lookup so we can reuse
|
|
242
|
+
// the isStateTemplateDefault logic for the provided knownDefaults array.
|
|
243
|
+
const tempField = '__tmp__';
|
|
244
|
+
const tempDefaults = { [tempField]: knownDefaults || [] };
|
|
245
|
+
// Inline check: absent/blank → always write; in list → write; else → skip.
|
|
246
|
+
if (existing === null || existing === undefined || existing.trim() === '') {
|
|
247
|
+
return stateReplaceField(content, field, newValue) || content;
|
|
248
|
+
}
|
|
249
|
+
const v = existing.trim();
|
|
250
|
+
const inList = (knownDefaults || []).some(d => d.toLowerCase() === v.toLowerCase());
|
|
251
|
+
const fieldLower = field.toLowerCase();
|
|
252
|
+
// Special-case: Status pattern list for variable handler-generated values.
|
|
253
|
+
const matchesStatusPattern = (fieldLower === 'status') && KNOWN_STATUS_PATTERNS.some(p => p.test(v));
|
|
254
|
+
// Special-case: Last Activity bare ISO date (YYYY-MM-DD) is handler-generated.
|
|
255
|
+
const isDateShape = (fieldLower === 'last activity') && /^\d{4}-\d{2}-\d{2}$/.test(v);
|
|
256
|
+
if (inList || matchesStatusPattern || isDateShape) {
|
|
257
|
+
return stateReplaceField(content, field, newValue) || content;
|
|
258
|
+
}
|
|
259
|
+
// Executor-authored — preserve.
|
|
260
|
+
return content;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
module.exports = { stateExtractField, stateReplaceField, stateReplaceFieldWithFallback, normalizeStateStatus, computeProgressPercent, shouldPreserveExistingProgress, normalizeProgressNumbers, KNOWN_TEMPLATE_DEFAULTS, KNOWN_STATUS_PATTERNS, isStateTemplateDefault, stateReplaceFieldIfTemplate };
|