@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,406 @@
1
+ "use strict";
2
+ /**
3
+ * Runtime surface module — ADR-0011 Phase 2 (Option B).
4
+ *
5
+ * Manages the runtime enable/disable surface state (the `.gsd-surface.json` marker in
6
+ * each runtime's config dir root (e.g., ~/.claude)) independently of the install-time profile marker
7
+ * (`.gsd-profile`). Runtime config locations are resolved by callers.
8
+ *
9
+ * Effective skill set = base profile ∪ explicitAdds − disabledClusters − explicitRemoves,
10
+ * then transitively closed via the manifest.
11
+ *
12
+ * Exports:
13
+ * readSurface(runtimeConfigDir)
14
+ * writeSurface(runtimeConfigDir, surfaceState)
15
+ * resolveSurface(runtimeConfigDir, manifest, clusterMap)
16
+ * applySurface(runtimeConfigDir, layout, manifest, clusterMap)
17
+ * listSurface(runtimeConfigDir, manifest, clusterMap)
18
+ * pruneSkillDirs(skillsDir, retainedNames, prefix, manifest)
19
+ *
20
+ * ADR-457 build-at-publish: the hand-written bin/lib/surface.cjs collapsed
21
+ * to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
22
+ * from the prior hand-written .cjs; only types are added.
23
+ */
24
+ var __importDefault = (this && this.__importDefault) || function (mod) {
25
+ return (mod && mod.__esModule) ? mod : { "default": mod };
26
+ };
27
+ const node_fs_1 = __importDefault(require("node:fs"));
28
+ const node_path_1 = __importDefault(require("node:path"));
29
+ const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
30
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
31
+ const installProfiles = require("./install-profiles.cjs");
32
+ const { readActiveProfile, resolveProfile, loadSkillsManifest, } = installProfiles;
33
+ const clusters_cjs_1 = require("./clusters.cjs");
34
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
35
+ const runtimeArtifactLayout = require("./runtime-artifact-layout.cjs");
36
+ const { findInstallSourceRoot } = runtimeArtifactLayout;
37
+ const SURFACE_FILE_NAME = '.gsd-surface.json';
38
+ /**
39
+ * Read the surface state from a runtime config directory.
40
+ *
41
+ * @param runtimeConfigDir
42
+ * @returns null if file missing or corrupt
43
+ */
44
+ function readSurface(runtimeConfigDir) {
45
+ const filePath = node_path_1.default.join(runtimeConfigDir, SURFACE_FILE_NAME);
46
+ try {
47
+ const raw = node_fs_1.default.readFileSync(filePath, 'utf8');
48
+ const parsed = JSON.parse(raw);
49
+ // Structural validation — must have these fields with expected types
50
+ if (typeof parsed !== 'object' || parsed === null)
51
+ return null;
52
+ const p = parsed;
53
+ if (typeof p['baseProfile'] !== 'string')
54
+ return null;
55
+ if (!Array.isArray(p['disabledClusters']))
56
+ return null;
57
+ if (!Array.isArray(p['explicitAdds']))
58
+ return null;
59
+ if (!Array.isArray(p['explicitRemoves']))
60
+ return null;
61
+ return {
62
+ baseProfile: p['baseProfile'],
63
+ disabledClusters: p['disabledClusters'],
64
+ explicitAdds: p['explicitAdds'],
65
+ explicitRemoves: p['explicitRemoves'],
66
+ };
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ /**
73
+ * Write the surface state atomically via the platform seam (mkdir + tmp+rename).
74
+ */
75
+ function writeSurface(runtimeConfigDir, surfaceState) {
76
+ (0, shell_command_projection_cjs_1.platformWriteSync)(node_path_1.default.join(runtimeConfigDir, SURFACE_FILE_NAME), JSON.stringify(surfaceState, null, 2) + '\n');
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Resolution
80
+ // ---------------------------------------------------------------------------
81
+ /**
82
+ * Expand cluster names to skill stems using the provided clusterMap.
83
+ */
84
+ function clustersToSkills(clusterNames, clusterMap) {
85
+ const result = new Set();
86
+ for (const name of clusterNames) {
87
+ const members = clusterMap[name];
88
+ if (members) {
89
+ for (const s of members)
90
+ result.add(s);
91
+ }
92
+ }
93
+ return result;
94
+ }
95
+ /**
96
+ * Normalize manifest inputs to the skill-dependency Map shape expected by
97
+ * resolveProfile/computeClosure.
98
+ *
99
+ * Supports:
100
+ * - canonical Map<string, string[]>
101
+ * - legacy plain object map: { [stem]: string[] }
102
+ * - parsed gsd-file-manifest.json object ({ files: { ... } }) by rebuilding
103
+ * the dependency manifest from the install source tree
104
+ */
105
+ function normalizeSkillManifest(runtimeConfigDir, manifest) {
106
+ if (manifest instanceof Map) {
107
+ return manifest;
108
+ }
109
+ if (!manifest || typeof manifest !== 'object') {
110
+ return new Map();
111
+ }
112
+ // Legacy/ad-hoc object map: stem -> requires[]
113
+ const arrayEntries = Object.entries(manifest).filter(([, value]) => Array.isArray(value));
114
+ if (arrayEntries.length > 0) {
115
+ return new Map(arrayEntries.map(([stem, deps]) => [stem, deps]));
116
+ }
117
+ // Parsed gsd-file-manifest.json shape: rebuild the dependency map from source.
118
+ const manifestObj = manifest;
119
+ if (manifestObj['files'] && typeof manifestObj['files'] === 'object') {
120
+ const srcCommandsDir = findInstallSourceRoot(runtimeConfigDir);
121
+ return loadSkillsManifest(srcCommandsDir);
122
+ }
123
+ return new Map();
124
+ }
125
+ /**
126
+ * Resolve the effective surface to a typed profile-like object.
127
+ * Shape: { name, skills: Set<string>|'*', agents: Set<string> }
128
+ *
129
+ * Resolution order:
130
+ * 1. Start with base profile resolved via resolveProfile()
131
+ * 2. Remove skills in disabled clusters
132
+ * 3. Add explicitAdds (and their transitive closure)
133
+ * 4. Remove explicitRemoves (only the stem itself, no cascade)
134
+ */
135
+ function resolveSurface(runtimeConfigDir, manifest, clusterMap) {
136
+ const cm = clusterMap || clusters_cjs_1.CLUSTERS;
137
+ const skillManifest = normalizeSkillManifest(runtimeConfigDir, manifest);
138
+ const surface = readSurface(runtimeConfigDir);
139
+ // Determine base profile name: from surface state or from .gsd-profile marker
140
+ const baseProfileName = (surface && surface.baseProfile)
141
+ ? surface.baseProfile
142
+ : (readActiveProfile(runtimeConfigDir) || 'full');
143
+ // Resolve base profile
144
+ const baseResolved = resolveProfile({
145
+ modes: baseProfileName.split(',').map((s) => s.trim()),
146
+ manifest: skillManifest,
147
+ });
148
+ // If full, we need to enumerate all skills from the manifest
149
+ let skills;
150
+ if (baseResolved.skills === '*') {
151
+ // Materialize all skill stems from manifest
152
+ skills = new Set();
153
+ for (const [key] of skillManifest) {
154
+ if (!key.startsWith('_calls_agents_'))
155
+ skills.add(key);
156
+ }
157
+ }
158
+ else {
159
+ skills = new Set(baseResolved.skills);
160
+ }
161
+ if (surface) {
162
+ // Step 2: remove disabled cluster members
163
+ const disabledSkills = clustersToSkills(surface.disabledClusters, cm);
164
+ for (const s of disabledSkills)
165
+ skills.delete(s);
166
+ // Step 3: add explicitAdds with transitive closure
167
+ if (surface.explicitAdds.length > 0) {
168
+ const addSet = new Set(surface.explicitAdds);
169
+ // Compute closure of adds
170
+ const queue = [...addSet];
171
+ const visited = new Set(addSet);
172
+ while (queue.length > 0) {
173
+ const stem = queue.pop();
174
+ const deps = skillManifest.get(stem) || [];
175
+ for (const dep of deps) {
176
+ if (!visited.has(dep)) {
177
+ visited.add(dep);
178
+ queue.push(dep);
179
+ }
180
+ }
181
+ }
182
+ for (const s of visited)
183
+ skills.add(s);
184
+ }
185
+ // Step 4: remove explicitRemoves (stem only, no cascade)
186
+ for (const s of surface.explicitRemoves) {
187
+ skills.delete(s);
188
+ }
189
+ }
190
+ // Derive agents from skills
191
+ const agents = new Set();
192
+ for (const skillStem of skills) {
193
+ const agentRefs = skillManifest.get(`_calls_agents_${skillStem}`) || [];
194
+ for (const agentStem of agentRefs)
195
+ agents.add(agentStem);
196
+ }
197
+ const name = surface ? `surface:${surface.baseProfile}` : `profile:${baseProfileName}`;
198
+ return { name, skills, agents };
199
+ }
200
+ // ---------------------------------------------------------------------------
201
+ // Apply
202
+ // ---------------------------------------------------------------------------
203
+ /**
204
+ * Re-stage the active surface using the resolved layout.
205
+ * Iterates layout.kinds and syncs each artifact kind to its destination.
206
+ */
207
+ function applySurface(runtimeConfigDir, layout, manifest, clusterMap) {
208
+ if (node_path_1.default.resolve(runtimeConfigDir) !== node_path_1.default.resolve(layout.configDir)) {
209
+ throw new TypeError('applySurface runtimeConfigDir must match layout.configDir');
210
+ }
211
+ const skillManifest = normalizeSkillManifest(layout.configDir, manifest);
212
+ const resolved = resolveSurface(layout.configDir, skillManifest, clusterMap);
213
+ for (const kind of layout.kinds) {
214
+ const staged = kind.stage(resolved);
215
+ const dest = node_path_1.default.join(layout.configDir, kind.destSubpath);
216
+ _syncGsdDir(staged, dest, kind, skillManifest);
217
+ }
218
+ return resolved;
219
+ }
220
+ /**
221
+ * Prune GSD-managed skill directories from a skills directory.
222
+ *
223
+ * Removes every directory in `skillsDir` that is GSD-owned but NOT listed
224
+ * in `retainedNames`. User-owned dirs (not matching the GSD ownership criteria)
225
+ * are always preserved.
226
+ *
227
+ * Ownership criteria:
228
+ * - Non-empty prefix (e.g. 'gsd-'): dir name starts with that prefix AND
229
+ * appears in the manifest (manifest membership is required). Dirs that match
230
+ * the prefix but are NOT in the manifest are treated as user-owned and
231
+ * preserved — this prevents data loss for user-created gsd-* directories.
232
+ * A warning is written to stderr when such a dir is encountered.
233
+ * - Empty prefix (Hermes): dir name appears as a canonical skill stem in the
234
+ * manifest. User dirs not in the manifest are preserved.
235
+ * - Empty prefix without manifest, or manifest not a Map: conservative; no
236
+ * dirs are removed.
237
+ *
238
+ * This is the single point of truth for skill-dir pruning. Both _syncGsdDir
239
+ * (surface apply) and callers that need stand-alone pruning use this function.
240
+ *
241
+ * @param skillsDir directory that contains the gsd-STEM sub-dirs
242
+ * @param retainedNames set of directory names to keep (e.g. 'gsd-help')
243
+ * @param prefix GSD dir prefix, e.g. 'gsd-' (or '' for Hermes)
244
+ * @param manifest optional; required for Hermes empty-prefix case
245
+ * and for manifest-membership gate in prefixed case.
246
+ * Must be a Map; any other type is treated as missing.
247
+ */
248
+ function pruneSkillDirs(skillsDir, retainedNames, prefix, manifest) {
249
+ if (!node_fs_1.default.existsSync(skillsDir))
250
+ return;
251
+ // Finding 2: guard against callers passing a truthy non-Map as manifest.
252
+ // A non-Map manifest would throw on .keys(); treat it as absent and be conservative.
253
+ const safeManifest = (manifest instanceof Map) ? manifest : null;
254
+ // Build the canonical stem set from the manifest (used for both prefixed and Hermes paths).
255
+ // Deletion requires manifest membership — without a valid manifest, be conservative.
256
+ const canonicalStems = safeManifest
257
+ ? new Set([...safeManifest.keys()].filter(k => !k.startsWith('_calls_agents_')))
258
+ : null;
259
+ for (const entry of node_fs_1.default.readdirSync(skillsDir)) {
260
+ const entryPath = node_path_1.default.join(skillsDir, entry);
261
+ if (!node_fs_1.default.statSync(entryPath).isDirectory())
262
+ continue;
263
+ let isGsdOwned;
264
+ if (prefix !== '') {
265
+ if (!entry.startsWith(prefix)) {
266
+ // Does not match prefix at all — user-owned, preserve.
267
+ continue;
268
+ }
269
+ if (!canonicalStems) {
270
+ // No manifest available: cannot confirm ownership — preserve conservatively.
271
+ continue;
272
+ }
273
+ // Finding 1 fix: prefix match is necessary but NOT sufficient.
274
+ // The dir must also be in the manifest to be considered GSD-owned.
275
+ // A user-created gsd-* dir that isn't in the manifest is preserved with a warning.
276
+ if (!canonicalStems.has(entry.slice(prefix.length))) {
277
+ process.stderr.write(`[gsd] Warning: ${entry} matches GSD prefix '${prefix}' but is not in the manifest — preserving (user-owned or unknown)\n`);
278
+ continue;
279
+ }
280
+ isGsdOwned = true;
281
+ }
282
+ else if (canonicalStems) {
283
+ // Hermes: GSD-owned iff the directory name appears in the canonical manifest.
284
+ isGsdOwned = canonicalStems.has(entry);
285
+ }
286
+ else {
287
+ // No manifest available: be conservative, don't remove anything.
288
+ continue;
289
+ }
290
+ if (!isGsdOwned)
291
+ continue; // Hermes path only: preserve user-owned dirs not in manifest
292
+ if (retainedNames.has(entry))
293
+ continue; // GSD-owned and in retain set
294
+ try {
295
+ node_fs_1.default.rmSync(entryPath, { recursive: true, force: true });
296
+ }
297
+ catch (err) {
298
+ process.stderr.write(`surface: failed to prune ${entryPath}: ${err.message}\n`);
299
+ }
300
+ }
301
+ }
302
+ /**
303
+ * Sync destination directory from staged source.
304
+ *
305
+ * For 'commands' kind: iterate *.md files in destDir, remove if not in staged set.
306
+ * For 'agents' kind: same, but only remove files starting with 'gsd-' prefix.
307
+ * For 'skills' kind: iterate directories in destDir matching kind.prefix; add missing
308
+ * by copying recursively; remove dirs not in staged set. Preserves dirs not matching
309
+ * the prefix (user-owned skills). Pruning is delegated to pruneSkillDirs().
310
+ *
311
+ * For Hermes (empty prefix): uses manifest membership to discriminate GSD-owned vs
312
+ * user-owned dirs. GSD-owned = stem in manifest; removal targets = in manifest AND
313
+ * not in staged set. User-owned (not in manifest) are always preserved.
314
+ */
315
+ function _syncGsdDir(stagedDir, destDir, kind, manifest) {
316
+ if (!node_fs_1.default.existsSync(stagedDir))
317
+ return;
318
+ node_fs_1.default.mkdirSync(destDir, { recursive: true });
319
+ // Normalize: allow legacy string context for backward-compat with internal callers
320
+ const kindName = (typeof kind === 'string') ? kind : kind.kind;
321
+ const kindPrefix = (typeof kind === 'object' && kind !== null) ? kind.prefix : 'gsd-';
322
+ if (kindName === 'skills') {
323
+ // Skills kind: work with directories, not files.
324
+ // Each staged entry is a directory named ${prefix}${stem}.
325
+ const stagedDirs = new Set(node_fs_1.default.readdirSync(stagedDir).filter(entry => {
326
+ return node_fs_1.default.statSync(node_path_1.default.join(stagedDir, entry)).isDirectory();
327
+ }));
328
+ // Copy missing dirs from staged to dest (always overwrite to ensure content is current)
329
+ for (const dirName of stagedDirs) {
330
+ const destSubDir = node_path_1.default.join(destDir, dirName);
331
+ node_fs_1.default.cpSync(node_path_1.default.join(stagedDir, dirName), destSubDir, { recursive: true });
332
+ }
333
+ // Prune GSD-owned dirs that are no longer in the staged set.
334
+ // pruneSkillDirs() is the single point of truth for this logic.
335
+ pruneSkillDirs(destDir, stagedDirs, kindPrefix, manifest);
336
+ }
337
+ else {
338
+ // commands / agents kind: work with .md files
339
+ const stagedFiles = new Set(node_fs_1.default.readdirSync(stagedDir).filter(f => f.endsWith('.md')));
340
+ // Copy files from staged to dest (overwrite to keep content current)
341
+ for (const file of stagedFiles) {
342
+ node_fs_1.default.copyFileSync(node_path_1.default.join(stagedDir, file), node_path_1.default.join(destDir, file));
343
+ }
344
+ // Remove gsd-only files from dest that aren't in staged set
345
+ // For commands dir: all .md files are gsd skills
346
+ // For agents dir: only gsd-* files
347
+ const destEntries = node_fs_1.default.readdirSync(destDir).filter(f => f.endsWith('.md'));
348
+ for (const file of destEntries) {
349
+ if (kindName === 'agents' && !file.startsWith('gsd-'))
350
+ continue;
351
+ if (!stagedFiles.has(file)) {
352
+ try {
353
+ node_fs_1.default.unlinkSync(node_path_1.default.join(destDir, file));
354
+ }
355
+ catch { /* ignore */ }
356
+ }
357
+ }
358
+ }
359
+ }
360
+ // ---------------------------------------------------------------------------
361
+ // List
362
+ // ---------------------------------------------------------------------------
363
+ /**
364
+ * List the currently enabled and disabled skills with token cost.
365
+ *
366
+ * Token cost = sum of description lengths ÷ 4 (mirrors audit script).
367
+ * Descriptions are read from the install source (findInstallSourceRoot).
368
+ */
369
+ function listSurface(runtimeConfigDir, manifest, clusterMap) {
370
+ const skillManifest = normalizeSkillManifest(runtimeConfigDir, manifest);
371
+ const resolved = resolveSurface(runtimeConfigDir, skillManifest, clusterMap);
372
+ // All known stems from manifest (exclude _calls_agents_ meta keys)
373
+ const allStems = [];
374
+ for (const [key] of skillManifest) {
375
+ if (!key.startsWith('_calls_agents_'))
376
+ allStems.push(key);
377
+ }
378
+ const enabledSet = resolved.skills instanceof Set ? resolved.skills : new Set(allStems);
379
+ const enabled = allStems.filter(s => enabledSet.has(s)).sort();
380
+ const disabled = allStems.filter(s => !enabledSet.has(s)).sort();
381
+ // Compute token cost by reading descriptions from the install source
382
+ const srcCommandsDir = findInstallSourceRoot(runtimeConfigDir);
383
+ let tokenCost = 0;
384
+ for (const stem of enabled) {
385
+ const filePath = node_path_1.default.join(srcCommandsDir, `${stem}.md`);
386
+ try {
387
+ const content = node_fs_1.default.readFileSync(filePath, 'utf8');
388
+ const descMatch = content.match(/^description:\s*(.+)$/m);
389
+ if (descMatch) {
390
+ tokenCost += Math.ceil(descMatch[1].trim().length / 4);
391
+ }
392
+ }
393
+ catch { /* ignore */ }
394
+ }
395
+ return { enabled, disabled, tokenCost };
396
+ }
397
+ module.exports = {
398
+ readSurface,
399
+ writeSurface,
400
+ resolveSurface,
401
+ applySurface,
402
+ listSurface,
403
+ // Exported for testing and for callers that need stand-alone pruning
404
+ pruneSkillDirs,
405
+ _syncGsdDir,
406
+ };
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Task command router — is-behavior-adding subcommand handler.
4
+ *
5
+ * ADR-457 build-at-publish: the hand-written bin/lib/task-command-router.cjs
6
+ * collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
7
+ * from the prior hand-written .cjs; only types are added.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ const node_fs_1 = __importDefault(require("node:fs"));
13
+ const node_path_1 = __importDefault(require("node:path"));
14
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
15
+ const core = require("./core.cjs");
16
+ const { output, error, ERROR_REASON } = core;
17
+ // ─── Implementation ───────────────────────────────────────────────────────────
18
+ function isBehaviorAddingTaskContent(content) {
19
+ const tddTrue = /\btdd\s*=\s*["']true["']/i.test(content);
20
+ const behaviorMatch = content.match(/<behavior>([\s\S]*?)<\/behavior>/i);
21
+ const hasBehaviorBlock = Boolean(behaviorMatch && behaviorMatch[1].trim().length > 0);
22
+ const filesMatch = content.match(/<files>([\s\S]*?)<\/files>/i);
23
+ let hasSourceFiles = false;
24
+ if (filesMatch) {
25
+ const fileLines = filesMatch[1]
26
+ .split(/[\n,]/)
27
+ .map((line) => line.trim().replace(/^[-*]\s*/, ''))
28
+ .filter(Boolean);
29
+ hasSourceFiles = fileLines.some((file) => !/\.md$/i.test(file) &&
30
+ !/\.json$/i.test(file) &&
31
+ !/\.test\.[^.]+$/i.test(file) &&
32
+ !/\.spec\.[^.]+$/i.test(file) &&
33
+ !/(^|[\\/])tests?[\\/]/i.test(file) &&
34
+ !/\.(yml|yaml|toml|ini|cfg|conf|properties)$/i.test(file) &&
35
+ !/(^|[\\/])\.env(\..+)?$/i.test(file));
36
+ }
37
+ const isBehaviorAdding = tddTrue && hasBehaviorBlock && hasSourceFiles;
38
+ const missing = [];
39
+ if (!tddTrue)
40
+ missing.push('tdd="true" frontmatter absent');
41
+ if (!hasBehaviorBlock)
42
+ missing.push('<behavior> block missing or empty');
43
+ if (!hasSourceFiles)
44
+ missing.push('<files> has no non-test source file');
45
+ return {
46
+ is_behavior_adding: isBehaviorAdding,
47
+ checks: {
48
+ tdd_true: tddTrue,
49
+ has_behavior_block: hasBehaviorBlock,
50
+ has_source_files: hasSourceFiles,
51
+ },
52
+ reason: isBehaviorAdding ? null : `Not behavior-adding: ${missing.join('; ')}`,
53
+ };
54
+ }
55
+ function routeTaskCommand({ args, cwd, raw }) {
56
+ const subcommand = args[1];
57
+ if (subcommand !== 'is-behavior-adding') {
58
+ error('Unknown task subcommand. Available: is-behavior-adding', ERROR_REASON.SDK_UNKNOWN_COMMAND);
59
+ }
60
+ let content = null;
61
+ if (args[2] === '--task-content') {
62
+ content = args[3] || null;
63
+ }
64
+ else if (args[2]) {
65
+ const projectRoot = node_path_1.default.resolve(cwd || process.cwd());
66
+ const requestedPath = args[2];
67
+ const resolvedTaskPath = node_path_1.default.resolve(projectRoot, requestedPath);
68
+ const rel = node_path_1.default.relative(projectRoot, resolvedTaskPath);
69
+ if (rel === '..' || rel.startsWith(`..${node_path_1.default.sep}`)) {
70
+ error(`Task file is outside project scope: ${requestedPath}`, ERROR_REASON.USAGE);
71
+ }
72
+ if (!node_fs_1.default.existsSync(resolvedTaskPath)) {
73
+ error(`Task file not found: ${requestedPath}`, ERROR_REASON.USAGE);
74
+ }
75
+ content = node_fs_1.default.readFileSync(resolvedTaskPath, 'utf-8');
76
+ }
77
+ if (!content) {
78
+ error('Usage: task.is-behavior-adding <plan-file-path> | --task-content "<xml>"', ERROR_REASON.USAGE);
79
+ }
80
+ output(isBehaviorAddingTaskContent(content), raw, undefined);
81
+ }
82
+ module.exports = {
83
+ isBehaviorAddingTaskContent,
84
+ routeTaskCommand,
85
+ };