@specship/specship-darwin-arm64 0.28.0 → 0.30.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 (324) hide show
  1. package/bin/specship +1 -1
  2. package/lib/dist/.claude-plugin/plugin.json +15 -3
  3. package/lib/dist/activation/cheatsheet.d.ts +10 -7
  4. package/lib/dist/activation/cheatsheet.d.ts.map +1 -1
  5. package/lib/dist/activation/cheatsheet.js +21 -5
  6. package/lib/dist/activation/cheatsheet.js.map +1 -1
  7. package/lib/dist/activation/hook-output.d.ts +75 -2
  8. package/lib/dist/activation/hook-output.d.ts.map +1 -1
  9. package/lib/dist/activation/hook-output.js +114 -3
  10. package/lib/dist/activation/hook-output.js.map +1 -1
  11. package/lib/dist/activation/search-intercept.d.ts +20 -7
  12. package/lib/dist/activation/search-intercept.d.ts.map +1 -1
  13. package/lib/dist/activation/search-intercept.js +27 -5
  14. package/lib/dist/activation/search-intercept.js.map +1 -1
  15. package/lib/dist/activation/steering.d.ts +7 -4
  16. package/lib/dist/activation/steering.d.ts.map +1 -1
  17. package/lib/dist/activation/steering.js +10 -8
  18. package/lib/dist/activation/steering.js.map +1 -1
  19. package/lib/dist/agents/detect.d.ts +32 -0
  20. package/lib/dist/agents/detect.d.ts.map +1 -0
  21. package/lib/dist/agents/detect.js +54 -0
  22. package/lib/dist/agents/detect.js.map +1 -0
  23. package/lib/dist/agents/recent-project.d.ts +18 -0
  24. package/lib/dist/agents/recent-project.d.ts.map +1 -0
  25. package/lib/dist/agents/recent-project.js +92 -0
  26. package/lib/dist/agents/recent-project.js.map +1 -0
  27. package/lib/dist/analytics/canonical-tools.d.ts +23 -0
  28. package/lib/dist/analytics/canonical-tools.d.ts.map +1 -0
  29. package/lib/dist/analytics/canonical-tools.js +36 -0
  30. package/lib/dist/analytics/canonical-tools.js.map +1 -0
  31. package/lib/dist/analytics/canonical-tools.json +16 -0
  32. package/lib/dist/analytics/specship-impact.d.ts +3 -2
  33. package/lib/dist/analytics/specship-impact.d.ts.map +1 -1
  34. package/lib/dist/analytics/specship-impact.js +6 -4
  35. package/lib/dist/analytics/specship-impact.js.map +1 -1
  36. package/lib/dist/bin/specship.js +252 -170
  37. package/lib/dist/bin/specship.js.map +1 -1
  38. package/lib/dist/bin/uninstall.js +2 -2
  39. package/lib/dist/bin/uninstall.js.map +1 -1
  40. package/lib/dist/claudemd/audit.d.ts +12 -3
  41. package/lib/dist/claudemd/audit.d.ts.map +1 -1
  42. package/lib/dist/claudemd/audit.js +65 -22
  43. package/lib/dist/claudemd/audit.js.map +1 -1
  44. package/lib/dist/commands/specship/spec.md +16 -1
  45. package/lib/dist/db/migrations.d.ts +1 -1
  46. package/lib/dist/db/migrations.d.ts.map +1 -1
  47. package/lib/dist/db/migrations.js +18 -4
  48. package/lib/dist/db/migrations.js.map +1 -1
  49. package/lib/dist/db/schema.sql +8 -0
  50. package/lib/dist/db/spec-queries.d.ts +13 -1
  51. package/lib/dist/db/spec-queries.d.ts.map +1 -1
  52. package/lib/dist/db/spec-queries.js +21 -0
  53. package/lib/dist/db/spec-queries.js.map +1 -1
  54. package/lib/dist/design-md/check.d.ts +51 -0
  55. package/lib/dist/design-md/check.d.ts.map +1 -0
  56. package/lib/dist/design-md/check.js +335 -0
  57. package/lib/dist/design-md/check.js.map +1 -0
  58. package/lib/dist/design-md/css.d.ts +40 -0
  59. package/lib/dist/design-md/css.d.ts.map +1 -0
  60. package/lib/dist/design-md/css.js +224 -0
  61. package/lib/dist/design-md/css.js.map +1 -0
  62. package/lib/dist/design-md/extract.d.ts +84 -0
  63. package/lib/dist/design-md/extract.d.ts.map +1 -0
  64. package/lib/dist/design-md/extract.js +595 -0
  65. package/lib/dist/design-md/extract.js.map +1 -0
  66. package/lib/dist/design-md/maintain.d.ts +45 -0
  67. package/lib/dist/design-md/maintain.d.ts.map +1 -0
  68. package/lib/dist/design-md/maintain.js +127 -0
  69. package/lib/dist/design-md/maintain.js.map +1 -0
  70. package/lib/dist/design-md/render.d.ts +28 -0
  71. package/lib/dist/design-md/render.d.ts.map +1 -0
  72. package/lib/dist/design-md/render.js +178 -0
  73. package/lib/dist/design-md/render.js.map +1 -0
  74. package/lib/dist/design-md/upkeep.d.ts +48 -0
  75. package/lib/dist/design-md/upkeep.d.ts.map +1 -0
  76. package/lib/dist/design-md/upkeep.js +169 -0
  77. package/lib/dist/design-md/upkeep.js.map +1 -0
  78. package/lib/dist/design-md/verify.d.ts +65 -0
  79. package/lib/dist/design-md/verify.d.ts.map +1 -0
  80. package/lib/dist/design-md/verify.js +311 -0
  81. package/lib/dist/design-md/verify.js.map +1 -0
  82. package/lib/dist/enforce/changed-files.d.ts +7 -0
  83. package/lib/dist/enforce/changed-files.d.ts.map +1 -1
  84. package/lib/dist/enforce/changed-files.js +17 -0
  85. package/lib/dist/enforce/changed-files.js.map +1 -1
  86. package/lib/dist/enforce/enforce.d.ts +35 -1
  87. package/lib/dist/enforce/enforce.d.ts.map +1 -1
  88. package/lib/dist/enforce/enforce.js +66 -2
  89. package/lib/dist/enforce/enforce.js.map +1 -1
  90. package/lib/dist/extraction/index.d.ts +50 -4
  91. package/lib/dist/extraction/index.d.ts.map +1 -1
  92. package/lib/dist/extraction/index.js +105 -13
  93. package/lib/dist/extraction/index.js.map +1 -1
  94. package/lib/dist/extraction/parse-warnings.d.ts +16 -0
  95. package/lib/dist/extraction/parse-warnings.d.ts.map +1 -0
  96. package/lib/dist/extraction/parse-warnings.js +30 -0
  97. package/lib/dist/extraction/parse-warnings.js.map +1 -0
  98. package/lib/dist/extraction/tree-sitter.d.ts +27 -0
  99. package/lib/dist/extraction/tree-sitter.d.ts.map +1 -1
  100. package/lib/dist/extraction/tree-sitter.js +168 -1
  101. package/lib/dist/extraction/tree-sitter.js.map +1 -1
  102. package/lib/dist/health/smoke-check.js +1 -1
  103. package/lib/dist/health/smoke-check.js.map +1 -1
  104. package/lib/dist/hooks/hooks.json +16 -1
  105. package/lib/dist/index.d.ts +63 -3
  106. package/lib/dist/index.d.ts.map +1 -1
  107. package/lib/dist/index.js +235 -9
  108. package/lib/dist/index.js.map +1 -1
  109. package/lib/dist/installer/agent-record.d.ts +80 -0
  110. package/lib/dist/installer/agent-record.d.ts.map +1 -0
  111. package/lib/dist/installer/agent-record.js +351 -0
  112. package/lib/dist/installer/agent-record.js.map +1 -0
  113. package/lib/dist/installer/auto-migrate.d.ts +56 -0
  114. package/lib/dist/installer/auto-migrate.d.ts.map +1 -0
  115. package/lib/dist/installer/auto-migrate.js +328 -0
  116. package/lib/dist/installer/auto-migrate.js.map +1 -0
  117. package/lib/dist/installer/index.d.ts +37 -8
  118. package/lib/dist/installer/index.d.ts.map +1 -1
  119. package/lib/dist/installer/index.js +156 -46
  120. package/lib/dist/installer/index.js.map +1 -1
  121. package/lib/dist/installer/install-defaults.d.ts +4 -3
  122. package/lib/dist/installer/install-defaults.d.ts.map +1 -1
  123. package/lib/dist/installer/install-defaults.js +6 -5
  124. package/lib/dist/installer/install-defaults.js.map +1 -1
  125. package/lib/dist/installer/{config-writer.d.ts → targets/claude-config-writer.d.ts} +1 -1
  126. package/lib/dist/installer/targets/claude-config-writer.d.ts.map +1 -0
  127. package/lib/dist/installer/{config-writer.js → targets/claude-config-writer.js} +7 -6
  128. package/lib/dist/installer/targets/claude-config-writer.js.map +1 -0
  129. package/lib/dist/installer/targets/claude-projects.d.ts +9 -0
  130. package/lib/dist/installer/targets/claude-projects.d.ts.map +1 -0
  131. package/lib/dist/installer/targets/claude-projects.js +151 -0
  132. package/lib/dist/installer/targets/claude-projects.js.map +1 -0
  133. package/lib/dist/installer/targets/claude.d.ts +29 -2
  134. package/lib/dist/installer/targets/claude.d.ts.map +1 -1
  135. package/lib/dist/installer/targets/claude.js +44 -20
  136. package/lib/dist/installer/targets/claude.js.map +1 -1
  137. package/lib/dist/installer/targets/feature-parity.d.ts +28 -0
  138. package/lib/dist/installer/targets/feature-parity.d.ts.map +1 -0
  139. package/lib/dist/installer/targets/feature-parity.js +32 -0
  140. package/lib/dist/installer/targets/feature-parity.js.map +1 -0
  141. package/lib/dist/installer/{gemini-commands.d.ts → targets/gemini-commands.d.ts} +7 -3
  142. package/lib/dist/installer/targets/gemini-commands.d.ts.map +1 -0
  143. package/lib/dist/installer/{gemini-commands.js → targets/gemini-commands.js} +37 -9
  144. package/lib/dist/installer/targets/gemini-commands.js.map +1 -0
  145. package/lib/dist/installer/targets/gemini-projects.d.ts +11 -0
  146. package/lib/dist/installer/targets/gemini-projects.d.ts.map +1 -0
  147. package/lib/dist/installer/targets/gemini-projects.js +84 -0
  148. package/lib/dist/installer/targets/gemini-projects.js.map +1 -0
  149. package/lib/dist/installer/targets/gemini.d.ts +94 -8
  150. package/lib/dist/installer/targets/gemini.d.ts.map +1 -1
  151. package/lib/dist/installer/targets/gemini.js +392 -33
  152. package/lib/dist/installer/targets/gemini.js.map +1 -1
  153. package/lib/dist/installer/targets/registry.d.ts +8 -1
  154. package/lib/dist/installer/targets/registry.d.ts.map +1 -1
  155. package/lib/dist/installer/targets/registry.js +14 -5
  156. package/lib/dist/installer/targets/registry.js.map +1 -1
  157. package/lib/dist/installer/targets/shared.d.ts +44 -1
  158. package/lib/dist/installer/targets/shared.d.ts.map +1 -1
  159. package/lib/dist/installer/targets/shared.js +130 -3
  160. package/lib/dist/installer/targets/shared.js.map +1 -1
  161. package/lib/dist/installer/targets/types.d.ts +23 -1
  162. package/lib/dist/installer/targets/types.d.ts.map +1 -1
  163. package/lib/dist/jira/auto-publish.d.ts +22 -2
  164. package/lib/dist/jira/auto-publish.d.ts.map +1 -1
  165. package/lib/dist/jira/auto-publish.js +54 -9
  166. package/lib/dist/jira/auto-publish.js.map +1 -1
  167. package/lib/dist/jira/board-first.d.ts +15 -2
  168. package/lib/dist/jira/board-first.d.ts.map +1 -1
  169. package/lib/dist/jira/board-first.js +16 -0
  170. package/lib/dist/jira/board-first.js.map +1 -1
  171. package/lib/dist/jira/ci-publish.d.ts +72 -0
  172. package/lib/dist/jira/ci-publish.d.ts.map +1 -0
  173. package/lib/dist/jira/ci-publish.js +162 -0
  174. package/lib/dist/jira/ci-publish.js.map +1 -0
  175. package/lib/dist/jira/publish.d.ts +23 -0
  176. package/lib/dist/jira/publish.d.ts.map +1 -1
  177. package/lib/dist/jira/publish.js +0 -0
  178. package/lib/dist/jira/publish.js.map +1 -1
  179. package/lib/dist/jira/regression-pack.d.ts.map +1 -1
  180. package/lib/dist/jira/regression-pack.js +7 -1
  181. package/lib/dist/jira/regression-pack.js.map +1 -1
  182. package/lib/dist/jira/repo-config.d.ts.map +1 -1
  183. package/lib/dist/jira/repo-config.js +8 -0
  184. package/lib/dist/jira/repo-config.js.map +1 -1
  185. package/lib/dist/jira/types.d.ts +8 -0
  186. package/lib/dist/jira/types.d.ts.map +1 -1
  187. package/lib/dist/jira/types.js.map +1 -1
  188. package/lib/dist/knowledge/enforce.d.ts.map +1 -1
  189. package/lib/dist/knowledge/enforce.js +6 -1
  190. package/lib/dist/knowledge/enforce.js.map +1 -1
  191. package/lib/dist/mcp/jira-tools.d.ts +5 -0
  192. package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
  193. package/lib/dist/mcp/jira-tools.js +59 -4
  194. package/lib/dist/mcp/jira-tools.js.map +1 -1
  195. package/lib/dist/mcp/proxy.d.ts.map +1 -1
  196. package/lib/dist/mcp/proxy.js +2 -1
  197. package/lib/dist/mcp/proxy.js.map +1 -1
  198. package/lib/dist/mcp/server-instructions.d.ts +16 -10
  199. package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
  200. package/lib/dist/mcp/server-instructions.js +69 -20
  201. package/lib/dist/mcp/server-instructions.js.map +1 -1
  202. package/lib/dist/mcp/session.d.ts +11 -0
  203. package/lib/dist/mcp/session.d.ts.map +1 -1
  204. package/lib/dist/mcp/session.js +43 -1
  205. package/lib/dist/mcp/session.js.map +1 -1
  206. package/lib/dist/mcp/tools.d.ts.map +1 -1
  207. package/lib/dist/mcp/tools.js +8 -0
  208. package/lib/dist/mcp/tools.js.map +1 -1
  209. package/lib/dist/reflect/apply.d.ts +2 -2
  210. package/lib/dist/reflect/apply.d.ts.map +1 -1
  211. package/lib/dist/reflect/apply.js +6 -5
  212. package/lib/dist/reflect/apply.js.map +1 -1
  213. package/lib/dist/reflect/miner.d.ts.map +1 -1
  214. package/lib/dist/reflect/miner.js +28 -15
  215. package/lib/dist/reflect/miner.js.map +1 -1
  216. package/lib/dist/reflect/session-outcomes.d.ts.map +1 -1
  217. package/lib/dist/reflect/session-outcomes.js +8 -3
  218. package/lib/dist/reflect/session-outcomes.js.map +1 -1
  219. package/lib/dist/reflect/targets.d.ts.map +1 -1
  220. package/lib/dist/reflect/targets.js +25 -5
  221. package/lib/dist/reflect/targets.js.map +1 -1
  222. package/lib/dist/reflect/types.d.ts +7 -0
  223. package/lib/dist/reflect/types.d.ts.map +1 -1
  224. package/lib/dist/resolution/spec-link-resolver.d.ts +14 -2
  225. package/lib/dist/resolution/spec-link-resolver.d.ts.map +1 -1
  226. package/lib/dist/resolution/spec-link-resolver.js +13 -3
  227. package/lib/dist/resolution/spec-link-resolver.js.map +1 -1
  228. package/lib/dist/server/canonical-tools.js +50 -0
  229. package/lib/dist/server/cli.js +2 -2
  230. package/lib/dist/server/host-profiles.js +39 -0
  231. package/lib/dist/server/ingest/index.js +2 -1
  232. package/lib/dist/server/ingest/ingestor.js +195 -76
  233. package/lib/dist/server/ingest/project-paths.js +8 -2
  234. package/lib/dist/server/ingest/recorded-projects.js +43 -0
  235. package/lib/dist/server/ingest/specship-classify.js +7 -2
  236. package/lib/dist/server/ingest/transcripts/claude-jsonl.js +54 -0
  237. package/lib/dist/server/ingest/transcripts/claude.js +64 -0
  238. package/lib/dist/server/ingest/transcripts/gemini.js +469 -0
  239. package/lib/dist/server/ingest/transcripts/index.js +14 -0
  240. package/lib/dist/server/ingest/{parser.js → transcripts/shared.js} +3 -49
  241. package/lib/dist/server/ingest/transcripts/types.js +4 -0
  242. package/lib/dist/server/ingest/watcher.js +31 -30
  243. package/lib/dist/server/routes/claude.js +27 -10
  244. package/lib/dist/server/routes/graph.js +64 -3
  245. package/lib/dist/server/routes/mcp.js +57 -15
  246. package/lib/dist/server/routes/memory.js +54 -35
  247. package/lib/dist/server/routes/projects.js +78 -7
  248. package/lib/dist/server/routes/spec.js +125 -0
  249. package/lib/dist/server/server.js +8 -2
  250. package/lib/dist/skills/design-md/SKILL.md +172 -0
  251. package/lib/dist/skills/design-md/references/authored-sections.md +90 -0
  252. package/lib/dist/skills/design-md/references/sources.md +71 -0
  253. package/lib/dist/skills/spec-author/SKILL.md +1 -1
  254. package/lib/dist/skills/spec-author/references/gap-questions.md +1 -1
  255. package/lib/dist/spec-lint/lint.d.ts +26 -1
  256. package/lib/dist/spec-lint/lint.d.ts.map +1 -1
  257. package/lib/dist/spec-lint/lint.js +96 -7
  258. package/lib/dist/spec-lint/lint.js.map +1 -1
  259. package/lib/dist/spec-quality/postcheck.d.ts +7 -1
  260. package/lib/dist/spec-quality/postcheck.d.ts.map +1 -1
  261. package/lib/dist/spec-quality/postcheck.js +31 -0
  262. package/lib/dist/spec-quality/postcheck.js.map +1 -1
  263. package/lib/dist/sync/worktree.d.ts +48 -0
  264. package/lib/dist/sync/worktree.d.ts.map +1 -1
  265. package/lib/dist/sync/worktree.js +109 -0
  266. package/lib/dist/sync/worktree.js.map +1 -1
  267. package/lib/dist/ui/assets/bricolage-latin-C23fTOVi.woff2 +0 -0
  268. package/lib/dist/ui/assets/bricolage-latin-ext-B82pxkPf.woff2 +0 -0
  269. package/lib/dist/ui/assets/index-54vorjyq.css +1 -0
  270. package/lib/dist/ui/assets/index-BZQonCVb.js +52 -0
  271. package/lib/dist/ui/assets/space-grotesk-latin-DPT1xrvW.woff2 +0 -0
  272. package/lib/dist/ui/assets/space-grotesk-latin-ext-wJGaI8U0.woff2 +0 -0
  273. package/lib/dist/ui/index.html +2 -2
  274. package/lib/dist/update/updater.d.ts +6 -0
  275. package/lib/dist/update/updater.d.ts.map +1 -1
  276. package/lib/dist/update/updater.js +13 -1
  277. package/lib/dist/update/updater.js.map +1 -1
  278. package/lib/dist/workflows/agents/claude.d.ts +9 -0
  279. package/lib/dist/workflows/agents/claude.d.ts.map +1 -1
  280. package/lib/dist/workflows/agents/claude.js +22 -3
  281. package/lib/dist/workflows/agents/claude.js.map +1 -1
  282. package/lib/dist/workflows/agents/gemini-version.d.ts +18 -0
  283. package/lib/dist/workflows/agents/gemini-version.d.ts.map +1 -0
  284. package/lib/dist/workflows/agents/gemini-version.js +81 -0
  285. package/lib/dist/workflows/agents/gemini-version.js.map +1 -0
  286. package/lib/dist/workflows/agents/gemini.d.ts +1 -1
  287. package/lib/dist/workflows/agents/gemini.d.ts.map +1 -1
  288. package/lib/dist/workflows/agents/gemini.js +12 -2
  289. package/lib/dist/workflows/agents/gemini.js.map +1 -1
  290. package/lib/dist/workflows/agents/index.d.ts +2 -0
  291. package/lib/dist/workflows/agents/index.d.ts.map +1 -1
  292. package/lib/dist/workflows/agents/index.js +5 -0
  293. package/lib/dist/workflows/agents/index.js.map +1 -1
  294. package/lib/dist/workflows/agents/types.d.ts +13 -0
  295. package/lib/dist/workflows/agents/types.d.ts.map +1 -1
  296. package/lib/dist/workflows/agents/types.js.map +1 -1
  297. package/lib/dist/workflows/condition-evaluator.d.ts +8 -0
  298. package/lib/dist/workflows/condition-evaluator.d.ts.map +1 -1
  299. package/lib/dist/workflows/condition-evaluator.js +7 -0
  300. package/lib/dist/workflows/condition-evaluator.js.map +1 -1
  301. package/lib/dist/workflows/defaults/claude-design-implement.yaml +44 -15
  302. package/lib/dist/workflows/defaults/spec-author.yaml +9 -9
  303. package/lib/dist/workflows/defaults/spec-fix.yaml +8 -8
  304. package/lib/dist/workflows/defaults/spec-implement.yaml +54 -23
  305. package/lib/dist/workflows/defaults/spec-relink.yaml +5 -5
  306. package/lib/dist/workflows/defaults/spec-verify.yaml +3 -3
  307. package/lib/dist/workflows/executor.d.ts +7 -0
  308. package/lib/dist/workflows/executor.d.ts.map +1 -1
  309. package/lib/dist/workflows/executor.js +22 -5
  310. package/lib/dist/workflows/executor.js.map +1 -1
  311. package/lib/node_modules/.package-lock.json +1 -1
  312. package/lib/package.json +3 -2
  313. package/package.json +1 -1
  314. package/lib/dist/installer/config-writer.d.ts.map +0 -1
  315. package/lib/dist/installer/config-writer.js.map +0 -1
  316. package/lib/dist/installer/gemini-commands.d.ts.map +0 -1
  317. package/lib/dist/installer/gemini-commands.js.map +0 -1
  318. package/lib/dist/ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  319. package/lib/dist/ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  320. package/lib/dist/ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  321. package/lib/dist/ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  322. package/lib/dist/ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  323. package/lib/dist/ui/assets/index-BzuUWUAE.js +0 -50
  324. package/lib/dist/ui/assets/index-ezwX2EfG.css +0 -1
