lens-content-processor 0.79.0 → 0.80.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 (130) hide show
  1. package/dist/authoring-markup.d.ts +22 -0
  2. package/dist/authoring-markup.js +24 -0
  3. package/dist/authoring-markup.js.map +1 -1
  4. package/dist/cache.d.ts +10 -0
  5. package/dist/cache.js +6 -5
  6. package/dist/cache.js.map +1 -1
  7. package/dist/cli-steps.d.ts +37 -0
  8. package/dist/cli-steps.js +80 -0
  9. package/dist/cli-steps.js.map +1 -0
  10. package/dist/cli.d.ts +7 -0
  11. package/dist/cli.js +52 -70
  12. package/dist/cli.js.map +1 -1
  13. package/dist/course-graph.d.ts +2 -2
  14. package/dist/course-graph.js +7 -2
  15. package/dist/course-graph.js.map +1 -1
  16. package/dist/criticmarkup-forms.d.ts +8 -6
  17. package/dist/criticmarkup-forms.js +22 -19
  18. package/dist/criticmarkup-forms.js.map +1 -1
  19. package/dist/dedupe-errors.d.ts +16 -0
  20. package/dist/dedupe-errors.js +23 -9
  21. package/dist/dedupe-errors.js.map +1 -1
  22. package/dist/dependency-cache.d.ts +15 -5
  23. package/dist/dependency-cache.js +33 -74
  24. package/dist/dependency-cache.js.map +1 -1
  25. package/dist/dropped.d.ts +114 -0
  26. package/dist/dropped.js +253 -0
  27. package/dist/dropped.js.map +1 -0
  28. package/dist/engine/assemble.d.ts +44 -0
  29. package/dist/engine/assemble.js +132 -0
  30. package/dist/engine/assemble.js.map +1 -0
  31. package/dist/engine/build.d.ts +8 -0
  32. package/dist/engine/build.js +558 -0
  33. package/dist/engine/build.js.map +1 -0
  34. package/dist/engine/file-facts.d.ts +26 -0
  35. package/dist/engine/file-facts.js +63 -0
  36. package/dist/engine/file-facts.js.map +1 -0
  37. package/dist/engine/git-source.d.ts +35 -0
  38. package/dist/engine/git-source.js +242 -0
  39. package/dist/engine/git-source.js.map +1 -0
  40. package/dist/engine/overlay.d.ts +43 -0
  41. package/dist/engine/overlay.js +167 -0
  42. package/dist/engine/overlay.js.map +1 -0
  43. package/dist/engine/protocol.d.ts +146 -0
  44. package/dist/engine/protocol.js +40 -0
  45. package/dist/engine/protocol.js.map +1 -0
  46. package/dist/engine/reader.d.ts +133 -0
  47. package/dist/engine/reader.js +298 -0
  48. package/dist/engine/reader.js.map +1 -0
  49. package/dist/engine/sources.d.ts +39 -0
  50. package/dist/engine/sources.js +137 -0
  51. package/dist/engine/sources.js.map +1 -0
  52. package/dist/engine/sqlite-store.d.ts +99 -0
  53. package/dist/engine/sqlite-store.js +452 -0
  54. package/dist/engine/sqlite-store.js.map +1 -0
  55. package/dist/engine/store.d.ts +85 -0
  56. package/dist/engine/store.js +31 -0
  57. package/dist/engine/store.js.map +1 -0
  58. package/dist/engine/tables.d.ts +15 -0
  59. package/dist/engine/tables.js +70 -0
  60. package/dist/engine/tables.js.map +1 -0
  61. package/dist/engine/units.d.ts +58 -0
  62. package/dist/engine/units.js +186 -0
  63. package/dist/engine/units.js.map +1 -0
  64. package/dist/engine/version.d.ts +6 -0
  65. package/dist/engine/version.js +21 -0
  66. package/dist/engine/version.js.map +1 -0
  67. package/dist/engine/worker.d.ts +1 -0
  68. package/dist/engine/worker.js +220 -0
  69. package/dist/engine/worker.js.map +1 -0
  70. package/dist/flattener/index.d.ts +34 -17
  71. package/dist/flattener/index.js +245 -114
  72. package/dist/flattener/index.js.map +1 -1
  73. package/dist/flattener/resolve-text-links.d.ts +15 -14
  74. package/dist/flattener/resolve-text-links.js +24 -25
  75. package/dist/flattener/resolve-text-links.js.map +1 -1
  76. package/dist/glossary.d.ts +2 -2
  77. package/dist/glossary.js.map +1 -1
  78. package/dist/index.d.ts +168 -2
  79. package/dist/index.js +883 -639
  80. package/dist/index.js.map +1 -1
  81. package/dist/markdown-parse.d.ts +6 -0
  82. package/dist/markdown-parse.js +14 -0
  83. package/dist/markdown-parse.js.map +1 -1
  84. package/dist/parser/learning-outcome.js +11 -2
  85. package/dist/parser/learning-outcome.js.map +1 -1
  86. package/dist/parser/lens.d.ts +5 -1
  87. package/dist/parser/lens.js +22 -7
  88. package/dist/parser/lens.js.map +1 -1
  89. package/dist/parser/meeting-doc.d.ts +2 -1
  90. package/dist/parser/meeting-doc.js +2 -1
  91. package/dist/parser/meeting-doc.js.map +1 -1
  92. package/dist/parser/module.d.ts +3 -1
  93. package/dist/parser/module.js +7 -5
  94. package/dist/parser/module.js.map +1 -1
  95. package/dist/parser/question-embeds.d.ts +4 -3
  96. package/dist/parser/question-embeds.js.map +1 -1
  97. package/dist/parser/sections.d.ts +10 -0
  98. package/dist/parser/sections.js +8 -3
  99. package/dist/parser/sections.js.map +1 -1
  100. package/dist/parser/widget.d.ts +2 -1
  101. package/dist/parser/widget.js.map +1 -1
  102. package/dist/parser/wikilink.d.ts +13 -3
  103. package/dist/parser/wikilink.js +55 -34
  104. package/dist/parser/wikilink.js.map +1 -1
  105. package/dist/reference-graph.d.ts +21 -3
  106. package/dist/reference-graph.js +35 -12
  107. package/dist/reference-graph.js.map +1 -1
  108. package/dist/same-page-links.d.ts +11 -1
  109. package/dist/same-page-links.js +9 -0
  110. package/dist/same-page-links.js.map +1 -1
  111. package/dist/skill-tree.d.ts +2 -1
  112. package/dist/skill-tree.js.map +1 -1
  113. package/dist/source-location.d.ts +0 -4
  114. package/dist/source-location.js +0 -43
  115. package/dist/source-location.js.map +1 -1
  116. package/dist/validator/card-module-membership.d.ts +17 -1
  117. package/dist/validator/card-module-membership.js +60 -56
  118. package/dist/validator/card-module-membership.js.map +1 -1
  119. package/dist/validator/criticmarkup.js +1 -1
  120. package/dist/validator/criticmarkup.js.map +1 -1
  121. package/dist/validator/field-typos.d.ts +1 -1
  122. package/dist/validator/field-typos.js +21 -21
  123. package/dist/validator/field-typos.js.map +1 -1
  124. package/dist/validator/output-integrity.d.ts +9 -5
  125. package/dist/validator/output-integrity.js +43 -45
  126. package/dist/validator/output-integrity.js.map +1 -1
  127. package/dist/validator/tier.d.ts +2 -2
  128. package/dist/validator/tier.js.map +1 -1
  129. package/dist/validator/uuid.d.ts +1 -1
  130. package/package.json +2 -1
