lens-content-processor 0.4.0 → 0.5.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 (68) hide show
  1. package/dist/bundler/video.d.ts +12 -6
  2. package/dist/bundler/video.js +57 -34
  3. package/dist/bundler/video.js.map +1 -1
  4. package/dist/cli.d.ts +11 -2
  5. package/dist/cli.js +36 -19
  6. package/dist/cli.js.map +1 -1
  7. package/dist/content-schema.js +64 -16
  8. package/dist/content-schema.js.map +1 -1
  9. package/dist/dedupe-errors.d.ts +14 -0
  10. package/dist/dedupe-errors.js +33 -0
  11. package/dist/dedupe-errors.js.map +1 -0
  12. package/dist/flattener/index.d.ts +3 -28
  13. package/dist/flattener/index.js +497 -741
  14. package/dist/flattener/index.js.map +1 -1
  15. package/dist/flattener/resolve-text-links.d.ts +25 -0
  16. package/dist/flattener/resolve-text-links.js +248 -0
  17. package/dist/flattener/resolve-text-links.js.map +1 -0
  18. package/dist/flattener/test-helpers.d.ts +1 -1
  19. package/dist/flattener/test-helpers.js +1 -3
  20. package/dist/flattener/test-helpers.js.map +1 -1
  21. package/dist/index.d.ts +51 -21
  22. package/dist/index.js +285 -140
  23. package/dist/index.js.map +1 -1
  24. package/dist/parser/article.d.ts +2 -1
  25. package/dist/parser/article.js +75 -14
  26. package/dist/parser/article.js.map +1 -1
  27. package/dist/parser/course.d.ts +1 -1
  28. package/dist/parser/course.js +79 -22
  29. package/dist/parser/course.js.map +1 -1
  30. package/dist/parser/frontmatter.d.ts +1 -1
  31. package/dist/parser/frontmatter.js +38 -12
  32. package/dist/parser/frontmatter.js.map +1 -1
  33. package/dist/parser/learning-outcome.d.ts +5 -2
  34. package/dist/parser/learning-outcome.js +75 -37
  35. package/dist/parser/learning-outcome.js.map +1 -1
  36. package/dist/parser/lens.d.ts +33 -34
  37. package/dist/parser/lens.js +205 -271
  38. package/dist/parser/lens.js.map +1 -1
  39. package/dist/parser/module.d.ts +7 -15
  40. package/dist/parser/module.js +135 -171
  41. package/dist/parser/module.js.map +1 -1
  42. package/dist/parser/sections.d.ts +12 -1
  43. package/dist/parser/sections.js +74 -95
  44. package/dist/parser/sections.js.map +1 -1
  45. package/dist/parser/video-transcript.d.ts +2 -1
  46. package/dist/parser/video-transcript.js +8 -7
  47. package/dist/parser/video-transcript.js.map +1 -1
  48. package/dist/reference-graph.d.ts +8 -0
  49. package/dist/reference-graph.js +105 -0
  50. package/dist/reference-graph.js.map +1 -0
  51. package/dist/validator/card-module-membership.d.ts +2 -0
  52. package/dist/validator/card-module-membership.js +80 -0
  53. package/dist/validator/card-module-membership.js.map +1 -0
  54. package/dist/validator/output-integrity.js +5 -5
  55. package/dist/validator/output-integrity.js.map +1 -1
  56. package/dist/validator/segment-fields.d.ts +1 -1
  57. package/dist/validator/segment-fields.js +2 -2
  58. package/dist/validator/segment-fields.js.map +1 -1
  59. package/dist/validator/test-segments.d.ts +12 -0
  60. package/dist/validator/test-segments.js +40 -0
  61. package/dist/validator/test-segments.js.map +1 -0
  62. package/dist/validator/url-reachability.d.ts +2 -1
  63. package/dist/validator/url-reachability.js +40 -20
  64. package/dist/validator/url-reachability.js.map +1 -1
  65. package/package.json +1 -1
  66. package/dist/validator/chat-precedence.d.ts +0 -9
  67. package/dist/validator/chat-precedence.js +0 -32
  68. package/dist/validator/chat-precedence.js.map +0 -1