@@ -51,6 +51,8 @@ var __importStar = (this && this.__importStar) || (function () {
51
51
  Object.defineProperty(exports, "__esModule", { value: true });
52
52
  exports.ALL_CHECKS = exports.ENFORCE_CONFIG_FILE = void 0;
53
53
  exports.normalizePath = normalizePath;
54
+ exports.undeclaredLinkFindings = undeclaredLinkFindings;
55
+ exports.branchBrokenFindings = branchBrokenFindings;
54
56
  exports.evaluateEnforcement = evaluateEnforcement;
55
57
  exports.loadEnforceConfig = loadEnforceConfig;
56
58
  exports.strictEnforceConfig = strictEnforceConfig;
@@ -59,6 +61,7 @@ const fs = __importStar(require("fs"));
59
61
  const path = __importStar(require("path"));
60
62
  const maintainability_1 = require("../graph/maintainability");
61
63
  const suppressions_1 = require("./suppressions");
64
+ const spec_link_resolver_1 = require("../resolution/spec-link-resolver");
62
65
  /**
63
66
  * Project-relative, forward-slashed, no `./` prefix. Link target paths, spec
64
67
  * source paths and git's output all have to compare in one shape before
@@ -67,6 +70,48 @@ const suppressions_1 = require("./suppressions");
67
70
  function normalizePath(p) {
68
71
  return p.replace(/\\/g, '/').replace(/^\.\//, '').replace(/^\/+/, '');
69
72
  }
73
+ /**
74
+ * Provenances a fresh clone re-derives from the checked-out files: the spec
75
+ * file's `implementations:` / `verifies:` blocks and `@implements` /
76
+ * `@verifies` code comments.
77
+ */
78
+ const DECLARED_PROVENANCES = new Set(['spec-declaration', 'code-comment']);
79
+ function linkKey(l) {
80
+ // Canonical dotted qname (REQ-LINKFIX-002) so `Class.method` and
81
+ // `Class::method` rows count as one logical link.
82
+ return [l.specId, normalizePath(l.targetFilePath), (0, spec_link_resolver_1.canonicalQualifiedName)(l.targetQualifiedName), l.kind].join('\u0000');
83
+ }
84
+ /**
85
+ * Undeclared links (REQ-MULTIDEV-002.A1): an `agent-asserted` row with no
86
+ * declared twin — no `spec-declaration` or `code-comment` row for the same
87
+ * spec, target and kind. A fresh clone never sees it.
88
+ */
89
+ function undeclaredLinkFindings(links) {
90
+ const declared = new Set(links.filter((l) => DECLARED_PROVENANCES.has(l.provenance)).map(linkKey));
91
+ const seen = new Set();
92
+ const findings = [];
93
+ for (const l of links) {
94
+ if (l.provenance !== 'agent-asserted')
95
+ continue;
96
+ const key = linkKey(l);
97
+ if (declared.has(key) || seen.has(key))
98
+ continue;
99
+ seen.add(key);
100
+ findings.push(`${l.specId} → ${l.targetFilePath}:${l.targetQualifiedName} — undeclared (${l.provenance}): ` +
101
+ 'add it to implementations:/verifies: or an @implements comment');
102
+ }
103
+ return findings;
104
+ }
105
+ /**
106
+ * Branch-broken links (REQ-MULTIDEV-002.A2/A3): orphaned/broken now, but the
107
+ * target resolved at the ref — so this branch broke it. A link already
108
+ * unresolved at the ref is not reported.
109
+ */
110
+ function branchBrokenFindings(entries) {
111
+ return entries
112
+ .filter((e) => e.resolvedAtRef)
113
+ .map((e) => `${e.link.specId} → ${e.link.targetFilePath}:${e.link.targetQualifiedName} — ${e.link.state} on this branch, resolved at ${e.ref}`);
114
+ }
70
115
  function evaluateEnforcement(deps, config = {}, scope) {
71
116
  const gate = config.gate ?? {};
72
117
  const exclude = new Set(config.behaviour?.exclude ?? []);
@@ -190,6 +235,18 @@ function evaluateEnforcement(deps, config = {}, scope) {
190
235
  });
191
236
  }
192
237
  }
