@opengsd/gsd-core 1.15.0 → 1.16.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 (487) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.opencode/plugins/gsd-core.js +85 -5
  4. package/agents/gsd-code-fixer.compact.md +1 -1
  5. package/agents/gsd-code-fixer.md +1 -1
  6. package/agents/gsd-code-reviewer.compact.md +5 -3
  7. package/agents/gsd-code-reviewer.md +8 -6
  8. package/agents/gsd-debug-session-manager.compact.md +1 -1
  9. package/agents/gsd-debug-session-manager.md +1 -1
  10. package/agents/gsd-debugger.md +2 -2
  11. package/agents/gsd-eval-auditor.compact.md +1 -1
  12. package/agents/gsd-eval-auditor.md +1 -1
  13. package/agents/gsd-executor.md +4 -4
  14. package/agents/gsd-intel-updater.compact.md +1 -1
  15. package/agents/gsd-intel-updater.md +1 -1
  16. package/agents/gsd-mempalace-curator.md +2 -2
  17. package/agents/gsd-phase-researcher.md +1 -1
  18. package/agents/gsd-plan-checker.md +7 -2
  19. package/agents/gsd-planner.md +3 -3
  20. package/agents/gsd-project-researcher.compact.md +1 -1
  21. package/agents/gsd-project-researcher.md +1 -1
  22. package/agents/gsd-research-synthesizer.compact.md +1 -1
  23. package/agents/gsd-research-synthesizer.md +1 -1
  24. package/agents/gsd-ui-auditor.compact.md +21 -30
  25. package/agents/gsd-ui-auditor.md +42 -51
  26. package/agents/gsd-ui-researcher.compact.md +1 -1
  27. package/agents/gsd-ui-researcher.md +1 -1
  28. package/agents/gsd-verifier.md +31 -9
  29. package/bin/install.js +126 -196
  30. package/commands/gsd/add-tests.md +6 -1
  31. package/commands/gsd/ai-integration-phase.md +6 -1
  32. package/commands/gsd/audit-fix.md +5 -0
  33. package/commands/gsd/audit-milestone.md +6 -1
  34. package/commands/gsd/autonomous.md +5 -0
  35. package/commands/gsd/capture.md +8 -4
  36. package/commands/gsd/code-review.md +7 -2
  37. package/commands/gsd/complete-milestone.md +4 -0
  38. package/commands/gsd/config.md +7 -3
  39. package/commands/gsd/debug.md +11 -7
  40. package/commands/gsd/discuss-phase.md +7 -3
  41. package/commands/gsd/docs-update.md +12 -7
  42. package/commands/gsd/eval-review.md +6 -1
  43. package/commands/gsd/execute-phase.md +12 -7
  44. package/commands/gsd/extract-learnings.md +5 -0
  45. package/commands/gsd/fast.md +4 -0
  46. package/commands/gsd/forensics.md +5 -1
  47. package/commands/gsd/graphify.md +10 -6
  48. package/commands/gsd/health.md +5 -0
  49. package/commands/gsd/help.md +7 -2
  50. package/commands/gsd/import.md +7 -3
  51. package/commands/gsd/inbox.md +5 -0
  52. package/commands/gsd/ingest-docs.md +5 -1
  53. package/commands/gsd/manager.md +6 -1
  54. package/commands/gsd/map-codebase.md +7 -3
  55. package/commands/gsd/mempalace-capture.md +5 -1
  56. package/commands/gsd/mempalace-recall.md +5 -1
  57. package/commands/gsd/milestone-summary.md +5 -1
  58. package/commands/gsd/mvp-phase.md +8 -3
  59. package/commands/gsd/new-milestone.md +6 -1
  60. package/commands/gsd/new-project.md +5 -0
  61. package/commands/gsd/next.md +6 -1
  62. package/commands/gsd/ns-context.md +4 -0
  63. package/commands/gsd/ns-ideate.md +4 -0
  64. package/commands/gsd/ns-manage.md +4 -0
  65. package/commands/gsd/ns-project.md +4 -0
  66. package/commands/gsd/ns-review.md +4 -0
  67. package/commands/gsd/ns-workflow.md +4 -0
  68. package/commands/gsd/onboard.md +6 -1
  69. package/commands/gsd/pause-work.md +5 -1
  70. package/commands/gsd/phase.md +8 -4
  71. package/commands/gsd/plan-phase.md +6 -1
  72. package/commands/gsd/plan-review-convergence.md +5 -1
  73. package/commands/gsd/pr-branch.md +4 -0
  74. package/commands/gsd/profile-user.md +5 -1
  75. package/commands/gsd/progress.md +6 -1
  76. package/commands/gsd/quick-batch.md +20 -8
  77. package/commands/gsd/quick.md +12 -7
  78. package/commands/gsd/review.md +5 -1
  79. package/commands/gsd/secure-phase.md +6 -1
  80. package/commands/gsd/ship.md +5 -0
  81. package/commands/gsd/sketch.md +7 -2
  82. package/commands/gsd/spec-phase.md +5 -1
  83. package/commands/gsd/spike.md +8 -3
  84. package/commands/gsd/surface.md +5 -1
  85. package/commands/gsd/thread.md +4 -0
  86. package/commands/gsd/ui-phase.md +6 -1
  87. package/commands/gsd/ui-review.md +6 -1
  88. package/commands/gsd/ultraplan-phase.md +5 -1
  89. package/commands/gsd/undo.md +5 -1
  90. package/commands/gsd/update.md +6 -2
  91. package/commands/gsd/validate-phase.md +6 -1
  92. package/commands/gsd/verify-work.md +6 -1
  93. package/commands/gsd/workspace.md +7 -3
  94. package/gsd-core/bin/gsd-tools.cjs +142 -56
  95. package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
  96. package/gsd-core/bin/lib/agent-install-check.cjs +4 -1
  97. package/gsd-core/bin/lib/audit.cjs +78 -44
  98. package/gsd-core/bin/lib/broken-windows.cjs +13 -13
  99. package/gsd-core/bin/lib/capability-activation.cjs +9 -4
  100. package/gsd-core/bin/lib/capability-registry.cjs +183 -103
  101. package/gsd-core/bin/lib/capability-validator.cjs +16 -0
  102. package/gsd-core/bin/lib/check-auto-mode.cjs +35 -0
  103. package/gsd-core/bin/lib/check-command-router.cjs +164 -1712
  104. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +13 -2
  105. package/gsd-core/bin/lib/cli-exit.cjs +12 -0
  106. package/gsd-core/bin/lib/codex-agent-toml.cjs +11 -8
  107. package/gsd-core/bin/lib/command-aliases.cjs +7 -0
  108. package/gsd-core/bin/lib/command-routing-hub.cjs +48 -1
  109. package/gsd-core/bin/lib/commands.cjs +173 -170
  110. package/gsd-core/bin/lib/complexity-trigger.cjs +8 -7
  111. package/gsd-core/bin/lib/config.cjs +43 -12
  112. package/gsd-core/bin/lib/core-utils.cjs +6 -1
  113. package/gsd-core/bin/lib/coverage.cjs +4 -8
  114. package/gsd-core/bin/lib/decision-coverage-support.cjs +259 -0
  115. package/gsd-core/bin/lib/drift.cjs +177 -42
  116. package/gsd-core/bin/lib/frontmatter-fence.cjs +90 -0
  117. package/gsd-core/bin/lib/frontmatter-splice.cjs +494 -0
  118. package/gsd-core/bin/lib/frontmatter.cjs +413 -234
  119. package/gsd-core/bin/lib/gap-checker.cjs +72 -29
  120. package/gsd-core/bin/lib/gate-api-coverage-verify-pre.cjs +381 -0
  121. package/gsd-core/bin/lib/gate-args.cjs +53 -0
  122. package/gsd-core/bin/lib/gate-codebase-drift.cjs +285 -0
  123. package/gsd-core/bin/lib/gate-config.cjs +46 -0
  124. package/gsd-core/bin/lib/gate-context-drift.cjs +141 -0
  125. package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +169 -0
  126. package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +126 -0
  127. package/gsd-core/bin/lib/gate-evaluation-scope.cjs +555 -0
  128. package/gsd-core/bin/lib/gate-evidence.cjs +138 -0
  129. package/gsd-core/bin/lib/gate-exit.cjs +27 -0
  130. package/gsd-core/bin/lib/gate-gap-analysis-plan-post.cjs +61 -0
  131. package/gsd-core/bin/lib/gate-phase-context.cjs +170 -0
  132. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +1 -1
  133. package/gsd-core/bin/lib/gate-predicate.cjs +165 -0
  134. package/gsd-core/bin/lib/gate-prohibition-enforcement.cjs +94 -0
  135. package/gsd-core/bin/lib/gate-schema-drift.cjs +165 -0
  136. package/gsd-core/bin/lib/gate-tdd-red-evidence.cjs +100 -0
  137. package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +182 -0
  138. package/gsd-core/bin/lib/gate-ui-plan.cjs +86 -0
  139. package/gsd-core/bin/lib/gate-ui-safety.cjs +80 -0
  140. package/gsd-core/bin/lib/gate-verdict.cjs +64 -0
  141. package/gsd-core/bin/lib/gate-verify-command-paths.cjs +78 -0
  142. package/gsd-core/bin/lib/gate-verify-failure-directions.cjs +41 -0
  143. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +43 -47
  144. package/gsd-core/bin/lib/health-diagnostic.cjs +45 -8
  145. package/gsd-core/bin/lib/init.cjs +162 -96
  146. package/gsd-core/bin/lib/install-engine.cjs +19 -35
  147. package/gsd-core/bin/lib/install-profiles.cjs +7 -4
  148. package/gsd-core/bin/lib/io.cjs +122 -3
  149. package/gsd-core/bin/lib/loop-resolver.cjs +95 -0
  150. package/gsd-core/bin/lib/markdown-sectionizer.cjs +75 -1
  151. package/gsd-core/bin/lib/milestone.cjs +19 -1
  152. package/gsd-core/bin/lib/model-resolver.cjs +18 -18
  153. package/gsd-core/bin/lib/observability/event.cjs +1 -1
  154. package/gsd-core/bin/lib/observability/logger.cjs +46 -1
  155. package/gsd-core/bin/lib/pattern.cjs +10 -0
  156. package/gsd-core/bin/lib/phase-command-router.cjs +11 -4
  157. package/gsd-core/bin/lib/phase-estimation.cjs +5 -4
  158. package/gsd-core/bin/lib/phase-id.cjs +1 -1
  159. package/gsd-core/bin/lib/phase-lifecycle.cjs +9 -2
  160. package/gsd-core/bin/lib/phase-status.cjs +360 -0
  161. package/gsd-core/bin/lib/phase.cjs +280 -80
  162. package/gsd-core/bin/lib/plan-document.cjs +93 -19
  163. package/gsd-core/bin/lib/plan-drift-guard.cjs +5 -0
  164. package/gsd-core/bin/lib/planning-document.cjs +273 -40
  165. package/gsd-core/bin/lib/planning-inspect.cjs +42 -8
  166. package/gsd-core/bin/lib/planning-snapshot.cjs +18 -0
  167. package/gsd-core/bin/lib/planning-workspace.cjs +76 -53
  168. package/gsd-core/bin/lib/pristine-baseline.cjs +10 -0
  169. package/gsd-core/bin/lib/profile-output.cjs +6 -3
  170. package/gsd-core/bin/lib/prohibition-enforcement.cjs +0 -55
  171. package/gsd-core/bin/lib/quick-batch-command-router.cjs +35 -9
  172. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +11 -8
  173. package/gsd-core/bin/lib/real-home-guard.cjs +9 -1
  174. package/gsd-core/bin/lib/report-parser.cjs +269 -0
  175. package/gsd-core/bin/lib/roadmap-command-router.cjs +13 -15
  176. package/gsd-core/bin/lib/roadmap-parser.cjs +82 -15
  177. package/gsd-core/bin/lib/roadmap-upgrade.cjs +127 -65
  178. package/gsd-core/bin/lib/roadmap.cjs +169 -72
  179. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +91 -157
  180. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +2 -1
  181. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +57 -1
  182. package/gsd-core/bin/lib/runtime-homes.cjs +13 -10
  183. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +307 -591
  184. package/gsd-core/bin/lib/runtime-name-policy.cjs +142 -27
  185. package/gsd-core/bin/lib/runtime-slash.cjs +47 -30
  186. package/gsd-core/bin/lib/shell-command-projection.cjs +37 -2
  187. package/gsd-core/bin/lib/smart-entry.cjs +19 -3
  188. package/gsd-core/bin/lib/stale-bake-guard.cjs +32 -48
  189. package/gsd-core/bin/lib/state-contract.cjs +15 -18
  190. package/gsd-core/bin/lib/state-document.cjs +100 -22
  191. package/gsd-core/bin/lib/state.cjs +214 -105
  192. package/gsd-core/bin/lib/surface.cjs +2 -1
  193. package/gsd-core/bin/lib/tdd-red-evidence.cjs +48 -152
  194. package/gsd-core/bin/lib/uat-predicate.cjs +313 -35
  195. package/gsd-core/bin/lib/uat.cjs +424 -7
  196. package/gsd-core/bin/lib/ui-frontend-evidence.cjs +94 -58
  197. package/gsd-core/bin/lib/vendor/README.md +31 -9
  198. package/gsd-core/bin/lib/vendor/saxes.cjs +1934 -0
  199. package/gsd-core/bin/lib/vendor/saxes.cjs.LICENSE.txt +92 -0
  200. package/gsd-core/bin/lib/vendor/tap-parser.cjs +8927 -0
  201. package/gsd-core/bin/lib/vendor/tap-parser.cjs.LICENSE.txt +152 -0
  202. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  203. package/gsd-core/bin/lib/verification.cjs +1165 -314
  204. package/gsd-core/bin/lib/verify-command-router.cjs +18 -7
  205. package/gsd-core/bin/lib/verify.cjs +286 -567
  206. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +14 -6
  207. package/gsd-core/bin/lib/workstream-inventory.cjs +31 -21
  208. package/gsd-core/bin/lib/workstream-name-policy.cjs +31 -1
  209. package/gsd-core/bin/lib/workstream.cjs +11 -2
  210. package/gsd-core/bin/shared/config-defaults.manifest.json +5 -0
  211. package/gsd-core/bin/shared/config-schema.manifest.json +4 -0
  212. package/gsd-core/references/autonomous-smart-discuss.md +2 -1
  213. package/gsd-core/references/autonomous-ui-design-contract.md +3 -3
  214. package/gsd-core/references/execute-mvp-tdd.md +5 -10
  215. package/gsd-core/references/execute-phase-between-wave-reset.md +3 -0
  216. package/gsd-core/references/execute-phase-response-language.md +1 -1
  217. package/gsd-core/references/gsd-run-resolver.md +1 -1
  218. package/gsd-core/references/loop-hook-dispatch.md +7 -1
  219. package/gsd-core/references/offer-next.md +1 -1
  220. package/gsd-core/references/planning-config.md +1 -1
  221. package/gsd-core/references/spidr-splitting.md +1 -1
  222. package/gsd-core/references/tdd.md +10 -4
  223. package/gsd-core/references/verifier-phase-gates.md +5 -2
  224. package/gsd-core/references/verify-mvp-mode.md +2 -2
  225. package/gsd-core/references/workstream-flag.md +33 -3
  226. package/gsd-core/templates/README.md +1 -1
  227. package/gsd-core/templates/UAT.md +17 -1
  228. package/gsd-core/templates/config.json +2 -11
  229. package/gsd-core/templates/verification-report.md +1 -1
  230. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  231. package/gsd-core/workflows/add-backlog.md +1 -1
  232. package/gsd-core/workflows/add-phase.md +8 -7
  233. package/gsd-core/workflows/add-tests.md +3 -2
  234. package/gsd-core/workflows/add-todo.md +4 -3
  235. package/gsd-core/workflows/ai-integration-phase.md +3 -2
  236. package/gsd-core/workflows/audit-fix.md +1 -1
  237. package/gsd-core/workflows/audit-milestone.md +4 -3
  238. package/gsd-core/workflows/audit-uat.md +1 -1
  239. package/gsd-core/workflows/autonomous.md +28 -18
  240. package/gsd-core/workflows/check-todos.md +6 -5
  241. package/gsd-core/workflows/cleanup.md +1 -1
  242. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +20 -13
  243. package/gsd-core/workflows/code-review-fix.md +5 -4
  244. package/gsd-core/workflows/code-review.md +84 -90
  245. package/gsd-core/workflows/complete-milestone/detail/elaboration.md +4 -3
  246. package/gsd-core/workflows/complete-milestone.md +12 -7
  247. package/gsd-core/workflows/debug.md +30 -5
  248. package/gsd-core/workflows/diagnose-issues.md +3 -2
  249. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  250. package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
  251. package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
  252. package/gsd-core/workflows/discuss-phase.md +4 -3
  253. package/gsd-core/workflows/do.md +1 -1
  254. package/gsd-core/workflows/docs-update.md +4 -3
  255. package/gsd-core/workflows/edit-phase.md +4 -3
  256. package/gsd-core/workflows/eval-review.md +5 -3
  257. package/gsd-core/workflows/execute-phase/detail/elaboration.md +1 -1
  258. package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +4 -2
  259. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +15 -4
  260. package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +10 -7
  261. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +1 -1
  262. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +3 -1
  263. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +2 -2
  264. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  265. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
  266. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  267. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
  268. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
  269. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +2 -0
  270. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
  271. package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +187 -0
  272. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +2 -3
  273. package/gsd-core/workflows/execute-phase.md +78 -170
  274. package/gsd-core/workflows/execute-plan.md +13 -19
  275. package/gsd-core/workflows/explore.md +2 -2
  276. package/gsd-core/workflows/extract-learnings.md +3 -2
  277. package/gsd-core/workflows/fast.md +1 -1
  278. package/gsd-core/workflows/forensics.md +1 -1
  279. package/gsd-core/workflows/graduation.md +1 -1
  280. package/gsd-core/workflows/health.md +2 -1
  281. package/gsd-core/workflows/import.md +3 -2
  282. package/gsd-core/workflows/inbox.md +1 -1
  283. package/gsd-core/workflows/ingest-docs.md +1 -1
  284. package/gsd-core/workflows/insert-phase.md +4 -3
  285. package/gsd-core/workflows/list-seeds.md +1 -1
  286. package/gsd-core/workflows/list-workspaces.md +1 -1
  287. package/gsd-core/workflows/manager.md +5 -3
  288. package/gsd-core/workflows/map-codebase.md +4 -3
  289. package/gsd-core/workflows/milestone-summary.md +3 -2
  290. package/gsd-core/workflows/mvp-phase.md +14 -14
  291. package/gsd-core/workflows/new-milestone.md +10 -10
  292. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
  293. package/gsd-core/workflows/new-project.md +1 -1
  294. package/gsd-core/workflows/new-workspace.md +1 -1
  295. package/gsd-core/workflows/next.md +1 -1
  296. package/gsd-core/workflows/pause-work.md +2 -2
  297. package/gsd-core/workflows/plan-phase/detail/elaboration.md +1 -1
  298. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +1 -1
  299. package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +1 -1
  300. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
  301. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +1 -1
  302. package/gsd-core/workflows/plan-phase.md +27 -18
  303. package/gsd-core/workflows/plan-review-convergence.md +1 -1
  304. package/gsd-core/workflows/plant-seed.md +1 -1
  305. package/gsd-core/workflows/pr-branch.md +1 -1
  306. package/gsd-core/workflows/profile-user.md +1 -1
  307. package/gsd-core/workflows/progress.md +19 -49
  308. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +4 -2
  309. package/gsd-core/workflows/quick/steps/quick-verification.md +4 -4
  310. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +30 -11
  311. package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
  312. package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
  313. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
  314. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
  315. package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
  316. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
  317. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +9 -3
  318. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
  319. package/gsd-core/workflows/quick-batch.md +15 -10
  320. package/gsd-core/workflows/quick.md +42 -31
  321. package/gsd-core/workflows/remove-phase.md +3 -2
  322. package/gsd-core/workflows/remove-workspace.md +1 -1
  323. package/gsd-core/workflows/resume-project.md +3 -2
  324. package/gsd-core/workflows/review.md +3 -2
  325. package/gsd-core/workflows/scan.md +3 -2
  326. package/gsd-core/workflows/secure-phase.md +11 -12
  327. package/gsd-core/workflows/settings-advanced.md +1 -1
  328. package/gsd-core/workflows/settings-integrations.md +1 -1
  329. package/gsd-core/workflows/settings.md +1 -1
  330. package/gsd-core/workflows/ship.md +12 -12
  331. package/gsd-core/workflows/sketch-wrap-up.md +1 -1
  332. package/gsd-core/workflows/sketch.md +1 -1
  333. package/gsd-core/workflows/smart-entry.md +1 -1
  334. package/gsd-core/workflows/spec-phase.md +1 -1
  335. package/gsd-core/workflows/spike-wrap-up.md +1 -1
  336. package/gsd-core/workflows/spike.md +1 -1
  337. package/gsd-core/workflows/stats.md +1 -1
  338. package/gsd-core/workflows/sync-skills.md +1 -1
  339. package/gsd-core/workflows/thread.md +2 -2
  340. package/gsd-core/workflows/transition.md +13 -23
  341. package/gsd-core/workflows/ui-phase.md +5 -4
  342. package/gsd-core/workflows/ui-review.md +4 -3
  343. package/gsd-core/workflows/ultraplan-phase.md +3 -2
  344. package/gsd-core/workflows/undo.md +1 -1
  345. package/gsd-core/workflows/validate-phase.md +10 -12
  346. package/gsd-core/workflows/verify-work/detail/elaboration.md +43 -3
  347. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
  348. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -3
  349. package/gsd-core/workflows/verify-work.md +68 -59
  350. package/hooks/dist/gsd-agent-isolation-guard.js +8 -0
  351. package/hooks/dist/gsd-check-update-worker.js +8 -0
  352. package/hooks/dist/gsd-check-update.js +8 -0
  353. package/hooks/dist/gsd-context-monitor.js +31 -8
  354. package/hooks/dist/gsd-cursor-subagent-start.js +8 -0
  355. package/hooks/dist/gsd-secret-read-guard.js +147 -16
  356. package/hooks/dist/gsd-statusline.js +15 -7
  357. package/hooks/dist/gsd-update-banner.js +8 -0
  358. package/hooks/dist/gsd-windsurf-pre-write.js +11 -2
  359. package/hooks/dist/gsd-workflow-guard.js +5 -4
  360. package/hooks/dist/gsd-worktree-path-guard.js +6 -2
  361. package/hooks/dist/lib/cli-exit.js +12 -0
  362. package/hooks/dist/lib/git-probe.js +17 -1
  363. package/hooks/dist/lib/isolation-sentinel.js +2 -2
  364. package/hooks/gsd-agent-isolation-guard.js +8 -0
  365. package/hooks/gsd-check-update-worker.js +8 -0
  366. package/hooks/gsd-check-update.js +8 -0
  367. package/hooks/gsd-context-monitor.js +31 -8
  368. package/hooks/gsd-cursor-subagent-start.js +8 -0
  369. package/hooks/gsd-secret-read-guard.js +147 -16
  370. package/hooks/gsd-statusline.js +15 -7
  371. package/hooks/gsd-update-banner.js +8 -0
  372. package/hooks/gsd-windsurf-pre-write.js +11 -2
  373. package/hooks/gsd-workflow-guard.js +5 -4
  374. package/hooks/gsd-worktree-path-guard.js +6 -2
  375. package/hooks/hooks.json +5 -5
  376. package/hooks/lib/cli-exit.js +12 -0
  377. package/hooks/lib/git-probe.js +17 -1
  378. package/hooks/lib/isolation-sentinel.js +2 -2
  379. package/package.json +21 -4
  380. package/scripts/changeset/parse.cjs +52 -4
  381. package/scripts/ci-timeout-report.cjs +770 -4
  382. package/scripts/command-contract-helpers.cjs +12 -8
  383. package/scripts/docs-guard-registry.cjs +6 -0
  384. package/scripts/gen-features.cjs +13 -8
  385. package/scripts/gen-hooks-cli-exit.cjs +12 -28
  386. package/scripts/gen-loop-host-contract.cjs +10 -1
  387. package/scripts/gen-platform-conformance-tier.cjs +187 -1
  388. package/scripts/gen-plugin-skills.cjs +87 -1
  389. package/scripts/gen-research-agents.cjs +24 -31
  390. package/scripts/gen-scripts-cli-exit.cjs +30 -3
  391. package/scripts/gen-test-timings.cjs +32 -7
  392. package/scripts/lib/cli-exit.cjs +12 -0
  393. package/scripts/lib/macos-conformance-tier.generated.cjs +20 -2
  394. package/scripts/lib/ndjson-reporter.cjs +28 -3
  395. package/scripts/lib/platform-conformance-tier.generated.cjs +34 -5
  396. package/scripts/lib/registration-ledger-preload.cjs +155 -0
  397. package/scripts/lib/vendor-bundle.cjs +59 -0
  398. package/scripts/lib/vendor-licenses/saxes-6.0.0.txt +64 -0
  399. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
  400. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  401. package/scripts/lint-completion-predicate-drift.cjs +18 -19
  402. package/scripts/lint-descriptions.cjs +7 -3
  403. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +10 -0
  404. package/scripts/lint-eslint-glob-coverage.allowlist.json +20 -0
  405. package/scripts/lint-frontmatter-fence-drift.cjs +313 -0
  406. package/scripts/lint-frontmatter-scalar-broad-grep.cjs +122 -16
  407. package/scripts/lint-phase-enumeration-drift.cjs +12 -8
  408. package/scripts/lint-phase-id-drift.cjs +29 -0
  409. package/scripts/lint-planning-document-positive-control.cjs +329 -0
  410. package/scripts/lint-response-language-coverage.cjs +3 -0
  411. package/scripts/lint-skill-deps.cjs +7 -3
  412. package/scripts/lint-test-file-count.allowlist.json +11 -1
  413. package/scripts/lint-test-file-count.cjs +34 -1
  414. package/scripts/lint-vendored-deps.cjs +41 -5
  415. package/scripts/lint-workflow-shellcheck-baseline.json +10 -10
  416. package/scripts/mutation-matrix.cjs +50 -5
  417. package/scripts/require-issue-link-policy.cjs +6 -2
  418. package/scripts/sync-runtime-launcher.cjs +184 -2
  419. package/scripts/verify-npm-publish.cjs +76 -20
  420. package/skills/gsd-add-tests/SKILL.md +6 -1
  421. package/skills/gsd-ai-integration-phase/SKILL.md +6 -1
  422. package/skills/gsd-audit-fix/SKILL.md +5 -0
  423. package/skills/gsd-audit-milestone/SKILL.md +6 -1
  424. package/skills/gsd-autonomous/SKILL.md +5 -0
  425. package/skills/gsd-capture/SKILL.md +8 -4
  426. package/skills/gsd-code-review/SKILL.md +7 -2
  427. package/skills/gsd-complete-milestone/SKILL.md +4 -0
  428. package/skills/gsd-config/SKILL.md +8 -4
  429. package/skills/gsd-debug/SKILL.md +11 -7
  430. package/skills/gsd-discuss-phase/SKILL.md +7 -3
  431. package/skills/gsd-docs-update/SKILL.md +12 -7
  432. package/skills/gsd-eval-review/SKILL.md +6 -1
  433. package/skills/gsd-execute-phase/SKILL.md +12 -7
  434. package/skills/gsd-extract-learnings/SKILL.md +5 -0
  435. package/skills/gsd-fast/SKILL.md +4 -0
  436. package/skills/gsd-forensics/SKILL.md +5 -1
  437. package/skills/gsd-graphify/SKILL.md +10 -6
  438. package/skills/gsd-health/SKILL.md +5 -0
  439. package/skills/gsd-help/SKILL.md +7 -2
  440. package/skills/gsd-import/SKILL.md +7 -3
  441. package/skills/gsd-inbox/SKILL.md +5 -0
  442. package/skills/gsd-ingest-docs/SKILL.md +5 -1
  443. package/skills/gsd-manager/SKILL.md +6 -1
  444. package/skills/gsd-map-codebase/SKILL.md +7 -3
  445. package/skills/gsd-mempalace-capture/SKILL.md +5 -1
  446. package/skills/gsd-mempalace-recall/SKILL.md +5 -1
  447. package/skills/gsd-milestone-summary/SKILL.md +5 -1
  448. package/skills/gsd-mvp-phase/SKILL.md +8 -3
  449. package/skills/gsd-new-milestone/SKILL.md +6 -1
  450. package/skills/gsd-new-project/SKILL.md +5 -0
  451. package/skills/gsd-next/SKILL.md +6 -1
  452. package/skills/gsd-ns-context/SKILL.md +4 -0
  453. package/skills/gsd-ns-ideate/SKILL.md +4 -0
  454. package/skills/gsd-ns-manage/SKILL.md +4 -0
  455. package/skills/gsd-ns-project/SKILL.md +4 -0
  456. package/skills/gsd-ns-review/SKILL.md +4 -0
  457. package/skills/gsd-ns-workflow/SKILL.md +4 -0
  458. package/skills/gsd-onboard/SKILL.md +6 -1
  459. package/skills/gsd-pause-work/SKILL.md +5 -1
  460. package/skills/gsd-phase/SKILL.md +8 -4
  461. package/skills/gsd-plan-phase/SKILL.md +6 -1
  462. package/skills/gsd-plan-review-convergence/SKILL.md +5 -1
  463. package/skills/gsd-pr-branch/SKILL.md +4 -0
  464. package/skills/gsd-profile-user/SKILL.md +5 -1
  465. package/skills/gsd-progress/SKILL.md +6 -1
  466. package/skills/gsd-quick/SKILL.md +16 -10
  467. package/skills/gsd-quick-batch/SKILL.md +20 -8
  468. package/skills/gsd-review/SKILL.md +5 -1
  469. package/skills/gsd-review-backlog/SKILL.md +3 -2
  470. package/skills/gsd-secure-phase/SKILL.md +6 -1
  471. package/skills/gsd-ship/SKILL.md +5 -0
  472. package/skills/gsd-sketch/SKILL.md +7 -2
  473. package/skills/gsd-spec-phase/SKILL.md +5 -1
  474. package/skills/gsd-spike/SKILL.md +8 -3
  475. package/skills/gsd-surface/SKILL.md +5 -1
  476. package/skills/gsd-thread/SKILL.md +4 -0
  477. package/skills/gsd-ui-phase/SKILL.md +6 -1
  478. package/skills/gsd-ui-review/SKILL.md +6 -1
  479. package/skills/gsd-ultraplan-phase/SKILL.md +5 -1
  480. package/skills/gsd-undo/SKILL.md +5 -1
  481. package/skills/gsd-update/SKILL.md +6 -2
  482. package/skills/gsd-validate-phase/SKILL.md +6 -1
  483. package/skills/gsd-verify-work/SKILL.md +6 -1
  484. package/skills/gsd-workspace/SKILL.md +7 -3
  485. package/skills/gsd-workstreams/SKILL.md +6 -6
  486. package/vscode/package.json +1 -1
  487. package/gsd-core/workflows/execute-phase/steps/stale-reverification.md +0 -24
