gsd-remix 1.0.0
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.md +939 -0
- package/README.zh-CN.md +876 -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 +517 -0
- package/agents/gsd-code-reviewer.md +371 -0
- package/agents/gsd-codebase-mapper.md +781 -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 +603 -0
- package/agents/gsd-framework-selector.md +160 -0
- package/agents/gsd-integration-checker.md +470 -0
- package/agents/gsd-intel-updater.md +334 -0
- package/agents/gsd-nyquist-auditor.md +203 -0
- package/agents/gsd-pattern-mapper.md +335 -0
- package/agents/gsd-phase-researcher.md +841 -0
- package/agents/gsd-plan-checker.md +978 -0
- package/agents/gsd-planner.md +1251 -0
- package/agents/gsd-project-researcher.md +677 -0
- package/agents/gsd-research-synthesizer.md +247 -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 +830 -0
- package/bin/install.js +7062 -0
- package/commands/gsd/add-backlog.md +79 -0
- package/commands/gsd/add-phase.md +43 -0
- package/commands/gsd/add-tests.md +41 -0
- package/commands/gsd/add-todo.md +47 -0
- package/commands/gsd/ai-integration-phase.md +36 -0
- package/commands/gsd/analyze-dependencies.md +34 -0
- package/commands/gsd/audit-fix.md +33 -0
- package/commands/gsd/audit-milestone.md +36 -0
- package/commands/gsd/audit-uat.md +24 -0
- package/commands/gsd/autonomous.md +46 -0
- package/commands/gsd/check-todos.md +45 -0
- package/commands/gsd/cleanup.md +23 -0
- package/commands/gsd/code-review-fix.md +52 -0
- package/commands/gsd/code-review.md +55 -0
- package/commands/gsd/complete-milestone.md +136 -0
- package/commands/gsd/debug.md +263 -0
- package/commands/gsd/discuss-phase.md +69 -0
- package/commands/gsd/do.md +30 -0
- package/commands/gsd/docs-update.md +48 -0
- package/commands/gsd/eval-review.md +32 -0
- package/commands/gsd/execute-phase.md +63 -0
- package/commands/gsd/explore.md +27 -0
- package/commands/gsd/extract_learnings.md +22 -0
- package/commands/gsd/fast.md +30 -0
- package/commands/gsd/forensics.md +56 -0
- package/commands/gsd/from-gsd2.md +47 -0
- package/commands/gsd/graphify.md +201 -0
- package/commands/gsd/health.md +22 -0
- package/commands/gsd/help.md +24 -0
- package/commands/gsd/import.md +37 -0
- package/commands/gsd/inbox.md +38 -0
- package/commands/gsd/ingest-docs.md +42 -0
- package/commands/gsd/insert-phase.md +32 -0
- package/commands/gsd/intel.md +179 -0
- package/commands/gsd/join-discord.md +19 -0
- package/commands/gsd/list-phase-assumptions.md +46 -0
- package/commands/gsd/list-workspaces.md +19 -0
- package/commands/gsd/manager.md +40 -0
- package/commands/gsd/map-codebase.md +71 -0
- package/commands/gsd/milestone-summary.md +51 -0
- package/commands/gsd/new-milestone.md +44 -0
- package/commands/gsd/new-project.md +46 -0
- package/commands/gsd/new-workspace.md +44 -0
- package/commands/gsd/next.md +28 -0
- package/commands/gsd/note.md +34 -0
- package/commands/gsd/pause-work.md +38 -0
- package/commands/gsd/plan-milestone-gaps.md +34 -0
- package/commands/gsd/plan-phase.md +52 -0
- package/commands/gsd/plan-review-convergence.md +52 -0
- package/commands/gsd/plant-seed.md +28 -0
- package/commands/gsd/pr-branch.md +25 -0
- package/commands/gsd/profile-user.md +46 -0
- package/commands/gsd/progress.md +25 -0
- package/commands/gsd/quick.md +173 -0
- package/commands/gsd/reapply-patches.md +331 -0
- package/commands/gsd/remove-phase.md +31 -0
- package/commands/gsd/remove-workspace.md +26 -0
- package/commands/gsd/research-phase.md +195 -0
- package/commands/gsd/resume-work.md +40 -0
- package/commands/gsd/review-backlog.md +62 -0
- package/commands/gsd/review.md +40 -0
- package/commands/gsd/scan.md +26 -0
- package/commands/gsd/secure-phase.md +35 -0
- package/commands/gsd/session-report.md +19 -0
- package/commands/gsd/set-profile.md +12 -0
- package/commands/gsd/settings.md +36 -0
- package/commands/gsd/ship.md +23 -0
- package/commands/gsd/sketch-wrap-up.md +31 -0
- package/commands/gsd/sketch.md +49 -0
- package/commands/gsd/spec-phase.md +62 -0
- package/commands/gsd/spike-wrap-up.md +31 -0
- package/commands/gsd/spike.md +46 -0
- package/commands/gsd/stats.md +18 -0
- package/commands/gsd/sync-skills.md +19 -0
- package/commands/gsd/thread.md +227 -0
- package/commands/gsd/ui-phase.md +34 -0
- package/commands/gsd/ui-review.md +32 -0
- package/commands/gsd/ultraplan-phase.md +33 -0
- package/commands/gsd/undo.md +34 -0
- package/commands/gsd/update.md +37 -0
- package/commands/gsd/validate-phase.md +35 -0
- package/commands/gsd/verify-work.md +38 -0
- package/commands/gsd/workstreams.md +69 -0
- package/get-shit-done/bin/gsd-tools.cjs +1263 -0
- package/get-shit-done/bin/lib/artifacts.cjs +52 -0
- package/get-shit-done/bin/lib/audit.cjs +757 -0
- package/get-shit-done/bin/lib/commands.cjs +1023 -0
- package/get-shit-done/bin/lib/config-schema.cjs +79 -0
- package/get-shit-done/bin/lib/config.cjs +463 -0
- package/get-shit-done/bin/lib/core.cjs +1794 -0
- package/get-shit-done/bin/lib/docs.cjs +267 -0
- package/get-shit-done/bin/lib/frontmatter.cjs +379 -0
- package/get-shit-done/bin/lib/graphify.cjs +494 -0
- package/get-shit-done/bin/lib/gsd2-import.cjs +511 -0
- package/get-shit-done/bin/lib/init.cjs +1878 -0
- package/get-shit-done/bin/lib/intel.cjs +639 -0
- package/get-shit-done/bin/lib/learnings.cjs +378 -0
- package/get-shit-done/bin/lib/milestone.cjs +283 -0
- package/get-shit-done/bin/lib/model-profiles.cjs +71 -0
- package/get-shit-done/bin/lib/phase.cjs +1058 -0
- package/get-shit-done/bin/lib/profile-output.cjs +1080 -0
- package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
- package/get-shit-done/bin/lib/roadmap.cjs +523 -0
- package/get-shit-done/bin/lib/schema-detect.cjs +238 -0
- package/get-shit-done/bin/lib/security.cjs +504 -0
- package/get-shit-done/bin/lib/state.cjs +1649 -0
- package/get-shit-done/bin/lib/template.cjs +226 -0
- package/get-shit-done/bin/lib/uat.cjs +288 -0
- package/get-shit-done/bin/lib/verify.cjs +1184 -0
- package/get-shit-done/bin/lib/workstream.cjs +495 -0
- package/get-shit-done/bin/repair-sdk.cjs +177 -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 +22 -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 +808 -0
- package/get-shit-done/references/common-bug-patterns.md +114 -0
- package/get-shit-done/references/context-budget.md +49 -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/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 +295 -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 +145 -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-gap-closure.md +62 -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 +460 -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/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/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/verification-overrides.md +227 -0
- package/get-shit-done/references/verification-patterns.md +612 -0
- package/get-shit-done/references/workstream-flag.md +111 -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 +76 -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 +56 -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 +184 -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/add-phase.md +112 -0
- package/get-shit-done/workflows/add-tests.md +354 -0
- package/get-shit-done/workflows/add-todo.md +160 -0
- package/get-shit-done/workflows/ai-integration-phase.md +284 -0
- package/get-shit-done/workflows/analyze-dependencies.md +96 -0
- package/get-shit-done/workflows/audit-fix.md +175 -0
- package/get-shit-done/workflows/audit-milestone.md +340 -0
- package/get-shit-done/workflows/audit-uat.md +109 -0
- package/get-shit-done/workflows/autonomous.md +789 -0
- package/get-shit-done/workflows/check-todos.md +179 -0
- package/get-shit-done/workflows/cleanup.md +154 -0
- package/get-shit-done/workflows/code-review-fix.md +497 -0
- package/get-shit-done/workflows/code-review.md +515 -0
- package/get-shit-done/workflows/complete-milestone.md +847 -0
- package/get-shit-done/workflows/diagnose-issues.md +238 -0
- package/get-shit-done/workflows/discovery-phase.md +291 -0
- package/get-shit-done/workflows/discuss-phase-assumptions.md +670 -0
- package/get-shit-done/workflows/discuss-phase-power.md +308 -0
- package/get-shit-done/workflows/discuss-phase.md +1378 -0
- package/get-shit-done/workflows/do.md +110 -0
- package/get-shit-done/workflows/docs-update.md +1155 -0
- package/get-shit-done/workflows/eval-review.md +155 -0
- package/get-shit-done/workflows/execute-phase.md +1677 -0
- package/get-shit-done/workflows/execute-plan.md +533 -0
- package/get-shit-done/workflows/explore.md +141 -0
- package/get-shit-done/workflows/extract_learnings.md +242 -0
- package/get-shit-done/workflows/fast.md +105 -0
- package/get-shit-done/workflows/forensics.md +265 -0
- package/get-shit-done/workflows/graduation.md +195 -0
- package/get-shit-done/workflows/health.md +314 -0
- package/get-shit-done/workflows/help.md +667 -0
- package/get-shit-done/workflows/import.md +246 -0
- package/get-shit-done/workflows/inbox.md +387 -0
- package/get-shit-done/workflows/ingest-docs.md +328 -0
- package/get-shit-done/workflows/insert-phase.md +130 -0
- package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
- package/get-shit-done/workflows/list-workspaces.md +56 -0
- package/get-shit-done/workflows/manager.md +365 -0
- package/get-shit-done/workflows/map-codebase.md +393 -0
- package/get-shit-done/workflows/milestone-summary.md +223 -0
- package/get-shit-done/workflows/new-milestone.md +611 -0
- package/get-shit-done/workflows/new-project.md +1391 -0
- package/get-shit-done/workflows/new-workspace.md +239 -0
- package/get-shit-done/workflows/next.md +220 -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 +243 -0
- package/get-shit-done/workflows/plan-milestone-gaps.md +273 -0
- package/get-shit-done/workflows/plan-phase.md +1349 -0
- package/get-shit-done/workflows/plan-review-convergence.md +254 -0
- package/get-shit-done/workflows/plant-seed.md +172 -0
- package/get-shit-done/workflows/pr-branch.md +157 -0
- package/get-shit-done/workflows/profile-user.md +452 -0
- package/get-shit-done/workflows/progress.md +619 -0
- package/get-shit-done/workflows/quick.md +970 -0
- package/get-shit-done/workflows/remove-phase.md +155 -0
- package/get-shit-done/workflows/remove-workspace.md +92 -0
- package/get-shit-done/workflows/research-phase.md +89 -0
- package/get-shit-done/workflows/resume-project.md +326 -0
- package/get-shit-done/workflows/review.md +344 -0
- package/get-shit-done/workflows/scan.md +102 -0
- package/get-shit-done/workflows/secure-phase.md +166 -0
- package/get-shit-done/workflows/session-report.md +146 -0
- package/get-shit-done/workflows/settings.md +319 -0
- package/get-shit-done/workflows/ship.md +302 -0
- package/get-shit-done/workflows/sketch-wrap-up.md +283 -0
- package/get-shit-done/workflows/sketch.md +286 -0
- package/get-shit-done/workflows/spec-phase.md +262 -0
- package/get-shit-done/workflows/spike-wrap-up.md +281 -0
- package/get-shit-done/workflows/spike.md +362 -0
- package/get-shit-done/workflows/stats.md +60 -0
- package/get-shit-done/workflows/sync-skills.md +182 -0
- package/get-shit-done/workflows/transition.md +693 -0
- package/get-shit-done/workflows/ui-phase.md +323 -0
- package/get-shit-done/workflows/ui-review.md +190 -0
- package/get-shit-done/workflows/ultraplan-phase.md +189 -0
- package/get-shit-done/workflows/undo.md +314 -0
- package/get-shit-done/workflows/update.md +587 -0
- package/get-shit-done/workflows/validate-phase.md +176 -0
- package/get-shit-done/workflows/verify-phase.md +465 -0
- package/get-shit-done/workflows/verify-work.md +740 -0
- package/hooks/dist/gsd-check-update-worker.js +108 -0
- package/hooks/dist/gsd-check-update.js +64 -0
- package/hooks/dist/gsd-context-monitor.js +192 -0
- package/hooks/dist/gsd-phase-boundary.sh +28 -0
- package/hooks/dist/gsd-prompt-guard.js +97 -0
- package/hooks/dist/gsd-read-guard.js +82 -0
- package/hooks/dist/gsd-read-injection-scanner.js +152 -0
- package/hooks/dist/gsd-session-state.sh +34 -0
- package/hooks/dist/gsd-statusline.js +293 -0
- package/hooks/dist/gsd-validate-commit.sh +48 -0
- package/hooks/dist/gsd-workflow-guard.js +94 -0
- package/hooks/gsd-check-update-worker.js +108 -0
- package/hooks/gsd-check-update.js +64 -0
- package/hooks/gsd-context-monitor.js +192 -0
- package/hooks/gsd-phase-boundary.sh +28 -0
- package/hooks/gsd-prompt-guard.js +97 -0
- package/hooks/gsd-read-guard.js +82 -0
- package/hooks/gsd-read-injection-scanner.js +152 -0
- package/hooks/gsd-session-state.sh +34 -0
- package/hooks/gsd-statusline.js +293 -0
- package/hooks/gsd-validate-commit.sh +48 -0
- package/hooks/gsd-workflow-guard.js +94 -0
- package/package.json +59 -0
- package/scripts/base64-scan.sh +262 -0
- package/scripts/build-hooks.js +95 -0
- package/scripts/gen-inventory-manifest.cjs +109 -0
- package/scripts/prompt-injection-scan.sh +201 -0
- package/scripts/run-tests.cjs +33 -0
- package/scripts/secret-scan.sh +227 -0
- package/sdk/package-lock.json +1998 -0
- package/sdk/package.json +52 -0
- package/sdk/prompts/agents/gsd-executor.md +110 -0
- package/sdk/prompts/agents/gsd-phase-researcher.md +158 -0
- package/sdk/prompts/agents/gsd-plan-checker.md +160 -0
- package/sdk/prompts/agents/gsd-planner.md +214 -0
- package/sdk/prompts/agents/gsd-project-researcher.md +323 -0
- package/sdk/prompts/agents/gsd-research-synthesizer.md +237 -0
- package/sdk/prompts/agents/gsd-roadmapper.md +670 -0
- package/sdk/prompts/agents/gsd-verifier.md +159 -0
- package/sdk/prompts/templates/project.md +186 -0
- package/sdk/prompts/templates/requirements.md +231 -0
- package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
- package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
- package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
- package/sdk/prompts/templates/research-project/STACK.md +120 -0
- package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
- package/sdk/prompts/templates/roadmap.md +202 -0
- package/sdk/prompts/templates/state.md +175 -0
- package/sdk/prompts/workflows/discuss-phase.md +126 -0
- package/sdk/prompts/workflows/execute-plan.md +106 -0
- package/sdk/prompts/workflows/plan-phase.md +84 -0
- package/sdk/prompts/workflows/research-phase.md +45 -0
- package/sdk/prompts/workflows/verify-phase.md +142 -0
- package/sdk/src/assembled-prompts.test.ts +349 -0
- package/sdk/src/cli-transport.test.ts +388 -0
- package/sdk/src/cli-transport.ts +130 -0
- package/sdk/src/cli.test.ts +383 -0
- package/sdk/src/cli.ts +670 -0
- package/sdk/src/config.test.ts +168 -0
- package/sdk/src/config.ts +177 -0
- package/sdk/src/context-engine.test.ts +295 -0
- package/sdk/src/context-engine.ts +170 -0
- package/sdk/src/context-truncation.test.ts +163 -0
- package/sdk/src/context-truncation.ts +233 -0
- package/sdk/src/e2e.integration.test.ts +178 -0
- package/sdk/src/errors.ts +72 -0
- package/sdk/src/event-stream.test.ts +661 -0
- package/sdk/src/event-stream.ts +441 -0
- package/sdk/src/failure-memory.test.ts +457 -0
- package/sdk/src/failure-memory.ts +1324 -0
- package/sdk/src/golden/capture.ts +95 -0
- package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
- package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
- package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
- package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
- package/sdk/src/golden/golden-integration-covered.ts +30 -0
- package/sdk/src/golden/golden-mutation-covered.ts +7 -0
- package/sdk/src/golden/golden-policy.test.ts +8 -0
- package/sdk/src/golden/golden-policy.ts +112 -0
- package/sdk/src/golden/golden.integration.test.ts +373 -0
- package/sdk/src/golden/init-golden-normalize.ts +15 -0
- package/sdk/src/golden/read-only-golden-rows.ts +77 -0
- package/sdk/src/golden/read-only-parity.integration.test.ts +125 -0
- package/sdk/src/golden/registry-canonical-commands.ts +31 -0
- package/sdk/src/gsd-tools.test.ts +409 -0
- package/sdk/src/gsd-tools.ts +595 -0
- package/sdk/src/headless-prompts.test.ts +159 -0
- package/sdk/src/index.ts +333 -0
- package/sdk/src/init-e2e.integration.test.ts +136 -0
- package/sdk/src/init-runner.test.ts +783 -0
- package/sdk/src/init-runner.ts +735 -0
- package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
- package/sdk/src/logger.test.ts +149 -0
- package/sdk/src/logger.ts +113 -0
- package/sdk/src/milestone-runner.test.ts +421 -0
- package/sdk/src/phase-prompt.test.ts +538 -0
- package/sdk/src/phase-prompt.ts +264 -0
- package/sdk/src/phase-runner-types.test.ts +421 -0
- package/sdk/src/phase-runner.integration.test.ts +377 -0
- package/sdk/src/phase-runner.test.ts +2333 -0
- package/sdk/src/phase-runner.ts +1203 -0
- package/sdk/src/plan-parser.test.ts +528 -0
- package/sdk/src/plan-parser.ts +427 -0
- package/sdk/src/prompt-builder.test.ts +306 -0
- package/sdk/src/prompt-builder.ts +193 -0
- package/sdk/src/prompt-sanitizer.test.ts +260 -0
- package/sdk/src/prompt-sanitizer.ts +71 -0
- package/sdk/src/query/QUERY-HANDLERS.md +317 -0
- package/sdk/src/query/audit-open.ts +722 -0
- package/sdk/src/query/check-auto-mode.test.ts +77 -0
- package/sdk/src/query/check-auto-mode.ts +50 -0
- package/sdk/src/query/check-completion.test.ts +113 -0
- package/sdk/src/query/check-completion.ts +182 -0
- package/sdk/src/query/check-gates.test.ts +103 -0
- package/sdk/src/query/check-gates.ts +112 -0
- package/sdk/src/query/check-ship-ready.test.ts +77 -0
- package/sdk/src/query/check-ship-ready.ts +103 -0
- package/sdk/src/query/check-verification-status.test.ts +143 -0
- package/sdk/src/query/check-verification-status.ts +160 -0
- package/sdk/src/query/commit.test.ts +202 -0
- package/sdk/src/query/commit.ts +301 -0
- package/sdk/src/query/config-gates.test.ts +89 -0
- package/sdk/src/query/config-gates.ts +69 -0
- package/sdk/src/query/config-mutation.test.ts +365 -0
- package/sdk/src/query/config-mutation.ts +497 -0
- package/sdk/src/query/config-query.test.ts +161 -0
- package/sdk/src/query/config-query.ts +190 -0
- package/sdk/src/query/context-history.test.ts +165 -0
- package/sdk/src/query/context-history.ts +467 -0
- package/sdk/src/query/decomposed-handlers.test.ts +365 -0
- package/sdk/src/query/detect-custom-files.ts +97 -0
- package/sdk/src/query/detect-phase-type.test.ts +105 -0
- package/sdk/src/query/detect-phase-type.ts +141 -0
- package/sdk/src/query/docs-init.ts +257 -0
- package/sdk/src/query/failure-capture.ts +58 -0
- package/sdk/src/query/frontmatter-array.test.ts +14 -0
- package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
- package/sdk/src/query/frontmatter-mutation.ts +343 -0
- package/sdk/src/query/frontmatter.test.ts +281 -0
- package/sdk/src/query/frontmatter.ts +397 -0
- package/sdk/src/query/helpers.test.ts +426 -0
- package/sdk/src/query/helpers.ts +482 -0
- package/sdk/src/query/index.ts +586 -0
- package/sdk/src/query/init-complex.test.ts +232 -0
- package/sdk/src/query/init-complex.ts +578 -0
- package/sdk/src/query/init.test.ts +522 -0
- package/sdk/src/query/init.ts +1046 -0
- package/sdk/src/query/intel.test.ts +90 -0
- package/sdk/src/query/intel.ts +404 -0
- package/sdk/src/query/normalize-query-command.test.ts +50 -0
- package/sdk/src/query/normalize-query-command.ts +56 -0
- package/sdk/src/query/phase-lifecycle.test.ts +1126 -0
- package/sdk/src/query/phase-lifecycle.ts +1799 -0
- package/sdk/src/query/phase-list-queries.test.ts +88 -0
- package/sdk/src/query/phase-list-queries.ts +152 -0
- package/sdk/src/query/phase-ready.test.ts +65 -0
- package/sdk/src/query/phase-ready.ts +158 -0
- package/sdk/src/query/phase.test.ts +307 -0
- package/sdk/src/query/phase.ts +340 -0
- package/sdk/src/query/pipeline.test.ts +169 -0
- package/sdk/src/query/pipeline.ts +243 -0
- package/sdk/src/query/plan-execution-route.test.ts +166 -0
- package/sdk/src/query/plan-execution-route.ts +209 -0
- package/sdk/src/query/plan-task-structure.test.ts +65 -0
- package/sdk/src/query/plan-task-structure.ts +63 -0
- package/sdk/src/query/profile-extract-messages.ts +247 -0
- package/sdk/src/query/profile-output.ts +908 -0
- package/sdk/src/query/profile-questionnaire-data.ts +181 -0
- package/sdk/src/query/profile-sample.ts +184 -0
- package/sdk/src/query/profile-scan-sessions.ts +174 -0
- package/sdk/src/query/profile.test.ts +74 -0
- package/sdk/src/query/profile.ts +337 -0
- package/sdk/src/query/progress.test.ts +156 -0
- package/sdk/src/query/progress.ts +566 -0
- package/sdk/src/query/registry.test.ts +216 -0
- package/sdk/src/query/registry.ts +174 -0
- package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
- package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
- package/sdk/src/query/roadmap-update-plan-progress.ts +132 -0
- package/sdk/src/query/roadmap.test.ts +359 -0
- package/sdk/src/query/roadmap.ts +591 -0
- package/sdk/src/query/route-next-action.test.ts +61 -0
- package/sdk/src/query/route-next-action.ts +345 -0
- package/sdk/src/query/runtime-health.ts +7 -0
- package/sdk/src/query/schema-detect.ts +189 -0
- package/sdk/src/query/skill-manifest.ts +214 -0
- package/sdk/src/query/skills.test.ts +80 -0
- package/sdk/src/query/skills.ts +62 -0
- package/sdk/src/query/state-mutation.test.ts +450 -0
- package/sdk/src/query/state-mutation.ts +1444 -0
- package/sdk/src/query/state-project-load.ts +109 -0
- package/sdk/src/query/state.test.ts +347 -0
- package/sdk/src/query/state.ts +397 -0
- package/sdk/src/query/summary.test.ts +95 -0
- package/sdk/src/query/summary.ts +296 -0
- package/sdk/src/query/template.test.ts +180 -0
- package/sdk/src/query/template.ts +242 -0
- package/sdk/src/query/uat.test.ts +77 -0
- package/sdk/src/query/uat.ts +314 -0
- package/sdk/src/query/utils.test.ts +82 -0
- package/sdk/src/query/utils.ts +92 -0
- package/sdk/src/query/validate.test.ts +656 -0
- package/sdk/src/query/validate.ts +807 -0
- package/sdk/src/query/verify.test.ts +414 -0
- package/sdk/src/query/verify.ts +645 -0
- package/sdk/src/query/websearch.test.ts +31 -0
- package/sdk/src/query/websearch.ts +82 -0
- package/sdk/src/query/workspace.test.ts +119 -0
- package/sdk/src/query/workspace.ts +131 -0
- package/sdk/src/query/workstream.test.ts +51 -0
- package/sdk/src/query/workstream.ts +434 -0
- package/sdk/src/research-gate.test.ts +190 -0
- package/sdk/src/research-gate.ts +94 -0
- package/sdk/src/runtime-health.test.ts +176 -0
- package/sdk/src/runtime-health.ts +387 -0
- package/sdk/src/session-runner.test.ts +98 -0
- package/sdk/src/session-runner.ts +299 -0
- package/sdk/src/tool-scoping.test.ts +160 -0
- package/sdk/src/tool-scoping.ts +61 -0
- package/sdk/src/types.ts +917 -0
- package/sdk/src/workstream-utils.ts +33 -0
- package/sdk/src/ws-flag.test.ts +285 -0
- package/sdk/src/ws-transport.test.ts +161 -0
- package/sdk/src/ws-transport.ts +93 -0
- package/sdk/tsconfig.json +20 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// gsd-hook-version: {{GSD_VERSION}}
|
|
3
|
+
// GSD Read Injection Scanner — PostToolUse hook (#2201)
|
|
4
|
+
// Scans file content returned by the Read tool for prompt injection patterns.
|
|
5
|
+
// Catches poisoned content at ingestion before it enters conversation context.
|
|
6
|
+
//
|
|
7
|
+
// Defense-in-depth: long GSD sessions hit context compression, and the
|
|
8
|
+
// summariser does not distinguish user instructions from content read from
|
|
9
|
+
// external files. Poisoned instructions that survive compression become
|
|
10
|
+
// indistinguishable from trusted context. This hook warns at ingestion time.
|
|
11
|
+
//
|
|
12
|
+
// Triggers on: Read tool PostToolUse events
|
|
13
|
+
// Action: Advisory warning (does not block) — logs detection for awareness
|
|
14
|
+
// Severity: LOW (1–2 patterns), HIGH (3+ patterns)
|
|
15
|
+
//
|
|
16
|
+
// False-positive exclusion: .planning/, REVIEW.md, CHECKPOINT, security docs,
|
|
17
|
+
// hook source files — these legitimately contain injection-like strings.
|
|
18
|
+
|
|
19
|
+
const path = require('path');
|
|
20
|
+
|
|
21
|
+
// Summarisation-specific patterns (novel — not in gsd-prompt-guard.js).
|
|
22
|
+
// These target instructions specifically designed to survive context compression.
|
|
23
|
+
const SUMMARISATION_PATTERNS = [
|
|
24
|
+
/when\s+(?:summari[sz]ing|compressing|compacting),?\s+(?:retain|preserve|keep)\s+(?:this|these)/i,
|
|
25
|
+
/this\s+(?:instruction|directive|rule)\s+is\s+(?:permanent|persistent|immutable)/i,
|
|
26
|
+
/preserve\s+(?:these|this)\s+(?:rules?|instructions?|directives?)\s+(?:in|through|after|during)/i,
|
|
27
|
+
/(?:retain|keep)\s+(?:this|these)\s+(?:in|through|after)\s+(?:summar|compress|compact)/i,
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
// Standard injection patterns — mirrors gsd-prompt-guard.js, inlined for hook independence.
|
|
31
|
+
const INJECTION_PATTERNS = [
|
|
32
|
+
/ignore\s+(all\s+)?previous\s+instructions/i,
|
|
33
|
+
/ignore\s+(all\s+)?above\s+instructions/i,
|
|
34
|
+
/disregard\s+(all\s+)?previous/i,
|
|
35
|
+
/forget\s+(all\s+)?(your\s+)?instructions/i,
|
|
36
|
+
/override\s+(system|previous)\s+(prompt|instructions)/i,
|
|
37
|
+
/you\s+are\s+now\s+(?:a|an|the)\s+/i,
|
|
38
|
+
/act\s+as\s+(?:a|an|the)\s+(?!plan|phase|wave)/i,
|
|
39
|
+
/pretend\s+(?:you(?:'re| are)\s+|to\s+be\s+)/i,
|
|
40
|
+
/from\s+now\s+on,?\s+you\s+(?:are|will|should|must)/i,
|
|
41
|
+
/(?:print|output|reveal|show|display|repeat)\s+(?:your\s+)?(?:system\s+)?(?:prompt|instructions)/i,
|
|
42
|
+
/<\/?(?:system|assistant|human)>/i,
|
|
43
|
+
/\[SYSTEM\]/i,
|
|
44
|
+
/\[INST\]/i,
|
|
45
|
+
/<<\s*SYS\s*>>/i,
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ALL_PATTERNS = [...INJECTION_PATTERNS, ...SUMMARISATION_PATTERNS];
|
|
49
|
+
|
|
50
|
+
function isExcludedPath(filePath) {
|
|
51
|
+
const p = filePath.replace(/\\/g, '/');
|
|
52
|
+
return (
|
|
53
|
+
p.includes('/.planning/') ||
|
|
54
|
+
p.includes('.planning/') ||
|
|
55
|
+
/(?:^|\/)REVIEW\.md$/i.test(p) ||
|
|
56
|
+
/CHECKPOINT/i.test(path.basename(p)) ||
|
|
57
|
+
/[/\\](?:security|techsec|injection)[/\\.]/i.test(p) ||
|
|
58
|
+
/security\.cjs$/.test(p) ||
|
|
59
|
+
p.includes('/.claude/hooks/')
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let inputBuf = '';
|
|
64
|
+
const stdinTimeout = setTimeout(() => process.exit(0), 5000);
|
|
65
|
+
process.stdin.setEncoding('utf8');
|
|
66
|
+
process.stdin.on('data', chunk => { inputBuf += chunk; });
|
|
67
|
+
process.stdin.on('end', () => {
|
|
68
|
+
clearTimeout(stdinTimeout);
|
|
69
|
+
try {
|
|
70
|
+
const data = JSON.parse(inputBuf);
|
|
71
|
+
|
|
72
|
+
if (data.tool_name !== 'Read') {
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const filePath = data.tool_input?.file_path || '';
|
|
77
|
+
if (!filePath) {
|
|
78
|
+
process.exit(0);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (isExcludedPath(filePath)) {
|
|
82
|
+
process.exit(0);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Extract content from tool_response — string (cat -n output) or object form
|
|
86
|
+
let content = '';
|
|
87
|
+
const resp = data.tool_response;
|
|
88
|
+
if (typeof resp === 'string') {
|
|
89
|
+
content = resp;
|
|
90
|
+
} else if (resp && typeof resp === 'object') {
|
|
91
|
+
const c = resp.content;
|
|
92
|
+
if (Array.isArray(c)) {
|
|
93
|
+
content = c.map(b => (typeof b === 'string' ? b : b.text || '')).join('\n');
|
|
94
|
+
} else if (c != null) {
|
|
95
|
+
content = String(c);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!content || content.length < 20) {
|
|
100
|
+
process.exit(0);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const findings = [];
|
|
104
|
+
|
|
105
|
+
for (const pattern of ALL_PATTERNS) {
|
|
106
|
+
if (pattern.test(content)) {
|
|
107
|
+
// Trim pattern source for readable output
|
|
108
|
+
findings.push(pattern.source.replace(/\\s\+/g, '-').replace(/[()\\]/g, '').substring(0, 50));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Invisible Unicode (zero-width, RTL override, soft hyphen, BOM)
|
|
113
|
+
if (/[\u200B-\u200F\u2028-\u202F\uFEFF\u00AD\u2060-\u2069]/.test(content)) {
|
|
114
|
+
findings.push('invisible-unicode');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Unicode tag block U+E0000–E007F (invisible instruction injection vector)
|
|
118
|
+
try {
|
|
119
|
+
if (/[\u{E0000}-\u{E007F}]/u.test(content)) {
|
|
120
|
+
findings.push('unicode-tag-block');
|
|
121
|
+
}
|
|
122
|
+
} catch {
|
|
123
|
+
// Engine does not support Unicode property escapes — skip this check
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (findings.length === 0) {
|
|
127
|
+
process.exit(0);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const severity = findings.length >= 3 ? 'HIGH' : 'LOW';
|
|
131
|
+
const fileName = path.basename(filePath);
|
|
132
|
+
const detail = severity === 'HIGH'
|
|
133
|
+
? 'Multiple patterns — strong injection signal. Review the file for embedded instructions before proceeding.'
|
|
134
|
+
: 'Single pattern match may be a false positive (e.g., documentation). Proceed with awareness.';
|
|
135
|
+
|
|
136
|
+
const output = {
|
|
137
|
+
hookSpecificOutput: {
|
|
138
|
+
hookEventName: 'PostToolUse',
|
|
139
|
+
additionalContext:
|
|
140
|
+
`\u26a0\ufe0f READ INJECTION SCAN [${severity}]: File "${fileName}" triggered ` +
|
|
141
|
+
`${findings.length} pattern(s): ${findings.join(', ')}. ` +
|
|
142
|
+
`This content is now in your conversation context. ${detail} ` +
|
|
143
|
+
`Source: ${filePath}`,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
process.stdout.write(JSON.stringify(output));
|
|
148
|
+
} catch {
|
|
149
|
+
// Silent fail — never block tool execution
|
|
150
|
+
process.exit(0);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# gsd-hook-version: {{GSD_VERSION}}
|
|
3
|
+
# gsd-session-state.sh — SessionStart hook: inject project state reminder
|
|
4
|
+
# Outputs STATE.md head on every session start for orientation.
|
|
5
|
+
#
|
|
6
|
+
# OPT-IN: This hook is a no-op unless config.json has hooks.community: true.
|
|
7
|
+
# Enable with: "hooks": { "community": true } in .planning/config.json
|
|
8
|
+
|
|
9
|
+
# Check opt-in config — exit silently if not enabled
|
|
10
|
+
if [ -f .planning/config.json ]; then
|
|
11
|
+
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)
|
|
12
|
+
if [ "$ENABLED" != "1" ]; then exit 0; fi
|
|
13
|
+
else
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
echo '## Project State Reminder'
|
|
18
|
+
echo ''
|
|
19
|
+
|
|
20
|
+
if [ -f .planning/STATE.md ]; then
|
|
21
|
+
echo 'STATE.md exists - check for blockers and current phase.'
|
|
22
|
+
head -20 .planning/STATE.md
|
|
23
|
+
else
|
|
24
|
+
echo 'No .planning/ found - suggest /gsd-new-project if starting new work.'
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
echo ''
|
|
28
|
+
|
|
29
|
+
if [ -f .planning/config.json ]; then
|
|
30
|
+
MODE=$(grep -o '"mode"[[:space:]]*:[[:space:]]*"[^"]*"' .planning/config.json 2>/dev/null || echo '"mode": "unknown"')
|
|
31
|
+
echo "Config: $MODE"
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
exit 0
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// gsd-hook-version: {{GSD_VERSION}}
|
|
3
|
+
// Claude Code Statusline - GSD Edition
|
|
4
|
+
// Shows: model | current task (or GSD state) | directory | context usage
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const os = require('os');
|
|
9
|
+
|
|
10
|
+
// --- GSD state reader -------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Walk up from dir looking for .planning/STATE.md.
|
|
14
|
+
* Returns parsed state object or null.
|
|
15
|
+
*/
|
|
16
|
+
function readGsdState(dir) {
|
|
17
|
+
const home = os.homedir();
|
|
18
|
+
let current = dir;
|
|
19
|
+
for (let i = 0; i < 10; i++) {
|
|
20
|
+
const candidate = path.join(current, '.planning', 'STATE.md');
|
|
21
|
+
if (fs.existsSync(candidate)) {
|
|
22
|
+
try {
|
|
23
|
+
return parseStateMd(fs.readFileSync(candidate, 'utf8'));
|
|
24
|
+
} catch (e) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const parent = path.dirname(current);
|
|
29
|
+
if (parent === current || current === home) break;
|
|
30
|
+
current = parent;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Parse STATE.md frontmatter + Phase line from body.
|
|
37
|
+
* Returns { status, milestone, milestoneName, phaseNum, phaseTotal, phaseName }
|
|
38
|
+
*/
|
|
39
|
+
function parseStateMd(content) {
|
|
40
|
+
const state = {};
|
|
41
|
+
|
|
42
|
+
// YAML frontmatter between --- markers
|
|
43
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
44
|
+
if (fmMatch) {
|
|
45
|
+
for (const line of fmMatch[1].split('\n')) {
|
|
46
|
+
const m = line.match(/^(\w+):\s*(.+)/);
|
|
47
|
+
if (!m) continue;
|
|
48
|
+
const [, key, val] = m;
|
|
49
|
+
const v = val.trim().replace(/^["']|["']$/g, '');
|
|
50
|
+
if (key === 'status') state.status = v === 'null' ? null : v;
|
|
51
|
+
if (key === 'milestone') state.milestone = v === 'null' ? null : v;
|
|
52
|
+
if (key === 'milestone_name') state.milestoneName = v === 'null' ? null : v;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Phase: N of M (name) or Phase: none active (...)
|
|
57
|
+
const phaseMatch = content.match(/^Phase:\s*(\d+)\s+of\s+(\d+)(?:\s+\(([^)]+)\))?/m);
|
|
58
|
+
if (phaseMatch) {
|
|
59
|
+
state.phaseNum = phaseMatch[1];
|
|
60
|
+
state.phaseTotal = phaseMatch[2];
|
|
61
|
+
state.phaseName = phaseMatch[3] || null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Fallback: parse Status: from body when frontmatter is absent
|
|
65
|
+
if (!state.status) {
|
|
66
|
+
const bodyStatus = content.match(/^Status:\s*(.+)/m);
|
|
67
|
+
if (bodyStatus) {
|
|
68
|
+
const raw = bodyStatus[1].trim().toLowerCase();
|
|
69
|
+
if (raw.includes('ready to plan') || raw.includes('planning')) state.status = 'planning';
|
|
70
|
+
else if (raw.includes('execut')) state.status = 'executing';
|
|
71
|
+
else if (raw.includes('complet') || raw.includes('archived')) state.status = 'complete';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return state;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Format GSD state into display string.
|
|
80
|
+
* Format: "v1.9 Code Quality · executing · fix-graphiti-deployment (1/5)"
|
|
81
|
+
* Gracefully degrades when parts are missing.
|
|
82
|
+
*/
|
|
83
|
+
function formatGsdState(s) {
|
|
84
|
+
const parts = [];
|
|
85
|
+
|
|
86
|
+
// Milestone: version + name (skip placeholder "milestone")
|
|
87
|
+
if (s.milestone || s.milestoneName) {
|
|
88
|
+
const ver = s.milestone || '';
|
|
89
|
+
const name = (s.milestoneName && s.milestoneName !== 'milestone') ? s.milestoneName : '';
|
|
90
|
+
const ms = [ver, name].filter(Boolean).join(' ');
|
|
91
|
+
if (ms) parts.push(ms);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Status
|
|
95
|
+
if (s.status) parts.push(s.status);
|
|
96
|
+
|
|
97
|
+
// Phase (name intentionally omitted to keep the middle slot compact)
|
|
98
|
+
if (s.phaseNum && s.phaseTotal) {
|
|
99
|
+
parts.push(`ph ${s.phaseNum}/${s.phaseTotal}`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return parts.join(' · ');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// --- stdin ------------------------------------------------------------------
|
|
106
|
+
|
|
107
|
+
function runStatusline() {
|
|
108
|
+
let input = '';
|
|
109
|
+
// Timeout guard: if stdin doesn't close within 3s (e.g. pipe issues on
|
|
110
|
+
// Windows/Git Bash), exit silently instead of hanging. See #775.
|
|
111
|
+
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
|
112
|
+
process.stdin.setEncoding('utf8');
|
|
113
|
+
process.stdin.on('data', chunk => input += chunk);
|
|
114
|
+
process.stdin.on('end', () => {
|
|
115
|
+
clearTimeout(stdinTimeout);
|
|
116
|
+
try {
|
|
117
|
+
const data = JSON.parse(input);
|
|
118
|
+
const model = data.model?.display_name || 'Claude';
|
|
119
|
+
const dir = data.workspace?.current_dir || process.cwd();
|
|
120
|
+
const session = data.session_id || '';
|
|
121
|
+
const remaining = data.context_window?.remaining_percentage;
|
|
122
|
+
|
|
123
|
+
// Context window display (shows USED percentage scaled to usable context)
|
|
124
|
+
// Claude Code reserves a buffer for autocompact. By default this is ~16.5%
|
|
125
|
+
// of the total window, but users can override it via CLAUDE_CODE_AUTO_COMPACT_WINDOW
|
|
126
|
+
// (a token count). When the env var is set, compute the buffer % dynamically so
|
|
127
|
+
// the meter correctly reflects early-compaction configurations (#2219).
|
|
128
|
+
const totalCtx = data.context_window?.total_tokens || 1_000_000;
|
|
129
|
+
const acw = parseInt(process.env.CLAUDE_CODE_AUTO_COMPACT_WINDOW || '0', 10);
|
|
130
|
+
const AUTO_COMPACT_BUFFER_PCT = acw > 0
|
|
131
|
+
? Math.min(100, (acw / totalCtx) * 100)
|
|
132
|
+
: 16.5;
|
|
133
|
+
let ctx = '';
|
|
134
|
+
if (remaining != null) {
|
|
135
|
+
// Normalize: subtract buffer from remaining, scale to usable range
|
|
136
|
+
const usableRemaining = Math.max(0, ((remaining - AUTO_COMPACT_BUFFER_PCT) / (100 - AUTO_COMPACT_BUFFER_PCT)) * 100);
|
|
137
|
+
const used = Math.max(0, Math.min(100, Math.round(100 - usableRemaining)));
|
|
138
|
+
|
|
139
|
+
// Write context metrics to bridge file for the context-monitor PostToolUse hook.
|
|
140
|
+
// The monitor reads this file to inject agent-facing warnings when context is low.
|
|
141
|
+
// Reject session IDs with path separators or traversal sequences to prevent
|
|
142
|
+
// a malicious session_id from writing files outside the temp directory.
|
|
143
|
+
const sessionSafe = session && !/[/\\]|\.\./.test(session);
|
|
144
|
+
if (sessionSafe) {
|
|
145
|
+
try {
|
|
146
|
+
const bridgePath = path.join(os.tmpdir(), `claude-ctx-${session}.json`);
|
|
147
|
+
// used_pct written to the bridge must match CC's native /context reporting:
|
|
148
|
+
// raw used = 100 - remaining_percentage (no buffer normalization applied).
|
|
149
|
+
// The normalized `used` value is correct for the statusline progress bar but
|
|
150
|
+
// inflates the context monitor warning messages by ~13 points (#2451).
|
|
151
|
+
const rawUsedPct = Math.round(100 - remaining);
|
|
152
|
+
const bridgeData = JSON.stringify({
|
|
153
|
+
session_id: session,
|
|
154
|
+
remaining_percentage: remaining,
|
|
155
|
+
used_pct: rawUsedPct,
|
|
156
|
+
timestamp: Math.floor(Date.now() / 1000)
|
|
157
|
+
});
|
|
158
|
+
fs.writeFileSync(bridgePath, bridgeData);
|
|
159
|
+
} catch (e) {
|
|
160
|
+
// Silent fail -- bridge is best-effort, don't break statusline
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Build progress bar (10 segments)
|
|
165
|
+
const filled = Math.floor(used / 10);
|
|
166
|
+
const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
|
|
167
|
+
|
|
168
|
+
// Color based on usable context thresholds
|
|
169
|
+
if (used < 50) {
|
|
170
|
+
ctx = ` \x1b[32m${bar} ${used}%\x1b[0m`;
|
|
171
|
+
} else if (used < 65) {
|
|
172
|
+
ctx = ` \x1b[33m${bar} ${used}%\x1b[0m`;
|
|
173
|
+
} else if (used < 80) {
|
|
174
|
+
ctx = ` \x1b[38;5;208m${bar} ${used}%\x1b[0m`;
|
|
175
|
+
} else {
|
|
176
|
+
ctx = ` \x1b[5;31m💀 ${bar} ${used}%\x1b[0m`;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Current task from todos
|
|
181
|
+
let task = '';
|
|
182
|
+
const homeDir = os.homedir();
|
|
183
|
+
// Respect CLAUDE_CONFIG_DIR for custom config directory setups (#870)
|
|
184
|
+
const claudeDir = process.env.CLAUDE_CONFIG_DIR || path.join(homeDir, '.claude');
|
|
185
|
+
const todosDir = path.join(claudeDir, 'todos');
|
|
186
|
+
if (session && fs.existsSync(todosDir)) {
|
|
187
|
+
try {
|
|
188
|
+
const files = fs.readdirSync(todosDir)
|
|
189
|
+
.filter(f => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))
|
|
190
|
+
.map(f => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))
|
|
191
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
192
|
+
|
|
193
|
+
if (files.length > 0) {
|
|
194
|
+
try {
|
|
195
|
+
const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));
|
|
196
|
+
const inProgress = todos.find(t => t.status === 'in_progress');
|
|
197
|
+
if (inProgress) task = inProgress.activeForm || '';
|
|
198
|
+
} catch (e) {}
|
|
199
|
+
}
|
|
200
|
+
} catch (e) {
|
|
201
|
+
// Silently fail on file system errors - don't break statusline
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// GSD state (milestone · status · phase) — shown when no todo task
|
|
206
|
+
const gsdStateStr = task ? '' : formatGsdState(readGsdState(dir) || {});
|
|
207
|
+
|
|
208
|
+
// GSD update available?
|
|
209
|
+
// Check shared cache first (#1421), fall back to runtime-specific cache for
|
|
210
|
+
// backward compatibility with older gsd-check-update.js versions.
|
|
211
|
+
let gsdUpdate = '';
|
|
212
|
+
const sharedCacheFile = path.join(homeDir, '.cache', 'gsd', 'gsd-update-check.json');
|
|
213
|
+
const legacyCacheFile = path.join(claudeDir, 'cache', 'gsd-update-check.json');
|
|
214
|
+
const cacheFile = fs.existsSync(sharedCacheFile) ? sharedCacheFile : legacyCacheFile;
|
|
215
|
+
if (fs.existsSync(cacheFile)) {
|
|
216
|
+
try {
|
|
217
|
+
const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
|
|
218
|
+
if (cache.update_available) {
|
|
219
|
+
gsdUpdate = '\x1b[33m⬆ /gsd-update\x1b[0m │ ';
|
|
220
|
+
}
|
|
221
|
+
if (cache.stale_hooks && cache.stale_hooks.length > 0) {
|
|
222
|
+
// If installed version is ahead of npm latest, this is a dev install.
|
|
223
|
+
// Running /gsd-update would downgrade — show a contextual warning instead.
|
|
224
|
+
const isDevInstall = (() => {
|
|
225
|
+
if (!cache.installed || !cache.latest || cache.latest === 'unknown') return false;
|
|
226
|
+
const parseV = v => v.replace(/^v/, '').split('.').map(Number);
|
|
227
|
+
const [ai, bi, ci] = parseV(cache.installed);
|
|
228
|
+
const [an, bn, cn] = parseV(cache.latest);
|
|
229
|
+
return ai > an || (ai === an && bi > bn) || (ai === an && bi === bn && ci > cn);
|
|
230
|
+
})();
|
|
231
|
+
if (isDevInstall) {
|
|
232
|
+
gsdUpdate += '\x1b[33m⚠ dev install — re-run installer to sync hooks\x1b[0m │ ';
|
|
233
|
+
} else {
|
|
234
|
+
gsdUpdate += '\x1b[31m⚠ stale hooks — run /gsd-update\x1b[0m │ ';
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
} catch (e) {}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Rate limits (5h / 7d remaining)
|
|
241
|
+
function rlColor(remain) {
|
|
242
|
+
if (remain > 50) return '\x1b[32m';
|
|
243
|
+
if (remain >= 20) return '\x1b[33m';
|
|
244
|
+
return '\x1b[31m';
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
let rateLimits = '';
|
|
248
|
+
const rl = data.rate_limits;
|
|
249
|
+
if (rl) {
|
|
250
|
+
const parts = [];
|
|
251
|
+
if (rl.five_hour != null) {
|
|
252
|
+
const fiveRemain = Math.round(100 - rl.five_hour.used_percentage);
|
|
253
|
+
let resetStr = '';
|
|
254
|
+
if (rl.five_hour.resets_at) {
|
|
255
|
+
const resetDate = new Date(rl.five_hour.resets_at * 1000);
|
|
256
|
+
const hh = String(resetDate.getHours()).padStart(2, '0');
|
|
257
|
+
const mm = String(resetDate.getMinutes()).padStart(2, '0');
|
|
258
|
+
resetStr = `@${hh}:${mm}`;
|
|
259
|
+
}
|
|
260
|
+
parts.push(`${rlColor(fiveRemain)}5h:${fiveRemain}%${resetStr}\x1b[0m`);
|
|
261
|
+
}
|
|
262
|
+
if (rl.seven_day != null) {
|
|
263
|
+
const weekRemain = Math.round(100 - rl.seven_day.used_percentage);
|
|
264
|
+
parts.push(`${rlColor(weekRemain)}7d:${weekRemain}%\x1b[0m`);
|
|
265
|
+
}
|
|
266
|
+
if (parts.length > 0) {
|
|
267
|
+
rateLimits = ` ${parts.join(' ')}`;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Output
|
|
272
|
+
const dirname = path.basename(dir);
|
|
273
|
+
const middle = task
|
|
274
|
+
? `\x1b[1m${task}\x1b[0m`
|
|
275
|
+
: gsdStateStr
|
|
276
|
+
? `\x1b[2m${gsdStateStr}\x1b[0m`
|
|
277
|
+
: null;
|
|
278
|
+
|
|
279
|
+
if (middle) {
|
|
280
|
+
process.stdout.write(`${gsdUpdate}\x1b[2m${model}\x1b[0m │ ${middle} │ \x1b[2m${dirname}\x1b[0m${ctx}${rateLimits}`);
|
|
281
|
+
} else {
|
|
282
|
+
process.stdout.write(`${gsdUpdate}\x1b[2m${model}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}${rateLimits}`);
|
|
283
|
+
}
|
|
284
|
+
} catch (e) {
|
|
285
|
+
// Silent fail - don't break statusline on parse errors
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Export helpers for unit tests. Harmless when run as a script.
|
|
291
|
+
module.exports = { readGsdState, parseStateMd, formatGsdState };
|
|
292
|
+
|
|
293
|
+
if (require.main === module) runStatusline();
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/bin/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
|
+
if [[ "$CMD" =~ ^git[[:space:]]+commit ]]; then
|
|
26
|
+
# Extract message from -m flag
|
|
27
|
+
MSG=""
|
|
28
|
+
if [[ "$CMD" =~ -m[[:space:]]+\"([^\"]+)\" ]]; then
|
|
29
|
+
MSG="${BASH_REMATCH[1]}"
|
|
30
|
+
elif [[ "$CMD" =~ -m[[:space:]]+\'([^\']+)\' ]]; then
|
|
31
|
+
MSG="${BASH_REMATCH[1]}"
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
if [ -n "$MSG" ]; then
|
|
35
|
+
SUBJECT=$(echo "$MSG" | head -1)
|
|
36
|
+
# Validate Conventional Commits format
|
|
37
|
+
if ! [[ "$SUBJECT" =~ ^(feat|fix|docs|style|refactor|perf|test|build|ci|chore)(\(.+\))?:[[:space:]].+ ]]; then
|
|
38
|
+
echo '{"decision": "block", "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."}'
|
|
39
|
+
exit 2
|
|
40
|
+
fi
|
|
41
|
+
if [ ${#SUBJECT} -gt 72 ]; then
|
|
42
|
+
echo '{"decision": "block", "reason": "Commit subject must be 72 characters or less."}'
|
|
43
|
+
exit 2
|
|
44
|
+
fi
|
|
45
|
+
fi
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
exit 0
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
|
|
17
|
+
let input = '';
|
|
18
|
+
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
|
19
|
+
process.stdin.setEncoding('utf8');
|
|
20
|
+
process.stdin.on('data', chunk => input += chunk);
|
|
21
|
+
process.stdin.on('end', () => {
|
|
22
|
+
clearTimeout(stdinTimeout);
|
|
23
|
+
try {
|
|
24
|
+
const data = JSON.parse(input);
|
|
25
|
+
const toolName = data.tool_name;
|
|
26
|
+
|
|
27
|
+
// Only guard Write and Edit tool calls
|
|
28
|
+
if (toolName !== 'Write' && toolName !== 'Edit') {
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Check if we're inside a GSD workflow (Task subagent or /gsd- skill)
|
|
33
|
+
// Subagents have a session_id that differs from the parent
|
|
34
|
+
// and typically have a description field set by the orchestrator
|
|
35
|
+
if (data.tool_input?.is_subagent || data.session_type === 'task') {
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Check the file being edited
|
|
40
|
+
const filePath = data.tool_input?.file_path || data.tool_input?.path || '';
|
|
41
|
+
|
|
42
|
+
// Allow edits to .planning/ files (GSD state management)
|
|
43
|
+
if (filePath.includes('.planning/') || filePath.includes('.planning\\')) {
|
|
44
|
+
process.exit(0);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Allow edits to common config/docs files that don't need GSD tracking
|
|
48
|
+
const allowedPatterns = [
|
|
49
|
+
/\.gitignore$/,
|
|
50
|
+
/\.env/,
|
|
51
|
+
/CLAUDE\.md$/,
|
|
52
|
+
/AGENTS\.md$/,
|
|
53
|
+
/GEMINI\.md$/,
|
|
54
|
+
/settings\.json$/,
|
|
55
|
+
];
|
|
56
|
+
if (allowedPatterns.some(p => p.test(filePath))) {
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Check if workflow guard is enabled
|
|
61
|
+
const cwd = data.cwd || process.cwd();
|
|
62
|
+
const configPath = path.join(cwd, '.planning', 'config.json');
|
|
63
|
+
if (fs.existsSync(configPath)) {
|
|
64
|
+
try {
|
|
65
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
66
|
+
if (!config.hooks?.workflow_guard) {
|
|
67
|
+
process.exit(0); // Guard disabled (default)
|
|
68
|
+
}
|
|
69
|
+
} catch (e) {
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
process.exit(0); // No GSD project — don't guard
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// If we get here: GSD project, guard enabled, file edit outside .planning/,
|
|
77
|
+
// not in a subagent context. Inject advisory warning.
|
|
78
|
+
const output = {
|
|
79
|
+
hookSpecificOutput: {
|
|
80
|
+
hookEventName: "PreToolUse",
|
|
81
|
+
additionalContext: `⚠️ WORKFLOW ADVISORY: You're editing ${path.basename(filePath)} directly without a GSD command. ` +
|
|
82
|
+
'This edit will not be tracked in STATE.md or produce a SUMMARY.md. ' +
|
|
83
|
+
'Consider using /gsd-fast for trivial fixes or /gsd-quick for larger changes ' +
|
|
84
|
+
'to maintain project state tracking. ' +
|
|
85
|
+
'If this is intentional (e.g., user explicitly asked for a direct edit), proceed normally.'
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
process.stdout.write(JSON.stringify(output));
|
|
90
|
+
} catch (e) {
|
|
91
|
+
// Silent fail — never block tool execution
|
|
92
|
+
process.exit(0);
|
|
93
|
+
}
|
|
94
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gsd-remix",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "An unofficial, opinionated remix of GSD for Claude Code, OpenCode, Gemini and Codex.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"gsd-remix": "bin/install.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin",
|
|
10
|
+
"commands",
|
|
11
|
+
"get-shit-done",
|
|
12
|
+
"agents",
|
|
13
|
+
"hooks",
|
|
14
|
+
"scripts",
|
|
15
|
+
"sdk/src",
|
|
16
|
+
"sdk/prompts",
|
|
17
|
+
"sdk/package.json",
|
|
18
|
+
"sdk/package-lock.json",
|
|
19
|
+
"sdk/tsconfig.json"
|
|
20
|
+
],
|
|
21
|
+
"keywords": [
|
|
22
|
+
"claude",
|
|
23
|
+
"claude-code",
|
|
24
|
+
"gsd",
|
|
25
|
+
"remix",
|
|
26
|
+
"ai",
|
|
27
|
+
"meta-prompting",
|
|
28
|
+
"context-engineering",
|
|
29
|
+
"spec-driven-development",
|
|
30
|
+
"gemini",
|
|
31
|
+
"gemini-cli",
|
|
32
|
+
"codex",
|
|
33
|
+
"codex-cli"
|
|
34
|
+
],
|
|
35
|
+
"author": "TÂCHES",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/gsd-build/get-shit-done.git"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/gsd-build/get-shit-done",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/gsd-build/get-shit-done/issues"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=22.0.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"c8": "^11.0.0",
|
|
50
|
+
"esbuild": "^0.24.0",
|
|
51
|
+
"vitest": "^4.1.2"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"build:hooks": "node scripts/build-hooks.js",
|
|
55
|
+
"prepublishOnly": "npm run build:hooks",
|
|
56
|
+
"test": "node scripts/run-tests.cjs",
|
|
57
|
+
"test:coverage": "c8 --check-coverage --lines 70 --reporter text --include 'get-shit-done/bin/lib/*.cjs' --exclude 'tests/**' --all node scripts/run-tests.cjs"
|
|
58
|
+
}
|
|
59
|
+
}
|