@specship/specship-win32-arm64 0.24.0 → 0.28.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 (341) hide show
  1. package/bin/specship.cmd +31 -1
  2. package/lib/dist/activation/cheatsheet.d.ts +17 -1
  3. package/lib/dist/activation/cheatsheet.d.ts.map +1 -1
  4. package/lib/dist/activation/cheatsheet.js +47 -3
  5. package/lib/dist/activation/cheatsheet.js.map +1 -1
  6. package/lib/dist/activation/hook-output.d.ts +80 -0
  7. package/lib/dist/activation/hook-output.d.ts.map +1 -0
  8. package/lib/dist/activation/hook-output.js +103 -0
  9. package/lib/dist/activation/hook-output.js.map +1 -0
  10. package/lib/dist/activation/search-intercept.d.ts +60 -29
  11. package/lib/dist/activation/search-intercept.d.ts.map +1 -1
  12. package/lib/dist/activation/search-intercept.js +159 -55
  13. package/lib/dist/activation/search-intercept.js.map +1 -1
  14. package/lib/dist/activation/steering.d.ts +11 -13
  15. package/lib/dist/activation/steering.d.ts.map +1 -1
  16. package/lib/dist/activation/steering.js +25 -10
  17. package/lib/dist/activation/steering.js.map +1 -1
  18. package/lib/dist/behaviour/behaviour-surface.d.ts +47 -0
  19. package/lib/dist/behaviour/behaviour-surface.d.ts.map +1 -1
  20. package/lib/dist/behaviour/behaviour-surface.js +108 -2
  21. package/lib/dist/behaviour/behaviour-surface.js.map +1 -1
  22. package/lib/dist/bin/node-version-check.d.ts +22 -7
  23. package/lib/dist/bin/node-version-check.d.ts.map +1 -1
  24. package/lib/dist/bin/node-version-check.js +39 -9
  25. package/lib/dist/bin/node-version-check.js.map +1 -1
  26. package/lib/dist/bin/specship.js +989 -116
  27. package/lib/dist/bin/specship.js.map +1 -1
  28. package/lib/dist/commands/specship/learn.md +27 -3
  29. package/lib/dist/commands/specship/spec.md +85 -15
  30. package/lib/dist/db/spec-queries.d.ts +73 -3
  31. package/lib/dist/db/spec-queries.d.ts.map +1 -1
  32. package/lib/dist/db/spec-queries.js +139 -5
  33. package/lib/dist/db/spec-queries.js.map +1 -1
  34. package/lib/dist/db/sqlite-adapter.d.ts +7 -5
  35. package/lib/dist/db/sqlite-adapter.d.ts.map +1 -1
  36. package/lib/dist/db/sqlite-adapter.js +11 -9
  37. package/lib/dist/db/sqlite-adapter.js.map +1 -1
  38. package/lib/dist/enforce/changed-files.d.ts +39 -0
  39. package/lib/dist/enforce/changed-files.d.ts.map +1 -0
  40. package/lib/dist/enforce/changed-files.js +114 -0
  41. package/lib/dist/enforce/changed-files.js.map +1 -0
  42. package/lib/dist/enforce/enforce.d.ts +53 -2
  43. package/lib/dist/enforce/enforce.d.ts.map +1 -1
  44. package/lib/dist/enforce/enforce.js +95 -8
  45. package/lib/dist/enforce/enforce.js.map +1 -1
  46. package/lib/dist/enforce/mutation.d.ts +46 -0
  47. package/lib/dist/enforce/mutation.d.ts.map +1 -0
  48. package/lib/dist/enforce/mutation.js +104 -0
  49. package/lib/dist/enforce/mutation.js.map +1 -0
  50. package/lib/dist/enforce/suppressions.d.ts +33 -0
  51. package/lib/dist/enforce/suppressions.d.ts.map +1 -0
  52. package/lib/dist/enforce/suppressions.js +159 -0
  53. package/lib/dist/enforce/suppressions.js.map +1 -0
  54. package/lib/dist/extraction/grammars.d.ts +10 -0
  55. package/lib/dist/extraction/grammars.d.ts.map +1 -1
  56. package/lib/dist/extraction/grammars.js +32 -3
  57. package/lib/dist/extraction/grammars.js.map +1 -1
  58. package/lib/dist/extraction/index.d.ts +7 -0
  59. package/lib/dist/extraction/index.d.ts.map +1 -1
  60. package/lib/dist/extraction/index.js.map +1 -1
  61. package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts +7 -0
  62. package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
  63. package/lib/dist/extraction/specs/markdown-spec-extractor.js +97 -10
  64. package/lib/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
  65. package/lib/dist/extraction/wasm/tree-sitter-pascal.wasm.gz +0 -0
  66. package/lib/dist/extraction/wasm/tree-sitter-scala.wasm.gz +0 -0
  67. package/lib/dist/graph/spec-coverage.d.ts +142 -0
  68. package/lib/dist/graph/spec-coverage.d.ts.map +1 -0
  69. package/lib/dist/graph/spec-coverage.js +276 -0
  70. package/lib/dist/graph/spec-coverage.js.map +1 -0
  71. package/lib/dist/health/smoke-check.js +2 -2
  72. package/lib/dist/health/smoke-check.js.map +1 -1
  73. package/lib/dist/index.d.ts +75 -7
  74. package/lib/dist/index.d.ts.map +1 -1
  75. package/lib/dist/index.js +191 -23
  76. package/lib/dist/index.js.map +1 -1
  77. package/lib/dist/installer/gemini-commands.d.ts +107 -0
  78. package/lib/dist/installer/gemini-commands.d.ts.map +1 -0
  79. package/lib/dist/installer/gemini-commands.js +264 -0
  80. package/lib/dist/installer/gemini-commands.js.map +1 -0
  81. package/lib/dist/installer/index.d.ts +55 -8
  82. package/lib/dist/installer/index.d.ts.map +1 -1
  83. package/lib/dist/installer/index.js +72 -53
  84. package/lib/dist/installer/index.js.map +1 -1
  85. package/lib/dist/installer/init-offer.d.ts +14 -9
  86. package/lib/dist/installer/init-offer.d.ts.map +1 -1
  87. package/lib/dist/installer/init-offer.js +13 -9
  88. package/lib/dist/installer/init-offer.js.map +1 -1
  89. package/lib/dist/installer/install-defaults.d.ts +81 -0
  90. package/lib/dist/installer/install-defaults.d.ts.map +1 -0
  91. package/lib/dist/installer/install-defaults.js +95 -0
  92. package/lib/dist/installer/install-defaults.js.map +1 -0
  93. package/lib/dist/installer/instructions-template.d.ts +22 -0
  94. package/lib/dist/installer/instructions-template.d.ts.map +1 -1
  95. package/lib/dist/installer/instructions-template.js +37 -1
  96. package/lib/dist/installer/instructions-template.js.map +1 -1
  97. package/lib/dist/installer/targets/claude.d.ts +18 -0
  98. package/lib/dist/installer/targets/claude.d.ts.map +1 -1
  99. package/lib/dist/installer/targets/claude.js +70 -23
  100. package/lib/dist/installer/targets/claude.js.map +1 -1
  101. package/lib/dist/installer/targets/gemini.d.ts +85 -12
  102. package/lib/dist/installer/targets/gemini.d.ts.map +1 -1
  103. package/lib/dist/installer/targets/gemini.js +527 -30
  104. package/lib/dist/installer/targets/gemini.js.map +1 -1
  105. package/lib/dist/installer/targets/shared.d.ts +13 -0
  106. package/lib/dist/installer/targets/shared.d.ts.map +1 -1
  107. package/lib/dist/installer/targets/shared.js +22 -4
  108. package/lib/dist/installer/targets/shared.js.map +1 -1
  109. package/lib/dist/installer/targets/types.d.ts +12 -0
  110. package/lib/dist/installer/targets/types.d.ts.map +1 -1
  111. package/lib/dist/jira/auto-publish.d.ts +71 -4
  112. package/lib/dist/jira/auto-publish.d.ts.map +1 -1
  113. package/lib/dist/jira/auto-publish.js +186 -17
  114. package/lib/dist/jira/auto-publish.js.map +1 -1
  115. package/lib/dist/jira/reconcile.d.ts +24 -1
  116. package/lib/dist/jira/reconcile.d.ts.map +1 -1
  117. package/lib/dist/jira/reconcile.js +46 -2
  118. package/lib/dist/jira/reconcile.js.map +1 -1
  119. package/lib/dist/jira/repo-config.d.ts +9 -0
  120. package/lib/dist/jira/repo-config.d.ts.map +1 -1
  121. package/lib/dist/jira/repo-config.js +11 -0
  122. package/lib/dist/jira/repo-config.js.map +1 -1
  123. package/lib/dist/jira/types.d.ts +7 -0
  124. package/lib/dist/jira/types.d.ts.map +1 -1
  125. package/lib/dist/jira/types.js.map +1 -1
  126. package/lib/dist/knowledge/enforce.d.ts +75 -0
  127. package/lib/dist/knowledge/enforce.d.ts.map +1 -0
  128. package/lib/dist/knowledge/enforce.js +250 -0
  129. package/lib/dist/knowledge/enforce.js.map +1 -0
  130. package/lib/dist/knowledge/facts.d.ts +33 -0
  131. package/lib/dist/knowledge/facts.d.ts.map +1 -0
  132. package/lib/dist/knowledge/facts.js +117 -0
  133. package/lib/dist/knowledge/facts.js.map +1 -0
  134. package/lib/dist/knowledge/proposals.d.ts +88 -0
  135. package/lib/dist/knowledge/proposals.d.ts.map +1 -0
  136. package/lib/dist/knowledge/proposals.js +360 -0
  137. package/lib/dist/knowledge/proposals.js.map +1 -0
  138. package/lib/dist/knowledge/stale.d.ts +64 -0
  139. package/lib/dist/knowledge/stale.d.ts.map +1 -0
  140. package/lib/dist/knowledge/stale.js +174 -0
  141. package/lib/dist/knowledge/stale.js.map +1 -0
  142. package/lib/dist/mcp/fitness-tool.d.ts +5 -6
  143. package/lib/dist/mcp/fitness-tool.d.ts.map +1 -1
  144. package/lib/dist/mcp/fitness-tool.js +0 -16
  145. package/lib/dist/mcp/fitness-tool.js.map +1 -1
  146. package/lib/dist/mcp/gemini-session.d.ts +50 -0
  147. package/lib/dist/mcp/gemini-session.d.ts.map +1 -0
  148. package/lib/dist/mcp/gemini-session.js +159 -0
  149. package/lib/dist/mcp/gemini-session.js.map +1 -0
  150. package/lib/dist/mcp/health-tool.d.ts +26 -0
  151. package/lib/dist/mcp/health-tool.d.ts.map +1 -0
  152. package/lib/dist/mcp/health-tool.js +50 -0
  153. package/lib/dist/mcp/health-tool.js.map +1 -0
  154. package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
  155. package/lib/dist/mcp/jira-tools.js +25 -0
  156. package/lib/dist/mcp/jira-tools.js.map +1 -1
  157. package/lib/dist/mcp/maintainability-tool.d.ts +5 -7
  158. package/lib/dist/mcp/maintainability-tool.d.ts.map +1 -1
  159. package/lib/dist/mcp/maintainability-tool.js +0 -16
  160. package/lib/dist/mcp/maintainability-tool.js.map +1 -1
  161. package/lib/dist/mcp/model-context.d.ts +31 -7
  162. package/lib/dist/mcp/model-context.d.ts.map +1 -1
  163. package/lib/dist/mcp/model-context.js +70 -21
  164. package/lib/dist/mcp/model-context.js.map +1 -1
  165. package/lib/dist/mcp/proxy.d.ts.map +1 -1
  166. package/lib/dist/mcp/proxy.js +5 -2
  167. package/lib/dist/mcp/proxy.js.map +1 -1
  168. package/lib/dist/mcp/server-instructions.d.ts +16 -15
  169. package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
  170. package/lib/dist/mcp/server-instructions.js +72 -5
  171. package/lib/dist/mcp/server-instructions.js.map +1 -1
  172. package/lib/dist/mcp/session.js +1 -1
  173. package/lib/dist/mcp/session.js.map +1 -1
  174. package/lib/dist/mcp/spec-tools.d.ts +9 -1
  175. package/lib/dist/mcp/spec-tools.d.ts.map +1 -1
  176. package/lib/dist/mcp/spec-tools.js +282 -49
  177. package/lib/dist/mcp/spec-tools.js.map +1 -1
  178. package/lib/dist/mcp/tools.d.ts +49 -9
  179. package/lib/dist/mcp/tools.d.ts.map +1 -1
  180. package/lib/dist/mcp/tools.js +210 -58
  181. package/lib/dist/mcp/tools.js.map +1 -1
  182. package/lib/dist/pulse/pulse.d.ts +93 -0
  183. package/lib/dist/pulse/pulse.d.ts.map +1 -0
  184. package/lib/dist/pulse/pulse.js +401 -0
  185. package/lib/dist/pulse/pulse.js.map +1 -0
  186. package/lib/dist/reflect/apply.d.ts.map +1 -1
  187. package/lib/dist/reflect/apply.js +38 -3
  188. package/lib/dist/reflect/apply.js.map +1 -1
  189. package/lib/dist/reflect/auto-sweep.d.ts +26 -0
  190. package/lib/dist/reflect/auto-sweep.d.ts.map +1 -0
  191. package/lib/dist/reflect/auto-sweep.js +90 -0
  192. package/lib/dist/reflect/auto-sweep.js.map +1 -0
  193. package/lib/dist/reflect/cli.d.ts +62 -0
  194. package/lib/dist/reflect/cli.d.ts.map +1 -0
  195. package/lib/dist/reflect/cli.js +163 -0
  196. package/lib/dist/reflect/cli.js.map +1 -0
  197. package/lib/dist/reflect/miner.d.ts.map +1 -1
  198. package/lib/dist/reflect/miner.js +119 -0
  199. package/lib/dist/reflect/miner.js.map +1 -1
  200. package/lib/dist/reflect/sweep.d.ts +1 -0
  201. package/lib/dist/reflect/sweep.d.ts.map +1 -1
  202. package/lib/dist/reflect/sweep.js +62 -13
  203. package/lib/dist/reflect/sweep.js.map +1 -1
  204. package/lib/dist/reflect/targets.d.ts +2 -0
  205. package/lib/dist/reflect/targets.d.ts.map +1 -1
  206. package/lib/dist/reflect/targets.js +33 -0
  207. package/lib/dist/reflect/targets.js.map +1 -1
  208. package/lib/dist/reflect/types.d.ts +19 -2
  209. package/lib/dist/reflect/types.d.ts.map +1 -1
  210. package/lib/dist/resolution/spec-link-resolver.d.ts +44 -2
  211. package/lib/dist/resolution/spec-link-resolver.d.ts.map +1 -1
  212. package/lib/dist/resolution/spec-link-resolver.js +132 -0
  213. package/lib/dist/resolution/spec-link-resolver.js.map +1 -1
  214. package/lib/dist/resolution/test-title-links.d.ts +62 -0
  215. package/lib/dist/resolution/test-title-links.d.ts.map +1 -0
  216. package/lib/dist/resolution/test-title-links.js +97 -0
  217. package/lib/dist/resolution/test-title-links.js.map +1 -0
  218. package/lib/dist/search/query-parser.d.ts.map +1 -1
  219. package/lib/dist/search/query-parser.js +6 -1
  220. package/lib/dist/search/query-parser.js.map +1 -1
  221. package/lib/dist/server/project-registry.js +1 -1
  222. package/lib/dist/server/routes/claude.js +24 -43
  223. package/lib/dist/server/routes/graph.js +53 -7
  224. package/lib/dist/server/routes/knowledge.js +118 -0
  225. package/lib/dist/server/routes/mcp.js +4 -3
  226. package/lib/dist/server/routes/projects.js +4 -4
  227. package/lib/dist/server/routes/spec.js +49 -7
  228. package/lib/dist/server/server.js +31 -17
  229. package/lib/dist/skills/spec-author/SKILL.md +164 -0
  230. package/lib/dist/skills/spec-author/references/format.md +210 -0
  231. package/lib/dist/skills/spec-author/references/gap-questions.md +152 -0
  232. package/lib/dist/skills/spec-author/references/quality-rubric.md +125 -0
  233. package/lib/dist/skills/spec-author/references/review-checklist.md +175 -0
  234. package/lib/dist/spec-lint/lint.d.ts +82 -0
  235. package/lib/dist/spec-lint/lint.d.ts.map +1 -0
  236. package/lib/dist/spec-lint/lint.js +491 -0
  237. package/lib/dist/spec-lint/lint.js.map +1 -0
  238. package/lib/dist/spec-quality/criterion-ids.d.ts +13 -0
  239. package/lib/dist/spec-quality/criterion-ids.d.ts.map +1 -0
  240. package/lib/dist/spec-quality/criterion-ids.js +38 -0
  241. package/lib/dist/spec-quality/criterion-ids.js.map +1 -0
  242. package/lib/dist/spec-quality/evidence-kind.d.ts +54 -0
  243. package/lib/dist/spec-quality/evidence-kind.d.ts.map +1 -0
  244. package/lib/dist/spec-quality/evidence-kind.js +183 -0
  245. package/lib/dist/spec-quality/evidence-kind.js.map +1 -0
  246. package/lib/dist/spec-quality/link-persist.d.ts +65 -0
  247. package/lib/dist/spec-quality/link-persist.d.ts.map +1 -0
  248. package/lib/dist/spec-quality/link-persist.js +249 -0
  249. package/lib/dist/spec-quality/link-persist.js.map +1 -0
  250. package/lib/dist/spec-quality/plan-scope.d.ts +38 -0
  251. package/lib/dist/spec-quality/plan-scope.d.ts.map +1 -0
  252. package/lib/dist/spec-quality/plan-scope.js +129 -0
  253. package/lib/dist/spec-quality/plan-scope.js.map +1 -0
  254. package/lib/dist/spec-quality/postcheck.d.ts +85 -0
  255. package/lib/dist/spec-quality/postcheck.d.ts.map +1 -0
  256. package/lib/dist/spec-quality/postcheck.js +390 -0
  257. package/lib/dist/spec-quality/postcheck.js.map +1 -0
  258. package/lib/dist/spec-quality/readiness.d.ts +72 -0
  259. package/lib/dist/spec-quality/readiness.d.ts.map +1 -0
  260. package/lib/dist/spec-quality/readiness.js +226 -0
  261. package/lib/dist/spec-quality/readiness.js.map +1 -0
  262. package/lib/dist/statusline/index.js.map +1 -1
  263. package/lib/dist/statusline/render.d.ts +1 -1
  264. package/lib/dist/statusline/render.d.ts.map +1 -1
  265. package/lib/dist/statusline/render.js +3 -1
  266. package/lib/dist/statusline/render.js.map +1 -1
  267. package/lib/dist/ui/assets/index-BzuUWUAE.js +50 -0
  268. package/lib/dist/ui/index.html +1 -1
  269. package/lib/dist/verify/report-ingest.d.ts +88 -0
  270. package/lib/dist/verify/report-ingest.d.ts.map +1 -0
  271. package/lib/dist/verify/report-ingest.js +269 -0
  272. package/lib/dist/verify/report-ingest.js.map +1 -0
  273. package/lib/dist/workflows/agents/claude.d.ts +16 -0
  274. package/lib/dist/workflows/agents/claude.d.ts.map +1 -0
  275. package/lib/dist/workflows/agents/claude.js +82 -0
  276. package/lib/dist/workflows/agents/claude.js.map +1 -0
  277. package/lib/dist/workflows/agents/gemini.d.ts +21 -0
  278. package/lib/dist/workflows/agents/gemini.d.ts.map +1 -0
  279. package/lib/dist/workflows/agents/gemini.js +124 -0
  280. package/lib/dist/workflows/agents/gemini.js.map +1 -0
  281. package/lib/dist/workflows/agents/index.d.ts +28 -0
  282. package/lib/dist/workflows/agents/index.d.ts.map +1 -0
  283. package/lib/dist/workflows/agents/index.js +104 -0
  284. package/lib/dist/workflows/agents/index.js.map +1 -0
  285. package/lib/dist/workflows/agents/types.d.ts +55 -0
  286. package/lib/dist/workflows/agents/types.d.ts.map +1 -0
  287. package/lib/dist/workflows/agents/types.js +46 -0
  288. package/lib/dist/workflows/agents/types.js.map +1 -0
  289. package/lib/dist/workflows/batch.d.ts +63 -0
  290. package/lib/dist/workflows/batch.d.ts.map +1 -0
  291. package/lib/dist/workflows/batch.js +151 -0
  292. package/lib/dist/workflows/batch.js.map +1 -0
  293. package/lib/dist/workflows/defaults/claude-design-implement.yaml +3 -4
  294. package/lib/dist/workflows/defaults/spec-author.yaml +11 -9
  295. package/lib/dist/workflows/defaults/spec-fix.yaml +103 -12
  296. package/lib/dist/workflows/defaults/spec-implement-mixed.yaml +21 -193
  297. package/lib/dist/workflows/defaults/spec-implement.yaml +701 -41
  298. package/lib/dist/workflows/defaults/spec-verify.yaml +60 -9
  299. package/lib/dist/workflows/discovery.d.ts +13 -0
  300. package/lib/dist/workflows/discovery.d.ts.map +1 -1
  301. package/lib/dist/workflows/discovery.js +79 -17
  302. package/lib/dist/workflows/discovery.js.map +1 -1
  303. package/lib/dist/workflows/executor.d.ts +18 -0
  304. package/lib/dist/workflows/executor.d.ts.map +1 -1
  305. package/lib/dist/workflows/executor.js +130 -33
  306. package/lib/dist/workflows/executor.js.map +1 -1
  307. package/lib/dist/workflows/gc.d.ts +50 -0
  308. package/lib/dist/workflows/gc.d.ts.map +1 -0
  309. package/lib/dist/workflows/gc.js +120 -0
  310. package/lib/dist/workflows/gc.js.map +1 -0
  311. package/lib/dist/workflows/merge-queue.d.ts +64 -0
  312. package/lib/dist/workflows/merge-queue.d.ts.map +1 -0
  313. package/lib/dist/workflows/merge-queue.js +162 -0
  314. package/lib/dist/workflows/merge-queue.js.map +1 -0
  315. package/lib/dist/workflows/runners/approval.d.ts +1 -1
  316. package/lib/dist/workflows/runners/approval.d.ts.map +1 -1
  317. package/lib/dist/workflows/runners/approval.js +11 -2
  318. package/lib/dist/workflows/runners/approval.js.map +1 -1
  319. package/lib/dist/workflows/runners/bash.d.ts +15 -0
  320. package/lib/dist/workflows/runners/bash.d.ts.map +1 -1
  321. package/lib/dist/workflows/runners/bash.js +50 -1
  322. package/lib/dist/workflows/runners/bash.js.map +1 -1
  323. package/lib/dist/workflows/runners/prompt.d.ts +16 -41
  324. package/lib/dist/workflows/runners/prompt.d.ts.map +1 -1
  325. package/lib/dist/workflows/runners/prompt.js +55 -120
  326. package/lib/dist/workflows/runners/prompt.js.map +1 -1
  327. package/lib/dist/workflows/runners/types.d.ts +12 -0
  328. package/lib/dist/workflows/runners/types.d.ts.map +1 -1
  329. package/lib/dist/workflows/schemas/workflow.d.ts +17 -0
  330. package/lib/dist/workflows/schemas/workflow.d.ts.map +1 -1
  331. package/lib/dist/workflows/schemas/workflow.js +27 -0
  332. package/lib/dist/workflows/schemas/workflow.js.map +1 -1
  333. package/lib/node_modules/.package-lock.json +1 -1
  334. package/lib/package.json +8 -4
  335. package/package.json +5 -3
  336. package/lib/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  337. package/lib/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  338. package/lib/dist/server/ingest/impact-query.js +0 -343
  339. package/lib/dist/server/routes/events.js +0 -152
  340. package/lib/dist/ui/assets/index-CjjaftDw.js +0 -50
  341. package/node.exe +0 -4