@@ -7,7 +7,7 @@
7
7
  * word boundary, so a phase section naming the repo `dashboard-financeiro` matches
8
8
  * the token `dashboard` exactly like the real UI compound `micro-frontend` does.
9
9
  * That boundary rule is intentional (#3718) and must not be weakened — instead,
10
- * the plan gate (`computeUiPlanGate` in check-command-router.cjs) corroborates the
10
+ * the plan gate (`computeUiPlanGate` in gate-ui-plan.cjs) corroborates the
11
11
  * token match against the static repo tree before blocking.
12
12
  *
13
13
  * This mirrors what the sibling post-wave gate (`computeUiSafetyGate`) already
@@ -19,7 +19,7 @@
19
19
  * of file layout;
20
20
  * (b) any `*.tsx` / `*.jsx` / `*.vue` / `*.svelte` file in the tree — the
21
21
  * component-framework subset of `UI_FILE_EXTENSIONS_RE`
22
- * (check-command-router.cjs). The weaker members of that list (css, scss,
22
+ * (gate-ui-safety.cjs). The weaker members of that list (css, scss,
23
23
  * html, ...) are deliberately NOT static evidence: docs sites and
24
24
  * markdown/bash/config repos routinely carry stray `.html`/`.css`, which
25
25
  * is precisely the false-positive class #3312 reports.
@@ -37,16 +37,22 @@
37
37
  * (imports are case-sensitive in all four ecosystems); extension
38
38
  * matching is case-insensitive, mirroring `UI_COMPONENT_FILE_RE`.
39
39
  *
40
- * All I/O failures degrade to `false` (no evidence) — never throw.
40
+ * #5170 (ADR-5057 §4): the detector reads typed evidence. An affirmative finding is
41
+ * `found`; a walk that completed without one is `none`; a `package.json` that exists but cannot be
42
+ * read or parsed, a directory that cannot be listed or a native source file that cannot be opened
43
+ * is `unreadable` WHEN no affirmative evidence was found — the gate that consumes this must not
44
+ * certify "no frontend" over a tree it could not look at. Never throws.
41
45
  */
42
46
  var __importDefault = (this && this.__importDefault) || function (mod) {
43
47
  return (mod && mod.__esModule) ? mod : { "default": mod };
44
48
  };
45
49
  Object.defineProperty(exports, "__esModule", { value: true });
46
50
  exports.NATIVE_UI_CONTENT_MARKERS = exports.NATIVE_UI_XAML_RE = exports.NATIVE_UI_SOURCE_RE = exports.UI_COMPONENT_FILE_RE = void 0;
51
+ exports.readStaticFrontendEvidence = readStaticFrontendEvidence;
47
52
  exports.hasStaticFrontendEvidence = hasStaticFrontendEvidence;
48
53
  const node_fs_1 = __importDefault(require("node:fs"));
49
54
  const node_path_1 = __importDefault(require("node:path"));
55
+ const gate_evidence_cjs_1 = require("./gate-evidence.cjs");
50
56
  /** Component-framework file extensions — the static-evidence subset of UI_FILE_EXTENSIONS_RE. */
51
57
  exports.UI_COMPONENT_FILE_RE = /\.(tsx|jsx|vue|svelte)$/i;
52
58
  /** Native UI source files whose CONTENT is scanned for an import marker (#4658). */
@@ -111,23 +117,23 @@ const SKIP_DIRS = new Set([
111
117
  ]);
112
118
  /** Walk safety cap — beyond this the tree is treated as scanned (evidence decided by then). */
113
119
  const MAX_WALK_ENTRIES = 10_000;
114
- function packageJsonHasUiFramework(projectDir) {
115
- let raw;
116
- try {
117
- raw = node_fs_1.default.readFileSync(node_path_1.default.join(projectDir, 'package.json'), 'utf8');
118
- }
119
- catch {
120
- return false; // no/unreadable package.json → no evidence from this signal
121
- }
120
+ /** The first read failure of the package.json signal: `unreadable`, or `none` (absent), or `found`. */
121
+ function packageJsonEvidence(projectDir) {
122
+ const read = (0, gate_evidence_cjs_1.readTextEvidence)(node_path_1.default.join(projectDir, 'package.json'));
123
+ if (read.kind === 'none')
124
+ return (0, gate_evidence_cjs_1.evidenceNone)();
125
+ if (read.kind === 'unreadable')
126
+ return (0, gate_evidence_cjs_1.evidenceUnreadable)(read.reason, read.span);
122
127
  let parsed;
123
128
  try {
124
- parsed = JSON.parse(raw);
129
+ parsed = JSON.parse(read.value);
125
130
  }
126
- catch {
127
- return false; // malformed package.json → no evidence from this signal
131
+ catch (err) {
132
+ // A package.json that exists but is not valid JSON could not be read: unreadable, not "no deps".
133
+ return (0, gate_evidence_cjs_1.evidenceFromError)(err, 'package.json');
128
134
  }
129
135
  if (parsed === null || typeof parsed !== 'object')
130
- return false;
136
+ return (0, gate_evidence_cjs_1.evidenceNone)();
131
137
  const pkg = parsed;
132
138
  for (const field of ['dependencies', 'devDependencies', 'peerDependencies']) {
133
139
  const deps = pkg[field];
@@ -135,79 +141,83 @@ function packageJsonHasUiFramework(projectDir) {
135
141
  continue;
136
142
  for (const name of Object.keys(deps)) {
137
143
  if (UI_FRAMEWORK_DEPS.has(name))
138
- return true;
144
+ return (0, gate_evidence_cjs_1.evidenceFound)(true);
139
145
  }
140
146
  }
141
- return false;
147
+ return (0, gate_evidence_cjs_1.evidenceNone)();
142
148
  }
143
149
  /**
144
150
  * Shared bounded BFS over the project tree — the single home of the walk
145
151
  * semantics both evidence walks depend on: SKIP_DIRS pruning, the
146
- * MAX_WALK_ENTRIES entry cap (cap-hit → `false`: the tree is treated as
152
+ * MAX_WALK_ENTRIES entry cap (cap-hit → not found: the tree is treated as
147
153
  * scanned and evidence stays undecided), symlinks never followed
148
- * (withFileTypes Dirents), unreadable directories skipped. `visit` is called
149
- * for every regular file with its name and full path; returning `true` stops
150
- * the walk with `true` (evidence found).
154
+ * (withFileTypes Dirents). `visit` is called for every regular file with its
155
+ * name, full path and a `note` for a read failure it met; returning `true`
156
+ * stops the walk with `found`. A directory that cannot be listed is NOT
157
+ * silently skipped: it is noted, the walk goes on, and the caller learns that
158
+ * part of the tree was never seen (an absent directory is just skipped).
151
159
  */
152
160
  function walkProjectFiles(projectDir, visit) {
161
+ let unreadable = null;
162
+ const note = (reason) => {
163
+ unreadable = unreadable ?? reason;
164
+ };
153
165
  const queue = [projectDir];
154
166
  let visited = 0;
155
167
  while (queue.length > 0 && visited < MAX_WALK_ENTRIES) {
156
168
  const dir = queue.shift();
157
- let entries;
158
- try {
159
- entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
160
- }
161
- catch {
162
- continue; // unreadable directory → skip it
169
+ const listing = (0, gate_evidence_cjs_1.readDirEntriesEvidence)(dir);
170
+ if (listing.kind === 'unreadable') {
171
+ note(listing.reason);
172
+ continue;
163
173
  }
164
- for (const entry of entries) {
174
+ if (listing.kind === 'none')
175
+ continue; // vanished since it was queued: nothing to see
176
+ for (const entry of listing.value) {
165
177
  visited++;
166
178
  if (visited >= MAX_WALK_ENTRIES)
167
- return false;
179
+ return { found: false, unreadable };
168
180
  if (entry.isDirectory()) {
169
181
  if (!SKIP_DIRS.has(entry.name))
170
182
  queue.push(node_path_1.default.join(dir, entry.name));
171
183
  }
172
- else if (entry.isFile() && visit(entry.name, node_path_1.default.join(dir, entry.name))) {
173
- return true;
184
+ else if (entry.isFile() && visit(entry.name, node_path_1.default.join(dir, entry.name), note)) {
185
+ return { found: true, unreadable };
174
186
  }
175
187
  }
176
188
  }
177
- return false;
189
+ return { found: false, unreadable };
178
190
  }
179
- function treeHasComponentFile(projectDir) {
191
+ function treeComponentFileEvidence(projectDir) {
180
192
  return walkProjectFiles(projectDir, (name) => exports.UI_COMPONENT_FILE_RE.test(name));
181
193
  }
182
194
  /**
183
- * Read at most the first 64 KiB of `file` and report whether any of `markers`
184
- * occurs in it (#4658). Import sections live at the top of a source file, so a
185
- * bounded prefix read keeps the gate's plan-time cost profile without reading
186
- * generated monsters in full. Any I/O failure degrades to false — never throw.
195
+ * Read at most the first 64 KiB of `file` as evidence (#4658). Import sections live at
196
+ * the top of a source file, so a bounded prefix read keeps the gate's plan-time cost
197
+ * profile without reading generated monsters in full.
187
198
  */
188
- function fileHasAnyMarker(file, markers) {
199
+ function readPrefixEvidence(file) {
189
200
  let fd;
190
201
  try {
191
202
  fd = node_fs_1.default.openSync(file, 'r');
192
203
  }
193
- catch {
194
- return false;
204
+ catch (err) {
205
+ return (0, gate_evidence_cjs_1.evidenceFromError)(err, file);
195
206
  }
196
207
  try {
197
208
  const bytes = Buffer.alloc(64 * 1024);
198
209
  const read = node_fs_1.default.readSync(fd, bytes, 0, bytes.length, 0);
199
- const prefix = bytes.toString('utf8', 0, read);
200
- return markers.some((m) => prefix.includes(m));
210
+ return (0, gate_evidence_cjs_1.evidenceFound)(bytes.toString('utf8', 0, read));
201
211
  }
202
- catch {
203
- return false;
212
+ catch (err) {
213
+ return (0, gate_evidence_cjs_1.evidenceFromError)(err, file);
204
214
  }
205
215
  finally {
206
216
  try {
207
217
  node_fs_1.default.closeSync(fd);
208
218
  }
209
219
  catch {
210
- // already closed — nothing to degrade
220
+ // already closed — the evidence was read (or its failure returned) above
211
221
  }
212
222
  }
213
223
  }
@@ -216,13 +226,20 @@ function fileHasAnyMarker(file, markers) {
216
226
  * extension alone; `.swift`/`.kt`/`.dart` are evidence only when the file's
217
227
  * content carries its ecosystem's import marker.
218
228
  */
219
- function treeHasNativeUiFile(projectDir) {
220
- return walkProjectFiles(projectDir, (name, fullPath) => {
229
+ function treeNativeUiEvidence(projectDir) {
230
+ return walkProjectFiles(projectDir, (name, fullPath, note) => {
221
231
  if (exports.NATIVE_UI_XAML_RE.test(name))
222
232
  return true;
223
233
  if (exports.NATIVE_UI_SOURCE_RE.test(name)) {
224
234
  const markers = exports.NATIVE_UI_CONTENT_MARKERS[node_path_1.default.extname(name).toLowerCase()];
225
- return markers != null && fileHasAnyMarker(fullPath, markers);
235
+ if (markers == null)
236
+ return false;
237
+ const prefix = readPrefixEvidence(fullPath);
238
+ if (prefix.kind === 'unreadable') {
239
+ note(prefix.reason);
240
+ return false;
241
+ }
242
+ return prefix.kind === 'found' && markers.some((m) => prefix.value.includes(m));
226
243
  }
227
244
  return false;
228
245
  });
@@ -231,18 +248,37 @@ function treeHasNativeUiFile(projectDir) {
231
248
  * Does the project tree carry static evidence of a frontend?
232
249
  *
233
250
  * @param projectDir - Absolute path to the project root (the gate's cwd).
234
- * @returns true when package.json declares a UI-framework dependency, the tree
251
+ * @returns `found` when package.json declares a UI-framework dependency, the tree
235
252
  * contains a component-framework file, or the tree contains native UI
236
253
  * evidence (a `.xaml` file, or a `.swift`/`.kt`/`.dart` file carrying
237
- * its ecosystem's UI import marker — #4658); false otherwise
238
- * (including on any I/O failure — evidence must be affirmative).
254
+ * its ecosystem's UI import marker — #4658); otherwise `unreadable` when
255
+ * any part of the tree or manifest could not be read (the absence of
256
+ * evidence is then not established), else `none`. Affirmative evidence
257
+ * always wins over a read failure elsewhere.
239
258
  */
240
- function hasStaticFrontendEvidence(projectDir) {
259
+ function readStaticFrontendEvidence(projectDir) {
241
260
  if (typeof projectDir !== 'string' || projectDir === '')
242
- return false;
243
- if (packageJsonHasUiFramework(projectDir))
244
- return true;
245
- if (treeHasComponentFile(projectDir))
246
- return true;
247
- return treeHasNativeUiFile(projectDir);
261
+ return (0, gate_evidence_cjs_1.evidenceNone)();
262
+ let unreadable = null;
263
+ const manifest = packageJsonEvidence(projectDir);
264
+ if (manifest.kind === 'found')
265
+ return manifest;
266
+ if (manifest.kind === 'unreadable')
267
+ unreadable = manifest.reason;
268
+ const components = treeComponentFileEvidence(projectDir);
269
+ if (components.found)
270
+ return (0, gate_evidence_cjs_1.evidenceFound)(true);
271
+ unreadable = unreadable ?? components.unreadable;
272
+ const native = treeNativeUiEvidence(projectDir);
273
+ if (native.found)
274
+ return (0, gate_evidence_cjs_1.evidenceFound)(true);
275
+ unreadable = unreadable ?? native.unreadable;
276
+ return unreadable === null ? (0, gate_evidence_cjs_1.evidenceNone)() : (0, gate_evidence_cjs_1.evidenceUnreadable)(unreadable, projectDir);
277
+ }
278
+ /**
279
+ * The boolean projection of {@link readStaticFrontendEvidence}: true only on affirmative evidence. It
280
+ * reads nothing itself; a gate that must tell "no frontend" from "could not look" uses the evidence.
281
+ */
282
+ function hasStaticFrontendEvidence(projectDir) {
283
+ return readStaticFrontendEvidence(projectDir).kind === 'found';
248
284
  }
@@ -1,7 +1,7 @@
1
1
  # vendor/
2
2
 
3
- This directory holds **verbatim, unmodified** copies of third-party build
4
- artifacts that `gsd-core/bin/**` needs at runtime.
3
+ This directory holds third-party artifacts that `gsd-core/bin/**` needs at
4
+ runtime: verbatim upstream builds or reproducible bundles of unmodified upstream code.
5
5
 
6
6
  ## Why
7
7
 
@@ -15,6 +15,19 @@ in-tree instead of depending on it being installed as an npm package.
15
15
 
16
16
  ## Contents
17
17
 
18
+ - `tap-parser.cjs` and `saxes.cjs` — standalone CJS bundles built with pinned
19
+ esbuild from the exact devDependency versions and their lockfile dependencies.
20
+ The TAP and JUnit adapters use these for report grammar and diagnostics.
21
+ `scripts/lib/vendor-bundle.cjs` rejects external imports other than Node
22
+ builtins; `lint-vendored-deps.cjs` rebuilds in memory and byte-compares both
23
+ code and companion `.LICENSE.txt` notices. Refresh with
24
+ `npm run lint:vendored-deps -- --fix`.
25
+ `tap-parser`'s npm metadata says BlueOak-1.0.0 while its shipped LICENSE says
26
+ MIT; the notices preserve both the metadata and the actual license text.
27
+ saxes 6.0.0 omits LICENSE from npm, so the tagged upstream license is preserved
28
+ verbatim in `scripts/lib/vendor-licenses/saxes-6.0.0.txt` and included in the
29
+ generated notices. Neither package's source is patched.
30
+
18
31
  - `re2js.cjs` — verbatim copy of `node_modules/re2js/build/index.cjs`
19
32
  (upstream package `re2js`, pinned version see `package.json`
20
33
  `devDependencies.re2js`). Used by `src/pattern.cts` (compiled to
@@ -30,12 +43,19 @@ in-tree instead of depending on it being installed as an npm package.
30
43
  `require()` calls of its own, and exposes `load`/`dump`/`FAILSAFE_SCHEMA`/
31
44
  `YAMLException`.
32
45
 
33
- ## Two kinds of type twin
46
+ ## Type twins
47
+
48
+ The bundled parsers use **upstream-reference** twins: declaration-only
49
+ `export * from '<package>';` files under `src/vendor/`. TypeScript reads the
50
+ actual upstream declarations during the build, with no hand-maintained API
51
+ copy and no bare runtime import. The vendoring guard checks the exact forwarding
52
+ declaration. The installed runtime needs only the bundled JavaScript.
34
53
 
35
54
  Each vendored package needs a `.d.cts` under `src/vendor/` so TypeScript can
36
55
  resolve types for a relative `./vendor/<pkg>.cjs` import from `src/**`
37
56
  (module resolution for a `.cts` source is relative to `src/`, not the
38
- compiled output dir). There are two kinds:
57
+ compiled output dir). Besides the upstream-reference twins above, the prebuilt
58
+ upstream artifacts use one of two kinds:
39
59
 
40
60
  - **upstream-verbatim** (`re2js.d.cts`) — a byte-for-byte copy of an
41
61
  upstream `.d.cts`/`.d.ts` that ships with the package. Both the
@@ -54,8 +74,8 @@ compiled output dir). There are two kinds:
54
74
 
55
75
  ## Do not hand-edit
56
76
 
57
- These files are **verbatim** copies of upstream build output. Never edit
58
- them directly — refresh them from `node_modules` instead:
77
+ Never edit these artifacts directly. Refresh bundled packages through the
78
+ vendoring command above. Refresh the prebuilt upstream artifacts as follows:
59
79
 
60
80
  ```
61
81
  cp node_modules/re2js/build/index.cjs gsd-core/bin/lib/vendor/re2js.cjs
@@ -68,8 +88,10 @@ cp node_modules/js-yaml/dist/js-yaml.js gsd-core/bin/lib/vendor/js-yaml.cjs
68
88
  ```
69
89
 
70
90
  `node scripts/lint-vendored-deps.cjs` fails CI if any vendored copy drifts
71
- byte-for-byte from its `node_modules` upstream, from its own source-side
72
- type twin (upstream-verbatim twins only), or from the version pinned in
91
+ byte-for-byte from its `node_modules` upstream (for a bundled package: from
92
+ an in-memory rebuild of the bundle and its license notices), from its own
93
+ source-side type twin (upstream-verbatim twins only; an upstream-reference
94
+ twin must be the exact forwarding declaration), or from the version pinned in
73
95
  `package.json` `devDependencies`. It is table-driven (`VENDORED` in that
74
- script) — adding a third vendored package means adding a row, not a second
96
+ script) — adding a vendored package means adding a row, not another
75
97
  hardcoded check block (ADR-3473 §8.3, "one implementation per rule").