238
+ // --- undeclared links (REQ-MULTIDEV-002) ---
239
+ if (deps.links !== undefined) {
240
+ const findings = undeclaredLinkFindings(deps.links);
241
+ checks.push({ check: 'undeclaredLinks', gating: gate.undeclaredLinks === true, passed: findings.length === 0, findings });
242
+ }
243
+ // --- branch-broken links (REQ-MULTIDEV-002) — only for a `--since` run ---
244
+ if (deps.brokenAtRef !== undefined) {
245
+ const findings = branchBrokenFindings(deps.brokenAtRef);
246
+ checks.push({
247
+ check: 'branchBroken', gating: gate.branchBroken === true, passed: findings.length === 0, findings, scoped: true,
248
+ });
249
+ }
193
250
  const gatedFailures = checks.filter((c) => c.gating && !c.passed && !c.skipped).map((c) => c.check);
194
251
  return { checks, gatedFailures, passed: gatedFailures.length === 0 };
195
252
  }
@@ -212,13 +269,20 @@ function loadEnforceConfig(projectRoot) {
212
269
  return {};
213
270
  }
214
271
  /** All check names, for `--strict` / `--enable-gate` validation. */
215
- exports.ALL_CHECKS = ['drift', 'fitness', 'maintainability', 'behaviour', 'suppressions', 'mutation'];
272
+ exports.ALL_CHECKS = [
273
+ 'drift', 'fitness', 'maintainability', 'behaviour', 'suppressions', 'mutation', 'undeclaredLinks', 'branchBroken',
274
+ ];
216
275
  /**
217
276
  * The `--strict` override (REQ-ENFORCE-004.A2): every check gates for this
218
277
  * run only. Nothing is read from or written to the project config.
219
278
  */
