paperlint 3.1.3 → 4.0.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 (527) hide show
  1. package/.github/workflows/ci.yml +12 -7
  2. package/CLAUDE.md +5 -5
  3. package/CONTRIBUTING.md +34 -5
  4. package/dist/adapters/banal/failure.d.ts +1 -7
  5. package/dist/adapters/banal/failure.d.ts.map +1 -1
  6. package/dist/adapters/banal/failure.js +5 -7
  7. package/dist/adapters/banal/failure.js.map +1 -1
  8. package/dist/adapters/banal/index.d.ts.map +1 -1
  9. package/dist/adapters/banal/index.js +4 -3
  10. package/dist/adapters/banal/index.js.map +1 -1
  11. package/dist/adapters/banal/install.d.ts.map +1 -1
  12. package/dist/adapters/banal/install.js +4 -3
  13. package/dist/adapters/banal/install.js.map +1 -1
  14. package/dist/adapters/banal/invocation.d.ts +10 -5
  15. package/dist/adapters/banal/invocation.d.ts.map +1 -1
  16. package/dist/adapters/banal/invocation.js +13 -1
  17. package/dist/adapters/banal/invocation.js.map +1 -1
  18. package/dist/adapters/banal/locate.d.ts +12 -9
  19. package/dist/adapters/banal/locate.d.ts.map +1 -1
  20. package/dist/adapters/banal/locate.js +19 -12
  21. package/dist/adapters/banal/locate.js.map +1 -1
  22. package/dist/adapters/banal/run.d.ts +10 -1
  23. package/dist/adapters/banal/run.d.ts.map +1 -1
  24. package/dist/adapters/banal/run.js +8 -4
  25. package/dist/adapters/banal/run.js.map +1 -1
  26. package/dist/adapters/banal/settings.d.ts +1 -1
  27. package/dist/adapters/banal/settings.d.ts.map +1 -1
  28. package/dist/adapters/banal/settings.js +2 -1
  29. package/dist/adapters/banal/settings.js.map +1 -1
  30. package/dist/adapters/memory/index.d.ts.map +1 -1
  31. package/dist/adapters/memory/index.js +8 -2
  32. package/dist/adapters/memory/index.js.map +1 -1
  33. package/dist/adapters/node/files.io.d.ts.map +1 -1
  34. package/dist/adapters/node/files.io.js +2 -1
  35. package/dist/adapters/node/files.io.js.map +1 -1
  36. package/dist/adapters/node/process.io.d.ts +5 -7
  37. package/dist/adapters/node/process.io.d.ts.map +1 -1
  38. package/dist/adapters/node/process.io.js +4 -3
  39. package/dist/adapters/node/process.io.js.map +1 -1
  40. package/dist/adapters/node/workspace.io.d.ts.map +1 -1
  41. package/dist/adapters/node/workspace.io.js +4 -2
  42. package/dist/adapters/node/workspace.io.js.map +1 -1
  43. package/dist/adapters/pdfjs/fill.d.ts.map +1 -1
  44. package/dist/adapters/pdfjs/fill.js +13 -7
  45. package/dist/adapters/pdfjs/fill.js.map +1 -1
  46. package/dist/adapters/references/index.d.ts.map +1 -1
  47. package/dist/adapters/references/index.js +8 -7
  48. package/dist/adapters/references/index.js.map +1 -1
  49. package/dist/adapters/references/pool.d.ts.map +1 -1
  50. package/dist/adapters/references/pool.js +4 -5
  51. package/dist/adapters/references/pool.js.map +1 -1
  52. package/dist/adapters/references/reach.io.d.ts.map +1 -1
  53. package/dist/adapters/references/reach.io.js +2 -1
  54. package/dist/adapters/references/reach.io.js.map +1 -1
  55. package/dist/build-engine.d.ts +1 -1
  56. package/dist/build-engine.d.ts.map +1 -1
  57. package/dist/build-engine.js +10 -3
  58. package/dist/build-engine.js.map +1 -1
  59. package/dist/build.d.ts +2 -3
  60. package/dist/build.d.ts.map +1 -1
  61. package/dist/build.js +19 -17
  62. package/dist/build.js.map +1 -1
  63. package/dist/caller-path.d.ts +3 -0
  64. package/dist/caller-path.d.ts.map +1 -0
  65. package/dist/caller-path.js +13 -0
  66. package/dist/caller-path.js.map +1 -0
  67. package/dist/cli.d.ts +10 -17
  68. package/dist/cli.d.ts.map +1 -1
  69. package/dist/cli.js +93 -46
  70. package/dist/cli.js.map +1 -1
  71. package/dist/doctor.d.ts +12 -3
  72. package/dist/doctor.d.ts.map +1 -1
  73. package/dist/doctor.js +5 -3
  74. package/dist/doctor.js.map +1 -1
  75. package/dist/domain/lookup-cache.d.ts.map +1 -1
  76. package/dist/domain/lookup-cache.js +10 -8
  77. package/dist/domain/lookup-cache.js.map +1 -1
  78. package/dist/domain/paths.d.ts +8 -2
  79. package/dist/domain/paths.d.ts.map +1 -1
  80. package/dist/domain/paths.js +12 -1
  81. package/dist/domain/paths.js.map +1 -1
  82. package/dist/domain/ready.d.ts +24 -0
  83. package/dist/domain/ready.d.ts.map +1 -0
  84. package/dist/domain/ready.js +11 -0
  85. package/dist/domain/ready.js.map +1 -0
  86. package/dist/domain/record.d.ts +8 -0
  87. package/dist/domain/record.d.ts.map +1 -0
  88. package/dist/domain/record.js +8 -0
  89. package/dist/domain/record.js.map +1 -0
  90. package/dist/domain/sha256.d.ts.map +1 -1
  91. package/dist/domain/sha256.js +4 -2
  92. package/dist/domain/sha256.js.map +1 -1
  93. package/dist/domain/text.d.ts +12 -0
  94. package/dist/domain/text.d.ts.map +1 -1
  95. package/dist/domain/text.js +17 -0
  96. package/dist/domain/text.js.map +1 -1
  97. package/dist/engine.d.ts +23 -22
  98. package/dist/engine.d.ts.map +1 -1
  99. package/dist/engine.js +4 -3
  100. package/dist/engine.js.map +1 -1
  101. package/dist/eslint-rules/bib-reachable-entry.d.ts +22 -0
  102. package/dist/eslint-rules/bib-reachable-entry.d.ts.map +1 -0
  103. package/dist/eslint-rules/bib-reachable-entry.js +75 -0
  104. package/dist/eslint-rules/bib-reachable-entry.js.map +1 -0
  105. package/dist/eslint-rules/install-path-literals.d.ts +80 -0
  106. package/dist/eslint-rules/install-path-literals.d.ts.map +1 -0
  107. package/dist/eslint-rules/install-path-literals.js +105 -0
  108. package/dist/eslint-rules/install-path-literals.js.map +1 -0
  109. package/dist/eslint-rules/latex-language.d.ts +136 -0
  110. package/dist/eslint-rules/latex-language.d.ts.map +1 -0
  111. package/dist/eslint-rules/latex-language.js +639 -0
  112. package/dist/eslint-rules/latex-language.js.map +1 -0
  113. package/dist/eslint-rules/paper-research-question.d.ts +31 -0
  114. package/dist/eslint-rules/paper-research-question.d.ts.map +1 -0
  115. package/dist/eslint-rules/paper-research-question.js +188 -0
  116. package/dist/eslint-rules/paper-research-question.js.map +1 -0
  117. package/dist/eslint-rules/paper-stages.d.ts +83 -0
  118. package/dist/eslint-rules/paper-stages.d.ts.map +1 -0
  119. package/dist/eslint-rules/paper-stages.js +358 -0
  120. package/dist/eslint-rules/paper-stages.js.map +1 -0
  121. package/dist/eslint-rules/paper-typography.d.ts +74 -0
  122. package/dist/eslint-rules/paper-typography.d.ts.map +1 -0
  123. package/dist/eslint-rules/paper-typography.js +404 -0
  124. package/dist/eslint-rules/paper-typography.js.map +1 -0
  125. package/dist/eslint-rules/papers.d.ts +42 -0
  126. package/dist/eslint-rules/papers.d.ts.map +1 -0
  127. package/dist/eslint-rules/papers.js +145 -0
  128. package/dist/eslint-rules/papers.js.map +1 -0
  129. package/dist/eslint-rules/pdf-last-page-balance.d.ts +72 -0
  130. package/dist/eslint-rules/pdf-last-page-balance.d.ts.map +1 -0
  131. package/dist/eslint-rules/pdf-last-page-balance.js +237 -0
  132. package/dist/eslint-rules/pdf-last-page-balance.js.map +1 -0
  133. package/dist/eslint-rules/review-frontmatter.d.ts +57 -0
  134. package/dist/eslint-rules/review-frontmatter.d.ts.map +1 -0
  135. package/dist/eslint-rules/review-frontmatter.js +126 -0
  136. package/dist/eslint-rules/review-frontmatter.js.map +1 -0
  137. package/dist/eslint-rules/review-frontmatter.schema.json +36 -0
  138. package/dist/eslint-rules/rule-context.d.ts +55 -0
  139. package/dist/eslint-rules/rule-context.d.ts.map +1 -0
  140. package/dist/eslint-rules/rule-context.js +9 -0
  141. package/dist/eslint-rules/rule-context.js.map +1 -0
  142. package/dist/eslint-rules/sibling-frontmatter.d.ts +25 -0
  143. package/dist/eslint-rules/sibling-frontmatter.d.ts.map +1 -0
  144. package/dist/eslint-rules/sibling-frontmatter.js +16 -0
  145. package/dist/eslint-rules/sibling-frontmatter.js.map +1 -0
  146. package/dist/eslint-rules/sibling-frontmatter.schema.json +14 -0
  147. package/dist/eslint-rules/temp-root-realpath.d.ts +71 -0
  148. package/dist/eslint-rules/temp-root-realpath.d.ts.map +1 -0
  149. package/dist/eslint-rules/temp-root-realpath.js +139 -0
  150. package/dist/eslint-rules/temp-root-realpath.js.map +1 -0
  151. package/dist/eslint-rules/tex-build.d.ts +35 -0
  152. package/dist/eslint-rules/tex-build.d.ts.map +1 -0
  153. package/dist/eslint-rules/tex-build.js +313 -0
  154. package/dist/eslint-rules/tex-build.js.map +1 -0
  155. package/dist/facts-file.d.ts.map +1 -1
  156. package/dist/facts-file.js +31 -27
  157. package/dist/facts-file.js.map +1 -1
  158. package/dist/hooks-settings.d.ts +1 -1
  159. package/dist/hooks-settings.d.ts.map +1 -1
  160. package/dist/hooks-settings.js +31 -11
  161. package/dist/hooks-settings.js.map +1 -1
  162. package/dist/init.d.ts +8 -9
  163. package/dist/init.d.ts.map +1 -1
  164. package/dist/init.js +33 -15
  165. package/dist/init.js.map +1 -1
  166. package/dist/latex-loop.d.ts +2 -2
  167. package/dist/latex-loop.d.ts.map +1 -1
  168. package/dist/latex-loop.js +2 -2
  169. package/dist/latex-loop.js.map +1 -1
  170. package/dist/lib/agent-cli-version.d.ts +65 -0
  171. package/dist/lib/agent-cli-version.d.ts.map +1 -0
  172. package/dist/lib/agent-cli-version.js +77 -0
  173. package/dist/lib/agent-cli-version.js.map +1 -0
  174. package/dist/lib/check.d.ts +19 -0
  175. package/dist/lib/check.d.ts.map +1 -0
  176. package/dist/lib/check.js +52 -0
  177. package/dist/lib/check.js.map +1 -0
  178. package/dist/lib/markdown.d.ts +180 -0
  179. package/dist/lib/markdown.d.ts.map +1 -0
  180. package/dist/lib/markdown.js +302 -0
  181. package/dist/lib/markdown.js.map +1 -0
  182. package/dist/lib/paper-config.d.ts +84 -0
  183. package/dist/lib/paper-config.d.ts.map +1 -0
  184. package/dist/lib/paper-config.js +138 -0
  185. package/dist/lib/paper-config.js.map +1 -0
  186. package/dist/lib/skill-eval-fixture.d.ts +29 -0
  187. package/dist/lib/skill-eval-fixture.d.ts.map +1 -0
  188. package/dist/lib/skill-eval-fixture.js +62 -0
  189. package/dist/lib/skill-eval-fixture.js.map +1 -0
  190. package/dist/link-skills.d.ts.map +1 -1
  191. package/dist/link-skills.js +5 -4
  192. package/dist/link-skills.js.map +1 -1
  193. package/dist/new-paper.d.ts.map +1 -1
  194. package/dist/new-paper.js +7 -3
  195. package/dist/new-paper.js.map +1 -1
  196. package/dist/paper-files.d.ts +4 -4
  197. package/dist/paper-files.d.ts.map +1 -1
  198. package/dist/paper-files.js +6 -6
  199. package/dist/paper-files.js.map +1 -1
  200. package/dist/paper-settings.d.ts.map +1 -1
  201. package/dist/paper-settings.js +8 -7
  202. package/dist/paper-settings.js.map +1 -1
  203. package/dist/pdf-facts.d.ts +51 -1
  204. package/dist/pdf-facts.d.ts.map +1 -1
  205. package/dist/pdf-facts.js +25 -16
  206. package/dist/pdf-facts.js.map +1 -1
  207. package/dist/pdf-geometry.d.ts.map +1 -1
  208. package/dist/pdf-geometry.js +3 -4
  209. package/dist/pdf-geometry.js.map +1 -1
  210. package/dist/ports/tool-installer.d.ts +2 -14
  211. package/dist/ports/tool-installer.d.ts.map +1 -1
  212. package/dist/presets.d.ts.map +1 -1
  213. package/dist/presets.js +19 -6
  214. package/dist/presets.js.map +1 -1
  215. package/dist/references.d.ts.map +1 -1
  216. package/dist/references.js +15 -10
  217. package/dist/references.js.map +1 -1
  218. package/dist/rules-config.d.ts +26 -1
  219. package/dist/rules-config.d.ts.map +1 -1
  220. package/dist/rules-config.js +15 -12
  221. package/dist/rules-config.js.map +1 -1
  222. package/dist/structure.js +1 -1
  223. package/dist/structure.js.map +1 -1
  224. package/dist/tex-requirements.d.ts +4 -0
  225. package/dist/tex-requirements.d.ts.map +1 -1
  226. package/dist/tex-requirements.js +22 -5
  227. package/dist/tex-requirements.js.map +1 -1
  228. package/dist/toolchain.d.ts.map +1 -1
  229. package/dist/toolchain.js +21 -16
  230. package/dist/toolchain.js.map +1 -1
  231. package/dist/types.d.ts +5 -3
  232. package/dist/types.d.ts.map +1 -1
  233. package/dist/venue-rules.d.ts.map +1 -1
  234. package/dist/venue-rules.js +21 -8
  235. package/dist/venue-rules.js.map +1 -1
  236. package/docs/configuration.md +2 -2
  237. package/docs/e2e.md +7 -7
  238. package/docs/install.md +1 -1
  239. package/docs/prior-art/README.md +1 -1
  240. package/docs/prior-art/package-location.md +5 -5
  241. package/docs/prior-art/repro/README.md +1 -1
  242. package/docs/prior-art/test-tooling.md +2 -2
  243. package/docs/testing.md +11 -8
  244. package/docs/toolchain.md +1 -1
  245. package/eslint-rules/{bib-reachable-entry.mjs → bib-reachable-entry.ts} +5 -4
  246. package/eslint-rules/install-path-literals.harness.mjs +1 -1
  247. package/eslint-rules/{install-path-literals.mjs → install-path-literals.ts} +18 -10
  248. package/eslint-rules/latex-language.harness.mjs +2 -2
  249. package/eslint-rules/latex-language.test.mjs +7 -1
  250. package/eslint-rules/{latex-language.mjs → latex-language.ts} +297 -109
  251. package/eslint-rules/paper-research-question.harness.mjs +3 -3
  252. package/eslint-rules/{paper-research-question.mjs → paper-research-question.ts} +35 -16
  253. package/eslint-rules/paper-stages.harness.mjs +2 -2
  254. package/eslint-rules/paper-stages.test.mjs +8 -2
  255. package/eslint-rules/{paper-stages.mjs → paper-stages.ts} +76 -31
  256. package/eslint-rules/paper-typography.test.mjs +3 -3
  257. package/eslint-rules/{paper-typography.mjs → paper-typography.ts} +134 -56
  258. package/eslint-rules/papers.harness.mjs +2 -2
  259. package/eslint-rules/{papers.mjs → papers.ts} +7 -4
  260. package/eslint-rules/pdf-last-page-balance.harness.mjs +3 -3
  261. package/eslint-rules/{pdf-last-page-balance.mjs → pdf-last-page-balance.ts} +89 -32
  262. package/eslint-rules/review-frontmatter.test.mjs +2 -2
  263. package/eslint-rules/{review-frontmatter.mjs → review-frontmatter.ts} +38 -16
  264. package/eslint-rules/rule-context.ts +62 -0
  265. package/eslint-rules/{sibling-frontmatter.mjs → sibling-frontmatter.ts} +1 -1
  266. package/eslint-rules/temp-root-realpath.harness.mjs +1 -1
  267. package/eslint-rules/{temp-root-realpath.mjs → temp-root-realpath.ts} +20 -7
  268. package/eslint-rules/tex-build.harness.mjs +2 -2
  269. package/eslint-rules/{tex-build.mjs → tex-build.ts} +6 -5
  270. package/eslint.config.mjs +146 -30
  271. package/fixtures/install-path-literals/clean.fixture.mjs +1 -1
  272. package/fixtures/install-path-literals/clean.md +2 -2
  273. package/fixtures/install-path-literals/defect.fixture.mjs +1 -1
  274. package/fixtures/install-path-literals/defect.md +2 -2
  275. package/fixtures/pdf-facts/README.md +2 -2
  276. package/fixtures/real-markdown-paper/{baseline.mjs → baseline.ts} +31 -10
  277. package/hooks/{hooks.harness.mjs → hooks.harness.ts} +51 -34
  278. package/hooks/paper-edit-guard.hook.mjs +1 -1
  279. package/hooks/{paper-edit-guard.test.mjs → paper-edit-guard.test.ts} +3 -7
  280. package/hooks/paper-skills-nudge.hook.mjs +1 -1
  281. package/hooks/{paper-skills-nudge.test.mjs → paper-skills-nudge.test.ts} +2 -6
  282. package/hooks/paper-status-gates.sh +9 -19
  283. package/hooks/{paper-status-gates.test.mjs → paper-status-gates.test.ts} +2 -6
  284. package/lib/agent-cli-version.harness.mjs +1 -1
  285. package/lib/{agent-cli-version.mjs → agent-cli-version.ts} +32 -18
  286. package/lib/check.test.ts +14 -9
  287. package/lib/{check.mjs → check.ts} +22 -9
  288. package/lib/markdown.test.mjs +7 -7
  289. package/lib/{markdown.mjs → markdown.ts} +68 -29
  290. package/lib/paper-config.harness.mjs +9 -9
  291. package/lib/{paper-config.mjs → paper-config.ts} +20 -19
  292. package/lib/skill-checks.mjs +24 -381
  293. package/lib/skill-checks.test.mjs +64 -116
  294. package/lib/skill-corpus.mjs +10 -251
  295. package/lib/skill-corpus.test.mjs +2 -13
  296. package/lib/skill-eval-kit.mjs +1 -1
  297. package/lib/skill-trigger-cases.mjs +1 -1
  298. package/package.json +42 -10
  299. package/scripts/{check.harness.mjs → check.harness.ts} +111 -10
  300. package/scripts/{check.test.mjs → check.test.ts} +13 -10
  301. package/scripts/{check.mjs → check.ts} +116 -42
  302. package/scripts/coverage-config.test.ts +80 -38
  303. package/scripts/eslint-report-guard.test.mjs +1 -1
  304. package/scripts/harness-api.frozen.json +14 -16
  305. package/scripts/harness-api.test.ts +8 -5
  306. package/scripts/layer-legacy-frozen.test.ts +17 -13
  307. package/scripts/{layer-legacy-frozen.mjs → layer-legacy-frozen.ts} +128 -39
  308. package/scripts/release-config.test.ts +12 -4
  309. package/scripts/rules-see-files.test.mjs +1 -1
  310. package/scripts/test.test.ts +78 -0
  311. package/scripts/test.ts +87 -0
  312. package/skills/analyze-sibling-paper/SKILL.md +1 -39
  313. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +0 -38
  314. package/skills/argument-arc/SKILL.md +2 -36
  315. package/skills/argument-arc/SKILL.md.spec.ts +1 -43
  316. package/skills/build-benchmark/SKILL.md +1 -41
  317. package/skills/build-benchmark/SKILL.md.spec.ts +0 -40
  318. package/skills/camera-ready/SKILL.md +1 -34
  319. package/skills/camera-ready/SKILL.md.spec.ts +0 -33
  320. package/skills/cold-read-diff/SKILL.md +1 -35
  321. package/skills/cold-read-diff/SKILL.md.spec.ts +0 -34
  322. package/skills/draft-paper/SKILL.md +2 -41
  323. package/skills/draft-paper/SKILL.md.spec.ts +1 -50
  324. package/skills/extend-paper/SKILL.md +2 -33
  325. package/skills/extend-paper/SKILL.md.spec.ts +1 -42
  326. package/skills/find-venue/SKILL.md +2 -38
  327. package/skills/find-venue/SKILL.md.spec.ts +1 -47
  328. package/skills/grade-paper-writing/SKILL.md +3 -38
  329. package/skills/grade-paper-writing/SKILL.md.spec.ts +2 -47
  330. package/skills/grade-paper-writing/prose-lint.mjs +3 -4
  331. package/skills/grade-paper-writing/{prose-lint.test.mjs → prose-lint.test.ts} +3 -3
  332. package/skills/harden-paper/SKILL.md +1 -39
  333. package/skills/harden-paper/SKILL.md.spec.ts +0 -38
  334. package/skills/map-prior-work/SKILL.md +1 -35
  335. package/skills/map-prior-work/SKILL.md.spec.ts +0 -34
  336. package/skills/osf-artifact-upload/{osf-artifact-upload.harness.mjs → osf-artifact-upload.harness.ts} +3 -4
  337. package/skills/paper-adversarial-review/SKILL.md +2 -35
  338. package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -43
  339. package/skills/paper-pipeline/SKILL.md +2 -28
  340. package/skills/paper-pipeline/SKILL.md.spec.ts +1 -27
  341. package/skills/paper-pipeline/description-language.eval.mjs +1 -1
  342. package/skills/paper-pipeline/framing-vs-vocabulary.eval.mjs +1 -1
  343. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +2 -2
  344. package/skills/paper-pipeline/paper-pipeline.harness.mjs +25 -40
  345. package/skills/paper-pipeline/pipeline-firing.eval.mjs +1 -1
  346. package/skills/paper-pipeline/pipeline-language.eval.mjs +1 -1
  347. package/skills/paper-pipeline/references/acceptance-gate.md +1 -6
  348. package/skills/paper-pipeline/references/pipeline-status-template.md +8 -35
  349. package/skills/paper-pipeline/scripts/README.md +30 -225
  350. package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +4 -8
  351. package/skills/paper-pipeline/scripts/artifact-coverage.mjs +1 -1
  352. package/skills/paper-pipeline/scripts/{artifact-coverage.test.mjs → artifact-coverage.test.ts} +2 -2
  353. package/skills/paper-pipeline/scripts/consumer.harness.mjs +6 -104
  354. package/skills/paper-pipeline/scripts/consumer.mjs +24 -109
  355. package/skills/paper-pipeline/scripts/consumer.test.mjs +1 -1
  356. package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +1 -1
  357. package/skills/paper-pipeline/scripts/extract-ref-facts.mjs +1 -4
  358. package/skills/paper-pipeline/scripts/extract-ref-facts.test.mjs +1 -1
  359. package/skills/paper-pipeline/scripts/generated-code.harness.mjs +2 -3
  360. package/skills/paper-pipeline/scripts/{generated-code.test.mjs → generated-code.test.ts} +3 -3
  361. package/skills/paper-pipeline/scripts/population-map.harness.mjs +3 -3
  362. package/skills/paper-pipeline/scripts/population-map.mjs +1 -4
  363. package/skills/paper-pipeline/scripts/population-map.test.mjs +1 -1
  364. package/skills/paper-pipeline/scripts/{round-diff.harness.mjs → round-diff.harness.ts} +45 -18
  365. package/skills/paper-pipeline/scripts/round-diff.mjs +1 -1
  366. package/skills/paper-pipeline/scripts/round-diff.test.mjs +1 -1
  367. package/skills/paper-status/SKILL.md +2 -42
  368. package/skills/paper-status/SKILL.md.spec.ts +1 -41
  369. package/skills/pc-panel-review/SKILL.md +2 -46
  370. package/skills/pc-panel-review/SKILL.md.spec.ts +1 -45
  371. package/skills/plan-paper-timeline/SKILL.md +2 -36
  372. package/skills/plan-paper-timeline/SKILL.md.spec.ts +0 -36
  373. package/skills/plan-paper-timeline/fixtures/{fake-google-calendar.mjs → fake-google-calendar.ts} +101 -70
  374. package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +3 -3
  375. package/skills/render-paper/SKILL.md +1 -37
  376. package/skills/render-paper/SKILL.md.spec.ts +0 -36
  377. package/skills/render-paper/{extract-pdf-facts.harness.mjs → extract-pdf-facts.harness.ts} +34 -9
  378. package/skills/render-paper/render-paper.harness.mjs +2 -2
  379. package/skills/research-ideate/SKILL.md +2 -39
  380. package/skills/research-ideate/SKILL.md.spec.ts +1 -47
  381. package/skills/study-accepted-papers/SKILL.md +1 -34
  382. package/skills/study-accepted-papers/SKILL.md.spec.ts +0 -33
  383. package/skills/submit-paper/SKILL.md +1 -33
  384. package/skills/submit-paper/SKILL.md.spec.ts +0 -32
  385. package/skills/sweep-design-space/SKILL.md +1 -38
  386. package/skills/sweep-design-space/SKILL.md.spec.ts +0 -37
  387. package/skills/tighten-paper/SKILL.md +2 -39
  388. package/skills/tighten-paper/SKILL.md.spec.ts +1 -47
  389. package/skills/tighten-paper/structure.mjs +5 -12
  390. package/skills/tighten-paper/{structure.test.mjs → structure.test.ts} +4 -3
  391. package/skills/verify-citations/SKILL.md +2 -38
  392. package/skills/verify-citations/SKILL.md.spec.ts +1 -37
  393. package/skills/verify-citations/scripts/{bib-authors.cli.test.mjs → bib-authors.cli.test.ts} +14 -4
  394. package/skills/verify-citations/scripts/bib-authors.d.mts +63 -0
  395. package/skills/verify-citations/scripts/bib-authors.mjs +1 -4
  396. package/skills/verify-citations/scripts/{verify-cites.cli.test.mjs → verify-cites.cli.test.ts} +32 -9
  397. package/skills/verify-citations/scripts/verify-cites.d.mts +58 -0
  398. package/src/CLAUDE.md +1 -1
  399. package/src/adapters/banal/failure.ts +9 -10
  400. package/src/adapters/banal/index.test.ts +5 -8
  401. package/src/adapters/banal/index.ts +8 -7
  402. package/src/adapters/banal/install.ts +9 -4
  403. package/src/adapters/banal/invocation.test.ts +23 -9
  404. package/src/adapters/banal/invocation.ts +24 -9
  405. package/src/adapters/banal/locate.test.ts +2 -2
  406. package/src/adapters/banal/locate.ts +27 -21
  407. package/src/adapters/banal/output.test.ts +1 -1
  408. package/src/adapters/banal/run.test.ts +5 -5
  409. package/src/adapters/banal/run.ts +16 -10
  410. package/src/adapters/banal/settings.ts +2 -2
  411. package/src/adapters/banal/xml.test.ts +1 -1
  412. package/src/adapters/curl/download.test.ts +8 -6
  413. package/src/adapters/memory/index.ts +4 -3
  414. package/src/adapters/node/files.io.ts +2 -2
  415. package/src/adapters/node/files.test.ts +8 -4
  416. package/src/adapters/node/process.io.ts +13 -5
  417. package/src/adapters/node/process.test.ts +5 -5
  418. package/src/adapters/node/workspace.io.ts +9 -4
  419. package/src/adapters/node/workspace.test.ts +3 -1
  420. package/src/adapters/pdfjs/fill.test.ts +2 -2
  421. package/src/adapters/pdfjs/fill.ts +14 -7
  422. package/src/adapters/references/index.test.ts +31 -38
  423. package/src/adapters/references/index.ts +33 -60
  424. package/src/adapters/references/pool.ts +3 -5
  425. package/src/adapters/references/reach.io.ts +2 -1
  426. package/src/build-engine.harness.mjs +1 -1
  427. package/src/build-engine.test.ts +13 -8
  428. package/src/build-engine.ts +12 -7
  429. package/src/build.harness.mjs +2 -2
  430. package/src/build.test.ts +24 -24
  431. package/src/build.ts +34 -26
  432. package/src/caller-path.ts +13 -0
  433. package/src/cli.harness.mjs +6 -8
  434. package/src/cli.test.ts +31 -13
  435. package/src/cli.ts +117 -58
  436. package/src/doctor.harness.mjs +3 -3
  437. package/src/doctor.test.ts +1 -1
  438. package/src/doctor.ts +17 -7
  439. package/src/domain/lookup-cache.ts +21 -11
  440. package/src/domain/paths.test.ts +15 -0
  441. package/src/domain/paths.ts +20 -1
  442. package/src/domain/ready.ts +31 -0
  443. package/src/domain/record.test.ts +20 -0
  444. package/src/domain/record.ts +12 -0
  445. package/src/domain/result.test.ts +2 -2
  446. package/src/domain/sha256.ts +5 -3
  447. package/src/domain/text.test.ts +32 -0
  448. package/src/domain/text.ts +23 -0
  449. package/src/engine.harness.mjs +2 -2
  450. package/src/engine.ts +34 -5
  451. package/src/facts-file.test.ts +9 -7
  452. package/src/facts-file.ts +45 -29
  453. package/src/{hooks-settings.harness.mjs → hooks-settings.harness.ts} +56 -20
  454. package/src/hooks-settings.ts +48 -13
  455. package/src/init.test.ts +37 -14
  456. package/src/init.ts +48 -24
  457. package/src/{latex-log.harness.mjs → latex-log.harness.ts} +14 -14
  458. package/src/{latex-loop.harness.mjs → latex-loop.harness.ts} +64 -36
  459. package/src/latex-loop.ts +3 -3
  460. package/src/{link-skills.harness.mjs → link-skills.harness.ts} +19 -19
  461. package/src/link-skills.test.ts +3 -3
  462. package/src/link-skills.ts +5 -4
  463. package/src/lint-fix.test.ts +4 -6
  464. package/src/linted-set.test.ts +2 -2
  465. package/src/new-paper.harness.mjs +9 -25
  466. package/src/new-paper.test.ts +8 -10
  467. package/src/new-paper.ts +9 -5
  468. package/src/paper-files.test.ts +25 -24
  469. package/src/paper-files.ts +16 -27
  470. package/src/paper-settings-commands.test.ts +5 -4
  471. package/src/paper-settings.test.ts +7 -7
  472. package/src/paper-settings.ts +13 -14
  473. package/src/{pdf-facts.harness.mjs → pdf-facts.harness.ts} +9 -8
  474. package/src/pdf-facts.test.ts +25 -15
  475. package/src/pdf-facts.ts +81 -23
  476. package/src/{pdf-geometry.harness.mjs → pdf-geometry.harness.ts} +19 -12
  477. package/src/pdf-geometry.ts +8 -4
  478. package/src/ports/tool-installer.ts +2 -17
  479. package/src/presets.ts +31 -16
  480. package/src/references.test.ts +76 -62
  481. package/src/references.ts +18 -12
  482. package/src/{rules-config.harness.mjs → rules-config.harness.ts} +7 -13
  483. package/src/rules-config.ts +46 -14
  484. package/src/rules-off.test.ts +6 -4
  485. package/src/{structure.harness.mjs → structure.harness.ts} +26 -15
  486. package/src/structure.ts +1 -1
  487. package/src/{tex-requirements.harness.mjs → tex-requirements.harness.ts} +50 -22
  488. package/src/tex-requirements.test.ts +21 -0
  489. package/src/tex-requirements.ts +37 -11
  490. package/src/toolchain.harness.mjs +2 -2
  491. package/src/toolchain.test.ts +10 -6
  492. package/src/toolchain.ts +31 -17
  493. package/src/types.ts +5 -3
  494. package/src/venue-rules.test.ts +70 -68
  495. package/src/venue-rules.ts +22 -12
  496. package/tsconfig.json +6 -3
  497. package/tsconfig.pkg.json +10 -0
  498. package/lib/check.d.mts +0 -17
  499. package/lib/paper-config.d.mts +0 -31
  500. package/scripts/layer-legacy-frozen.d.mts +0 -36
  501. package/scripts/rules-are-content-only.harness.mjs +0 -105
  502. package/scripts/rules-are-content-only.mjs +0 -148
  503. package/scripts/rules-are-content-only.test.mjs +0 -61
  504. package/scripts/test.mjs +0 -44
  505. package/scripts/test.test.mjs +0 -52
  506. package/skills/paper-pipeline/scripts/announce.mjs +0 -67
  507. package/skills/paper-pipeline/scripts/announce.test.mjs +0 -102
  508. package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +0 -51
  509. package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +0 -52
  510. package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +0 -6
  511. package/skills/paper-pipeline/scripts/fixtures/scorecard.mjs +0 -71
  512. package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +0 -302
  513. package/skills/paper-pipeline/scripts/ledger.mjs +0 -623
  514. package/skills/paper-pipeline/scripts/ledger.test.mjs +0 -254
  515. package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +0 -474
  516. package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +0 -328
  517. package/skills/paper-pipeline/scripts/pipeline-check.mjs +0 -753
  518. package/skills/paper-pipeline/scripts/pipeline-edges.mjs +0 -169
  519. package/skills/paper-pipeline/scripts/pipeline-edges.test.mjs +0 -73
  520. package/skills/paper-pipeline/scripts/run-mechanical.mjs +0 -648
  521. package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +0 -468
  522. package/skills/paper-pipeline/scripts/status.mjs +0 -295
  523. package/skills/paper-pipeline/scripts/status.test.mjs +0 -232
  524. /package/bin/{paperlint.test.mjs → paperlint.test.ts} +0 -0
  525. /package/lib/{skill-eval-fixture.mjs → skill-eval-fixture.ts} +0 -0
  526. /package/skills/grade-paper-writing/__snapshots__/{prose-lint.test.mjs.snap → prose-lint.test.ts.snap} +0 -0
  527. /package/skills/tighten-paper/__snapshots__/{structure.test.mjs.snap → structure.test.ts.snap} +0 -0