@@ -23,6 +23,28 @@ export declare function stripAuthoringMarkupForValidation(content: string): stri
23
23
  * (shared with the pending-suggestion validator); see that table.
24
24
  */
25
25
  export declare function stripCriticMarkup(content: string): string;
26
+ /**
27
+ * The drafts view: content with every pending CriticMarkup suggestion
28
+ * accepted, read from the same table as stripCriticMarkup. Additions keep
29
+ * their text, deletions go, substitutions take their new text; comments go
30
+ * and highlights keep their text, as in the approved view.
31
+ *
32
+ * It matches "Accept All" in the Lens Editor (lens-relay: the review page
33
+ * applies each suggestion with y-sweet-core's critic_surgical.rs and leaves
34
+ * comments and highlights, which publishing resolves the same way; the
35
+ * in-editor accept is lens-editor/src/lib/criticmarkup-actions.ts). The relay
36
+ * MCP's accepted_view (crates/relay/src/mcp/tools/critic_markup.rs) differs in
37
+ * two ways, and this follows the editor in both:
38
+ * - Substitutions: accepted_view leaves {~~old~>new~~} as text, which the
39
+ * publish strip then turns into the old text. Here it is the new text.
40
+ * - Fenced code: accepted_view leaves markup inside ``` fences as text. Here
41
+ * it is resolved like markup anywhere else, as the approved view does; left
42
+ * as text, the publish strip would reject every fenced suggestion.
43
+ * Nested suggestions resolve in one pass, in table order, as in the approved
44
+ * view. The review page resolves overlapping suggestions over several presses,
45
+ * so badly nested markup can end differently there.
46
+ */
47
+ export declare function acceptAllSuggestions(content: string): string;
26
48
  /**
27
49
  * Strip all authoring markup (CriticMarkup + Obsidian comments) from content.
28
50
  * Call before parsing or publishing learner-facing content.
@@ -46,6 +46,30 @@ export function stripAuthoringMarkupForValidation(content) {
46
46
  export function stripCriticMarkup(content) {
47
47
  return CRITIC_MARKUP_FORMS.reduce((text, form) => text.replace(form.re, form.rejected), content);
48
48
  }
49
+ /**
50
+ * The drafts view: content with every pending CriticMarkup suggestion
51
+ * accepted, read from the same table as stripCriticMarkup. Additions keep
52
+ * their text, deletions go, substitutions take their new text; comments go
53
+ * and highlights keep their text, as in the approved view.
54
+ *
55
+ * It matches "Accept All" in the Lens Editor (lens-relay: the review page
56
+ * applies each suggestion with y-sweet-core's critic_surgical.rs and leaves
57
+ * comments and highlights, which publishing resolves the same way; the
58
+ * in-editor accept is lens-editor/src/lib/criticmarkup-actions.ts). The relay
59
+ * MCP's accepted_view (crates/relay/src/mcp/tools/critic_markup.rs) differs in
60
+ * two ways, and this follows the editor in both:
61
+ * - Substitutions: accepted_view leaves {~~old~>new~~} as text, which the
62
+ * publish strip then turns into the old text. Here it is the new text.
63
+ * - Fenced code: accepted_view leaves markup inside ``` fences as text. Here
64
+ * it is resolved like markup anywhere else, as the approved view does; left
65
+ * as text, the publish strip would reject every fenced suggestion.
66
+ * Nested suggestions resolve in one pass, in table order, as in the approved
67
+ * view. The review page resolves overlapping suggestions over several presses,
68
+ * so badly nested markup can end differently there.
69
+ */
70
+ export function acceptAllSuggestions(content) {
71
+ return CRITIC_MARKUP_FORMS.reduce((text, form) => text.replace(form.re, form.accepted), content);
72
+ }
49
73
  /**
50
74
  * Strip all authoring markup (CriticMarkup + Obsidian comments) from content.
51
75
  * Call before parsing or publishing learner-facing content.
@@ -1 +1 @@
1
- {"version":3,"file":"authoring-markup.js","sourceRoot":"","sources":["../src/authoring-markup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authoring-markup.js","sourceRoot":"","sources":["../src/authoring-markup.ts"],"names":[],"mappings":"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"}
package/dist/cache.d.ts CHANGED
@@ -1,3 +1,13 @@
1
+ /**
2
+ * Hash of every code file in the running processor's own directory tree
3
+ * (src/** under tsx; dist/** in the published package) plus the package
4
+ * manifest and lockfile one level up — parsing behavior lives in the
5
+ * dependencies as much as in this repo's code, so a dependency bump must
6
+ * invalidate entries too. Any such change therefore invalidates every cache
7
+ * entry, which is what makes a hit exactly as trustworthy as a recompute.
8
+ * The engine's validator version (engine/version.ts) uses the same hash.
9
+ */
10
+ export declare function computeCodeFingerprint(): string;
1
11
  export declare class FileResultCache {
2
12
  private readonly dir;
3
13
  private readonly salt;
package/dist/cache.js CHANGED
@@ -15,7 +15,7 @@ import { mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, uti
15
15
  import { createHash } from "crypto";
16
16
  import { dirname, join } from "path";
17
17
  import { fileURLToPath } from "url";
18
- import { decodeSourceLines, encodeSourceLines } from "./source-location.js";
18
+ import { decodeUnit, encodeUnit } from "./engine/units.js";
19
19
  /** Entries untouched for this long are deleted by the startup prune. */
20
20
  const MAX_ENTRY_AGE_MS = 14 * 24 * 60 * 60 * 1000;
21
21
  /** Startup prune runs at most this often (tracked via a marker file). */
@@ -30,8 +30,9 @@ function sha256(data) {
30
30
  * dependencies as much as in this repo's code, so a dependency bump must
31
31
  * invalidate entries too. Any such change therefore invalidates every cache
32
32
  * entry, which is what makes a hit exactly as trustworthy as a recompute.
33
+ * The engine's validator version (engine/version.ts) uses the same hash.
33
34
  */
34
- function computeCodeFingerprint() {
35
+ export function computeCodeFingerprint() {
35
36
  const root = dirname(fileURLToPath(import.meta.url));
36
37
  const hash = createHash("sha256");
37
38
  const walk = (dir, rel) => {
@@ -116,7 +117,7 @@ export class FileResultCache {
116
117
  // Entries are wrapped ({v, data}) so bytes that decode to SOME valid
117
118
  // JSON — but not to something put() wrote — are still rejected, deleted,
118
119
  // and recomputed, exactly like invalid JSON from a torn write. data
119
- // carries symbol-keyed source lines encoded (see source-location.ts).
120
+ // is encoded as the build layer encodes a unit's output (engine/units.ts).
120
121
  const entry = JSON.parse(raw);
121
122
  if (entry === null ||
122
123
  typeof entry !== "object" ||
@@ -125,7 +126,7 @@ export class FileResultCache {
125
126
  !("data" in entry)) {
126
127
  throw new Error("not a cache entry");
127
128
  }
128
- value = decodeSourceLines(entry.data);
129
+ value = decodeUnit(entry.data);
129
130
  }
130
131
  catch {
131
132
  try {
@@ -152,7 +153,7 @@ export class FileResultCache {
152
153
  const file = this.entryPath(kind, path, content);
153
154
  const tmp = `${file}.${process.pid}.tmp`;
154
155
  try {
155
- writeFileSync(tmp, JSON.stringify({ v: 1, data: encodeSourceLines(value) }), "utf-8");
156
+ writeFileSync(tmp, JSON.stringify({ v: 1, data: encodeUnit(value) }), "utf-8");
156
157
  renameSync(tmp, file); // atomic: concurrent readers see old-or-new, never partial
157
158
  }
158
159
  catch (error) {
package/dist/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAC3E,+EAA+E;AAC/E,0EAA0E;AAC1E,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,wEAAwE;AAExE,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,EACV,aAAa,GACd,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE3D,wEAAwE;AACxE,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAClD,yEAAyE;AACzE,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,GAAW,EAAQ,EAAE;QAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACtD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACtC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAC1D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;oBAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACf,KAAK,MAAM,QAAQ,IAAI;QACrB,cAAc;QACd,mBAAmB;QACnB,eAAe;KAChB,EAAE,CAAC;QACF,IAAI,CAAC;YACH,IAAI;iBACD,MAAM,CAAC,QAAQ,CAAC;iBAChB,MAAM,CAAC,IAAI,CAAC;iBACZ,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;IACH,CAAC;IACD,0DAA0D;IAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,OAAO,eAAe;IAEP;IACA;IAFnB,YACmB,GAAW,EACX,IAAY;QADZ,QAAG,GAAH,GAAG,CAAQ;QACX,SAAI,GAAJ,IAAI,CAAQ;IAC5B,CAAC;IAEJ,+EAA+E;IAC/E,MAAM,CAAC,IAAI,CAAC,GAAW;QACrB,IAAI,CAAC;YACH,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC;YACjE,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wEAAwE;YACxE,yEAAyE;YACzE,mDAAmD;YACnD,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe;QAC3D,uEAAuE;QACvE,sEAAsE;QACtE,mBAAmB;QACnB,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;aACzC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;aACvC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,GAAG,CAAI,IAAY,EAAE,IAAY,EAAE,OAAe;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,KAAQ,CAAC;QACb,IAAI,CAAC;YACH,qEAAqE;YACrE,yEAAyE;YACzE,oEAAoE;YACpE,2EAA2E;YAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmC,CAAC;YAChE,IACE,KAAK,KAAK,IAAI;gBACd,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,CAAC,CAAC,KAAK,CAAC;gBACb,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAClB,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YACD,KAAK,GAAG,UAAU,CAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,uEAAuE;YACvE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe,EAAE,KAAc;QAC7D,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QACzC,IAAI,CAAC;YACH,aAAa,CACX,GAAG,EACH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,EACjD,OAAO,CACR,CAAC;YACF,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,2DAA2D;QACpF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC;gBACxC,eAAe,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAC1C,kEAAkE;gBAClE,8DAA8D;gBAC9D,OAAO,CAAC,KAAK,CACX,kDAAkD,EAClD,KAAK,CACN,CAAC;YACJ,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAE1C,sFAAsF;IAC9E,UAAU;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,iBAAiB;gBAAE,OAAO;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QACD,IAAI,CAAC;YACH,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzC,kEAAkE;gBAClE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAAE,SAAS;gBAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAClC,IAAI,CAAC;oBACH,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,gBAAgB,EAAE,CAAC;wBACpD,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { ContentError, UrlToValidate } from "./index.js";
2
+ import type { FileResultCache } from "./cache.js";
3
+ import { UrlCache } from "./validator/url-cache.js";
4
+ /**
5
+ * The course reachability map of the validator page (reference-graph.ts).
6
+ * Degradable (per AGENTS.md): it only feeds that page's course filter, so a
7
+ * failure must never break content processing for the whole platform; the
8
+ * map is then empty.
9
+ */
10
+ export declare function courseReachability(build: () => Record<string, string[]>): Record<string, string[]>;
11
+ /**
12
+ * The per-course checks (course-graph.ts), in the order `errors` gets them.
13
+ * Degradable (per AGENTS.md): they only add warnings, so a failure must never
14
+ * break content processing for the whole platform. It becomes one warning
15
+ * instead, because silence would read as "no course-graph problems". `cache`
16
+ * is cli.ts's --cache-dir, which keeps the title scan of each file.
17
+ */
18
+ export declare function courseGraphChecks(files: ReadonlyMap<string, string>, cache?: FileResultCache): ContentError[];
19
+ /**
20
+ * `errors` (already deduped) with the course-graph checks merged in. The
21
+ * platform repeats this merge in Python when the checks run as their own job
22
+ * (core/content/course_graph.py).
23
+ */
24
+ export declare function withCourseGraph(errors: ContentError[], files: ReadonlyMap<string, string>, cache?: FileResultCache): ContentError[];
25
+ /** What --defer-urls adds to the output. */
26
+ export interface DeferredUrlReport {
27
+ urlIssues: ContentError[];
28
+ staleUrlCount: number;
29
+ }
30
+ /**
31
+ * --defer-urls, zero network: issues from still-fresh URL cache entries, and
32
+ * how many unique URLs need a live check. The platform runs those later
33
+ * (--check-urls-only) and replaces urlIssues wholesale, so they stay out of
34
+ * `errors`. The report depends on the time, so the engine computes it per job
35
+ * and never stores it.
36
+ */
37
+ export declare function deferredUrlReport(errors: ContentError[], urlsToValidate: UrlToValidate[], cache?: UrlCache): DeferredUrlReport;
@@ -0,0 +1,80 @@
1
+ // The steps the CLI runs after processContent: the course reachability map,
2
+ // the per-course checks, and the --defer-urls report. cli.ts and the engine
3
+ // (engine/assemble.ts) both call these, so the platform's two paths emit the
4
+ // same output.
5
+ import { courseGraphIssues, partnerNameIssues } from "./course-graph.js";
6
+ import { dedupeErrors } from "./dedupe-errors.js";
7
+ import { materializeUrlIssue } from "./validator/url-reachability.js";
8
+ import { UrlCache } from "./validator/url-cache.js";
9
+ /**
10
+ * The course reachability map of the validator page (reference-graph.ts).
11
+ * Degradable (per AGENTS.md): it only feeds that page's course filter, so a
12
+ * failure must never break content processing for the whole platform; the
13
+ * map is then empty.
14
+ */
15
+ export function courseReachability(build) {
16
+ try {
17
+ return build();
18
+ }
19
+ catch (error) {
20
+ console.error("buildFileToCourses failed; serving validation without the course filter:", error instanceof Error ? error.message : error);
21
+ return {};
22
+ }
23
+ }
24
+ /**
25
+ * The per-course checks (course-graph.ts), in the order `errors` gets them.
26
+ * Degradable (per AGENTS.md): they only add warnings, so a failure must never
27
+ * break content processing for the whole platform. It becomes one warning
28
+ * instead, because silence would read as "no course-graph problems". `cache`
29
+ * is cli.ts's --cache-dir, which keeps the title scan of each file.
30
+ */
31
+ export function courseGraphChecks(files, cache) {
32
+ try {
33
+ return [...courseGraphIssues(files, cache), ...partnerNameIssues(files)];
34
+ }
35
+ catch (error) {
36
+ console.error("courseGraphIssues failed; serving validation without course-graph checks:", error instanceof Error ? error.message : error);
37
+ return [
38
+ {
39
+ file: "(course graph)",
40
+ code: "course-graph.failed",
41
+ severity: "warning",
42
+ message: `Course-graph checks did not run: ${error instanceof Error ? error.message : String(error)}`,
43
+ },
44
+ ];
45
+ }
46
+ }
47
+ /**
48
+ * `errors` (already deduped) with the course-graph checks merged in. The
49
+ * platform repeats this merge in Python when the checks run as their own job
50
+ * (core/content/course_graph.py).
51
+ */
52
+ export function withCourseGraph(errors, files, cache) {
53
+ return dedupeErrors([...errors, ...courseGraphChecks(files, cache)]);
54
+ }
55
+ /**
56
+ * --defer-urls, zero network: issues from still-fresh URL cache entries, and
57
+ * how many unique URLs need a live check. The platform runs those later
58
+ * (--check-urls-only) and replaces urlIssues wholesale, so they stay out of
59
+ * `errors`. The report depends on the time, so the engine computes it per job
60
+ * and never stores it.
61
+ */
62
+ export function deferredUrlReport(errors, urlsToValidate, cache = UrlCache.load()) {
63
+ const cachedIssues = [];
64
+ for (const entry of urlsToValidate) {
65
+ const outcome = cache.getFresh(entry.url);
66
+ if (!outcome)
67
+ continue;
68
+ const issue = materializeUrlIssue(entry, outcome);
69
+ if (issue)
70
+ cachedIssues.push(issue);
71
+ }
72
+ // Dedupe against content errors exactly like the default mode's combined
73
+ // dedupe, then keep only the URL tail (errors are already deduped, so the
74
+ // slice boundary is exact).
75
+ return {
76
+ urlIssues: dedupeErrors([...errors, ...cachedIssues]).slice(errors.length),
77
+ staleUrlCount: cache.staleCount(urlsToValidate),
78
+ };
79
+ }
80
+ //# sourceMappingURL=cli-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-steps.js","sourceRoot":"","sources":["../src/cli-steps.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,eAAe;AAIf,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAqC;IAErC,IAAI,CAAC;QACH,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,0EAA0E,EAC1E,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAkC,EAClC,KAAuB;IAEvB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,2EAA2E,EAC3E,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO;YACL;gBACE,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aACtG;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAsB,EACtB,KAAkC,EAClC,KAAuB;IAEvB,OAAO,YAAY,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAQD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,cAA+B,EAC/B,QAAkB,QAAQ,CAAC,IAAI,EAAE;IAEjC,MAAM,YAAY,GAAmB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,yEAAyE;IACzE,0EAA0E;IAC1E,4BAA4B;IAC5B,OAAO;QACL,SAAS,EAAE,YAAY,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1E,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;KAChD,CAAC;AACJ,CAAC"}
package/dist/cli.d.ts CHANGED
@@ -11,6 +11,11 @@ export interface CliOptions {
11
11
  skipUrls: boolean;
12
12
  /** Directory for the per-file result cache (see cache.ts). null = no caching. */
13
13
  cacheDir: string | null;
14
+ /** Leave the course-graph checks out of `errors`. The platform runs them as a
15
+ * separate background job (--course-graph-only) and merges them itself. */
16
+ skipCourseGraph: boolean;
17
+ /** Print only the course-graph issues of the input, as a JSON array. */
18
+ courseGraphOnly: boolean;
14
19
  }
15
20
  /**
16
21
  * The CLI's JSON output: the core ProcessResult plus a course-reachability map
@@ -23,3 +28,5 @@ export type CliResult = ProcessResult & {
23
28
  };
24
29
  export declare function parseArgs(argv: string[]): CliOptions;
25
30
  export declare function run(options: CliOptions): Promise<CliResult>;
31
+ /** processContent and the CLI's own steps, over files already read. */
32
+ export declare function runOn(files: Map<string, string>, options: Pick<CliOptions, "cacheDir" | "skipCourseGraph">): CliResult;
package/dist/cli.js CHANGED
@@ -2,11 +2,11 @@
2
2
  // src/cli.ts
3
3
  import { readVaultFiles } from "./fs/read-vault.js";
4
4
  import { processContent, FileResultCache, } from "./index.js";
5
- import { validateUrls, materializeUrlIssue, } from "./validator/url-reachability.js";
5
+ import { validateUrls } from "./validator/url-reachability.js";
6
6
  import { UrlCache } from "./validator/url-cache.js";
7
7
  import { buildFileToCourses } from "./reference-graph.js";
8
8
  import { dedupeErrors } from "./dedupe-errors.js";
9
- import { courseGraphIssues, partnerNameIssues } from "./course-graph.js";
9
+ import { courseGraphChecks, courseReachability, deferredUrlReport, withCourseGraph, } from "./cli-steps.js";
10
10
  import { readFile, writeFile } from "fs/promises";
11
11
  export function parseArgs(argv) {
12
12
  const args = argv.slice(2);
@@ -18,6 +18,8 @@ export function parseArgs(argv) {
18
18
  let checkUrlsOnly = false;
19
19
  let skipUrls = false;
20
20
  let cacheDir = null;
21
+ let skipCourseGraph = false;
22
+ let courseGraphOnly = false;
21
23
  for (let i = 0; i < args.length; i++) {
22
24
  if (args[i] === "--output" || args[i] === "-o") {
23
25
  outputPath = args[i + 1] || null;
@@ -43,6 +45,12 @@ export function parseArgs(argv) {
43
45
  else if (args[i] === "--skip-urls") {
44
46
  skipUrls = true;
45
47
  }
48
+ else if (args[i] === "--skip-course-graph") {
49
+ skipCourseGraph = true;
50
+ }
51
+ else if (args[i] === "--course-graph-only") {
52
+ courseGraphOnly = true;
53
+ }
46
54
  else if (!args[i].startsWith("-")) {
47
55
  vaultPath = args[i];
48
56
  }
@@ -56,6 +64,8 @@ export function parseArgs(argv) {
56
64
  checkUrlsOnly,
57
65
  skipUrls,
58
66
  cacheDir,
67
+ skipCourseGraph,
68
+ courseGraphOnly,
59
69
  };
60
70
  }
61
71
  async function readStdin() {
@@ -65,59 +75,48 @@ async function readStdin() {
65
75
  }
66
76
  return Buffer.concat(chunks).toString("utf-8");
67
77
  }
68
- export async function run(options) {
69
- let files;
78
+ async function readFiles(options) {
70
79
  if (options.stdin || options.inputPath) {
71
80
  // JSON { "path": "content", ... } from stdin or a file
72
81
  const input = options.inputPath
73
82
  ? await readFile(options.inputPath, "utf-8")
74
83
  : await readStdin();
75
- files = new Map(Object.entries(JSON.parse(input)));
84
+ return new Map(Object.entries(JSON.parse(input)));
76
85
  }
77
- else {
78
- if (!options.vaultPath) {
79
- throw new Error("Vault path is required (or use --stdin / --input)");
80
- }
81
- files = await readVaultFiles(options.vaultPath);
86
+ if (!options.vaultPath) {
87
+ throw new Error("Vault path is required (or use --stdin / --input)");
82
88
  }
83
- // FileResultCache.open returns undefined on any failure — processing then
84
- // simply runs uncached.
85
- const cache = options.cacheDir
86
- ? FileResultCache.open(options.cacheDir)
87
- : undefined;
89
+ return readVaultFiles(options.vaultPath);
90
+ }
91
+ /** --cache-dir's cache. FileResultCache.open returns undefined on any
92
+ * failure: processing then simply runs uncached. */
93
+ function openCache({ cacheDir, }) {
94
+ return cacheDir ? FileResultCache.open(cacheDir) : undefined;
95
+ }
96
+ export async function run(options) {
97
+ return runOn(await readFiles(options), options);
98
+ }
99
+ /** processContent and the CLI's own steps, over files already read. */
100
+ export function runOn(files, options) {
101
+ const cache = openCache(options);
88
102
  const result = processContent(files, cache);
89
103
  // Course-reachability map for the validator page. Computed here, not in
90
104
  // processContent, so it stays out of the Python-parity / fixture output.
91
- // Degradable (per AGENTS.md): this feeds only the validator page's course
92
- // filter, so a failure here must never break content processing for the
93
- // whole platform — fall back to an empty map and carry on.
94
- let fileToCourses = {};
95
- try {
96
- fileToCourses = buildFileToCourses(files);
97
- }
98
- catch (error) {
99
- console.error("buildFileToCourses failed; serving validation without the course filter:", error instanceof Error ? error.message : error);
105
+ const fileToCourses = courseReachability(() => buildFileToCourses(files));
106
+ if (!options.skipCourseGraph) {
107
+ result.errors = withCourseGraph(result.errors, files, cache);
100
108
  }
101
- // Per-course checks (course-graph.ts). Degradable for the same reason as
102
- // the map above.
103
- try {
104
- result.errors = dedupeErrors([
105
- ...result.errors,
106
- ...courseGraphIssues(files, cache),
107
- ...partnerNameIssues(files),
108
- ]);
109
+ return { ...result, fileToCourses };
110
+ }
111
+ async function emit(value, outputPath) {
112
+ const json = JSON.stringify(value, null, 2);
113
+ if (outputPath) {
114
+ await writeFile(outputPath, json, "utf-8");
115
+ console.error(`Written to ${outputPath}`);
109
116
  }
110
- catch (error) {
111
- console.error("courseGraphIssues failed; serving validation without course-graph checks:", error instanceof Error ? error.message : error);
112
- // Say so in the output too: silence would read as "no course-graph problems".
113
- result.errors.push({
114
- file: "(course graph)",
115
- code: "course-graph.failed",
116
- severity: "warning",
117
- message: `Course-graph checks did not run: ${error instanceof Error ? error.message : String(error)}`,
118
- });
117
+ else {
118
+ console.log(json);
119
119
  }
120
- return { ...result, fileToCourses };
121
120
  }
122
121
  async function main() {
123
122
  const options = parseArgs(process.argv);
@@ -125,6 +124,11 @@ async function main() {
125
124
  console.error("--defer-urls and --check-urls-only are mutually exclusive");
126
125
  process.exit(1);
127
126
  }
127
+ if (options.courseGraphOnly &&
128
+ (options.checkUrlsOnly || options.skipCourseGraph)) {
129
+ console.error("--course-graph-only cannot be combined with --check-urls-only or --skip-course-graph");
130
+ process.exit(1);
131
+ }
128
132
  if (options.checkUrlsOnly) {
129
133
  try {
130
134
  const urls = JSON.parse(await readStdin());
@@ -144,31 +148,16 @@ async function main() {
144
148
  process.exit(1);
145
149
  }
146
150
  try {
151
+ if (options.courseGraphOnly) {
152
+ await emit(courseGraphChecks(await readFiles(options), openCache(options)), options.outputPath);
153
+ return;
154
+ }
147
155
  const result = await run(options);
148
156
  let output = result;
149
157
  if (options.deferUrls) {
150
- // Zero network: materialize issues from still-fresh cache entries and
151
- // report how many unique URLs would need a live check. The consumer
152
- // (backend) runs those later via --check-urls-only and replaces
153
- // urlIssues wholesale — hence issues stay OUT of `errors` here.
154
- const cache = UrlCache.load();
155
- const cachedIssues = [];
156
- for (const entry of result.urlsToValidate) {
157
- const outcome = cache.getFresh(entry.url);
158
- if (!outcome)
159
- continue;
160
- const issue = materializeUrlIssue(entry, outcome);
161
- if (issue)
162
- cachedIssues.push(issue);
163
- }
164
- // Dedupe against content errors exactly like the default mode's combined
165
- // dedupe, then keep only the URL tail (errors are already deduped, so
166
- // the slice boundary is exact).
167
- const urlIssues = dedupeErrors([...result.errors, ...cachedIssues]).slice(result.errors.length);
168
158
  output = {
169
159
  ...result,
170
- urlIssues,
171
- staleUrlCount: cache.staleCount(result.urlsToValidate),
160
+ ...deferredUrlReport(result.errors, result.urlsToValidate),
172
161
  };
173
162
  }
174
163
  else if (!options.skipUrls && result.urlsToValidate.length > 0) {
@@ -177,14 +166,7 @@ async function main() {
177
166
  // deduped, and can themselves repeat (same unreachable URL twice).
178
167
  result.errors = dedupeErrors([...result.errors, ...urlWarnings]);
179
168
  }
180
- const json = JSON.stringify(output, null, 2);
181
- if (options.outputPath) {
182
- await writeFile(options.outputPath, json, "utf-8");
183
- console.error(`Written to ${options.outputPath}`);
184
- }
185
- else {
186
- console.log(json);
187
- }
169
+ await emit(output, options.outputPath);
188
170
  }
189
171
  catch (error) {
190
172
  console.error("Error:", error instanceof Error ? error.message : error);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,eAAe,GAGhB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAEhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA8BlD,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YACjC,CAAC,EAAE,CAAC,CAAC,gBAAgB;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC;YACrC,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YAC/B,CAAC,EAAE,CAAC,CAAC,gBAAgB;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACjC,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YAChC,CAAC,EAAE,CAAC,CAAC,gBAAgB;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,cAAc,EAAE,CAAC;YACtC,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,mBAAmB,EAAE,CAAC;YAC3C,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC;YACrC,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,qBAAqB,EAAE,CAAC;YAC7C,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,qBAAqB,EAAE,CAAC;YAC7C,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,UAAU;QACV,KAAK;QACL,SAAS;QACT,SAAS;QACT,aAAa;QACb,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAmB;IAC1C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvC,uDAAuD;QACvD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS;YAC7B,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;YAC5C,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC;QACtB,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAA2B,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED;oDACoD;AACpD,SAAS,SAAS,CAAC,EACjB,QAAQ,GACqB;IAC7B,OAAO,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAmB;IAC3C,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,KAAK,CACnB,KAA0B,EAC1B,OAAyD;IAEzD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE5C,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,aAAa,GAAG,kBAAkB,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,KAAc,EAAE,UAAyB;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IACE,OAAO,CAAC,eAAe;QACvB,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,EAClD,CAAC;QACD,OAAO,CAAC,KAAK,CACX,sFAAsF,CACvF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,SAAS,EAAE,CAAoB,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CACX,kEAAkE,CACnE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,MAAM,IAAI,CACR,iBAAiB,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,EAC/D,OAAO,CAAC,UAAU,CACnB,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QAElC,IAAI,MAAM,GAAgD,MAAM,CAAC;QAEjE,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,GAAG;gBACP,GAAG,MAAM;gBACT,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;aAC3D,CAAC;QACJ,CAAC;aAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,MAAM,WAAW,GAAG,MAAM,YAAY,CACpC,MAAM,CAAC,cAAc,EACrB,QAAQ,CAAC,IAAI,EAAE,CAChB,CAAC;YACF,mEAAmE;YACnE,mEAAmE;YACnE,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,+EAA+E;AAC/E,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACzC,MAAM,YAAY,GAChB,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC7B,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC7B,UAAU,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AAChD,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC;AACT,CAAC"}
@@ -2,5 +2,5 @@ import type { ContentError } from "./index.js";
2
2
  import type { FileResultCache } from "./cache.js";
3
3
  /** cache: per-file memo of the title scan (the bulk of the cost), keyed by
4
4
  * the file and the title pattern it was scanned with. */
5
- export declare function courseGraphIssues(files: Map<string, string>, cache?: FileResultCache): ContentError[];
6
- export declare function partnerNameIssues(files: Map<string, string>): ContentError[];
5
+ export declare function courseGraphIssues(input: ReadonlyMap<string, string>, cache?: FileResultCache): ContentError[];
6
+ export declare function partnerNameIssues(input: ReadonlyMap<string, string>): ContentError[];
@@ -33,6 +33,7 @@ import { parseFrontmatter, HTML_FRONTMATTER_OPEN, HTML_FRONTMATTER_CLOSE, } from
33
33
  import { isContentTextFile } from "./parser/widget.js";
34
34
  import { stripAuthoringMarkup, stripAuthoringMarkupForValidation, } from "./authoring-markup.js";
35
35
  import { buildTagMap, buildTierMap } from "./validator/tier.js";
36
+ import { inPathOrder } from "./engine/reader.js";
36
37
  import { ALL_STRUCTURAL_TYPES, MARKDOWN_CONTENT_FIELDS, } from "./parser/sections.js";
37
38
  function frontmatterTitle(path, content) {
38
39
  const { frontmatter } = parseFrontmatter(stripAuthoringMarkup(content), path);
@@ -182,7 +183,10 @@ function escape(s) {
182
183
  }
183
184
  /** cache: per-file memo of the title scan (the bulk of the cost), keyed by
184
185
  * the file and the title pattern it was scanned with. */
185
- export function courseGraphIssues(files, cache) {
186
+ export function courseGraphIssues(input, cache) {
187
+ // Path order, so same-title lenses and same-line findings come out in one
188
+ // order whatever order the caller lists the files in.
189
+ const files = inPathOrder(input);
186
190
  const titles = lensTitles(files);
187
191
  if (!titles.size)
188
192
  return [];
@@ -273,7 +277,8 @@ export function courseGraphIssues(files, cache) {
273
277
  })
274
278
  .sort(byPlace);
275
279
  }
276
- export function partnerNameIssues(files) {
280
+ export function partnerNameIssues(input) {
281
+ const files = inPathOrder(input); // as in courseGraphIssues
277
282
  const tier = buildTierMap(buildTagMap(files));
278
283
  const scanned = memoized((p) => scan(p, files.get(p) ?? ""));
279
284
  const text = memoized((p) => scanned(p).lines.join("\n"));