@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,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { PHASES_SUBCOMMANDS } = require('./command-aliases.cjs');
|
|
4
|
+
const { routeCjsCommandFamily } = require('./cjs-command-router-adapter.cjs');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Manifest-backed phases subcommand router.
|
|
8
|
+
* Keeps gsd-tools.cjs thin while preserving current CJS semantics.
|
|
9
|
+
*
|
|
10
|
+
* Unsupported in this router (treated as unknown):
|
|
11
|
+
* - archive: `phases archive` is excluded from the subcommands list so it
|
|
12
|
+
* falls through to the unknown-subcommand error path.
|
|
13
|
+
*/
|
|
14
|
+
function routePhasesCommand({ phase, milestone, args, cwd, raw, error }) {
|
|
15
|
+
routeCjsCommandFamily({
|
|
16
|
+
args,
|
|
17
|
+
// Exclude 'archive' so it hits the unknownMessage path.
|
|
18
|
+
subcommands: PHASES_SUBCOMMANDS.filter((s) => s !== 'archive'),
|
|
19
|
+
error,
|
|
20
|
+
unknownMessage: (_subcommand, available) => `Unknown phases subcommand. Available: ${available.join(', ')}`,
|
|
21
|
+
handlers: {
|
|
22
|
+
list: () => {
|
|
23
|
+
const typeIndex = args.indexOf('--type');
|
|
24
|
+
const phaseIndex = args.indexOf('--phase');
|
|
25
|
+
const options = {
|
|
26
|
+
type: typeIndex !== -1 ? args[typeIndex + 1] : null,
|
|
27
|
+
phase: phaseIndex !== -1 ? args[phaseIndex + 1] : null,
|
|
28
|
+
includeArchived: args.includes('--include-archived'),
|
|
29
|
+
};
|
|
30
|
+
phase.cmdPhasesList(cwd, options, raw);
|
|
31
|
+
},
|
|
32
|
+
clear: () => milestone.cmdPhasesClear(cwd, raw, args.slice(2)),
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
module.exports = {
|
|
38
|
+
routePhasesCommand,
|
|
39
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Plan Scan Module — detects plan and summary files in a phase directory.
|
|
5
|
+
* Supports both flat (pre-#3139) and nested (post-#3139) layouts.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { existsSync, readdirSync } = require('node:fs');
|
|
9
|
+
const { join } = require('node:path');
|
|
10
|
+
|
|
11
|
+
// Excluded derivative files
|
|
12
|
+
const PLAN_OUTLINE_RE = /-OUTLINE\.md$/i;
|
|
13
|
+
const PLAN_PRE_BOUNCE_RE = /\.pre-bounce\.md$/i;
|
|
14
|
+
|
|
15
|
+
function isRootPlanFile(fileName) {
|
|
16
|
+
if (PLAN_OUTLINE_RE.test(fileName))
|
|
17
|
+
return false;
|
|
18
|
+
if (PLAN_PRE_BOUNCE_RE.test(fileName))
|
|
19
|
+
return false;
|
|
20
|
+
if (fileName.endsWith('-PLAN.md') || fileName === 'PLAN.md')
|
|
21
|
+
return true;
|
|
22
|
+
// A summary is never a plan. Reject summaries before the loose /PLAN/i
|
|
23
|
+
// fallback so legacy `<N>-PLAN-<NN>-SUMMARY.md` names (which contain the
|
|
24
|
+
// substring "PLAN") are not double-counted as plans. (#500 RC2)
|
|
25
|
+
if (isRootSummaryFile(fileName))
|
|
26
|
+
return false;
|
|
27
|
+
return /\.md$/i.test(fileName) && /PLAN/i.test(fileName);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function isNestedPlanFile(fileName) {
|
|
31
|
+
if (PLAN_OUTLINE_RE.test(fileName))
|
|
32
|
+
return false;
|
|
33
|
+
if (PLAN_PRE_BOUNCE_RE.test(fileName))
|
|
34
|
+
return false;
|
|
35
|
+
return /^PLAN-\d+.*\.md$/i.test(fileName) || /-PLAN-\d+.*\.md$/i.test(fileName);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function isRootSummaryFile(fileName) {
|
|
39
|
+
return fileName.endsWith('-SUMMARY.md') || fileName === 'SUMMARY.md';
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function isNestedSummaryFile(fileName) {
|
|
43
|
+
return /^SUMMARY-\d+.*\.md$/i.test(fileName) || /-SUMMARY-\d+.*\.md$/i.test(fileName);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function scanPhasePlans(phaseDir) {
|
|
47
|
+
let rootFiles;
|
|
48
|
+
try {
|
|
49
|
+
rootFiles = readdirSync(phaseDir);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return {
|
|
53
|
+
planCount: 0,
|
|
54
|
+
summaryCount: 0,
|
|
55
|
+
completed: false,
|
|
56
|
+
hasNestedPlans: false,
|
|
57
|
+
planFiles: [],
|
|
58
|
+
summaryFiles: [],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const rootPlanFiles = rootFiles.filter(isRootPlanFile);
|
|
62
|
+
const rootSummaryFiles = rootFiles.filter(isRootSummaryFile);
|
|
63
|
+
let nestedPlanFiles = [];
|
|
64
|
+
let nestedSummaryFiles = [];
|
|
65
|
+
let hasNestedPlans = false;
|
|
66
|
+
const nestedDir = join(phaseDir, 'plans');
|
|
67
|
+
if (existsSync(nestedDir)) {
|
|
68
|
+
try {
|
|
69
|
+
const nestedFiles = readdirSync(nestedDir);
|
|
70
|
+
nestedPlanFiles = nestedFiles.filter(isNestedPlanFile);
|
|
71
|
+
nestedSummaryFiles = nestedFiles.filter(isNestedSummaryFile);
|
|
72
|
+
hasNestedPlans = nestedPlanFiles.length > 0;
|
|
73
|
+
}
|
|
74
|
+
catch { /* ignore unreadable nested layout */ }
|
|
75
|
+
}
|
|
76
|
+
const planFiles = rootPlanFiles.concat(nestedPlanFiles);
|
|
77
|
+
const summaryFiles = rootSummaryFiles.concat(nestedSummaryFiles);
|
|
78
|
+
const planCount = planFiles.length;
|
|
79
|
+
const summaryCount = summaryFiles.length;
|
|
80
|
+
return {
|
|
81
|
+
planCount,
|
|
82
|
+
summaryCount,
|
|
83
|
+
completed: planCount > 0 && summaryCount >= planCount,
|
|
84
|
+
hasNestedPlans,
|
|
85
|
+
planFiles,
|
|
86
|
+
summaryFiles,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// CJS callers do: const scanPhasePlans = require('./plan-scan.cjs')
|
|
91
|
+
// and also destructure named exports — support both call styles.
|
|
92
|
+
module.exports = scanPhasePlans;
|
|
93
|
+
module.exports.scanPhasePlans = scanPhasePlans;
|
|
94
|
+
module.exports.isRootPlanFile = isRootPlanFile;
|
|
95
|
+
module.exports.isNestedPlanFile = isNestedPlanFile;
|
|
96
|
+
module.exports.isRootSummaryFile = isRootSummaryFile;
|
|
97
|
+
module.exports.isNestedSummaryFile = isNestedSummaryFile;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning Workspace — .planning path resolution + active workstream routing.
|
|
3
|
+
*
|
|
4
|
+
* This module owns the planning workspace seam:
|
|
5
|
+
* - planningDir/planningRoot/planningPaths
|
|
6
|
+
* - planning lock semantics
|
|
7
|
+
*
|
|
8
|
+
* Active workstream pointer policy/session identity lives in
|
|
9
|
+
* active-workstream-store.cjs and is consumed here via thin adapters.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const { platformEnsureDir } = require('./shell-command-projection.cjs');
|
|
15
|
+
const { realClock } = require('./clock.cjs');
|
|
16
|
+
const {
|
|
17
|
+
createSharedPointerAdapter,
|
|
18
|
+
createSessionScopedPointerAdapter,
|
|
19
|
+
createMemoryPointerAdapter,
|
|
20
|
+
getActiveWorkstream: getStoredActiveWorkstream,
|
|
21
|
+
setActiveWorkstream: setStoredActiveWorkstream,
|
|
22
|
+
clearActiveWorkstream: clearStoredActiveWorkstream,
|
|
23
|
+
} = require('./active-workstream-store.cjs');
|
|
24
|
+
|
|
25
|
+
// Track .planning/.lock files held by this process so they can be removed on exit.
|
|
26
|
+
const _heldPlanningLocks = new Set();
|
|
27
|
+
process.on('exit', () => {
|
|
28
|
+
for (const lockPath of _heldPlanningLocks) {
|
|
29
|
+
try { fs.unlinkSync(lockPath); } catch { /* already gone */ }
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Transient errno codes that indicate a temporary filesystem condition under
|
|
34
|
+
// concurrent O_EXCL races — Docker overlay-fs (ENOENT/EINVAL/EIO), NFS
|
|
35
|
+
// (ESTALE), and OS-level interrupt/retry signals (EAGAIN/EINTR). These are
|
|
36
|
+
// recoverable; withPlanningLock retries instead of propagating them.
|
|
37
|
+
// Truly fatal codes (EMFILE, ENOSPC, EROFS, EACCES) are NOT in this set and
|
|
38
|
+
// will still throw immediately.
|
|
39
|
+
const PLANNING_LOCK_RETRY_ERRNOS = new Set([
|
|
40
|
+
'EPERM', // Windows / macOS AV scanner holds the file open during delete
|
|
41
|
+
'EBUSY', // Windows: file in use by another process
|
|
42
|
+
'EAGAIN', // POSIX: resource temporarily unavailable
|
|
43
|
+
'EINTR', // POSIX: syscall interrupted by signal
|
|
44
|
+
'EINVAL', // Docker overlay-fs: transient during concurrent O_EXCL creation
|
|
45
|
+
'EIO', // Docker overlay-fs / NFS: transient I/O error
|
|
46
|
+
'ENOENT', // Docker overlay-fs: parent dir transiently missing during race
|
|
47
|
+
'ESTALE', // NFS: stale file handle (self-resolves on retry)
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
function planningDir(cwd, ws, project) {
|
|
51
|
+
if (project === undefined) project = process.env.GSD_PROJECT || null;
|
|
52
|
+
if (ws === undefined) ws = process.env.GSD_WORKSTREAM || null;
|
|
53
|
+
|
|
54
|
+
// Reject path separators and traversal components in project/workstream names
|
|
55
|
+
const BAD_SEGMENT = /[/\\]|\.\./;
|
|
56
|
+
if (project && BAD_SEGMENT.test(project)) {
|
|
57
|
+
throw new Error(`GSD_PROJECT contains invalid path characters: ${project}`);
|
|
58
|
+
}
|
|
59
|
+
if (ws && BAD_SEGMENT.test(ws)) {
|
|
60
|
+
throw new Error(`GSD_WORKSTREAM contains invalid path characters: ${ws}`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let base = path.join(cwd, '.planning');
|
|
64
|
+
if (project) base = path.join(base, project);
|
|
65
|
+
if (ws) base = path.join(base, 'workstreams', ws);
|
|
66
|
+
return base;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function planningRoot(cwd) {
|
|
70
|
+
return path.join(cwd, '.planning');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function planningPaths(cwd, ws) {
|
|
74
|
+
const base = planningDir(cwd, ws);
|
|
75
|
+
return {
|
|
76
|
+
planning: base,
|
|
77
|
+
state: path.join(base, 'STATE.md'),
|
|
78
|
+
roadmap: path.join(base, 'ROADMAP.md'),
|
|
79
|
+
project: path.join(base, 'PROJECT.md'),
|
|
80
|
+
config: path.join(base, 'config.json'),
|
|
81
|
+
phases: path.join(base, 'phases'),
|
|
82
|
+
requirements: path.join(base, 'REQUIREMENTS.md'),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @param {string} cwd
|
|
88
|
+
* @param {function} fn - callback to run while holding the lock
|
|
89
|
+
* @param {{ now(): number, sleep(ms: number): void }} [clock]
|
|
90
|
+
* Optional clock seam for testing. Defaults to realClock (Date.now + Atomics.wait).
|
|
91
|
+
* Pass a fake clock from tests/helpers/clock.cjs to drive timeout/stale logic
|
|
92
|
+
* without real wall-clock waits.
|
|
93
|
+
*/
|
|
94
|
+
function withPlanningLock(cwd, fn, clock) {
|
|
95
|
+
if (clock === undefined) clock = realClock;
|
|
96
|
+
const lockPath = path.join(planningDir(cwd), '.lock');
|
|
97
|
+
const lockTimeout = 10000; // 10 seconds
|
|
98
|
+
const start = clock.now();
|
|
99
|
+
|
|
100
|
+
// Ensure .planning/ exists
|
|
101
|
+
try { platformEnsureDir(planningDir(cwd)); } catch { /* ok */ }
|
|
102
|
+
|
|
103
|
+
function acquireLock() {
|
|
104
|
+
// Atomic create — fails if file exists
|
|
105
|
+
fs.writeFileSync(lockPath, JSON.stringify({
|
|
106
|
+
pid: process.pid,
|
|
107
|
+
cwd,
|
|
108
|
+
acquired: new Date().toISOString(),
|
|
109
|
+
}), { flag: 'wx' });
|
|
110
|
+
|
|
111
|
+
_heldPlanningLocks.add(lockPath);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function runWithHeldLock() {
|
|
115
|
+
try {
|
|
116
|
+
return fn();
|
|
117
|
+
} finally {
|
|
118
|
+
_heldPlanningLocks.delete(lockPath);
|
|
119
|
+
try { fs.unlinkSync(lockPath); } catch { /* already released */ }
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
while (clock.now() - start < lockTimeout) {
|
|
124
|
+
let lockWasAcquired = false;
|
|
125
|
+
try {
|
|
126
|
+
acquireLock();
|
|
127
|
+
lockWasAcquired = true;
|
|
128
|
+
return runWithHeldLock();
|
|
129
|
+
} catch (err) {
|
|
130
|
+
// Transient filesystem errors (Docker overlay-fs, NFS, OS signals, AV scanners)
|
|
131
|
+
// are recoverable — wait and retry rather than propagating.
|
|
132
|
+
// See PLANNING_LOCK_RETRY_ERRNOS for the full list and rationale.
|
|
133
|
+
if (lockWasAcquired) throw err;
|
|
134
|
+
if (PLANNING_LOCK_RETRY_ERRNOS.has(err.code)) {
|
|
135
|
+
clock.sleep(100);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (err.code === 'EEXIST') {
|
|
139
|
+
// Lock exists — check if stale (>30s old)
|
|
140
|
+
try {
|
|
141
|
+
const stat = fs.statSync(lockPath);
|
|
142
|
+
if (clock.now() - stat.mtimeMs > 30000) {
|
|
143
|
+
fs.unlinkSync(lockPath);
|
|
144
|
+
continue; // retry
|
|
145
|
+
}
|
|
146
|
+
} catch { continue; }
|
|
147
|
+
|
|
148
|
+
// Wait and retry (cross-platform, no shell dependency)
|
|
149
|
+
clock.sleep(100);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Timeout — stale-lock recovery, then re-acquire atomically before entering critical section.
|
|
157
|
+
try { fs.unlinkSync(lockPath); } catch { /* ok */ }
|
|
158
|
+
acquireLock();
|
|
159
|
+
return runWithHeldLock();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function createPlanningWorkspace(cwd, opts = {}) {
|
|
163
|
+
return {
|
|
164
|
+
paths: {
|
|
165
|
+
dir(ws, project) {
|
|
166
|
+
return planningDir(cwd, ws, project);
|
|
167
|
+
},
|
|
168
|
+
root() {
|
|
169
|
+
return planningRoot(cwd);
|
|
170
|
+
},
|
|
171
|
+
all(ws) {
|
|
172
|
+
return planningPaths(cwd, ws);
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
activeWorkstream: {
|
|
176
|
+
get() {
|
|
177
|
+
return getStoredActiveWorkstream(cwd, opts);
|
|
178
|
+
},
|
|
179
|
+
set(name) {
|
|
180
|
+
setStoredActiveWorkstream(cwd, name, opts);
|
|
181
|
+
},
|
|
182
|
+
clear() {
|
|
183
|
+
clearStoredActiveWorkstream(cwd, opts);
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function getActiveWorkstream(cwd) {
|
|
190
|
+
return getStoredActiveWorkstream(cwd);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function setActiveWorkstream(cwd, name) {
|
|
194
|
+
setStoredActiveWorkstream(cwd, name);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Locate the CONTEXT.md file in a phase directory, handling both the bare
|
|
199
|
+
* form (`CONTEXT.md`) and the padded-prefix convention (`NN-CONTEXT.md`,
|
|
200
|
+
* `NN.N-CONTEXT.md`, etc.) used by gsd-discuss-phase output.
|
|
201
|
+
*
|
|
202
|
+
* Returns the filename (not the full path) of the first match, or null if
|
|
203
|
+
* no CONTEXT.md exists in the directory.
|
|
204
|
+
*
|
|
205
|
+
* Canonical dual-form predicate extracted here to eliminate the 5-site
|
|
206
|
+
* duplication that previously existed across init.cjs, roadmap.cjs,
|
|
207
|
+
* core.cjs, gap-checker.cjs (#3739).
|
|
208
|
+
*
|
|
209
|
+
* @param {string|string[]} absDirOrFiles - Absolute path to the phase directory,
|
|
210
|
+
* OR an already-read files array (avoids a redundant readdirSync at call sites
|
|
211
|
+
* that already hold a directory listing).
|
|
212
|
+
* @returns {string|null}
|
|
213
|
+
*/
|
|
214
|
+
function findContextMdIn(absDirOrFiles) {
|
|
215
|
+
try {
|
|
216
|
+
const files = Array.isArray(absDirOrFiles)
|
|
217
|
+
? absDirOrFiles
|
|
218
|
+
: fs.readdirSync(absDirOrFiles);
|
|
219
|
+
if (files.includes('CONTEXT.md')) return 'CONTEXT.md';
|
|
220
|
+
return files.find(f => f.endsWith('-CONTEXT.md')) ?? null;
|
|
221
|
+
} catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
module.exports = {
|
|
227
|
+
createPlanningWorkspace,
|
|
228
|
+
createSharedPointerAdapter,
|
|
229
|
+
createSessionScopedPointerAdapter,
|
|
230
|
+
createMemoryPointerAdapter,
|
|
231
|
+
planningDir,
|
|
232
|
+
planningRoot,
|
|
233
|
+
planningPaths,
|
|
234
|
+
withPlanningLock,
|
|
235
|
+
getActiveWorkstream,
|
|
236
|
+
setActiveWorkstream,
|
|
237
|
+
findContextMdIn,
|
|
238
|
+
};
|