220
279
  function strictEnforceConfig() {
221
- return { gate: { drift: true, fitness: true, maintainability: true, behaviour: true, suppressions: true, mutation: true } };
280
+ return {
281
+ gate: {
282
+ drift: true, fitness: true, maintainability: true, behaviour: true, suppressions: true, mutation: true,
283
+ undeclaredLinks: true, branchBroken: true,
284
+ },
285
+ };
222
286
  }
223
287
  /**
224
288
  * Persist gating for the named checks into `specship.config.json`
@@ -1 +1 @@
1
- {"version":3,"file":"enforce.js","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBH,sCAEC;AA2FD,kDAsIC;AASD,8CASC;AASD,kDAEC;AASD,4CAmBC;AA3SD,uCAAyB;AACzB,2CAA6B;AAG7B,8DAAqF;AACrF,iDAA8E;AAK9E;;;;GAIG;AACH,SAAgB,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AA2FD,SAAgB,mBAAmB,CACjC,IAAiB,EACjB,SAAwB,EAAE,EAC1B,KAAoB;IAEpB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,6EAA6E;IAC7E,yEAAyE;IACzE,6DAA6D;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,MAAM,OAAO,GAAG,CAAC,IAAwB,EAAW,EAAE,CACpD,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1D,gBAAgB;IAChB,CAAC;QACC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACzF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ;YACpF,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB;IAClB,CAAC;QACC,MAAM,QAAQ,GAAG;YACf,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;YACjF,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;SAC9F,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzG,CAAC;IAED,0BAA0B;IAC1B,wEAAwE;IACxE,6EAA6E;IAC7E,yEAAyE;IACzE,wCAAwC;IACxC,CAAC;QACC,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;QAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,yBAAyB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,oCAAkB,EAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,uCAAuC;IACvC,CAAC;QACC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS,CAAC,qCAAqC;YACxE,yEAAyE;YACzE,wEAAwE;YACxE,0DAA0D;YAC1D,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC5F,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;YAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,2BAA2B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;YACjH,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,yCAAyC,CAAC,CAAC,CAAC,KAAK;YAC1E,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ;YAC5F,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAED,uCAAuC;IACvC,wEAAwE;IACxE,+DAA+D;IAC/D,0BAA0B;IAC1B,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,uCAAwB,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,IAAI,CAAC,YAAY,KAAK,IAAI;YAClC,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;YAC7B,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,yCAAyC;IACzC,2EAA2E;IAC3E,2EAA2E;IAC3E,qEAAqE;IACrE,iEAAiE;IACjE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzB,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;gBAC9B,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,CAAC,4BAA4B,EAAE,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;aACnE,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YAC7D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAC5F,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;oBACvE,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;wBAAE,SAAS;oBAClC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;oBAChC,IAAI,IAAI,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;wBACxB,QAAQ,CAAC,IAAI,CACX,GAAG,GAAG,CAAC,EAAE,0BAA0B,IAAI,qBAAqB,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,UAAU,CACzI,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;gBAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAC7B,QAAQ;gBACR,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpG,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,8EAA8E;AACjE,QAAA,mBAAmB,GAAG,sBAAsB,CAAC;AAE1D;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,WAAmB;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,2BAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;QAClF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgC,CAAC;QAC3D,IAAI,GAAG,EAAE,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,oEAAoE;AACvD,QAAA,UAAU,GAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;AAExH;;;GAGG;AACH,SAAgB,mBAAmB;IACjC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;AAC9H,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,WAAmB,EAAE,MAAmB;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,2BAAmB,CAAC,CAAC;IACzD,IAAI,GAAG,GAAwD,EAAE,CAAC;IAClE,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAAE,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;IACtE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;IACrF,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YACrC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7F,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"enforce.js","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,19 @@ import * as fs from 'fs';
7
7
  import { ExtractionResult, ExtractionError } from '../types';
8
8
  import { QueryBuilder } from '../db/queries';
9
9
  import { Ignore } from 'ignore';
10
+ /**
11
+ * Version of the extractor's output. Bump it whenever an extraction fix
12
+ * changes what an UNCHANGED file produces (REQ-HTMLLEX-002): a stored index
13
+ * stamped with an older version is stale, and the next full sync / indexAll
14
+ * re-extracts every tracked file in {@link EXTRACTION_STALE_LANGUAGES} even
15
+ * though its content hash still matches.
16
+ *
17
+ * - 1 (implicit / missing): pre-HTMLLEX extraction.
18
+ * - 2: declarations survive `<!--` / `-->` inside JS/TS literals (HTMLLEX-DOC).
19
+ */
20
+ export declare const EXTRACTION_VERSION = 2;
21
+ /** `project_metadata` key holding the extraction version of the stored index. */
22
+ export declare const EXTRACTION_VERSION_KEY = "extraction_version";
10
23
  /**
11
24
  * Progress callback for indexing operations
12
25
  */
