paperlint 6.0.0 → 6.2.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 (141) hide show
  1. package/dist/adapters/latex/index.d.ts +1 -1
  2. package/dist/adapters/latex/index.d.ts.map +1 -1
  3. package/dist/adapters/latex/index.js +3 -2
  4. package/dist/adapters/latex/index.js.map +1 -1
  5. package/dist/adapters/latex/prose.d.ts +6 -1
  6. package/dist/adapters/latex/prose.d.ts.map +1 -1
  7. package/dist/adapters/latex/prose.js +142 -31
  8. package/dist/adapters/latex/prose.js.map +1 -1
  9. package/dist/adapters/mp4box/index.d.ts +4 -0
  10. package/dist/adapters/mp4box/index.d.ts.map +1 -0
  11. package/dist/adapters/mp4box/index.js +46 -0
  12. package/dist/adapters/mp4box/index.js.map +1 -0
  13. package/dist/adapters/node/index.d.ts +1 -0
  14. package/dist/adapters/node/index.d.ts.map +1 -1
  15. package/dist/adapters/node/index.js +1 -0
  16. package/dist/adapters/node/index.js.map +1 -1
  17. package/dist/adapters/node/list-dir.io.d.ts +3 -0
  18. package/dist/adapters/node/list-dir.io.d.ts.map +1 -0
  19. package/dist/adapters/node/list-dir.io.js +15 -0
  20. package/dist/adapters/node/list-dir.io.js.map +1 -0
  21. package/dist/adapters/png/index.d.ts +11 -0
  22. package/dist/adapters/png/index.d.ts.map +1 -0
  23. package/dist/adapters/png/index.js +21 -0
  24. package/dist/adapters/png/index.js.map +1 -0
  25. package/dist/adapters/srt/index.d.ts +4 -0
  26. package/dist/adapters/srt/index.d.ts.map +1 -0
  27. package/dist/adapters/srt/index.js +12 -0
  28. package/dist/adapters/srt/index.js.map +1 -0
  29. package/dist/cli.d.ts.map +1 -1
  30. package/dist/cli.js +40 -22
  31. package/dist/cli.js.map +1 -1
  32. package/dist/domain/register.d.ts +96 -0
  33. package/dist/domain/register.d.ts.map +1 -0
  34. package/dist/domain/register.js +136 -0
  35. package/dist/domain/register.js.map +1 -0
  36. package/dist/domain/talk.d.ts +121 -0
  37. package/dist/domain/talk.d.ts.map +1 -0
  38. package/dist/domain/talk.js +121 -0
  39. package/dist/domain/talk.js.map +1 -0
  40. package/dist/domain/tex-document.d.ts +19 -0
  41. package/dist/domain/tex-document.d.ts.map +1 -1
  42. package/dist/domain/tex-document.js +8 -3
  43. package/dist/domain/tex-document.js.map +1 -1
  44. package/dist/lib/paper-config.d.ts +2 -0
  45. package/dist/lib/paper-config.d.ts.map +1 -1
  46. package/dist/lib/paper-config.js +3 -0
  47. package/dist/lib/paper-config.js.map +1 -1
  48. package/dist/paper-settings.d.ts +3 -0
  49. package/dist/paper-settings.d.ts.map +1 -1
  50. package/dist/paper-settings.js +15 -9
  51. package/dist/paper-settings.js.map +1 -1
  52. package/dist/ports/latex.d.ts +6 -1
  53. package/dist/ports/latex.d.ts.map +1 -1
  54. package/dist/ports/talk-media.d.ts +18 -0
  55. package/dist/ports/talk-media.d.ts.map +1 -0
  56. package/dist/ports/talk-media.js +2 -0
  57. package/dist/ports/talk-media.js.map +1 -0
  58. package/dist/presets.d.ts +6 -0
  59. package/dist/presets.d.ts.map +1 -1
  60. package/dist/presets.js +8 -9
  61. package/dist/presets.js.map +1 -1
  62. package/dist/register-bands.d.ts +37 -0
  63. package/dist/register-bands.d.ts.map +1 -0
  64. package/dist/register-bands.js +196 -0
  65. package/dist/register-bands.js.map +1 -0
  66. package/dist/register.d.ts +4 -2
  67. package/dist/register.d.ts.map +1 -1
  68. package/dist/register.js +6 -45
  69. package/dist/register.js.map +1 -1
  70. package/dist/talk-rules.d.ts +65 -0
  71. package/dist/talk-rules.d.ts.map +1 -0
  72. package/dist/talk-rules.js +451 -0
  73. package/dist/talk-rules.js.map +1 -0
  74. package/dist/tex-requirements.d.ts +9 -0
  75. package/dist/tex-requirements.d.ts.map +1 -1
  76. package/dist/tex-requirements.js +28 -6
  77. package/dist/tex-requirements.js.map +1 -1
  78. package/dist/tex-venue-rules.d.ts +1 -1
  79. package/dist/tex-venue-rules.d.ts.map +1 -1
  80. package/dist/tex-venue-rules.js.map +1 -1
  81. package/docs/configuration.md +2 -1
  82. package/docs/rules/talk/captions-cover.md +47 -0
  83. package/docs/rules/talk/duration-floor.md +38 -0
  84. package/docs/rules/talk/duration.md +43 -0
  85. package/docs/rules/talk/one-slide-size.md +38 -0
  86. package/docs/rules/talk/profile.md +64 -0
  87. package/docs/rules/talk/required-files.md +39 -0
  88. package/docs/rules/talk/undeclared.md +35 -0
  89. package/docs/rules/talk/video-format.md +43 -0
  90. package/docs/rules/tex/claim-emphasis.md +71 -0
  91. package/docs/rules/tex/contrast-frames.md +100 -0
  92. package/docs/rules/tex/relation-markers.md +72 -0
  93. package/docs/rules.md +57 -42
  94. package/docs/talk.md +94 -0
  95. package/fixtures/talk/audio-only.mp4 +0 -0
  96. package/fixtures/talk/one-slide.png +0 -0
  97. package/fixtures/talk/short-audio.mp4 +0 -0
  98. package/fixtures/talk/talk.mov +0 -0
  99. package/fixtures/talk/talk.mp4 +0 -0
  100. package/fixtures/talk/talk.srt +7 -0
  101. package/lib/paper-config.harness.mjs +5 -2
  102. package/lib/paper-config.ts +4 -0
  103. package/package.json +3 -1
  104. package/presets/agenticdev.jsonc +29 -0
  105. package/presets/aidc.jsonc +50 -0
  106. package/presets/venue-profile.schema.json +180 -1
  107. package/skills/grade-paper-writing/SKILL.md +59 -27
  108. package/skills/grade-paper-writing/SKILL.md.spec.ts +58 -26
  109. package/src/adapters/latex/index.test.ts +91 -0
  110. package/src/adapters/latex/index.ts +3 -2
  111. package/src/adapters/latex/prose.ts +188 -58
  112. package/src/adapters/mp4box/index.test.ts +63 -0
  113. package/src/adapters/mp4box/index.ts +50 -0
  114. package/src/adapters/node/index.ts +1 -0
  115. package/src/adapters/node/list-dir.io.ts +15 -0
  116. package/src/adapters/node/list-dir.test.ts +30 -0
  117. package/src/adapters/png/index.test.ts +43 -0
  118. package/src/adapters/png/index.ts +29 -0
  119. package/src/adapters/srt/index.test.ts +24 -0
  120. package/src/adapters/srt/index.ts +13 -0
  121. package/src/cli.test.ts +12 -0
  122. package/src/cli.ts +50 -21
  123. package/src/domain/register.test.ts +153 -0
  124. package/src/domain/register.ts +261 -0
  125. package/src/domain/talk.test.ts +125 -0
  126. package/src/domain/talk.ts +274 -0
  127. package/src/domain/tex-document.ts +37 -3
  128. package/src/new-paper.test.ts +1 -0
  129. package/src/paper-settings.test.ts +18 -1
  130. package/src/paper-settings.ts +21 -11
  131. package/src/ports/latex.ts +6 -0
  132. package/src/ports/talk-media.ts +19 -0
  133. package/src/presets.ts +14 -9
  134. package/src/register-bands.test.ts +327 -0
  135. package/src/register-bands.ts +291 -0
  136. package/src/register.ts +7 -37
  137. package/src/rule-cases.test.ts +177 -20
  138. package/src/talk-rules.test.ts +459 -0
  139. package/src/talk-rules.ts +672 -0
  140. package/src/tex-requirements.ts +56 -8
  141. package/src/tex-venue-rules.ts +7 -1