@@ -31,6 +31,7 @@
31
31
  * never read as empty.
32
32
  */
33
33
  import { err, ok } from "./result.js";
34
+ import { messageOf } from "./text.js";
34
35
  export const LOOKUP_CACHE_SCHEMA = 1;
35
36
  export const EMPTY_LOOKUP_CACHE = {
36
37
  citations: new Map(),
@@ -72,23 +73,24 @@ function sectionOf(name, section, known, one) {
72
73
  const extra = unknownField(v, known);
73
74
  if (extra !== undefined)
74
75
  return err(`${at}\`: unknown field \`${extra}\``);
75
- if (!isDate(v["fetched"]))
76
+ const fetched = v["fetched"];
77
+ if (!isDate(fetched))
76
78
  return err(`${at}.fetched\`: expected a date, YYYY-MM-DD`);
77
- const r = one(v, at);
79
+ const r = one(v, fetched, at);
78
80
  if (!r.ok)
79
81
  return r;
80
82
  out.set(key, r.value);
81
83
  }
82
84
  return ok(out);
83
85
  }
84
- const cachedResponse = (o, at) => isObject(o["response"]) && o["response"]["transport"] === "ok"
85
- ? ok({ fetched: o["fetched"], response: o["response"] })
86
+ const cachedResponse = (o, fetched, at) => isObject(o["response"]) && o["response"]["transport"] === "ok"
87
+ ? ok({ fetched, response: o["response"] })
86
88
  : err(`${at}.response\`: expected a successful response ({"transport": "ok", …})`);