@@ -28,6 +41,12 @@ export interface IndexResult {
28
41
  edgesCreated: number;
29
42
  errors: ExtractionError[];
30
43
  durationMs: number;
44
+ /**
45
+ * Files whose parse tree held an error region that may have swallowed
46
+ * declarations (`parse_error_region` warnings, REQ-HTMLLEX-003). Reported in
47
+ * the completion summary only; never persisted as a stat.
48
+ */
49
+ filesWithParseWarnings?: number;
31
50
  }
32
51
  /**
33
52
  * Result of a sync operation
@@ -40,6 +59,8 @@ export interface SyncResult {
40
59
  nodesUpdated: number;
41
60
  durationMs: number;
42
61
  changedFilePaths?: string[];
62
+ /** Changed files carrying `parse_error_region` warnings (REQ-HTMLLEX-003). */
63
+ filesWithParseWarnings?: number;
43
64
  /**
44
65
  * Spec links that transitioned into `drifted` during this sync's spec
45
66
  * pass (DRIFT-PUSH-DOC). Populated by SpecShip.sync(); absent when no
@@ -112,6 +133,22 @@ export declare class ExtractionOrchestrator {
112
133
  * inside a single run don't re-scan.
113
134
  */
114
135
  private ensureDetectedFrameworks;
