@therocketcode/gsd-core 1.4.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.
Files changed (568) hide show
  1. package/.claude-plugin/plugin.json +23 -0
  2. package/GEMINI.md +53 -0
  3. package/LICENSE +21 -0
  4. package/README.ja-JP.md +125 -0
  5. package/README.ko-KR.md +125 -0
  6. package/README.md +144 -0
  7. package/README.pt-BR.md +125 -0
  8. package/README.zh-CN.md +125 -0
  9. package/agents/gsd-advisor-researcher.md +108 -0
  10. package/agents/gsd-ai-researcher.md +114 -0
  11. package/agents/gsd-assumptions-analyzer.md +105 -0
  12. package/agents/gsd-code-fixer.md +668 -0
  13. package/agents/gsd-code-reviewer.md +387 -0
  14. package/agents/gsd-codebase-mapper.md +853 -0
  15. package/agents/gsd-debug-session-manager.md +314 -0
  16. package/agents/gsd-debugger.md +1452 -0
  17. package/agents/gsd-doc-classifier.md +168 -0
  18. package/agents/gsd-doc-synthesizer.md +204 -0
  19. package/agents/gsd-doc-verifier.md +217 -0
  20. package/agents/gsd-doc-writer.md +616 -0
  21. package/agents/gsd-domain-researcher.md +147 -0
  22. package/agents/gsd-eval-auditor.md +191 -0
  23. package/agents/gsd-eval-planner.md +154 -0
  24. package/agents/gsd-executor.md +785 -0
  25. package/agents/gsd-framework-selector.md +160 -0
  26. package/agents/gsd-integration-checker.md +470 -0
  27. package/agents/gsd-intel-updater.md +342 -0
  28. package/agents/gsd-nyquist-auditor.md +203 -0
  29. package/agents/gsd-pattern-mapper.md +335 -0
  30. package/agents/gsd-phase-researcher.md +867 -0
  31. package/agents/gsd-plan-checker.md +978 -0
  32. package/agents/gsd-planner.md +1204 -0
  33. package/agents/gsd-project-researcher.md +611 -0
  34. package/agents/gsd-research-synthesizer.md +259 -0
  35. package/agents/gsd-roadmapper.md +688 -0
  36. package/agents/gsd-security-auditor.md +155 -0
  37. package/agents/gsd-ui-auditor.md +495 -0
  38. package/agents/gsd-ui-checker.md +309 -0
  39. package/agents/gsd-ui-researcher.md +374 -0
  40. package/agents/gsd-user-profiler.md +171 -0
  41. package/agents/gsd-verifier.md +923 -0
  42. package/assets/gsd-logo-2000-transparent.png +0 -0
  43. package/assets/gsd-logo-2000-transparent.svg +17 -0
  44. package/assets/gsd-logo-2000.png +0 -0
  45. package/assets/gsd-logo-2000.svg +21 -0
  46. package/assets/terminal.svg +68 -0
  47. package/bin/install.js +12726 -0
  48. package/bin/lib/ui-safety-gate.cjs +107 -0
  49. package/commands/gsd/add-tests.md +42 -0
  50. package/commands/gsd/ai-integration-phase.md +37 -0
  51. package/commands/gsd/audit-fix.md +34 -0
  52. package/commands/gsd/audit-milestone.md +37 -0
  53. package/commands/gsd/audit-uat.md +24 -0
  54. package/commands/gsd/autonomous.md +48 -0
  55. package/commands/gsd/capture.md +62 -0
  56. package/commands/gsd/cleanup.md +24 -0
  57. package/commands/gsd/code-review.md +59 -0
  58. package/commands/gsd/complete-milestone.md +143 -0
  59. package/commands/gsd/config.md +56 -0
  60. package/commands/gsd/debug.md +52 -0
  61. package/commands/gsd/discover-product.md +65 -0
  62. package/commands/gsd/discuss-phase.md +77 -0
  63. package/commands/gsd/docs-update.md +49 -0
  64. package/commands/gsd/eval-review.md +33 -0
  65. package/commands/gsd/execute-phase.md +66 -0
  66. package/commands/gsd/explore.md +27 -0
  67. package/commands/gsd/extract-learnings.md +23 -0
  68. package/commands/gsd/fast.md +31 -0
  69. package/commands/gsd/forensics.md +57 -0
  70. package/commands/gsd/graphify.md +204 -0
  71. package/commands/gsd/health.md +31 -0
  72. package/commands/gsd/help.md +28 -0
  73. package/commands/gsd/import.md +45 -0
  74. package/commands/gsd/inbox.md +39 -0
  75. package/commands/gsd/ingest-docs.md +42 -0
  76. package/commands/gsd/manager.md +45 -0
  77. package/commands/gsd/map-codebase.md +83 -0
  78. package/commands/gsd/milestone-summary.md +51 -0
  79. package/commands/gsd/model-domain.md +65 -0
  80. package/commands/gsd/mvp-phase.md +45 -0
  81. package/commands/gsd/new-milestone.md +45 -0
  82. package/commands/gsd/new-project.md +47 -0
  83. package/commands/gsd/ns-context.md +23 -0
  84. package/commands/gsd/ns-ideate.md +24 -0
  85. package/commands/gsd/ns-manage.md +29 -0
  86. package/commands/gsd/ns-project.md +22 -0
  87. package/commands/gsd/ns-review.md +26 -0
  88. package/commands/gsd/ns-workflow.md +28 -0
  89. package/commands/gsd/pause-work.md +43 -0
  90. package/commands/gsd/phase.md +56 -0
  91. package/commands/gsd/plan-phase.md +64 -0
  92. package/commands/gsd/plan-review-convergence.md +59 -0
  93. package/commands/gsd/pr-branch.md +26 -0
  94. package/commands/gsd/profile-user.md +46 -0
  95. package/commands/gsd/progress.md +48 -0
  96. package/commands/gsd/quick.md +174 -0
  97. package/commands/gsd/recommend-architecture.md +64 -0
  98. package/commands/gsd/resume-work.md +30 -0
  99. package/commands/gsd/review-backlog.md +63 -0
  100. package/commands/gsd/review.md +42 -0
  101. package/commands/gsd/secure-phase.md +36 -0
  102. package/commands/gsd/settings.md +29 -0
  103. package/commands/gsd/ship.md +24 -0
  104. package/commands/gsd/sketch.md +60 -0
  105. package/commands/gsd/spec-phase.md +63 -0
  106. package/commands/gsd/spike.md +57 -0
  107. package/commands/gsd/stats.md +20 -0
  108. package/commands/gsd/surface.md +155 -0
  109. package/commands/gsd/testing-strategy.md +65 -0
  110. package/commands/gsd/thread.md +24 -0
  111. package/commands/gsd/ui-phase.md +35 -0
  112. package/commands/gsd/ui-review.md +33 -0
  113. package/commands/gsd/ultraplan-phase.md +34 -0
  114. package/commands/gsd/undo.md +35 -0
  115. package/commands/gsd/update.md +49 -0
  116. package/commands/gsd/validate-phase.md +36 -0
  117. package/commands/gsd/verify-work.md +39 -0
  118. package/commands/gsd/workspace.md +52 -0
  119. package/commands/gsd/workstreams.md +70 -0
  120. package/gemini-extension.json +6 -0
  121. package/gsd-core/bin/check-latest-version.cjs +161 -0
  122. package/gsd-core/bin/gsd-tools.cjs +1928 -0
  123. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  124. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  125. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  126. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  127. package/gsd-core/bin/lib/audit.cjs +743 -0
  128. package/gsd-core/bin/lib/check-command-router.cjs +343 -0
  129. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  130. package/gsd-core/bin/lib/cli-exit.cjs +42 -0
  131. package/gsd-core/bin/lib/clock.cjs +95 -0
  132. package/gsd-core/bin/lib/clusters.cjs +132 -0
  133. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  134. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  135. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  136. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  137. package/gsd-core/bin/lib/commands.cjs +1203 -0
  138. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  139. package/gsd-core/bin/lib/config-types.cjs +19 -0
  140. package/gsd-core/bin/lib/config.cjs +738 -0
  141. package/gsd-core/bin/lib/configuration.cjs +239 -0
  142. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  143. package/gsd-core/bin/lib/core.cjs +2051 -0
  144. package/gsd-core/bin/lib/decisions.cjs +118 -0
  145. package/gsd-core/bin/lib/docs.cjs +252 -0
  146. package/gsd-core/bin/lib/drift.cjs +364 -0
  147. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  148. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  149. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  150. package/gsd-core/bin/lib/graphify.cjs +496 -0
  151. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  152. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  153. package/gsd-core/bin/lib/init.cjs +1815 -0
  154. package/gsd-core/bin/lib/install-profiles.cjs +584 -0
  155. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  156. package/gsd-core/bin/lib/installer-migration-report.cjs +350 -0
  157. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  158. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  159. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  160. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  161. package/gsd-core/bin/lib/installer-migrations.cjs +823 -0
  162. package/gsd-core/bin/lib/intel.cjs +590 -0
  163. package/gsd-core/bin/lib/learnings.cjs +270 -0
  164. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  165. package/gsd-core/bin/lib/milestone.cjs +373 -0
  166. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  167. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  168. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  169. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  170. package/gsd-core/bin/lib/observability/redaction.cjs +48 -0
  171. package/gsd-core/bin/lib/package-identity.cjs +35 -0
  172. package/gsd-core/bin/lib/package-legitimacy.cjs +368 -0
  173. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  174. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  175. package/gsd-core/bin/lib/phase.cjs +1307 -0
  176. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  177. package/gsd-core/bin/lib/plan-scan.cjs +91 -0
  178. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  179. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  180. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  181. package/gsd-core/bin/lib/project-root.cjs +119 -0
  182. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  183. package/gsd-core/bin/lib/research-provider.cjs +137 -0
  184. package/gsd-core/bin/lib/research-store.cjs +167 -0
  185. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  186. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  187. package/gsd-core/bin/lib/roadmap-upgrade.cjs +476 -0
  188. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  189. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +312 -0
  190. package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +56 -0
  191. package/gsd-core/bin/lib/runtime-homes.cjs +190 -0
  192. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  193. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  194. package/gsd-core/bin/lib/schema-detect.cjs +159 -0
  195. package/gsd-core/bin/lib/secrets.cjs +34 -0
  196. package/gsd-core/bin/lib/security.cjs +480 -0
  197. package/gsd-core/bin/lib/semver-compare.cjs +42 -0
  198. package/gsd-core/bin/lib/shell-command-projection.cjs +533 -0
  199. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  200. package/gsd-core/bin/lib/state-document.cjs +259 -0
  201. package/gsd-core/bin/lib/state.cjs +2010 -0
  202. package/gsd-core/bin/lib/surface.cjs +449 -0
  203. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  204. package/gsd-core/bin/lib/template.cjs +237 -0
  205. package/gsd-core/bin/lib/uat.cjs +297 -0
  206. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  207. package/gsd-core/bin/lib/update-context.cjs +218 -0
  208. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  209. package/gsd-core/bin/lib/validate.cjs +112 -0
  210. package/gsd-core/bin/lib/verification-command-router.cjs +31 -0
  211. package/gsd-core/bin/lib/verification.cjs +193 -0
  212. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  213. package/gsd-core/bin/lib/verify.cjs +1451 -0
  214. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +81 -0
  215. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  216. package/gsd-core/bin/lib/workstream-name-policy.cjs +91 -0
  217. package/gsd-core/bin/lib/workstream.cjs +380 -0
  218. package/gsd-core/bin/lib/worktree-base-ref.cjs +325 -0
  219. package/gsd-core/bin/lib/worktree-safety.cjs +943 -0
  220. package/gsd-core/bin/shared/config-defaults.manifest.json +98 -0
  221. package/gsd-core/bin/shared/config-schema.manifest.json +192 -0
  222. package/gsd-core/bin/shared/model-catalog.json +149 -0
  223. package/gsd-core/bin/shared/runtime-aliases.manifest.json +75 -0
  224. package/gsd-core/bin/verify-reapply-patches.cjs +349 -0
  225. package/gsd-core/contexts/dev.md +21 -0
  226. package/gsd-core/contexts/research.md +22 -0
  227. package/gsd-core/contexts/review.md +23 -0
  228. package/gsd-core/references/agent-contracts.md +79 -0
  229. package/gsd-core/references/ai-evals.md +156 -0
  230. package/gsd-core/references/ai-frameworks.md +186 -0
  231. package/gsd-core/references/architecture-decision.md +74 -0
  232. package/gsd-core/references/artifact-types.md +131 -0
  233. package/gsd-core/references/auth-in-tests.md +91 -0
  234. package/gsd-core/references/autonomous-smart-discuss.md +277 -0
  235. package/gsd-core/references/checkpoints.md +814 -0
  236. package/gsd-core/references/common-bug-patterns.md +114 -0
  237. package/gsd-core/references/context-budget.md +85 -0
  238. package/gsd-core/references/continuation-format.md +253 -0
  239. package/gsd-core/references/db-test-isolation.md +54 -0
  240. package/gsd-core/references/debugger-philosophy.md +76 -0
  241. package/gsd-core/references/decimal-phase-calculation.md +64 -0
  242. package/gsd-core/references/doc-conflict-engine.md +91 -0
  243. package/gsd-core/references/domain-modeling.md +80 -0
  244. package/gsd-core/references/domain-probes.md +125 -0
  245. package/gsd-core/references/e2e-tiering.md +35 -0
  246. package/gsd-core/references/execute-mvp-tdd.md +81 -0
  247. package/gsd-core/references/executor-examples.md +110 -0
  248. package/gsd-core/references/few-shot-examples/plan-checker.md +73 -0
  249. package/gsd-core/references/few-shot-examples/verifier.md +109 -0
  250. package/gsd-core/references/flaky-test-checklist.md +22 -0
  251. package/gsd-core/references/gate-prompts.md +100 -0
  252. package/gsd-core/references/gates.md +70 -0
  253. package/gsd-core/references/git-integration.md +298 -0
  254. package/gsd-core/references/git-planning-commit.md +40 -0
  255. package/gsd-core/references/ios-scaffold.md +123 -0
  256. package/gsd-core/references/mandatory-initial-read.md +2 -0
  257. package/gsd-core/references/model-profile-resolution.md +38 -0
  258. package/gsd-core/references/model-profiles.md +245 -0
  259. package/gsd-core/references/mvp-concepts.md +49 -0
  260. package/gsd-core/references/phase-argument-parsing.md +61 -0
  261. package/gsd-core/references/planner-antipatterns.md +89 -0
  262. package/gsd-core/references/planner-chunked.md +49 -0
  263. package/gsd-core/references/planner-gap-closure.md +62 -0
  264. package/gsd-core/references/planner-graphify-auto-update.md +67 -0
  265. package/gsd-core/references/planner-human-verify-mode.md +57 -0
  266. package/gsd-core/references/planner-interface-context.md +62 -0
  267. package/gsd-core/references/planner-load-graph-context.md +36 -0
  268. package/gsd-core/references/planner-mvp-mode.md +53 -0
  269. package/gsd-core/references/planner-reviews.md +39 -0
  270. package/gsd-core/references/planner-revision.md +87 -0
  271. package/gsd-core/references/planner-source-audit.md +73 -0
  272. package/gsd-core/references/planning-config.md +473 -0
  273. package/gsd-core/references/product-discovery.md +49 -0
  274. package/gsd-core/references/project-skills-discovery.md +19 -0
  275. package/gsd-core/references/questioning.md +162 -0
  276. package/gsd-core/references/realistic-test-data.md +44 -0
  277. package/gsd-core/references/research-documentation-lookup.md +29 -0
  278. package/gsd-core/references/research-philosophy.md +29 -0
  279. package/gsd-core/references/research-verification-protocol.md +27 -0
  280. package/gsd-core/references/revision-loop.md +97 -0
  281. package/gsd-core/references/scout-codebase.md +51 -0
  282. package/gsd-core/references/skeleton-template.md +48 -0
  283. package/gsd-core/references/sketch-interactivity.md +41 -0
  284. package/gsd-core/references/sketch-theme-system.md +94 -0
  285. package/gsd-core/references/sketch-tooling.md +45 -0
  286. package/gsd-core/references/sketch-variant-patterns.md +81 -0
  287. package/gsd-core/references/spidr-splitting.md +69 -0
  288. package/gsd-core/references/tdd.md +330 -0
  289. package/gsd-core/references/test-containers.md +55 -0
  290. package/gsd-core/references/test-strategy.md +75 -0
  291. package/gsd-core/references/thinking-models-debug.md +44 -0
  292. package/gsd-core/references/thinking-models-execution.md +50 -0
  293. package/gsd-core/references/thinking-models-planning.md +62 -0
  294. package/gsd-core/references/thinking-models-research.md +50 -0
  295. package/gsd-core/references/thinking-models-verification.md +55 -0
  296. package/gsd-core/references/thinking-partner.md +96 -0
  297. package/gsd-core/references/ui-brand.md +162 -0
  298. package/gsd-core/references/universal-anti-patterns.md +63 -0
  299. package/gsd-core/references/user-profiling.md +681 -0
  300. package/gsd-core/references/user-story-template.md +58 -0
  301. package/gsd-core/references/verification-overrides.md +227 -0
  302. package/gsd-core/references/verification-patterns.md +612 -0
  303. package/gsd-core/references/verify-mvp-mode.md +85 -0
  304. package/gsd-core/references/workstream-flag.md +111 -0
  305. package/gsd-core/references/worktree-branch-check.md +38 -0
  306. package/gsd-core/references/worktree-path-safety.md +67 -0
  307. package/gsd-core/templates/AI-SPEC.md +246 -0
  308. package/gsd-core/templates/DEBUG.md +169 -0
  309. package/gsd-core/templates/README.md +77 -0
  310. package/gsd-core/templates/SECURITY.md +61 -0
  311. package/gsd-core/templates/UAT.md +265 -0
  312. package/gsd-core/templates/UI-SPEC.md +100 -0
  313. package/gsd-core/templates/VALIDATION.md +76 -0
  314. package/gsd-core/templates/adr.md +58 -0
  315. package/gsd-core/templates/claude-md.md +145 -0
  316. package/gsd-core/templates/codebase/architecture.md +255 -0
  317. package/gsd-core/templates/codebase/concerns.md +310 -0
  318. package/gsd-core/templates/codebase/conventions.md +307 -0
  319. package/gsd-core/templates/codebase/integrations.md +280 -0
  320. package/gsd-core/templates/codebase/stack.md +186 -0
  321. package/gsd-core/templates/codebase/structure.md +285 -0
  322. package/gsd-core/templates/codebase/testing.md +480 -0
  323. package/gsd-core/templates/config.json +62 -0
  324. package/gsd-core/templates/context.md +352 -0
  325. package/gsd-core/templates/continue-here.md +78 -0
  326. package/gsd-core/templates/copilot-instructions.md +7 -0
  327. package/gsd-core/templates/debug-subagent-prompt.md +91 -0
  328. package/gsd-core/templates/dev-preferences.md +21 -0
  329. package/gsd-core/templates/discovery.md +146 -0
  330. package/gsd-core/templates/discussion-log.md +63 -0
  331. package/gsd-core/templates/domain-model.md +54 -0
  332. package/gsd-core/templates/milestone-archive.md +123 -0
  333. package/gsd-core/templates/milestone.md +115 -0
  334. package/gsd-core/templates/phase-prompt.md +610 -0
  335. package/gsd-core/templates/planner-subagent-prompt.md +117 -0
  336. package/gsd-core/templates/product-brief.md +55 -0
  337. package/gsd-core/templates/project.md +186 -0
  338. package/gsd-core/templates/requirements.md +231 -0
  339. package/gsd-core/templates/research-project/ARCHITECTURE.md +204 -0
  340. package/gsd-core/templates/research-project/FEATURES.md +147 -0
  341. package/gsd-core/templates/research-project/PITFALLS.md +200 -0
  342. package/gsd-core/templates/research-project/STACK.md +120 -0
  343. package/gsd-core/templates/research-project/SUMMARY.md +170 -0
  344. package/gsd-core/templates/research.md +592 -0
  345. package/gsd-core/templates/retrospective.md +54 -0
  346. package/gsd-core/templates/roadmap.md +202 -0
  347. package/gsd-core/templates/spec.md +307 -0
  348. package/gsd-core/templates/state.md +195 -0
  349. package/gsd-core/templates/summary-complex.md +59 -0
  350. package/gsd-core/templates/summary-minimal.md +41 -0
  351. package/gsd-core/templates/summary-standard.md +48 -0
  352. package/gsd-core/templates/summary.md +248 -0
  353. package/gsd-core/templates/test-strategy.md +50 -0
  354. package/gsd-core/templates/user-profile.md +146 -0
  355. package/gsd-core/templates/user-setup.md +311 -0
  356. package/gsd-core/templates/verification-report.md +322 -0
  357. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  358. package/gsd-core/workflows/add-backlog.md +91 -0
  359. package/gsd-core/workflows/add-phase.md +113 -0
  360. package/gsd-core/workflows/add-tests.md +355 -0
  361. package/gsd-core/workflows/add-todo.md +161 -0
  362. package/gsd-core/workflows/ai-integration-phase.md +295 -0
  363. package/gsd-core/workflows/analyze-dependencies.md +96 -0
  364. package/gsd-core/workflows/audit-fix.md +178 -0
  365. package/gsd-core/workflows/audit-milestone.md +360 -0
  366. package/gsd-core/workflows/audit-uat.md +110 -0
  367. package/gsd-core/workflows/autonomous.md +797 -0
  368. package/gsd-core/workflows/check-todos.md +180 -0
  369. package/gsd-core/workflows/cleanup.md +195 -0
  370. package/gsd-core/workflows/code-review-fix.md +502 -0
  371. package/gsd-core/workflows/code-review.md +658 -0
  372. package/gsd-core/workflows/complete-milestone.md +855 -0
  373. package/gsd-core/workflows/debug.md +237 -0
  374. package/gsd-core/workflows/diagnose-issues.md +245 -0
  375. package/gsd-core/workflows/discover-product.md +112 -0
  376. package/gsd-core/workflows/discovery-phase.md +291 -0
  377. package/gsd-core/workflows/discuss-phase/modes/advisor.md +176 -0
  378. package/gsd-core/workflows/discuss-phase/modes/all.md +28 -0
  379. package/gsd-core/workflows/discuss-phase/modes/analyze.md +44 -0
  380. package/gsd-core/workflows/discuss-phase/modes/auto.md +57 -0
  381. package/gsd-core/workflows/discuss-phase/modes/batch.md +52 -0
  382. package/gsd-core/workflows/discuss-phase/modes/chain.md +98 -0
  383. package/gsd-core/workflows/discuss-phase/modes/default.md +141 -0
  384. package/gsd-core/workflows/discuss-phase/modes/power.md +44 -0
  385. package/gsd-core/workflows/discuss-phase/modes/text.md +55 -0
  386. package/gsd-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
  387. package/gsd-core/workflows/discuss-phase/templates/context.md +136 -0
  388. package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
  389. package/gsd-core/workflows/discuss-phase-assumptions.md +675 -0
  390. package/gsd-core/workflows/discuss-phase-power.md +291 -0
  391. package/gsd-core/workflows/discuss-phase.md +499 -0
  392. package/gsd-core/workflows/do.md +111 -0
  393. package/gsd-core/workflows/docs-update.md +1176 -0
  394. package/gsd-core/workflows/edit-phase.md +295 -0
  395. package/gsd-core/workflows/eval-review.md +156 -0
  396. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
  397. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  398. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
  399. package/gsd-core/workflows/execute-phase.md +1752 -0
  400. package/gsd-core/workflows/execute-plan.md +526 -0
  401. package/gsd-core/workflows/explore.md +146 -0
  402. package/gsd-core/workflows/extract-learnings.md +243 -0
  403. package/gsd-core/workflows/fast.md +124 -0
  404. package/gsd-core/workflows/forensics.md +279 -0
  405. package/gsd-core/workflows/graduation.md +196 -0
  406. package/gsd-core/workflows/health.md +224 -0
  407. package/gsd-core/workflows/help/modes/brief.md +22 -0
  408. package/gsd-core/workflows/help/modes/default.md +50 -0
  409. package/gsd-core/workflows/help/modes/full.md +789 -0
  410. package/gsd-core/workflows/help/modes/topic.md +74 -0
  411. package/gsd-core/workflows/help.md +24 -0
  412. package/gsd-core/workflows/import.md +256 -0
  413. package/gsd-core/workflows/inbox.md +387 -0
  414. package/gsd-core/workflows/ingest-docs.md +340 -0
  415. package/gsd-core/workflows/insert-phase.md +152 -0
  416. package/gsd-core/workflows/list-phase-assumptions.md +178 -0
  417. package/gsd-core/workflows/list-workspaces.md +57 -0
  418. package/gsd-core/workflows/manager.md +393 -0
  419. package/gsd-core/workflows/map-codebase.md +446 -0
  420. package/gsd-core/workflows/milestone-summary.md +224 -0
  421. package/gsd-core/workflows/model-domain.md +162 -0
  422. package/gsd-core/workflows/mvp-phase.md +222 -0
  423. package/gsd-core/workflows/new-milestone.md +635 -0
  424. package/gsd-core/workflows/new-project.md +1555 -0
  425. package/gsd-core/workflows/new-workspace.md +240 -0
  426. package/gsd-core/workflows/next.md +299 -0
  427. package/gsd-core/workflows/node-repair.md +92 -0
  428. package/gsd-core/workflows/note.md +158 -0
  429. package/gsd-core/workflows/pause-work.md +244 -0
  430. package/gsd-core/workflows/plan-milestone-gaps.md +281 -0
  431. package/gsd-core/workflows/plan-phase.md +1814 -0
  432. package/gsd-core/workflows/plan-review-convergence.md +346 -0
  433. package/gsd-core/workflows/plant-seed.md +230 -0
  434. package/gsd-core/workflows/pr-branch.md +157 -0
  435. package/gsd-core/workflows/profile-user.md +453 -0
  436. package/gsd-core/workflows/progress.md +699 -0
  437. package/gsd-core/workflows/quick.md +1017 -0
  438. package/gsd-core/workflows/reapply-patches.md +426 -0
  439. package/gsd-core/workflows/recommend-architecture.md +135 -0
  440. package/gsd-core/workflows/remove-phase.md +156 -0
  441. package/gsd-core/workflows/remove-workspace.md +108 -0
  442. package/gsd-core/workflows/resume-project.md +332 -0
  443. package/gsd-core/workflows/review.md +748 -0
  444. package/gsd-core/workflows/scan.md +107 -0
  445. package/gsd-core/workflows/secure-phase.md +182 -0
  446. package/gsd-core/workflows/session-report.md +146 -0
  447. package/gsd-core/workflows/settings-advanced.md +810 -0
  448. package/gsd-core/workflows/settings-integrations.md +312 -0
  449. package/gsd-core/workflows/settings.md +566 -0
  450. package/gsd-core/workflows/ship.md +405 -0
  451. package/gsd-core/workflows/sketch-wrap-up.md +286 -0
  452. package/gsd-core/workflows/sketch.md +361 -0
  453. package/gsd-core/workflows/spec-phase.md +263 -0
  454. package/gsd-core/workflows/spike-wrap-up.md +307 -0
  455. package/gsd-core/workflows/spike.md +453 -0
  456. package/gsd-core/workflows/stats.md +80 -0
  457. package/gsd-core/workflows/sync-skills.md +182 -0
  458. package/gsd-core/workflows/testing-strategy.md +122 -0
  459. package/gsd-core/workflows/thread.md +222 -0
  460. package/gsd-core/workflows/transition.md +694 -0
  461. package/gsd-core/workflows/ui-phase.md +328 -0
  462. package/gsd-core/workflows/ui-review.md +193 -0
  463. package/gsd-core/workflows/ultraplan-phase.md +199 -0
  464. package/gsd-core/workflows/undo.md +314 -0
  465. package/gsd-core/workflows/update.md +496 -0
  466. package/gsd-core/workflows/validate-phase.md +181 -0
  467. package/gsd-core/workflows/verify-phase.md +544 -0
  468. package/gsd-core/workflows/verify-work.md +781 -0
  469. package/hooks/dist/gsd-check-update-worker.js +108 -0
  470. package/hooks/dist/gsd-check-update.js +66 -0
  471. package/hooks/dist/gsd-config-reload.js +133 -0
  472. package/hooks/dist/gsd-context-monitor.js +195 -0
  473. package/hooks/dist/gsd-cursor-post-tool.js +75 -0
  474. package/hooks/dist/gsd-cursor-session-start.js +52 -0
  475. package/hooks/dist/gsd-graphify-update.sh +158 -0
  476. package/hooks/dist/gsd-phase-boundary.sh +47 -0
  477. package/hooks/dist/gsd-prompt-guard.js +97 -0
  478. package/hooks/dist/gsd-read-guard.js +101 -0
  479. package/hooks/dist/gsd-read-injection-scanner.js +203 -0
  480. package/hooks/dist/gsd-session-state.sh +59 -0
  481. package/hooks/dist/gsd-statusline.js +566 -0
  482. package/hooks/dist/gsd-update-banner.js +138 -0
  483. package/hooks/dist/gsd-validate-commit.sh +57 -0
  484. package/hooks/dist/gsd-workflow-guard.js +167 -0
  485. package/hooks/dist/gsd-worktree-path-guard.js +169 -0
  486. package/hooks/dist/lib/git-cmd.js +150 -0
  487. package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
  488. package/hooks/dist/managed-hooks-registry.cjs +38 -0
  489. package/hooks/gsd-check-update-worker.js +108 -0
  490. package/hooks/gsd-check-update.js +66 -0
  491. package/hooks/gsd-config-reload.js +133 -0
  492. package/hooks/gsd-context-monitor.js +195 -0
  493. package/hooks/gsd-cursor-post-tool.js +75 -0
  494. package/hooks/gsd-cursor-session-start.js +52 -0
  495. package/hooks/gsd-graphify-update.sh +158 -0
  496. package/hooks/gsd-phase-boundary.sh +47 -0
  497. package/hooks/gsd-prompt-guard.js +97 -0
  498. package/hooks/gsd-read-guard.js +101 -0
  499. package/hooks/gsd-read-injection-scanner.js +203 -0
  500. package/hooks/gsd-session-state.sh +59 -0
  501. package/hooks/gsd-statusline.js +566 -0
  502. package/hooks/gsd-update-banner.js +138 -0
  503. package/hooks/gsd-validate-commit.sh +57 -0
  504. package/hooks/gsd-workflow-guard.js +167 -0
  505. package/hooks/gsd-worktree-path-guard.js +169 -0
  506. package/hooks/hooks.json +69 -0
  507. package/hooks/lib/git-cmd.js +150 -0
  508. package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
  509. package/hooks/managed-hooks-registry.cjs +38 -0
  510. package/package.json +115 -0
  511. package/scripts/affected-tests-lib.cjs +542 -0
  512. package/scripts/audit-workflow-script-paths.cjs +73 -0
  513. package/scripts/base64-scan.sh +351 -0
  514. package/scripts/build-hooks.js +247 -0
  515. package/scripts/changeset/README.md +129 -0
  516. package/scripts/changeset/cli.cjs +590 -0
  517. package/scripts/changeset/github-release-notes.cjs +199 -0
  518. package/scripts/changeset/lint.cjs +111 -0
  519. package/scripts/changeset/new.cjs +137 -0
  520. package/scripts/changeset/parse.cjs +114 -0
  521. package/scripts/changeset/render.cjs +34 -0
  522. package/scripts/changeset/serialize.cjs +130 -0
  523. package/scripts/check-alias-drift.cjs +114 -0
  524. package/scripts/check-env.cjs +312 -0
  525. package/scripts/check-npm-integrity.cjs +215 -0
  526. package/scripts/ci-guard-runner.cjs +22 -0
  527. package/scripts/ci-prepare-test-scope.cjs +51 -0
  528. package/scripts/ci-rebase-check.cjs +86 -0
  529. package/scripts/ci-test-scope.cjs +431 -0
  530. package/scripts/command-contract-helpers.cjs +64 -0
  531. package/scripts/diff-touches-shipped-paths.cjs +155 -0
  532. package/scripts/fix-slash-commands.cjs +147 -0
  533. package/scripts/gen-inventory-manifest.cjs +115 -0
  534. package/scripts/gen-research-agents.cjs +276 -0
  535. package/scripts/generate-package-identity.cjs +125 -0
  536. package/scripts/issue-dedupe.cjs +278 -0
  537. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  538. package/scripts/lib/cli-exit.cjs +56 -0
  539. package/scripts/lint-command-contract.cjs +114 -0
  540. package/scripts/lint-descriptions.cjs +87 -0
  541. package/scripts/lint-docs-required.cjs +222 -0
  542. package/scripts/lint-legacy-dir-name.cjs +160 -0
  543. package/scripts/lint-package-identity-drift.cjs +141 -0
  544. package/scripts/lint-pr-check-project-dir.cjs +99 -0
  545. package/scripts/lint-shell-command-projection-drift.cjs +62 -0
  546. package/scripts/lint-skill-deps.cjs +185 -0
  547. package/scripts/lint-test-file-count.allowlist.json +135 -0
  548. package/scripts/lint-test-file-count.cjs +246 -0
  549. package/scripts/mutation-matrix.cjs +222 -0
  550. package/scripts/pr-template-policy.cjs +268 -0
  551. package/scripts/prompt-injection-scan.sh +207 -0
  552. package/scripts/release-notes/discord-release-summary.cjs +373 -0
  553. package/scripts/release-notes/format-github-release-notes.cjs +261 -0
  554. package/scripts/release-tarball-smoke.cjs +629 -0
  555. package/scripts/research-profiles.cjs +149 -0
  556. package/scripts/run-affected-tests.cjs +7 -0
  557. package/scripts/run-cross-platform-tests.cjs +67 -0
  558. package/scripts/run-tests.cjs +315 -0
  559. package/scripts/secret-scan-lint.sh +231 -0
  560. package/scripts/secret-scan.sh +358 -0
  561. package/scripts/setup-branch-protection.sh +236 -0
  562. package/scripts/strip-prose-atrefs.cjs +106 -0
  563. package/scripts/sync-manifest-versions.cjs +119 -0
  564. package/scripts/sync-rulesets.sh +34 -0
  565. package/scripts/sync-runtime-launcher.cjs +399 -0
  566. package/scripts/test-failure-reasons.cjs +34 -0
  567. package/scripts/verify-npm-publish.cjs +240 -0
  568. package/scripts/workflow-policy.cjs +450 -0
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * research-profiles.cjs — hand-authored profile table for the 7 researcher agents.
6
+ *
7
+ * Each profile field is derived verbatim from the agent's current committed state so
8
+ * that the initial --check in gen-research-agents.cjs is green by construction.
9
+ *
10
+ * Fields:
11
+ * name — verbatim frontmatter `name:` value
12
+ * description — verbatim frontmatter `description:` value
13
+ * color — verbatim frontmatter `color:` value
14
+ * tools — verbatim frontmatter `tools:` value (single string, comma-separated)
15
+ * requiredIncludes — @~/.claude/gsd-core/references/<file>.md strings the body MUST contain
16
+ * requiredSeamCalls — `gsd-tools query <cmd>` strings the body MUST contain
17
+ * outputContract — strings the body MUST contain (output path, return marker, etc.)
18
+ */
19
+
20
+ const PROFILES = [
21
+ {
22
+ name: 'gsd-project-researcher',
23
+ description:
24
+ 'Researches domain ecosystem before roadmap creation. Produces files in .planning/research/ consumed during roadmap creation. Spawned by /gsd:new-project or /gsd:new-milestone orchestrators.',
25
+ color: 'cyan',
26
+ tools:
27
+ 'Read, Write, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*',
28
+ requiredIncludes: [
29
+ '@~/.claude/gsd-core/references/research-documentation-lookup.md',
30
+ '@~/.claude/gsd-core/references/research-philosophy.md',
31
+ '@~/.claude/gsd-core/references/research-verification-protocol.md',
32
+ ],
33
+ requiredSeamCalls: [
34
+ 'gsd-tools query research-plan',
35
+ 'gsd-tools query research-store put',
36
+ 'gsd-tools query classify-confidence',
37
+ ],
38
+ outputContract: [
39
+ '.planning/research/',
40
+ '## RESEARCH COMPLETE',
41
+ ],
42
+ },
43
+ {
44
+ name: 'gsd-phase-researcher',
45
+ description:
46
+ 'Researches how to implement a phase before planning. Produces RESEARCH.md consumed by gsd-planner. Spawned by /gsd:plan-phase orchestrator.',
47
+ color: 'cyan',
48
+ tools:
49
+ 'Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*',
50
+ requiredIncludes: [
51
+ '@~/.claude/gsd-core/references/research-documentation-lookup.md',
52
+ '@~/.claude/gsd-core/references/research-philosophy.md',
53
+ '@~/.claude/gsd-core/references/research-verification-protocol.md',
54
+ ],
55
+ requiredSeamCalls: [
56
+ 'gsd-tools query research-plan',
57
+ 'gsd-tools query research-store put',
58
+ 'gsd-tools query classify-confidence',
59
+ 'gsd-tools query package-legitimacy check',
60
+ ],
61
+ outputContract: [
62
+ '.planning/phases/XX-name/{phase_num}-RESEARCH.md',
63
+ '## RESEARCH COMPLETE',
64
+ ],
65
+ },
66
+ {
67
+ name: 'gsd-advisor-researcher',
68
+ description:
69
+ 'Researches a single gray area decision and returns a structured comparison table with rationale. Spawned by discuss-phase advisor mode.',
70
+ color: 'cyan',
71
+ tools: 'Read, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*',
72
+ requiredIncludes: [
73
+ '@~/.claude/gsd-core/references/research-documentation-lookup.md',
74
+ ],
75
+ requiredSeamCalls: [],
76
+ outputContract: [
77
+ '| Option | Pros | Cons | Complexity | Recommendation |',
78
+ '**Rationale:**',
79
+ ],
80
+ },
81
+ {
82
+ name: 'gsd-ai-researcher',
83
+ description:
84
+ 'Researches a chosen AI framework\'s official docs to produce implementation-ready guidance — best practices, syntax, core patterns, and pitfalls distilled for the specific use case. Writes the Framework Quick Reference and Implementation Guidance sections of AI-SPEC.md. Spawned by /gsd:ai-integration-phase orchestrator.',
85
+ color: 'green',
86
+ tools:
87
+ 'Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, mcp__context7__*',
88
+ requiredIncludes: [
89
+ '@~/.claude/gsd-core/references/research-documentation-lookup.md',
90
+ ],
91
+ requiredSeamCalls: [],
92
+ outputContract: [
93
+ 'AI-SPEC.md',
94
+ 'Section 3',
95
+ 'Section 4',
96
+ ],
97
+ },
98
+ {
99
+ name: 'gsd-domain-researcher',
100
+ description:
101
+ 'Researches the business domain and real-world application context of the AI system being built. Surfaces domain expert evaluation criteria, industry-specific failure modes, regulatory context, and what "good" looks like for practitioners in this field — before the eval-planner turns it into measurable rubrics. Spawned by /gsd:ai-integration-phase orchestrator.',
102
+ color: 'purple',
103
+ tools:
104
+ 'Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*',
105
+ requiredIncludes: [
106
+ '@~/.claude/gsd-core/references/research-documentation-lookup.md',
107
+ ],
108
+ requiredSeamCalls: [],
109
+ outputContract: [
110
+ 'AI-SPEC.md',
111
+ 'Section 1b',
112
+ ],
113
+ },
114
+ {
115
+ name: 'gsd-ui-researcher',
116
+ description:
117
+ 'Produces UI-SPEC.md design contract for frontend phases. Reads upstream artifacts, detects design system state, asks only unanswered questions. Spawned by /gsd:ui-phase orchestrator.',
118
+ color: 'purple',
119
+ tools:
120
+ 'Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*',
121
+ requiredIncludes: [
122
+ '@~/.claude/gsd-core/references/research-documentation-lookup.md',
123
+ ],
124
+ requiredSeamCalls: [
125
+ 'gsd-tools query commit',
126
+ ],
127
+ outputContract: [
128
+ 'UI-SPEC.md',
129
+ '## UI-SPEC COMPLETE',
130
+ ],
131
+ },
132
+ {
133
+ name: 'gsd-research-synthesizer',
134
+ description:
135
+ 'Synthesizes research outputs from parallel researcher agents into SUMMARY.md. Spawned by /gsd:new-project after 4 researcher agents complete.',
136
+ color: 'purple',
137
+ tools: 'Read, Write, Bash',
138
+ requiredIncludes: [],
139
+ requiredSeamCalls: [
140
+ 'gsd-tools query commit',
141
+ ],
142
+ outputContract: [
143
+ '.planning/research/SUMMARY.md',
144
+ '## SYNTHESIS COMPLETE',
145
+ ],
146
+ },
147
+ ];
148
+
149
+ module.exports = { PROFILES };
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const { runAffectedTests } = require('./affected-tests-lib.cjs');
5
+ const { runMain } = require('./lib/cli-exit.cjs');
6
+
7
+ runMain(runAffectedTests);
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ const { spawnSync } = require('child_process');
4
+ const { ExitError, runMain } = require('./lib/cli-exit.cjs');
5
+
6
+ const CROSS_PLATFORM_TEST_REASON = Object.freeze({
7
+ PASS: 'pass',
8
+ TEST_FAILURE: 'test_failure',
9
+ INFRA_FAILURE: 'infra_failure',
10
+ UNKNOWN_FAILURE: 'unknown_failure',
11
+ });
12
+
13
+ function classify(exitCode, output) {
14
+ if (exitCode === 0) return CROSS_PLATFORM_TEST_REASON.PASS;
15
+ if (exitCode === 2 || /infrastructure failure|worktree\.Construct/i.test(output)) {
16
+ return CROSS_PLATFORM_TEST_REASON.INFRA_FAILURE;
17
+ }
18
+ if (/\bFAIL\b|\d+\s+failures?\)/i.test(output)) {
19
+ return CROSS_PLATFORM_TEST_REASON.TEST_FAILURE;
20
+ }
21
+ return CROSS_PLATFORM_TEST_REASON.UNKNOWN_FAILURE;
22
+ }
23
+
24
+ function runCrossPlatformTests(options = {}, deps = {}) {
25
+ const {
26
+ base = 'next',
27
+ head = 'HEAD',
28
+ source = '.',
29
+ targets = 'linux,macos',
30
+ cwd = process.cwd(),
31
+ } = options;
32
+ const runner = deps.spawnSync || spawnSync;
33
+
34
+ const args = ['--targets', targets, '--base', base, '--head', head, '--source', source];
35
+ const result = runner('gsd-test', args, { cwd, encoding: 'utf8' });
36
+
37
+ const stdout = result.stdout || '';
38
+ const stderr = result.stderr || '';
39
+ const output = `${stdout}\n${stderr}`;
40
+ const exitCode = Number(result.status ?? 1);
41
+ const reason = classify(exitCode, output);
42
+
43
+ return {
44
+ ok: exitCode === 0,
45
+ reason,
46
+ exitCode,
47
+ command: ['gsd-test', ...args].join(' '),
48
+ stdout,
49
+ stderr,
50
+ };
51
+ }
52
+
53
+ if (require.main === module) {
54
+ function main() {
55
+ const result = runCrossPlatformTests();
56
+ const line = `[cross-platform-tests] reason=${result.reason} exit=${result.exitCode}`;
57
+ if (result.ok) {
58
+ process.stdout.write(`${line}\n`);
59
+ return 0;
60
+ }
61
+ process.stderr.write(`${line}\n`);
62
+ throw new ExitError(result.exitCode);
63
+ }
64
+ runMain(main);
65
+ }
66
+
67
+ module.exports = { CROSS_PLATFORM_TEST_REASON, runCrossPlatformTests };
@@ -0,0 +1,315 @@
1
+ #!/usr/bin/env node
2
+ // Cross-platform test runner — resolves test file globs via Node
3
+ // instead of relying on shell expansion (which fails on Windows PowerShell/cmd).
4
+ // Propagates NODE_V8_COVERAGE so c8 collects coverage from the child process.
5
+ //
6
+ // Suite filtering (issue #3597):
7
+ // node scripts/run-tests.cjs # default — runs ALL tests (backcompat)
8
+ // node scripts/run-tests.cjs --suite all # explicit "everything"
9
+ // node scripts/run-tests.cjs --suite unit # only files with no other suite marker
10
+ // node scripts/run-tests.cjs --suite security # *.security.test.cjs
11
+ // node scripts/run-tests.cjs --suite integration # *.integration.test.cjs
12
+ // node scripts/run-tests.cjs --suite install # *.install.test.cjs
13
+ // node scripts/run-tests.cjs --suite slow # *.slow.test.cjs
14
+ // node scripts/run-tests.cjs --files "a.test.cjs b.test.cjs"
15
+ // node scripts/run-tests.cjs --files-from /tmp/selected-tests.txt
16
+ //
17
+ // Suite grouping convention: filename suffix marker before `.test.cjs`.
18
+ // A file named `foo.security.test.cjs` belongs to the `security` suite.
19
+ // A file named `foo.test.cjs` (no marker) belongs to the `unit` suite.
20
+ // See docs/TESTING-SUITES.md for full grouping policy.
21
+ 'use strict';
22
+
23
+ const { readdirSync, existsSync } = require('fs');
24
+ const { join } = require('path');
25
+ const { execFileSync } = require('child_process');
26
+ const { ExitError, runMain } = require('./lib/cli-exit.cjs');
27
+
28
+ const SUITES = ['all', 'unit', 'integration', 'install', 'security', 'slow'];
29
+
30
+ // ADR-457 build-at-publish: gsd-core/bin/lib/*.cjs is generated from
31
+ // src/*.cts and gitignored, so on a clean checkout (fresh CI, before any build)
32
+ // the artifact is absent — yet test files require it. This is the universal
33
+ // chokepoint every test path funnels through (test:unit, --files-from, direct
34
+ // invocation), so build the artifact here if missing. It is a no-op once built
35
+ // (dev, pretest, a prior run in the same job), which keeps the harness test's
36
+ // spawned invocations side-effect-free. Paths resolve from __dirname (not cwd),
37
+ // so it works regardless of GSD_TEST_DIR / temp-dir cwd. NOTE: the sentinel is
38
+ // the pilot module; revisit (or switch to an unconditional quiet build) as more
39
+ // modules migrate into src/.
40
+ function ensureBuiltArtifacts() {
41
+ const root = join(__dirname, '..');
42
+ const sentinel = join(root, 'gsd-core', 'bin', 'lib', 'semver-compare.cjs');
43
+ if (existsSync(sentinel)) return;
44
+ const tscBin = require.resolve('typescript/bin/tsc');
45
+ execFileSync(process.execPath, [tscBin, '-p', join(root, 'tsconfig.build.json')], {
46
+ cwd: root,
47
+ stdio: 'inherit',
48
+ });
49
+ }
50
+ const MARKED_SUITES = ['integration', 'install', 'security', 'slow'];
51
+
52
+ function parseArgs(argv) {
53
+ let suite = null;
54
+ let seen = false;
55
+ let files = null;
56
+ let filesFrom = null;
57
+ for (let i = 0; i < argv.length; i++) {
58
+ const a = argv[i];
59
+ if (a === '--suite') {
60
+ if (seen) {
61
+ return { error: 'duplicate --suite flag' };
62
+ }
63
+ seen = true;
64
+ const v = argv[i + 1];
65
+ if (!v || v.startsWith('--')) {
66
+ return { error: '--suite requires a value' };
67
+ }
68
+ suite = v;
69
+ i++;
70
+ } else if (a.startsWith('--suite=')) {
71
+ if (seen) {
72
+ return { error: 'duplicate --suite flag' };
73
+ }
74
+ seen = true;
75
+ suite = a.slice('--suite='.length);
76
+ if (!suite) {
77
+ return { error: '--suite requires a value' };
78
+ }
79
+ } else if (a === '--files') {
80
+ if (files !== null) {
81
+ return { error: 'duplicate --files flag' };
82
+ }
83
+ const v = argv[i + 1];
84
+ if (!v || v.startsWith('--')) {
85
+ return { error: '--files requires a value' };
86
+ }
87
+ files = v;
88
+ i++;
89
+ } else if (a.startsWith('--files=')) {
90
+ if (files !== null) {
91
+ return { error: 'duplicate --files flag' };
92
+ }
93
+ files = a.slice('--files='.length);
94
+ if (!files) {
95
+ return { error: '--files requires a value' };
96
+ }
97
+ } else if (a === '--files-from') {
98
+ if (filesFrom !== null) {
99
+ return { error: 'duplicate --files-from flag' };
100
+ }
101
+ const v = argv[i + 1];
102
+ if (!v || v.startsWith('--')) {
103
+ return { error: '--files-from requires a value' };
104
+ }
105
+ filesFrom = v;
106
+ i++;
107
+ } else if (a.startsWith('--files-from=')) {
108
+ if (filesFrom !== null) {
109
+ return { error: 'duplicate --files-from flag' };
110
+ }
111
+ filesFrom = a.slice('--files-from='.length);
112
+ if (!filesFrom) {
113
+ return { error: '--files-from requires a value' };
114
+ }
115
+ } else {
116
+ return { error: `unknown argument: ${a}` };
117
+ }
118
+ }
119
+ if (files !== null && filesFrom !== null) {
120
+ return { error: '--files and --files-from cannot be combined' };
121
+ }
122
+ return { suite, files, filesFrom };
123
+ }
124
+
125
+ // Return the marked suite name embedded in a filename, or null if it's unmarked.
126
+ // foo.security.test.cjs -> "security"
127
+ // foo.test.cjs -> null (unit)
128
+ function suiteOf(filename) {
129
+ if (!filename.endsWith('.test.cjs')) return null;
130
+ const base = filename.slice(0, -'.test.cjs'.length);
131
+ const lastDot = base.lastIndexOf('.');
132
+ if (lastDot === -1) return null;
133
+ const marker = base.slice(lastDot + 1);
134
+ return MARKED_SUITES.includes(marker) ? marker : null;
135
+ }
136
+
137
+ function selectFiles(allFiles, suite) {
138
+ if (suite === null || suite === 'all') {
139
+ return allFiles;
140
+ }
141
+ if (suite === 'unit') {
142
+ return allFiles.filter(f => suiteOf(f) === null);
143
+ }
144
+ return allFiles.filter(f => suiteOf(f) === suite);
145
+ }
146
+
147
+ function splitFileList(value) {
148
+ if (!value) return [];
149
+ return value
150
+ .split(/[,\s]+/)
151
+ .map(v => v.trim())
152
+ .filter(Boolean)
153
+ .map(v => v.replace(/^tests[\\/]/, ''));
154
+ }
155
+
156
+ function selectExplicitFiles(allFiles, filesValue, filesFrom) {
157
+ const fs = require('fs');
158
+ const requested = filesFrom
159
+ ? splitFileList(fs.readFileSync(filesFrom, 'utf8'))
160
+ : splitFileList(filesValue);
161
+ const available = new Set(allFiles);
162
+ const selected = [];
163
+ const missing = [];
164
+ for (const file of requested) {
165
+ // If the token is a bare suite name (e.g. "unit" written by ci-test-scope
166
+ // as the #408 fallback sentinel), delegate to the existing suite resolver
167
+ // rather than treating it as a filename. This prevents the
168
+ // "requested test file(s) not found: unit" crash (#641).
169
+ if (SUITES.includes(file)) {
170
+ for (const f of selectFiles(allFiles, file)) {
171
+ selected.push(f);
172
+ }
173
+ } else if (available.has(file)) {
174
+ selected.push(file);
175
+ } else {
176
+ missing.push(file);
177
+ }
178
+ }
179
+ if (missing.length > 0) {
180
+ return {
181
+ error: `requested test file(s) not found: ${missing.join(', ')}`,
182
+ };
183
+ }
184
+ return { files: [...new Set(selected)] };
185
+ }
186
+
187
+ function main() {
188
+ const args = process.argv.slice(2);
189
+ const parsed = parseArgs(args);
190
+ if (parsed.error) {
191
+ console.error(`run-tests: ${parsed.error}`);
192
+ console.error(`Valid suites: ${SUITES.join(', ')}`);
193
+ throw new ExitError(2);
194
+ }
195
+ const suite = parsed.suite;
196
+ if (suite !== null && !SUITES.includes(suite)) {
197
+ console.error(`run-tests: unknown suite "${suite}"`);
198
+ console.error(`Valid suites: ${SUITES.join(', ')}`);
199
+ throw new ExitError(2);
200
+ }
201
+
202
+ const testDir = process.env.GSD_TEST_DIR
203
+ ? process.env.GSD_TEST_DIR
204
+ : join(__dirname, '..', 'tests');
205
+
206
+ const allFiles = readdirSync(testDir)
207
+ .filter(f => f.endsWith('.test.cjs'))
208
+ .sort();
209
+
210
+ if (allFiles.length === 0) {
211
+ console.error(`No test files found in ${testDir}`);
212
+ throw new ExitError(1);
213
+ }
214
+
215
+ let selectedNames;
216
+ if (parsed.files !== null || parsed.filesFrom !== null) {
217
+ const explicit = selectExplicitFiles(allFiles, parsed.files, parsed.filesFrom);
218
+ if (explicit.error) {
219
+ console.error(`run-tests: ${explicit.error}`);
220
+ throw new ExitError(2);
221
+ }
222
+ selectedNames = explicit.files;
223
+ } else {
224
+ selectedNames = selectFiles(allFiles, suite);
225
+ }
226
+ const selected = selectedNames.map(f => join(testDir, f));
227
+
228
+ if (selected.length === 0) {
229
+ // Empty suite: report and exit 0 so empty lanes (e.g. `security` before
230
+ // adversarial tests land) don't gate CI. CI consumers wanting strictness
231
+ // can grep stderr for "no tests in suite".
232
+ console.error(`run-tests: no tests in suite "${suite || 'all'}"`);
233
+ return 0;
234
+ }
235
+
236
+ // Build the gitignored bin/lib artifact if absent, before any test requires it.
237
+ ensureBuiltArtifacts();
238
+
239
+ // Log selected files to stderr for CI / harness-test visibility.
240
+ // node:test default reporter doesn't echo filenames, so this gives
241
+ // operators a single stable line they can grep.
242
+ console.error(
243
+ `run-tests: suite="${suite || 'all'}" files=${selected.length}: ${selected
244
+ .map(f => f.split(/[\\/]/).pop())
245
+ .join(' ')}`,
246
+ );
247
+
248
+ // Default concurrency: 4 on Linux/macOS, 2 on Windows.
249
+ //
250
+ // Windows has significantly higher per-subprocess overhead than Linux/macOS:
251
+ // - Windows Defender scans each spawned process
252
+ // - NTFS has higher file-system latency under concurrent access
253
+ // - synckit worker_threads (used by the SDK bridge in gsd-tools.cjs) spawn
254
+ // native threads that contend on SharedArrayBuffer + Atomics.wait; under
255
+ // Node 24 on Windows, 4-way concurrent gsd-tools invocations (each spawning
256
+ // a synckit worker) caused intermittent process crashes with empty stderr —
257
+ // a signature of OS-level resource exhaustion killing worker threads before
258
+ // they could flush. Reducing to 2 halves the peak concurrent worker count.
259
+ //
260
+ // Operator override via TEST_CONCURRENCY env var for local debugging.
261
+ const defaultConcurrency = process.platform === 'win32' ? 2 : 4;
262
+ const concurrency = process.env.TEST_CONCURRENCY
263
+ ? `--test-concurrency=${process.env.TEST_CONCURRENCY}`
264
+ : `--test-concurrency=${defaultConcurrency}`;
265
+
266
+ // Windows `CreateProcess` caps the full command line at 32,767 chars
267
+ // (lpCommandLine). With 500+ test paths the spawn fails instantly with no
268
+ // test output. Linux/macOS allow ~2 MB (ARG_MAX) so unchunked spawns are
269
+ // fine there. Split into chunks sized for the tightest target so behavior
270
+ // is identical across platforms. (#3597)
271
+ // Operator override (also used by tests to force chunking with short paths).
272
+ const MAX_CMDLINE_CHARS = process.env.RUN_TESTS_MAX_CMDLINE_CHARS
273
+ ? Number(process.env.RUN_TESTS_MAX_CMDLINE_CHARS)
274
+ : 28000; // headroom below the 32,767 Windows ceiling
275
+ const FIXED_OVERHEAD = process.execPath.length + '--test'.length + concurrency.length + 8;
276
+ const chunks = [];
277
+ let current = [];
278
+ let currentLen = FIXED_OVERHEAD;
279
+ for (const file of selected) {
280
+ const add = file.length + 1; // +1 for the inter-arg separator
281
+ if (current.length > 0 && currentLen + add > MAX_CMDLINE_CHARS) {
282
+ chunks.push(current);
283
+ current = [];
284
+ currentLen = FIXED_OVERHEAD;
285
+ }
286
+ current.push(file);
287
+ currentLen += add;
288
+ }
289
+ if (current.length > 0) chunks.push(current);
290
+
291
+ let firstFailureExit = 0;
292
+ for (let i = 0; i < chunks.length; i++) {
293
+ if (chunks.length > 1) {
294
+ console.error(`run-tests: chunk ${i + 1}/${chunks.length} — ${chunks[i].length} files`);
295
+ }
296
+ try {
297
+ execFileSync(process.execPath, ['--test', concurrency, ...chunks[i]], {
298
+ stdio: 'inherit',
299
+ env: { ...process.env },
300
+ });
301
+ } catch (err) {
302
+ const code = err.status || 1;
303
+ // Run every chunk so the operator sees all failures in one pass; report
304
+ // the first non-zero exit at the end.
305
+ if (firstFailureExit === 0) firstFailureExit = code;
306
+ }
307
+ }
308
+ if (firstFailureExit !== 0) return firstFailureExit;
309
+ }
310
+
311
+ if (require.main === module) {
312
+ runMain(main);
313
+ }
314
+
315
+ module.exports = { suiteOf };