@opengsd/gsd-core 1.3.0-rc.1 → 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 (521) hide show
  1. package/README.ja-JP.md +44 -790
  2. package/README.ko-KR.md +41 -778
  3. package/README.md +39 -180
  4. package/README.pt-BR.md +45 -413
  5. package/README.zh-CN.md +43 -761
  6. package/agents/gsd-ai-researcher.md +1 -1
  7. package/agents/gsd-debugger.md +8 -8
  8. package/agents/gsd-domain-researcher.md +14 -1
  9. package/agents/gsd-eval-auditor.md +1 -1
  10. package/agents/gsd-eval-planner.md +1 -1
  11. package/agents/gsd-executor.md +21 -8
  12. package/agents/gsd-framework-selector.md +1 -1
  13. package/agents/gsd-intel-updater.md +4 -4
  14. package/agents/gsd-phase-researcher.md +18 -5
  15. package/agents/gsd-plan-checker.md +3 -3
  16. package/agents/gsd-planner.md +36 -23
  17. package/agents/gsd-project-researcher.md +13 -0
  18. package/agents/gsd-research-synthesizer.md +6 -2
  19. package/agents/gsd-roadmapper.md +6 -6
  20. package/agents/gsd-ui-researcher.md +15 -2
  21. package/agents/gsd-user-profiler.md +2 -2
  22. package/agents/gsd-verifier.md +7 -7
  23. package/bin/install.js +169 -59
  24. package/commands/gsd/add-tests.md +1 -1
  25. package/commands/gsd/ai-integration-phase.md +3 -3
  26. package/commands/gsd/audit-fix.md +1 -1
  27. package/commands/gsd/audit-milestone.md +1 -1
  28. package/commands/gsd/audit-uat.md +1 -1
  29. package/commands/gsd/autonomous.md +2 -2
  30. package/commands/gsd/capture.md +6 -6
  31. package/commands/gsd/cleanup.md +1 -1
  32. package/commands/gsd/code-review.md +1 -1
  33. package/commands/gsd/complete-milestone.md +2 -2
  34. package/commands/gsd/config.md +3 -3
  35. package/commands/gsd/debug.md +1 -1
  36. package/commands/gsd/discuss-phase.md +5 -4
  37. package/commands/gsd/docs-update.md +1 -1
  38. package/commands/gsd/eval-review.md +2 -2
  39. package/commands/gsd/execute-phase.md +2 -2
  40. package/commands/gsd/explore.md +1 -1
  41. package/commands/gsd/extract-learnings.md +2 -2
  42. package/commands/gsd/fast.md +1 -1
  43. package/commands/gsd/forensics.md +1 -1
  44. package/commands/gsd/graphify.md +9 -9
  45. package/commands/gsd/health.md +1 -1
  46. package/commands/gsd/help.md +2 -2
  47. package/commands/gsd/import.md +5 -5
  48. package/commands/gsd/inbox.md +1 -1
  49. package/commands/gsd/ingest-docs.md +4 -4
  50. package/commands/gsd/manager.md +3 -3
  51. package/commands/gsd/map-codebase.md +1 -1
  52. package/commands/gsd/milestone-summary.md +1 -1
  53. package/commands/gsd/mvp-phase.md +4 -4
  54. package/commands/gsd/new-milestone.md +5 -5
  55. package/commands/gsd/new-project.md +5 -5
  56. package/commands/gsd/pause-work.md +2 -2
  57. package/commands/gsd/phase.md +4 -4
  58. package/commands/gsd/plan-phase.md +2 -2
  59. package/commands/gsd/plan-review-convergence.md +4 -4
  60. package/commands/gsd/pr-branch.md +1 -1
  61. package/commands/gsd/profile-user.md +2 -2
  62. package/commands/gsd/progress.md +4 -4
  63. package/commands/gsd/quick.md +1 -1
  64. package/commands/gsd/resume-work.md +1 -1
  65. package/commands/gsd/review.md +1 -1
  66. package/commands/gsd/secure-phase.md +1 -1
  67. package/commands/gsd/settings.md +1 -1
  68. package/commands/gsd/ship.md +2 -2
  69. package/commands/gsd/sketch.md +7 -7
  70. package/commands/gsd/spec-phase.md +2 -2
  71. package/commands/gsd/spike.md +3 -3
  72. package/commands/gsd/stats.md +1 -1
  73. package/commands/gsd/surface.md +4 -4
  74. package/commands/gsd/thread.md +1 -1
  75. package/commands/gsd/ui-phase.md +2 -2
  76. package/commands/gsd/ui-review.md +2 -2
  77. package/commands/gsd/ultraplan-phase.md +2 -2
  78. package/commands/gsd/undo.md +3 -3
  79. package/commands/gsd/update.md +3 -3
  80. package/commands/gsd/validate-phase.md +1 -1
  81. package/commands/gsd/verify-work.md +2 -2
  82. package/commands/gsd/workspace.md +4 -4
  83. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  84. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +13 -3
  85. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  86. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  87. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  88. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  89. package/gsd-core/bin/lib/audit.cjs +743 -0
  90. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  91. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  92. package/gsd-core/bin/lib/clock.cjs +95 -0
  93. package/gsd-core/bin/lib/clusters.cjs +128 -0
  94. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  95. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  96. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  97. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  98. package/gsd-core/bin/lib/commands.cjs +1202 -0
  99. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  100. package/{get-shit-done → gsd-core}/bin/lib/config-types.cjs +1 -1
  101. package/gsd-core/bin/lib/config.cjs +714 -0
  102. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  103. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  104. package/gsd-core/bin/lib/core.cjs +2007 -0
  105. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  106. package/gsd-core/bin/lib/docs.cjs +252 -0
  107. package/gsd-core/bin/lib/drift.cjs +364 -0
  108. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  109. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  110. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  111. package/gsd-core/bin/lib/graphify.cjs +496 -0
  112. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  113. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  114. package/gsd-core/bin/lib/init.cjs +1799 -0
  115. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  116. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  117. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  118. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  119. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  120. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  121. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  122. package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
  123. package/gsd-core/bin/lib/intel.cjs +607 -0
  124. package/gsd-core/bin/lib/learnings.cjs +270 -0
  125. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  126. package/gsd-core/bin/lib/milestone.cjs +373 -0
  127. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  128. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  129. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  130. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  131. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  132. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  133. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  134. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  135. package/gsd-core/bin/lib/phase.cjs +1307 -0
  136. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  137. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  138. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  139. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  140. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  141. package/gsd-core/bin/lib/project-root.cjs +119 -0
  142. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  143. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  144. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  145. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  146. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  147. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  148. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  149. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  150. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  151. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  152. package/gsd-core/bin/lib/secrets.cjs +34 -0
  153. package/gsd-core/bin/lib/security.cjs +407 -0
  154. package/{get-shit-done → gsd-core}/bin/lib/semver-compare.cjs +1 -1
  155. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  156. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  157. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -78
  158. package/gsd-core/bin/lib/state.cjs +2010 -0
  159. package/gsd-core/bin/lib/surface.cjs +406 -0
  160. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  161. package/gsd-core/bin/lib/template.cjs +237 -0
  162. package/gsd-core/bin/lib/uat.cjs +297 -0
  163. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  164. package/gsd-core/bin/lib/update-context.cjs +218 -0
  165. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  166. package/gsd-core/bin/lib/validate.cjs +112 -0
  167. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  168. package/gsd-core/bin/lib/verify.cjs +1451 -0
  169. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  170. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  171. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  172. package/gsd-core/bin/lib/workstream.cjs +380 -0
  173. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  174. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +5 -0
  175. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  176. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  177. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  178. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  179. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  180. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  181. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  182. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  183. package/gsd-core/references/worktree-branch-check.md +38 -0
  184. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  185. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  186. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  187. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  188. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  189. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  190. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  191. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  192. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  193. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  194. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  195. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +1 -1
  196. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +1 -1
  197. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  198. package/{get-shit-done → gsd-core}/workflows/autonomous.md +4 -4
  199. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  200. package/{get-shit-done → gsd-core}/workflows/cleanup.md +1 -1
  201. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +1 -1
  202. package/{get-shit-done → gsd-core}/workflows/code-review.md +4 -4
  203. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  204. package/{get-shit-done → gsd-core}/workflows/debug.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +4 -2
  206. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  207. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +4 -4
  208. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  209. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  211. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +2 -2
  212. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  213. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  214. package/{get-shit-done → gsd-core}/workflows/docs-update.md +1 -1
  215. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  216. package/{get-shit-done → gsd-core}/workflows/eval-review.md +2 -2
  217. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +15 -2
  218. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  219. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +68 -46
  220. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  221. package/{get-shit-done → gsd-core}/workflows/explore.md +3 -3
  222. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  224. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  225. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +1 -1
  227. package/{get-shit-done → gsd-core}/workflows/import.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  230. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/manager.md +1 -1
  232. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +1 -1
  233. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  234. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  235. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +3 -3
  236. package/{get-shit-done → gsd-core}/workflows/new-project.md +6 -6
  237. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  239. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  240. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  241. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +15 -15
  242. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +7 -7
  243. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  245. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  246. package/{get-shit-done → gsd-core}/workflows/quick.md +2 -26
  247. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  248. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  249. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  250. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  251. package/{get-shit-done → gsd-core}/workflows/review.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/scan.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +3 -3
  254. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +1 -1
  255. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  256. package/{get-shit-done → gsd-core}/workflows/settings.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  258. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  260. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  264. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  265. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  266. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  267. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +3 -3
  268. package/{get-shit-done → gsd-core}/workflows/ui-review.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  270. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  271. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  272. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +3 -3
  273. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  274. package/{get-shit-done → gsd-core}/workflows/verify-work.md +5 -5
  275. package/hooks/dist/gsd-check-update-worker.js +16 -3
  276. package/hooks/dist/gsd-check-update.js +7 -5
  277. package/hooks/dist/gsd-context-monitor.js +2 -2
  278. package/hooks/dist/gsd-statusline.js +39 -21
  279. package/hooks/dist/gsd-update-banner.js +6 -2
  280. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  281. package/hooks/gsd-check-update-worker.js +16 -3
  282. package/hooks/gsd-check-update.js +7 -5
  283. package/hooks/gsd-context-monitor.js +2 -2
  284. package/hooks/gsd-statusline.js +39 -21
  285. package/hooks/gsd-update-banner.js +6 -2
  286. package/package.json +9 -6
  287. package/scripts/affected-tests-lib.cjs +1 -1
  288. package/scripts/base64-scan.sh +12 -0
  289. package/scripts/build-hooks.js +4 -1
  290. package/scripts/changeset/cli.cjs +2 -2
  291. package/scripts/changeset/github-release-notes.cjs +1 -1
  292. package/scripts/changeset/lint.cjs +1 -1
  293. package/scripts/check-alias-drift.cjs +8 -8
  294. package/scripts/check-env.cjs +5 -1
  295. package/scripts/ci-test-scope.cjs +25 -10
  296. package/scripts/command-contract-helpers.cjs +1 -1
  297. package/scripts/fix-slash-commands.cjs +5 -5
  298. package/scripts/gen-inventory-manifest.cjs +3 -3
  299. package/scripts/generate-package-identity.cjs +28 -7
  300. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  301. package/scripts/lint-command-contract.cjs +1 -1
  302. package/scripts/lint-legacy-dir-name.cjs +156 -0
  303. package/scripts/lint-package-identity-drift.cjs +8 -8
  304. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  305. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  306. package/scripts/lint-skill-deps.cjs +1 -1
  307. package/scripts/lint-test-file-count.allowlist.json +129 -32
  308. package/scripts/lint-test-file-count.cjs +85 -30
  309. package/scripts/mutation-matrix.cjs +219 -0
  310. package/scripts/prompt-injection-scan.sh +5 -1
  311. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  312. package/scripts/release-tarball-smoke.cjs +9 -9
  313. package/scripts/run-tests.cjs +11 -3
  314. package/scripts/strip-prose-atrefs.cjs +2 -2
  315. package/scripts/sync-runtime-launcher.cjs +2 -2
  316. package/scripts/verify-npm-publish.cjs +252 -0
  317. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  318. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  319. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  320. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  321. package/get-shit-done/bin/lib/audit.cjs +0 -755
  322. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  323. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  324. package/get-shit-done/bin/lib/clock.cjs +0 -96
  325. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  326. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  327. package/get-shit-done/bin/lib/command-aliases.cjs +0 -831
  328. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  329. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  330. package/get-shit-done/bin/lib/commands.cjs +0 -1292
  331. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  332. package/get-shit-done/bin/lib/config.cjs +0 -728
  333. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  334. package/get-shit-done/bin/lib/core.cjs +0 -2513
  335. package/get-shit-done/bin/lib/docs.cjs +0 -270
  336. package/get-shit-done/bin/lib/drift.cjs +0 -388
  337. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  338. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  339. package/get-shit-done/bin/lib/gap-checker.cjs +0 -254
  340. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  341. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  342. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  343. package/get-shit-done/bin/lib/init.cjs +0 -2112
  344. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  345. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  346. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -355
  347. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  348. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  349. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  350. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  351. package/get-shit-done/bin/lib/intel.cjs +0 -708
  352. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  353. package/get-shit-done/bin/lib/milestone.cjs +0 -372
  354. package/get-shit-done/bin/lib/model-catalog.cjs +0 -229
  355. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  356. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  357. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  358. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  359. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -79
  360. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  361. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  362. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  363. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  364. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  365. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  366. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  367. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -126
  368. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -162
  369. package/get-shit-done/bin/lib/roadmap-upgrade.cjs +0 -569
  370. package/get-shit-done/bin/lib/roadmap.cjs +0 -651
  371. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  372. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  373. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  374. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  375. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  376. package/get-shit-done/bin/lib/security.cjs +0 -600
  377. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -535
  378. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  379. package/get-shit-done/bin/lib/state.cjs +0 -2073
  380. package/get-shit-done/bin/lib/surface.cjs +0 -470
  381. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  382. package/get-shit-done/bin/lib/template.cjs +0 -228
  383. package/get-shit-done/bin/lib/uat.cjs +0 -289
  384. package/get-shit-done/bin/lib/ui-safety-gate.cjs +0 -111
  385. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  386. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  387. package/get-shit-done/bin/lib/validate.cjs +0 -118
  388. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  389. package/get-shit-done/bin/lib/verify.cjs +0 -1614
  390. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  391. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  392. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  393. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  394. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  395. package/scripts/lint-no-source-grep.cjs +0 -174
  396. /package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +0 -0
  397. /package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +0 -0
  398. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  399. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  400. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  401. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  402. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  403. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  404. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  405. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  406. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  407. /package/{get-shit-done → gsd-core}/references/checkpoints.md +0 -0
  408. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  409. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  410. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  411. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  412. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  413. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  414. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  415. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  416. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  417. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/ui-brand.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  458. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  459. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  460. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  461. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  462. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  463. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  464. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  465. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  466. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  467. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  468. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  469. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  500. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  501. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  502. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  503. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  504. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  505. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  506. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  507. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  508. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  509. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  510. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  511. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  521. /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
+ }