@@ -28,12 +28,48 @@
28
28
  * Highest-confidence signal wins per logical key — `upsertSpecLink` enforces
29
29
  * this.
30
30
  */
31
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ var desc = Object.getOwnPropertyDescriptor(m, k);
34
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
35
+ desc = { enumerable: true, get: function() { return m[k]; } };
36
+ }
37
+ Object.defineProperty(o, k2, desc);
38
+ }) : (function(o, m, k, k2) {
39
+ if (k2 === undefined) k2 = k;
40
+ o[k2] = m[k];
41
+ }));
42
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
43
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
44
+ }) : function(o, v) {
45
+ o["default"] = v;
46
+ });
47
+ var __importStar = (this && this.__importStar) || (function () {
48
+ var ownKeys = function(o) {
49
+ ownKeys = Object.getOwnPropertyNames || function (o) {
50
+ var ar = [];
51
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
52
+ return ar;
53
+ };
54
+ return ownKeys(o);
55
+ };
56
+ return function (mod) {
57
+ if (mod && mod.__esModule) return mod;
58
+ var result = {};
59
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
60
+ __setModuleDefault(result, mod);
61
+ return result;
62
+ };
63
+ })();
31
64
  Object.defineProperty(exports, "__esModule", { value: true });
32
65
  exports.SpecLinkResolver = exports.INHERITED_LINK_MAX_DEPTH = void 0;