136
+ /**
137
+ * True when the stored index was produced by an older extractor than
138
+ * {@link EXTRACTION_VERSION} (a missing stamp counts as stale), so files
139
+ * whose content hash still matches may hold dropped declarations
140
+ * (REQ-HTMLLEX-002).
141
+ */
142
+ private isExtractionStale;
143
+ /**
144
+ * Record that every stale file has been re-extracted by the current
145
+ * extractor. Called ONLY at the end of a complete full pass (sync /
146
+ * indexAll) — never from a file-scoped index, or a single-file auto-sync
147
+ * would mark recovery done while other files still miss declarations.
148
+ */
149
+ private stampExtractionVersion;
150
+ /** Whether a stored file must be re-extracted while the index is stale. */
151
+ private isStaleLanguage;
115
152
  /**
116
153
  * Index all files in the project
117
154
  */
@@ -121,16 +158,25 @@ export declare class ExtractionOrchestrator {
121
158
  */
122
159
  indexFiles(filePaths: string[]): Promise<IndexResult>;
123
160
  /**
124
- * Index a single file
161
+ * Index a single file.
162
+ *
163
+ * `force` re-stores the extraction even when the content hash matches the
164
+ * stored file (stale-extraction recovery, REQ-HTMLLEX-002).
125
165
  */
126
- indexFile(relativePath: string): Promise<ExtractionResult>;
166
+ indexFile(relativePath: string, options?: {
167
+ force?: boolean;
168
+ }): Promise<ExtractionResult>;
127
169
  /**
128
170
  * Index a single file with pre-read content and stats.
129
171
  * Used by the parallel batch reader to avoid redundant file I/O.
130
172
  */
131
- indexFileWithContent(relativePath: string, content: string, stats: fs.Stats): Promise<ExtractionResult>;
173
+ indexFileWithContent(relativePath: string, content: string, stats: fs.Stats, force?: boolean): Promise<ExtractionResult>;
132
174
  /**
133
- * Store extraction result in database
175
+ * Store extraction result in database.
176
+ *
177
+ * An unchanged content hash short-circuits the write unless `force` is set —
178
+ * the stale-extraction recovery (REQ-HTMLLEX-002) must replace a stored
179
+ * extraction whose hash is current but whose declarations were dropped.
134
180
  */
135
181
  private storeExtractionResult;
136
182
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extraction/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extraction/index.ts"],"names":[],"mappings":"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"}
@@ -41,7 +41,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
41
41
  return (mod && mod.__esModule) ? mod : { "default": mod };
42
42
  };
43
43
  Object.defineProperty(exports, "__esModule", { value: true });
44
- exports.loadAllGrammars = exports.loadGrammarsForLanguages = exports.initGrammars = exports.getSupportedLanguages = exports.isGrammarLoaded = exports.isLanguageSupported = exports.isSourceFile = exports.detectLanguage = exports.extractFromSource = exports.ExtractionOrchestrator = void 0;
44
+ exports.loadAllGrammars = exports.loadGrammarsForLanguages = exports.initGrammars = exports.getSupportedLanguages = exports.isGrammarLoaded = exports.isLanguageSupported = exports.isSourceFile = exports.detectLanguage = exports.extractFromSource = exports.ExtractionOrchestrator = exports.EXTRACTION_VERSION_KEY = exports.EXTRACTION_VERSION = void 0;
45
45
  exports.hashContent = hashContent;
46
46
  exports.buildDefaultIgnore = buildDefaultIgnore;
47
47
  exports.scanDirectory = scanDirectory;
@@ -52,6 +52,7 @@ const path = __importStar(require("path"));
52
52
  const crypto = __importStar(require("crypto"));
53
53
  const child_process_1 = require("child_process");
54
54
  const tree_sitter_1 = require("./tree-sitter");
55
+ const parse_warnings_1 = require("./parse-warnings");
55
56
  const grammars_1 = require("./grammars");
56
57
  const errors_1 = require("../errors");
57
58
  const utils_1 = require("../utils");
@@ -77,6 +78,29 @@ const PARSE_TIMEOUT_MS = 10_000;
77
78
  * This interval balances memory usage against the cost of reloading grammars.
