@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,57 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# gsd-hook-version: {{GSD_VERSION}}
|
|
3
|
+
# gsd-validate-commit.sh — PreToolUse hook: enforce Conventional Commits format
|
|
4
|
+
# Blocks git commit commands with non-conforming messages (exit 2).
|
|
5
|
+
# Allows conforming messages and all non-commit commands (exit 0).
|
|
6
|
+
# Uses Node.js for JSON parsing (always available in GSD projects, no jq dependency).
|
|
7
|
+
#
|
|
8
|
+
# OPT-IN: This hook is a no-op unless config.json has hooks.community: true.
|
|
9
|
+
# Enable with: "hooks": { "community": true } in .planning/config.json
|
|
10
|
+
|
|
11
|
+
# Check opt-in config — exit silently if not enabled
|
|
12
|
+
if [ -f .planning/config.json ]; then
|
|
13
|
+
ENABLED=$(node -e "try{const c=require('./.planning/config.json');process.stdout.write(c.hooks?.community===true?'1':'0')}catch{process.stdout.write('0')}" 2>/dev/null)
|
|
14
|
+
if [ "$ENABLED" != "1" ]; then exit 0; fi
|
|
15
|
+
else
|
|
16
|
+
exit 0
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
INPUT=$(cat)
|
|
20
|
+
|
|
21
|
+
# Extract command from JSON using Node (handles escaping correctly, no jq needed)
|
|
22
|
+
CMD=$(echo "$INPUT" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{process.stdout.write(JSON.parse(d).tool_input?.command||'')}catch{}})" 2>/dev/null)
|
|
23
|
+
|
|
24
|
+
# Only check git commit commands.
|
|
25
|
+
# Delegates to hooks/lib/git-cmd.js isGitSubcommand() — the canonical token-walk
|
|
26
|
+
# classifier that handles env-prefix, -C path, and full-path git invocations.
|
|
27
|
+
# A naive `^git\s+commit` regex misses all three; this guard fixes that (#3129).
|
|
28
|
+
HOOK_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
29
|
+
if GIT_CMD_LIB="$HOOK_DIR/lib/git-cmd.js" node -e "
|
|
30
|
+
const {isGitSubcommand}=require(process.env.GIT_CMD_LIB);
|
|
31
|
+
process.exit(isGitSubcommand(process.argv[1],'commit')?0:1);
|
|
32
|
+
" "$CMD" 2>/dev/null; then
|
|
33
|
+
# Extract message from -m flag
|
|
34
|
+
MSG=""
|
|
35
|
+
if [[ "$CMD" =~ -m[[:space:]]+\"([^\"]+)\" ]]; then
|
|
36
|
+
MSG="${BASH_REMATCH[1]}"
|
|
37
|
+
elif [[ "$CMD" =~ -m[[:space:]]+\'([^\']+)\' ]]; then
|
|
38
|
+
MSG="${BASH_REMATCH[1]}"
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if [ -n "$MSG" ]; then
|
|
42
|
+
SUBJECT=$(echo "$MSG" | head -1)
|
|
43
|
+
# Validate Conventional Commits format
|
|
44
|
+
if ! [[ "$SUBJECT" =~ ^(feat|fix|docs|style|refactor|perf|test|build|ci|chore)(\(.+\))?:[[:space:]].+ ]]; then
|
|
45
|
+
# Emit a typed `code` field alongside `reason` (#2974). Tests assert
|
|
46
|
+
# on the stable code string; the reason is the human-readable copy.
|
|
47
|
+
echo '{"decision": "block", "code": "CONVENTIONAL_COMMITS_VIOLATION", "reason": "Commit message must follow Conventional Commits: <type>(<scope>): <subject>. Valid types: feat, fix, docs, style, refactor, perf, test, build, ci, chore. Subject must be <=72 chars, lowercase, imperative mood, no trailing period."}'
|
|
48
|
+
exit 2
|
|
49
|
+
fi
|
|
50
|
+
if [ ${#SUBJECT} -gt 72 ]; then
|
|
51
|
+
echo '{"decision": "block", "code": "COMMIT_SUBJECT_TOO_LONG", "reason": "Commit subject must be 72 characters or less."}'
|
|
52
|
+
exit 2
|
|
53
|
+
fi
|
|
54
|
+
fi
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
exit 0
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// gsd-hook-version: {{GSD_VERSION}}
|
|
3
|
+
// GSD Workflow Guard — PreToolUse hook
|
|
4
|
+
// Detects when Claude attempts file edits outside a GSD workflow context
|
|
5
|
+
// (no active /gsd- skill or Task subagent) and injects an advisory warning.
|
|
6
|
+
//
|
|
7
|
+
// This is a SOFT guard — it advises, not blocks. The edit still proceeds.
|
|
8
|
+
// The warning nudges Claude to use /gsd:quick or /gsd:fast instead of
|
|
9
|
+
// making direct edits that bypass state tracking.
|
|
10
|
+
//
|
|
11
|
+
// Enable via config: hooks.workflow_guard: true (default: false)
|
|
12
|
+
// Only triggers on Write/Edit tool calls to non-.planning/ files.
|
|
13
|
+
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
const path = require('path');
|
|
16
|
+
const { spawnSync } = require('child_process');
|
|
17
|
+
const { tokenize } = require('./lib/git-cmd.js');
|
|
18
|
+
|
|
19
|
+
function forceGitAddCwds(command, defaultCwd) {
|
|
20
|
+
const tokens = tokenize(command || '');
|
|
21
|
+
const separators = new Set(['&&', '||', ';', '|']);
|
|
22
|
+
const cwdList = [];
|
|
23
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
24
|
+
if (path.basename(tokens[i]) !== 'git') continue;
|
|
25
|
+
|
|
26
|
+
let j = i + 1;
|
|
27
|
+
let gitCwd = defaultCwd;
|
|
28
|
+
while (j < tokens.length) {
|
|
29
|
+
const token = tokens[j];
|
|
30
|
+
const flagName = token.includes('=') ? token.slice(0, token.indexOf('=')) : token;
|
|
31
|
+
if (token === '-C' && tokens[j + 1]) {
|
|
32
|
+
gitCwd = path.resolve(gitCwd, tokens[j + 1]);
|
|
33
|
+
j += 2;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (['-C', '--git-dir', '--work-tree'].includes(flagName) && !token.includes('=')) {
|
|
37
|
+
j += 2;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (['--git-dir', '--work-tree', '--no-pager', '-p', '-P'].includes(flagName)) {
|
|
41
|
+
j++;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (tokens[j] !== 'add') continue;
|
|
48
|
+
for (let k = j + 1; k < tokens.length && !separators.has(tokens[k]); k++) {
|
|
49
|
+
if (tokens[k] === '--') break;
|
|
50
|
+
if (tokens[k] === '--force' || tokens[k] === '-f' || /^-[A-Za-z]*f[A-Za-z]*$/.test(tokens[k])) {
|
|
51
|
+
cwdList.push(gitCwd);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return cwdList;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function currentBranch(cwd) {
|
|
60
|
+
const result = spawnSync('git', ['branch', '--show-current'], {
|
|
61
|
+
cwd,
|
|
62
|
+
encoding: 'utf8',
|
|
63
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
64
|
+
});
|
|
65
|
+
if (result.status !== 0) return '';
|
|
66
|
+
return result.stdout.trim();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function workflowGuardEnabled(cwd) {
|
|
70
|
+
const configPath = path.join(cwd, '.planning', 'config.json');
|
|
71
|
+
if (!fs.existsSync(configPath)) return false;
|
|
72
|
+
try {
|
|
73
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
74
|
+
return Boolean(config.hooks?.workflow_guard);
|
|
75
|
+
} catch (e) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let input = '';
|
|
81
|
+
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
|
82
|
+
process.stdin.setEncoding('utf8');
|
|
83
|
+
process.stdin.on('data', chunk => input += chunk);
|
|
84
|
+
process.stdin.on('end', () => {
|
|
85
|
+
clearTimeout(stdinTimeout);
|
|
86
|
+
try {
|
|
87
|
+
const data = JSON.parse(input);
|
|
88
|
+
const toolName = data.tool_name;
|
|
89
|
+
const cwd = data.cwd || process.cwd();
|
|
90
|
+
const isWorkflowGuardEnabled = workflowGuardEnabled(cwd);
|
|
91
|
+
|
|
92
|
+
if (toolName === 'Bash') {
|
|
93
|
+
if (!isWorkflowGuardEnabled) {
|
|
94
|
+
process.exit(0);
|
|
95
|
+
}
|
|
96
|
+
const command = data.tool_input?.command || '';
|
|
97
|
+
for (const gitCwd of forceGitAddCwds(command, cwd)) {
|
|
98
|
+
const branch = currentBranch(gitCwd);
|
|
99
|
+
if (branch.startsWith('worktree-agent-')) {
|
|
100
|
+
process.stdout.write(JSON.stringify({
|
|
101
|
+
decision: 'block',
|
|
102
|
+
code: 'WORKTREE_AGENT_FORCE_ADD_FORBIDDEN',
|
|
103
|
+
reason: 'worktree-agent branches must not run git add -f or git add --force. Respect the SDK skipped_gitignored/skipped_commit_docs_false contract and leave gitignored files untracked.',
|
|
104
|
+
}));
|
|
105
|
+
process.exit(2);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
process.exit(0);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Only guard Write, Edit, and MultiEdit tool calls
|
|
112
|
+
if (!['Write', 'Edit', 'MultiEdit'].includes(toolName)) {
|
|
113
|
+
process.exit(0);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Check if we're inside a GSD workflow (Task subagent or /gsd- skill)
|
|
117
|
+
// Subagents have a session_id that differs from the parent
|
|
118
|
+
// and typically have a description field set by the orchestrator
|
|
119
|
+
if (data.tool_input?.is_subagent || data.session_type === 'task') {
|
|
120
|
+
process.exit(0);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Check the file being edited
|
|
124
|
+
const filePath = data.tool_input?.file_path || data.tool_input?.path || '';
|
|
125
|
+
|
|
126
|
+
// Allow edits to .planning/ files (GSD state management)
|
|
127
|
+
if (filePath.includes('.planning/') || filePath.includes('.planning\\')) {
|
|
128
|
+
process.exit(0);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Allow edits to common config/docs files that don't need GSD tracking
|
|
132
|
+
const allowedPatterns = [
|
|
133
|
+
/\.gitignore$/,
|
|
134
|
+
/\.env/,
|
|
135
|
+
/CLAUDE\.md$/,
|
|
136
|
+
/AGENTS\.md$/,
|
|
137
|
+
/GEMINI\.md$/,
|
|
138
|
+
/settings\.json$/,
|
|
139
|
+
];
|
|
140
|
+
if (allowedPatterns.some(p => p.test(filePath))) {
|
|
141
|
+
process.exit(0);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (!isWorkflowGuardEnabled) {
|
|
145
|
+
process.exit(0); // Guard disabled (default) or no GSD project
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// If we get here: GSD project, guard enabled, file edit outside .planning/,
|
|
149
|
+
// not in a subagent context. Inject advisory warning.
|
|
150
|
+
const output = {
|
|
151
|
+
hookSpecificOutput: {
|
|
152
|
+
hookEventName: "PreToolUse",
|
|
153
|
+
additionalContext: `⚠️ WORKFLOW ADVISORY: You're editing ${path.basename(filePath)} directly without a GSD command. ` +
|
|
154
|
+
'This edit will not be tracked in STATE.md or produce a SUMMARY.md. ' +
|
|
155
|
+
'Consider using /gsd:fast for trivial fixes or /gsd:quick for larger changes ' +
|
|
156
|
+
'to maintain project state tracking. ' +
|
|
157
|
+
'If this is intentional (e.g., user explicitly asked for a direct edit), proceed normally.'
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
process.stdout.write(JSON.stringify(output));
|
|
162
|
+
} catch (e) {
|
|
163
|
+
// Silent fail — never block tool execution
|
|
164
|
+
process.exit(0);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* git-cmd.js — token-walk git command classifier.
|
|
5
|
+
*
|
|
6
|
+
* Determines whether a shell command string invokes a specific git
|
|
7
|
+
* subcommand. Handles the four forms that a naive `^git\s+commit` regex
|
|
8
|
+
* misses:
|
|
9
|
+
*
|
|
10
|
+
* bare: git commit -m "..." ✓
|
|
11
|
+
* -C path: git -C /some/path commit -m "..." ✓ (missed by regex)
|
|
12
|
+
* env-prefix: GIT_AUTHOR_NAME=x git commit "..." ✓ (missed by regex)
|
|
13
|
+
* full-path: /usr/bin/git commit -m "..." ✓ (missed by regex)
|
|
14
|
+
*
|
|
15
|
+
* This module is the single source of truth for git-commit detection so all
|
|
16
|
+
* hooks that need to gate on git commits share one implementation.
|
|
17
|
+
*
|
|
18
|
+
* Exported by the hooks/lib/ directory — require via a path relative to the
|
|
19
|
+
* hook's own __dirname:
|
|
20
|
+
*
|
|
21
|
+
* const { isGitSubcommand } = require(path.join(__dirname, 'lib', 'git-cmd.js'));
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const path = require('path');
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Git global options that take a following argument.
|
|
28
|
+
* These must be consumed as (option, argument) pairs when walking tokens.
|
|
29
|
+
*/
|
|
30
|
+
const ARGUMENT_TAKING_FLAGS = new Set([
|
|
31
|
+
'-C', // working directory
|
|
32
|
+
'--git-dir', // path to git repository
|
|
33
|
+
'--work-tree', // path to working tree
|
|
34
|
+
'--namespace', // git namespace
|
|
35
|
+
'--super-prefix', // superproject-relative prefix
|
|
36
|
+
'--exec-path', // path to core git programs (when given an arg)
|
|
37
|
+
'--html-path',
|
|
38
|
+
'--man-path',
|
|
39
|
+
'--info-path',
|
|
40
|
+
'--list-cmds',
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Git global flags that consume no extra argument.
|
|
45
|
+
*/
|
|
46
|
+
const BOOLEAN_FLAGS = new Set([
|
|
47
|
+
'-p', '--paginate', '--no-pager',
|
|
48
|
+
'--no-replace-objects', '--bare',
|
|
49
|
+
'--literal-pathspecs', '--glob-pathspecs', '--noglob-pathspecs',
|
|
50
|
+
'--icase-pathspecs', '--no-optional-locks',
|
|
51
|
+
'-P', '--no-lazy-fetch',
|
|
52
|
+
'--version', '--help',
|
|
53
|
+
]);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Tokenize a shell command string.
|
|
57
|
+
* Handles single-quoted strings, double-quoted strings, and unquoted tokens.
|
|
58
|
+
* Does NOT perform variable expansion or brace expansion.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} cmd
|
|
61
|
+
* @returns {string[]}
|
|
62
|
+
*/
|
|
63
|
+
function tokenize(cmd) {
|
|
64
|
+
const tokens = [];
|
|
65
|
+
let i = 0;
|
|
66
|
+
const len = cmd.length;
|
|
67
|
+
|
|
68
|
+
while (i < len) {
|
|
69
|
+
// Skip whitespace
|
|
70
|
+
while (i < len && /\s/.test(cmd[i])) i++;
|
|
71
|
+
if (i >= len) break;
|
|
72
|
+
|
|
73
|
+
let token = '';
|
|
74
|
+
while (i < len && !/\s/.test(cmd[i])) {
|
|
75
|
+
if (cmd[i] === "'") {
|
|
76
|
+
// Single-quoted string: take everything until closing '
|
|
77
|
+
i++;
|
|
78
|
+
while (i < len && cmd[i] !== "'") token += cmd[i++];
|
|
79
|
+
if (i < len) i++; // consume closing '
|
|
80
|
+
} else if (cmd[i] === '"') {
|
|
81
|
+
// Double-quoted string: take everything until closing " (no escape handling)
|
|
82
|
+
i++;
|
|
83
|
+
while (i < len && cmd[i] !== '"') token += cmd[i++];
|
|
84
|
+
if (i < len) i++; // consume closing "
|
|
85
|
+
} else {
|
|
86
|
+
token += cmd[i++];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (token) tokens.push(token);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return tokens;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Return true if `cmd` invokes the git subcommand `sub`.
|
|
97
|
+
*
|
|
98
|
+
* @param {string} cmd - Full shell command string (may include env vars, full paths)
|
|
99
|
+
* @param {string} sub - Subcommand to test for, e.g. 'commit'
|
|
100
|
+
* @returns {boolean}
|
|
101
|
+
*/
|
|
102
|
+
function isGitSubcommand(cmd, sub) {
|
|
103
|
+
if (!cmd || !sub) return false;
|
|
104
|
+
|
|
105
|
+
const tokens = tokenize(cmd);
|
|
106
|
+
let i = 0;
|
|
107
|
+
|
|
108
|
+
// Phase 1: skip leading VAR=VALUE environment assignments
|
|
109
|
+
while (i < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(tokens[i])) {
|
|
110
|
+
i++;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Phase 2: the next token must be the git executable
|
|
114
|
+
if (i >= tokens.length) return false;
|
|
115
|
+
const gitToken = tokens[i++];
|
|
116
|
+
if (path.basename(gitToken) !== 'git') return false;
|
|
117
|
+
|
|
118
|
+
// Phase 3: consume git global options
|
|
119
|
+
while (i < tokens.length) {
|
|
120
|
+
const t = tokens[i];
|
|
121
|
+
|
|
122
|
+
// --flag=value form for argument-taking flags
|
|
123
|
+
const eqIdx = t.indexOf('=');
|
|
124
|
+
const flagName = eqIdx !== -1 ? t.slice(0, eqIdx) : t;
|
|
125
|
+
if (ARGUMENT_TAKING_FLAGS.has(flagName)) {
|
|
126
|
+
if (eqIdx !== -1) {
|
|
127
|
+
// consumed as one token: --git-dir=.git
|
|
128
|
+
i++;
|
|
129
|
+
} else {
|
|
130
|
+
// consumed as two tokens: -C /path
|
|
131
|
+
i += 2;
|
|
132
|
+
}
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (BOOLEAN_FLAGS.has(t)) {
|
|
137
|
+
i++;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Not a global option — this is the subcommand
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Phase 4: check the subcommand
|
|
146
|
+
if (i >= tokens.length) return false;
|
|
147
|
+
return tokens[i] === sub;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
module.exports = { isGitSubcommand, tokenize };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# gsd-graphify-rebuild.sh — detached rebuild runner for hooks/gsd-graphify-update.sh.
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# gsd-graphify-rebuild.sh <STATUS_FILE> <LOCK_FILE> <HEAD_SHA> <MS_START> <GRAPHIFY_BIN>
|
|
6
|
+
#
|
|
7
|
+
# Writes its own PID into LOCK_FILE on start, removes LOCK_FILE on exit (any cause),
|
|
8
|
+
# runs `graphify update .` from the project root (cwd inherited from caller), copies
|
|
9
|
+
# the produced graphify-out/* into .planning/graphs/, and rewrites STATUS_FILE to
|
|
10
|
+
# reflect the final status ("ok" if graphify exited 0, "failed" otherwise).
|
|
11
|
+
#
|
|
12
|
+
# Designed to be invoked via `setsid ... &` so it is reparented away from the hook
|
|
13
|
+
# caller and never blocks the user-facing tool call.
|
|
14
|
+
|
|
15
|
+
set -uo pipefail
|
|
16
|
+
|
|
17
|
+
STATUS_FILE="${1:?STATUS_FILE required}"
|
|
18
|
+
LOCK_FILE="${2:?LOCK_FILE required}"
|
|
19
|
+
HEAD_SHA="${3:?HEAD_SHA required}"
|
|
20
|
+
MS_START="${4:?MS_START required}"
|
|
21
|
+
GRAPHIFY_BIN="${5:?GRAPHIFY_BIN required}"
|
|
22
|
+
|
|
23
|
+
# Atomic-ish lock acquire: write our PID and trap cleanup
|
|
24
|
+
echo "$$" > "$LOCK_FILE"
|
|
25
|
+
trap 'rm -f "$LOCK_FILE"' EXIT
|
|
26
|
+
|
|
27
|
+
"$GRAPHIFY_BIN" update . >/dev/null 2>&1
|
|
28
|
+
EXIT_CODE=$?
|
|
29
|
+
|
|
30
|
+
# Copy outputs only on success — failure path preserves the prior valid graph.
|
|
31
|
+
if [ "$EXIT_CODE" -eq 0 ] && [ -f graphify-out/graph.json ]; then
|
|
32
|
+
cp graphify-out/graph.json .planning/graphs/graph.json
|
|
33
|
+
cp graphify-out/graph.html .planning/graphs/graph.html 2>/dev/null || true
|
|
34
|
+
cp graphify-out/GRAPH_REPORT.md .planning/graphs/GRAPH_REPORT.md 2>/dev/null || true
|
|
35
|
+
cp .planning/graphs/graph.json .planning/graphs/.last-build-snapshot.json 2>/dev/null || true
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Compute duration in ms
|
|
39
|
+
MS_END=$(node -e 'process.stdout.write(String(Date.now()))' 2>/dev/null || echo "$MS_START")
|
|
40
|
+
DURATION=$((MS_END - MS_START))
|
|
41
|
+
|
|
42
|
+
STATUS_NAME="ok"
|
|
43
|
+
[ "$EXIT_CODE" -eq 0 ] || STATUS_NAME="failed"
|
|
44
|
+
|
|
45
|
+
TS_END=$(date -u +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || echo "")
|
|
46
|
+
|
|
47
|
+
# Write the final status file. Use Node for safe JSON encoding.
|
|
48
|
+
GSD_STATUS_TS="$TS_END" \
|
|
49
|
+
GSD_STATUS_NAME="$STATUS_NAME" \
|
|
50
|
+
GSD_EXIT_CODE="$EXIT_CODE" \
|
|
51
|
+
GSD_DURATION="$DURATION" \
|
|
52
|
+
GSD_HEAD_SHA="$HEAD_SHA" \
|
|
53
|
+
GSD_STATUS_FILE="$STATUS_FILE" \
|
|
54
|
+
node -e '
|
|
55
|
+
const fs = require("node:fs");
|
|
56
|
+
const status = {
|
|
57
|
+
ts: process.env.GSD_STATUS_TS,
|
|
58
|
+
status: process.env.GSD_STATUS_NAME,
|
|
59
|
+
exit_code: parseInt(process.env.GSD_EXIT_CODE, 10),
|
|
60
|
+
duration_ms: parseInt(process.env.GSD_DURATION, 10),
|
|
61
|
+
head_at_build: process.env.GSD_HEAD_SHA,
|
|
62
|
+
graphify_version: null,
|
|
63
|
+
};
|
|
64
|
+
fs.writeFileSync(process.env.GSD_STATUS_FILE, JSON.stringify(status, null, 2) + "\n");
|
|
65
|
+
' 2>/dev/null || true
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Authoritative list of GSD-managed hook files.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from the worker script into a shared CJS module so that:
|
|
7
|
+
* 1. gsd-check-update-worker.js can require() it directly (no source-level
|
|
8
|
+
* duplication).
|
|
9
|
+
* 2. Tests can assert against the exported array instead of regex-parsing
|
|
10
|
+
* the worker source (retiring the pending-migration-to-typed-ir token
|
|
11
|
+
* on managed-hooks.test.cjs and orphaned-hooks.test.cjs, per #455).
|
|
12
|
+
*
|
|
13
|
+
* These are the files GSD ships into ~/.claude/hooks/ (or equivalent) and
|
|
14
|
+
* checks for staleness after an update. Orphaned files from removed features
|
|
15
|
+
* (e.g., gsd-intel-*.js) must NOT be listed here — that would cause permanent
|
|
16
|
+
* stale warnings for users who haven't cleaned up manually (#1750).
|
|
17
|
+
*/
|
|
18
|
+
const MANAGED_HOOKS = [
|
|
19
|
+
'gsd-check-update-worker.js',
|
|
20
|
+
'gsd-check-update.js',
|
|
21
|
+
'gsd-context-monitor.js',
|
|
22
|
+
'gsd-graphify-update.sh',
|
|
23
|
+
'gsd-phase-boundary.sh',
|
|
24
|
+
'gsd-prompt-guard.js',
|
|
25
|
+
'gsd-read-guard.js',
|
|
26
|
+
'gsd-read-injection-scanner.js',
|
|
27
|
+
'gsd-session-state.sh',
|
|
28
|
+
'gsd-statusline.js',
|
|
29
|
+
'gsd-update-banner.js',
|
|
30
|
+
'gsd-validate-commit.sh',
|
|
31
|
+
'gsd-workflow-guard.js',
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
module.exports = { MANAGED_HOOKS };
|
package/package.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@opengsd/gsd-core",
|
|
3
|
+
"version": "1.2.0-rc.1",
|
|
4
|
+
"description": "A meta-prompting, context engineering and spec-driven development system for Claude Code, OpenCode, Gemini and Codex by TÂCHES.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"gsd-core": "bin/install.js",
|
|
7
|
+
"gsd-tools": "get-shit-done/bin/gsd-tools.cjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"commands",
|
|
12
|
+
"get-shit-done",
|
|
13
|
+
"agents",
|
|
14
|
+
"hooks",
|
|
15
|
+
"scripts"
|
|
16
|
+
],
|
|
17
|
+
"keywords": [
|
|
18
|
+
"claude",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"ai",
|
|
21
|
+
"meta-prompting",
|
|
22
|
+
"context-engineering",
|
|
23
|
+
"spec-driven-development",
|
|
24
|
+
"gemini",
|
|
25
|
+
"gemini-cli",
|
|
26
|
+
"codex",
|
|
27
|
+
"codex-cli"
|
|
28
|
+
],
|
|
29
|
+
"author": "TÂCHES",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/open-gsd/gsd-core.git"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/open-gsd/gsd-core",
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/open-gsd/gsd-core/issues"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22.0.0",
|
|
44
|
+
"npm": ">=10.0.0"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.84",
|
|
48
|
+
"ws": "8.20.1"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@eslint/js": "^9.39.4",
|
|
52
|
+
"@stryker-mutator/core": "^9.6.1",
|
|
53
|
+
"c8": "^11.0.0",
|
|
54
|
+
"eslint": "^9.39.4",
|
|
55
|
+
"eslint-plugin-n": "^17.24.0",
|
|
56
|
+
"eslint-plugin-no-only-tests": "^3.4.0",
|
|
57
|
+
"fast-check": "^4.8.0",
|
|
58
|
+
"globals": "^16.5.0",
|
|
59
|
+
"js-yaml": "^4.1.1",
|
|
60
|
+
"typescript": "^6.0.3",
|
|
61
|
+
"typescript-eslint": "^8.60.0"
|
|
62
|
+
},
|
|
63
|
+
"optionalDependencies": {
|
|
64
|
+
"fallow": "^2.70.0"
|
|
65
|
+
},
|
|
66
|
+
"scripts": {
|
|
67
|
+
"sync:launcher": "node scripts/sync-runtime-launcher.cjs",
|
|
68
|
+
"check:env": "node scripts/check-env.cjs",
|
|
69
|
+
"check:alias-drift": "node scripts/check-alias-drift.cjs",
|
|
70
|
+
"check:identity-drift": "node scripts/lint-package-identity-drift.cjs",
|
|
71
|
+
"check:integrity": "node scripts/check-npm-integrity.cjs",
|
|
72
|
+
"build": "npm run generate:identity && npm run build:hooks",
|
|
73
|
+
"build:hooks": "node scripts/build-hooks.js",
|
|
74
|
+
"generate:identity": "node scripts/generate-package-identity.cjs",
|
|
75
|
+
"prepublishOnly": "npm run build:hooks",
|
|
76
|
+
"pretest": "npm run lint:skill-deps",
|
|
77
|
+
"pretest:coverage": "npm run lint:skill-deps",
|
|
78
|
+
"lint": "eslint . --cache --cache-location node_modules/.cache/eslint/",
|
|
79
|
+
"lint:fix": "eslint . --fix",
|
|
80
|
+
"lint:descriptions": "node scripts/lint-descriptions.cjs",
|
|
81
|
+
"lint:skill-deps": "node scripts/lint-skill-deps.cjs",
|
|
82
|
+
"lint:test-file-count": "node scripts/lint-test-file-count.cjs",
|
|
83
|
+
"lint:pr-checks": "node scripts/lint-pr-check-project-dir.cjs",
|
|
84
|
+
"lint:changeset": "node scripts/changeset/lint.cjs",
|
|
85
|
+
"lint:docs": "node scripts/lint-docs-required.cjs",
|
|
86
|
+
"ci:test-scope": "node scripts/ci-test-scope.cjs",
|
|
87
|
+
"changeset": "node scripts/changeset/new.cjs",
|
|
88
|
+
"changelog:render": "node scripts/changeset/cli.cjs render",
|
|
89
|
+
"test": "node scripts/run-tests.cjs",
|
|
90
|
+
"test:unit": "node scripts/run-tests.cjs --suite unit",
|
|
91
|
+
"test:integration": "node scripts/run-tests.cjs --suite integration",
|
|
92
|
+
"test:install": "node scripts/run-tests.cjs --suite install",
|
|
93
|
+
"test:security": "node scripts/run-tests.cjs --suite security",
|
|
94
|
+
"test:slow": "node scripts/run-tests.cjs --suite slow",
|
|
95
|
+
"test:affected": "node scripts/run-affected-tests.cjs",
|
|
96
|
+
"test:coverage": "c8 --check-coverage --lines 70 --reporter text --include 'get-shit-done/bin/lib/*.cjs' --exclude 'tests/**' --all node scripts/run-tests.cjs",
|
|
97
|
+
"test:coverage:unit": "c8 --check-coverage --lines 70 --reporter text --include 'get-shit-done/bin/lib/*.cjs' --exclude 'tests/**' --all node scripts/run-tests.cjs --suite unit",
|
|
98
|
+
"test:coverage:all": "npm run test:coverage",
|
|
99
|
+
"test:mutation": "stryker run",
|
|
100
|
+
"test:mutation:since": "stryker run --incremental --since origin/next"
|
|
101
|
+
}
|
|
102
|
+
}
|