33
66
  exports.canonicalQualifiedName = canonicalQualifiedName;
34
67
  exports.qualifiedNameVariants = qualifiedNameVariants;
35
68
  exports.sourceSpecIds = sourceSpecIds;
36
69
  const types_1 = require("../types");
70
+ const test_title_links_1 = require("./test-title-links");
71
+ const fs = __importStar(require("fs"));
72
+ const path = __importStar(require("path"));
37
73
  /** Pattern: `// @implements REQ-X` or `# @implements REQ-X` etc. */
38
74
  const CODE_COMMENT_IMPL = /@implements\s+([A-Za-z][A-Za-z0-9_.-]*)/g;
39
75
  /**
@@ -99,6 +135,18 @@ function sourceSpecIds(spec) {
99
135
  // Dedup while preserving order.
100
136
  return [...new Set(out)];
101
137
  }
138
+ /**
139
+ * Metadata carrying the non-test-target flag for a `tests` link
140
+ * (REQ-VSTATE-002.A4). Returns `undefined` for every other link kind so
141
+ * non-evidence links keep clean metadata. The flag is written on EVERY pass
142
+ * (true and false) so a target that moves into — or out of — a test file
143
+ * self-corrects instead of keeping a stale verdict.
144
+ */
145
+ function nonTestEvidenceFlag(kind, targetFilePath) {
146
+ if (kind !== 'tests')
147
+ return undefined;
148
+ return { nonTestTarget: !(0, test_title_links_1.isRecognizedTestFile)(targetFilePath) };
149
+ }
102
150
  class SpecLinkResolver {
103
151
  queries;
104
152
  specQueries;
@@ -209,6 +257,11 @@ class SpecLinkResolver {
209
257
  * `kind` is a hint, not a hard filter — we prefer an exact-kind match
210
258
  * but fall back to any kind on the same path/qname (a function turned
211
259
  * method is still "the same logical symbol" from the spec's POV).
260
+ *
261
+ * Public so the assert paths (MCP tool + dashboard route) can validate a
262
+ * target BEFORE recording a link (REQ-REVINT-003) — the same lookup the
263
+ * resolver uses, so validate-then-insert and the later resolve pass can
264
+ * never disagree.
212
265
  */
213
266
  findLogicalTarget(filePath, qualifiedName, kind) {
214
267
  // Look up every separator-form variant (Class.method ⇄ Class::method) so
@@ -267,6 +320,10 @@ class SpecLinkResolver {
267
320
  nodeSigAtLink: resolvedNode?.signature,
268
321
  provenance: 'spec-declaration',
269
322
  confidence: 0.7,
323
+ // A `verifies:` bullet pointing outside a recognized test file is
324
+ // flagged, not trusted (REQ-VSTATE-002.A4) — fixtures and helpers may be
325
+ // declared, but the flag keeps them out of the evidence gate.
326
+ metadata: nonTestEvidenceFlag(c.kind, c.targetFilePath),
270
327
  createdAt: now,
271
328
  updatedAt: now,
272
329
  });
@@ -324,6 +381,9 @@ class SpecLinkResolver {
324
381
  nodeSigAtLink: node.signature,
325
382
  provenance: 'code-comment',
326
383
  confidence: 0.9,
384
+ // An `@verifies` marker on a symbol that isn't in a test file
385
+ // is flagged the same way as a declared one (REQ-VSTATE-002.A4).
386
+ metadata: nonTestEvidenceFlag(kind, node.filePath),
327
387
  createdAt: now,
328
388
  updatedAt: now,
329
389
  });
@@ -335,6 +395,78 @@ class SpecLinkResolver {
335
395
  }
336
396
  }
337
397
  }
