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.
Files changed (554) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +939 -0
  3. package/README.zh-CN.md +876 -0
  4. package/agents/gsd-advisor-researcher.md +127 -0
  5. package/agents/gsd-ai-researcher.md +133 -0
  6. package/agents/gsd-assumptions-analyzer.md +105 -0
  7. package/agents/gsd-code-fixer.md +517 -0
  8. package/agents/gsd-code-reviewer.md +371 -0
  9. package/agents/gsd-codebase-mapper.md +781 -0
  10. package/agents/gsd-debug-session-manager.md +314 -0
  11. package/agents/gsd-debugger.md +1452 -0
  12. package/agents/gsd-doc-classifier.md +168 -0
  13. package/agents/gsd-doc-synthesizer.md +204 -0
  14. package/agents/gsd-doc-verifier.md +217 -0
  15. package/agents/gsd-doc-writer.md +615 -0
  16. package/agents/gsd-domain-researcher.md +153 -0
  17. package/agents/gsd-eval-auditor.md +191 -0
  18. package/agents/gsd-eval-planner.md +154 -0
  19. package/agents/gsd-executor.md +603 -0
  20. package/agents/gsd-framework-selector.md +160 -0
  21. package/agents/gsd-integration-checker.md +470 -0
  22. package/agents/gsd-intel-updater.md +334 -0
  23. package/agents/gsd-nyquist-auditor.md +203 -0
  24. package/agents/gsd-pattern-mapper.md +335 -0
  25. package/agents/gsd-phase-researcher.md +841 -0
  26. package/agents/gsd-plan-checker.md +978 -0
  27. package/agents/gsd-planner.md +1251 -0
  28. package/agents/gsd-project-researcher.md +677 -0
  29. package/agents/gsd-research-synthesizer.md +247 -0
  30. package/agents/gsd-roadmapper.md +688 -0
  31. package/agents/gsd-security-auditor.md +155 -0
  32. package/agents/gsd-ui-auditor.md +495 -0
  33. package/agents/gsd-ui-checker.md +309 -0
  34. package/agents/gsd-ui-researcher.md +380 -0
  35. package/agents/gsd-user-profiler.md +171 -0
  36. package/agents/gsd-verifier.md +830 -0
  37. package/bin/install.js +7062 -0
  38. package/commands/gsd/add-backlog.md +79 -0
  39. package/commands/gsd/add-phase.md +43 -0
  40. package/commands/gsd/add-tests.md +41 -0
  41. package/commands/gsd/add-todo.md +47 -0
  42. package/commands/gsd/ai-integration-phase.md +36 -0
  43. package/commands/gsd/analyze-dependencies.md +34 -0
  44. package/commands/gsd/audit-fix.md +33 -0
  45. package/commands/gsd/audit-milestone.md +36 -0
  46. package/commands/gsd/audit-uat.md +24 -0
  47. package/commands/gsd/autonomous.md +46 -0
  48. package/commands/gsd/check-todos.md +45 -0
  49. package/commands/gsd/cleanup.md +23 -0
  50. package/commands/gsd/code-review-fix.md +52 -0
  51. package/commands/gsd/code-review.md +55 -0
  52. package/commands/gsd/complete-milestone.md +136 -0
  53. package/commands/gsd/debug.md +263 -0
  54. package/commands/gsd/discuss-phase.md +69 -0
  55. package/commands/gsd/do.md +30 -0
  56. package/commands/gsd/docs-update.md +48 -0
  57. package/commands/gsd/eval-review.md +32 -0
  58. package/commands/gsd/execute-phase.md +63 -0
  59. package/commands/gsd/explore.md +27 -0
  60. package/commands/gsd/extract_learnings.md +22 -0
  61. package/commands/gsd/fast.md +30 -0
  62. package/commands/gsd/forensics.md +56 -0
  63. package/commands/gsd/from-gsd2.md +47 -0
  64. package/commands/gsd/graphify.md +201 -0
  65. package/commands/gsd/health.md +22 -0
  66. package/commands/gsd/help.md +24 -0
  67. package/commands/gsd/import.md +37 -0
  68. package/commands/gsd/inbox.md +38 -0
  69. package/commands/gsd/ingest-docs.md +42 -0
  70. package/commands/gsd/insert-phase.md +32 -0
  71. package/commands/gsd/intel.md +179 -0
  72. package/commands/gsd/join-discord.md +19 -0
  73. package/commands/gsd/list-phase-assumptions.md +46 -0
  74. package/commands/gsd/list-workspaces.md +19 -0
  75. package/commands/gsd/manager.md +40 -0
  76. package/commands/gsd/map-codebase.md +71 -0
  77. package/commands/gsd/milestone-summary.md +51 -0
  78. package/commands/gsd/new-milestone.md +44 -0
  79. package/commands/gsd/new-project.md +46 -0
  80. package/commands/gsd/new-workspace.md +44 -0
  81. package/commands/gsd/next.md +28 -0
  82. package/commands/gsd/note.md +34 -0
  83. package/commands/gsd/pause-work.md +38 -0
  84. package/commands/gsd/plan-milestone-gaps.md +34 -0
  85. package/commands/gsd/plan-phase.md +52 -0
  86. package/commands/gsd/plan-review-convergence.md +52 -0
  87. package/commands/gsd/plant-seed.md +28 -0
  88. package/commands/gsd/pr-branch.md +25 -0
  89. package/commands/gsd/profile-user.md +46 -0
  90. package/commands/gsd/progress.md +25 -0
  91. package/commands/gsd/quick.md +173 -0
  92. package/commands/gsd/reapply-patches.md +331 -0
  93. package/commands/gsd/remove-phase.md +31 -0
  94. package/commands/gsd/remove-workspace.md +26 -0
  95. package/commands/gsd/research-phase.md +195 -0
  96. package/commands/gsd/resume-work.md +40 -0
  97. package/commands/gsd/review-backlog.md +62 -0
  98. package/commands/gsd/review.md +40 -0
  99. package/commands/gsd/scan.md +26 -0
  100. package/commands/gsd/secure-phase.md +35 -0
  101. package/commands/gsd/session-report.md +19 -0
  102. package/commands/gsd/set-profile.md +12 -0
  103. package/commands/gsd/settings.md +36 -0
  104. package/commands/gsd/ship.md +23 -0
  105. package/commands/gsd/sketch-wrap-up.md +31 -0
  106. package/commands/gsd/sketch.md +49 -0
  107. package/commands/gsd/spec-phase.md +62 -0
  108. package/commands/gsd/spike-wrap-up.md +31 -0
  109. package/commands/gsd/spike.md +46 -0
  110. package/commands/gsd/stats.md +18 -0
  111. package/commands/gsd/sync-skills.md +19 -0
  112. package/commands/gsd/thread.md +227 -0
  113. package/commands/gsd/ui-phase.md +34 -0
  114. package/commands/gsd/ui-review.md +32 -0
  115. package/commands/gsd/ultraplan-phase.md +33 -0
  116. package/commands/gsd/undo.md +34 -0
  117. package/commands/gsd/update.md +37 -0
  118. package/commands/gsd/validate-phase.md +35 -0
  119. package/commands/gsd/verify-work.md +38 -0
  120. package/commands/gsd/workstreams.md +69 -0
  121. package/get-shit-done/bin/gsd-tools.cjs +1263 -0
  122. package/get-shit-done/bin/lib/artifacts.cjs +52 -0
  123. package/get-shit-done/bin/lib/audit.cjs +757 -0
  124. package/get-shit-done/bin/lib/commands.cjs +1023 -0
  125. package/get-shit-done/bin/lib/config-schema.cjs +79 -0
  126. package/get-shit-done/bin/lib/config.cjs +463 -0
  127. package/get-shit-done/bin/lib/core.cjs +1794 -0
  128. package/get-shit-done/bin/lib/docs.cjs +267 -0
  129. package/get-shit-done/bin/lib/frontmatter.cjs +379 -0
  130. package/get-shit-done/bin/lib/graphify.cjs +494 -0
  131. package/get-shit-done/bin/lib/gsd2-import.cjs +511 -0
  132. package/get-shit-done/bin/lib/init.cjs +1878 -0
  133. package/get-shit-done/bin/lib/intel.cjs +639 -0
  134. package/get-shit-done/bin/lib/learnings.cjs +378 -0
  135. package/get-shit-done/bin/lib/milestone.cjs +283 -0
  136. package/get-shit-done/bin/lib/model-profiles.cjs +71 -0
  137. package/get-shit-done/bin/lib/phase.cjs +1058 -0
  138. package/get-shit-done/bin/lib/profile-output.cjs +1080 -0
  139. package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
  140. package/get-shit-done/bin/lib/roadmap.cjs +523 -0
  141. package/get-shit-done/bin/lib/schema-detect.cjs +238 -0
  142. package/get-shit-done/bin/lib/security.cjs +504 -0
  143. package/get-shit-done/bin/lib/state.cjs +1649 -0
  144. package/get-shit-done/bin/lib/template.cjs +226 -0
  145. package/get-shit-done/bin/lib/uat.cjs +288 -0
  146. package/get-shit-done/bin/lib/verify.cjs +1184 -0
  147. package/get-shit-done/bin/lib/workstream.cjs +495 -0
  148. package/get-shit-done/bin/repair-sdk.cjs +177 -0
  149. package/get-shit-done/contexts/dev.md +21 -0
  150. package/get-shit-done/contexts/research.md +22 -0
  151. package/get-shit-done/contexts/review.md +22 -0
  152. package/get-shit-done/references/agent-contracts.md +79 -0
  153. package/get-shit-done/references/ai-evals.md +156 -0
  154. package/get-shit-done/references/ai-frameworks.md +186 -0
  155. package/get-shit-done/references/artifact-types.md +131 -0
  156. package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
  157. package/get-shit-done/references/checkpoints.md +808 -0
  158. package/get-shit-done/references/common-bug-patterns.md +114 -0
  159. package/get-shit-done/references/context-budget.md +49 -0
  160. package/get-shit-done/references/continuation-format.md +253 -0
  161. package/get-shit-done/references/debugger-philosophy.md +76 -0
  162. package/get-shit-done/references/decimal-phase-calculation.md +64 -0
  163. package/get-shit-done/references/doc-conflict-engine.md +91 -0
  164. package/get-shit-done/references/domain-probes.md +125 -0
  165. package/get-shit-done/references/executor-examples.md +110 -0
  166. package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
  167. package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
  168. package/get-shit-done/references/gate-prompts.md +100 -0
  169. package/get-shit-done/references/gates.md +70 -0
  170. package/get-shit-done/references/git-integration.md +295 -0
  171. package/get-shit-done/references/git-planning-commit.md +40 -0
  172. package/get-shit-done/references/ios-scaffold.md +123 -0
  173. package/get-shit-done/references/mandatory-initial-read.md +2 -0
  174. package/get-shit-done/references/model-profile-resolution.md +38 -0
  175. package/get-shit-done/references/model-profiles.md +145 -0
  176. package/get-shit-done/references/phase-argument-parsing.md +61 -0
  177. package/get-shit-done/references/planner-antipatterns.md +89 -0
  178. package/get-shit-done/references/planner-gap-closure.md +62 -0
  179. package/get-shit-done/references/planner-reviews.md +39 -0
  180. package/get-shit-done/references/planner-revision.md +87 -0
  181. package/get-shit-done/references/planner-source-audit.md +73 -0
  182. package/get-shit-done/references/planning-config.md +460 -0
  183. package/get-shit-done/references/project-skills-discovery.md +19 -0
  184. package/get-shit-done/references/questioning.md +162 -0
  185. package/get-shit-done/references/revision-loop.md +97 -0
  186. package/get-shit-done/references/sketch-interactivity.md +41 -0
  187. package/get-shit-done/references/sketch-theme-system.md +94 -0
  188. package/get-shit-done/references/sketch-tooling.md +45 -0
  189. package/get-shit-done/references/sketch-variant-patterns.md +81 -0
  190. package/get-shit-done/references/tdd.md +330 -0
  191. package/get-shit-done/references/thinking-models-debug.md +44 -0
  192. package/get-shit-done/references/thinking-models-execution.md +50 -0
  193. package/get-shit-done/references/thinking-models-planning.md +62 -0
  194. package/get-shit-done/references/thinking-models-research.md +50 -0
  195. package/get-shit-done/references/thinking-models-verification.md +55 -0
  196. package/get-shit-done/references/thinking-partner.md +96 -0
  197. package/get-shit-done/references/ui-brand.md +160 -0
  198. package/get-shit-done/references/universal-anti-patterns.md +63 -0
  199. package/get-shit-done/references/user-profiling.md +681 -0
  200. package/get-shit-done/references/verification-overrides.md +227 -0
  201. package/get-shit-done/references/verification-patterns.md +612 -0
  202. package/get-shit-done/references/workstream-flag.md +111 -0
  203. package/get-shit-done/templates/AI-SPEC.md +246 -0
  204. package/get-shit-done/templates/DEBUG.md +169 -0
  205. package/get-shit-done/templates/README.md +76 -0
  206. package/get-shit-done/templates/SECURITY.md +61 -0
  207. package/get-shit-done/templates/UAT.md +265 -0
  208. package/get-shit-done/templates/UI-SPEC.md +100 -0
  209. package/get-shit-done/templates/VALIDATION.md +76 -0
  210. package/get-shit-done/templates/claude-md.md +145 -0
  211. package/get-shit-done/templates/codebase/architecture.md +255 -0
  212. package/get-shit-done/templates/codebase/concerns.md +310 -0
  213. package/get-shit-done/templates/codebase/conventions.md +307 -0
  214. package/get-shit-done/templates/codebase/integrations.md +280 -0
  215. package/get-shit-done/templates/codebase/stack.md +186 -0
  216. package/get-shit-done/templates/codebase/structure.md +285 -0
  217. package/get-shit-done/templates/codebase/testing.md +480 -0
  218. package/get-shit-done/templates/config.json +56 -0
  219. package/get-shit-done/templates/context.md +352 -0
  220. package/get-shit-done/templates/continue-here.md +78 -0
  221. package/get-shit-done/templates/copilot-instructions.md +7 -0
  222. package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
  223. package/get-shit-done/templates/dev-preferences.md +21 -0
  224. package/get-shit-done/templates/discovery.md +146 -0
  225. package/get-shit-done/templates/discussion-log.md +63 -0
  226. package/get-shit-done/templates/milestone-archive.md +123 -0
  227. package/get-shit-done/templates/milestone.md +115 -0
  228. package/get-shit-done/templates/phase-prompt.md +610 -0
  229. package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
  230. package/get-shit-done/templates/project.md +186 -0
  231. package/get-shit-done/templates/requirements.md +231 -0
  232. package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
  233. package/get-shit-done/templates/research-project/FEATURES.md +147 -0
  234. package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
  235. package/get-shit-done/templates/research-project/STACK.md +120 -0
  236. package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
  237. package/get-shit-done/templates/research.md +592 -0
  238. package/get-shit-done/templates/retrospective.md +54 -0
  239. package/get-shit-done/templates/roadmap.md +202 -0
  240. package/get-shit-done/templates/spec.md +307 -0
  241. package/get-shit-done/templates/state.md +184 -0
  242. package/get-shit-done/templates/summary-complex.md +59 -0
  243. package/get-shit-done/templates/summary-minimal.md +41 -0
  244. package/get-shit-done/templates/summary-standard.md +48 -0
  245. package/get-shit-done/templates/summary.md +248 -0
  246. package/get-shit-done/templates/user-profile.md +146 -0
  247. package/get-shit-done/templates/user-setup.md +311 -0
  248. package/get-shit-done/templates/verification-report.md +322 -0
  249. package/get-shit-done/workflows/add-phase.md +112 -0
  250. package/get-shit-done/workflows/add-tests.md +354 -0
  251. package/get-shit-done/workflows/add-todo.md +160 -0
  252. package/get-shit-done/workflows/ai-integration-phase.md +284 -0
  253. package/get-shit-done/workflows/analyze-dependencies.md +96 -0
  254. package/get-shit-done/workflows/audit-fix.md +175 -0
  255. package/get-shit-done/workflows/audit-milestone.md +340 -0
  256. package/get-shit-done/workflows/audit-uat.md +109 -0
  257. package/get-shit-done/workflows/autonomous.md +789 -0
  258. package/get-shit-done/workflows/check-todos.md +179 -0
  259. package/get-shit-done/workflows/cleanup.md +154 -0
  260. package/get-shit-done/workflows/code-review-fix.md +497 -0
  261. package/get-shit-done/workflows/code-review.md +515 -0
  262. package/get-shit-done/workflows/complete-milestone.md +847 -0
  263. package/get-shit-done/workflows/diagnose-issues.md +238 -0
  264. package/get-shit-done/workflows/discovery-phase.md +291 -0
  265. package/get-shit-done/workflows/discuss-phase-assumptions.md +670 -0
  266. package/get-shit-done/workflows/discuss-phase-power.md +308 -0
  267. package/get-shit-done/workflows/discuss-phase.md +1378 -0
  268. package/get-shit-done/workflows/do.md +110 -0
  269. package/get-shit-done/workflows/docs-update.md +1155 -0
  270. package/get-shit-done/workflows/eval-review.md +155 -0
  271. package/get-shit-done/workflows/execute-phase.md +1677 -0
  272. package/get-shit-done/workflows/execute-plan.md +533 -0
  273. package/get-shit-done/workflows/explore.md +141 -0
  274. package/get-shit-done/workflows/extract_learnings.md +242 -0
  275. package/get-shit-done/workflows/fast.md +105 -0
  276. package/get-shit-done/workflows/forensics.md +265 -0
  277. package/get-shit-done/workflows/graduation.md +195 -0
  278. package/get-shit-done/workflows/health.md +314 -0
  279. package/get-shit-done/workflows/help.md +667 -0
  280. package/get-shit-done/workflows/import.md +246 -0
  281. package/get-shit-done/workflows/inbox.md +387 -0
  282. package/get-shit-done/workflows/ingest-docs.md +328 -0
  283. package/get-shit-done/workflows/insert-phase.md +130 -0
  284. package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
  285. package/get-shit-done/workflows/list-workspaces.md +56 -0
  286. package/get-shit-done/workflows/manager.md +365 -0
  287. package/get-shit-done/workflows/map-codebase.md +393 -0
  288. package/get-shit-done/workflows/milestone-summary.md +223 -0
  289. package/get-shit-done/workflows/new-milestone.md +611 -0
  290. package/get-shit-done/workflows/new-project.md +1391 -0
  291. package/get-shit-done/workflows/new-workspace.md +239 -0
  292. package/get-shit-done/workflows/next.md +220 -0
  293. package/get-shit-done/workflows/node-repair.md +92 -0
  294. package/get-shit-done/workflows/note.md +158 -0
  295. package/get-shit-done/workflows/pause-work.md +243 -0
  296. package/get-shit-done/workflows/plan-milestone-gaps.md +273 -0
  297. package/get-shit-done/workflows/plan-phase.md +1349 -0
  298. package/get-shit-done/workflows/plan-review-convergence.md +254 -0
  299. package/get-shit-done/workflows/plant-seed.md +172 -0
  300. package/get-shit-done/workflows/pr-branch.md +157 -0
  301. package/get-shit-done/workflows/profile-user.md +452 -0
  302. package/get-shit-done/workflows/progress.md +619 -0
  303. package/get-shit-done/workflows/quick.md +970 -0
  304. package/get-shit-done/workflows/remove-phase.md +155 -0
  305. package/get-shit-done/workflows/remove-workspace.md +92 -0
  306. package/get-shit-done/workflows/research-phase.md +89 -0
  307. package/get-shit-done/workflows/resume-project.md +326 -0
  308. package/get-shit-done/workflows/review.md +344 -0
  309. package/get-shit-done/workflows/scan.md +102 -0
  310. package/get-shit-done/workflows/secure-phase.md +166 -0
  311. package/get-shit-done/workflows/session-report.md +146 -0
  312. package/get-shit-done/workflows/settings.md +319 -0
  313. package/get-shit-done/workflows/ship.md +302 -0
  314. package/get-shit-done/workflows/sketch-wrap-up.md +283 -0
  315. package/get-shit-done/workflows/sketch.md +286 -0
  316. package/get-shit-done/workflows/spec-phase.md +262 -0
  317. package/get-shit-done/workflows/spike-wrap-up.md +281 -0
  318. package/get-shit-done/workflows/spike.md +362 -0
  319. package/get-shit-done/workflows/stats.md +60 -0
  320. package/get-shit-done/workflows/sync-skills.md +182 -0
  321. package/get-shit-done/workflows/transition.md +693 -0
  322. package/get-shit-done/workflows/ui-phase.md +323 -0
  323. package/get-shit-done/workflows/ui-review.md +190 -0
  324. package/get-shit-done/workflows/ultraplan-phase.md +189 -0
  325. package/get-shit-done/workflows/undo.md +314 -0
  326. package/get-shit-done/workflows/update.md +587 -0
  327. package/get-shit-done/workflows/validate-phase.md +176 -0
  328. package/get-shit-done/workflows/verify-phase.md +465 -0
  329. package/get-shit-done/workflows/verify-work.md +740 -0
  330. package/hooks/dist/gsd-check-update-worker.js +108 -0
  331. package/hooks/dist/gsd-check-update.js +64 -0
  332. package/hooks/dist/gsd-context-monitor.js +192 -0
  333. package/hooks/dist/gsd-phase-boundary.sh +28 -0
  334. package/hooks/dist/gsd-prompt-guard.js +97 -0
  335. package/hooks/dist/gsd-read-guard.js +82 -0
  336. package/hooks/dist/gsd-read-injection-scanner.js +152 -0
  337. package/hooks/dist/gsd-session-state.sh +34 -0
  338. package/hooks/dist/gsd-statusline.js +293 -0
  339. package/hooks/dist/gsd-validate-commit.sh +48 -0
  340. package/hooks/dist/gsd-workflow-guard.js +94 -0
  341. package/hooks/gsd-check-update-worker.js +108 -0
  342. package/hooks/gsd-check-update.js +64 -0
  343. package/hooks/gsd-context-monitor.js +192 -0
  344. package/hooks/gsd-phase-boundary.sh +28 -0
  345. package/hooks/gsd-prompt-guard.js +97 -0
  346. package/hooks/gsd-read-guard.js +82 -0
  347. package/hooks/gsd-read-injection-scanner.js +152 -0
  348. package/hooks/gsd-session-state.sh +34 -0
  349. package/hooks/gsd-statusline.js +293 -0
  350. package/hooks/gsd-validate-commit.sh +48 -0
  351. package/hooks/gsd-workflow-guard.js +94 -0
  352. package/package.json +59 -0
  353. package/scripts/base64-scan.sh +262 -0
  354. package/scripts/build-hooks.js +95 -0
  355. package/scripts/gen-inventory-manifest.cjs +109 -0
  356. package/scripts/prompt-injection-scan.sh +201 -0
  357. package/scripts/run-tests.cjs +33 -0
  358. package/scripts/secret-scan.sh +227 -0
  359. package/sdk/package-lock.json +1998 -0
  360. package/sdk/package.json +52 -0
  361. package/sdk/prompts/agents/gsd-executor.md +110 -0
  362. package/sdk/prompts/agents/gsd-phase-researcher.md +158 -0
  363. package/sdk/prompts/agents/gsd-plan-checker.md +160 -0
  364. package/sdk/prompts/agents/gsd-planner.md +214 -0
  365. package/sdk/prompts/agents/gsd-project-researcher.md +323 -0
  366. package/sdk/prompts/agents/gsd-research-synthesizer.md +237 -0
  367. package/sdk/prompts/agents/gsd-roadmapper.md +670 -0
  368. package/sdk/prompts/agents/gsd-verifier.md +159 -0
  369. package/sdk/prompts/templates/project.md +186 -0
  370. package/sdk/prompts/templates/requirements.md +231 -0
  371. package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
  372. package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
  373. package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
  374. package/sdk/prompts/templates/research-project/STACK.md +120 -0
  375. package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
  376. package/sdk/prompts/templates/roadmap.md +202 -0
  377. package/sdk/prompts/templates/state.md +175 -0
  378. package/sdk/prompts/workflows/discuss-phase.md +126 -0
  379. package/sdk/prompts/workflows/execute-plan.md +106 -0
  380. package/sdk/prompts/workflows/plan-phase.md +84 -0
  381. package/sdk/prompts/workflows/research-phase.md +45 -0
  382. package/sdk/prompts/workflows/verify-phase.md +142 -0
  383. package/sdk/src/assembled-prompts.test.ts +349 -0
  384. package/sdk/src/cli-transport.test.ts +388 -0
  385. package/sdk/src/cli-transport.ts +130 -0
  386. package/sdk/src/cli.test.ts +383 -0
  387. package/sdk/src/cli.ts +670 -0
  388. package/sdk/src/config.test.ts +168 -0
  389. package/sdk/src/config.ts +177 -0
  390. package/sdk/src/context-engine.test.ts +295 -0
  391. package/sdk/src/context-engine.ts +170 -0
  392. package/sdk/src/context-truncation.test.ts +163 -0
  393. package/sdk/src/context-truncation.ts +233 -0
  394. package/sdk/src/e2e.integration.test.ts +178 -0
  395. package/sdk/src/errors.ts +72 -0
  396. package/sdk/src/event-stream.test.ts +661 -0
  397. package/sdk/src/event-stream.ts +441 -0
  398. package/sdk/src/failure-memory.test.ts +457 -0
  399. package/sdk/src/failure-memory.ts +1324 -0
  400. package/sdk/src/golden/capture.ts +95 -0
  401. package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
  402. package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
  403. package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
  404. package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
  405. package/sdk/src/golden/golden-integration-covered.ts +30 -0
  406. package/sdk/src/golden/golden-mutation-covered.ts +7 -0
  407. package/sdk/src/golden/golden-policy.test.ts +8 -0
  408. package/sdk/src/golden/golden-policy.ts +112 -0
  409. package/sdk/src/golden/golden.integration.test.ts +373 -0
  410. package/sdk/src/golden/init-golden-normalize.ts +15 -0
  411. package/sdk/src/golden/read-only-golden-rows.ts +77 -0
  412. package/sdk/src/golden/read-only-parity.integration.test.ts +125 -0
  413. package/sdk/src/golden/registry-canonical-commands.ts +31 -0
  414. package/sdk/src/gsd-tools.test.ts +409 -0
  415. package/sdk/src/gsd-tools.ts +595 -0
  416. package/sdk/src/headless-prompts.test.ts +159 -0
  417. package/sdk/src/index.ts +333 -0
  418. package/sdk/src/init-e2e.integration.test.ts +136 -0
  419. package/sdk/src/init-runner.test.ts +783 -0
  420. package/sdk/src/init-runner.ts +735 -0
  421. package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
  422. package/sdk/src/logger.test.ts +149 -0
  423. package/sdk/src/logger.ts +113 -0
  424. package/sdk/src/milestone-runner.test.ts +421 -0
  425. package/sdk/src/phase-prompt.test.ts +538 -0
  426. package/sdk/src/phase-prompt.ts +264 -0
  427. package/sdk/src/phase-runner-types.test.ts +421 -0
  428. package/sdk/src/phase-runner.integration.test.ts +377 -0
  429. package/sdk/src/phase-runner.test.ts +2333 -0
  430. package/sdk/src/phase-runner.ts +1203 -0
  431. package/sdk/src/plan-parser.test.ts +528 -0
  432. package/sdk/src/plan-parser.ts +427 -0
  433. package/sdk/src/prompt-builder.test.ts +306 -0
  434. package/sdk/src/prompt-builder.ts +193 -0
  435. package/sdk/src/prompt-sanitizer.test.ts +260 -0
  436. package/sdk/src/prompt-sanitizer.ts +71 -0
  437. package/sdk/src/query/QUERY-HANDLERS.md +317 -0
  438. package/sdk/src/query/audit-open.ts +722 -0
  439. package/sdk/src/query/check-auto-mode.test.ts +77 -0
  440. package/sdk/src/query/check-auto-mode.ts +50 -0
  441. package/sdk/src/query/check-completion.test.ts +113 -0
  442. package/sdk/src/query/check-completion.ts +182 -0
  443. package/sdk/src/query/check-gates.test.ts +103 -0
  444. package/sdk/src/query/check-gates.ts +112 -0
  445. package/sdk/src/query/check-ship-ready.test.ts +77 -0
  446. package/sdk/src/query/check-ship-ready.ts +103 -0
  447. package/sdk/src/query/check-verification-status.test.ts +143 -0
  448. package/sdk/src/query/check-verification-status.ts +160 -0
  449. package/sdk/src/query/commit.test.ts +202 -0
  450. package/sdk/src/query/commit.ts +301 -0
  451. package/sdk/src/query/config-gates.test.ts +89 -0
  452. package/sdk/src/query/config-gates.ts +69 -0
  453. package/sdk/src/query/config-mutation.test.ts +365 -0
  454. package/sdk/src/query/config-mutation.ts +497 -0
  455. package/sdk/src/query/config-query.test.ts +161 -0
  456. package/sdk/src/query/config-query.ts +190 -0
  457. package/sdk/src/query/context-history.test.ts +165 -0
  458. package/sdk/src/query/context-history.ts +467 -0
  459. package/sdk/src/query/decomposed-handlers.test.ts +365 -0
  460. package/sdk/src/query/detect-custom-files.ts +97 -0
  461. package/sdk/src/query/detect-phase-type.test.ts +105 -0
  462. package/sdk/src/query/detect-phase-type.ts +141 -0
  463. package/sdk/src/query/docs-init.ts +257 -0
  464. package/sdk/src/query/failure-capture.ts +58 -0
  465. package/sdk/src/query/frontmatter-array.test.ts +14 -0
  466. package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
  467. package/sdk/src/query/frontmatter-mutation.ts +343 -0
  468. package/sdk/src/query/frontmatter.test.ts +281 -0
  469. package/sdk/src/query/frontmatter.ts +397 -0
  470. package/sdk/src/query/helpers.test.ts +426 -0
  471. package/sdk/src/query/helpers.ts +482 -0
  472. package/sdk/src/query/index.ts +586 -0
  473. package/sdk/src/query/init-complex.test.ts +232 -0
  474. package/sdk/src/query/init-complex.ts +578 -0
  475. package/sdk/src/query/init.test.ts +522 -0
  476. package/sdk/src/query/init.ts +1046 -0
  477. package/sdk/src/query/intel.test.ts +90 -0
  478. package/sdk/src/query/intel.ts +404 -0
  479. package/sdk/src/query/normalize-query-command.test.ts +50 -0
  480. package/sdk/src/query/normalize-query-command.ts +56 -0
  481. package/sdk/src/query/phase-lifecycle.test.ts +1126 -0
  482. package/sdk/src/query/phase-lifecycle.ts +1799 -0
  483. package/sdk/src/query/phase-list-queries.test.ts +88 -0
  484. package/sdk/src/query/phase-list-queries.ts +152 -0
  485. package/sdk/src/query/phase-ready.test.ts +65 -0
  486. package/sdk/src/query/phase-ready.ts +158 -0
  487. package/sdk/src/query/phase.test.ts +307 -0
  488. package/sdk/src/query/phase.ts +340 -0
  489. package/sdk/src/query/pipeline.test.ts +169 -0
  490. package/sdk/src/query/pipeline.ts +243 -0
  491. package/sdk/src/query/plan-execution-route.test.ts +166 -0
  492. package/sdk/src/query/plan-execution-route.ts +209 -0
  493. package/sdk/src/query/plan-task-structure.test.ts +65 -0
  494. package/sdk/src/query/plan-task-structure.ts +63 -0
  495. package/sdk/src/query/profile-extract-messages.ts +247 -0
  496. package/sdk/src/query/profile-output.ts +908 -0
  497. package/sdk/src/query/profile-questionnaire-data.ts +181 -0
  498. package/sdk/src/query/profile-sample.ts +184 -0
  499. package/sdk/src/query/profile-scan-sessions.ts +174 -0
  500. package/sdk/src/query/profile.test.ts +74 -0
  501. package/sdk/src/query/profile.ts +337 -0
  502. package/sdk/src/query/progress.test.ts +156 -0
  503. package/sdk/src/query/progress.ts +566 -0
  504. package/sdk/src/query/registry.test.ts +216 -0
  505. package/sdk/src/query/registry.ts +174 -0
  506. package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
  507. package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
  508. package/sdk/src/query/roadmap-update-plan-progress.ts +132 -0
  509. package/sdk/src/query/roadmap.test.ts +359 -0
  510. package/sdk/src/query/roadmap.ts +591 -0
  511. package/sdk/src/query/route-next-action.test.ts +61 -0
  512. package/sdk/src/query/route-next-action.ts +345 -0
  513. package/sdk/src/query/runtime-health.ts +7 -0
  514. package/sdk/src/query/schema-detect.ts +189 -0
  515. package/sdk/src/query/skill-manifest.ts +214 -0
  516. package/sdk/src/query/skills.test.ts +80 -0
  517. package/sdk/src/query/skills.ts +62 -0
  518. package/sdk/src/query/state-mutation.test.ts +450 -0
  519. package/sdk/src/query/state-mutation.ts +1444 -0
  520. package/sdk/src/query/state-project-load.ts +109 -0
  521. package/sdk/src/query/state.test.ts +347 -0
  522. package/sdk/src/query/state.ts +397 -0
  523. package/sdk/src/query/summary.test.ts +95 -0
  524. package/sdk/src/query/summary.ts +296 -0
  525. package/sdk/src/query/template.test.ts +180 -0
  526. package/sdk/src/query/template.ts +242 -0
  527. package/sdk/src/query/uat.test.ts +77 -0
  528. package/sdk/src/query/uat.ts +314 -0
  529. package/sdk/src/query/utils.test.ts +82 -0
  530. package/sdk/src/query/utils.ts +92 -0
  531. package/sdk/src/query/validate.test.ts +656 -0
  532. package/sdk/src/query/validate.ts +807 -0
  533. package/sdk/src/query/verify.test.ts +414 -0
  534. package/sdk/src/query/verify.ts +645 -0
  535. package/sdk/src/query/websearch.test.ts +31 -0
  536. package/sdk/src/query/websearch.ts +82 -0
  537. package/sdk/src/query/workspace.test.ts +119 -0
  538. package/sdk/src/query/workspace.ts +131 -0
  539. package/sdk/src/query/workstream.test.ts +51 -0
  540. package/sdk/src/query/workstream.ts +434 -0
  541. package/sdk/src/research-gate.test.ts +190 -0
  542. package/sdk/src/research-gate.ts +94 -0
  543. package/sdk/src/runtime-health.test.ts +176 -0
  544. package/sdk/src/runtime-health.ts +387 -0
  545. package/sdk/src/session-runner.test.ts +98 -0
  546. package/sdk/src/session-runner.ts +299 -0
  547. package/sdk/src/tool-scoping.test.ts +160 -0
  548. package/sdk/src/tool-scoping.ts +61 -0
  549. package/sdk/src/types.ts +917 -0
  550. package/sdk/src/workstream-utils.ts +33 -0
  551. package/sdk/src/ws-flag.test.ts +285 -0
  552. package/sdk/src/ws-transport.test.ts +161 -0
  553. package/sdk/src/ws-transport.ts +93 -0
  554. package/sdk/tsconfig.json +20 -0