78
79
  */
79
80
  const WORKER_RECYCLE_INTERVAL = 250;
81
+ /**
82
+ * Version of the extractor's output. Bump it whenever an extraction fix
83
+ * changes what an UNCHANGED file produces (REQ-HTMLLEX-002): a stored index
84
+ * stamped with an older version is stale, and the next full sync / indexAll
85
+ * re-extracts every tracked file in {@link EXTRACTION_STALE_LANGUAGES} even
86
+ * though its content hash still matches.
87
+ *
88
+ * - 1 (implicit / missing): pre-HTMLLEX extraction.
89
+ * - 2: declarations survive `<!--` / `-->` inside JS/TS literals (HTMLLEX-DOC).
90
+ */
91
+ exports.EXTRACTION_VERSION = 2;
92
+ /** `project_metadata` key holding the extraction version of the stored index. */
93
+ exports.EXTRACTION_VERSION_KEY = 'extraction_version';
94
+ /**
95
+ * Languages whose stored extraction is invalidated by a version bump. Limited
96
+ * to the family the HTMLLEX fix touched to keep the one-off recovery cheap.
97
+ */
98
+ const EXTRACTION_STALE_LANGUAGES = new Set([
99
+ 'typescript',
100
+ 'tsx',
101
+ 'javascript',
102
+ 'jsx',
103
+ ]);
80
104
  /**
81
105
  * Calculate SHA256 hash of file contents
82
106
  */
@@ -528,6 +552,29 @@ class ExtractionOrchestrator {
528
552
  this.detectedFrameworkNames = (0, frameworks_1.detectFrameworks)(context).map((r) => r.name);
529
553
  return this.detectedFrameworkNames;
530
554
  }
555
+ /**
556
+ * True when the stored index was produced by an older extractor than
557
+ * {@link EXTRACTION_VERSION} (a missing stamp counts as stale), so files
558
+ * whose content hash still matches may hold dropped declarations
559
+ * (REQ-HTMLLEX-002).
560
+ */
561
+ isExtractionStale() {
562
+ const stored = Number.parseInt(this.queries.getMetadata(exports.EXTRACTION_VERSION_KEY) ?? '', 10);
563
+ return !Number.isFinite(stored) || stored < exports.EXTRACTION_VERSION;
564
+ }
565
+ /**
566
+ * Record that every stale file has been re-extracted by the current
567
+ * extractor. Called ONLY at the end of a complete full pass (sync /
568
+ * indexAll) — never from a file-scoped index, or a single-file auto-sync
569
+ * would mark recovery done while other files still miss declarations.
570
+ */
571
+ stampExtractionVersion() {
572
+ this.queries.setMetadata(exports.EXTRACTION_VERSION_KEY, String(exports.EXTRACTION_VERSION));
573
+ }
574
+ /** Whether a stored file must be re-extracted while the index is stale. */
575
+ isStaleLanguage(language) {
576
+ return language !== undefined && EXTRACTION_STALE_LANGUAGES.has(language);
577
+ }
531
578
  /**
532
579
  * Index all files in the project
533
580
  */