398
+ /**
399
+ * Scan TEST FILES for spec ids inside `it()` / `test()` titles and emit
400
+ * `tests`-kind links (REQ-VSTATE-002).
401
+ *
402
+ * One link per (spec id, test file): the target is the test file's `file`
403
+ * node — the only node the graph actually has for a test case's location —
404
+ * and the matched titles ride along in `metadata.testTitles`, which is what
405
+ * `specship verify --report` matches a reported case against (REQ-VSTATE-004).
406
+ *
407
+ * File-derived by construction: nothing is remembered between passes, so the
408
+ * links are re-created on every extraction and survive re-index (A3). Only
409
+ * recognized test files are scanned, so a spec id in a source file's message
410
+ * string can never become evidence (A2).
411
+ *
412
+ * Requires `projectRoot` in the resolver options (it reads the files); a
413
+ * resolver without one silently skips the pass.
414
+ */
415
+ applyTestTitleLinks(changedFiles, stats) {
416
+ const root = this.opts.projectRoot;
417
+ if (!root)
418
+ return;
419
+ const now = Date.now();
420
+ for (const file of changedFiles) {
421
+ if (!(0, test_title_links_1.isRecognizedTestFile)(file))
422
+ continue;
423
+ let source;
424
+ try {
425
+ source = fs.readFileSync(path.resolve(root, file), 'utf-8');
426
+ }
427
+ catch {
428
+ continue; // deleted / unreadable — the resolve pass handles the fallout
429
+ }
430
+ // Group the file's titles by spec id so one link carries every title in
431
+ // that file which names the same criterion.
432
+ const titlesBySpec = new Map();
433
+ for (const ref of (0, test_title_links_1.scanTestTitleRefs)(source)) {
434
+ const titles = titlesBySpec.get(ref.specId) ?? [];
435
+ if (!titles.includes(ref.title))
436
+ titles.push(ref.title);
437
+ titlesBySpec.set(ref.specId, titles);
438
+ }
439
+ if (titlesBySpec.size === 0)
440
+ continue;
441
+ const fileNode = this.findLogicalTarget(file, file, 'file');
442
+ for (const [specId, titles] of titlesBySpec) {
443
+ const spec = this.specQueries.getSpecById(specId);
444
+ if (!spec)
445
+ continue; // not a real spec id — just words in a title
446
+ this.specQueries.upsertSpecLink({
447
+ specId,
448
+ targetFilePath: file,
449
+ targetQualifiedName: canonicalQualifiedName(fileNode?.qualifiedName ?? file),
450
+ targetNodeKind: 'file',
451
+ resolvedNodeId: fileNode?.id,
452
+ kind: 'tests',
453
+ state: fileNode ? 'implemented' : 'orphaned',
454
+ driftAxis: null,
455
+ specHashAtLink: spec.contentHash,
456
+ // A file node's "signature" is not a stable drift axis (any edit to
457
+ // the file would trip it), so no baseline is taken here.
458
+ nodeSigAtLink: undefined,
459
+ provenance: 'code-comment',
460
+ confidence: 0.9,
461
+ metadata: { testTitles: titles, evidenceSource: 'test-title', nonTestTarget: false },
462
+ createdAt: now,
463
+ updatedAt: now,
464
+ });
465
+ if (stats)
466
+ stats.testTitleLinksApplied = (stats.testTitleLinksApplied ?? 0) + 1;
467
+ }
468
+ }
469
+ }
338
470
  // ===========================================================================