package/sdk/src/cli.ts ADDED
@@ -0,0 +1,670 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for gsd-remix-sdk.
4
+ *
5
+ * Usage: gsd-remix-sdk run "<prompt>" [--project-dir <dir>] [--ws-port <port>]
6
+ * [--model <model>] [--max-budget <n>]
7
+ */
8
+
9
+ import { parseArgs } from 'node:util';
10
+ import { execFile } from 'node:child_process';
11
+ import { readFile } from 'node:fs/promises';
12
+ import { resolve, join, isAbsolute } from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+
15
+ import { GSD } from './index.js';
16
+ import { CLITransport } from './cli-transport.js';
17
+ import { WSTransport } from './ws-transport.js';
18
+ import { InitRunner } from './init-runner.js';
19
+ import { validateWorkstreamName } from './workstream-utils.js';
20
+
21
+ // ─── Parsed CLI args ─────────────────────────────────────────────────────────
22
+
23
+ export interface ParsedCliArgs {
24
+ command: string | undefined;
25
+ prompt: string | undefined;
26
+ /** For 'init' command: the raw input source (@file, text, or undefined for stdin). */
27
+ initInput: string | undefined;
28
+ /** For 'auto --init': bootstrap from a PRD before running the autonomous loop. */
29
+ init: string | undefined;
30
+ projectDir: string;
31
+ wsPort: number | undefined;
32
+ model: string | undefined;
33
+ maxBudget: number | undefined;
34
+ /** Workstream name for multi-workstream projects. Routes .planning/ to .planning/workstreams/<name>/. */
35
+ ws: string | undefined;
36
+ help: boolean;
37
+ version: boolean;
38
+ /**
39
+ * When `command === 'query'`, tokens after `query` with only known SDK flags removed.
40
+ * Extra flags are kept so handlers that share gsd-tools-style argv (e.g. `--pick`) still receive them.
41
+ */
42
+ queryArgv?: string[];
43
+ }
44
+
45
+ /**
46
+ * Parse `gsd-remix-sdk query …` without rejecting unknown flags (query argv is forwarded to the registry).
47
+ */
48
+ function parseCliArgsQueryPermissive(argv: string[]): ParsedCliArgs {
49
+ let projectDir = process.cwd();
50
+ let ws: string | undefined;
51
+ let wsPort: number | undefined;
52
+ let model: string | undefined;
53
+ let maxBudget: number | undefined;
54
+ let help = false;
55
+ let version = false;
56
+ const queryArgv: string[] = [];
57
+
58
+ let i = 1;
59
+ while (i < argv.length) {
60
+ const a = argv[i];
61
+ if (a === '--project-dir' && argv[i + 1]) {
62
+ projectDir = argv[i + 1];
63
+ i += 2;
64
+ continue;
65
+ }
66
+ if (a === '--ws' && argv[i + 1]) {
67
+ ws = argv[i + 1];
68
+ i += 2;
69
+ continue;
70
+ }
71
+ if (a === '--ws-port' && argv[i + 1]) {
72
+ wsPort = Number(argv[i + 1]);
73
+ i += 2;
74
+ continue;
75
+ }
76
+ if (a === '--model' && argv[i + 1]) {
77
+ model = argv[i + 1];
78
+ i += 2;
79
+ continue;
80
+ }
81
+ if (a === '--max-budget' && argv[i + 1]) {
82
+ maxBudget = Number(argv[i + 1]);
83
+ i += 2;
84
+ continue;
85
+ }
86
+ if (a === '-h' || a === '--help') {
87
+ help = true;
88
+ i += 1;
89
+ continue;
90
+ }
91
+ if (a === '-v' || a === '--version') {
92
+ version = true;
93
+ i += 1;
94
+ continue;
95
+ }
96
+ queryArgv.push(a);
97
+ i += 1;
98
+ }
99
+
100
+ return {
101
+ command: 'query',
102
+ prompt: undefined,
103
+ initInput: undefined,
104
+ init: undefined,
105
+ projectDir,
106
+ wsPort,
107
+ model,
108
+ maxBudget,
109
+ ws,
110
+ help,
111
+ version,
112
+ queryArgv,
113
+ };
114
+ }
115
+
116
+ /**
117
+ * Parse CLI arguments into a structured object.
118
+ * Exported for testing — the main() function uses this internally.
119
+ */
120
+ export function parseCliArgs(argv: string[]): ParsedCliArgs {
121
+ if (argv[0] === 'query') {
122
+ return parseCliArgsQueryPermissive(argv);
123
+ }
124
+
125
+ const { values, positionals } = parseArgs({
126
+ args: argv,
127
+ options: {
128
+ 'project-dir': { type: 'string', default: process.cwd() },
129
+ 'ws-port': { type: 'string' },
130
+ ws: { type: 'string' },
131
+ model: { type: 'string' },
132
+ 'max-budget': { type: 'string' },
133
+ init: { type: 'string' },
134
+ help: { type: 'boolean', short: 'h', default: false },
135
+ version: { type: 'boolean', short: 'v', default: false },
136
+ },
137
+ allowPositionals: true,
138
+ strict: true,
139
+ });
140
+
141
+ const command = positionals[0] as string | undefined;
142
+ const prompt = positionals.slice(1).join(' ') || undefined;
143
+
144
+ // For 'init' command, the positional after 'init' is the input source.
145
+ // For 'run' command, it's the prompt. Both use positionals[1+].
146
+ const initInput = command === 'init' ? prompt : undefined;
147
+
148
+ return {
149
+ command,
150
+ prompt,
151
+ initInput,
152
+ init: values.init as string | undefined,
153
+ projectDir: values['project-dir'] as string,
154
+ wsPort: values['ws-port'] ? Number(values['ws-port']) : undefined,
155
+ model: values.model as string | undefined,
156
+ maxBudget: values['max-budget'] ? Number(values['max-budget']) : undefined,
157
+ ws: values.ws as string | undefined,
158
+ help: values.help as boolean,
159
+ version: values.version as boolean,
160
+ };
161
+ }
162
+
163
+ // ─── Usage ───────────────────────────────────────────────────────────────────
164
+
165
+ export const USAGE = `
166
+ Usage: gsd-remix-sdk <command> [args] [options]
167
+
168
+ Commands:
169
+ run <prompt> Run a full milestone from a text prompt
170
+ auto Run the full autonomous lifecycle (discover -> execute -> advance)
171
+ init [input] Bootstrap a new project from a PRD or description
172
+ input can be:
173
+ @path/to/prd.md Read input from a file
174
+ "description" Use text directly
175
+ (empty) Read from stdin
176
+ query <argv...> Registered query handlers only (longest-prefix argv match; see QUERY-HANDLERS.md)
177
+ Use --pick <field> to extract a specific field from JSON output
178
+
179
+ Options:
180
+ --init <input> Bootstrap from a PRD before running (auto only)
181
+ Accepts @path/to/prd.md or "description text"
182
+ --project-dir <dir> Project directory (default: cwd)
183
+ --ws <name> Route .planning/ to .planning/workstreams/<name>/
184
+ --ws-port <port> Enable WebSocket transport on <port>
185
+ --model <model> Override LLM model
186
+ --max-budget <n> Max budget per step in USD
187
+ -h, --help Show this help
188
+ -v, --version Show version
189
+ `.trim();
190
+
191
+ /**
192
+ * Read the package version from package.json.
193
+ */
194
+ async function getVersion(): Promise<string> {
195
+ try {
196
+ const pkgPath = resolve(fileURLToPath(import.meta.url), '..', '..', 'package.json');
197
+ const raw = await readFile(pkgPath, 'utf-8');
198
+ const pkg = JSON.parse(raw) as { version?: string };
199
+ return pkg.version ?? 'unknown';
200
+ } catch {
201
+ return 'unknown';
202
+ }
203
+ }
204
+
205
+ // ─── Init input resolution ───────────────────────────────────────────────────
206
+
207
+ /**
208
+ * Resolve the init command input to a string.
209
+ *
210
+ * - `@path/to/file.md` → reads the file contents
211
+ * - Raw text → returns as-is
212
+ * - No input → reads from stdin (with TTY detection)
213
+ *
214
+ * Exported for testing.
215
+ */
216
+ export async function resolveInitInput(args: ParsedCliArgs): Promise<string> {
217
+ const input = args.initInput;
218
+
219
+ if (input && input.startsWith('@')) {
220
+ // File path: strip @ prefix, resolve relative to projectDir
221
+ const filePath = resolve(args.projectDir, input.slice(1));
222
+ try {
223
+ return await readFile(filePath, 'utf-8');
224
+ } catch (err) {
225
+ throw new Error(`Cannot read input file "${filePath}": ${(err as NodeJS.ErrnoException).code === 'ENOENT' ? 'file not found' : (err as Error).message}`);
226
+ }
227
+ }
228
+
229
+ if (input) {
230
+ // Raw text
231
+ return input;
232
+ }
233
+
234
+ // No input — read from stdin
235
+ return readStdin();
236
+ }
237
+
238
+ /**
239
+ * Read all data from stdin. Rejects if stdin is a TTY with no piped data.
240
+ */
241
+ async function readStdin(): Promise<string> {
242
+ const { stdin } = process;
243
+
244
+ if (stdin.isTTY) {
245
+ throw new Error(
246
+ 'No input provided. Usage:\n' +
247
+ ' gsd-remix-sdk init @path/to/prd.md\n' +
248
+ ' gsd-remix-sdk init "build a todo app"\n' +
249
+ ' cat prd.md | gsd-remix-sdk init'
250
+ );
251
+ }
252
+
253
+ return new Promise<string>((resolve, reject) => {
254
+ const chunks: Buffer[] = [];
255
+ stdin.on('data', (chunk: Buffer) => chunks.push(chunk));
256
+ stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
257
+ stdin.on('error', reject);
258
+ });
259
+ }
260
+
261
+ /** When false, unknown `gsd-remix-sdk query` commands error instead of shelling out to gsd-tools.cjs. */
262
+ function queryFallbackToCjsEnabled(): boolean {
263
+ const v = process.env.GSD_QUERY_FALLBACK?.toLowerCase();
264
+ if (v === 'off' || v === 'never' || v === 'false' || v === '0') return false;
265
+ return true;
266
+ }
267
+
268
+ async function parseCliQueryJsonOutput(raw: string, projectDir: string): Promise<unknown> {
269
+ const trimmed = raw.trim();
270
+ if (trimmed === '') return null;
271
+ let jsonStr = trimmed;
272
+ if (jsonStr.startsWith('@file:')) {
273
+ const rel = jsonStr.slice(6).trim();
274
+ const { resolvePathUnderProject } = await import('./query/helpers.js');
275
+ const filePath = await resolvePathUnderProject(projectDir, rel);
276
+ jsonStr = await readFile(filePath, 'utf-8');
277
+ }
278
+ return JSON.parse(jsonStr);
279
+ }
280
+
281
+ /** Map registry-style dotted command tokens to gsd-tools.cjs argv (space-separated subcommands). */
282
+ function dottedCommandToCjsArgv(normCmd: string, normArgs: string[]): string[] {
283
+ if (normCmd.includes('.')) {
284
+ return [...normCmd.split('.'), ...normArgs];
285
+ }
286
+ return [normCmd, ...normArgs];
287
+ }
288
+
289
+ function execGsdToolsCjsQuery(
290
+ projectDir: string,
291
+ gsdToolsPath: string,
292
+ normCmd: string,
293
+ normArgs: string[],
294
+ ws: string | undefined,
295
+ ): Promise<{ stdout: string; stderr: string }> {
296
+ const cjsArgv = dottedCommandToCjsArgv(normCmd, normArgs);
297
+ const wsSuffix = ws ? ['--ws', ws] : [];
298
+ const fullArgv = [gsdToolsPath, ...cjsArgv, ...wsSuffix];
299
+ return new Promise((resolve, reject) => {
300
+ execFile(
301
+ process.execPath,
302
+ fullArgv,
303
+ { cwd: projectDir, maxBuffer: 10 * 1024 * 1024, env: { ...process.env } },
304
+ (err, stdout, stderr) => {
305
+ if (err) reject(err);
306
+ else resolve({ stdout: stdout?.toString() ?? '', stderr: stderr?.toString() ?? '' });
307
+ },
308
+ );
309
+ });
310
+ }
311
+
312
+ // ─── Main ────────────────────────────────────────────────────────────────────
313
+
314
+ export async function main(argv: string[] = process.argv.slice(2)): Promise<void> {
315
+ let args: ParsedCliArgs;
316
+
317
+ try {
318
+ args = parseCliArgs(argv);
319
+ } catch (err) {
320
+ console.error(`Error: ${(err as Error).message}`);
321
+ console.error(USAGE);
322
+ process.exitCode = 1;
323
+ return;
324
+ }
325
+
326
+ if (args.help) {
327
+ console.log(USAGE);
328
+ return;
329
+ }
330
+
331
+ if (args.version) {
332
+ const ver = await getVersion();
333
+ console.log(`gsd-remix-sdk v${ver}`);
334
+ return;
335
+ }
336
+
337
+ // Validate --ws flag if provided
338
+ if (args.ws !== undefined && !validateWorkstreamName(args.ws)) {
339
+ console.error(`Error: Invalid workstream name "${args.ws}". Use alphanumeric, hyphens, underscores, or dots only.`);
340
+ process.exitCode = 1;
341
+ return;
342
+ }
343
+
344
+ // ─── Query command ──────────────────────────────────────────────────────
345
+ if (args.command === 'query') {
346
+ const { createRegistry } = await import('./query/index.js');
347
+ const { extractField, resolveQueryArgv } = await import('./query/registry.js');
348
+ const { GSDToolsError } = await import('./gsd-tools.js');
349
+ const { GSDError, exitCodeFor, ErrorClassification } = await import('./errors.js');
350
+
351
+ const queryArgs = args.queryArgv ?? [];
352
+
353
+ // Extract --pick before dispatch
354
+ const pickIdx = queryArgs.indexOf('--pick');
355
+ let pickField: string | undefined;
356
+ if (pickIdx !== -1) {
357
+ if (pickIdx + 1 >= queryArgs.length) {
358
+ console.error('Error: --pick requires a field name');
359
+ process.exitCode = 10;
360
+ return;
361
+ }
362
+ pickField = queryArgs[pickIdx + 1];
363
+ queryArgs.splice(pickIdx, 2);
364
+ }
365
+
366
+ if (queryArgs.length === 0 || !queryArgs[0]) {
367
+ console.error('Error: "gsd-remix-sdk query" requires a command');
368
+ process.exitCode = 10;
369
+ return;
370
+ }
371
+
372
+ try {
373
+ const queryCommand = queryArgs[0];
374
+ const { normalizeQueryCommand } = await import('./query/normalize-query-command.js');
375
+ const [normCmd, normArgs] = normalizeQueryCommand(queryCommand, queryArgs.slice(1));
376
+ if (!normCmd || !String(normCmd).trim()) {
377
+ console.error('Error: "gsd-remix-sdk query" requires a command');
378
+ process.exitCode = 10;
379
+ return;
380
+ }
381
+ const registry = createRegistry();
382
+ const tokens = [normCmd, ...normArgs];
383
+ const matched = resolveQueryArgv(tokens, registry);
384
+ if (!matched) {
385
+ if (!queryFallbackToCjsEnabled()) {
386
+ throw new GSDError(
387
+ `Unknown command: "${tokens.join(' ')}". Use a registered \`gsd-remix-sdk query\` subcommand (see sdk/src/query/QUERY-HANDLERS.md) or invoke \`node …/gsd-tools.cjs\` for CJS-only operations. Set GSD_QUERY_FALLBACK=registered (default) to allow automatic fallback.`,
388
+ ErrorClassification.Validation,
389
+ );
390
+ }
391
+ const { resolveGsdToolsPath } = await import('./gsd-tools.js');
392
+ const gsdPath = resolveGsdToolsPath(args.projectDir);
393
+ console.error(
394
+ `[gsd-remix-sdk] '${tokens.join(' ')}' not in native registry; falling back to gsd-tools.cjs.`,
395
+ );
396
+ console.error('[gsd-remix-sdk] Transparent bridge — prefer adding a native handler when parity matters.');
397
+ const { stdout, stderr } = await execGsdToolsCjsQuery(
398
+ args.projectDir,
399
+ gsdPath,
400
+ normCmd,
401
+ normArgs,
402
+ args.ws,
403
+ );
404
+ if (stderr.trim()) console.error(stderr.trimEnd());
405
+ let output: unknown = await parseCliQueryJsonOutput(stdout, args.projectDir);
406
+ if (pickField) {
407
+ output = extractField(output, pickField);
408
+ }
409
+ console.log(JSON.stringify(output, null, 2));
410
+ } else {
411
+ const result = await registry.dispatch(matched.cmd, matched.args, args.projectDir);
412
+ let output: unknown = result.data;
413
+
414
+ if (pickField) {
415
+ output = extractField(output, pickField);
416
+ }
417
+
418
+ console.log(JSON.stringify(output, null, 2));
419
+ }
420
+ } catch (err) {
421
+ if (err instanceof GSDError) {
422
+ console.error(`Error: ${err.message}`);
423
+ process.exitCode = exitCodeFor(err.classification);
424
+ } else if (err instanceof GSDToolsError) {
425
+ console.error(`Error: ${err.message}`);
426
+ process.exitCode = err.exitCode ?? 1;
427
+ } else {
428
+ console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
429
+ process.exitCode = 1;
430
+ }
431
+ }
432
+ return;
433
+ }
434
+
435
+ if (args.command !== 'run' && args.command !== 'init' && args.command !== 'auto') {
436
+ console.error('Error: Expected "gsd-remix-sdk run <prompt>", "gsd-remix-sdk auto", "gsd-remix-sdk init [input]", or "gsd-remix-sdk query <command>"');
437
+ console.error(USAGE);
438
+ process.exitCode = 1;
439
+ return;
440
+ }
441
+
442
+ if (args.command === 'run' && !args.prompt) {
443
+ console.error('Error: "gsd-remix-sdk run" requires a prompt');
444
+ console.error(USAGE);
445
+ process.exitCode = 1;
446
+ return;
447
+ }
448
+
449
+ // ─── Init command ─────────────────────────────────────────────────────────
450
+ if (args.command === 'init') {
451
+ let input: string;
452
+ try {
453
+ input = await resolveInitInput(args);
454
+ } catch (err) {
455
+ console.error(`Error: ${(err as Error).message}`);
456
+ process.exitCode = 1;
457
+ return;
458
+ }
459
+
460
+ console.log(`[init] Resolved input: ${input.length} chars`);
461
+
462
+ // Build GSD instance for tools and event stream
463
+ const gsd = new GSD({
464
+ projectDir: args.projectDir,
465
+ model: args.model,
466
+ maxBudgetUsd: args.maxBudget,
467
+ workstream: args.ws,
468
+ });
469
+
470
+ // Wire CLI transport
471
+ const cliTransport = new CLITransport();
472
+ gsd.addTransport(cliTransport);
473
+
474
+ // Optional WebSocket transport
475
+ let wsTransport: WSTransport | undefined;
476
+ if (args.wsPort !== undefined) {
477
+ wsTransport = new WSTransport({ port: args.wsPort });
478
+ await wsTransport.start();
479
+ gsd.addTransport(wsTransport);
480
+ console.log(`WebSocket transport listening on port ${args.wsPort}`);
481
+ }
482
+
483
+ try {
484
+ const tools = gsd.createTools();
485
+ const runner = new InitRunner({
486
+ projectDir: args.projectDir,
487
+ tools,
488
+ eventStream: gsd.eventStream,
489
+ config: {
490
+ maxBudgetPerSession: args.maxBudget,
491
+ orchestratorModel: args.model,
492
+ },
493
+ });
494
+
495
+ const result = await runner.run(input);
496
+
497
+ // Print completion summary
498
+ const status = result.success ? 'SUCCESS' : 'FAILED';
499
+ const stepCount = result.steps.length;
500
+ const passedSteps = result.steps.filter(s => s.success).length;
501
+ const cost = result.totalCostUsd.toFixed(2);
502
+ const duration = (result.totalDurationMs / 1000).toFixed(1);
503
+ const artifactList = result.artifacts.join(', ');
504
+
505
+ console.log(`\n[${status}] ${passedSteps}/${stepCount} steps, $${cost}, ${duration}s`);
506
+ if (result.artifacts.length > 0) {
507
+ console.log(`Artifacts: ${artifactList}`);
508
+ }
509
+
510
+ if (!result.success) {
511
+ // Log failed steps
512
+ for (const step of result.steps) {
513
+ if (!step.success && step.error) {
514
+ console.error(` ✗ ${step.step}: ${step.error}`);
515
+ }
516
+ }
517
+ process.exitCode = 1;
518
+ }
519
+ } catch (err) {
520
+ console.error(`Fatal error: ${(err as Error).message}`);
521
+ process.exitCode = 1;
522
+ } finally {
523
+ cliTransport.close();
524
+ if (wsTransport) {
525
+ wsTransport.close();
526
+ }
527
+ }
528
+ return;
529
+ }
530
+
531
+ // ─── Auto command ─────────────────────────────────────────────────────────
532
+ if (args.command === 'auto') {
533
+ const gsd = new GSD({
534
+ projectDir: args.projectDir,
535
+ model: args.model,
536
+ maxBudgetUsd: args.maxBudget,
537
+ autoMode: true,
538
+ workstream: args.ws,
539
+ });
540
+
541
+ // Wire CLI transport (always active)
542
+ const cliTransport = new CLITransport();
543
+ gsd.addTransport(cliTransport);
544
+
545
+ // Optional WebSocket transport
546
+ let wsTransport: WSTransport | undefined;
547
+ if (args.wsPort !== undefined) {
548
+ wsTransport = new WSTransport({ port: args.wsPort });
549
+ await wsTransport.start();
550
+ gsd.addTransport(wsTransport);
551
+ console.log(`WebSocket transport listening on port ${args.wsPort}`);
552
+ }
553
+
554
+ try {
555
+ // If --init provided, bootstrap project first
556
+ if (args.init) {
557
+ const initInput = await resolveInitInput({
558
+ ...args,
559
+ command: 'init',
560
+ initInput: args.init,
561
+ });
562
+
563
+ console.log(`[auto] Bootstrapping project from --init (${initInput.length} chars)`);
564
+
565
+ const tools = gsd.createTools();
566
+ const runner = new InitRunner({
567
+ projectDir: args.projectDir,
568
+ tools,
569
+ eventStream: gsd.eventStream,
570
+ config: {
571
+ maxBudgetPerSession: args.maxBudget,
572
+ orchestratorModel: args.model,
573
+ },
574
+ });
575
+
576
+ const initResult = await runner.run(initInput);
577
+
578
+ const initStatus = initResult.success ? 'SUCCESS' : 'FAILED';
579
+ const stepCount = initResult.steps.length;
580
+ const passedSteps = initResult.steps.filter(s => s.success).length;
581
+ const initCost = initResult.totalCostUsd.toFixed(2);
582
+ const initDuration = (initResult.totalDurationMs / 1000).toFixed(1);
583
+ console.log(`[init ${initStatus}] ${passedSteps}/${stepCount} steps, $${initCost}, ${initDuration}s`);
584
+
585
+ if (!initResult.success) {
586
+ for (const step of initResult.steps) {
587
+ if (!step.success && step.error) {
588
+ console.error(` ✗ ${step.step}: ${step.error}`);
589
+ }
590
+ }
591
+ process.exitCode = 1;
592
+ return;
593
+ }
594
+ }
595
+
596
+ const result = await gsd.run('');
597
+
598
+ // Final summary
599
+ const status = result.success ? 'SUCCESS' : 'FAILED';
600
+ const phases = result.phases.length;
601
+ const cost = result.totalCostUsd.toFixed(2);
602
+ const duration = (result.totalDurationMs / 1000).toFixed(1);
603
+ console.log(`\n[${status}] ${phases} phase(s), $${cost}, ${duration}s`);
604
+
605
+ if (!result.success) {
606
+ process.exitCode = 1;
607
+ }
608
+ } catch (err) {
609
+ console.error(`Fatal error: ${(err as Error).message}`);
610
+ process.exitCode = 1;
611
+ } finally {
612
+ cliTransport.close();
613
+ if (wsTransport) {
614
+ wsTransport.close();
615
+ }
616
+ }
617
+ return;
618
+ }
619
+
620
+ // ─── Run command ─────────────────────────────────────────────────────────
621
+
622
+ // Build GSD instance
623
+ const gsd = new GSD({
624
+ projectDir: args.projectDir,
625
+ model: args.model,
626
+ maxBudgetUsd: args.maxBudget,
627
+ workstream: args.ws,
628
+ });
629
+
630
+ // Wire CLI transport (always active)
631
+ const cliTransport = new CLITransport();
632
+ gsd.addTransport(cliTransport);
633
+
634
+ // Optional WebSocket transport
635
+ let wsTransport: WSTransport | undefined;
636
+ if (args.wsPort !== undefined) {
637
+ wsTransport = new WSTransport({ port: args.wsPort });
638
+ await wsTransport.start();
639
+ gsd.addTransport(wsTransport);
640
+ console.log(`WebSocket transport listening on port ${args.wsPort}`);
641
+ }
642
+
643
+ try {
644
+ const result = await gsd.run(args.prompt!);
645
+
646
+ // Final summary
647
+ const status = result.success ? 'SUCCESS' : 'FAILED';
648
+ const phases = result.phases.length;
649
+ const cost = result.totalCostUsd.toFixed(2);
650
+ const duration = (result.totalDurationMs / 1000).toFixed(1);
651
+ console.log(`\n[${status}] ${phases} phase(s), $${cost}, ${duration}s`);
652
+
653
+ if (!result.success) {
654
+ process.exitCode = 1;
655
+ }
656
+ } catch (err) {
657
+ console.error(`Fatal error: ${(err as Error).message}`);
658
+ process.exitCode = 1;
659
+ } finally {
660
+ // Clean up transports
661
+ cliTransport.close();
662
+ if (wsTransport) {
663
+ wsTransport.close();
664
+ }
665
+ }
666
+ }
667
+
668
+ // ─── Auto-run when invoked directly ──────────────────────────────────────────
669
+
670
+ main();