paperlint 2.0.0 → 2.1.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 (207) hide show
  1. package/.github/workflows/ci.yml +4 -4
  2. package/CLAUDE.md +3 -3
  3. package/CONTRIBUTING.md +21 -0
  4. package/LICENSE +1 -1
  5. package/README.md +81 -24
  6. package/action.harness.mjs +10 -10
  7. package/action.mutations.mjs +3 -3
  8. package/action.yml +11 -11
  9. package/bin/{rpp.mjs → paperlint.mjs} +2 -2
  10. package/dist/adapters/banal/invocation.js +3 -3
  11. package/dist/adapters/banal/invocation.js.map +1 -1
  12. package/dist/adapters/banal/run.d.ts +1 -1
  13. package/dist/adapters/banal/run.js +1 -1
  14. package/dist/adapters/banal/run.js.map +1 -1
  15. package/dist/adapters/banal/settings.d.ts +4 -4
  16. package/dist/adapters/banal/settings.d.ts.map +1 -1
  17. package/dist/adapters/banal/settings.js +4 -4
  18. package/dist/adapters/banal/settings.js.map +1 -1
  19. package/dist/adapters/banal/xml.js +1 -1
  20. package/dist/adapters/banal/xml.js.map +1 -1
  21. package/dist/adapters/curl/download.io.d.ts.map +1 -1
  22. package/dist/adapters/curl/download.io.js +2 -2
  23. package/dist/adapters/curl/download.io.js.map +1 -1
  24. package/dist/build-engine.d.ts +1 -1
  25. package/dist/build-engine.d.ts.map +1 -1
  26. package/dist/build-engine.js +6 -3
  27. package/dist/build-engine.js.map +1 -1
  28. package/dist/build.d.ts +1 -1
  29. package/dist/build.d.ts.map +1 -1
  30. package/dist/build.js +5 -4
  31. package/dist/build.js.map +1 -1
  32. package/dist/cli.d.ts +29 -30
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +174 -98
  35. package/dist/cli.js.map +1 -1
  36. package/dist/doctor.d.ts.map +1 -1
  37. package/dist/doctor.js +21 -6
  38. package/dist/doctor.js.map +1 -1
  39. package/dist/engine.d.ts +2 -2
  40. package/dist/engine.d.ts.map +1 -1
  41. package/dist/engine.js +1 -1
  42. package/dist/facts-file.d.ts +33 -9
  43. package/dist/facts-file.d.ts.map +1 -1
  44. package/dist/facts-file.js +117 -17
  45. package/dist/facts-file.js.map +1 -1
  46. package/dist/hooks-settings.d.ts +0 -18
  47. package/dist/hooks-settings.d.ts.map +1 -1
  48. package/dist/hooks-settings.js +70 -42
  49. package/dist/hooks-settings.js.map +1 -1
  50. package/dist/init.d.ts +13 -10
  51. package/dist/init.d.ts.map +1 -1
  52. package/dist/init.js +74 -42
  53. package/dist/init.js.map +1 -1
  54. package/dist/link-skills.js +2 -2
  55. package/dist/link-skills.js.map +1 -1
  56. package/dist/new-paper.d.ts +2 -2
  57. package/dist/new-paper.d.ts.map +1 -1
  58. package/dist/new-paper.js +17 -2
  59. package/dist/new-paper.js.map +1 -1
  60. package/dist/paper-settings.d.ts +68 -0
  61. package/dist/paper-settings.d.ts.map +1 -0
  62. package/dist/paper-settings.js +144 -0
  63. package/dist/paper-settings.js.map +1 -0
  64. package/dist/presets.d.ts +84 -0
  65. package/dist/presets.d.ts.map +1 -0
  66. package/dist/presets.js +186 -0
  67. package/dist/presets.js.map +1 -0
  68. package/dist/rules-config.d.ts +8 -1
  69. package/dist/rules-config.d.ts.map +1 -1
  70. package/dist/rules-config.js +13 -8
  71. package/dist/rules-config.js.map +1 -1
  72. package/dist/structure.d.ts.map +1 -1
  73. package/dist/structure.js +2 -1
  74. package/dist/structure.js.map +1 -1
  75. package/dist/tex-requirements.d.ts +63 -7
  76. package/dist/tex-requirements.d.ts.map +1 -1
  77. package/dist/tex-requirements.js +91 -24
  78. package/dist/tex-requirements.js.map +1 -1
  79. package/dist/toolchain.d.ts +2 -2
  80. package/dist/toolchain.d.ts.map +1 -1
  81. package/dist/toolchain.js +8 -8
  82. package/dist/toolchain.js.map +1 -1
  83. package/dist/types.d.ts +4 -4
  84. package/dist/types.d.ts.map +1 -1
  85. package/dist/venue-rules.d.ts +109 -0
  86. package/dist/venue-rules.d.ts.map +1 -0
  87. package/dist/venue-rules.js +387 -0
  88. package/dist/venue-rules.js.map +1 -0
  89. package/docs/configuration.md +73 -17
  90. package/docs/e2e.md +3 -4
  91. package/docs/install.md +11 -3
  92. package/docs/optional-rules.md +26 -25
  93. package/docs/rules.md +132 -3
  94. package/docs/toolchain.md +5 -5
  95. package/eslint-rules/paper-typography.mjs +1 -1
  96. package/eslint-rules/paper-typography.mutations.mjs +1 -1
  97. package/eslint-rules/papers.mjs +6 -2
  98. package/eslint-rules/pdf-last-page-balance.harness.mjs +5 -3
  99. package/eslint-rules/pdf-last-page-balance.mjs +23 -2
  100. package/fixtures/build-e2e/acmart/paperlint.json +1 -0
  101. package/fixtures/build-e2e/guards/paper.tex +1 -1
  102. package/fixtures/pdf-facts/README.md +1 -1
  103. package/fixtures/real-markdown-paper/baseline.json +1 -1
  104. package/fixtures/real-markdown-paper/baseline.mjs +2 -2
  105. package/fixtures/toolchain-mirror/install-tl +2 -2
  106. package/fixtures/toolchain-mirror/stub-pdflatex +1 -1
  107. package/fixtures/toolchain-mirror/stub-tlmgr +1 -1
  108. package/hooks/hooks.harness.mjs +1 -1
  109. package/lib/paper-config.d.mts +7 -0
  110. package/lib/paper-config.harness.mjs +3 -3
  111. package/lib/paper-config.mjs +34 -3
  112. package/lib/skill-trigger-cases.harness.mjs +1 -1
  113. package/package.json +4 -4
  114. package/plugin/hooks/hooks.json +3 -3
  115. package/scripts/check.mjs +1 -1
  116. package/scripts/harness-api.frozen.json +1 -1
  117. package/scripts/harness-api.test.ts +2 -2
  118. package/scripts/layer-legacy.frozen.json +1 -1
  119. package/scripts/mutation-batteries-frozen.harness.mjs +1 -1
  120. package/scripts/mutation-batteries.frozen.json +2 -2
  121. package/scripts/release-config.test.ts +1 -1
  122. package/skills/find-venue/SKILL.md +5 -1
  123. package/skills/find-venue/SKILL.md.spec.ts +4 -0
  124. package/skills/paper-pipeline/PIPELINE-MAP.md +14 -4
  125. package/skills/paper-pipeline/SKILL.md +4 -3
  126. package/skills/paper-pipeline/SKILL.md.spec.ts +3 -2
  127. package/skills/paper-pipeline/description-language.eval.mjs +1 -1
  128. package/skills/paper-pipeline/framing-vs-vocabulary.eval.mjs +1 -1
  129. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +2 -2
  130. package/skills/paper-pipeline/pipeline-firing.eval.mjs +1 -1
  131. package/skills/paper-pipeline/pipeline-language.eval.mjs +1 -1
  132. package/skills/paper-pipeline/scripts/consumer.d.mts +1 -0
  133. package/skills/paper-pipeline/scripts/consumer.harness.mjs +10 -4
  134. package/skills/paper-pipeline/scripts/consumer.mjs +8 -1
  135. package/skills/paper-pipeline/scripts/consumer.mutations.mjs +1 -1
  136. package/skills/render-paper/SKILL.md +3 -3
  137. package/skills/render-paper/SKILL.md.spec.ts +2 -2
  138. package/skills/render-paper/extract-pdf-facts.harness.mjs +6 -6
  139. package/skills/render-paper/extract-pdf-facts.mjs +4 -4
  140. package/skills/study-accepted-papers/SKILL.md +2 -1
  141. package/skills/study-accepted-papers/SKILL.md.spec.ts +1 -0
  142. package/skills/submit-paper/SKILL.md +9 -1
  143. package/skills/submit-paper/SKILL.md.spec.ts +8 -0
  144. package/skills/submit-paper/references/venues/acm-sigconf.jsonc +86 -0
  145. package/skills/submit-paper/references/venues/agenticdev.jsonc +34 -102
  146. package/skills/submit-paper/references/venues/aisec.jsonc +21 -82
  147. package/skills/submit-paper/references/venues/realm.jsonc +45 -43
  148. package/skills/submit-paper/references/venues/tex-base.jsonc +1 -1
  149. package/skills/submit-paper/references/venues/venue-profile.schema.json +120 -30
  150. package/src/adapters/banal/index.test.ts +1 -1
  151. package/src/adapters/banal/invocation.test.ts +3 -3
  152. package/src/adapters/banal/invocation.ts +3 -3
  153. package/src/adapters/banal/locate.test.ts +4 -4
  154. package/src/adapters/banal/run.ts +2 -2
  155. package/src/adapters/banal/settings.test.ts +12 -6
  156. package/src/adapters/banal/settings.ts +9 -5
  157. package/src/adapters/banal/xml.test.ts +1 -1
  158. package/src/adapters/banal/xml.ts +1 -1
  159. package/src/adapters/curl/download.io.ts +4 -2
  160. package/src/adapters/curl/download.test.ts +3 -1
  161. package/src/adapters/node/files.test.ts +1 -1
  162. package/src/adapters/node/process.test.ts +2 -2
  163. package/src/adapters/node/workspace.test.ts +4 -4
  164. package/src/build-engine.harness.mjs +2 -2
  165. package/src/build-engine.ts +11 -3
  166. package/src/build.harness.mjs +27 -22
  167. package/src/build.mutations.mjs +3 -2
  168. package/src/build.ts +6 -5
  169. package/src/cli.harness.mjs +72 -131
  170. package/src/cli.mutations.mjs +7 -32
  171. package/src/cli.ts +204 -121
  172. package/src/doctor.harness.mjs +9 -25
  173. package/src/doctor.ts +28 -5
  174. package/src/engine.harness.mjs +4 -2
  175. package/src/engine.ts +2 -2
  176. package/src/facts-file.test.ts +54 -7
  177. package/src/facts-file.ts +145 -24
  178. package/src/hooks-settings.harness.mjs +24 -15
  179. package/src/hooks-settings.mutations.mjs +2 -4
  180. package/src/hooks-settings.ts +92 -49
  181. package/src/init.ts +88 -52
  182. package/src/latex-log.harness.mjs +1 -1
  183. package/src/link-skills.harness.mjs +3 -1
  184. package/src/link-skills.mutations.mjs +1 -1
  185. package/src/link-skills.ts +2 -2
  186. package/src/new-paper.harness.mjs +10 -7
  187. package/src/new-paper.test.ts +145 -0
  188. package/src/new-paper.ts +22 -2
  189. package/src/paper-settings-commands.test.ts +311 -0
  190. package/src/paper-settings.test.ts +220 -0
  191. package/src/paper-settings.ts +206 -0
  192. package/src/pdf-facts.harness.mjs +1 -1
  193. package/src/presets.test.ts +236 -0
  194. package/src/presets.ts +307 -0
  195. package/src/rules-config.ts +14 -9
  196. package/src/structure.harness.mjs +4 -4
  197. package/src/structure.ts +2 -1
  198. package/src/tex-requirements.harness.mjs +12 -18
  199. package/src/tex-requirements.ts +179 -29
  200. package/src/toolchain.harness.mjs +34 -25
  201. package/src/toolchain.ts +14 -8
  202. package/src/types.ts +4 -4
  203. package/src/venue-rules.test.ts +545 -0
  204. package/src/venue-rules.ts +573 -0
  205. package/templates/paper/paperlint.json +4 -0
  206. package/fixtures/build-e2e/acmart/venue.json +0 -1
  207. package/plugin/.claude-plugin/plugin.json +0 -8
