@opengsd/gsd-core 1.2.0 → 1.3.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 (532) hide show
  1. package/README.ja-JP.md +46 -791
  2. package/README.ko-KR.md +44 -780
  3. package/README.md +42 -218
  4. package/README.pt-BR.md +47 -414
  5. package/README.zh-CN.md +46 -763
  6. package/agents/gsd-ai-researcher.md +2 -2
  7. package/agents/gsd-debug-session-manager.md +1 -1
  8. package/agents/gsd-debugger.md +8 -8
  9. package/agents/gsd-doc-writer.md +7 -6
  10. package/agents/gsd-domain-researcher.md +15 -2
  11. package/agents/gsd-eval-auditor.md +1 -1
  12. package/agents/gsd-eval-planner.md +2 -2
  13. package/agents/gsd-executor.md +21 -8
  14. package/agents/gsd-framework-selector.md +1 -1
  15. package/agents/gsd-intel-updater.md +4 -4
  16. package/agents/gsd-phase-researcher.md +19 -6
  17. package/agents/gsd-plan-checker.md +3 -3
  18. package/agents/gsd-planner.md +36 -23
  19. package/agents/gsd-project-researcher.md +13 -0
  20. package/agents/gsd-research-synthesizer.md +6 -2
  21. package/agents/gsd-roadmapper.md +6 -6
  22. package/agents/gsd-ui-researcher.md +16 -3
  23. package/agents/gsd-user-profiler.md +2 -2
  24. package/agents/gsd-verifier.md +8 -8
  25. package/assets/gsd-logo-2000-transparent.png +0 -0
  26. package/assets/gsd-logo-2000-transparent.svg +17 -0
  27. package/assets/gsd-logo-2000.png +0 -0
  28. package/assets/gsd-logo-2000.svg +21 -0
  29. package/assets/terminal.svg +68 -0
  30. package/bin/install.js +255 -103
  31. package/commands/gsd/add-tests.md +1 -1
  32. package/commands/gsd/ai-integration-phase.md +3 -3
  33. package/commands/gsd/audit-fix.md +1 -1
  34. package/commands/gsd/audit-milestone.md +1 -1
  35. package/commands/gsd/audit-uat.md +1 -1
  36. package/commands/gsd/autonomous.md +2 -2
  37. package/commands/gsd/capture.md +6 -6
  38. package/commands/gsd/cleanup.md +1 -1
  39. package/commands/gsd/code-review.md +1 -1
  40. package/commands/gsd/complete-milestone.md +2 -2
  41. package/commands/gsd/config.md +3 -3
  42. package/commands/gsd/debug.md +1 -1
  43. package/commands/gsd/discuss-phase.md +5 -4
  44. package/commands/gsd/docs-update.md +1 -1
  45. package/commands/gsd/eval-review.md +2 -2
  46. package/commands/gsd/execute-phase.md +2 -2
  47. package/commands/gsd/explore.md +1 -1
  48. package/commands/gsd/extract-learnings.md +2 -2
  49. package/commands/gsd/fast.md +1 -1
  50. package/commands/gsd/forensics.md +1 -1
  51. package/commands/gsd/graphify.md +9 -9
  52. package/commands/gsd/health.md +1 -1
  53. package/commands/gsd/help.md +2 -2
  54. package/commands/gsd/import.md +5 -5
  55. package/commands/gsd/inbox.md +1 -1
  56. package/commands/gsd/ingest-docs.md +4 -4
  57. package/commands/gsd/manager.md +3 -3
  58. package/commands/gsd/map-codebase.md +1 -1
  59. package/commands/gsd/milestone-summary.md +1 -1
  60. package/commands/gsd/mvp-phase.md +4 -4
  61. package/commands/gsd/new-milestone.md +5 -5
  62. package/commands/gsd/new-project.md +5 -5
  63. package/commands/gsd/pause-work.md +2 -2
  64. package/commands/gsd/phase.md +4 -4
  65. package/commands/gsd/plan-phase.md +2 -2
  66. package/commands/gsd/plan-review-convergence.md +4 -4
  67. package/commands/gsd/pr-branch.md +1 -1
  68. package/commands/gsd/profile-user.md +2 -2
  69. package/commands/gsd/progress.md +4 -4
  70. package/commands/gsd/quick.md +1 -1
  71. package/commands/gsd/resume-work.md +1 -1
  72. package/commands/gsd/review.md +3 -2
  73. package/commands/gsd/secure-phase.md +1 -1
  74. package/commands/gsd/settings.md +1 -1
  75. package/commands/gsd/ship.md +2 -2
  76. package/commands/gsd/sketch.md +7 -7
  77. package/commands/gsd/spec-phase.md +2 -2
  78. package/commands/gsd/spike.md +3 -3
  79. package/commands/gsd/stats.md +1 -1
  80. package/commands/gsd/surface.md +4 -4
  81. package/commands/gsd/thread.md +1 -1
  82. package/commands/gsd/ui-phase.md +2 -2
  83. package/commands/gsd/ui-review.md +2 -2
  84. package/commands/gsd/ultraplan-phase.md +2 -2
  85. package/commands/gsd/undo.md +3 -3
  86. package/commands/gsd/update.md +3 -3
  87. package/commands/gsd/validate-phase.md +1 -1
  88. package/commands/gsd/verify-work.md +2 -2
  89. package/commands/gsd/workspace.md +4 -4
  90. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  91. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +50 -4
  92. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  93. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  94. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  95. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  96. package/gsd-core/bin/lib/audit.cjs +743 -0
  97. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  98. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  99. package/gsd-core/bin/lib/clock.cjs +95 -0
  100. package/gsd-core/bin/lib/clusters.cjs +128 -0
  101. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  102. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  103. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  104. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  105. package/gsd-core/bin/lib/commands.cjs +1202 -0
  106. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  107. package/gsd-core/bin/lib/config-types.cjs +19 -0
  108. package/gsd-core/bin/lib/config.cjs +714 -0
  109. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  110. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  111. package/gsd-core/bin/lib/core.cjs +2007 -0
  112. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  113. package/gsd-core/bin/lib/docs.cjs +252 -0
  114. package/gsd-core/bin/lib/drift.cjs +364 -0
  115. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  116. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  117. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  118. package/gsd-core/bin/lib/graphify.cjs +496 -0
  119. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  120. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  121. package/gsd-core/bin/lib/init.cjs +1799 -0
  122. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  123. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  124. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  125. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  126. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  127. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  128. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  129. package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
  130. package/gsd-core/bin/lib/intel.cjs +607 -0
  131. package/gsd-core/bin/lib/learnings.cjs +270 -0
  132. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  133. package/gsd-core/bin/lib/milestone.cjs +373 -0
  134. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  135. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  136. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  137. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  138. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  139. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  140. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  141. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  142. package/gsd-core/bin/lib/phase.cjs +1307 -0
  143. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  144. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  145. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  146. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  147. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  148. package/gsd-core/bin/lib/project-root.cjs +119 -0
  149. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  150. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  151. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  152. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  153. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  154. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  155. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  156. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  157. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  158. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  159. package/gsd-core/bin/lib/secrets.cjs +34 -0
  160. package/gsd-core/bin/lib/security.cjs +407 -0
  161. package/gsd-core/bin/lib/semver-compare.cjs +42 -0
  162. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  163. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  164. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -82
  165. package/gsd-core/bin/lib/state.cjs +2010 -0
  166. package/gsd-core/bin/lib/surface.cjs +406 -0
  167. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  168. package/gsd-core/bin/lib/template.cjs +237 -0
  169. package/gsd-core/bin/lib/uat.cjs +297 -0
  170. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  171. package/gsd-core/bin/lib/update-context.cjs +218 -0
  172. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  173. package/gsd-core/bin/lib/validate.cjs +112 -0
  174. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  175. package/gsd-core/bin/lib/verify.cjs +1451 -0
  176. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  177. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  178. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  179. package/gsd-core/bin/lib/workstream.cjs +380 -0
  180. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  181. package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +1 -0
  182. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +17 -1
  183. package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +27 -0
  184. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  185. package/{get-shit-done → gsd-core}/references/checkpoints.md +1 -1
  186. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  187. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  188. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  189. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  190. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  191. package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +1 -1
  192. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  193. package/{get-shit-done → gsd-core}/references/ui-brand.md +4 -2
  194. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  195. package/gsd-core/references/worktree-branch-check.md +38 -0
  196. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  197. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  198. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  199. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  200. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  201. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  202. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  203. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  204. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  206. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  207. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +2 -2
  208. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +3 -1
  209. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/autonomous.md +10 -8
  211. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  212. package/{get-shit-done → gsd-core}/workflows/cleanup.md +44 -4
  213. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +4 -4
  214. package/{get-shit-done → gsd-core}/workflows/code-review.md +6 -4
  215. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  216. package/{get-shit-done → gsd-core}/workflows/debug.md +7 -2
  217. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +6 -2
  218. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  219. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +5 -5
  220. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  221. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  222. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +4 -4
  224. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  225. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/docs-update.md +19 -5
  227. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/eval-review.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +16 -3
  230. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +89 -57
  232. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  233. package/{get-shit-done → gsd-core}/workflows/explore.md +5 -3
  234. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  235. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  236. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  237. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +3 -3
  239. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +6 -6
  240. package/{get-shit-done → gsd-core}/workflows/import.md +3 -1
  241. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +5 -5
  242. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  243. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/manager.md +3 -3
  245. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +3 -1
  246. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  247. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  248. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +5 -5
  249. package/{get-shit-done → gsd-core}/workflows/new-project.md +8 -8
  250. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  251. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  254. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +29 -28
  255. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +10 -10
  256. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  258. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/quick.md +7 -29
  260. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  264. package/{get-shit-done → gsd-core}/workflows/review.md +110 -2
  265. package/{get-shit-done → gsd-core}/workflows/scan.md +3 -1
  266. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +5 -3
  267. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +196 -6
  268. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/settings.md +16 -2
  270. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  271. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  272. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  273. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  274. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  275. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  276. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  277. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  278. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  279. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  280. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +5 -5
  281. package/{get-shit-done → gsd-core}/workflows/ui-review.md +3 -3
  282. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  283. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  284. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  285. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +5 -3
  286. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  287. package/{get-shit-done → gsd-core}/workflows/verify-work.md +7 -7
  288. package/hooks/dist/gsd-check-update-worker.js +16 -3
  289. package/hooks/dist/gsd-check-update.js +7 -5
  290. package/hooks/dist/gsd-context-monitor.js +2 -2
  291. package/hooks/dist/gsd-statusline.js +39 -21
  292. package/hooks/dist/gsd-update-banner.js +6 -2
  293. package/hooks/dist/gsd-worktree-path-guard.js +169 -0
  294. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  295. package/hooks/gsd-check-update-worker.js +16 -3
  296. package/hooks/gsd-check-update.js +7 -5
  297. package/hooks/gsd-context-monitor.js +2 -2
  298. package/hooks/gsd-statusline.js +39 -21
  299. package/hooks/gsd-update-banner.js +6 -2
  300. package/hooks/gsd-worktree-path-guard.js +169 -0
  301. package/hooks/managed-hooks-registry.cjs +1 -0
  302. package/package.json +17 -11
  303. package/scripts/affected-tests-lib.cjs +1 -1
  304. package/scripts/base64-scan.sh +12 -0
  305. package/scripts/build-hooks.js +5 -1
  306. package/scripts/changeset/cli.cjs +2 -2
  307. package/scripts/changeset/github-release-notes.cjs +1 -1
  308. package/scripts/changeset/lint.cjs +1 -1
  309. package/scripts/check-alias-drift.cjs +8 -8
  310. package/scripts/check-env.cjs +5 -1
  311. package/scripts/ci-test-scope.cjs +34 -9
  312. package/scripts/command-contract-helpers.cjs +1 -1
  313. package/scripts/fix-slash-commands.cjs +5 -5
  314. package/scripts/gen-inventory-manifest.cjs +3 -3
  315. package/scripts/generate-package-identity.cjs +28 -7
  316. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  317. package/scripts/lint-command-contract.cjs +1 -1
  318. package/scripts/lint-legacy-dir-name.cjs +156 -0
  319. package/scripts/lint-package-identity-drift.cjs +8 -8
  320. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  321. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  322. package/scripts/lint-skill-deps.cjs +1 -1
  323. package/scripts/lint-test-file-count.allowlist.json +129 -32
  324. package/scripts/lint-test-file-count.cjs +85 -30
  325. package/scripts/mutation-matrix.cjs +219 -0
  326. package/scripts/prompt-injection-scan.sh +5 -1
  327. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  328. package/scripts/release-tarball-smoke.cjs +9 -9
  329. package/scripts/run-tests.cjs +34 -2
  330. package/scripts/strip-prose-atrefs.cjs +2 -2
  331. package/scripts/sync-runtime-launcher.cjs +2 -2
  332. package/scripts/verify-npm-publish.cjs +252 -0
  333. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  334. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  335. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  336. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  337. package/get-shit-done/bin/lib/audit.cjs +0 -755
  338. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  339. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  340. package/get-shit-done/bin/lib/clock.cjs +0 -96
  341. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  342. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  343. package/get-shit-done/bin/lib/command-aliases.cjs +0 -815
  344. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  345. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  346. package/get-shit-done/bin/lib/commands.cjs +0 -1188
  347. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  348. package/get-shit-done/bin/lib/config.cjs +0 -728
  349. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  350. package/get-shit-done/bin/lib/core.cjs +0 -2121
  351. package/get-shit-done/bin/lib/docs.cjs +0 -270
  352. package/get-shit-done/bin/lib/drift.cjs +0 -388
  353. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  354. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  355. package/get-shit-done/bin/lib/gap-checker.cjs +0 -205
  356. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  357. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  358. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  359. package/get-shit-done/bin/lib/init.cjs +0 -2112
  360. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  361. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  362. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -354
  363. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  364. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  365. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  366. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  367. package/get-shit-done/bin/lib/intel.cjs +0 -708
  368. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  369. package/get-shit-done/bin/lib/milestone.cjs +0 -314
  370. package/get-shit-done/bin/lib/model-catalog.cjs +0 -212
  371. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  372. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  373. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  374. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  375. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -80
  376. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  377. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  378. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  379. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  380. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  381. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  382. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  383. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -125
  384. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -28
  385. package/get-shit-done/bin/lib/roadmap.cjs +0 -650
  386. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  387. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  388. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  389. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  390. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  391. package/get-shit-done/bin/lib/security.cjs +0 -600
  392. package/get-shit-done/bin/lib/semver-compare.cjs +0 -35
  393. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -500
  394. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  395. package/get-shit-done/bin/lib/state.cjs +0 -2038
  396. package/get-shit-done/bin/lib/surface.cjs +0 -470
  397. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  398. package/get-shit-done/bin/lib/template.cjs +0 -228
  399. package/get-shit-done/bin/lib/uat.cjs +0 -289
  400. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  401. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  402. package/get-shit-done/bin/lib/validate.cjs +0 -92
  403. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  404. package/get-shit-done/bin/lib/verify.cjs +0 -1511
  405. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  406. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  407. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  408. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  409. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  410. package/scripts/lint-no-source-grep.cjs +0 -174
  411. package/scripts/lint-shared-module-handsync.cjs +0 -388
  412. package/scripts/shared-module-handsync-allowlist.json +0 -183
  413. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  414. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  415. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  416. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  417. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  458. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  459. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  460. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  461. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  462. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  463. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  464. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  465. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  466. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  467. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  468. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  469. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  500. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  501. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  502. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  503. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  504. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  505. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  506. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  507. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  508. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  509. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  510. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  511. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  521. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  522. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  523. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  524. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  525. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  526. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  527. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  528. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  529. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  530. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  531. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  532. /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