339
471
  // Spec-side drift (called from spec extraction stage)
340
472
  // ===========================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"spec-link-resolver.js","sourceRoot":"","sources":["../../src/resolution/spec-link-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spec-link-resolver.js","sourceRoot":"","sources":["../../src/resolution/spec-link-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Test-title spec links (REQ-VSTATE-002).
3
+ *
4
+ * The repo convention is already `it('does X (REQ-FOO-001.A1)', …)`. That title
5
+ * is the most precise test evidence a spec can have — it names the criterion the
6
+ * test case proves — but nothing read it, so evidence had to be re-declared as a
7
+ * `verifies:` block or an `@verifies` comment on a hoisted named function, and a
8
+ * fixture file could satisfy the evidence gate by accident.
9
+ *
10
+ * This module turns those titles into `tests`-kind link candidates:
11
+ *
12
+ * - Only TEST FILES are scanned (`__tests__/`, `*.test.*`, `*.spec.*`,
13
+ * `*_test.*`) — a spec id inside a source file's message string must never
14
+ * become test evidence (REQ-VSTATE-002.A2).
15
+ * - A candidate is file-derived: it is re-discovered from the file on every
16
+ * extraction pass, so it survives re-index (A3).
17
+ *
18
+ * TARGET CHOICE: the graph has no node for an `it(...)` call — extractors emit
19
+ * nodes for declarations, not for call expressions — so a link that targeted the
20
+ * test case itself would never resolve and would rest at `orphaned`. The link
21
+ * therefore targets the test FILE's `file` node (always present, always
22
+ * resolvable) and carries the matched test titles in `metadata.testTitles`. That
23
+ * is the per-test-case granularity report ingestion needs (REQ-VSTATE-004 maps a
24
+ * reported case to a link by file + title) without inventing node kinds.
25
+ */
26
+ import type { SpecLinkKind } from '../types';
27
+ /** A spec id found inside an `it()` / `test()` title in a test file. */
28
+ export interface TestTitleRef {
29
+ specId: string;
30
+ /** The test title exactly as written (without quotes). */
31
+ title: string;
32
+ /** 1-indexed line of the `it()` / `test()` call. */
33
+ line: number;
34
+ }
35
+ /**
36
+ * True when `filePath` is a recognized test file (REQ-VSTATE-002.A4): it lives
37
+ * under a `__tests__/` (or `tests/`, `spec/`) directory, or its basename carries
38
+ * a `.test.` / `.spec.` / `_test.` marker.
39
+ *
40
+ * This is the SAME predicate the evidence gate uses, so "what counts as a test"
41
+ * can't disagree between the two sides.
42
+ */
43
+ export declare function isRecognizedTestFile(filePath: string): boolean;
44
+ /**
45
+ * True when a `tests`-kind link points at something that is NOT in a recognized
46
+ * test file, or was flagged as such when it was recorded (REQ-VSTATE-002.A4).
47
+ * A fixture, a helper, or a source symbol can be *declared* as evidence, but it
48
+ * must not satisfy the promotion gate.
49
+ */
50
+ export declare function isNonTestEvidence(link: {
51
+ kind: SpecLinkKind;
52
+ targetFilePath: string;
53
+ metadata?: Record<string, unknown>;
54
+ }): boolean;
55
+ /**
56
+ * Every spec id mentioned in an `it()` / `test()` title in `source`.
57
+ *
58
+ * Returns one entry per (spec id, title) pair — a title naming two criteria
59
+ * yields two refs, and the same criterion in two titles yields two refs.
60
+ */
61
+ export declare function scanTestTitleRefs(source: string): TestTitleRef[];
62
+ //# sourceMappingURL=test-title-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-title-links.d.ts","sourceRoot":"","sources":["../../src/resolution/test-title-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;CACd;AAUD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ9D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GAAG,OAAO,CAIV;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAehE"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * Test-title spec links (REQ-VSTATE-002).
4
+ *
5
+ * The repo convention is already `it('does X (REQ-FOO-001.A1)', …)`. That title
6
+ * is the most precise test evidence a spec can have — it names the criterion the
7
+ * test case proves — but nothing read it, so evidence had to be re-declared as a
8
+ * `verifies:` block or an `@verifies` comment on a hoisted named function, and a
9
+ * fixture file could satisfy the evidence gate by accident.
10
+ *
11
+ * This module turns those titles into `tests`-kind link candidates:
12
+ *
13
+ * - Only TEST FILES are scanned (`__tests__/`, `*.test.*`, `*.spec.*`,
14
+ * `*_test.*`) — a spec id inside a source file's message string must never
15
+ * become test evidence (REQ-VSTATE-002.A2).
16
+ * - A candidate is file-derived: it is re-discovered from the file on every
17
+ * extraction pass, so it survives re-index (A3).
18
+ *
19
+ * TARGET CHOICE: the graph has no node for an `it(...)` call — extractors emit
20
+ * nodes for declarations, not for call expressions — so a link that targeted the
21
+ * test case itself would never resolve and would rest at `orphaned`. The link
22
+ * therefore targets the test FILE's `file` node (always present, always
23
+ * resolvable) and carries the matched test titles in `metadata.testTitles`. That
24
+ * is the per-test-case granularity report ingestion needs (REQ-VSTATE-004 maps a
25
+ * reported case to a link by file + title) without inventing node kinds.
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.isRecognizedTestFile = isRecognizedTestFile;
29
+ exports.isNonTestEvidence = isNonTestEvidence;
30
+ exports.scanTestTitleRefs = scanTestTitleRefs;
31
+ const criterion_ids_1 = require("../spec-quality/criterion-ids");
32
+ /**
33
+ * `it(` / `test(` / `bench(` with the usual modifier chains
34
+ * (`it.each`, `test.skip`, `it.runIf(...)`, `it.concurrent.only`) followed by a
35
+ * quoted title. Group 2 is the quote char, group 3 the raw title body.
36
+ */
37
+ const TEST_CALL = /\b(?:it|test|bench)((?:\.\w+)*(?:\([^()]*\))?(?:\.\w+)*)?\s*\(\s*(['"`])((?:\\.|(?!\2)[^\\])*)\2/g;
38
+ /**
39
+ * True when `filePath` is a recognized test file (REQ-VSTATE-002.A4): it lives
40
+ * under a `__tests__/` (or `tests/`, `spec/`) directory, or its basename carries
41
+ * a `.test.` / `.spec.` / `_test.` marker.
42
+ *
43
+ * This is the SAME predicate the evidence gate uses, so "what counts as a test"
44
+ * can't disagree between the two sides.
45
+ */
46
+ function isRecognizedTestFile(filePath) {
47
+ const p = filePath.replace(/\\/g, '/');
48
+ const base = p.split('/').pop() ?? '';
49
+ if (/(^|\/)(__tests__|__test__|tests|spec)(\/|$)/.test(p))
50
+ return true;
51
+ if (/\.(test|spec)\.[^.]+$/.test(base))
52
+ return true;
53
+ if (/_test\.[^.]+$/.test(base))
54
+ return true;
55
+ if (/(^|[^A-Za-z])test_[^/]*\.py$/.test(base))
56
+ return true;
57
+ return false;
58
+ }
59
+ /**
60
+ * True when a `tests`-kind link points at something that is NOT in a recognized
61
+ * test file, or was flagged as such when it was recorded (REQ-VSTATE-002.A4).
62
+ * A fixture, a helper, or a source symbol can be *declared* as evidence, but it
63
+ * must not satisfy the promotion gate.
64
+ */
65
+ function isNonTestEvidence(link) {
66
+ if (link.kind !== 'tests')
67
+ return false;
68
+ if (link.metadata?.nonTestTarget === true)
69
+ return true;
70
+ return !isRecognizedTestFile(link.targetFilePath);
71
+ }
72
+ /**
73
+ * Every spec id mentioned in an `it()` / `test()` title in `source`.
74
+ *
75
+ * Returns one entry per (spec id, title) pair — a title naming two criteria
76
+ * yields two refs, and the same criterion in two titles yields two refs.
77
+ */
78
+ function scanTestTitleRefs(source) {
79
+ const out = [];
80
+ TEST_CALL.lastIndex = 0;
81
+ let m;
82
+ while ((m = TEST_CALL.exec(source)) !== null) {
83
+ const title = m[3];
84
+ if (title === undefined || title.length === 0)
85
+ continue;
86
+ // Template literals with `${}` interpolation are not stable evidence keys —
87
+ // the report carries the interpolated text, which we can't reconstruct.
88
+ if (m[2] === '`' && title.includes('${'))
89
+ continue;
90
+ const line = source.slice(0, m.index).split('\n').length;
91
+ // Shorthand (`REQ-X.A1/A3`) names every criterion it lists (REQ-PIPETRUST-008).
92
+ for (const specId of (0, criterion_ids_1.criterionIdsInText)(title))
93
+ out.push({ specId, title, line });
94
+ }
95
+ return out;
96
+ }
97
+ //# sourceMappingURL=test-title-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-title-links.js","sourceRoot":"","sources":["../../src/resolution/test-title-links.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;;AA8BH,oDAQC;AAQD,8CAQC;AAQD,8CAeC;AA1ED,iEAAmE;AAWnE;;;;GAIG;AACH,MAAM,SAAS,GACb,mGAAmG,CAAC;AAEtG;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAAC,QAAgB;IACnD,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,6CAA6C,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACvE,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,IAIjC;IACC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,MAAc;IAC9C,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;IACxB,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACxD,4EAA4E;QAC5E,wEAAwE;QACxE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACzD,gFAAgF;QAChF,KAAK,MAAM,MAAM,IAAI,IAAA,kCAAkB,EAAC,KAAK,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-parser.d.ts","sourceRoot":"","sources":["../../src/search/query-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,iEAAiE;IACjE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,sFAAsF;IACtF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qEAAqE;IACrE,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAiBD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAiFnD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA2BjF"}
1
+ {"version":3,"file":"query-parser.d.ts","sourceRoot":"","sources":["../../src/search/query-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,iEAAiE;IACjE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,sFAAsF;IACtF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qEAAqE;IACrE,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAiBD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAiFnD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAgCjF"}
@@ -172,6 +172,11 @@ function boundedEditDistance(a, b, maxDist) {
172
172
  return maxDist + 1;
173
173
  [prev, cur] = [cur, prev];
174
174
  }
175
- return prev[bl];
175
+ // Clamp the final cell. The per-row early exit above only runs once per
176
+ // character of `a`, so a short `a` against a long `b` can finish the DP
177
+ // without ever tripping it — leaving an unclamped distance above the
178
+ // promised `maxDist + 1` ceiling, and making the result asymmetric in the
179
+ // argument order (`("ab","bcccca",4)` → 5 but `("bcccca","ab",4)` → 6).
180
+ return Math.min(prev[bl], maxDist + 1);
176
181
  }
177
182
  //# sourceMappingURL=query-parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-parser.js","sourceRoot":"","sources":["../../src/search/query-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-parser.js","sourceRoot":"","sources":["../../src/search/query-parser.ts"],"names":[],"mappings":"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"}
@@ -71,7 +71,7 @@ export class ProjectRegistry {
71
71
  * Exempt `projectPath` from LRU eviction. The server pins its primary:
72
72
  * routes capture the primary instance by reference (`app.primaryCg`), so
73
73
  * an eviction CLOSES a handle they still use and every request 500s with
74
- * "database connection is not open". Surfaced when the /api/events sweep
74
+ * "database connection is not open". Surfaced when a cross-project sweep
75
75
  * started opening many projects through this cache.
76
76
  */
77
77
  pin(projectPath) { this.pinned.add(projectPath); }
@@ -15,12 +15,10 @@
15
15
  * GET /api/claude/compare — per-project cost comparison
16
16
  * GET /api/claude/tips — rule-based tips engine output (minus dismissed)
17
17
  * POST /api/claude/tips/state — persist a tip's Apply/Dismiss state
18
- * GET /api/claude/specship-impact?range=&project= — SpecShip token-impact aggregation
19
18
  * POST /api/claude/ingest — force a one-shot ingest pass
20
19
  */
21
20
  import { writeSseHead } from './sse.js';
22
21
  import { decodeProjectSlug, getLastIngestStats } from '../ingest/index.js';
23
- import { computeSpecshipImpact } from '../ingest/impact-query.js';
24
22
  /**
25
23
  * Normalize a `?project=` filter value to the form stored in
26
24
  * claude_sessions.project_path. The Sessions page (and any other UI
@@ -414,13 +412,6 @@ export async function registerClaudeRoutes(app) {
414
412
  const durationMs = session.started_at && session.ended_at
415
413
  ? Math.max(0, session.ended_at - session.started_at)
416
414
  : 0;
417
- // SpecShip token-impact rollup for this session.
418
- const impact = computeSpecshipImpact(db, { since: 0, sessionId });
419
- const specship = {
420
- spendTokens: impact.spendTokens,
421
- savedTokens: impact.savedTokens,
422
- netTokens: impact.netTokens,
423
- };
424
415
  return {
425
416
  sessionId,
426
417
  byTool,
@@ -429,7 +420,6 @@ export async function registerClaudeRoutes(app) {
429
420
  skills,
430
421
  filesTouched,
431
422
  durationMs,
432
- specship,
433
423
  };
434
424
  });
435
425
  app.get('/api/claude/heatmap', async (req, reply) => {
@@ -836,9 +826,13 @@ export async function registerClaudeRoutes(app) {
836
826
  // unpriced marker instead of a confident $0.00 (REQ-DASHINT-007.A1).
837
827
  unpricedTokens: lastCost === 0 ? (recent[0]?.toks ?? 0) : 0,
838
828
  };
839
- // --- Drift (live graph count, no time series) ---
829
+ // --- Drift (live graph count) ---
830
+ // No prior-window snapshot exists for link state, so there is no delta and
831
+ // no series to report. Both are OMITTED rather than sent as 0 — a 0 delta
832
+ // renders as a confident "no change" the data can't support
833
+ // (REQ-REVINT-007.A2).
840
834
  const driftCount = cg.getSpecQueries().getLinksByState(['drifted', 'broken', 'orphaned']).length;
841
- const drift = { value: driftCount, delta: 0, series: [] };
835
+ const drift = { value: driftCount };
842
836
  // Total ingested sessions (all time, unfiltered). Zero means "nothing
843
837
  // ingested yet" — the dashboard renders enable-ingest guidance instead of
844
838
  // presenting $0 / 0-call zeros as truth (REQ-DESKTOP-020.A4).
@@ -898,12 +892,13 @@ export async function registerClaudeRoutes(app) {
898
892
  // Drifted-link count is only knowable for the PRIMARY project's indexed
899
893
  // graph (compare rows are Claude-cost projects keyed by cwd; only one has a
900
894
  // spec graph loaded here). Attach the real count to the matching project
901
- // row and 0 to the rest, rather than fabricating per-project drift.
895
+ // row and `null` — "not measured" — to the rest. A 0 there reads as
896
+ // "measured, clean", which is a claim we can't make (REQ-REVINT-007.A3).
902
897
  const driftCount = cg.getSpecQueries().getLinksByState(['drifted', 'broken', 'orphaned']).length;
903
898
  const primaryRoot = (cg.getProjectRoot ? cg.getProjectRoot() : '').replace(/\/+$/, '');
904
899
  const projects = rows.map((p) => ({
905
900
  ...p,
906
- drift: p.path.replace(/\/+$/, '') === primaryRoot ? driftCount : 0,
901
+ drift: p.path.replace(/\/+$/, '') === primaryRoot ? driftCount : null,
907
902
  byModel: (byModelByPath.get(p.path) ?? []).sort((a, b) => b.cost - a.cost),
908
903
  topTools: (toolsByPath.get(p.path) ?? [])
909
904
  .sort((a, b) => b.calls - a.calls)
@@ -949,11 +944,16 @@ export async function registerClaudeRoutes(app) {
949
944
  title: `You read ${r.file.split('/').pop()} ${r.n}× in one session — specship_explore covers it`,
950
945
  why: 'Re-reading the same file burns input tokens every turn. A single structural query returns callers, callees, and linked specs at once.',
951
946
  evidence: { session: r.session_id, detail: `Read(${r.file}) × ${r.n}` },
952
- fix: `specship_explore --symbol ${r.file.replace(/\.\w+$/, '').split('/').pop()}`,
947
+ // specship_explore takes a free-text `query` (no --symbol flag) — name
948
+ // the file's basename so the call is copy-pasteable (REQ-AUDFIX-006.A3).
949
+ fix: `specship_explore "${r.file.split('/').pop()}"`,
953
950
  saving: '≈$0.10/read avoided',
954
951
  });
955
952
  }
956
- // Rule 2: "tool returned X tokens" — any single tool call with result_length > 50000.
953
+ // Rule 2: oversized tool result — any single tool call with result_length > 50000.
954
+ // result_length is a CHARACTER count; any token figure is a labeled
955
+ // estimate (~4 chars/token) and the $ figure derives from that estimate,
956
+ // never from the raw char count (REQ-AUDFIX-006.A2).
957
957
  const heavyResults = db.prepare(`
958
958
  SELECT id, session_id, tool_name, input_summary, result_length
959
959
  FROM claude_tool_calls
@@ -962,15 +962,16 @@ export async function registerClaudeRoutes(app) {
962
962
  LIMIT 5
963
963
  `).all(realRoot, mangledRoot);
964
964
  for (const r of heavyResults) {
965
+ const estTokens = Math.round(r.result_length / 4);
965
966
  tips.push({
966
967
  id: 'heavy_result:' + r.id,
967
968
  severity: 'error',
968
969
  icon: 'flame',
969
- title: `${r.tool_name} returned ${Math.round(r.result_length / 1000)}k tokens — try a structural query`,
970
+ title: `${r.tool_name} returned ${Math.round(r.result_length / 1000)}k chars (~${Math.round(estTokens / 1000)}k tokens est.) — try a structural query`,
970
971
  why: 'Tools that dump raw content into context are the dominant cost driver. A structural query returns just what the agent needs.',
971
- evidence: { session: r.session_id, detail: `${r.tool_name}(${r.input_summary.slice(0, 100)}) → ${r.result_length} tokens` },
972
- fix: r.tool_name === 'Bash' ? 'specship_search instead of Bash(grep)' : 'specship_explore on the symbol',
973
- saving: `~$${((r.result_length / 1_000_000) * 15).toFixed(2)} on this call`,
972
+ evidence: { session: r.session_id, detail: `${r.tool_name}(${r.input_summary.slice(0, 100)}) → ${r.result_length} chars (~${estTokens} tokens est.)` },
973
+ fix: r.tool_name === 'Bash' ? 'specship_search "<symbol>" instead of Bash(grep)' : 'specship_explore "<symbol or question>"',
974
+ saving: `~$${((estTokens / 1_000_000) * 15).toFixed(2)} est. on this call`,
974
975
  });
975
976
  }
976
977
  // Rule 3: "cache miss rate" — sessions with > 10 prompts and cache_read_rate < 0.3.
@@ -996,7 +997,9 @@ export async function registerClaudeRoutes(app) {
996
997
  why: 'When the prompt prefix changes every turn, the 1h cache gets invalidated. Pinning a stable system-prompt prefix lets the cache absorb most of your input.',
997
998
  evidence: { session: r.id, detail: `cache_read=${(r.cr / 1_000_000).toFixed(2)}M / total=${(total / 1_000_000).toFixed(2)}M` },
998
999
  fix: 'Pin a stable system-prompt prefix in .claude/settings.json',
999
- saving: '~$X.XX / session (model-dependent)',
1000
+ // Not measurable per session without a model price table — state it
1001
+ // qualitatively rather than render a placeholder (REQ-AUDFIX-006.A1).
1002
+ saving: 'cached input bills at a fraction of fresh input',
1000
1003
  });
1001
1004
  }
1002
1005
  // Rule 4: small-model flounder → escalate (MIXMODEL-DOC, REQ-MIX-002).
@@ -1064,28 +1067,6 @@ export async function registerClaudeRoutes(app) {
1064
1067
  `).run(id, state, Date.now());
1065
1068
  return { ok: true, id, state };
1066
1069
  });
1067
- /**
1068
- * GET /api/claude/specship-impact?range=&project=
1069
- *
1070
- * Aggregate SpecShip token-impact metrics: how many tokens specship calls
1071
- * spent vs. how many tokens' worth of Read calls they displaced (saved),
1072
- * with per-prompt dedup so a file referenced by two specship calls in the
1073
- * same prompt counts only once. See server/src/ingest/impact-query.ts
1074
- * for the full algorithm.
1075
- *
1076
- * Query params:
1077
- * range — 'today' | 'week' (default) | 'month' | 'all'
1078
- * project — project slug (decoded to path) or raw path; omit for all projects
1079
- */
1080
- app.get('/api/claude/specship-impact', async (req, reply) => {
1081
- const cg = requirePrimary(reply);
1082
- if (!cg)
1083
- return;
1084
- const db = getDb(cg);
1085
- const since = rangeStart(rangeKey(req.query.range));
1086
- const project = req.query.project ? normalizeProjectFilter(req.query.project) : undefined;
1087
- return computeSpecshipImpact(db, { since, project });
1088
- });
1089
1070
  /**
1090
1071
  * Force a one-shot ingest pass. Useful for "Refresh" button in the UI.
1091
1072
  */