@@ -28,6 +28,12 @@ import Ajv from "ajv";
28
28
  import { presetsDir } from "./package-dirs.ts";
29
29
  import { CONFIG_FILE } from "#lib/paper-config";
30
30
  import { fieldOf } from "./domain/record.ts";
31
+ import type { RegisterAnchor, RegisterMeasureName } from "./domain/register.ts";
32
+ import {
33
+ venueTalkOf,
34
+ type VenueTalk,
35
+ type VenueTalkJson,
36
+ } from "./domain/talk.ts";
31
37
 
32
38
  /** CTAN package name → the names that prove it is installed. */
33
39
  export type PackageProofs = Readonly<Record<string, readonly string[]>>;
@@ -180,6 +186,13 @@ export interface PresetFile {
180
186
  readonly format: VenueFormat;
181
187
  /** rule id → ESLint entry, checked against the shipped rules where a config is built. */
182
188
  readonly rules: Readonly<Record<string, unknown>>;
189
+ /**
190
+ * The accepted papers the register rules measure a body against; null when the file names none
191
+ * (a child's list replaces its parent's).
192
+ */
193
+ readonly registerAnchors: readonly RegisterAnchor[] | null;
194
+ /** What the venue asks a presenter to send; null when the file has no `talk` block. */
195
+ readonly talk: VenueTalk | null;
183
196
  }