@@ -0,0 +1,517 @@
1
+ "use strict";
2
+ /**
3
+ * Profile Pipeline — session scanning, message extraction, and sampling
4
+ *
5
+ * Reads Claude Code session history (read-only) to extract user messages
6
+ * for behavioral profiling. Three commands:
7
+ * - scan-sessions: list all projects and sessions
8
+ * - extract-messages: extract user messages from a specific project
9
+ * - profile-sample: multi-project sampling with recency weighting
10
+ *
11
+ * ADR-457 build-at-publish: the hand-written bin/lib/profile-pipeline.cjs collapsed
12
+ * to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
13
+ * from the prior hand-written .cjs; only strict types are added.
14
+ */
15
+ var __importDefault = (this && this.__importDefault) || function (mod) {
16
+ return (mod && mod.__esModule) ? mod : { "default": mod };
17
+ };
18
+ const node_fs_1 = __importDefault(require("node:fs"));
19
+ const node_path_1 = __importDefault(require("node:path"));
20
+ const node_os_1 = __importDefault(require("node:os"));
21
+ const node_readline_1 = __importDefault(require("node:readline"));
22
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
23
+ const core = require("./core.cjs");
24
+ const { output, error, reapStaleTempFiles } = core;
25
+ // ─── Session I/O Helpers ──────────────────────────────────────────────────────
26
+ function getSessionsDir(overridePath) {
27
+ const dir = overridePath || node_path_1.default.join(node_os_1.default.homedir(), '.claude', 'projects');
28
+ if (!node_fs_1.default.existsSync(dir))
29
+ return null;
30
+ return dir;
31
+ }
32
+ function scanProjectDir(projectDirPath) {
33
+ const entries = node_fs_1.default.readdirSync(projectDirPath);
34
+ const sessions = [];
35
+ for (const entry of entries) {
36
+ if (!entry.endsWith('.jsonl'))
37
+ continue;
38
+ const sessionId = entry.replace('.jsonl', '');
39
+ const filePath = node_path_1.default.join(projectDirPath, entry);
40
+ const stat = node_fs_1.default.statSync(filePath);
41
+ sessions.push({
42
+ sessionId,
43
+ filePath,
44
+ size: stat.size,
45
+ modified: stat.mtime,
46
+ });
47
+ }
48
+ sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
49
+ return sessions;
50
+ }
51
+ function readSessionIndex(projectDirPath) {
52
+ try {
53
+ const indexPath = node_path_1.default.join(projectDirPath, 'sessions-index.json');
54
+ const raw = node_fs_1.default.readFileSync(indexPath, 'utf-8');
55
+ const parsed = JSON.parse(raw);
56
+ const entries = new Map();
57
+ for (const entry of (parsed.entries || [])) {
58
+ if (entry.sessionId) {
59
+ entries.set(entry.sessionId, entry);
60
+ }
61
+ }
62
+ return { originalPath: parsed.originalPath || null, entries };
63
+ }
64
+ catch {
65
+ return { originalPath: null, entries: new Map() };
66
+ }
67
+ }
68
+ function getProjectName(projectDirName, indexData, firstRecordCwd) {
69
+ if (indexData && indexData.originalPath) {
70
+ return node_path_1.default.basename(indexData.originalPath);
71
+ }
72
+ if (firstRecordCwd) {
73
+ return node_path_1.default.basename(firstRecordCwd);
74
+ }
75
+ return projectDirName;
76
+ }
77
+ function formatBytes(bytes) {
78
+ if (bytes < 1024)
79
+ return `${bytes} B`;
80
+ if (bytes < 1048576)
81
+ return `${(bytes / 1024).toFixed(1)} KB`;
82
+ if (bytes < 1073741824)
83
+ return `${(bytes / 1048576).toFixed(1)} MB`;
84
+ return `${(bytes / 1073741824).toFixed(1)} GB`;
85
+ }
86
+ function formatProjectTable(projects) {
87
+ let out = '';
88
+ out += 'Project'.padEnd(35) + 'Sessions'.padEnd(10) + 'Size'.padEnd(10) + 'Last Active\n';
89
+ out += '-'.repeat(75) + '\n';
90
+ for (const p of projects) {
91
+ const name = p.name.length > 33 ? p.name.substring(0, 30) + '...' : p.name;
92
+ out += name.padEnd(35) + String(p.sessionCount).padEnd(10) +
93
+ p.totalSizeHuman.padEnd(10) + p.lastActive + '\n';
94
+ }
95
+ return out;
96
+ }
97
+ function formatSessionTable(sessions) {
98
+ let out = '';
99
+ out += ' Session ID'.padEnd(42) + 'Size'.padEnd(10) + 'Modified\n';
100
+ out += ' ' + '-'.repeat(70) + '\n';
101
+ for (const s of sessions) {
102
+ const id = s.sessionId.length > 38 ? s.sessionId.substring(0, 35) + '...' : s.sessionId;
103
+ out += ' ' + id.padEnd(40) + formatBytes(s.size).padEnd(10) +
104
+ new Date(s.modified).toISOString().replace('T', ' ').substring(0, 19) + '\n';
105
+ }
106
+ return out;
107
+ }
108
+ // ─── Message Extraction Helpers ───────────────────────────────────────────────
109
+ function isGenuineUserMessage(record) {
110
+ if (record.type !== 'user')
111
+ return false;
112
+ if (record.userType !== 'external')
113
+ return false;
114
+ if (record.isMeta === true)
115
+ return false;
116
+ if (record.isSidechain === true)
117
+ return false;
118
+ const content = record.message?.content;
119
+ if (typeof content !== 'string')
120
+ return false;
121
+ if (content.length === 0)
122
+ return false;
123
+ if (content.startsWith('<local-command'))
124
+ return false;
125
+ if (content.startsWith('<command-'))
126
+ return false;
127
+ if (content.startsWith('<task-notification'))
128
+ return false;
129
+ if (content.startsWith('<local-command-stdout'))
130
+ return false;
131
+ return true;
132
+ }
133
+ function truncateContent(content, maxLen = 2000) {
134
+ if (content.length <= maxLen)
135
+ return content;
136
+ return content.substring(0, maxLen) + '... [truncated]';
137
+ }
138
+ async function streamExtractMessages(filePath, filterFn, maxMessages = 300) {
139
+ const rl = node_readline_1.default.createInterface({
140
+ input: node_fs_1.default.createReadStream(filePath),
141
+ crlfDelay: Infinity,
142
+ terminal: false,
143
+ });
144
+ const messages = [];
145
+ const sessionId = node_path_1.default.basename(filePath, '.jsonl');
146
+ for await (const line of rl) {
147
+ if (messages.length >= maxMessages)
148
+ break;
149
+ let record;
150
+ try {
151
+ record = JSON.parse(line);
152
+ }
153
+ catch {
154
+ continue;
155
+ }
156
+ if (!filterFn(record))
157
+ continue;
158
+ messages.push({
159
+ sessionId,
160
+ projectPath: record.cwd || null,
161
+ timestamp: record.timestamp || null,
162
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
163
+ content: truncateContent(String(record.message?.content ?? '')),
164
+ });
165
+ }
166
+ return messages;
167
+ }
168
+ // ─── Commands ─────────────────────────────────────────────────────────────────
169
+ function cmdScanSessions(overridePath, options, raw) {
170
+ const sessionsDir = getSessionsDir(overridePath);
171
+ if (!sessionsDir) {
172
+ const searchedPath = overridePath || '~/.claude/projects';
173
+ error(`No Claude Code sessions found at ${searchedPath}.${overridePath ? '' : ' Is Claude Code installed?'}`);
174
+ }
175
+ process.stderr.write('Reading your session history (read-only, nothing is modified or sent anywhere)...\n');
176
+ let projectDirs;
177
+ try {
178
+ projectDirs = node_fs_1.default.readdirSync(sessionsDir).filter(entry => {
179
+ const fullPath = node_path_1.default.join(sessionsDir, entry);
180
+ try {
181
+ return node_fs_1.default.statSync(fullPath).isDirectory();
182
+ }
183
+ catch {
184
+ return false;
185
+ }
186
+ });
187
+ }
188
+ catch (err) {
189
+ error(`Cannot read sessions directory: ${err.message}`);
190
+ return;
191
+ }
192
+ const projects = [];
193
+ for (const dirName of projectDirs) {
194
+ const projectPath = node_path_1.default.join(sessionsDir, dirName);
195
+ const sessions = scanProjectDir(projectPath);
196
+ if (sessions.length === 0)
197
+ continue;
198
+ const indexData = readSessionIndex(projectPath);
199
+ const projectName = getProjectName(dirName, indexData);
200
+ if (indexData.entries.size === 0 && !options.json) {
201
+ process.stderr.write(`Index not found for ${projectName}, scanning directory...\n`);
202
+ }
203
+ const totalSize = sessions.reduce((sum, s) => sum + s.size, 0);
204
+ const lastActive = sessions[0].modified.toISOString();
205
+ const oldest = sessions[sessions.length - 1].modified.toISOString();
206
+ const newest = sessions[0].modified.toISOString();
207
+ const project = {
208
+ name: projectName,
209
+ directory: dirName,
210
+ sessionCount: sessions.length,
211
+ totalSize,
212
+ totalSizeHuman: formatBytes(totalSize),
213
+ lastActive: lastActive.replace('T', ' ').substring(0, 19),
214
+ dateRange: { first: oldest, last: newest },
215
+ };
216
+ if (options.verbose) {
217
+ project.sessions = sessions.map(s => {
218
+ const indexed = indexData.entries.get(s.sessionId);
219
+ const session = {
220
+ sessionId: s.sessionId,
221
+ size: s.size,
222
+ sizeHuman: formatBytes(s.size),
223
+ modified: s.modified.toISOString(),
224
+ };
225
+ if (indexed) {
226
+ if (indexed.summary)
227
+ session.summary = indexed.summary;
228
+ if (indexed.messageCount !== undefined)
229
+ session.messageCount = indexed.messageCount;
230
+ if (indexed.created)
231
+ session.created = indexed.created;
232
+ }
233
+ return session;
234
+ });
235
+ }
236
+ projects.push(project);
237
+ }
238
+ projects.sort((a, b) => b.dateRange.last.localeCompare(a.dateRange.last));
239
+ if (options.json || raw) {
240
+ output(projects, raw, undefined);
241
+ }
242
+ else {
243
+ process.stdout.write('\n' + formatProjectTable(projects));
244
+ if (options.verbose) {
245
+ for (const p of projects) {
246
+ process.stdout.write(`\n ${p.name} (${p.sessionCount} sessions):\n`);
247
+ if (p.sessions) {
248
+ process.stdout.write(formatSessionTable(p.sessions));
249
+ }
250
+ }
251
+ }
252
+ process.stdout.write(`\nTotal: ${projects.length} projects\n`);
253
+ process.exit(0);
254
+ }
255
+ }
256
+ async function cmdExtractMessages(projectArg, options, raw, overridePath) {
257
+ const sessionsDir = getSessionsDir(overridePath);
258
+ if (!sessionsDir) {
259
+ const searchedPath = overridePath || '~/.claude/projects';
260
+ error(`No Claude Code sessions found at ${searchedPath}.${overridePath ? '' : ' Is Claude Code installed?'}`);
261
+ }
262
+ let projectDirs;
263
+ try {
264
+ projectDirs = node_fs_1.default.readdirSync(sessionsDir).filter(entry => {
265
+ const fullPath = node_path_1.default.join(sessionsDir, entry);
266
+ try {
267
+ return node_fs_1.default.statSync(fullPath).isDirectory();
268
+ }
269
+ catch {
270
+ return false;
271
+ }
272
+ });
273
+ }
274
+ catch (err) {
275
+ error(`Cannot read sessions directory: ${err.message}`);
276
+ return;
277
+ }
278
+ let matchedDir = null;
279
+ let matchedName = null;
280
+ for (const dirName of projectDirs) {
281
+ if (dirName === projectArg) {
282
+ matchedDir = dirName;
283
+ break;
284
+ }
285
+ }
286
+ if (!matchedDir) {
287
+ const lowerArg = projectArg.toLowerCase();
288
+ const matches = projectDirs.filter(d => d.toLowerCase().includes(lowerArg));
289
+ if (matches.length === 1) {
290
+ matchedDir = matches[0];
291
+ }
292
+ else if (matches.length > 1) {
293
+ const exactNameMatches = [];
294
+ for (const dirName of matches) {
295
+ const indexData = readSessionIndex(node_path_1.default.join(sessionsDir, dirName));
296
+ const pName = getProjectName(dirName, indexData);
297
+ if (pName.toLowerCase() === lowerArg) {
298
+ exactNameMatches.push({ dirName, name: pName });
299
+ }
300
+ }
301
+ if (exactNameMatches.length === 1) {
302
+ matchedDir = exactNameMatches[0].dirName;
303
+ matchedName = exactNameMatches[0].name;
304
+ }
305
+ else {
306
+ const names = matches.map(d => {
307
+ const idx = readSessionIndex(node_path_1.default.join(sessionsDir, d));
308
+ return ` - ${getProjectName(d, idx)} (${d})`;
309
+ });
310
+ error(`Multiple projects match "${projectArg}":\n${names.join('\n')}\nBe more specific.`);
311
+ }
312
+ }
313
+ }
314
+ if (!matchedDir) {
315
+ const available = projectDirs.map(d => {
316
+ const idx = readSessionIndex(node_path_1.default.join(sessionsDir, d));
317
+ return ` - ${getProjectName(d, idx)}`;
318
+ });
319
+ error(`No project matching "${projectArg}". Available projects:\n${available.join('\n')}`);
320
+ return;
321
+ }
322
+ const projectPath = node_path_1.default.join(sessionsDir, matchedDir);
323
+ const indexData = readSessionIndex(projectPath);
324
+ const projectName = matchedName || getProjectName(matchedDir, indexData);
325
+ process.stderr.write('Reading your session history (read-only, nothing is modified or sent anywhere)...\n');
326
+ let sessions = scanProjectDir(projectPath);
327
+ if (options.sessionId) {
328
+ sessions = sessions.filter(s => s.sessionId === options.sessionId);
329
+ if (sessions.length === 0) {
330
+ error(`Session "${options.sessionId}" not found in project "${projectName}".`);
331
+ }
332
+ }
333
+ if (options.limit && options.limit > 0) {
334
+ sessions = sessions.slice(0, options.limit);
335
+ }
336
+ reapStaleTempFiles('gsd-pipeline-', { dirsOnly: true });
337
+ const tmpDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'gsd-pipeline-'));
338
+ const outputPath = node_path_1.default.join(tmpDir, 'extracted-messages.jsonl');
339
+ let sessionsProcessed = 0;
340
+ let sessionsSkipped = 0;
341
+ let messagesExtracted = 0;
342
+ let messagesTruncated = 0;
343
+ const total = sessions.length;
344
+ const batchLimit = 300;
345
+ for (let i = 0; i < sessions.length; i++) {
346
+ if (messagesExtracted >= batchLimit)
347
+ break;
348
+ const session = sessions[i];
349
+ process.stderr.write(`\rProcessing session ${i + 1}/${total}...`);
350
+ try {
351
+ const remaining = batchLimit - messagesExtracted;
352
+ const msgs = await streamExtractMessages(session.filePath, isGenuineUserMessage, remaining);
353
+ for (const msg of msgs) {
354
+ node_fs_1.default.appendFileSync(outputPath, JSON.stringify(msg) + '\n');
355
+ messagesExtracted++;
356
+ if (msg.content.endsWith('... [truncated]')) {
357
+ messagesTruncated++;
358
+ }
359
+ }
360
+ sessionsProcessed++;
361
+ }
362
+ catch (err) {
363
+ sessionsSkipped++;
364
+ process.stderr.write(`\nWarning: Skipped session ${session.sessionId}: ${err.message}\n`);
365
+ }
366
+ }
367
+ process.stderr.write('\r' + ' '.repeat(60) + '\r');
368
+ const result = {
369
+ output_file: outputPath,
370
+ project: projectName,
371
+ sessions_processed: sessionsProcessed,
372
+ sessions_skipped: sessionsSkipped,
373
+ messages_extracted: messagesExtracted,
374
+ messages_truncated: messagesTruncated,
375
+ };
376
+ if (sessionsSkipped > 0 && sessionsProcessed > 0) {
377
+ process.stdout.write(JSON.stringify(result, null, 2));
378
+ process.exit(2);
379
+ }
380
+ else if (sessionsProcessed === 0 && sessionsSkipped > 0) {
381
+ process.stdout.write(JSON.stringify(result, null, 2));
382
+ process.exit(1);
383
+ }
384
+ else {
385
+ output(result, raw, undefined);
386
+ }
387
+ }
388
+ async function cmdProfileSample(overridePath, options, raw) {
389
+ const sessionsDir = getSessionsDir(overridePath);
390
+ if (!sessionsDir) {
391
+ const searchedPath = overridePath || '~/.claude/projects';
392
+ error(`No Claude Code sessions found at ${searchedPath}.${overridePath ? '' : ' Is Claude Code installed?'}`);
393
+ }
394
+ process.stderr.write('Reading your session history (read-only, nothing is modified or sent anywhere)...\n');
395
+ const limit = options.limit || 150;
396
+ const maxChars = options.maxChars || 500;
397
+ let projectDirs;
398
+ try {
399
+ projectDirs = node_fs_1.default.readdirSync(sessionsDir).filter(entry => {
400
+ const fullPath = node_path_1.default.join(sessionsDir, entry);
401
+ try {
402
+ return node_fs_1.default.statSync(fullPath).isDirectory();
403
+ }
404
+ catch {
405
+ return false;
406
+ }
407
+ });
408
+ }
409
+ catch (err) {
410
+ error(`Cannot read sessions directory: ${err.message}`);
411
+ return;
412
+ }
413
+ if (projectDirs.length === 0) {
414
+ error('No project directories found in sessions directory.');
415
+ }
416
+ const projectMeta = [];
417
+ for (const dirName of projectDirs) {
418
+ const projectPath = node_path_1.default.join(sessionsDir, dirName);
419
+ const sessions = scanProjectDir(projectPath);
420
+ if (sessions.length === 0)
421
+ continue;
422
+ const indexData = readSessionIndex(projectPath);
423
+ const projectName = getProjectName(dirName, indexData);
424
+ const lastActive = sessions[0].modified;
425
+ projectMeta.push({ dirName, projectPath, sessions, projectName, lastActive });
426
+ }
427
+ projectMeta.sort((a, b) => b.lastActive.getTime() - a.lastActive.getTime());
428
+ const projectCount = projectMeta.length;
429
+ if (projectCount === 0) {
430
+ error('No projects with sessions found.');
431
+ }
432
+ const perProjectCap = options.maxPerProject || Math.max(5, Math.floor(limit / projectCount));
433
+ const recencyThreshold = Date.now() - 30 * 24 * 60 * 60 * 1000;
434
+ const allMessages = [];
435
+ let skippedContextDumps = 0;
436
+ const projectBreakdown = [];
437
+ for (const proj of projectMeta) {
438
+ if (allMessages.length >= limit)
439
+ break;
440
+ const cappedSessions = proj.sessions.slice(0, perProjectCap);
441
+ let projectMessages = 0;
442
+ let projectSessionsUsed = 0;
443
+ for (const session of cappedSessions) {
444
+ if (allMessages.length >= limit)
445
+ break;
446
+ const isRecent = session.modified.getTime() >= recencyThreshold;
447
+ const perSessionMax = isRecent ? 10 : 3;
448
+ const remaining = Math.min(perSessionMax, limit - allMessages.length);
449
+ try {
450
+ const msgs = await streamExtractMessages(session.filePath, isGenuineUserMessage, remaining);
451
+ let sessionUsed = false;
452
+ for (const msg of msgs) {
453
+ if (allMessages.length >= limit)
454
+ break;
455
+ const content = msg.content || '';
456
+ if (content.startsWith('This session is being continued')) {
457
+ skippedContextDumps++;
458
+ continue;
459
+ }
460
+ const lines = content.split('\n').filter(l => l.trim().length > 0);
461
+ if (lines.length > 3) {
462
+ const logPattern = /^\[?(DEBUG|INFO|WARN|ERROR|LOG)\]?/i;
463
+ const timestampPattern = /^\d{4}-\d{2}-\d{2}/;
464
+ const logLines = lines.filter(l => logPattern.test(l.trim()) || timestampPattern.test(l.trim()));
465
+ if (logLines.length / lines.length > 0.8) {
466
+ skippedContextDumps++;
467
+ continue;
468
+ }
469
+ }
470
+ const truncated = truncateContent(content, maxChars);
471
+ allMessages.push({
472
+ sessionId: msg.sessionId,
473
+ projectName: proj.projectName,
474
+ projectPath: msg.projectPath,
475
+ timestamp: msg.timestamp,
476
+ content: truncated,
477
+ });
478
+ projectMessages++;
479
+ sessionUsed = true;
480
+ }
481
+ if (sessionUsed)
482
+ projectSessionsUsed++;
483
+ }
484
+ catch {
485
+ continue;
486
+ }
487
+ }
488
+ if (projectMessages > 0) {
489
+ projectBreakdown.push({
490
+ project: proj.projectName,
491
+ messages: projectMessages,
492
+ sessions: projectSessionsUsed,
493
+ });
494
+ }
495
+ }
496
+ reapStaleTempFiles('gsd-profile-', { dirsOnly: true });
497
+ const tmpDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'gsd-profile-'));
498
+ const outputPath = node_path_1.default.join(tmpDir, 'profile-sample.jsonl');
499
+ for (const msg of allMessages) {
500
+ node_fs_1.default.appendFileSync(outputPath, JSON.stringify(msg) + '\n');
501
+ }
502
+ const result = {
503
+ output_file: outputPath,
504
+ projects_sampled: projectBreakdown.length,
505
+ messages_sampled: allMessages.length,
506
+ per_project_cap: perProjectCap,
507
+ message_char_limit: maxChars,
508
+ skipped_context_dumps: skippedContextDumps,
509
+ project_breakdown: projectBreakdown,
510
+ };
511
+ output(result, raw, undefined);
512
+ }
513
+ module.exports = {
514
+ cmdScanSessions,
515
+ cmdExtractMessages,
516
+ cmdProfileSample,
517
+ };
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * Project-Root Resolution Module — resolves a project root from a starting
4
+ * directory by walking the ancestor chain and applying four heuristics:
5
+ * (0) own .planning/ guard (#1362)
6
+ * (1) parent .planning/config.json sub_repos
7
+ * (2) legacy multiRepo: true + ancestor .git
8
+ * (3) .git heuristic with parent .planning/
9
+ * Bounded by FIND_PROJECT_ROOT_MAX_DEPTH ancestors. Sync I/O.
10
+ *
11
+ * ADR-457 build-at-publish: the hand-written bin/lib/project-root.cjs
12
+ * collapsed to a TypeScript source of truth. Behaviour is preserved
13
+ * byte-for-behaviour from the prior hand-written .cjs; only types are added.
14
+ */
15
+ var __importDefault = (this && this.__importDefault) || function (mod) {
16
+ return (mod && mod.__esModule) ? mod : { "default": mod };
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.findProjectRoot = findProjectRoot;
20
+ const node_fs_1 = __importDefault(require("node:fs"));
21
+ const node_path_1 = __importDefault(require("node:path"));
22
+ const node_os_1 = __importDefault(require("node:os"));
23
+ const FIND_PROJECT_ROOT_MAX_DEPTH = 10;
24
+ function findProjectRoot(startDir) {
25
+ let resolvedStart;
26
+ try {
27
+ resolvedStart = node_path_1.default.resolve(startDir);
28
+ }
29
+ catch {
30
+ return startDir;
31
+ }
32
+ const fsRoot = node_path_1.default.parse(resolvedStart).root;
33
+ const home = node_os_1.default.homedir();
34
+ // If startDir already contains .planning/, it IS the project root.
35
+ try {
36
+ const ownPlanningDir = resolvedStart + node_path_1.default.sep + '.planning';
37
+ if (node_fs_1.default.existsSync(ownPlanningDir) && node_fs_1.default.statSync(ownPlanningDir).isDirectory()) {
38
+ return startDir;
39
+ }
40
+ }
41
+ catch {
42
+ // fall through
43
+ }
44
+ // Walk upward, mirroring isInsideGitRepo from the CJS reference.
45
+ function isInsideGitRepo(candidateParent) {
46
+ let d = resolvedStart;
47
+ while (d !== fsRoot) {
48
+ try {
49
+ if (node_fs_1.default.existsSync(d + node_path_1.default.sep + '.git'))
50
+ return true;
51
+ }
52
+ catch {
53
+ // ignore
54
+ }
55
+ if (d === candidateParent)
56
+ break;
57
+ const next = node_path_1.default.dirname(d);
58
+ if (next === d)
59
+ break;
60
+ d = next;
61
+ }
62
+ return false;
63
+ }
64
+ let dir = resolvedStart;
65
+ let depth = 0;
66
+ while (dir !== fsRoot && depth < FIND_PROJECT_ROOT_MAX_DEPTH) {
67
+ const parent = node_path_1.default.dirname(dir);
68
+ if (parent === dir)
69
+ break;
70
+ if (parent === home)
71
+ break;
72
+ const parentPlanning = parent + node_path_1.default.sep + '.planning';
73
+ let parentPlanningIsDir = false;
74
+ try {
75
+ parentPlanningIsDir = node_fs_1.default.existsSync(parentPlanning) && node_fs_1.default.statSync(parentPlanning).isDirectory();
76
+ }
77
+ catch {
78
+ parentPlanningIsDir = false;
79
+ }
80
+ if (parentPlanningIsDir) {
81
+ const configPath = parentPlanning + node_path_1.default.sep + 'config.json';
82
+ let matched = false;
83
+ try {
84
+ const raw = node_fs_1.default.readFileSync(configPath, 'utf-8');
85
+ const config = JSON.parse(raw);
86
+ if (config && typeof config === 'object') {
87
+ const cfg = config;
88
+ const subReposValue = cfg['sub_repos'] ??
89
+ (cfg['planning'] && typeof cfg['planning'] === 'object'
90
+ ? cfg['planning']['sub_repos']
91
+ : undefined);
92
+ const subRepos = Array.isArray(subReposValue) ? subReposValue : [];
93
+ if (subRepos.length > 0) {
94
+ const relPath = node_path_1.default.relative(parent, resolvedStart);
95
+ const topSegment = relPath.split(node_path_1.default.sep)[0];
96
+ if (subRepos.includes(topSegment)) {
97
+ return parent;
98
+ }
99
+ }
100
+ if (cfg['multiRepo'] === true && isInsideGitRepo(parent)) {
101
+ matched = true;
102
+ }
103
+ }
104
+ }
105
+ catch {
106
+ // config.json missing or unparseable — fall through to .git heuristic.
107
+ }
108
+ if (matched)
109
+ return parent;
110
+ // Heuristic: parent has .planning/ and we're inside a git repo.
111
+ if (isInsideGitRepo(parent)) {
112
+ return parent;
113
+ }
114
+ }
115
+ dir = parent;
116
+ depth += 1;
117
+ }
118
+ return startDir;
119
+ }