87
89
  const isHit = (h) => isObject(h) &&
88
90
  ["venue", "year", "type", "title"].every((k) => typeof h[k] === "string") &&
89
91
  Array.isArray(h["authors"]) &&
90
92
  h["authors"].every((a) => typeof a === "string");
91
- function cachedDblp(o, at) {
93
+ function cachedDblp(o, fetched, at) {
92
94
  const { title, hits } = o;
93
95
  if (typeof title !== "string")
94
96
  return err(`${at}.title\`: expected a string`);
@@ -98,9 +100,9 @@ function cachedDblp(o, at) {
98
100
  if (bad !== -1)
99
101
  return err(`${at}.hits[${String(bad)}]\`: expected {venue, year, type, title: string; authors: string[]}`);
100
102
  return ok({
101
- fetched: o["fetched"],
103
+ fetched,
102
104
  title,
103
- hits: hits,
105
+ hits: hits.filter(isHit),
104
106
  });
105
107
  }
106
108
  /** The cache in `text`, or why it cannot be read. */
@@ -110,7 +112,7 @@ export function parseLookupCache(text) {
110
112
  json = JSON.parse(text);
111
113
  }
112
114
  catch (e) {
113
- return err(`not JSON: ${e.message}`);
115
+ return err(`not JSON: ${messageOf(e)}`);
114
116
  }
115
117
  if (!isObject(json))
116
118
  return err("expected an object with `schema`, `citations` and `dblp`");
@@ -1 +1 @@
1
- {"version":3,"file":"lookup-cache.js","sourceRoot":"","sources":["../../src/domain/lookup-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lookup-cache.js","sourceRoot":"","sources":["../../src/domain/lookup-cache.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
- /** Paths as the domain holds them. */
2
1
  import type { Opaque } from "ts-essentials";
3
- /** An absolute path. Minted at the composition root (`abs`), so nothing inside resolves a cwd. */
2
+ /**
3
+ * An absolute path. Minted by `absolutePath` (a checked string) or `joinPath` (an absolute base and
4
+ * segments) only, so nothing holding one has to ask whether it is relative.
5
+ */
4
6
  export type AbsolutePath = Opaque<string, "AbsolutePath">;
7
+ /** A path the caller holds as text, checked where it becomes a value. A relative one throws. */
8
+ export declare function absolutePath(p: string): AbsolutePath;
9
+ /** `segments` under `base`: absolute because `base` is. */
10
+ export declare const joinPath: (base: AbsolutePath, ...segments: string[]) => AbsolutePath;
5
11
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/domain/paths.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,kGAAkG;AAClG,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/domain/paths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAK1D,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAGpD;AAED,2DAA2D;AAC3D,eAAO,MAAM,QAAQ,GACnB,MAAM,YAAY,EAClB,GAAG,UAAU,MAAM,EAAE,KACpB,YAAqD,CAAC"}
@@ -1,2 +1,13 @@
1
- export {};
1
+ /** Paths as the domain holds them. */
2
+ import { isAbsolute, join } from "node:path";
3
+ // The brand's one owner: the predicate IS the check, so no assertion is needed to mint the type.
4
+ const isAbsolutePath = (p) => isAbsolute(p);
5
+ /** A path the caller holds as text, checked where it becomes a value. A relative one throws. */
6
+ export function absolutePath(p) {
7
+ if (!isAbsolutePath(p))
8
+ throw new Error(`not an absolute path: ${p}`);
9
+ return p;
10
+ }
11
+ /** `segments` under `base`: absolute because `base` is. */
12
+ export const joinPath = (base, ...segments) => absolutePath(join(base, ...segments));
2
13
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/domain/paths.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/domain/paths.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAS7C,iGAAiG;AACjG,MAAM,cAAc,GAAG,CAAC,CAAS,EAAqB,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAEvE,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAkB,EAClB,GAAG,QAAkB,EACP,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /** A program `paperlint toolchain` installed or found: present, verified, running. */
2
+ declare const READY: unique symbol;
3
+ /**
4
+ * Present, verified, running. BRANDED: a literal `{ where, fresh, verified }` is not a `Ready`, so
5
+ * only an installer's adapter — one minting call each (banal's is `ready` in
6
+ * `adapters/banal/index.ts`) — can make one, and a ready line cannot be printed without it.
7
+ */
8
+ export interface Ready {
9
+ /** Where it is: the program's path or its bin directory. */
10
+ readonly where: string;
11
+ /** This run installed it. */
12
+ readonly fresh: boolean;
13
+ /** What was checked before calling it ready, as a person reads it. */
14
+ readonly verified: string;
15
+ readonly [READY]: true;
16
+ }
17
+ /** An installer's verdict that its program is ready. Called by an installer adapter, after its checks. */
18
+ export declare const ready: (r: {
19
+ readonly where: string;
20
+ readonly fresh: boolean;
21
+ readonly verified: string;
22
+ }) => Ready;
23
+ export {};
24
+ //# sourceMappingURL=ready.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ready.d.ts","sourceRoot":"","sources":["../../src/domain/ready.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAGtF,QAAA,MAAM,KAAK,eAAkB,CAAC;AAE9B;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;CACxB;AAED,0GAA0G;AAC1G,eAAO,MAAM,KAAK,GAAI,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,KAAG,KAKF,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** A program `paperlint toolchain` installed or found: present, verified, running. */
2
+ // Not exported: a `Ready` carries this property, and the one way to write it is `ready` below.
3
+ const READY = Symbol("Ready");
4
+ /** An installer's verdict that its program is ready. Called by an installer adapter, after its checks. */
5
+ export const ready = (r) => ({
6
+ where: r.where,
7
+ fresh: r.fresh,
8
+ verified: r.verified,
9
+ [READY]: true,
10
+ });
11
+ //# sourceMappingURL=ready.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ready.js","sourceRoot":"","sources":["../../src/domain/ready.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,+FAA+F;AAC/F,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAiB9B,0GAA0G;AAC1G,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAIrB,EAAS,EAAE,CAAC,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;IACpB,CAAC,KAAK,CAAC,EAAE,IAAI;CACd,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Reading fields off a value typed `unknown` — a parsed JSON file, an object a library hands back. */
2
+ /** Any non-null object that is not an array, readable by key. */
3
+ export declare const isRecord: (v: unknown) => v is Readonly<Record<string, unknown>>;
4
+ /** `v[key]` when `v` is a record; undefined for anything else. Inherited fields count, as `.` reads them. */
5
+ export declare const fieldOf: (v: unknown, key: string) => unknown;
6
+ /** A number array a library types as `any[]`, read as the numbers it holds. */
7
+ export declare const numbersOf: (xs: readonly unknown[]) => number[];
8
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/domain/record.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,iEAAiE;AACjE,eAAO,MAAM,QAAQ,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACjB,CAAC;AAE3D,6GAA6G;AAC7G,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,EAAE,KAAK,MAAM,KAAG,OAChB,CAAC;AAEnC,+EAA+E;AAC/E,eAAO,MAAM,SAAS,GAAI,IAAI,SAAS,OAAO,EAAE,KAAG,MAAM,EAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Reading fields off a value typed `unknown` — a parsed JSON file, an object a library hands back. */
2
+ /** Any non-null object that is not an array, readable by key. */
3
+ export const isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
4
+ /** `v[key]` when `v` is a record; undefined for anything else. Inherited fields count, as `.` reads them. */
5
+ export const fieldOf = (v, key) => isRecord(v) ? v[key] : undefined;
6
+ /** A number array a library types as `any[]`, read as the numbers it holds. */
7
+ export const numbersOf = (xs) => xs.map(Number);
8
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/domain/record.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,iEAAiE;AACjE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAU,EAA0C,EAAE,CAC7E,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAE3D,6GAA6G;AAC7G,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,GAAW,EAAW,EAAE,CAC1D,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAEnC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAsB,EAAY,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sha256.d.ts","sourceRoot":"","sources":["../../src/domain/sha256.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,gGAAgG;AAChG,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAI9C,4GAA4G;AAC5G,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,UAAU,KAAG,MACc,CAAC"}
1
+ {"version":3,"file":"sha256.d.ts","sourceRoot":"","sources":["../../src/domain/sha256.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,gGAAgG;AAChG,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAM9C,4GAA4G;AAC5G,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,UAAU,KAAG,MACiB,CAAC"}
@@ -4,11 +4,13 @@
4
4
  */
5
5
  import { createHash } from "node:crypto";
6
6
  const SHA256 = /^[0-9a-f]{64}$/;
7
+ // The brand's one owner: the predicate IS the check, so no assertion is needed to mint the type.
8
+ const isSha256 = (s) => SHA256.test(s);
7
9
  /** A sha256 written down as text — a pin, an option — checked where it is written, not where it is used. */
8
10
  export function parseSha256(s) {
9
- if (!SHA256.test(s))
11
+ if (!isSha256(s))
10
12
  throw new Error(`not a sha256 (64 lowercase hex digits): ${s}`);
11
13
  return s;
12
14
  }
13
- export const sha256Hex = (bytes) => createHash("sha256").update(bytes).digest("hex");
15
+ export const sha256Hex = (bytes) => parseSha256(createHash("sha256").update(bytes).digest("hex"));
14
16
  //# sourceMappingURL=sha256.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sha256.js","sourceRoot":"","sources":["../../src/domain/sha256.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzC,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAEhC,4GAA4G;AAC5G,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,CAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAU,EAAE,CACrD,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAW,CAAC"}
1
+ {"version":3,"file":"sha256.js","sourceRoot":"","sources":["../../src/domain/sha256.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzC,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAChC,iGAAiG;AACjG,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAe,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5D,4GAA4G;AAC5G,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAU,EAAE,CACrD,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC"}
@@ -3,4 +3,16 @@
3
3
  export type Lines = readonly [string, ...string[]];
4
4
  /** The first non-blank line of a stream — what a failure shows. */
5
5
  export declare const firstLine: (s: string) => string;
6
+ /**
7
+ * What a process printed on one stream, as text. Node types `spawnSync(…, { encoding })`'s
8
+ * `stdout`/`stderr` as `string`, but both are `undefined` when the spawn itself failed (measured:
9
+ * `spawnSync("no-such-program", [], { encoding: "utf8" }).stdout` is `undefined`). The parameter
10
+ * takes the stream as it really arrives, so the fallback guards a real case instead of reading
11
+ * as dead code against a type that lies.
12
+ */
13
+ export declare const printed: (stream: string | null | undefined) => string;
14
+ /** What a caught value says: an `Error`'s message, anything else as text (`catch` gets `unknown`). */
15
+ export declare const messageOf: (e: unknown) => string;
16
+ /** The `code` a Node error carries (`ENOENT`, `EACCES`, …), when it carries a string one. */
17
+ export declare const codeOf: (e: unknown) => string | undefined;
6
18
  //# sourceMappingURL=text.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/domain/text.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,+FAA+F;AAC/F,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAEnD,mEAAmE;AACnE,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAId,CAAC"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/domain/text.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,+FAA+F;AAC/F,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAEnD,mEAAmE;AACnE,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAId,CAAC;AAEzB;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAC9C,CAAC;AAEf,sGAAsG;AACtG,eAAO,MAAM,SAAS,GAAI,GAAG,OAAO,KAAG,MACK,CAAC;AAE7C,6FAA6F;AAC7F,eAAO,MAAM,MAAM,GAAI,GAAG,OAAO,KAAG,MAAM,GAAG,SAM9B,CAAC"}
@@ -4,4 +4,21 @@ export const firstLine = (s) => s
4
4
  .split("\n")
5
5
  .map((l) => l.trim())
6
6
  .find(Boolean) ?? "";
7
+ /**
8
+ * What a process printed on one stream, as text. Node types `spawnSync(…, { encoding })`'s
9
+ * `stdout`/`stderr` as `string`, but both are `undefined` when the spawn itself failed (measured:
10
+ * `spawnSync("no-such-program", [], { encoding: "utf8" }).stdout` is `undefined`). The parameter
11
+ * takes the stream as it really arrives, so the fallback guards a real case instead of reading
12
+ * as dead code against a type that lies.
13
+ */
14
+ export const printed = (stream) => stream ?? "";
15
+ /** What a caught value says: an `Error`'s message, anything else as text (`catch` gets `unknown`). */
16
+ export const messageOf = (e) => e instanceof Error ? e.message : String(e);
17
+ /** The `code` a Node error carries (`ENOENT`, `EACCES`, …), when it carries a string one. */
18
+ export const codeOf = (e) => typeof e === "object" &&
19
+ e !== null &&
20
+ "code" in e &&
21
+ typeof e.code === "string"
22
+ ? e.code
23
+ : undefined;
7
24
  //# sourceMappingURL=text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/domain/text.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAKpG,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAC7C,CAAC;KACE,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KACpB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/domain/text.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAKpG,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAC7C,CAAC;KACE,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KACpB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAiC,EAAU,EAAE,CACnE,MAAM,IAAI,EAAE,CAAC;AAEf,sGAAsG;AACtG,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAU,EAAU,EAAE,CAC9C,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAE7C,6FAA6F;AAC7F,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAU,EAAsB,EAAE,CACvD,OAAO,CAAC,KAAK,QAAQ;IACrB,CAAC,KAAK,IAAI;IACV,MAAM,IAAI,CAAC;IACX,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;IACxB,CAAC,CAAC,CAAC,CAAC,IAAI;IACR,CAAC,CAAC,SAAS,CAAC"}
package/dist/engine.d.ts CHANGED
@@ -1,27 +1,28 @@
1
+ import type { TexRequirements } from "./tex-requirements.ts";
2
+ /** The options paperlint hands a process runner: text out, both streams captured. */
3
+ export interface RunOptions {
4
+ readonly encoding: "utf8" | "latin1";
5
+ readonly stdio: ["ignore", "pipe", "pipe"];
6
+ readonly env?: NodeJS.ProcessEnv;
7
+ readonly cwd?: string;
8
+ readonly maxBuffer?: number;
9
+ readonly timeout?: number;
10
+ }
1
11
  /**
2
- * WHICH TeX LIVE `paperlint build` COMPILES WITH — decided from facts, and never a TeX Live that lacks a
3
- * package the paper's venue declares.
4
- *
5
- * 🔴 WHY "HAS pdflatex" IS NOT THE QUESTION. A TeX Live without `libertine.sty` builds an acmart
6
- * paper GREEN: the class notices the missing font, falls back to Computer Modern, and the PDF looks
7
- * fine in the wrong typeface with another pagination. That is how a submitted paper went out. So a
8
- * TeX Live qualifies only when `kpsewhich` finds every file the venue declares (issue #26).
9
- *
10
- * The order (the Playwright pattern, decided 2026-09-24):
11
- * 1. paperlint's own cache (`paperlint toolchain` installs it) — when it has everything;
12
- * 2. a TeX Live already on PATH — when IT has everything;
13
- * 3. neither: on a terminal, ask once and install; without one (CI, an agent), refuse in one line
14
- * that names `npx paperlint toolchain` and the missing packages. Never a silent install without a
15
- * human, never a build on a TeX Live that would typeset the wrong font.
16
- *
17
- * `resolveEngine` is that order as a PURE function over `EngineFacts`, table-tested. The rest of
18
- * this file gathers the facts (probing a tree runs `kpsewhich` through the injected `run`, the port
19
- * `build.ts` already uses) and acts on the decision.
12
+ * What paperlint reads of a finished process. `spawnSync`'s result has this shape; a fake needs
13
+ * nothing more. Both streams are optional: they are `undefined` when the spawn itself failed.
20
14
  */
21
- import { spawnSync } from "node:child_process";
22
- import type { TexRequirements } from "./tex-requirements.ts";
23
- /** A process runner with `spawnSync`'s shape — the port the harness replaces. */
24
- export type Runner = typeof spawnSync;
15
+ export interface RunResult {
16
+ readonly status: number | null;
17
+ readonly stdout?: string;
18
+ readonly stderr?: string;
19
+ readonly error?: Error;
20
+ }
21
+ /**
22
+ * A process runner: `spawnSync`'s text overload, narrowed to what paperlint passes and reads — the
23
+ * port the harness replaces. `spawnSync` itself is one.
24
+ */
25
+ export type Runner = (file: string, args: readonly string[], options: RunOptions) => RunResult;
25
26
  /** One TeX Live and what it lacks for the papers at hand. */
26
27
  export interface TreeProbe {
27
28
  /** How to name it to a human: `paperlint cache, TeX Live 2026` / `/usr/bin/pdflatex`. */
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,iFAAiF;AACjF,MAAM,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC;AAEtC,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,yFAAyF;IACzF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,yEAAyE;IACzE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC7D;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEN;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,cAAc,CAS5D;AAID,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,CAAC,QAAQ,KAAG,OACf,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,EACrC,KAAK,EAAE,MAAM,GACZ,MAAM,EAAE,CAYV;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EAEZ,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,OAAO,CAQT;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAsB,GAC/C,MAAM,EAAE,CAKV;AAOD;;;GAGG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,EACrC,GAAG,GAAE,MAAkB,GACtB,MAAM,EAAE,CASV;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAkB,GACtB,MAAM,EAAE,CAsBV;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAsB,GAC5C,MAAM,GAAG,IAAI,CAIf"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/engine.js CHANGED
@@ -23,6 +23,7 @@ import { spawnSync } from "node:child_process";
23
23
  // eslint-disable-next-line boundaries/dependencies -- legacy I/O, moves behind a port in #76
24
24
  import { accessSync, constants, statSync } from "node:fs";
25
25
  import { basename, delimiter, join } from "node:path";
26
+ import { printed } from "./domain/text.js";
26
27
  /**
27
28
  * The decision. `missing` in `ask` and `refuse` is what `paperlint toolchain` would install: the cache's
28
29
  * gaps when a cache exists, every required package when it does not.
@@ -107,7 +108,7 @@ export function probeTree(bin, packages, run = spawnSync) {
107
108
  });
108
109
  if (r.error)
109
110
  return Object.keys(packages).sort();
110
- return missingPackages(packages, String(r.stdout ?? ""));
111
+ return missingPackages(packages, printed(r.stdout));
111
112
  }
112
113
  /**
113
114
  * Packages the tree's OWN database lists as dependencies but never installed, by its `tlmgr check
@@ -124,7 +125,7 @@ export function missingDependencies(bin, run = spawnSync) {
124
125
  });
125
126
  if (r.error)
126
127
  return [];
127
- const lines = String(r.stdout ?? "").split("\n");
128
+ const lines = printed(r.stdout).split("\n");
128
129
  const start = lines.findIndex((l) => l.trim() === "DEPENDS WITHOUT PACKAGES:");
129
130
  if (start < 0)
130
131
  return [];
@@ -133,7 +134,7 @@ export function missingDependencies(bin, run = spawnSync) {
133
134
  const section = lines.slice(start + 1);
134
135
  const end = section.findIndex((l) => l !== l.trimStart() || !l.trim());
135
136
  return [
136
- ...new Set((end < 0 ? section : section.slice(0, end)).map((l) => l.split(" in: ")[0].trim())),
137
+ ...new Set((end < 0 ? section : section.slice(0, end)).map((l) => l.replace(/ in: [\s\S]*/, "").trim())),
137
138
  ].sort();
138
139
  }
139
140
  /** The first directory on `path` holding a runnable `name` — what a shell would run. */
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { RuleContext } from "./rule-context.ts";
2
+ declare const _default: {
3
+ rules: {
4
+ "reachable-entry": {
5
+ meta: {
6
+ type: "suggestion";
7
+ docs: {
8
+ description: string;
9
+ };
10
+ schema: never[];
11
+ messages: {
12
+ unreachable: string;
13
+ };
14
+ };
15
+ create(context: RuleContext): {
16
+ "root:exit"(): void;
17
+ };
18
+ };
19
+ };
20
+ };
21
+ export default _default;
22
+ //# sourceMappingURL=bib-reachable-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bib-reachable-entry.d.ts","sourceRoot":"","sources":["../../eslint-rules/bib-reachable-entry.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;;;;;;;;;;;;;;4BAsB/B,WAAW;;;;;;AAfjC,wBA4CE"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * `bib/reachable-entry` — a bibliography entry a reader cannot follow: no doi, no url, no arXiv
3
+ * id. Reported ON THE ENTRY, one finding per entry; there is no fix, because the link has to be
4
+ * looked up. Default severity: warn.
5
+ *
6
+ * Provenance: Reviewer A on HotCRP #20 (2026-08-23), "not every entry has a DOI/link" — one
7
+ * paper had 0 of 47 entries reachable. Until 3.0.0 this was one count inside `paper/typography`,
8
+ * silenced per paper by a declared debt; now each entry is its own finding, and an entry that
9
+ * genuinely has no link (a talk, a personal communication) carries a disable directive with its
10
+ * reason, in the bibliography itself:
11
+ *
12
+ * % eslint-disable-next-line bib/reachable-entry -- an invited talk, no recording exists
13
+ * @misc{smith2024talk, …}
14
+ *
15
+ * ⚠️ NOT "no doi". Measured 2026-08-24: ICLR/NeurIPS/TMLR issue no DOIs at all, so a doi-only
16
+ * rule would demand something that does not exist and get muted for lying. A url or an arXiv id
17
+ * counts.
18
+ *
19
+ * The bibliography read is the one INSIDE `paper.tex` (`filecontents`), where the papers this
20
+ * package targets keep it. The entry boundaries and fields are found by a line-anchored `@` and
21
+ * a field name followed by `=` — BibTeX's own lexical shape, one lexeme at a time, not a parse:
22
+ * the parser (`@retorquere/bibtex-parser`) is an OPTIONAL peer of this package.
23
+ */
24
+ import { bibRange } from "./paper-typography.js";
25
+ /** Entry types that are not references. */
26
+ const NOT_AN_ENTRY = /^@(comment|string|preamble)\b/i;
27
+ const HAS_LINK = /\b(doi|url)\s*=/i;
28
+ const HAS_ARXIV = /arxiv[:\s]*\d{4}\.\d{4,5}/i;
29
+ export default {
30
+ rules: {
31
+ "reachable-entry": {
32
+ meta: {
33
+ type: "suggestion",
34
+ docs: {
35
+ description: "a bibliography entry carries a doi, a url or an arXiv id — something a reader can follow",
36
+ },
37
+ schema: [],
38
+ messages: {
39
+ unreachable: "`{{key}}` has no doi, url or arXiv id — a reader has nothing to follow. If none exists, keep the exception with `% eslint-disable-next-line bib/reachable-entry -- <why>` above the entry",
40
+ },
41
+ },
42
+ create(context) {
43
+ return {
44
+ "root:exit"() {
45
+ const sc = context.sourceCode;
46
+ const raw = sc.raw ?? sc.text;
47
+ const bib = typeof raw === "string" ? bibRange(raw) : null;
48
+ if (!bib)
49
+ return;
50
+ const starts = [...bib.body.matchAll(/^@/gm)].map((m) => m.index);
51
+ starts.forEach((s, i) => {
52
+ const entry = bib.body.slice(s, starts[i + 1] ?? bib.body.length);
53
+ if (NOT_AN_ENTRY.test(entry))
54
+ return;
55
+ if (HAS_LINK.test(entry) || HAS_ARXIV.test(entry))
56
+ return;
57
+ const [head = ""] = entry.split("\n");
58
+ const key = /\{\s*([^,\s]+)/.exec(head)?.[1] ?? "?";
59
+ const from = bib.bodyStart + s;
60
+ context.report({
61
+ loc: {
62
+ start: sc.getLocFromIndex(from),
63
+ end: sc.getLocFromIndex(from + head.length),
64
+ },
65
+ messageId: "unreachable",
66
+ data: { key },
67
+ });
68
+ });
69
+ },
70
+ };
71
+ },
72
+ },
73
+ },
74
+ };
75
+ //# sourceMappingURL=bib-reachable-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bib-reachable-entry.js","sourceRoot":"","sources":["../../eslint-rules/bib-reachable-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,2CAA2C;AAC3C,MAAM,YAAY,GAAG,gCAAgC,CAAC;AACtD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AACpC,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAE/C,eAAe;IACb,KAAK,EAAE;QACL,iBAAiB,EAAE;YACjB,IAAI,EAAE;gBACJ,IAAI,EAAE,YAAqB;gBAC3B,IAAI,EAAE;oBACJ,WAAW,EACT,0FAA0F;iBAC7F;gBACD,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE;oBACR,WAAW,EACT,2LAA2L;iBAC9L;aACF;YACD,MAAM,CAAC,OAAoB;gBACzB,OAAO;oBACL,WAAW;wBACT,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;wBAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC;wBAC9B,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAC3D,IAAI,CAAC,GAAG;4BAAE,OAAO;wBACjB,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBAClE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;4BACtB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAClE,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gCAAE,OAAO;4BACrC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;gCAAE,OAAO;4BAC1D,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BACtC,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;4BACpD,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;4BAC/B,OAAO,CAAC,MAAM,CAAC;gCACb,GAAG,EAAE;oCACH,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;oCAC/B,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;iCAC5C;gCACD,SAAS,EAAE,aAAa;gCACxB,IAAI,EAAE,EAAE,GAAG,EAAE;6BACd,CAAC,CAAC;wBACL,CAAC,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC;YACJ,CAAC;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Rule 10's mechanical half: nothing outside the port may name a file by WHERE IT IS
3
+ * INSTALLED.
4
+ *
5
+ * The class this exists for has broken this repository five times, silently every time, and
6
+ * the detail is in `docs/incidents.md`. What matters for the code below is the shape of the
7
+ * defect: a path that is correct in one install channel and absent in another. There are
8
+ * three channels and each has its own give-away prefix — the consumer's skills directory
9
+ * (the symlink channel), the package directory npm creates, and the plugin cache. A literal
10
+ * naming any of them is a bet on the channel, made by a file that has no business knowing
11
+ * which channel it is in.
12
+ *
13
+ * WHY TWO RULES RATHER THAN ONE. The literals live in two different languages: markdown, in
14
+ * a skill's own prose and in its `allowed-tools` frontmatter, and JavaScript, in the modules
15
+ * this package ships. A single rule cannot visit both — ESLint hands a rule the AST of
16
+ * whatever language the file is, and the node types share nothing. So the detector is shared
17
+ * and the visitors are not.
18
+ *
19
+ * WHY NOT A GREP OVER THE FILE. In markdown the give-away sits inside a fenced block, inline
20
+ * code, or a YAML frontmatter value, and a text scan cannot tell those from a sentence that
21
+ * merely discusses the hazard — which is exactly what `CLAUDE.md` and `docs/incidents.md` do.
22
+ * The parser can: this rule sees nodes, and it is pointed only at skills.
23
+ */
24
+ import type { RuleContext } from "./rule-context.ts";
25
+ declare const CHANNEL_PREFIXES: string[];
26
+ /** The first channel prefix appearing in `s`, or null. Plain substring: a path IS a string. */
27
+ declare function channelPrefixIn(s: unknown): string | null;
28
+ declare const PORT = "skills/paper-pipeline/scripts/consumer.mjs";
29
+ declare const _default: {
30
+ rules: {
31
+ "md-install-path": {
32
+ meta: {
33
+ type: "problem";
34
+ docs: {
35
+ description: string;
36
+ };
37
+ schema: never[];
38
+ messages: Readonly<Record<string, string>>;
39
+ };
40
+ create(context: RuleContext): {
41
+ yaml: (node: {
42
+ readonly value?: unknown;
43
+ }) => void;
44
+ code: (node: {
45
+ readonly value?: unknown;
46
+ }) => void;
47
+ inlineCode: (node: {
48
+ readonly value?: unknown;
49
+ }) => void;
50
+ text: (node: {
51
+ readonly value?: unknown;
52
+ }) => void;
53
+ };
54
+ };
55
+ "js-install-path": {
56
+ meta: {
57
+ type: "problem";
58
+ docs: {
59
+ description: string;
60
+ };
61
+ schema: never[];
62
+ messages: Readonly<Record<string, string>>;
63
+ };
64
+ create(context: RuleContext): {
65
+ Literal(node: {
66
+ readonly value: unknown;
67
+ }): void;
68
+ TemplateElement(node: {
69
+ readonly value?: {
70
+ readonly cooked?: string | null;
71
+ readonly raw: string;
72
+ };
73
+ }): void;
74
+ };
75
+ };
76
+ };
77
+ };
78
+ export default _default;
79
+ export { channelPrefixIn, CHANNEL_PREFIXES, PORT };
80
+ //# sourceMappingURL=install-path-literals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-path-literals.d.ts","sourceRoot":"","sources":["../../eslint-rules/install-path-literals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,QAAA,MAAM,gBAAgB,UAKrB,CAAC;AAEF,+FAA+F;AAC/F,iBAAS,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIlD;AAKD,QAAA,MAAM,IAAI,+CAA+C,CAAC;;;;;;;;;;;;4BAqBxC,WAAW;6BACJ;oBAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;iBAAE;6BAA5B;oBAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;iBAAE;mCAA5B;oBAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;iBAAE;6BAA5B;oBAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;iBAAE;;;;;;;;;;;;4BAsBnC,WAAW;8BAKT;oBAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;iBAAE;sCAMnB;oBACpB,QAAQ,CAAC,KAAK,CAAC,EAAE;wBACf,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;wBAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;qBACtB,CAAC;iBACH;;;;;AAQP,wBAEE;AACF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC"}