@agentshouse/mdmodel 0.1.0-alpha.1

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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -0
  3. package/dist/definition.d.ts +36 -0
  4. package/dist/definition.d.ts.map +1 -0
  5. package/dist/definition.js +165 -0
  6. package/dist/definition.js.map +1 -0
  7. package/dist/document.d.ts +5 -0
  8. package/dist/document.d.ts.map +1 -0
  9. package/dist/document.js +154 -0
  10. package/dist/document.js.map +1 -0
  11. package/dist/index.d.ts +6 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +6 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/links.d.ts +2 -0
  16. package/dist/links.d.ts.map +1 -0
  17. package/dist/links.js +142 -0
  18. package/dist/links.js.map +1 -0
  19. package/dist/paths.d.ts +14 -0
  20. package/dist/paths.d.ts.map +1 -0
  21. package/dist/paths.js +54 -0
  22. package/dist/paths.js.map +1 -0
  23. package/dist/profile.d.ts +6 -0
  24. package/dist/profile.d.ts.map +1 -0
  25. package/dist/profile.js +7 -0
  26. package/dist/profile.js.map +1 -0
  27. package/dist/refuse.d.ts +6 -0
  28. package/dist/refuse.d.ts.map +1 -0
  29. package/dist/refuse.js +16 -0
  30. package/dist/refuse.js.map +1 -0
  31. package/dist/schema.d.ts +6 -0
  32. package/dist/schema.d.ts.map +1 -0
  33. package/dist/schema.js +70 -0
  34. package/dist/schema.js.map +1 -0
  35. package/dist/sections.d.ts +10 -0
  36. package/dist/sections.d.ts.map +1 -0
  37. package/dist/sections.js +79 -0
  38. package/dist/sections.js.map +1 -0
  39. package/dist/types.d.ts +48 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +3 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/validate.d.ts +3 -0
  44. package/dist/validate.d.ts.map +1 -0
  45. package/dist/validate.js +174 -0
  46. package/dist/validate.js.map +1 -0
  47. package/dist/version.d.ts +2 -0
  48. package/dist/version.d.ts.map +1 -0
  49. package/dist/version.js +3 -0
  50. package/dist/version.js.map +1 -0
  51. package/dist/yaml.d.ts +49 -0
  52. package/dist/yaml.d.ts.map +1 -0
  53. package/dist/yaml.js +427 -0
  54. package/dist/yaml.js.map +1 -0
  55. package/fixtures/README.md +65 -0
  56. package/fixtures/cases/any-without-type/expected.json +1 -0
  57. package/fixtures/cases/any-without-type/library/note.md +3 -0
  58. package/fixtures/cases/field-enum/expected.json +7 -0
  59. package/fixtures/cases/field-enum/library/item.md +9 -0
  60. package/fixtures/cases/field-enum/library/types/task.md +8 -0
  61. package/fixtures/cases/malformed-definition/expected.json +7 -0
  62. package/fixtures/cases/malformed-definition/library/types/task.md +5 -0
  63. package/fixtures/cases/missing-required-field/expected.json +7 -0
  64. package/fixtures/cases/missing-required-field/library/item.md +8 -0
  65. package/fixtures/cases/missing-required-field/library/types/task.md +8 -0
  66. package/fixtures/cases/prd-definition/expected.json +1 -0
  67. package/fixtures/cases/prd-definition/library/types/task.md +15 -0
  68. package/fixtures/cases/referenced-missing-file/expected.json +7 -0
  69. package/fixtures/cases/referenced-missing-file/library/a.md +9 -0
  70. package/fixtures/cases/referenced-missing-file/library/b.md +9 -0
  71. package/fixtures/cases/referenced-missing-file/library/types/person.md +5 -0
  72. package/fixtures/cases/referenced-missing-file/library/types/task.md +8 -0
  73. package/fixtures/cases/structured-section/expected.json +7 -0
  74. package/fixtures/cases/structured-section/library/item.md +12 -0
  75. package/fixtures/cases/structured-section/library/types/task.md +8 -0
  76. package/fixtures/cases/unclosed-frontmatter/expected.json +6 -0
  77. package/fixtures/cases/unclosed-frontmatter/library/note.md +3 -0
  78. package/fixtures/cases/unresolved-link/expected.json +6 -0
  79. package/fixtures/cases/unresolved-link/library/item.md +8 -0
  80. package/fixtures/cases/unresolved-link/library/types/task.md +7 -0
  81. package/fixtures/cases/valid-typed-document/expected.json +1 -0
  82. package/fixtures/cases/valid-typed-document/library/people/ada.md +4 -0
  83. package/fixtures/cases/valid-typed-document/library/tasks/one.md +17 -0
  84. package/fixtures/cases/valid-typed-document/library/types/person.md +5 -0
  85. package/fixtures/cases/valid-typed-document/library/types/task.md +12 -0
  86. package/markdown-syntax-profile.md +9 -0
  87. package/package.json +41 -0