@@ -564,6 +611,10 @@ class ExtractionOrchestrator {
564
611
  // between runs is picked up without restarting the process.
565
612
  this.detectedFrameworkNames = null;
566
613
  const frameworkNames = this.ensureDetectedFrameworks(files);
614
+ // REQ-HTMLLEX-002: a stored index from an older extractor holds files whose
615
+ // hash is current but whose declarations were dropped. Force re-extraction
616
+ // of the affected languages, then stamp once the pass completes.
617
+ const stale = this.isExtractionStale();
567
618
  if (signal?.aborted) {
568
619
  return {
569
620
  success: false,
@@ -822,7 +873,7 @@ class ExtractionOrchestrator {
822
873
  // Store in database on main thread (SQLite is not thread-safe)
823
874
  if (result.nodes.length > 0 || result.errors.length === 0) {
824
875
  const language = (0, grammars_1.detectLanguage)(filePath, content);
825
- this.storeExtractionResult(filePath, content, language, stats, result);
876
+ this.storeExtractionResult(filePath, content, language, stats, result, stale && this.isStaleLanguage(language));
826
877
  }
827
878
  if (result.errors.length > 0) {
828
879
  for (const err of result.errors) {
@@ -898,7 +949,7 @@ class ExtractionOrchestrator {
898
949
  if (result.nodes.length > 0 || result.errors.length === 0) {
899
950
  const language = (0, grammars_1.detectLanguage)(filePath, content);
900
951
  const stats = await fsp.stat(path.join(this.rootDir, filePath));
901
- this.storeExtractionResult(filePath, content, language, stats, result);
952
+ this.storeExtractionResult(filePath, content, language, stats, result, stale && this.isStaleLanguage(language));
902
953
  const idx = errors.indexOf(errEntry);
903
954
  if (idx >= 0)
904
955
  errors.splice(idx, 1);
@@ -946,7 +997,7 @@ class ExtractionOrchestrator {
946
997
  if (result.nodes.length > 0 || result.errors.length === 0) {
947
998
  const language = (0, grammars_1.detectLanguage)(filePath, fullContent);
948
999
  const stats = await fsp.stat(path.join(this.rootDir, filePath));
949
- this.storeExtractionResult(filePath, fullContent, language, stats, result);
1000
+ this.storeExtractionResult(filePath, fullContent, language, stats, result, stale && this.isStaleLanguage(language));
950
1001
  const idx = errors.indexOf(errEntry);
951
1002
  if (idx >= 0)
952
1003
  errors.splice(idx, 1);
@@ -964,6 +1015,14 @@ class ExtractionOrchestrator {
964
1015
  if (parseWorker) {
965
1016
  parseWorker.terminate().catch(() => { });
966
1017
  }
1018
+ // This complete pass (aborts return early above) re-extracted every stale
1019
+ // file. A file that failed to read or parse is already reported in
1020
+ // `errors`; parsing is deterministic, so retrying it on every sync would
1021
+ // only re-extract the whole JS/TS tree forever (REQ-HTMLLEX-002.A2). It is
1022
+ // re-extracted as soon as its content changes.
1023
+ if (stale) {
1024
+ this.stampExtractionVersion();
1025
+ }
967
1026
  return {
968
1027
  success: filesIndexed > 0 || errors.filter((e) => e.severity === 'error').length === 0,
969
1028
  filesIndexed,
@@ -973,6 +1032,7 @@ class ExtractionOrchestrator {
973
1032
  edgesCreated: totalEdges,
974
1033
  errors,
975
1034
  durationMs: Date.now() - startTime,
1035
+ filesWithParseWarnings: (0, parse_warnings_1.countParseWarningFiles)(errors),
976
1036
  };
977
1037
  }
978
1038
  /**
@@ -1018,12 +1078,16 @@ class ExtractionOrchestrator {
1018
1078
  edgesCreated: totalEdges,
1019
1079
  errors,
1020
1080
  durationMs: Date.now() - startTime,
1081
+ filesWithParseWarnings: (0, parse_warnings_1.countParseWarningFiles)(errors),
1021
1082
  };
1022
1083
  }
1023
1084
  /**
1024
- * Index a single file
1085
+ * Index a single file.
1086
+ *
1087
+ * `force` re-stores the extraction even when the content hash matches the
1088
+ * stored file (stale-extraction recovery, REQ-HTMLLEX-002).
1025
1089
  */
1026
- async indexFile(relativePath) {
1090
+ async indexFile(relativePath, options = {}) {
1027
1091
  const fullPath = (0, utils_1.validatePathWithinRoot)(this.rootDir, relativePath);
1028
1092
  if (!fullPath) {
1029
1093
  return {
@@ -1057,13 +1121,13 @@ class ExtractionOrchestrator {
1057
1121
  durationMs: 0,
1058
1122
  };
1059
1123
  }
1060
- return this.indexFileWithContent(relativePath, content, stats);
1124
+ return this.indexFileWithContent(relativePath, content, stats, options.force ?? false);
1061
1125
  }
1062
1126
  /**
1063
1127
  * Index a single file with pre-read content and stats.
1064
1128
  * Used by the parallel batch reader to avoid redundant file I/O.
1065
1129
  */
1066
- async indexFileWithContent(relativePath, content, stats) {
1130
+ async indexFileWithContent(relativePath, content, stats, force = false) {
1067
1131
  // Prevent path traversal
1068
1132
  const fullPath = (0, utils_1.validatePathWithinRoot)(this.rootDir, relativePath);
1069
1133
  if (!fullPath) {
@@ -1111,18 +1175,22 @@ class ExtractionOrchestrator {
1111
1175
  const result = (0, tree_sitter_1.extractFromSource)(relativePath, content, language, frameworkNames);
1112
1176
  // Store in database
1113
1177
  if (result.nodes.length > 0 || result.errors.length === 0) {
1114
- this.storeExtractionResult(relativePath, content, language, stats, result);
1178
+ this.storeExtractionResult(relativePath, content, language, stats, result, force);
1115
1179
  }
1116
1180
  return result;
1117
1181
  }
1118
1182
  /**
1119
- * Store extraction result in database
1183
+ * Store extraction result in database.
1184
+ *
1185
+ * An unchanged content hash short-circuits the write unless `force` is set —
1186
+ * the stale-extraction recovery (REQ-HTMLLEX-002) must replace a stored
1187
+ * extraction whose hash is current but whose declarations were dropped.
1120
1188
  */
1121
- storeExtractionResult(filePath, content, language, stats, result) {
1189
+ storeExtractionResult(filePath, content, language, stats, result, force = false) {
1122
1190
  const contentHash = hashContent(content);
1123
1191
  // Check if file already exists and hasn't changed
1124
1192
  const existingFile = this.queries.getFileByPath(filePath);
1125
- if (existingFile && existingFile.contentHash === contentHash) {
1193
+ if (!force && existingFile && existingFile.contentHash === contentHash) {
1126
1194
  return; // No changes
1127
1195
  }
1128
1196
  // Delete existing data for this file
@@ -1186,6 +1254,7 @@ class ExtractionOrchestrator {
1186
1254
  let filesChecked = 0;
1187
1255
  let filesAdded = 0;
1188
1256
  let filesModified = 0;
1257
+ let filesWithParseWarnings = 0;
1189
1258
  let filesRemoved = 0;
1190
1259
  let nodesUpdated = 0;
1191
1260
  const changedFilePaths = [];
@@ -1195,6 +1264,10 @@ class ExtractionOrchestrator {
1195
1264
  total: 0,
1196
1265
  });
1197
1266
  const filesToIndex = [];
1267
+ // REQ-HTMLLEX-002: files stored by an older extractor are re-extracted even
1268
+ // though their size/mtime/hash still match. Computed once per pass.
1269
+ const stale = this.isExtractionStale();
1270
+ const forced = new Set();
1198
1271
  // === Filesystem reconcile (git-independent) ===
1199
1272
  // The source of truth for "what changed" is the filesystem vs the indexed
1200
1273
  // state — never git. We enumerate the current source files and reconcile
@@ -1225,6 +1298,15 @@ class ExtractionOrchestrator {
1225
1298
  for (const filePath of currentFiles) {
1226
1299
  const fullPath = path.join(this.rootDir, filePath);
1227
1300
  const tracked = trackedMap.get(filePath);
1301
+ // (The existsSync guard skips files deleted on disk but still listed by
1302
+ // `git ls-files` — the removal loop above already dropped them.)
1303
+ if (stale && tracked && this.isStaleLanguage(tracked.language) && fs.existsSync(fullPath)) {
1304
+ filesToIndex.push(filePath);
1305
+ changedFilePaths.push(filePath);
1306
+ forced.add(filePath);
1307
+ filesModified++;
1308
+ continue;
1309
+ }
1228
1310
  // Cheap pre-filter: an already-indexed file whose size AND mtime both match
1229
1311
  // the DB is unchanged — skip it without reading or hashing. (A content
1230
1312
  // change that preserves both exactly is the blind spot every mtime-based
@@ -1282,11 +1364,21 @@ class ExtractionOrchestrator {
1282
1364
  total,
1283
1365
  currentFile: filePath,
1284
1366
  });
1285
- const result = await this.indexFile(filePath);
1367
+ const force = forced.has(filePath);
1368
+ const result = await this.indexFile(filePath, { force });
1286
1369
  nodesUpdated += result.nodes.length;
1370
+ if ((0, parse_warnings_1.countParseWarningFiles)(result.errors) > 0)
1371
+ filesWithParseWarnings++;
1372
+ }
1373
+ // Stamp once this full pass has re-extracted every stale file; a file that
1374
+ // failed is reported in its result and is not retried on every sync
1375
+ // (REQ-HTMLLEX-002.A2). File-scoped paths (indexFiles / indexFile) never stamp.
1376
+ if (stale) {
1377
+ this.stampExtractionVersion();
1287
1378
  }
1288
1379
  return {
1289
1380
  filesChecked,
1381
+ filesWithParseWarnings,
1290
1382
  filesAdded,
1291
1383
  filesModified,
1292
1384
  filesRemoved,