@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
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Build verification against design.md (DESIGNMD-DOC, REQ-DESIGNMD-008).
3
+ *
4
+ * The pixel eval's last miss was a builder slip, not missing information: a
5
+ * small model closed a container one line early, so a footer landed outside
6
+ * its card. That is mechanically detectable. This extracts the element outline
7
+ * of a built HTML page with the same extractor that wrote design.md, and
8
+ * compares it line by line with design.md's Element outline. Each element line
9
+ * carries its tag, classes, rendering attributes, inline style and nesting, so
10
+ * a match means the structure the design describes is the structure that was
11
+ * built. The builder runs it, fixes what it reports, and runs it again.
12
+ */
13
+ import { CssRule } from './css';
14
+ export interface VerifyMismatch {
15
+ /** 1-based line within the outline. */
16
+ line: number;
17
+ expected: string | null;
18
+ actual: string | null;
19
+ /** For notes: an inline-style or text edge-space difference; 'order' for a rule-order mismatch. */
20
+ kind?: 'style' | 'space' | 'order';
21
+ }
22
+ export interface VerifyResult {
23
+ ok: boolean;
24
+ expectedLines: number;
25
+ actualLines: number;
26
+ mismatches: VerifyMismatch[];
27
+ /** Inline-style or text edge-space differences: reported, never failing. */
28
+ notes: VerifyMismatch[];
29
+ }
30
+ /** The Element outline lines of a design.md, or null when it has none. */
31
+ export declare function designOutline(designMd: string): string[] | null;
32
+ /**
33
+ * Compare two outlines on structure. Inline-style differences are notes (a
34
+ * value moved into a stylesheet rule renders the same). A text edge-space
35
+ * difference fails when the space sits next to a sibling, where it renders
36
+ * ("Why now:" + " You are…" lost its space in a live-capture build); at the
37
+ * start or end of the parent it is a note. Nesting, tags, classes,
38
+ * attributes, text and SVG are what this check guarantees.
39
+ */
40
+ export declare function compareOutlines(expected: string[], actual: string[], limit?: number): VerifyResult;
41
+ /** The longhand properties a declaration writes, so shorthands overlap their parts. */
42
+ export declare function longhands(property: string): string[];
43
+ interface ElementShape {
44
+ tag: string;
45
+ classes: Set<string>;
46
+ }
47
+ /** Tag and classes of each element line in an outline (`div.card.p-4[...] { … }`). */
48
+ export declare function outlineElements(outline: string[]): ElementShape[];
49
+ /**
50
+ * Stylesheet rule order (cascade). For every pair of design rules that the
51
+ * build also has and that write an overlapping property, the build must keep
52
+ * the design's order — otherwise the later one wins the other way round.
53
+ * Only pairs some element of the design actually matches both of count:
54
+ * reordering `hr` and `body` changes nothing.
55
+ */
56
+ export declare function compareRuleOrder(design: CssRule[], build: CssRule[], elements: ElementShape[], limit?: number): VerifyMismatch[];
57
+ /** Verify a built HTML page against a design.md's Element outline and rule order. */
58
+ export declare function verifyBuild(designMd: string, buildPath: string, opts: {
59
+ projectRoot: string;
60
+ }): VerifyResult;
61
+ /** The Style rules (verbatim) section of a design.md, parsed back into rules. */
62
+ export declare function designStyleRules(designMd: string): CssRule[] | null;
63
+ export declare function formatVerify(result: VerifyResult, buildPath: string): string;
64
+ export {};
65
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/design-md/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAY,MAAM,OAAO,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mGAAmG;IACnG,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,4EAA4E;IAC5E,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAU/D;AAuDD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,YAAY,CA6B7F;AAID,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBpD;AAID,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACtB;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAUjE;AAuCD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,SAAI,GAAG,cAAc,EAAE,CAwB3H;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAQ5G;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,IAAI,CAkBnE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAoB5E"}
@@ -0,0 +1,311 @@
1
+ "use strict";
2
+ /**
3
+ * Build verification against design.md (DESIGNMD-DOC, REQ-DESIGNMD-008).
4
+ *
5
+ * The pixel eval's last miss was a builder slip, not missing information: a
6
+ * small model closed a container one line early, so a footer landed outside
7
+ * its card. That is mechanically detectable. This extracts the element outline
8
+ * of a built HTML page with the same extractor that wrote design.md, and
9
+ * compares it line by line with design.md's Element outline. Each element line
10
+ * carries its tag, classes, rendering attributes, inline style and nesting, so
11
+ * a match means the structure the design describes is the structure that was
12
+ * built. The builder runs it, fixes what it reports, and runs it again.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.designOutline = designOutline;
16
+ exports.compareOutlines = compareOutlines;
17
+ exports.longhands = longhands;
18
+ exports.outlineElements = outlineElements;
19
+ exports.compareRuleOrder = compareRuleOrder;
20
+ exports.verifyBuild = verifyBuild;
21
+ exports.designStyleRules = designStyleRules;
22
+ exports.formatVerify = formatVerify;
23
+ const css_1 = require("./css");
24
+ const extract_1 = require("./extract");
25
+ /** The Element outline lines of a design.md, or null when it has none. */
26
+ function designOutline(designMd) {
27
+ const head = designMd.indexOf('### Element outline');
28
+ if (head === -1)
29
+ return null;
30
+ const open = designMd.indexOf('```text\n', head);
31
+ if (open === -1)
32
+ return null;
33
+ const close = designMd.indexOf('\n```', open + 8);
34
+ return designMd
35
+ .slice(open + 8, close === -1 ? undefined : close)
36
+ .split('\n')
37
+ .filter((l) => l.length > 0 && !l.startsWith('… truncated'));
38
+ }
39
+ /** Sort the attributes inside every tag of an SVG markup string. */
40
+ function normalizeMarkup(markup) {
41
+ return markup.replace(/<([a-zA-Z][\w:-]*)((?:\s+[^\s=>]+(?:="[^"]*")?)*)\s*(\/?)>/g, (_m, tag, attrs, slash) => {
42
+ const list = (attrs.match(/[^\s=>]+(?:="[^"]*")?/g) ?? []).sort();
43
+ return `<${tag}${list.length ? ` ${list.join(' ')}` : ''}${slash}>`;
44
+ });
45
+ }
46
+ /** Canonical form of one outline line: SVG attribute order does not matter. */
47
+ function normalizeLine(line) {
48
+ const at = line.indexOf(' = <svg');
49
+ if (at === -1)
50
+ return line;
51
+ // The line's label already carries the svg's classes; a class attribute on
52
+ // the root tag of the markup is the same information twice.
53
+ const markup = line.slice(at + 3).replace(/^<svg([^>]*?)\s+class="[^"]*"/, '<svg$1');
54
+ return line.slice(0, at + 3) + normalizeMarkup(markup);
55
+ }
56
+ /**
57
+ * The structural part of a line: nesting, tag, classes, attributes, text and
58
+ * SVG markup, without the inline `{ … }` style. Moving a declaration from an
59
+ * inline style into a stylesheet rule renders the same; structure does not.
60
+ */
61
+ function structure(line) {
62
+ return normalizeLine(line).replace(/ \{ [^{}]* \}(?= = <svg|$)/, '');
63
+ }
64
+ const indentOf = (line) => line.length - line.trimStart().length;
65
+ /**
66
+ * Does the outline line at `i` have a sibling before / after it under the same
67
+ * parent? An edge space next to a sibling renders ("Why now:" + " You are…");
68
+ * at the very start or end of its parent it does not.
69
+ */
70
+ function siblings(lines, i) {
71
+ const d = indentOf(lines[i]);
72
+ const before = i > 0 && indentOf(lines[i - 1]) >= d;
73
+ let after = false;
74
+ for (let k = i + 1; k < lines.length; k++) {
75
+ const dk = indentOf(lines[k]);
76
+ if (dk < d)
77
+ break;
78
+ if (dk === d) {
79
+ after = true;
80
+ break;
81
+ }
82
+ }
83
+ return { before, after };
84
+ }
85
+ /** Two text lines that differ only in edge whitespace inside the quotes. */
86
+ function edgeSpaceOnly(a, b) {
87
+ const qa = /^(\s*)"(.*)"$/.exec(a);
88
+ const qb = /^(\s*)"(.*)"$/.exec(b);
89
+ return !!qa && !!qb && qa[1] === qb[1] && qa[2].trim() === qb[2].trim() && qa[2] !== qb[2];
90
+ }
91
+ /**
92
+ * Compare two outlines on structure. Inline-style differences are notes (a
93
+ * value moved into a stylesheet rule renders the same). A text edge-space
94
+ * difference fails when the space sits next to a sibling, where it renders
95
+ * ("Why now:" + " You are…" lost its space in a live-capture build); at the
96
+ * start or end of the parent it is a note. Nesting, tags, classes,
97
+ * attributes, text and SVG are what this check guarantees.
98
+ */
99
+ function compareOutlines(expected, actual, limit = 5) {
100
+ const mismatches = [];
101
+ const notes = [];
102
+ const n = Math.max(expected.length, actual.length);
103
+ for (let i = 0; i < n; i++) {
104
+ const e = expected[i] ?? null;
105
+ const a = actual[i] ?? null;
106
+ if (e !== null && a !== null && normalizeLine(e) === normalizeLine(a))
107
+ continue;
108
+ if (e !== null && a !== null && structure(e) === structure(a)) {
109
+ if (notes.length < limit)
110
+ notes.push({ line: i + 1, expected: e, actual: a, kind: 'style' });
111
+ continue;
112
+ }
113
+ if (e !== null && a !== null && edgeSpaceOnly(e, a)) {
114
+ const te = e.trim().slice(1, -1);
115
+ const ta = a.trim().slice(1, -1);
116
+ const sib = siblings(expected, i);
117
+ const leadDiffers = /^\s/.test(te) !== /^\s/.test(ta);
118
+ const trailDiffers = /\s$/.test(te) !== /\s$/.test(ta);
119
+ if ((leadDiffers && sib.before) || (trailDiffers && sib.after)) {
120
+ if (mismatches.length < limit)
121
+ mismatches.push({ line: i + 1, expected: e, actual: a });
122
+ }
123
+ else if (notes.length < limit) {
124
+ notes.push({ line: i + 1, expected: e, actual: a, kind: 'space' });
125
+ }
126
+ continue;
127
+ }
128
+ if (e === a)
129
+ continue;
130
+ if (mismatches.length < limit)
131
+ mismatches.push({ line: i + 1, expected: e, actual: a });
132
+ }
133
+ return { ok: mismatches.length === 0, expectedLines: expected.length, actualLines: actual.length, mismatches, notes };
134
+ }
135
+ const SIDES = ['top', 'right', 'bottom', 'left'];
136
+ /** The longhand properties a declaration writes, so shorthands overlap their parts. */
137
+ function longhands(property) {
138
+ const p = property.toLowerCase();
139
+ if (p === 'border')
140
+ return SIDES.flatMap((s) => ['width', 'style', 'color'].map((k) => `border-${s}-${k}`));
141
+ const side = /^border-(top|right|bottom|left)$/.exec(p);
142
+ if (side)
143
+ return ['width', 'style', 'color'].map((k) => `border-${side[1]}-${k}`);
144
+ const kind = /^border-(width|style|color)$/.exec(p);
145
+ if (kind)
146
+ return SIDES.map((s) => `border-${s}-${kind[1]}`);
147
+ if (p === 'border-radius')
148
+ return ['top-left', 'top-right', 'bottom-right', 'bottom-left'].map((c) => `border-${c}-radius`);
149
+ if (p === 'margin' || p === 'padding')
150
+ return SIDES.map((s) => `${p}-${s}`);
151
+ if (p === 'inset')
152
+ return SIDES;
153
+ if (p === 'gap')
154
+ return ['row-gap', 'column-gap'];
155
+ if (p === 'background')
156
+ return ['background-color', 'background-image', 'background-position', 'background-size', 'background-repeat'];
157
+ if (p === 'font')
158
+ return ['font-style', 'font-weight', 'font-size', 'line-height', 'font-family'];
159
+ if (p === 'outline')
160
+ return ['outline-width', 'outline-style', 'outline-color'];
161
+ if (p === 'transition')
162
+ return ['transition-property', 'transition-duration', 'transition-timing-function', 'transition-delay'];
163
+ if (p === 'animation')
164
+ return ['animation-name', 'animation-duration', 'animation-timing-function', 'animation-delay', 'animation-iteration-count'];
165
+ return [p];
166
+ }
167
+ const ruleKey = (r) => `${r.media ?? ''}|${r.selector}`;
168
+ /** Tag and classes of each element line in an outline (`div.card.p-4[...] { … }`). */
169
+ function outlineElements(outline) {
170
+ const out = [];
171
+ for (const raw of outline) {
172
+ const line = raw.trim();
173
+ if (!line || line.startsWith('"'))
174
+ continue;
175
+ const head = line.split(/[\s[{]/)[0];
176
+ const [tag, ...rest] = head.split('.');
177
+ out.push({ tag: tag.replace(/#.*$/, ''), classes: new Set(rest) });
178
+ }
179
+ return out;
180
+ }
181
+ /** The final compound of each selector in a list: its tag (or '') and classes. */
182
+ function subjects(selector) {
183
+ return selector.split(',').map((part) => {
184
+ const compounds = part.trim().split(/\s*[\s>+~]\s*/);
185
+ const last = (compounds[compounds.length - 1] ?? '').replace(/\[[^\]]*\]/g, '');
186
+ const classes = [];
187
+ // Class names with escapes (`.hover\:bg-x`); stop at an unescaped `:` (pseudo).
188
+ for (const m of last.matchAll(/\.((?:\\.|[\w-])+)/g))
189
+ classes.push(m[1].replace(/\\(.)/g, '$1'));
190
+ const tag = /^[a-zA-Z][\w-]*/.exec(last)?.[0]?.toLowerCase() ?? '';
191
+ return { tag, classes };
192
+ });
193
+ }
194
+ /**
195
+ * True when every property both rules write is written with the same value
196
+ * in each (so whichever comes last, the result is identical). A shorthand
197
+ * against a longhand is never treated as equal.
198
+ */
199
+ function sameValuesWhereTheyOverlap(a, b) {
200
+ const la = new Set(a.declarations.flatMap((d) => longhands(d.property)));
201
+ for (const db of b.declarations) {
202
+ if (!longhands(db.property).some((p) => la.has(p)))
203
+ continue;
204
+ const da = a.declarations.find((d) => d.property === db.property);
205
+ if (!da || da.value !== db.value)
206
+ return false;
207
+ }
208
+ return true;
209
+ }
210
+ /** Could one element match both selectors? Judged against the design's own elements. */
211
+ function shareAnElement(a, b, elements) {
212
+ const sa = subjects(a);
213
+ const sb = subjects(b);
214
+ const fits = (el, s) => (!s.tag || s.tag === '*' || s.tag === el.tag) && s.classes.every((c) => el.classes.has(c));
215
+ return elements.some((el) => sa.some((x) => fits(el, x)) && sb.some((y) => fits(el, y)));
216
+ }
217
+ /**
218
+ * Stylesheet rule order (cascade). For every pair of design rules that the
219
+ * build also has and that write an overlapping property, the build must keep
220
+ * the design's order — otherwise the later one wins the other way round.
221
+ * Only pairs some element of the design actually matches both of count:
222
+ * reordering `hr` and `body` changes nothing.
223
+ */
224
+ function compareRuleOrder(design, build, elements, limit = 5) {
225
+ const sheet = (rules) => rules.filter((r) => !r.selector.startsWith('inline '));
226
+ const pos = new Map();
227
+ sheet(build).forEach((r, i) => { if (!pos.has(ruleKey(r)))
228
+ pos.set(ruleKey(r), i); });
229
+ const present = sheet(design).filter((r) => pos.has(ruleKey(r)));
230
+ const props = present.map((r) => new Set(r.declarations.flatMap((d) => longhands(d.property))));
231
+ const out = [];
232
+ for (let j = 1; j < present.length && out.length < limit; j++) {
233
+ for (let i = 0; i < j; i++) {
234
+ if (ruleKey(present[i]) === ruleKey(present[j]))
235
+ continue;
236
+ if (pos.get(ruleKey(present[i])) < pos.get(ruleKey(present[j])))
237
+ continue;
238
+ if (![...props[j]].some((p) => props[i].has(p)))
239
+ continue;
240
+ if (sameValuesWhereTheyOverlap(present[i], present[j]))
241
+ continue;
242
+ if (!shareAnElement(present[i].selector, present[j].selector, elements))
243
+ continue;
244
+ out.push({
245
+ line: j + 1,
246
+ expected: `${present[i].selector} before ${present[j].selector}`,
247
+ actual: `${present[j].selector} before ${present[i].selector}`,
248
+ kind: 'order',
249
+ });
250
+ break;
251
+ }
252
+ }
253
+ return out;
254
+ }
255
+ /** Verify a built HTML page against a design.md's Element outline and rule order. */
256
+ function verifyBuild(designMd, buildPath, opts) {
257
+ const expected = designOutline(designMd);
258
+ if (!expected)
259
+ throw new extract_1.DesignSourceError('design.md has no Element outline to verify against');
260
+ const built = (0, extract_1.extractDesign)([buildPath], opts);
261
+ const result = compareOutlines(expected, built.outline);
262
+ const designRules = designStyleRules(designMd);
263
+ const order = designRules ? compareRuleOrder(designRules, built.rules, outlineElements(expected)) : [];
264
+ return { ...result, ok: result.ok && order.length === 0, mismatches: [...result.mismatches, ...order] };
265
+ }
266
+ /** The Style rules (verbatim) section of a design.md, parsed back into rules. */
267
+ function designStyleRules(designMd) {
268
+ const head = designMd.indexOf('### Style rules (verbatim)');
269
+ if (head === -1)
270
+ return null;
271
+ const end = designMd.indexOf('<!-- design-md:generated:end -->', head);
272
+ const section = designMd.slice(head, end === -1 ? undefined : end);
273
+ const rules = [];
274
+ let media;
275
+ let inCss = false;
276
+ for (const line of section.split('\n')) {
277
+ if (line.startsWith('#### '))
278
+ media = line.slice(5).trim();
279
+ else if (line.startsWith('```css'))
280
+ inCss = true;
281
+ else if (line.startsWith('```'))
282
+ inCss = false;
283
+ else if (inCss && line.trim()) {
284
+ const parsed = (0, css_1.parseCss)(line);
285
+ for (const r of parsed.rules)
286
+ rules.push(media ? { ...r, media } : r);
287
+ }
288
+ }
289
+ return rules;
290
+ }
291
+ function formatVerify(result, buildPath) {
292
+ const noteLines = result.notes.map((m) => m.kind === 'space'
293
+ ? ` note, line ${m.line}: text edge spaces differ — expected ${m.expected.trim()}, built ${m.actual.trim()}`
294
+ : ` note, line ${m.line}: inline style differs (fine if a stylesheet rule supplies the same values) — expected ${m.expected.trim()}`);
295
+ if (result.ok)
296
+ return [`${buildPath} matches design.md's element outline (${result.expectedLines} lines)`, ...noteLines].join('\n');
297
+ const lines = [
298
+ `${buildPath} does not match design.md's element outline (expected ${result.expectedLines} lines, built ${result.actualLines}). First difference(s):`,
299
+ ];
300
+ for (const m of result.mismatches) {
301
+ if (m.kind === 'order') {
302
+ lines.push(` rule order: the design has ${m.expected}; the build has ${m.actual} — a later rule overrides an earlier one`);
303
+ continue;
304
+ }
305
+ lines.push(` line ${m.line}:`, ` expected: ${m.expected ?? '(nothing — the build has extra elements)'}`, ` built: ${m.actual ?? '(nothing — the build is missing elements)'}`);
306
+ }
307
+ lines.push(...noteLines);
308
+ lines.push('Fix the build so each element has the same nesting (indentation), classes, attributes, inline style and text as the outline, and its stylesheet rules keep the order Style rules lists them, then verify again.');
309
+ return lines.join('\n');
310
+ }
311
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/design-md/verify.ts"],"names":[],"mappings":"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"}
@@ -36,4 +36,11 @@ export declare function changedFilesSince(projectRoot: string, ref: string): str
36
36
  * are silently omitted.
37
37
  */
38
38
  export declare function workingTreeDiffText(projectRoot: string, ref?: string): string;
39
+ /**
40
+ * The content of `file` (project-relative) at `ref`, or null when the file did
41
+ * not exist there (REQ-MULTIDEV-002). Reads git's object store only — no index
42
+ * or checkout of the ref is needed, so it works in a fresh CI clone. Callers
43
+ * validate the ref first (`changedFilesSince` throws `InvalidRefError`).
44
+ */
45
+ export declare function existedAtRef(projectRoot: string, ref: string, file: string): string | null;
39
46
  //# sourceMappingURL=changed-files.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"changed-files.d.ts","sourceRoot":"","sources":["../../src/enforce/changed-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,qEAAqE;AACrE,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAQzC;AAWD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CA2B7E"}
1
+ {"version":3,"file":"changed-files.d.ts","sourceRoot":"","sources":["../../src/enforce/changed-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,qEAAqE;AACrE,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAQzC;AAWD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CA2B7E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ1F"}
@@ -16,6 +16,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.InvalidRefError = void 0;
17
17
  exports.changedFilesSince = changedFilesSince;
18
18
  exports.workingTreeDiffText = workingTreeDiffText;
19
+ exports.existedAtRef = existedAtRef;
19
20
  const child_process_1 = require("child_process");
20
21
  const fs_1 = require("fs");
21
22
  const path_1 = require("path");
@@ -111,4 +112,20 @@ function workingTreeDiffText(projectRoot, ref = 'HEAD') {
111
112
  }
112
113
  return parts.join('\n');
113
114
  }
115
+ /**
116
+ * The content of `file` (project-relative) at `ref`, or null when the file did
117
+ * not exist there (REQ-MULTIDEV-002). Reads git's object store only — no index
118
+ * or checkout of the ref is needed, so it works in a fresh CI clone. Callers
119
+ * validate the ref first (`changedFilesSince` throws `InvalidRefError`).
120
+ */
121
+ function existedAtRef(projectRoot, ref, file) {
122
+ try {
123
+ // `<ref>:./<path>` resolves relative to cwd, so a project root that sits
124
+ // below the repository root still addresses the right blob.
125
+ return git(projectRoot, ['show', `${ref}:./${(0, enforce_1.normalizePath)(file)}`]);
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }
114
131
  //# sourceMappingURL=changed-files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"changed-files.js","sourceRoot":"","sources":["../../src/enforce/changed-files.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAqCH,8CAwBC;AAYD,kDA2BC;AAlGD,iDAA6C;AAC7C,2BAAkC;AAClC,+BAA4B;AAC5B,uCAA0C;AAE1C,qEAAqE;AACrE,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,GAAW,EAAE,MAAe;QACtC,KAAK,CACH,qCAAqC,GAAG,EAAE;YACxC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,sEAAsE,CACzE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AATD,0CASC;AAED,SAAS,GAAG,CAAC,WAAmB,EAAE,IAAc;IAC9C,OAAO,IAAA,4BAAY,EAAC,KAAK,EAAE,IAAI,EAAE;QAC/B,GAAG,EAAE,WAAW;QAChB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,iBAAiB,CAAC,WAAmB,EAAE,GAAW;IAChE,IAAI,CAAC;QACH,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,yBAAyB,WAAW,mDAAmD,CACxF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,eAAe,CAAC,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,OAAO,GAAG,CAAC,GAAW,EAAQ,EAAE;QACpC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,IAAA,uBAAa,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,mBAAmB,CAAC,WAAmB,EAAE,GAAG,GAAG,MAAM;IACnE,MAAM,KAAK,GAAa,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;SAC/E,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,SAAS,CAAC,SAAS;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;gBAAE,KAAK,CAAC,GAAG,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CACR;gBACE,gBAAgB,IAAI,MAAM,IAAI,EAAE;gBAChC,eAAe;gBACf,SAAS,IAAI,EAAE;gBACf,cAAc,KAAK,CAAC,MAAM,KAAK;gBAC/B,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"changed-files.js","sourceRoot":"","sources":["../../src/enforce/changed-files.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,7 @@ import { FitnessReport } from '../fitness/fitness';
19
19
  import { MaintainabilityReport } from '../graph/maintainability';
20
20
  import { SuppressionFinding } from './suppressions';
21
21
  import { MutationConfig, MutationDeps } from './mutation';
22
- export type CheckName = 'drift' | 'fitness' | 'maintainability' | 'behaviour' | 'suppressions' | 'mutation';
22
+ export type CheckName = 'drift' | 'fitness' | 'maintainability' | 'behaviour' | 'suppressions' | 'mutation' | 'undeclaredLinks' | 'branchBroken';
23
23
  /**
24
24
  * Project-relative, forward-slashed, no `./` prefix. Link target paths, spec
25
25
  * source paths and git's output all have to compare in one shape before
@@ -34,6 +34,10 @@ export interface GateConfig {
34
34
  behaviour?: boolean;
35
35
  suppressions?: boolean;
36
36
  mutation?: boolean;
37
+ /** Links that exist only in the index (REQ-MULTIDEV-002). */
38
+ undeclaredLinks?: boolean;
39
+ /** Links the branch broke relative to `--since <ref>` (REQ-MULTIDEV-002). */
40
+ branchBroken?: boolean;
37
41
  }
38
42
  export interface EnforceConfig {
39
43
  gate?: GateConfig;
@@ -73,7 +77,37 @@ export interface EnforceDeps {
73
77
  suppressions?: SuppressionFinding[];
74
78
  /** Mutation-score snapshot (REQ-QGATE-002); absent → check omitted (A1). */
75
79
  mutation?: MutationDeps;
80
+ /**
81
+ * Every spec-link row in the index (REQ-MULTIDEV-002) — feeds the
82
+ * undeclared-links check. Absent → the check is omitted.
83
+ */
84
+ links?: SpecLink[];
85
+ /**
86
+ * Currently orphaned/broken links, each marked with whether its target
87
+ * resolved at the `--since` ref (REQ-MULTIDEV-002). Present only for a
88
+ * `--since` run; absent → the branch-broken check is omitted.
89
+ */
90
+ brokenAtRef?: BrokenAtRefEntry[];
91
+ }
92
+ /** One orphaned/broken link and whether its target existed at the ref. */
93
+ export interface BrokenAtRefEntry {
94
+ link: SpecLink;
95
+ resolvedAtRef: boolean;
96
+ /** The ref compared against, for the finding text. */
97
+ ref: string;
76
98
  }
99
+ /**
100
+ * Undeclared links (REQ-MULTIDEV-002.A1): an `agent-asserted` row with no
101
+ * declared twin — no `spec-declaration` or `code-comment` row for the same
102
+ * spec, target and kind. A fresh clone never sees it.
103
+ */
104
+ export declare function undeclaredLinkFindings(links: SpecLink[]): string[];
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
+ export declare function branchBrokenFindings(entries: BrokenAtRefEntry[]): string[];
77
111
  /**
78
112
  * Change-scoped evaluation (REQ-AUTHG-006): restrict the link-scoped checks to
79
113
  * the requirements a set of changed files reaches. Absent → whole repo, the
@@ -1 +1 @@
1
- {"version":3,"file":"enforce.d.ts","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"enforce.d.ts","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":"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"}