@@ -36,8 +36,8 @@ export type NewPaperResult = {
36
36
  readonly reason: string;
37
37
  };
38
38
  /**
39
- * The files a paper folder must end up with: the scorecard, plus a source in `format` — unless
40
- * it already has a source in EITHER format, in which case that one stands and nothing is added.
39
+ * The files a paper folder must end up with: the scorecard, a source in `format` — unless it
40
+ * already has a source in EITHER format, in which case that one stands — and `paperlint.json`.
41
41
  */
42
42
  export declare function wantedFiles(dir: string, format: PaperFormat): string[];
43
43
  export declare function newPaper(papersRoot: string, name: string, format: PaperFormat, { packageTemplates }?: {
@@ -1 +1 @@
1
- {"version":3,"file":"new-paper.d.ts","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"AA4BA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;AACvC,eAAO,MAAM,OAAO,EAAE,SAAS,WAAW,EAAkB,CAAC;AAC7D,eAAO,MAAM,cAAc,EAAE,WAAmB,CAAC;AAEjD,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,QAE7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAG7D,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,WACP,CAAC;AAErC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IACpC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAKtE;AAGD,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,EAAE,gBAAoC,EAAE,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3E,cAAc,CAsChB;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC1B,MAAM,EAAE,CAYV"}
1
+ {"version":3,"file":"new-paper.d.ts","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;AACvC,eAAO,MAAM,OAAO,EAAE,SAAS,WAAW,EAAkB,CAAC;AAC7D,eAAO,MAAM,cAAc,EAAE,WAAmB,CAAC;AAEjD,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,QAE7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAG7D,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,WACP,CAAC;AAErC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IACpC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAEtE;AAsBD,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,EAAE,gBAAoC,EAAE,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3E,cAAc,CAsChB;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC1B,MAAM,EAAE,CAYV"}
package/dist/new-paper.js CHANGED
@@ -19,6 +19,7 @@ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync, } from "n
19
19
  /* eslint-enable boundaries/dependencies */
20
20
  import { join } from "node:path";
21
21
  import { fileURLToPath } from "node:url";
22
+ import { LEGACY_PAPER_SETTINGS_FILE, PAPER_SETTINGS_FILE, } from "../lib/paper-config.mjs";
22
23
  export const FORMATS = ["tex", "md"];
23
24
  export const DEFAULT_FORMAT = "tex";
24
25
  /** The package's default templates. Read from disk, so they ship in the tarball (`files`). */
@@ -48,13 +49,27 @@ export function nameProblem(name) {
48
49
  return null;
49
50
  }
50
51
  /**
51
- * The files a paper folder must end up with: the scorecard, plus a source in `format` — unless
52
- * it already has a source in EITHER format, in which case that one stands and nothing is added.
52
+ * The files a paper folder must end up with: the scorecard, a source in `format` — unless it
53
+ * already has a source in EITHER format, in which case that one stands — and `paperlint.json`.
53
54
  */
54
55
  export function wantedFiles(dir, format) {
56
+ return [...scorecardAndSource(dir, format), ...settingsFile(dir)];
57
+ }
58
+ function scorecardAndSource(dir, format) {
55
59
  const hasSource = Object.values(SOURCE_FILE).some((f) => existsSync(join(dir, f)));
56
60
  return hasSource ? [STATUS_FILE] : [STATUS_FILE, SOURCE_FILE[format]];
57
61
  }
62
+ /**
63
+ * `paperlint.json`, so that nobody has to know the file exists: its template says what to put in
64
+ * it, and until a venue preset is named lint says so in one warning. Not beside a pre-2.1.0
65
+ * `venue.json`: `paperlint init` moves that file, and a second, different one would make the move
66
+ * refuse.
67
+ */
68
+ function settingsFile(dir) {
69
+ return existsSync(join(dir, LEGACY_PAPER_SETTINGS_FILE))
70
+ ? []
71
+ : [PAPER_SETTINGS_FILE];
72
+ }
58
73
  // Documented in README.md#starting-a-paper — update it when this changes.
59
74
  export function newPaper(papersRoot, name, format, { packageTemplates = PACKAGE_TEMPLATES } = {}) {
60
75
  const problem = nameProblem(name);
@@ -1 +1 @@
1
- {"version":3,"file":"new-paper.js","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"new-paper.js","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { type Result } from "./domain/result.ts";
2
+ import type { Files } from "./ports/files.ts";
3
+ import { type Parsed, type RuleEntry } from "./rules-config.ts";
4
+ /** What one paper declares. Every absent field is null. */
5
+ export interface PaperSettings {
6
+ /** The venue preset the paper is judged against: `paperlint:<name>` or a relative path. */
7
+ readonly extends: string | null;
8
+ /** The kind of paper (`short`, `research`, …), whose page limit applies. */
9
+ readonly kind: string | null;
10
+ /** The built PDF relative to the paper, when it is not `paper.pdf`. */
11
+ readonly pdf: string | null;
12
+ /** Rule overrides for this paper alone, NOT yet checked against the shipped rules. */
13
+ readonly rules: Readonly<Record<string, unknown>> | null;
14
+ }
15
+ /** Why a paper's settings cannot be read. */
16
+ export type SettingsProblem = {
17
+ readonly kind: "broken";
18
+ readonly why: string;
19
+ } | {
20
+ readonly kind: "legacy";
21
+ };
22
+ /** The parsed JSON of `paperlint.json` → the settings, or one line saying what is wrong. Pure. */
23
+ export declare function parsePaperSettings(json: unknown): Result<PaperSettings, string>;
24
+ /**
25
+ * A paper's settings: null when it has no `paperlint.json`; the problem when the file does not parse
26
+ * or only the pre-2.1.0 `venue.json` is there. Reads through `files` only; never throws.
27
+ */
28
+ export declare function readPaperSettings(files: Files, paperDir: string): Result<PaperSettings | null, SettingsProblem>;
29
+ /** What `paperlint init` does with one paper's files. */
30
+ export type Migration =
31
+ /** No `venue.json`: nothing to do. */
32
+ {
33
+ readonly kind: "none";
34
+ }
35
+ /** Only `venue.json`: write `text` as `paperlint.json`, delete `venue.json`. */
36
+ | {
37
+ readonly kind: "move";
38
+ readonly text: string;
39
+ }
40
+ /** Both, and `paperlint.json` already says the same: the old one is a leftover, delete it. */
41
+ | {
42
+ readonly kind: "drop-legacy";
43
+ }
44
+ /** Both, and they differ: refuse — there is no way to know which one the author means. */
45
+ | {
46
+ readonly kind: "conflict";
47
+ }
48
+ /** `venue.json` is not a JSON object: refuse, naming why. */
49
+ | {
50
+ readonly kind: "broken";
51
+ readonly why: string;
52
+ };
53
+ /**
54
+ * A `venue.json` object → the `paperlint.json` object that says the same, in one move:
55
+ * `"venue": "aisec"` becomes `"extends": "paperlint:aisec"` (the only presets that existed were the
56
+ * shipped ones), and the `"_"` some files used as a comment becomes `"$comment"`. Every other key
57
+ * is carried as it is — an unknown one is then refused by name, as in any `paperlint.json`. Pure.
58
+ */
59
+ export declare function fromLegacy(legacy: Readonly<Record<string, unknown>>): Record<string, unknown>;
60
+ /** The move, planned from the two files' bytes (null = absent). Pure. */
61
+ export declare function migrationOf(legacy: Uint8Array | null, current: Uint8Array | null): Migration;
62
+ /**
63
+ * `rules` → the parsed entries (rule id → severity or `[severity, options]`), or the error naming
64
+ * the file. Null when the paper sets none. The block they go into is built where the config is
65
+ * (`paperRuleBlocks` in cli.ts), which also knows which files a paper's rules may reach.
66
+ */
67
+ export declare function paperRules(paperDir: string, settings: PaperSettings, shipped: ReadonlySet<string>): Parsed<Record<string, RuleEntry> | null>;
68
+ //# sourceMappingURL=paper-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paper-settings.d.ts","sourceRoot":"","sources":["../src/paper-settings.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAE3B,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;CAC1D;AAED,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAsChC,kGAAkG;AAClG,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAc/B;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,aAAa,GAAG,IAAI,EAAE,eAAe,CAAC,CAe/C;AAID,yDAAyD;AACzD,MAAM,MAAM,SAAS;AACnB,sCAAsC;AACpC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAC3B,gFAAgF;GAC9E;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAClD,8FAA8F;GAC5F;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE;AAClC,0FAA0F;GACxF;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE;AAC/B,6DAA6D;GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAUD,yEAAyE;AACzE,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,GAAG,IAAI,EACzB,OAAO,EAAE,UAAU,GAAG,IAAI,GACzB,SAAS,CAUX;AAID;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAI1C"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * `<paper>/paperlint.json` — ONE PAPER'S SETTINGS, parsed at the boundary.
3
+ *
4
+ * The middle of three levels, each named after the tool (lib/paper-config.mjs):
5
+ *
6
+ * package.json → "paperlint" the project
7
+ * <paper>/paperlint.json this paper: { extends, kind, pdf, rules }
8
+ * a venue preset `paperlint:<name>` (shipped) or `./x.jsonc` (src/presets.ts)
9
+ *
10
+ * Every reader — the build, the facts writer, the venue rules, `paperlint lint` — goes through
11
+ * `readPaperSettings`, so there is one answer to "what does this paper declare".
12
+ *
13
+ * 🔴 STRICT. An unknown key is an error naming the known ones: `"venu": "aisec"` would otherwise
14
+ * read as "no preset", and every venue check would be silently off.
15
+ *
16
+ * 🔴 THE OLD NAME IS NOT READ. Before 2.1.0 the file was `venue.json`. A fallback would keep it
17
+ * working forever and leave two names for one file; instead a `venue.json` with no `paperlint.json`
18
+ * is an error that names `npx paperlint init`, which moves it (`migrationOf` plans that move).
19
+ */
20
+ import { join } from "node:path";
21
+ import { LEGACY_PAPER_SETTINGS_FILE, PAPER_SETTINGS_FILE, PAPER_SETTINGS_KEYS, } from "../lib/paper-config.mjs";
22
+ import { err, ok } from "./domain/result.js";
23
+ import { parseRuleEntries, } from "./rules-config.js";
24
+ const KNOWN = Object.keys(PAPER_SETTINGS_KEYS);
25
+ const STRING_FIELDS = ["extends", "kind", "pdf"];
26
+ const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
27
+ /** A string field: absent is null, anything but a non-empty string is the error. */
28
+ function stringField(d, k) {
29
+ const v = d[k];
30
+ // `"extends": null` is what `paperlint new` writes: no venue chosen yet.
31
+ if (v === undefined || (k === "extends" && v === null))
32
+ return ok(null);
33
+ return typeof v === "string" && v !== ""
34
+ ? ok(v)
35
+ : err(`"${k}" must be a non-empty string, got ${JSON.stringify(v)}`);
36
+ }
37
+ /** `extends`, `kind` and `pdf`, each null when absent. */
38
+ function stringFields(d) {
39
+ const out = {};
40
+ for (const k of STRING_FIELDS) {
41
+ const f = stringField(d, k);
42
+ if (!f.ok)
43
+ return f;
44
+ out[k] = f.value;
45
+ }
46
+ return ok({
47
+ extends: out["extends"] ?? null,
48
+ kind: out["kind"] ?? null,
49
+ pdf: out["pdf"] ?? null,
50
+ });
51
+ }
52
+ /** The parsed JSON of `paperlint.json` → the settings, or one line saying what is wrong. Pure. */
53
+ export function parsePaperSettings(json) {
54
+ if (!isObject(json))
55
+ return err("must be a JSON object");
56
+ const unknown = Object.keys(json).filter((k) => !KNOWN.includes(k));
57
+ if (unknown.length > 0)
58
+ return err(`unknown key "${unknown[0]}" — known keys: ${KNOWN.join(", ")}`);
59
+ const fields = stringFields(json);
60
+ if (!fields.ok)
61
+ return fields;
62
+ const rules = json["rules"];
63
+ if (rules !== undefined && !isObject(rules))
64
+ return err(`"rules" must be an object of rule id → severity`);
65
+ return ok({
66
+ ...fields.value,
67
+ rules: rules ?? null,
68
+ });
69
+ }
70
+ const at = (p) => p;
71
+ /**
72
+ * A paper's settings: null when it has no `paperlint.json`; the problem when the file does not parse
73
+ * or only the pre-2.1.0 `venue.json` is there. Reads through `files` only; never throws.
74
+ */
75
+ export function readPaperSettings(files, paperDir) {
76
+ const bytes = files.readBytes(at(join(paperDir, PAPER_SETTINGS_FILE)));
77
+ if (bytes === null)
78
+ return files.readBytes(at(join(paperDir, LEGACY_PAPER_SETTINGS_FILE))) ===
79
+ null
80
+ ? ok(null)
81
+ : err({ kind: "legacy" });
82
+ let json;
83
+ try {
84
+ json = JSON.parse(new TextDecoder().decode(bytes));
85
+ }
86
+ catch (e) {
87
+ return err({ kind: "broken", why: `not JSON (${e.message})` });
88
+ }
89
+ const parsed = parsePaperSettings(json);
90
+ return parsed.ok ? parsed : err({ kind: "broken", why: parsed.error });
91
+ }
92
+ /**
93
+ * A `venue.json` object → the `paperlint.json` object that says the same, in one move:
94
+ * `"venue": "aisec"` becomes `"extends": "paperlint:aisec"` (the only presets that existed were the
95
+ * shipped ones), and the `"_"` some files used as a comment becomes `"$comment"`. Every other key
96
+ * is carried as it is — an unknown one is then refused by name, as in any `paperlint.json`. Pure.
97
+ */
98
+ export function fromLegacy(legacy) {
99
+ const out = {};
100
+ for (const [k, v] of Object.entries(legacy)) {
101
+ if (k === "venue" && typeof v === "string")
102
+ out["extends"] = `paperlint:${v}`;
103
+ else if (k === "_")
104
+ out["$comment"] = v;
105
+ else
106
+ out[k] = v;
107
+ }
108
+ return out;
109
+ }
110
+ const jsonOf = (b) => {
111
+ try {
112
+ return JSON.parse(new TextDecoder().decode(b));
113
+ }
114
+ catch {
115
+ return undefined;
116
+ }
117
+ };
118
+ /** The move, planned from the two files' bytes (null = absent). Pure. */
119
+ export function migrationOf(legacy, current) {
120
+ if (legacy === null)
121
+ return { kind: "none" };
122
+ const old = jsonOf(legacy);
123
+ if (!isObject(old))
124
+ return { kind: "broken", why: "it is not a JSON object" };
125
+ const next = fromLegacy(old);
126
+ if (current === null)
127
+ return { kind: "move", text: `${JSON.stringify(next, null, 2)}\n` };
128
+ return JSON.stringify(jsonOf(current)) === JSON.stringify(next)
129
+ ? { kind: "drop-legacy" }
130
+ : { kind: "conflict" };
131
+ }
132
+ // ── the paper's rule overrides ──────────────────────────────────────────────────────────
133
+ /**
134
+ * `rules` → the parsed entries (rule id → severity or `[severity, options]`), or the error naming
135
+ * the file. Null when the paper sets none. The block they go into is built where the config is
136
+ * (`paperRuleBlocks` in cli.ts), which also knows which files a paper's rules may reach.
137
+ */
138
+ export function paperRules(paperDir, settings, shipped) {
139
+ if (settings.rules === null)
140
+ return { ok: true, value: null };
141
+ const where = `${join(paperDir, PAPER_SETTINGS_FILE)} → "rules"`;
142
+ return parseRuleEntries(settings.rules, where, shipped);
143
+ }
144
+ //# sourceMappingURL=paper-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paper-settings.js","sourceRoot":"","sources":["../src/paper-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { type TexRequirements, type VenueFormat } from "./tex-requirements.ts";
2
+ import { type Result } from "./domain/result.ts";
3
+ import type { Files } from "./ports/files.ts";
4
+ import { type PaperSettings, type SettingsProblem } from "./paper-settings.ts";
5
+ /** The prefix of a shipped preset's spec. */
6
+ export declare const SHIPPED_PREFIX = "paperlint:";
7
+ /** The longest chain of presets, the paper's own target included. */
8
+ export declare const MAX_PRESET_DEPTH = 4;
9
+ export interface PresetDeps {
10
+ readonly files: Files;
11
+ /** The package's venues directory: the shipped presets and the schema every preset is checked against. */
12
+ readonly venuesDir: string;
13
+ }
14
+ /** A resolved chain, merged. */
15
+ export interface Preset {
16
+ /** The word for this venue in messages. */
17
+ readonly label: string;
18
+ /** Every file of the chain, root first. */
19
+ readonly chain: readonly string[];
20
+ readonly template: string | null;
21
+ readonly tex: TexRequirements;
22
+ readonly format: VenueFormat;
23
+ readonly rules: Readonly<Record<string, unknown>>;
24
+ }
25
+ /** Why a spec does not resolve. */
26
+ export type PresetProblem = {
27
+ readonly kind: "unsupported";
28
+ readonly spec: string;
29
+ } | {
30
+ readonly kind: "not-found";
31
+ readonly spec: string;
32
+ readonly file: string;
33
+ readonly shipped: readonly string[];
34
+ } | {
35
+ readonly kind: "cycle";
36
+ readonly chain: readonly string[];
37
+ } | {
38
+ readonly kind: "too-deep";
39
+ readonly chain: readonly string[];
40
+ } | {
41
+ readonly kind: "broken";
42
+ readonly file: string;
43
+ readonly why: string;
44
+ };
45
+ /** The display label of a spec: the file name without its extension. Pure. */
46
+ export declare function labelOf(spec: string): string;
47
+ /** A child's format over its parent's: per key the child wins, kinds by name. Pure. */
48
+ export declare function mergeFormat(parent: VenueFormat, child: VenueFormat): VenueFormat;
49
+ /**
50
+ * `spec`, as written in `fromFile` (a paper's `paperlint.json`), → the merged preset, or why it
51
+ * does not resolve. Reads through `deps.files` only; never throws.
52
+ */
53
+ export declare function resolvePreset(spec: string, fromFile: string, deps: PresetDeps): Result<Preset, PresetProblem>;
54
+ /** The shipped presets' names (each is spelled `paperlint:<name>`). */
55
+ export declare function shippedPresets(venuesDir: string): string[];
56
+ /** One line for a problem, naming what to change. Pure. */
57
+ export declare function presetProblemText(p: PresetProblem): string;
58
+ /** What one paper declares and the preset it resolves to — one answer for every reader. */
59
+ export type PaperPreset =
60
+ /** No `paperlint.json`, or one without `extends`: no venue checks, the base TeX set. */
61
+ {
62
+ readonly kind: "none";
63
+ readonly settings: PaperSettings | null;
64
+ } | {
65
+ readonly kind: "resolved";
66
+ readonly settings: PaperSettings;
67
+ readonly preset: Preset;
68
+ }
69
+ /** `paperlint.json` does not parse, or only a pre-2.1.0 `venue.json` is there. */
70
+ | {
71
+ readonly kind: "settings-problem";
72
+ readonly problem: SettingsProblem;
73
+ }
74
+ /** `extends` does not resolve. */
75
+ | {
76
+ readonly kind: "preset-problem";
77
+ readonly settings: PaperSettings;
78
+ readonly problem: PresetProblem;
79
+ };
80
+ /** A paper directory → its settings and its resolved preset. Reads through `deps.files`; never throws. */
81
+ export declare function paperPreset(paperDir: string, deps: PresetDeps): PaperPreset;
82
+ /** The one-line reason a paper's settings or preset cannot be used, or null when they can. */
83
+ export declare function paperPresetProblem(paperDir: string, p: PaperPreset): string | null;
84
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * VENUE PRESETS — what `"extends"` in a paper's `paperlint.json` resolves to.
3
+ *
4
+ * A venue is a preset, the way an ESLint config is a shareable config: a file with the venue's
5
+ * format (page size, columns, fonts, font sizes, page limits per kind), the TeX packages its
6
+ * template needs, and the rules it implies. A preset may build on another with its own `extends`:
7
+ * `agenticdev` extends the family `acm-sigconf`, which holds everything the ACM template decides.
8
+ *
9
+ * ── TWO SPEC FORMS, AND ONLY TWO ─────────────────────────────────────────────────
10
+ * paperlint:<name> a preset shipped in the package's venues directory
11
+ * ./x.jsonc, ../x a file of the project's own, relative to the file that names it
12
+ * Anything else — an npm package name, a bare name — is refused by name. npm presets are not
13
+ * supported yet; a bare name is almost always a shipped name missing its prefix, and the message says so.
14
+ *
15
+ * ── THE CHAIN ─────────────────────────────────────────────────────────────────────
16
+ * At most `MAX_PRESET_DEPTH` files, root to leaf. A cycle (relative paths can form one) is refused
17
+ * naming the chain. The chain is merged block by block:
18
+ *
19
+ * tex union — a child never removes a package its parent needs
20
+ * format per key, the child wins; `kinds` by kind name, a child's kind replaces that kind
21
+ * rules per rule id, the child wins
22
+ * template the child wins; so does `name`
23
+ *
24
+ * ── THE LABEL ─────────────────────────────────────────────────────────────────────
25
+ * Messages, the facts file and the build plan need a word for the venue. It is the most derived
26
+ * preset's `name` when one sets it, else the spec's file name without its extension
27
+ * (`paperlint:agenticdev` → `agenticdev`, `./venues/usenix-sec.jsonc` → `usenix-sec`). Display
28
+ * only: nothing is ever resolved by it.
29
+ */
30
+ import { basename, dirname, extname, join, resolve } from "node:path";
31
+ import { mergeRequirements, NO_FORMAT, NO_REQUIREMENTS, parsePreset, profileFileOf, venueNames, } from "./tex-requirements.js";
32
+ import { err, ok } from "./domain/result.js";
33
+ import { readPaperSettings, } from "./paper-settings.js";
34
+ import { LEGACY_PAPER_SETTINGS_FILE, LEGACY_PAPER_SETTINGS_MESSAGE, PAPER_SETTINGS_FILE, } from "../lib/paper-config.mjs";
35
+ /** The prefix of a shipped preset's spec. */
36
+ export const SHIPPED_PREFIX = "paperlint:";
37
+ /** The longest chain of presets, the paper's own target included. */
38
+ export const MAX_PRESET_DEPTH = 4;
39
+ /** The display label of a spec: the file name without its extension. Pure. */
40
+ export function labelOf(spec) {
41
+ const name = spec.startsWith(SHIPPED_PREFIX)
42
+ ? spec.slice(SHIPPED_PREFIX.length)
43
+ : basename(spec);
44
+ return name.slice(0, name.length - extname(name).length) || name;
45
+ }
46
+ const isRelative = (spec) => spec.startsWith("./") || spec.startsWith("../");
47
+ /** A spec → the file it names, or why it names none. Pure. */
48
+ function fileOf(spec, from, venuesDir) {
49
+ if (isRelative(spec))
50
+ return ok(resolve(dirname(from), spec));
51
+ if (!spec.startsWith(SHIPPED_PREFIX))
52
+ return err({ kind: "unsupported", spec });
53
+ const file = profileFileOf(spec.slice(SHIPPED_PREFIX.length));
54
+ return file === null
55
+ ? err({ kind: "not-found", spec, file: spec, shipped: [] })
56
+ : ok(join(venuesDir, file));
57
+ }
58
+ /** One file of the chain: read and parsed, or why not. */
59
+ function readPreset(spec, from, deps) {
60
+ const where = fileOf(spec, from, deps.venuesDir);
61
+ if (!where.ok)
62
+ return where;
63
+ const bytes = deps.files.readBytes(where.value);
64
+ if (bytes === null)
65
+ return err({ kind: "not-found", spec, file: where.value, shipped: [] });
66
+ try {
67
+ const text = new TextDecoder().decode(bytes);
68
+ return ok({
69
+ file: where.value,
70
+ preset: parsePreset(text, where.value, deps.venuesDir),
71
+ });
72
+ }
73
+ catch (e) {
74
+ return err({
75
+ kind: "broken",
76
+ file: where.value,
77
+ why: e.message.split("\n").join(" "),
78
+ });
79
+ }
80
+ }
81
+ /** The chain's files, leaf first, each parsed. */
82
+ function chainOf(spec, from, deps) {
83
+ const out = [];
84
+ let next = { spec, from };
85
+ while (next !== null) {
86
+ const r = readPreset(next.spec, next.from, deps);
87
+ if (!r.ok)
88
+ return r;
89
+ const files = out.map((x) => x.file);
90
+ if (files.includes(r.value.file))
91
+ return err({ kind: "cycle", chain: [...files, r.value.file] });
92
+ if (out.length === MAX_PRESET_DEPTH)
93
+ return err({ kind: "too-deep", chain: [...files, r.value.file] });
94
+ out.push(r.value);
95
+ const up = r.value.preset.extends;
96
+ next = up === null ? null : { spec: up, from: r.value.file };
97
+ }
98
+ return ok(out);
99
+ }
100
+ /** A child's format over its parent's: per key the child wins, kinds by name. Pure. */
101
+ export function mergeFormat(parent, child) {
102
+ const keys = Object.keys(NO_FORMAT).filter((k) => k !== "kinds");
103
+ const scalars = Object.fromEntries(keys.map((k) => [k, child[k] ?? parent[k]]));
104
+ return { ...scalars, kinds: new Map([...parent.kinds, ...child.kinds]) };
105
+ }
106
+ /** The chain, root first, merged into one preset. Pure. */
107
+ function merged(spec, rootFirst, files) {
108
+ const base = {
109
+ name: null,
110
+ template: null,
111
+ tex: NO_REQUIREMENTS,
112
+ format: NO_FORMAT,
113
+ rules: {},
114
+ };
115
+ const m = rootFirst.reduce((acc, p) => ({
116
+ name: p.name ?? acc.name,
117
+ template: p.template ?? acc.template,
118
+ tex: p.tex ? mergeRequirements(acc.tex, p.tex) : acc.tex,
119
+ format: mergeFormat(acc.format, p.format),
120
+ rules: { ...acc.rules, ...p.rules },
121
+ }), base);
122
+ return {
123
+ label: m.name ?? labelOf(spec),
124
+ chain: files,
125
+ template: m.template,
126
+ tex: m.tex,
127
+ format: m.format,
128
+ rules: m.rules,
129
+ };
130
+ }
131
+ /**
132
+ * `spec`, as written in `fromFile` (a paper's `paperlint.json`), → the merged preset, or why it
133
+ * does not resolve. Reads through `deps.files` only; never throws.
134
+ */
135
+ export function resolvePreset(spec, fromFile, deps) {
136
+ const chain = chainOf(spec, fromFile, deps);
137
+ if (!chain.ok)
138
+ return chain.error.kind === "not-found"
139
+ ? err({ ...chain.error, shipped: shippedPresets(deps.venuesDir) })
140
+ : chain;
141
+ const rootFirst = [...chain.value].reverse();
142
+ return ok(merged(spec, rootFirst.map((x) => x.preset), rootFirst.map((x) => x.file)));
143
+ }
144
+ /** The shipped presets' names (each is spelled `paperlint:<name>`). */
145
+ export function shippedPresets(venuesDir) {
146
+ return venueNames(venuesDir);
147
+ }
148
+ /** One line for a problem, naming what to change. Pure. */
149
+ export function presetProblemText(p) {
150
+ switch (p.kind) {
151
+ case "unsupported":
152
+ return `"extends": "${p.spec}" — a preset is \`paperlint:<name>\` (shipped) or a path starting with ./ or ../ (your own); npm presets: not yet supported. Did you mean "${SHIPPED_PREFIX}${p.spec}"?`;
153
+ case "not-found":
154
+ return `"extends": "${p.spec}" names no preset (${p.file}); shipped presets (${SHIPPED_PREFIX}<name>): ${p.shipped.join(", ")}`;
155
+ case "cycle":
156
+ return `the presets extend each other in a cycle: ${p.chain.join(" → ")}`;
157
+ case "too-deep":
158
+ return `the preset chain is longer than ${String(MAX_PRESET_DEPTH)}: ${p.chain.join(" → ")}`;
159
+ case "broken":
160
+ return `the preset ${p.file} does not parse: ${p.why}`;
161
+ }
162
+ }
163
+ /** A paper directory → its settings and its resolved preset. Reads through `deps.files`; never throws. */
164
+ export function paperPreset(paperDir, deps) {
165
+ const read = readPaperSettings(deps.files, paperDir);
166
+ if (!read.ok)
167
+ return { kind: "settings-problem", problem: read.error };
168
+ const settings = read.value;
169
+ if (settings?.extends == null)
170
+ return { kind: "none", settings };
171
+ const r = resolvePreset(settings.extends, join(paperDir, PAPER_SETTINGS_FILE), deps);
172
+ return r.ok
173
+ ? { kind: "resolved", settings, preset: r.value }
174
+ : { kind: "preset-problem", settings, problem: r.error };
175
+ }
176
+ /** The one-line reason a paper's settings or preset cannot be used, or null when they can. */
177
+ export function paperPresetProblem(paperDir, p) {
178
+ if (p.kind === "preset-problem")
179
+ return `${join(paperDir, PAPER_SETTINGS_FILE)}: ${presetProblemText(p.problem)}`;
180
+ if (p.kind !== "settings-problem")
181
+ return null;
182
+ return p.problem.kind === "legacy"
183
+ ? `${join(paperDir, LEGACY_PAPER_SETTINGS_FILE)}: ${LEGACY_PAPER_SETTINGS_MESSAGE}`
184
+ : `${join(paperDir, PAPER_SETTINGS_FILE)}: ${p.problem.why}`;
185
+ }
186
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,13 @@ export type Parsed<T> = {
17
17
  };
18
18
  /** Every top-level key must be one paperlint or its skills read. */
19
19
  export declare function unknownKeys(settings: Record<string, unknown>): string[];
20
+ /**
21
+ * A `rules` object — rule id → severity or `[severity, ...options]` — with only the rules paperlint
22
+ * ships. Read from the package.json blocks and from a paper's `paperlint.json`.
23
+ *
24
+ * @param where the key path to name in messages, e.g. `package.json → "paperlint".rules[0].rules`
25
+ */
26
+ export declare function parseRuleEntries(v: unknown, where: string, shipped: ReadonlySet<string>): Parsed<Record<string, RuleEntry>>;
20
27
  /**
21
28
  * The `rules` key → config blocks, or one error naming the key path.
22
29
  *
@@ -28,7 +35,7 @@ export declare function unknownKeys(settings: Record<string, unknown>): string[]
28
35
  export declare function parseRuleBlocks(raw: unknown, where: string, shipped: ReadonlySet<string>, baseDir: string): Parsed<readonly RuleBlock[]>;
29
36
  /**
30
37
  * The rule ids a config defines through its own plugins, as `<plugin>/<rule>`. Plugins passed in
31
- * `foreign` (a dependency's plugin, such as `@eslint/markdown`) are not rpp's and are skipped.
38
+ * `foreign` (a dependency's plugin, such as `@eslint/markdown`) are not paperlint's and are skipped.
32
39
  */
33
40
  export declare function shippedRuleIds(config: readonly unknown[], foreign: readonly unknown[]): Set<string>;
34
41
  //# sourceMappingURL=rules-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules-config.d.ts","sourceRoot":"","sources":["../src/rules-config.ts"],"names":[],"mappings":"AA6BA,qDAAqD;AACrD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5D,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAErE,yFAAyF;AACzF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAOnD,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAEvE;AA8ED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAC5B,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,SAAS,SAAS,EAAE,CAAC,CAa9B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,OAAO,EAAE,EAC1B,OAAO,EAAE,SAAS,OAAO,EAAE,GAC1B,GAAG,CAAC,MAAM,CAAC,CAWb"}
1
+ {"version":3,"file":"rules-config.d.ts","sourceRoot":"","sources":["../src/rules-config.ts"],"names":[],"mappings":"AA6BA,qDAAqD;AACrD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5D,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAErE,yFAAyF;AACzF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAOnD,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAEvE;AAcD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,OAAO,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAiBnC;AA0CD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAC5B,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,SAAS,SAAS,EAAE,CAAC,CAa9B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,OAAO,EAAE,EAC1B,OAAO,EAAE,SAAS,OAAO,EAAE,GAC1B,GAAG,CAAC,MAAM,CAAC,CAWb"}