@@ -1,9 +1,10 @@
1
- import { parseFrontmatter } from './frontmatter.js';
2
- import { parseSections, LO_SECTION_TYPES } from './sections.js';
3
- import { parseWikilink, resolveWikilinkPath, hasRelativePath } from './wikilink.js';
4
- import { detectFieldTypos } from '../validator/field-typos.js';
5
- import { validateFrontmatter } from '../validator/validate-frontmatter.js';
6
- import { parseSegments, convertSegment, stripAuthoringMarkup } from './lens.js';
1
+ import { parseFrontmatter } from "./frontmatter.js";
2
+ import { parseSections, LO_SECTION_TYPES, } from "./sections.js";
3
+ import { parseWikilink, resolveWikilinkPath, hasRelativePath, } from "./wikilink.js";
4
+ import { detectFieldTypos } from "../validator/field-typos.js";
5
+ import { validateFrontmatter } from "../validator/validate-frontmatter.js";
6
+ import { validateTestSegments } from "../validator/test-segments.js";
7
+ import { convertSegment, stripAuthoringMarkup, LENS_SEGMENT_TYPES, } from "./lens.js";
7
8
  export function parseLearningOutcome(content, file) {
8
9
  const errors = [];
9
10
  // Strip authoring markup (CriticMarkup + Obsidian comments) before parsing
@@ -15,25 +16,25 @@ export function parseLearningOutcome(content, file) {
15
16
  return { learningOutcome: null, errors };
16
17
  }
17
18
  const { frontmatter, body, bodyStartLine } = frontmatterResult;
18
- const frontmatterErrors = validateFrontmatter(frontmatter, 'learning-outcome', file);
19
+ const frontmatterErrors = validateFrontmatter(frontmatter, "learning-outcome", file);
19
20
  errors.push(...frontmatterErrors);
20
- if (frontmatterErrors.some(e => e.severity === 'error')) {
21
+ if (frontmatterErrors.some((e) => e.severity === "error")) {
21
22
  return { learningOutcome: null, errors };
22
23
  }
23
24
  // LO-specific: id must be a string
24
- if (typeof frontmatter.id !== 'string') {
25
+ if (typeof frontmatter.id !== "string") {
25
26
  errors.push({
26
27
  file,
27
28
  line: 2,
28
29
  message: `Field 'id' must be a string, got ${typeof frontmatter.id}`,
29
30
  suggestion: "Use quotes: id: '12345'",
30
- severity: 'error',
31
+ severity: "error",
31
32
  });
32
33
  return { learningOutcome: null, errors };
33
34
  }
34
35
  // Step 2: Parse sections with H2 level and LO_SECTION_TYPES + 'submodule'
35
- const loSectionTypes = new Set([...LO_SECTION_TYPES, 'submodule']);
36
- const sectionsResult = parseSections(body, 2, loSectionTypes, file);
36
+ const loSectionTypes = new Set([...LO_SECTION_TYPES, "submodule"]);
37
+ const sectionsResult = parseSections(body, 0, loSectionTypes, file);
37
38
  // Adjust line numbers to account for frontmatter
38
39
  for (const error of sectionsResult.errors) {
39
40
  if (error.line) {
@@ -53,9 +54,9 @@ export function parseLearningOutcome(content, file) {
53
54
  errors.push({
54
55
  file,
55
56
  line: section.line,
56
- message: 'Lens section missing source:: field',
57
+ message: "Lens section missing source:: field",
57
58
  suggestion: "Add 'source:: [[../Lenses/filename.md|Display]]' to the lens section",
58
- severity: 'error',
59
+ severity: "error",
59
60
  });
60
61
  return null;
61
62
  }
@@ -63,7 +64,7 @@ export function parseLearningOutcome(content, file) {
63
64
  if (!wikilink || wikilink.error) {
64
65
  const suggestion = wikilink?.correctedPath
65
66
  ? `Did you mean '[[${wikilink.correctedPath}]]'?`
66
- : 'Use format [[../Lenses/filename.md|Display Text]]';
67
+ : "Use format [[../Lenses/filename.md|Display Text]]";
67
68
  errors.push({
68
69
  file,
69
70
  line: section.line,
@@ -71,7 +72,7 @@ export function parseLearningOutcome(content, file) {
71
72
  ? `${wikilink.error} in source:: field: ${source}`
72
73
  : `Invalid wikilink format in source:: field: ${source}`,
73
74
  suggestion,
74
- severity: 'error',
75
+ severity: "error",
75
76
  });
76
77
  return null;
77
78
  }
@@ -80,17 +81,41 @@ export function parseLearningOutcome(content, file) {
80
81
  file,
81
82
  line: section.line,
82
83
  message: `source:: path must be relative (contain /): ${wikilink.path}`,
83
- suggestion: 'Use format [[../Lenses/filename.md|Display Text]] with relative path',
84
- severity: 'error',
84
+ suggestion: "Use format [[../Lenses/filename.md|Display Text]] with relative path",
85
+ severity: "error",
85
86
  });
86
87
  return null;
87
88
  }
88
89
  const resolvedPath = resolveWikilinkPath(wikilink.path, file);
89
- const optional = section.fields.optional?.toLowerCase() === 'true';
90
- return { source, resolvedPath, optional };
90
+ const optional = section.fields.optional?.toLowerCase() === "true";
91
+ const hide = section.fields.hide?.toLowerCase() === "true";
92
+ return { source, resolvedPath, optional, hide };
91
93
  }
92
94
  // Helper: extract test ref from a parsed section
93
95
  function extractTestRef(section) {
96
+ const id = section.fields.id;
97
+ if (!id) {
98
+ const hasSource = Boolean(section.fields.source);
99
+ const hasSegmentHeader = /^(#{1,6})\s+(Text|Question|Chat|Roleplay)(?::|\s*$)/im.test(section.body);
100
+ const hasKnownTestFields = [
101
+ "content",
102
+ "assessment-instructions",
103
+ "ai-instructions",
104
+ "opening-message",
105
+ "feedback",
106
+ ].some((field) => section.fields[field] !== undefined);
107
+ if (!hasSource && !hasSegmentHeader && !hasKnownTestFields) {
108
+ return undefined;
109
+ }
110
+ errors.push({
111
+ file,
112
+ line: section.line,
113
+ message: "Test section missing required id:: field",
114
+ suggestion: "Add an id:: field with a UUID (e.g., id:: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)",
115
+ severity: "error",
116
+ });
117
+ return undefined;
118
+ }
94
119
  const source = section.fields.source;
95
120
  let resolvedPath;
96
121
  if (source) {
@@ -98,7 +123,7 @@ export function parseLearningOutcome(content, file) {
98
123
  if (!wikilink || wikilink.error) {
99
124
  const suggestion = wikilink?.correctedPath
100
125
  ? `Did you mean '[[${wikilink.correctedPath}]]'?`
101
- : 'Use format [[../Tests/filename.md|Display Text]]';
126
+ : "Use format [[../Tests/filename.md|Display Text]]";
102
127
  errors.push({
103
128
  file,
104
129
  line: section.line,
@@ -106,22 +131,31 @@ export function parseLearningOutcome(content, file) {
106
131
  ? `${wikilink.error} in source:: field: ${source}`
107
132
  : `Invalid wikilink format in source:: field: ${source}`,
108
133
  suggestion,
109
- severity: 'error',
134
+ severity: "error",
110
135
  });
111
136
  return undefined;
112
137
  }
113
138
  resolvedPath = resolveWikilinkPath(wikilink.path, file);
114
139
  }
115
- const { segments: rawSegments, errors: segmentErrors } = parseSegments(section.body, section.line + 1, file);
140
+ const { sections: rawSegments, errors: segmentErrors } = parseSections(section.body, section.level, LENS_SEGMENT_TYPES, file, true);
116
141
  for (const err of segmentErrors) {
117
142
  if (err.line) {
118
143
  err.line += bodyStartLine - 1;
119
144
  }
120
145
  }
121
146
  errors.push(...segmentErrors);
147
+ // A Test is an assessment: only question/roleplay segments are rendered and
148
+ // scored. Flag any other segment type (e.g. intro text) — it is silently dropped.
149
+ const testSegmentErrors = validateTestSegments(rawSegments, file);
150
+ for (const err of testSegmentErrors) {
151
+ if (err.line) {
152
+ err.line += bodyStartLine - 1;
153
+ }
154
+ }
155
+ errors.push(...testSegmentErrors);
122
156
  const testSegments = [];
123
157
  for (const rawSeg of rawSegments) {
124
- const { segment, errors: conversionErrors } = convertSegment(rawSeg, 'page', file);
158
+ const { segment, errors: conversionErrors } = convertSegment(rawSeg, "lens", file);
125
159
  for (const err of conversionErrors) {
126
160
  if (err.line) {
127
161
  err.line += bodyStartLine - 1;
@@ -132,28 +166,28 @@ export function parseLearningOutcome(content, file) {
132
166
  testSegments.push(segment);
133
167
  }
134
168
  }
135
- return { source, resolvedPath, segments: testSegments };
169
+ return { id, source, resolvedPath, segments: testSegments };
136
170
  }
137
171
  // Step 3: Check for submodule sections
138
- const hasSubmodules = sectionsResult.sections.some(s => s.type === 'submodule');
172
+ const hasSubmodules = sectionsResult.sections.some((s) => s.type === "submodule");
139
173
  const lenses = [];
140
174
  let testRef;
141
175
  let submodules;
142
176
  if (hasSubmodules) {
143
177
  // All-or-nothing: reject top-level lens/test sections when submodules exist
144
- const orphanedSections = sectionsResult.sections.filter(s => s.type !== 'submodule');
178
+ const orphanedSections = sectionsResult.sections.filter((s) => s.type !== "submodule");
145
179
  if (orphanedSections.length > 0) {
146
180
  errors.push({
147
181
  file,
148
182
  line: orphanedSections[0].line,
149
- message: 'Content found outside submodule boundaries — when using Submodule markers, all content must be inside a submodule',
150
- suggestion: 'Move this content into a Submodule section',
151
- severity: 'error',
183
+ message: "Content found outside submodule boundaries — when using Submodule markers, all content must be inside a submodule",
184
+ suggestion: "Move this content into a Submodule section",
185
+ severity: "error",
152
186
  });
153
187
  }
154
188
  submodules = [];
155
189
  for (const section of sectionsResult.sections) {
156
- if (section.type !== 'submodule')
190
+ if (section.type !== "submodule")
157
191
  continue;
158
192
  const group = {
159
193
  title: section.title,
@@ -163,14 +197,14 @@ export function parseLearningOutcome(content, file) {
163
197
  // Process children (lens/test sections at H3)
164
198
  if (section.children) {
165
199
  for (const child of section.children) {
166
- if (child.type === 'lens') {
200
+ if (child.type === "lens") {
167
201
  const ref = extractLensRef(child);
168
202
  if (ref) {
169
203
  group.lenses.push(ref);
170
204
  lenses.push(ref); // Also add to flat list for validation
171
205
  }
172
206
  }
173
- else if (child.type === 'test') {
207
+ else if (child.type === "test") {
174
208
  group.test = extractTestRef(child);
175
209
  }
176
210
  }
@@ -183,12 +217,12 @@ export function parseLearningOutcome(content, file) {
183
217
  for (const section of sectionsResult.sections) {
184
218
  const typoWarnings = detectFieldTypos(section.fields, file, section.line);
185
219
  errors.push(...typoWarnings);
186
- if (section.type === 'lens') {
220
+ if (section.type === "lens") {
187
221
  const ref = extractLensRef(section);
188
222
  if (ref)
189
223
  lenses.push(ref);
190
224
  }
191
- else if (section.type === 'test') {
225
+ else if (section.type === "test") {
192
226
  testRef = extractTestRef(section);
193
227
  }
194
228
  }
@@ -198,11 +232,14 @@ export function parseLearningOutcome(content, file) {
198
232
  errors.push({
199
233
  file,
200
234
  line: bodyStartLine,
201
- message: 'Learning Outcome must have at least one ## Lens: section',
235
+ message: "Learning Outcome must have at least one ## Lens: section",
202
236
  suggestion: "Add a '## Lens: <title>' section with a source:: field",
203
- severity: 'error',
237
+ severity: "error",
204
238
  });
205
239
  }
240
+ const loAddToAiContext = "add_to_ai_context" in frontmatter
241
+ ? frontmatter.add_to_ai_context
242
+ : undefined;
206
243
  // Return result even if there are errors (partial success)
207
244
  const learningOutcome = {
208
245
  id: frontmatter.id,
@@ -210,6 +247,7 @@ export function parseLearningOutcome(content, file) {
210
247
  test: testRef,
211
248
  discussion: frontmatter.discussion,
212
249
  submodules,
250
+ addToAiContext: loAddToAiContext,
213
251
  };
214
252
  return { learningOutcome, errors };
215
253
  }
@@ -1 +1 @@
1
- {"version":3,"file":"learning-outcome.js","sourceRoot":"","sources":["../../src/parser/learning-outcome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"learning-outcome.js","sourceRoot":"","sources":["../../src/parser/learning-outcome.ts"],"names":[],"mappings":"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"}
@@ -6,22 +6,25 @@ export interface ParsedTextSegment {
6
6
  }
7
7
  export interface ParsedChatSegment {
8
8
  type: 'chat';
9
- title?: string;
10
9
  instructions?: string;
11
10
  hidePreviousContentFromUser?: boolean;
12
11
  hidePreviousContentFromTutor?: boolean;
13
12
  optional?: boolean;
14
13
  }
15
- export interface ParsedArticleExcerptSegment {
16
- type: 'article-excerpt';
14
+ export interface ParsedArticleSegment {
15
+ type: 'article';
16
+ source?: string;
17
+ resolvedPath?: string;
17
18
  fromAnchor?: string;
18
19
  toAnchor?: string;
19
20
  optional?: boolean;
20
21
  }
21
- export interface ParsedVideoExcerptSegment {
22
- type: 'video-excerpt';
22
+ export interface ParsedVideoSegment {
23
+ type: 'video';
24
+ source?: string;
25
+ resolvedPath?: string;
23
26
  fromTimeStr: string;
24
- toTimeStr: string;
27
+ toTimeStr?: string;
25
28
  optional?: boolean;
26
29
  }
27
30
  export interface ParsedQuestionSegment {
@@ -41,41 +44,31 @@ export interface ParsedRoleplaySegment {
41
44
  aiInstructions: string;
42
45
  openingMessage?: string;
43
46
  assessmentInstructions?: string;
47
+ userCustomizable?: boolean;
44
48
  optional?: boolean;
45
49
  feedback?: boolean;
46
50
  }
47
- export type ParsedLensSegment = ParsedTextSegment | ParsedChatSegment | ParsedArticleExcerptSegment | ParsedVideoExcerptSegment | ParsedQuestionSegment | ParsedRoleplaySegment;
48
- export interface ParsedLensSection {
49
- type: string;
50
- title: string;
51
- source?: string;
52
- resolvedPath?: string;
53
- segments: ParsedLensSegment[];
54
- line: number;
55
- }
51
+ export type ParsedLensSegment = ParsedTextSegment | ParsedChatSegment | ParsedArticleSegment | ParsedVideoSegment | ParsedQuestionSegment | ParsedRoleplaySegment;
56
52
  export interface ParsedLens {
57
53
  id: string;
54
+ title?: string;
58
55
  tldr?: string;
59
- sections: ParsedLensSection[];
56
+ summaryForTutor?: string;
57
+ addToAiContext?: string[] | null;
58
+ segments: ParsedLensSegment[];
60
59
  }
61
60
  export interface LensParseResult {
62
61
  lens: ParsedLens | null;
63
62
  errors: ContentError[];
64
63
  }
65
- interface RawSegment {
64
+ export declare const LENS_SEGMENT_TYPES: Set<string>;
65
+ /** Common interface for raw segments — compatible with ParsedSection */
66
+ export interface RawSegment {
66
67
  type: string;
67
68
  title?: string;
68
69
  fields: Record<string, string>;
69
70
  line: number;
70
71
  }
71
- /**
72
- * Parse H4 segments from a section body.
73
- * Segments are defined by `#### <type>` headers within a section.
74
- */
75
- export declare function parseSegments(sectionBody: string, bodyStartLine: number, file: string): {
76
- segments: RawSegment[];
77
- errors: ContentError[];
78
- };
79
72
  /**
80
73
  * Convert a raw segment to a typed ParsedLensSegment.
81
74
  */
@@ -90,11 +83,11 @@ export declare function convertSegment(raw: RawSegment, sectionType: string, fil
90
83
  export declare function stripObsidianComments(content: string): string;
91
84
  /**
92
85
  * Strip CriticMarkup from content using reject-all-changes behavior:
93
- * - {>>comments<<} removed
94
- * - {++additions++} removed
95
- * - {--deletions--} inner content kept (original preserved)
96
- * - {~~old~>new~~} old text kept
97
- * - {==highlights==} inner content kept, markers removed
86
+ * - {>>comments<<} -> removed
87
+ * - {++additions++} -> removed
88
+ * - {--deletions--} -> inner content kept (original preserved)
89
+ * - {~~old~>new~~} -> old text kept
90
+ * - {==highlights==} -> inner content kept, markers removed
98
91
  */
99
92
  export declare function stripCriticMarkup(content: string): string;
100
93
  /**
@@ -102,12 +95,18 @@ export declare function stripCriticMarkup(content: string): string;
102
95
  * Call at the top of each parser before any processing.
103
96
  */
104
97
  export declare function stripAuthoringMarkup(content: string): string;
98
+ /**
99
+ * Apply source inheritance for article and video segments.
100
+ * Each article/video segment inherits source:: from the previous segment of the same type.
101
+ * Errors if the first segment of a type has no source.
102
+ *
103
+ * Mutates segments in place. Returns any errors.
104
+ */
105
+ export declare function applySourceInheritance(segments: ParsedLensSegment[], file: string): ContentError[];
105
106
  /**
106
107
  * Parse a lens file into structured lens data.
107
108
  *
108
- * Lens files use:
109
- * - H3 (`###`) for sections: Text, Article, Video
110
- * - H4 (`####`) for segments: Text, Chat, Article-excerpt, Video-excerpt
109
+ * Lens files are flat: frontmatter + H4 segments directly.
110
+ * No H3 section headers. Source is on segments with inheritance.
111
111
  */
112
112
  export declare function parseLens(content: string, file: string): LensParseResult;
113
- export {};