package/dist/yaml.js ADDED
@@ -0,0 +1,427 @@
1
+ export class YamlError extends Error {
2
+ offset;
3
+ constructor(offset){
4
+ super('yaml'), this.offset = offset;
5
+ this.name = 'YamlError';
6
+ }
7
+ }
8
+ function peek(c) {
9
+ return c.i < c.end ? c.text[c.i] : '';
10
+ }
11
+ function skipEol(c) {
12
+ if (peek(c) === '\r') c.i += 1;
13
+ if (peek(c) === '\n') c.i += 1;
14
+ }
15
+ function skipSpaces(c) {
16
+ while(peek(c) === ' ')c.i += 1;
17
+ if (peek(c) === '\t') throw new YamlError(c.i);
18
+ }
19
+ function skipToEol(c) {
20
+ while(c.i < c.end && peek(c) !== '\n' && peek(c) !== '\r')c.i += 1;
21
+ }
22
+ function skipBlankAndComments(c) {
23
+ while(c.i < c.end){
24
+ skipSpaces(c);
25
+ if (peek(c) === '#') skipToEol(c);
26
+ if (peek(c) === '\r' || peek(c) === '\n') {
27
+ skipEol(c);
28
+ continue;
29
+ }
30
+ break;
31
+ }
32
+ }
33
+ function skipFlowSpace(c) {
34
+ while(c.i < c.end){
35
+ const ch = peek(c);
36
+ if (ch === ' ' || ch === '\n' || ch === '\r') {
37
+ c.i += 1;
38
+ continue;
39
+ }
40
+ if (ch === '#') {
41
+ skipToEol(c);
42
+ continue;
43
+ }
44
+ if (ch === '\t') throw new YamlError(c.i);
45
+ break;
46
+ }
47
+ }
48
+ function indentAt(c) {
49
+ let j = c.i;
50
+ while(j > 0 && c.text[j - 1] !== '\n')j -= 1;
51
+ let n = 0;
52
+ while(j < c.i){
53
+ const ch = c.text[j];
54
+ if (ch === ' ') n += 1;
55
+ else if (ch === '\t') throw new YamlError(j);
56
+ else break;
57
+ j += 1;
58
+ }
59
+ return n;
60
+ }
61
+ function scalar(value, start, end) {
62
+ return {
63
+ kind: 'scalar',
64
+ value,
65
+ start,
66
+ end
67
+ };
68
+ }
69
+ function interpretPlain(text) {
70
+ if (text === 'true') return true;
71
+ if (text === 'false') return false;
72
+ if (text === 'null' || text === '') return null;
73
+ if (/^-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return Number(text);
74
+ return text;
75
+ }
76
+ function parseQuoted(c) {
77
+ const quote = peek(c);
78
+ const start = c.i;
79
+ c.i += 1;
80
+ let out = '';
81
+ while(c.i < c.end){
82
+ const ch = peek(c);
83
+ if (ch === quote) {
84
+ c.i += 1;
85
+ return scalar(out, start, c.i);
86
+ }
87
+ if (ch === '\n' || ch === '\r') throw new YamlError(c.i);
88
+ if (quote === "'" && ch === "'" && c.text[c.i + 1] === "'") {
89
+ out += "'";
90
+ c.i += 2;
91
+ continue;
92
+ }
93
+ if (quote === '"' && ch === '\\') {
94
+ c.i += 1;
95
+ const escaped = peek(c);
96
+ if (escaped === 'n') out += '\n';
97
+ else if (escaped === 't') out += '\t';
98
+ else if (escaped === '"') out += '"';
99
+ else if (escaped === '\\') out += '\\';
100
+ else throw new YamlError(c.i);
101
+ c.i += 1;
102
+ continue;
103
+ }
104
+ out += ch;
105
+ c.i += 1;
106
+ }
107
+ throw new YamlError(c.i);
108
+ }
109
+ function parsePlain(c, flow) {
110
+ const start = c.i;
111
+ while(c.i < c.end){
112
+ const ch = peek(c);
113
+ if (flow && (ch === ',' || ch === ']' || ch === '}')) break;
114
+ if (ch === '\n' || ch === '\r') break;
115
+ if (ch === '#' && (c.i === start || c.text[c.i - 1] === ' ' || c.text[c.i - 1] === '\t')) break;
116
+ c.i += 1;
117
+ }
118
+ if (c.i === start) throw new YamlError(c.i);
119
+ const raw = c.text.slice(start, c.i);
120
+ const trimmed = raw.trimEnd();
121
+ return scalar(interpretPlain(trimmed), start, start + trimmed.length);
122
+ }
123
+ function parseScalar(c, flow) {
124
+ const ch = peek(c);
125
+ if (ch === '"' || ch === "'") return parseQuoted(c);
126
+ return parsePlain(c, flow);
127
+ }
128
+ function parseKey(c) {
129
+ const start = c.i;
130
+ if (peek(c) === '"' || peek(c) === "'") {
131
+ const quoted = parseQuoted(c);
132
+ if (typeof quoted.value !== 'string') throw new YamlError(start);
133
+ return {
134
+ name: quoted.value,
135
+ start,
136
+ end: c.i
137
+ };
138
+ }
139
+ let end = c.i;
140
+ while(c.i < c.end){
141
+ const ch = peek(c);
142
+ if (ch === ':' || ch === '\n' || ch === '\r' || ch === ',' || ch === '}' || ch === ']' || ch === '#' || ch === '{' || ch === '[') {
143
+ break;
144
+ }
145
+ c.i += 1;
146
+ if (ch !== ' ' && ch !== '\t') end = c.i;
147
+ }
148
+ if (end === start) throw new YamlError(c.i);
149
+ c.i = end;
150
+ return {
151
+ name: c.text.slice(start, end),
152
+ start,
153
+ end
154
+ };
155
+ }
156
+ function parseFlowValue(c) {
157
+ skipFlowSpace(c);
158
+ const ch = peek(c);
159
+ if (ch === '{') return parseFlowMap(c);
160
+ if (ch === '[') return parseFlowSeq(c);
161
+ if (ch === '|' || ch === '>') throw new YamlError(c.i);
162
+ return parseScalar(c, true);
163
+ }
164
+ function parseFlowMap(c) {
165
+ const start = c.i;
166
+ if (peek(c) !== '{') throw new YamlError(c.i);
167
+ c.i += 1;
168
+ skipFlowSpace(c);
169
+ const entries = [];
170
+ const seen = new Set();
171
+ if (peek(c) === '}') {
172
+ c.i += 1;
173
+ return {
174
+ kind: 'map',
175
+ entries,
176
+ start,
177
+ end: c.i
178
+ };
179
+ }
180
+ while(c.i < c.end){
181
+ skipFlowSpace(c);
182
+ const key = parseKey(c);
183
+ skipFlowSpace(c);
184
+ if (peek(c) !== ':') throw new YamlError(c.i);
185
+ c.i += 1;
186
+ const value = parseFlowValue(c);
187
+ if (seen.has(key.name)) throw new YamlError(key.start);
188
+ seen.add(key.name);
189
+ entries.push({
190
+ key: key.name,
191
+ keyStart: key.start,
192
+ keyEnd: key.end,
193
+ value
194
+ });
195
+ skipFlowSpace(c);
196
+ if (peek(c) === ',') {
197
+ c.i += 1;
198
+ continue;
199
+ }
200
+ if (peek(c) === '}') {
201
+ c.i += 1;
202
+ return {
203
+ kind: 'map',
204
+ entries,
205
+ start,
206
+ end: c.i
207
+ };
208
+ }
209
+ throw new YamlError(c.i);
210
+ }
211
+ throw new YamlError(c.i);
212
+ }
213
+ function parseFlowSeq(c) {
214
+ const start = c.i;
215
+ if (peek(c) !== '[') throw new YamlError(c.i);
216
+ c.i += 1;
217
+ skipFlowSpace(c);
218
+ const items = [];
219
+ if (peek(c) === ']') {
220
+ c.i += 1;
221
+ return {
222
+ kind: 'seq',
223
+ items,
224
+ start,
225
+ end: c.i
226
+ };
227
+ }
228
+ while(c.i < c.end){
229
+ items.push(parseFlowValue(c));
230
+ skipFlowSpace(c);
231
+ if (peek(c) === ',') {
232
+ c.i += 1;
233
+ skipFlowSpace(c);
234
+ continue;
235
+ }
236
+ if (peek(c) === ']') {
237
+ c.i += 1;
238
+ return {
239
+ kind: 'seq',
240
+ items,
241
+ start,
242
+ end: c.i
243
+ };
244
+ }
245
+ throw new YamlError(c.i);
246
+ }
247
+ throw new YamlError(c.i);
248
+ }
249
+ function parseValue(c, parentKeyIndent) {
250
+ skipSpaces(c);
251
+ if (peek(c) === '#') skipToEol(c);
252
+ const ch = peek(c);
253
+ if (ch === '' || ch === '\n' || ch === '\r') {
254
+ skipEol(c);
255
+ skipBlankAndComments(c);
256
+ if (c.i >= c.end) return scalar(null, c.i, c.i);
257
+ const nextIndent = indentAt(c);
258
+ if (nextIndent <= parentKeyIndent) return scalar(null, c.i, c.i);
259
+ if (peek(c) === '-') return parseBlockSeq(c, nextIndent);
260
+ if (peek(c) === '[') return parseFlowSeq(c);
261
+ if (peek(c) === '{') return parseFlowMap(c);
262
+ return parseBlockMap(c, nextIndent);
263
+ }
264
+ if (ch === '{') return parseFlowMap(c);
265
+ if (ch === '[') return parseFlowSeq(c);
266
+ if (ch === '|' || ch === '>') throw new YamlError(c.i);
267
+ return parseScalar(c, false);
268
+ }
269
+ function parseBlockSeq(c, indent) {
270
+ const start = c.i;
271
+ const items = [];
272
+ let end = start;
273
+ while(c.i < c.end){
274
+ skipBlankAndComments(c);
275
+ if (c.i >= c.end) break;
276
+ if (indentAt(c) !== indent) break;
277
+ if (peek(c) !== '-') break;
278
+ c.i += 1;
279
+ items.push(parseValue(c, indent));
280
+ end = c.i;
281
+ }
282
+ return {
283
+ kind: 'seq',
284
+ items,
285
+ start,
286
+ end
287
+ };
288
+ }
289
+ function parseBlockMap(c, indent) {
290
+ const start = c.i;
291
+ const entries = [];
292
+ const seen = new Set();
293
+ let end = start;
294
+ while(c.i < c.end){
295
+ skipBlankAndComments(c);
296
+ if (c.i >= c.end) break;
297
+ if (indentAt(c) < indent) break;
298
+ if (indentAt(c) > indent) throw new YamlError(c.i);
299
+ const key = parseKey(c);
300
+ skipSpaces(c);
301
+ if (peek(c) !== ':') throw new YamlError(c.i);
302
+ c.i += 1;
303
+ const value = parseValue(c, indent);
304
+ if (seen.has(key.name)) throw new YamlError(key.start);
305
+ seen.add(key.name);
306
+ entries.push({
307
+ key: key.name,
308
+ keyStart: key.start,
309
+ keyEnd: key.end,
310
+ value
311
+ });
312
+ end = c.i;
313
+ }
314
+ return {
315
+ kind: 'map',
316
+ entries,
317
+ start,
318
+ end
319
+ };
320
+ }
321
+ export function parseYamlMapping(text, start, end) {
322
+ const c = {
323
+ text,
324
+ i: start,
325
+ end
326
+ };
327
+ skipBlankAndComments(c);
328
+ if (c.i >= end) return {
329
+ kind: 'map',
330
+ entries: [],
331
+ start,
332
+ end
333
+ };
334
+ if (peek(c) === '{') {
335
+ const mapped = parseFlowMap(c);
336
+ skipBlankAndComments(c);
337
+ if (c.i < end) throw new YamlError(c.i);
338
+ return mapped;
339
+ }
340
+ const mapped = parseBlockMap(c, indentAt(c));
341
+ skipBlankAndComments(c);
342
+ if (c.i < end) throw new YamlError(c.i);
343
+ return mapped;
344
+ }
345
+ export function jsValue(node) {
346
+ if (node.kind === 'scalar') return node.value;
347
+ if (node.kind === 'seq') return node.items.map(jsValue);
348
+ const record = {};
349
+ for (const entry of node.entries)record[entry.key] = jsValue(entry.value);
350
+ return record;
351
+ }
352
+ export function mapEntry(map, key) {
353
+ return map.entries.find((entry)=>entry.key === key);
354
+ }
355
+ export function isPlainSafe(text) {
356
+ if (text === '' || text === 'true' || text === 'false' || text === 'null') return false;
357
+ if (/[\s#:{}[\],&*!|>'"%@`]/.test(text)) return false;
358
+ if (text.startsWith('-') || text.startsWith('?') || text.startsWith(':')) return false;
359
+ if (/^-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return false;
360
+ return true;
361
+ }
362
+ export function serializeJs(value) {
363
+ if (value === null) return 'null';
364
+ if (value === true) return 'true';
365
+ if (value === false) return 'false';
366
+ if (typeof value === 'number' && Number.isFinite(value)) return JSON.stringify(value);
367
+ if (typeof value === 'string') return isPlainSafe(value) ? value : JSON.stringify(value);
368
+ if (Array.isArray(value)) return `[${value.map(serializeJs).join(', ')}]`;
369
+ throw new YamlError(0);
370
+ }
371
+ export function serializeKey(name) {
372
+ return isPlainSafe(name) || /^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ? name : JSON.stringify(name);
373
+ }
374
+ export function bodyStartAfterYaml(content, yamlEnd) {
375
+ const closeLine = content.indexOf('\n', yamlEnd);
376
+ return closeLine === -1 ? content.length : closeLine + 1;
377
+ }
378
+ export function bodyAfterFrontmatter(content) {
379
+ const fence = extractFrontmatter(content);
380
+ if (fence.kind !== 'ok') return content;
381
+ return content.slice(bodyStartAfterYaml(content, fence.yamlEnd));
382
+ }
383
+ export function extractFrontmatter(content) {
384
+ if (!content.startsWith('---')) return {
385
+ kind: 'none'
386
+ };
387
+ const firstNl = content.indexOf('\n');
388
+ const firstLine = firstNl === -1 ? content : content.slice(0, content[firstNl - 1] === '\r' ? firstNl - 1 : firstNl);
389
+ if (!/^---[ \t]*$/.test(firstLine)) return {
390
+ kind: 'none'
391
+ };
392
+ if (firstNl === -1) return {
393
+ kind: 'unclosed'
394
+ };
395
+ const yamlStart = firstNl + 1;
396
+ let i = yamlStart;
397
+ while(i <= content.length){
398
+ const nl = content.indexOf('\n', i);
399
+ const lineEnd = nl === -1 ? content.length : nl;
400
+ let line = content.slice(i, lineEnd);
401
+ if (line.endsWith('\r')) line = line.slice(0, -1);
402
+ if (/^---[ \t]*$/.test(line)) return {
403
+ kind: 'ok',
404
+ yamlStart,
405
+ yamlEnd: i
406
+ };
407
+ if (nl === -1) return {
408
+ kind: 'unclosed'
409
+ };
410
+ i = nl + 1;
411
+ }
412
+ return {
413
+ kind: 'unclosed'
414
+ };
415
+ }
416
+ export function equalValue(left, right) {
417
+ if (left === right) return true;
418
+ if (Array.isArray(left) && Array.isArray(right)) {
419
+ return left.length === right.length && left.every((item, index)=>equalValue(item, right[index]));
420
+ }
421
+ return false;
422
+ }
423
+ export function lineEnding(content) {
424
+ return content.includes('\r\n') ? '\r\n' : '\n';
425
+ }
426
+
427
+ //# sourceMappingURL=yaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/yaml.ts"],"sourcesContent":["export class YamlError extends Error {\n constructor(readonly offset: number) {\n super('yaml');\n this.name = 'YamlError';\n }\n}\n\nexport type YamlScalar = {\n readonly kind: 'scalar';\n readonly value: string | number | boolean | null;\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlSeq = {\n readonly kind: 'seq';\n readonly items: readonly YamlNode[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlEntry = {\n readonly key: string;\n readonly keyStart: number;\n readonly keyEnd: number;\n readonly value: YamlNode;\n};\n\nexport type YamlMap = {\n readonly kind: 'map';\n readonly entries: readonly YamlEntry[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlNode = YamlScalar | YamlSeq | YamlMap;\n\ntype Ctx = { text: string; i: number; end: number };\n\nfunction peek(c: Ctx): string {\n return c.i < c.end ? c.text[c.i]! : '';\n}\n\nfunction skipEol(c: Ctx): void {\n if (peek(c) === '\\r') c.i += 1;\n if (peek(c) === '\\n') c.i += 1;\n}\n\nfunction skipSpaces(c: Ctx): void {\n while (peek(c) === ' ') c.i += 1;\n if (peek(c) === '\\t') throw new YamlError(c.i);\n}\n\nfunction skipToEol(c: Ctx): void {\n while (c.i < c.end && peek(c) !== '\\n' && peek(c) !== '\\r') c.i += 1;\n}\n\nfunction skipBlankAndComments(c: Ctx): void {\n while (c.i < c.end) {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n if (peek(c) === '\\r' || peek(c) === '\\n') {\n skipEol(c);\n continue;\n }\n break;\n }\n}\n\nfunction skipFlowSpace(c: Ctx): void {\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === ' ' || ch === '\\n' || ch === '\\r') {\n c.i += 1;\n continue;\n }\n if (ch === '#') {\n skipToEol(c);\n continue;\n }\n if (ch === '\\t') throw new YamlError(c.i);\n break;\n }\n}\n\nfunction indentAt(c: Ctx): number {\n let j = c.i;\n while (j > 0 && c.text[j - 1] !== '\\n') j -= 1;\n let n = 0;\n while (j < c.i) {\n const ch = c.text[j]!;\n if (ch === ' ') n += 1;\n else if (ch === '\\t') throw new YamlError(j);\n else break;\n j += 1;\n }\n return n;\n}\n\nfunction scalar(value: string | number | boolean | null, start: number, end: number): YamlScalar {\n return { kind: 'scalar', value, start, end };\n}\n\nfunction interpretPlain(text: string): string | number | boolean | null {\n if (text === 'true') return true;\n if (text === 'false') return false;\n if (text === 'null' || text === '') return null;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return Number(text);\n return text;\n}\n\nfunction parseQuoted(c: Ctx): YamlScalar {\n const quote = peek(c);\n const start = c.i;\n c.i += 1;\n let out = '';\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === quote) {\n c.i += 1;\n return scalar(out, start, c.i);\n }\n if (ch === '\\n' || ch === '\\r') throw new YamlError(c.i);\n if (quote === \"'\" && ch === \"'\" && c.text[c.i + 1] === \"'\") {\n out += \"'\";\n c.i += 2;\n continue;\n }\n if (quote === '\"' && ch === '\\\\') {\n c.i += 1;\n const escaped = peek(c);\n if (escaped === 'n') out += '\\n';\n else if (escaped === 't') out += '\\t';\n else if (escaped === '\"') out += '\"';\n else if (escaped === '\\\\') out += '\\\\';\n else throw new YamlError(c.i);\n c.i += 1;\n continue;\n }\n out += ch;\n c.i += 1;\n }\n throw new YamlError(c.i);\n}\n\nfunction parsePlain(c: Ctx, flow: boolean): YamlScalar {\n const start = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (flow && (ch === ',' || ch === ']' || ch === '}')) break;\n if (ch === '\\n' || ch === '\\r') break;\n if (ch === '#' && (c.i === start || c.text[c.i - 1] === ' ' || c.text[c.i - 1] === '\\t')) break;\n c.i += 1;\n }\n if (c.i === start) throw new YamlError(c.i);\n const raw = c.text.slice(start, c.i);\n const trimmed = raw.trimEnd();\n return scalar(interpretPlain(trimmed), start, start + trimmed.length);\n}\n\nfunction parseScalar(c: Ctx, flow: boolean): YamlScalar {\n const ch = peek(c);\n if (ch === '\"' || ch === \"'\") return parseQuoted(c);\n return parsePlain(c, flow);\n}\n\nfunction parseKey(c: Ctx): { name: string; start: number; end: number } {\n const start = c.i;\n if (peek(c) === '\"' || peek(c) === \"'\") {\n const quoted = parseQuoted(c);\n if (typeof quoted.value !== 'string') throw new YamlError(start);\n return { name: quoted.value, start, end: c.i };\n }\n let end = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (\n ch === ':' ||\n ch === '\\n' ||\n ch === '\\r' ||\n ch === ',' ||\n ch === '}' ||\n ch === ']' ||\n ch === '#' ||\n ch === '{' ||\n ch === '['\n ) {\n break;\n }\n c.i += 1;\n if (ch !== ' ' && ch !== '\\t') end = c.i;\n }\n if (end === start) throw new YamlError(c.i);\n c.i = end;\n return { name: c.text.slice(start, end), start, end };\n}\n\nfunction parseFlowValue(c: Ctx): YamlNode {\n skipFlowSpace(c);\n const ch = peek(c);\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, true);\n}\n\nfunction parseFlowMap(c: Ctx): YamlMap {\n const start = c.i;\n if (peek(c) !== '{') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n while (c.i < c.end) {\n skipFlowSpace(c);\n const key = parseKey(c);\n skipFlowSpace(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseFlowValue(c);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n continue;\n }\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseFlowSeq(c: Ctx): YamlSeq {\n const start = c.i;\n if (peek(c) !== '[') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const items: YamlNode[] = [];\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n while (c.i < c.end) {\n items.push(parseFlowValue(c));\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n skipFlowSpace(c);\n continue;\n }\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseValue(c: Ctx, parentKeyIndent: number): YamlNode {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n const ch = peek(c);\n if (ch === '' || ch === '\\n' || ch === '\\r') {\n skipEol(c);\n skipBlankAndComments(c);\n if (c.i >= c.end) return scalar(null, c.i, c.i);\n const nextIndent = indentAt(c);\n if (nextIndent <= parentKeyIndent) return scalar(null, c.i, c.i);\n if (peek(c) === '-') return parseBlockSeq(c, nextIndent);\n if (peek(c) === '[') return parseFlowSeq(c);\n if (peek(c) === '{') return parseFlowMap(c);\n return parseBlockMap(c, nextIndent);\n }\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, false);\n}\n\nfunction parseBlockSeq(c: Ctx, indent: number): YamlSeq {\n const start = c.i;\n const items: YamlNode[] = [];\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) !== indent) break;\n if (peek(c) !== '-') break;\n c.i += 1;\n items.push(parseValue(c, indent));\n end = c.i;\n }\n return { kind: 'seq', items, start, end };\n}\n\nfunction parseBlockMap(c: Ctx, indent: number): YamlMap {\n const start = c.i;\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) < indent) break;\n if (indentAt(c) > indent) throw new YamlError(c.i);\n const key = parseKey(c);\n skipSpaces(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseValue(c, indent);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n end = c.i;\n }\n return { kind: 'map', entries, start, end };\n}\n\nexport function parseYamlMapping(text: string, start: number, end: number): YamlMap {\n const c: Ctx = { text, i: start, end };\n skipBlankAndComments(c);\n if (c.i >= end) return { kind: 'map', entries: [], start, end };\n if (peek(c) === '{') {\n const mapped = parseFlowMap(c);\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n }\n const mapped = parseBlockMap(c, indentAt(c));\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n}\n\nexport function jsValue(node: YamlNode): unknown {\n if (node.kind === 'scalar') return node.value;\n if (node.kind === 'seq') return node.items.map(jsValue);\n const record: Record<string, unknown> = {};\n for (const entry of node.entries) record[entry.key] = jsValue(entry.value);\n return record;\n}\n\nexport function mapEntry(map: YamlMap, key: string): YamlEntry | undefined {\n return map.entries.find((entry) => entry.key === key);\n}\n\nexport function isPlainSafe(text: string): boolean {\n if (text === '' || text === 'true' || text === 'false' || text === 'null') return false;\n if (/[\\s#:{}[\\],&*!|>'\"%@`]/.test(text)) return false;\n if (text.startsWith('-') || text.startsWith('?') || text.startsWith(':')) return false;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return false;\n return true;\n}\n\nexport function serializeJs(value: unknown): string {\n if (value === null) return 'null';\n if (value === true) return 'true';\n if (value === false) return 'false';\n if (typeof value === 'number' && Number.isFinite(value)) return JSON.stringify(value);\n if (typeof value === 'string') return isPlainSafe(value) ? value : JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(serializeJs).join(', ')}]`;\n throw new YamlError(0);\n}\n\nexport function serializeKey(name: string): string {\n return isPlainSafe(name) || /^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ? name : JSON.stringify(name);\n}\n\nexport function bodyStartAfterYaml(content: string, yamlEnd: number): number {\n const closeLine = content.indexOf('\\n', yamlEnd);\n return closeLine === -1 ? content.length : closeLine + 1;\n}\n\nexport function bodyAfterFrontmatter(content: string): string {\n const fence = extractFrontmatter(content);\n if (fence.kind !== 'ok') return content;\n return content.slice(bodyStartAfterYaml(content, fence.yamlEnd));\n}\n\nexport function extractFrontmatter(\n content: string,\n): { kind: 'none' } | { kind: 'unclosed' } | { kind: 'ok'; yamlStart: number; yamlEnd: number } {\n if (!content.startsWith('---')) return { kind: 'none' };\n const firstNl = content.indexOf('\\n');\n const firstLine =\n firstNl === -1\n ? content\n : content.slice(0, content[firstNl - 1] === '\\r' ? firstNl - 1 : firstNl);\n if (!/^---[ \\t]*$/.test(firstLine)) return { kind: 'none' };\n if (firstNl === -1) return { kind: 'unclosed' };\n const yamlStart = firstNl + 1;\n let i = yamlStart;\n while (i <= content.length) {\n const nl = content.indexOf('\\n', i);\n const lineEnd = nl === -1 ? content.length : nl;\n let line = content.slice(i, lineEnd);\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n if (/^---[ \\t]*$/.test(line)) return { kind: 'ok', yamlStart, yamlEnd: i };\n if (nl === -1) return { kind: 'unclosed' };\n i = nl + 1;\n }\n return { kind: 'unclosed' };\n}\n\nexport function equalValue(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length && left.every((item, index) => equalValue(item, right[index]))\n );\n }\n return false;\n}\n\nexport function lineEnding(content: string): '\\n' | '\\r\\n' {\n return content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n"],"names":["YamlError","Error","offset","name","peek","c","i","end","text","skipEol","skipSpaces","skipToEol","skipBlankAndComments","skipFlowSpace","ch","indentAt","j","n","scalar","value","start","kind","interpretPlain","test","Number","parseQuoted","quote","out","escaped","parsePlain","flow","raw","slice","trimmed","trimEnd","length","parseScalar","parseKey","quoted","parseFlowValue","parseFlowMap","parseFlowSeq","entries","seen","Set","key","has","add","push","keyStart","keyEnd","items","parseValue","parentKeyIndent","nextIndent","parseBlockSeq","parseBlockMap","indent","parseYamlMapping","mapped","jsValue","node","map","record","entry","mapEntry","find","isPlainSafe","startsWith","serializeJs","isFinite","JSON","stringify","Array","isArray","join","serializeKey","bodyStartAfterYaml","content","yamlEnd","closeLine","indexOf","bodyAfterFrontmatter","fence","extractFrontmatter","firstNl","firstLine","yamlStart","nl","lineEnd","line","endsWith","equalValue","left","right","every","item","index","lineEnding","includes"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ # Conformance fixtures
2
+
3
+ Each directory under `cases/` is one Library state and one expected verdict.
4
+ Consumers load the files under `library/` as path-to-content and compare
5
+ `validate` against `expected.json`.
6
+
7
+ ## Verdict format
8
+
9
+ Acceptance:
10
+
11
+ ```json
12
+ { "verdict": "accept" }
13
+ ```
14
+
15
+ Refusal:
16
+
17
+ ```json
18
+ {
19
+ "verdict": "refuse",
20
+ "file": "<library path>",
21
+ "location": "<field or section name>",
22
+ "rule": "<rule id>",
23
+ "version": "<package version>",
24
+ "referrers": ["<library path>"]
25
+ }
26
+ ```
27
+
28
+ `location` is omitted when the rule is not about a field or section.
29
+ `referrers` is present only for `referenced-missing-file`.
30
+ The `version` field in these fixtures is the token `<package-version>`;
31
+ replace it with the package's semantic version before comparing.
32
+
33
+ ## Rule ids
34
+
35
+ | Rule | When |
36
+ | ------------------------- | ---------------------------------------------------------------------- |
37
+ | `frontmatter-fence` | A present frontmatter fence does not parse as the accepted YAML subset |
38
+ | `definition-type` | A `types/` file is not a definition, or its type name is empty |
39
+ | `definition-shape` | A definition carries a key other than `type`, `fields`, and `sections` |
40
+ | `definition-fields` | `fields` is not a mapping |
41
+ | `definition-field` | A field spec is not an object of the accepted keys |
42
+ | `definition-field-kind` | A field kind is not string, number, date, enum, reference, or list |
43
+ | `definition-enum-values` | An enum field has no non-empty string `values` |
44
+ | `definition-reference-to` | A reference field has no non-empty `to` type name |
45
+ | `definition-list-of` | A list field has no `of` that is one scalar kind |
46
+ | `definition-sections` | `sections` is not a mapping |
47
+ | `definition-section` | A section spec is not an object of the accepted keys |
48
+ | `definition-section-kind` | A section kind is not `text` or `list` |
49
+ | `definition-duplicate` | Two definition files share a type name |
50
+ | `unknown-type` | A file declares a type that is not in `types/` |
51
+ | `required-field` | A required field is missing |
52
+ | `required-section` | A required section heading is missing |
53
+ | `field-kind` | A field value fails its kind, including date |
54
+ | `field-enum` | A field value is not one of the declared enum values |
55
+ | `unresolved-reference` | A reference does not resolve to a current file of the required type |
56
+ | `unresolved-link` | A relative body link does not resolve to a current path |
57
+ | `structured-section` | A declared structured-list section does not parse as a list |
58
+ | `referenced-missing-file` | Remaining files still reference a path that is not in the Library |
59
+
60
+ ## YAML subset
61
+
62
+ Frontmatter is a mapping in a closed YAML subset: block and flow mappings,
63
+ block and flow sequences, plain and quoted scalars, `true`, `false`, `null`,
64
+ and decimal numbers. It does not take YAML 1.1 boolean or timestamp aliases,
65
+ octal numbers, anchors, tags, or block scalars.
@@ -0,0 +1 @@
1
+ { "verdict": "accept" }
@@ -0,0 +1,3 @@
1
+ # Hello
2
+
3
+ See [missing](nope.md).
@@ -0,0 +1,7 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "item.md",
4
+ "location": "status",
5
+ "rule": "field-enum",
6
+ "version": "<package-version>"
7
+ }
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: task
3
+ title: Ship
4
+ status: waiting
5
+ ---
6
+
7
+ ## Description
8
+
9
+ Go.
@@ -0,0 +1,8 @@
1
+ ---
2
+ type: definition
3
+ fields:
4
+ title: { kind: string, required: true }
5
+ status: { kind: enum, values: [open, in-progress, done], required: true }
6
+ sections:
7
+ Description: { kind: text, required: true }
8
+ ---
@@ -0,0 +1,7 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "types/task.md",
4
+ "location": "title",
5
+ "rule": "definition-field-kind",
6
+ "version": "<package-version>"
7
+ }
@@ -0,0 +1,5 @@
1
+ ---
2
+ type: definition
3
+ fields:
4
+ title: { kind: widget }
5
+ ---
@@ -0,0 +1,7 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "item.md",
4
+ "location": "title",
5
+ "rule": "required-field",
6
+ "version": "<package-version>"
7
+ }
@@ -0,0 +1,8 @@
1
+ ---
2
+ type: task
3
+ status: open
4
+ ---
5
+
6
+ ## Description
7
+
8
+ Go.
@@ -0,0 +1,8 @@
1
+ ---
2
+ type: definition
3
+ fields:
4
+ title: { kind: string, required: true }
5
+ status: { kind: enum, values: [open, in-progress, done], required: true }
6
+ sections:
7
+ Description: { kind: text, required: true }
8
+ ---
@@ -0,0 +1 @@
1
+ { "verdict": "accept" }
@@ -0,0 +1,15 @@
1
+ ---
2
+ type: definition
3
+ fields:
4
+ title: { kind: string, required: true }
5
+ status: { kind: enum, values: [open, in-progress, done], required: true }
6
+ due: { kind: date }
7
+ owner: { kind: reference, to: person }
8
+ labels: { kind: list, of: string }
9
+ sections:
10
+ Description: { kind: text, required: true }
11
+ Acceptance: { kind: list }
12
+ ---
13
+
14
+ Free text after the frontmatter is documentation for people and agents.
15
+ House validates nothing in it.
@@ -0,0 +1,7 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "people/ada.md",
4
+ "rule": "referenced-missing-file",
5
+ "version": "<package-version>",
6
+ "referrers": ["a.md", "b.md"]
7
+ }
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: task
3
+ title: A
4
+ owner: people/ada.md
5
+ ---
6
+
7
+ ## Description
8
+
9
+ A.