@opengsd/gsd-core 1.3.0-rc.1 → 1.3.1

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 +823 -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
@@ -1,651 +0,0 @@
1
- /**
2
- * Roadmap — Roadmap parsing and update operations
3
- */
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const { escapeRegex, normalizePhaseName, phaseMarkdownRegexSource, phaseMarkdownRegexSourceExact, output, error, findPhaseInternal, stripShippedMilestones, extractCurrentMilestone, replaceInCurrentMilestone, phaseTokenMatches } = require('./core.cjs');
8
- const { platformWriteSync } = require('./shell-command-projection.cjs');
9
- const { planningPaths, withPlanningLock, findContextMdIn } = require('./planning-workspace.cjs');
10
- const scanPhasePlans = require('./plan-scan.cjs');
11
-
12
- /**
13
- * Coerce an arbitrary YAML scalar/object into a string for cross-cutting
14
- * truth aggregation. Handles:
15
- * - strings (passthrough)
16
- * - numbers / booleans (String() coercion — issue #2770: bare YAML ints
17
- * like `- 3` must be surfaced, not silently skipped)
18
- * - kv-shaped objects from parseMustHavesBlock continuation kv (issue
19
- * #2757) — extract the first meaningful string field
20
- *
21
- * Returns the empty string when no usable text can be derived; callers should
22
- * skip empty results.
23
- */
24
- function coerceTruthToString(t) {
25
- if (t === null || t === undefined) return '';
26
- if (typeof t === 'string') return t;
27
- if (typeof t === 'number' || typeof t === 'boolean' || typeof t === 'bigint') {
28
- return String(t);
29
- }
30
- if (typeof t === 'object') {
31
- // Prefer common title-bearing keys produced by parseMustHavesBlock
32
- for (const k of ['title', 'text', 'name', 'rule', 'path', 'provides']) {
33
- const v = t[k];
34
- if (typeof v === 'string' && v.trim()) return v;
35
- if (typeof v === 'number' || typeof v === 'boolean') return String(v);
36
- }
37
- }
38
- return '';
39
- }
40
-
41
- function countPhasePlansAndSummaries(phaseDir) {
42
- const { planCount, summaryCount } = scanPhasePlans(phaseDir);
43
- // hasContext and hasResearch are not plan-scan concerns — read the directory
44
- // once and share the listing for all non-plan metadata that cmdRoadmapAnalyze needs.
45
- let phaseFiles = [];
46
- try { phaseFiles = fs.readdirSync(phaseDir); } catch { /* empty */ }
47
- return {
48
- planCount,
49
- summaryCount,
50
- hasContext: findContextMdIn(phaseFiles) !== null,
51
- hasResearch: phaseFiles.some(f => f.endsWith('-RESEARCH.md') || f === 'RESEARCH.md'),
52
- };
53
- }
54
-
55
- // `phaseMarkdownRegexSource` moved to core.cjs (#3537) so phase.cjs and
56
- // core.cjs itself can consume it without circular deps. Imported above.
57
-
58
- /**
59
- * Search for a phase header (and its section) within the given content string.
60
- * Returns a result object if found (either a full match or a malformed_roadmap
61
- * checklist-only match), or null if the phase is not present at all.
62
- */
63
- function searchPhaseInContent(content, escapedPhase, phaseNum) {
64
- // Match "## Phase X:", "### Phase X:", or "#### Phase X:" with optional name
65
- const phasePattern = new RegExp(
66
- `#{2,4}\\s*(?:\\[[^\\]]+\\]\\s*)?Phase\\s+${escapedPhase}:\\s*([^\\n]+)`,
67
- 'i'
68
- );
69
- const headerMatch = content.match(phasePattern);
70
-
71
- if (!headerMatch) {
72
- // Fallback: check if phase exists in summary list but missing detail section
73
- const checklistPattern = new RegExp(
74
- `-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${escapedPhase}:\\s*([^*]+)\\*\\*`,
75
- 'i'
76
- );
77
- const checklistMatch = content.match(checklistPattern);
78
-
79
- if (checklistMatch) {
80
- return {
81
- found: false,
82
- phase_number: phaseNum,
83
- phase_name: checklistMatch[1].trim(),
84
- error: 'malformed_roadmap',
85
- message: `Phase ${phaseNum} exists in summary list but missing "### Phase ${phaseNum}:" detail section. ROADMAP.md needs both formats.`
86
- };
87
- }
88
-
89
- return null;
90
- }
91
-
92
- const phaseName = headerMatch[1].trim();
93
- const headerIndex = headerMatch.index;
94
-
95
- // Find the end of this section (next ## or ### phase header, or end of file).
96
- // Also matches bracket-prefixed headings like ### [GSD] Phase 2-01:.
97
- const restOfContent = content.slice(headerIndex);
98
- const nextHeaderMatch = restOfContent.match(/\n#{2,4}\s+(?:\[[^\]]+\]\s*)?Phase\s+[\w][\w.-]*/i);
99
- const sectionEnd = nextHeaderMatch
100
- ? headerIndex + nextHeaderMatch.index
101
- : content.length;
102
-
103
- const section = content.slice(headerIndex, sectionEnd).trim();
104
-
105
- // Extract goal if present (supports both **Goal:** and **Goal**: formats)
106
- const goalMatch = section.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i);
107
- const goal = goalMatch ? goalMatch[1].trim() : null;
108
-
109
- // Mode: vertical-MVP slice mode flag. Lowercased + trimmed for canonical
110
- // comparison; unrecognized values are preserved verbatim for forward-compat.
111
- const modeMatch = section.match(/\*\*Mode(?::\*\*|\*\*:)\s*([^\n]+)/i);
112
- const mode = modeMatch ? modeMatch[1].trim().toLowerCase() : null;
113
-
114
- // Extract success criteria as structured array
115
- const criteriaMatch = section.match(/\*\*Success Criteria\*\*[^\n]*:\s*\n((?:\s*\d+\.\s*[^\n]+\n?)+)/i);
116
- const success_criteria = criteriaMatch
117
- ? criteriaMatch[1].trim().split('\n').map(line => line.replace(/^\s*\d+\.\s*/, '').trim()).filter(Boolean)
118
- : [];
119
-
120
- return {
121
- found: true,
122
- phase_number: phaseNum,
123
- phase_name: phaseName,
124
- goal,
125
- mode,
126
- success_criteria,
127
- section,
128
- };
129
- }
130
-
131
- function cmdRoadmapGetPhase(cwd, phaseNum, raw) {
132
- const roadmapPath = planningPaths(cwd).roadmap;
133
-
134
- if (!fs.existsSync(roadmapPath)) {
135
- output({ found: false, error: 'ROADMAP.md not found' }, raw, '');
136
- return;
137
- }
138
-
139
- try {
140
- const rawContent = fs.readFileSync(roadmapPath, 'utf-8');
141
- const milestoneContent = extractCurrentMilestone(rawContent, cwd);
142
-
143
- // #3599 two-pass: when the caller passes a project-code-prefixed ID like
144
- // `PROJ-42`, try the exact-prefixed heading first (`### Phase PROJ-42:`).
145
- // If no match, fall back to the #3537 padding-tolerant numeric form so
146
- // a `CK-01` query still resolves to `### Phase 1:`. Doing this at the
147
- // call site (instead of inside phaseMarkdownRegexSource) avoids the
148
- // alternation-order ambiguity where a bare `### Phase 42:` heading in
149
- // the same document would intercept the match for a `PROJ-42` query.
150
- const fullContent = stripShippedMilestones(rawContent);
151
-
152
- const exactSource = phaseMarkdownRegexSourceExact(phaseNum);
153
- if (exactSource) {
154
- const exactMilestone = searchPhaseInContent(milestoneContent, exactSource, phaseNum);
155
- if (exactMilestone && !exactMilestone.error) {
156
- output(exactMilestone, raw, exactMilestone.section);
157
- return;
158
- }
159
- const exactFull = searchPhaseInContent(fullContent, exactSource, phaseNum);
160
- if (exactFull && !exactFull.error) {
161
- output(exactFull, raw, exactFull.section);
162
- return;
163
- }
164
- }
165
-
166
- // #3537: padding-tolerant fragment so callers passing `02.7` still match
167
- // un-padded ROADMAP prose (`### Phase 2.7:`).
168
- const escapedPhase = phaseMarkdownRegexSource(phaseNum);
169
-
170
- // Search the current milestone slice first, then fall back to full roadmap.
171
- // A malformed_roadmap result (checklist-only) from the milestone should not
172
- // block finding a full header match in the wider roadmap content.
173
- const milestoneResult = searchPhaseInContent(milestoneContent, escapedPhase, phaseNum);
174
- const result = (milestoneResult && !milestoneResult.error)
175
- ? milestoneResult
176
- : searchPhaseInContent(fullContent, escapedPhase, phaseNum) || milestoneResult;
177
-
178
- if (!result) {
179
- output({ found: false, phase_number: phaseNum }, raw, '');
180
- return;
181
- }
182
-
183
- if (result.error) {
184
- output(result, raw, '');
185
- return;
186
- }
187
-
188
- output(result, raw, result.section);
189
- } catch (e) {
190
- error('Failed to read ROADMAP.md: ' + e.message);
191
- }
192
- }
193
-
194
- function cmdRoadmapAnalyze(cwd, raw) {
195
- const roadmapPath = planningPaths(cwd).roadmap;
196
-
197
- if (!fs.existsSync(roadmapPath)) {
198
- output({ error: 'ROADMAP.md not found', milestones: [], phases: [], current_phase: null }, raw);
199
- return;
200
- }
201
-
202
- const rawContent = fs.readFileSync(roadmapPath, 'utf-8');
203
- const content = extractCurrentMilestone(rawContent, cwd);
204
- const phasesDir = planningPaths(cwd).phases;
205
-
206
- // Extract all phase headings: ## Phase N: Name or ### Phase N: Name
207
- const phasePattern = /#{2,4}\s*(?:\[[^\]]+\]\s*)?Phase\s+(\d+[A-Z]?(?:[.-]\d+)*)\s*:\s*([^\n]+)/gi;
208
- const phases = [];
209
- let match;
210
-
211
- // Build phase directory lookup once (O(1) readdir instead of O(N) per phase)
212
- const _phaseDirNames = (() => {
213
- try {
214
- return fs.readdirSync(phasesDir, { withFileTypes: true })
215
- .filter(e => e.isDirectory())
216
- .map(e => e.name);
217
- } catch { return []; }
218
- })();
219
-
220
- while ((match = phasePattern.exec(content)) !== null) {
221
- const phaseNum = match[1];
222
- const phaseName = match[2].replace(/\(INSERTED\)/i, '').trim();
223
-
224
- // Extract goal from the section
225
- const sectionStart = match.index;
226
- const restOfContent = content.slice(sectionStart);
227
- // #3691: `\d` → `\d[\d.]*` so decimal phase headings (e.g. `### Phase 02.3:`) are
228
- // recognised as section boundaries.
229
- const nextHeader = restOfContent.match(/\n#{2,4}\s+(?:\[[^\]]+\]\s*)?Phase\s+\d[\d.-]*/i);
230
- const sectionEnd = nextHeader ? sectionStart + nextHeader.index : content.length;
231
- const section = content.slice(sectionStart, sectionEnd);
232
-
233
- const goalMatch = section.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i);
234
- const goal = goalMatch ? goalMatch[1].trim() : null;
235
-
236
- const modeMatch = section.match(/\*\*Mode(?::\*\*|\*\*:)\s*([^\n]+)/i);
237
- const mode = modeMatch ? modeMatch[1].trim().toLowerCase() : null;
238
-
239
- const dependsMatch = section.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i);
240
- const depends_on = dependsMatch ? dependsMatch[1].trim() : null;
241
-
242
- // Check completion on disk
243
- const normalized = normalizePhaseName(phaseNum);
244
- let diskStatus = 'no_directory';
245
- let planCount = 0;
246
- let summaryCount = 0;
247
- let hasContext = false;
248
- let hasResearch = false;
249
-
250
- try {
251
- const dirMatch = _phaseDirNames.find(d => phaseTokenMatches(d, normalized));
252
-
253
- if (dirMatch) {
254
- const counts = countPhasePlansAndSummaries(path.join(phasesDir, dirMatch));
255
- planCount = counts.planCount;
256
- summaryCount = counts.summaryCount;
257
- hasContext = counts.hasContext;
258
- hasResearch = counts.hasResearch;
259
-
260
- if (summaryCount >= planCount && planCount > 0) diskStatus = 'complete';
261
- else if (summaryCount > 0) diskStatus = 'partial';
262
- else if (planCount > 0) diskStatus = 'planned';
263
- else if (hasResearch) diskStatus = 'researched';
264
- else if (hasContext) diskStatus = 'discussed';
265
- else diskStatus = 'empty';
266
- }
267
- } catch { /* intentionally empty */ }
268
-
269
- // Check ROADMAP checkbox status.
270
- // #3537: padding-tolerant fragment — the heading discovered above may use
271
- // a different padding than the summary-bullet checkbox below it (mixed
272
- // padding inside one ROADMAP is legal and seen in real projects).
273
- const checkboxPattern = new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${phaseMarkdownRegexSource(phaseNum)}[:\\s]`, 'i');
274
- const checkboxMatch = content.match(checkboxPattern);
275
- const roadmapComplete = checkboxMatch ? checkboxMatch[1] === 'x' : false;
276
-
277
- // If roadmap marks phase complete, trust that over disk file structure.
278
- // Phases completed before GSD tracking (or via external tools) may lack
279
- // the standard PLAN/SUMMARY pairs but are still done.
280
- if (roadmapComplete && diskStatus !== 'complete') {
281
- diskStatus = 'complete';
282
- }
283
-
284
- phases.push({
285
- number: phaseNum,
286
- name: phaseName,
287
- goal,
288
- mode,
289
- depends_on,
290
- plan_count: planCount,
291
- summary_count: summaryCount,
292
- has_context: hasContext,
293
- has_research: hasResearch,
294
- disk_status: diskStatus,
295
- roadmap_complete: roadmapComplete,
296
- });
297
- }
298
-
299
- // Extract milestone info
300
- const milestones = [];
301
- const milestonePattern = /##\s*(.*v(\d+(?:\.\d+)+)[^(\n]*)/gi;
302
- let mMatch;
303
- while ((mMatch = milestonePattern.exec(content)) !== null) {
304
- milestones.push({
305
- heading: mMatch[1].trim(),
306
- version: 'v' + mMatch[2],
307
- });
308
- }
309
-
310
- // Find current and next phase
311
- const currentPhase = phases.find(p => p.disk_status === 'planned' || p.disk_status === 'partial') || null;
312
- const nextPhase = phases.find(p => p.disk_status === 'empty' || p.disk_status === 'no_directory' || p.disk_status === 'discussed' || p.disk_status === 'researched') || null;
313
-
314
- // Aggregated stats
315
- const totalPlans = phases.reduce((sum, p) => sum + p.plan_count, 0);
316
- const totalSummaries = phases.reduce((sum, p) => sum + p.summary_count, 0);
317
- const completedPhases = phases.filter(p => p.disk_status === 'complete').length;
318
-
319
- // Detect phases in summary list without detail sections (malformed ROADMAP)
320
- const checklistPattern = /-\s*\[[ x]\]\s*\*\*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi;
321
- const checklistPhases = new Set();
322
- let checklistMatch;
323
- while ((checklistMatch = checklistPattern.exec(content)) !== null) {
324
- checklistPhases.add(checklistMatch[1]);
325
- }
326
- const detailPhases = new Set(phases.map(p => p.number));
327
- const missingDetails = [...checklistPhases].filter(p => !detailPhases.has(p));
328
-
329
- const result = {
330
- milestones,
331
- phases,
332
- phase_count: phases.length,
333
- completed_phases: completedPhases,
334
- total_plans: totalPlans,
335
- total_summaries: totalSummaries,
336
- progress_percent: totalPlans > 0 ? Math.min(100, Math.round((totalSummaries / totalPlans) * 100)) : 0,
337
- current_phase: currentPhase ? currentPhase.number : null,
338
- next_phase: nextPhase ? nextPhase.number : null,
339
- missing_phase_details: missingDetails.length > 0 ? missingDetails : null,
340
- };
341
-
342
- output(result, raw);
343
- }
344
-
345
- function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
346
- if (!phaseNum) {
347
- error('phase number required for roadmap update-plan-progress');
348
- }
349
-
350
- const roadmapPath = planningPaths(cwd).roadmap;
351
-
352
- const phaseInfo = findPhaseInternal(cwd, phaseNum);
353
- if (!phaseInfo) {
354
- error(`Phase ${phaseNum} not found`);
355
- }
356
-
357
- const planCount = phaseInfo.plans.length;
358
- const summaryCount = phaseInfo.summaries.length;
359
-
360
- if (planCount === 0) {
361
- output({ updated: false, reason: 'No plans found', plan_count: 0, summary_count: 0 }, raw, 'no plans');
362
- return;
363
- }
364
-
365
- const isComplete = summaryCount >= planCount;
366
- const status = isComplete ? 'Complete' : summaryCount > 0 ? 'In Progress' : 'Planned';
367
- const today = new Date().toISOString().split('T')[0];
368
-
369
- if (!fs.existsSync(roadmapPath)) {
370
- output({ updated: false, reason: 'ROADMAP.md not found', plan_count: planCount, summary_count: summaryCount }, raw, 'no roadmap');
371
- return;
372
- }
373
-
374
- // Wrap entire read-modify-write in lock to prevent concurrent corruption
375
- withPlanningLock(cwd, () => {
376
- let roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
377
- const phasePattern = phaseMarkdownRegexSource(phaseNum);
378
-
379
- // Progress table row: update Plans/Status/Date columns (handles 4 or 5 column tables)
380
- const tableRowPattern = new RegExp(
381
- `^(\\|\\s*${phasePattern}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,
382
- 'im'
383
- );
384
- const dateField = isComplete ? ` ${today} ` : ' ';
385
- roadmapContent = roadmapContent.replace(tableRowPattern, (fullRow) => {
386
- const cells = fullRow.split('|').slice(1, -1); // drop leading/trailing empty from split
387
- if (cells.length === 5) {
388
- // 5-col: Phase | Milestone | Plans | Status | Completed
389
- cells[2] = ` ${summaryCount}/${planCount} `;
390
- cells[3] = ` ${status.padEnd(11)}`;
391
- cells[4] = dateField;
392
- } else if (cells.length === 4) {
393
- // 4-col: Phase | Plans | Status | Completed
394
- cells[1] = ` ${summaryCount}/${planCount} `;
395
- cells[2] = ` ${status.padEnd(11)}`;
396
- cells[3] = dateField;
397
- }
398
- return '|' + cells.join('|') + '|';
399
- });
400
-
401
- // Update plan count in phase detail section
402
- const planCountPattern = new RegExp(
403
- `(#{2,4}\\s*Phase\\s+${phasePattern}(?=[:\\s])[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,
404
- 'i'
405
- );
406
- const planCountText = isComplete
407
- ? `${summaryCount}/${planCount} plans complete`
408
- : `${summaryCount}/${planCount} plans executed`;
409
- roadmapContent = replaceInCurrentMilestone(roadmapContent, planCountPattern, `$1${planCountText}`);
410
-
411
- // If complete: check checkbox
412
- if (isComplete) {
413
- const checkboxPattern = new RegExp(
414
- `(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${phasePattern}[:\\s][^\\n]*)`,
415
- 'i'
416
- );
417
- roadmapContent = replaceInCurrentMilestone(roadmapContent, checkboxPattern, `$1x$2 (completed ${today})`);
418
- }
419
-
420
- // Mark completed plan checkboxes (e.g. "- [ ] 50-01-PLAN.md", "- [ ] 50-01:", or "- [ ] **50-01**")
421
- for (const summaryFile of phaseInfo.summaries) {
422
- const planId = summaryFile.replace('-SUMMARY.md', '').replace('SUMMARY.md', '');
423
- if (!planId) continue;
424
- const planEscaped = escapeRegex(planId);
425
- const planCheckboxPattern = new RegExp(
426
- `(-\\s*\\[) (\\]\\s*(?:\\*\\*)?${planEscaped}(?:\\*\\*)?)`,
427
- 'i'
428
- );
429
- roadmapContent = roadmapContent.replace(planCheckboxPattern, '$1x$2');
430
- }
431
-
432
- platformWriteSync(roadmapPath, roadmapContent);
433
- });
434
- output({
435
- updated: true,
436
- phase: phaseNum,
437
- plan_count: planCount,
438
- summary_count: summaryCount,
439
- status,
440
- complete: isComplete,
441
- }, raw, `${summaryCount}/${planCount} ${status}`);
442
- }
443
-
444
- /**
445
- * Annotate the ROADMAP.md plan list for a phase with wave dependency notes
446
- * and a cross-cutting constraints subsection derived from PLAN frontmatter.
447
- *
448
- * Wave dependency notes: "Wave 2 — blocked on Wave 1 completion" inserted as
449
- * bold headers before each wave group in the plan checklist.
450
- *
451
- * Cross-cutting constraints: must_haves.truths strings that appear in 2+ plans
452
- * are surfaced in a "Cross-cutting constraints" subsection below the plan list.
453
- *
454
- * The operation is idempotent: if wave headers already exist in the section
455
- * the function returns without modifying the file.
456
- */
457
- function cmdRoadmapAnnotateDependencies(cwd, phaseNum, raw) {
458
- if (!phaseNum) {
459
- error('phase number required for roadmap annotate-dependencies');
460
- }
461
-
462
- const roadmapPath = planningPaths(cwd).roadmap;
463
- if (!fs.existsSync(roadmapPath)) {
464
- output({ updated: false, reason: 'ROADMAP.md not found' }, raw, 'no roadmap');
465
- return;
466
- }
467
-
468
- const phaseInfo = findPhaseInternal(cwd, phaseNum);
469
- if (!phaseInfo || phaseInfo.plans.length === 0) {
470
- output({ updated: false, reason: 'no plans found for phase', phase: phaseNum }, raw, 'no plans');
471
- return;
472
- }
473
-
474
- const { extractFrontmatter, parseMustHavesBlock } = require('./frontmatter.cjs');
475
-
476
- // Read each PLAN.md and extract wave + must_haves.truths
477
- const planData = [];
478
- for (const planFile of phaseInfo.plans) {
479
- const planPath = path.join(path.resolve(cwd, phaseInfo.directory), planFile);
480
- try {
481
- const content = fs.readFileSync(planPath, 'utf-8');
482
- const fm = extractFrontmatter(content);
483
- const wave = parseInt(fm.wave, 10) || 1;
484
- const planId = planFile.replace(/-PLAN\.md$/i, '').replace(/PLAN\.md$/i, '');
485
- const truths = parseMustHavesBlock(content, 'truths') || [];
486
- planData.push({ planFile, planId, wave, truths });
487
- } catch { /* skip unreadable plans */ }
488
- }
489
-
490
- if (planData.length === 0) {
491
- output({ updated: false, reason: 'could not read plan frontmatter' }, raw, 'no frontmatter');
492
- return;
493
- }
494
-
495
- // Group plans by wave (sorted)
496
- const waveGroups = new Map();
497
- for (const p of planData) {
498
- if (!waveGroups.has(p.wave)) waveGroups.set(p.wave, []);
499
- waveGroups.get(p.wave).push(p);
500
- }
501
- const waves = [...waveGroups.keys()].sort((a, b) => a - b);
502
-
503
- // Find cross-cutting truths: appear in 2+ plans (de-duplicated, case-insensitive).
504
- //
505
- // Issue #2770: must **coerce, not skip**. A previous guard
506
- // `if (typeof t !== 'string') continue` silently dropped numeric scalars
507
- // (YAML ints like `- 3`) and kv-shaped truths (`- title: X`), so the
508
- // cross-cutting analysis lost real constraints rather than crashing on
509
- // `t.trim()`. We coerce primitives via `String(t)` and extract a sensible
510
- // string field from object-shaped items produced by parseMustHavesBlock's
511
- // continuation-kv path (issue #2757 produces those shapes for nested keys).
512
- const truthCounts = new Map();
513
- for (const { truths } of planData) {
514
- const seen = new Set();
515
- for (const t of truths) {
516
- const text = coerceTruthToString(t);
517
- if (!text) continue;
518
- const trimmed = text.trim();
519
- const key = trimmed.toLowerCase();
520
- if (!key || seen.has(key)) continue;
521
- seen.add(key);
522
- if (!truthCounts.has(key)) truthCounts.set(key, { count: 0, text: trimmed });
523
- truthCounts.get(key).count++;
524
- }
525
- }
526
- const crossCuttingTruths = [...truthCounts.values()]
527
- .filter(v => v.count >= 2)
528
- .map(v => v.text);
529
-
530
- // Patch ROADMAP.md
531
- let updated = false;
532
- withPlanningLock(cwd, () => {
533
- const content = fs.readFileSync(roadmapPath, 'utf-8');
534
-
535
- // Find the phase section.
536
- // #3537: padding-tolerant fragment so the caller's resolved padded id
537
- // matches un-padded ROADMAP headings.
538
- const phaseEscaped = phaseMarkdownRegexSource(phaseNum);
539
- const phaseHeaderPattern = new RegExp(`(#{2,4}\\s*Phase\\s+${phaseEscaped}:[^\\n]*)`, 'i');
540
- const phaseMatch = content.match(phaseHeaderPattern);
541
- if (!phaseMatch) return;
542
-
543
- const phaseStart = phaseMatch.index;
544
- const restAfterHeader = content.slice(phaseStart);
545
- const nextPhaseOffset = restAfterHeader.slice(1).search(/\n#{2,4}\s+Phase\s+\d/i);
546
- const phaseEnd = nextPhaseOffset >= 0 ? phaseStart + 1 + nextPhaseOffset : content.length;
547
- const phaseSection = content.slice(phaseStart, phaseEnd);
548
-
549
- // Idempotency: skip if annotation markers already present
550
- if (
551
- /\*\*Wave\s+\d+/i.test(phaseSection) ||
552
- /\*\*Cross-cutting constraints:\*\*/i.test(phaseSection)
553
- ) return;
554
-
555
- // Find the Plans: section within the phase section.
556
- // #3691 Bug 1: `Plans:\s*\n` required no text after the colon, missing variants like
557
- // `Plans: 3 plans across 2 waves\n` or `**Plans:** 3 plans\n` (bold-wrapped).
558
- // `\*{0,2}Plans\*{0,2}:[^\n]*\n` accepts any text (or none) after the colon
559
- // and tolerates optional `**` markdown bold wrappers on either side.
560
- // The checklist group uses `+` (not `*`) so that a bold `**Plans:**` description
561
- // line with no immediately-following checklist items (e.g. a summary line above a
562
- // separate bare `Plans:` block) does not consume the match and prevent the actual
563
- // list from being found.
564
- // Review fix (F2): `(?:^|\n)` anchors the match to start-of-line so mid-line
565
- // occurrences like `***Plans:***` embedded in a sentence or `OpenPlans: foo`
566
- // do not trigger a false match. Groups 1 and 2 retain the same semantics.
567
- const plansBlockMatch = phaseSection.match(/(?:^|\n)(\*{0,2}Plans\*{0,2}:[^\n]*\n)((?:\s*-\s*\[[ x]\][^\n]*\n?)+)/i);
568
- if (!plansBlockMatch) return;
569
-
570
- const plansHeader = plansBlockMatch[1];
571
- const existingList = plansBlockMatch[2];
572
- const listLines = existingList.split('\n').filter(l => /^\s*-\s*\[/.test(l));
573
-
574
- if (listLines.length === 0) return;
575
-
576
- // #314 perf: build a first-wins Map so per-line lookup is O(1) instead of O(plans).
577
- // First-wins mirrors .find() semantics: if the same planId appears more than once
578
- // in planData, the earlier entry wins — identical to what .find() returned before.
579
- const planById = new Map();
580
- for (const p of planData) {
581
- if (!planById.has(p.planId)) planById.set(p.planId, p);
582
- }
583
-
584
- // Build wave-annotated plan list
585
- const linesByWave = new Map();
586
- for (const line of listLines) {
587
- // Match plan ID from line: "- [ ] 01-01-PLAN.md — ..." or "- [ ] 01-01: ..."
588
- // #3691 Bug 3: `[\w-]+?` excluded `.`, so decimal IDs like `02.3-01` were captured
589
- // as `02` only and never matched planData entries. `[\w.-]+?` preserves the
590
- // terminating alternation (`-PLAN.md|.md|:|\s—`) as the boundary anchor.
591
- const idMatch = line.match(/\[\s*[x ]\s*\]\s*([\w.-]+?)(?:-PLAN\.md|\.md|:|\s—)/i);
592
- const planId = idMatch ? idMatch[1] : null;
593
- // Review fix (F3): reject malformed IDs that start with `.`, contain consecutive
594
- // dots, or otherwise violate the `^\w[\w.-]*$` contract. A leading-dot ID
595
- // (e.g. `.invalid-PLAN.md`) would silently default to wave 1 — defensively
596
- // skip the line instead so corrupted ROADMAP entries don't corrupt wave layout.
597
- if (planId && !/^\w[\w.-]*$/.test(planId)) continue;
598
- const planEntry = planId ? (planById.get(planId) || null) : null;
599
- const wave = planEntry ? planEntry.wave : 1;
600
- if (!linesByWave.has(wave)) linesByWave.set(wave, []);
601
- linesByWave.get(wave).push(line);
602
- }
603
-
604
- const annotatedLines = [];
605
- const sortedWaves = [...linesByWave.keys()].sort((a, b) => a - b);
606
- for (let i = 0; i < sortedWaves.length; i++) {
607
- const w = sortedWaves[i];
608
- const waveLines = linesByWave.get(w);
609
- if (sortedWaves.length > 1) {
610
- const dep = i > 0 ? ` *(blocked on Wave ${sortedWaves[i - 1]} completion)*` : '';
611
- annotatedLines.push(`**Wave ${w}**${dep}`);
612
- }
613
- annotatedLines.push(...waveLines);
614
- if (i < sortedWaves.length - 1) annotatedLines.push('');
615
- }
616
-
617
- // Append cross-cutting constraints subsection if any found
618
- if (crossCuttingTruths.length > 0) {
619
- annotatedLines.push('');
620
- annotatedLines.push('**Cross-cutting constraints:**');
621
- for (const t of crossCuttingTruths) {
622
- annotatedLines.push(`- ${t}`);
623
- }
624
- }
625
-
626
- const newListBlock = annotatedLines.join('\n') + '\n';
627
- const newPhaseSection = phaseSection.replace(
628
- plansBlockMatch[0],
629
- plansHeader + newListBlock
630
- );
631
-
632
- const nextContent = content.slice(0, phaseStart) + newPhaseSection + content.slice(phaseEnd);
633
- if (nextContent === content) return;
634
- platformWriteSync(roadmapPath, nextContent);
635
- updated = true;
636
- });
637
-
638
- output({
639
- updated,
640
- phase: phaseNum,
641
- waves: waves.length,
642
- cross_cutting_constraints: crossCuttingTruths.length,
643
- }, raw, updated ? `annotated ${waves.length} wave(s), ${crossCuttingTruths.length} constraint(s)` : 'skipped (already annotated or no plan list)');
644
- }
645
-
646
- module.exports = {
647
- cmdRoadmapGetPhase,
648
- cmdRoadmapAnalyze,
649
- cmdRoadmapUpdatePlanProgress,
650
- cmdRoadmapAnnotateDependencies,
651
- };