184
197
 
185
198
  type KindsJson = Readonly<
@@ -217,6 +230,13 @@ interface PresetJson {
217
230
  Partial<Pick<TexRequirements, "tools">>;
218
231
  readonly format?: FormatJson;
219
232
  readonly rules?: Readonly<Record<string, unknown>>;
233
+ readonly register?: {
234
+ readonly anchors: readonly ({
235
+ readonly paper: string;
236
+ readonly words: number;
237
+ } & Readonly<Record<RegisterMeasureName, number>>)[];
238
+ };
239
+ readonly talk?: VenueTalkJson;
220
240
  }
221
241
 
222
242
  /** An optional field as the typed preset holds it: absent is null. */
@@ -258,6 +278,38 @@ const sectionsOf = (
258
278
  ? null
259
279
  : r.map((x) => ({ title: x.title, position: orNull(x.position) }));
260
280
 
281
+ /** A preset's JSONC text → its value, or an Error naming the syntax problem. */
282
+ function jsoncOf(text: string, file: string): unknown {
283
+ const parsed = typescript().parseConfigFileTextToJson(file, text);
284
+ const config: unknown = parsed.config;
285
+ const error = parsed.error;
286
+ if (error)
287
+ throw new Error(
288
+ `${file}: not valid JSONC — ${typescript().flattenDiagnosticMessageText(error.messageText, " ")}`,
289
+ );
290
+ return config;
291
+ }
292
+
293
+ /** A preset's `tex` block, `tools` defaulted; null when the file declares none. */
294
+ const texOf = (t: PresetJson["tex"]): TexRequirements | null =>
295
+ t ? { packages: t.packages, tools: t.tools ?? {} } : null;
296
+
297
+ /** A preset's `register.anchors`, each with its counts; null when the file names none. */
298
+ const anchorsOf = (
299
+ r: PresetJson["register"],
300
+ ): readonly RegisterAnchor[] | null =>
301
+ r === undefined
302
+ ? null
303
+ : r.anchors.map((a) => ({
304
+ paper: a.paper,
305
+ words: a.words,
306
+ counts: {
307
+ contrast_frames: a.contrast_frames,
308
+ claim_emphasis: a.claim_emphasis,
309
+ relation_markers: a.relation_markers,
310
+ },
311
+ }));
312
+
261
313
  /**
262
314
  * The text of one preset file → the typed file, or an Error naming every problem. The ONE parser
263
315
  * of a preset: the toolchain reads its `tex`, the venue rules its `format`, the config its `rules`.
@@ -271,13 +323,7 @@ export function parsePreset(
271
323
  file: string,
272
324
  dir: string = presetsDir(),
273
325
  ): PresetFile {
274
- const parsed = typescript().parseConfigFileTextToJson(file, text);
275
- const config: unknown = parsed.config;
276
- const error = parsed.error;
277
- if (error)
278
- throw new Error(
279
- `${file}: not valid JSONC — ${typescript().flattenDiagnosticMessageText(error.messageText, " ")}`,
280
- );
326
+ const config = jsoncOf(text, file);
281
327
  const validate = validatorFor(dir);
282
328
  if (!matchesSchema(config, validate))
283
329
  throw new Error(
@@ -291,9 +337,11 @@ export function parsePreset(
291
337
  aliases: j.aliases ?? [],
292
338
  blind: orNull(j.blind),
293
339
  requiredSections: sectionsOf(j.required_sections),
294
- tex: j.tex ? { packages: j.tex.packages, tools: j.tex.tools ?? {} } : null,
340
+ tex: texOf(j.tex),
295
341
  format: formatOf(j.format),
296
342
  rules: j.rules ?? {},
343
+ registerAnchors: anchorsOf(j.register),
344
+ talk: j.talk === undefined ? null : venueTalkOf(j.talk),
297
345
  };
298
346
  }
299
347
 
@@ -298,7 +298,13 @@ export function judgeLeftover(
298
298
 
299
299
  /** Where a rule's page lives: `docs/rules/tex/<name>.md` on the default branch. */
300
300
  export const ruleDocsUrl = (
301
- name: TexVenueRuleName | "claim-provenance" | "register",
301
+ name:
302
+ | TexVenueRuleName
303
+ | "claim-provenance"
304
+ | "register"
305
+ | "contrast-frames"
306
+ | "claim-emphasis"
307
+ | "relation-markers",
302
308
  ): string =>
303
309
  `https://github.com/zernie/paperlint/blob/main/docs/rules/tex/${name}.md`;
304
310