@astra-spec/sdk 0.0.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 (43) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +117 -0
  3. package/dist/helpers.d.ts +26 -0
  4. package/dist/helpers.d.ts.map +1 -0
  5. package/dist/helpers.js +165 -0
  6. package/dist/helpers.js.map +1 -0
  7. package/dist/index.d.ts +5 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +12 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schema/index.d.ts +35 -0
  12. package/dist/schema/index.d.ts.map +1 -0
  13. package/dist/schema/index.js +85 -0
  14. package/dist/schema/index.js.map +1 -0
  15. package/dist/types.d.ts +122 -0
  16. package/dist/types.d.ts.map +1 -0
  17. package/dist/types.js +5 -0
  18. package/dist/types.js.map +1 -0
  19. package/dist/validation/index.d.ts +4 -0
  20. package/dist/validation/index.d.ts.map +1 -0
  21. package/dist/validation/index.js +4 -0
  22. package/dist/validation/index.js.map +1 -0
  23. package/dist/validation/narrative.d.ts +23 -0
  24. package/dist/validation/narrative.d.ts.map +1 -0
  25. package/dist/validation/narrative.js +337 -0
  26. package/dist/validation/narrative.js.map +1 -0
  27. package/dist/validation/schema.d.ts +16 -0
  28. package/dist/validation/schema.d.ts.map +1 -0
  29. package/dist/validation/schema.js +82 -0
  30. package/dist/validation/schema.js.map +1 -0
  31. package/dist/validation/semantic.d.ts +18 -0
  32. package/dist/validation/semantic.d.ts.map +1 -0
  33. package/dist/validation/semantic.js +751 -0
  34. package/dist/validation/semantic.js.map +1 -0
  35. package/package.json +60 -0
  36. package/src/helpers.ts +171 -0
  37. package/src/index.ts +69 -0
  38. package/src/schema/index.ts +113 -0
  39. package/src/types.ts +139 -0
  40. package/src/validation/index.ts +26 -0
  41. package/src/validation/narrative.ts +389 -0
  42. package/src/validation/schema.ts +132 -0
  43. package/src/validation/semantic.ts +1129 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0EAA0E;AAC1E,2EAA2E"}
@@ -0,0 +1,4 @@
1
+ export { validateAnalysisData, validateUniverseData, validateAnalysisFile, validateUniverseFile, isValidAnalysis, isValidUniverse, } from "./schema.js";
2
+ export { SemanticError, validateAnalysis, validateUniverse, validateAnalysisFile as semanticValidateAnalysisFile, validateUniverseFile as semanticValidateUniverseFile, } from "./semantic.js";
3
+ export { NarrativeWarning, validateNarrativeAnchors, validateNarrativeAnchorsFile, checkNarrativeCoverage, checkNarrativeCoverageFile, validateNarrativeSections, validateNarrativeSectionsFile, } from "./narrative.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,IAAI,4BAA4B,EACpD,oBAAoB,IAAI,4BAA4B,GACrD,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { validateAnalysisData, validateUniverseData, validateAnalysisFile, validateUniverseFile, isValidAnalysis, isValidUniverse, } from "./schema.js";
2
+ export { SemanticError, validateAnalysis, validateUniverse, validateAnalysisFile as semanticValidateAnalysisFile, validateUniverseFile as semanticValidateUniverseFile, } from "./semantic.js";
3
+ export { NarrativeWarning, validateNarrativeAnchors, validateNarrativeAnchorsFile, checkNarrativeCoverage, checkNarrativeCoverageFile, validateNarrativeSections, validateNarrativeSectionsFile, } from "./narrative.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,IAAI,4BAA4B,EACpD,oBAAoB,IAAI,4BAA4B,GACrD,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { SemanticError } from "./semantic.js";
2
+ type Dict = Record<string, unknown>;
3
+ export declare class NarrativeWarning {
4
+ readonly code: string;
5
+ readonly message: string;
6
+ readonly path?: string | undefined;
7
+ constructor(code: string, message: string, path?: string | undefined);
8
+ toString(): string;
9
+ }
10
+ export declare function validateNarrativeAnchors(data: Dict, options?: {
11
+ basePath?: string;
12
+ }): SemanticError[];
13
+ export declare function checkNarrativeCoverage(data: Dict, options?: {
14
+ basePath?: string;
15
+ }): NarrativeWarning[];
16
+ export declare function validateNarrativeSections(data: Dict, options?: {
17
+ basePath?: string;
18
+ }): SemanticError[];
19
+ export declare function validateNarrativeAnchorsFile(filePath: string): SemanticError[];
20
+ export declare function checkNarrativeCoverageFile(filePath: string): NarrativeWarning[];
21
+ export declare function validateNarrativeSectionsFile(filePath: string): SemanticError[];
22
+ export {};
23
+ //# sourceMappingURL=narrative.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrative.d.ts","sourceRoot":"","sources":["../../src/validation/narrative.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AA2B9C,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAUpC,qBAAa,gBAAgB;aAET,IAAI,EAAE,MAAM;aACZ,OAAO,EAAE,MAAM;aACf,IAAI,CAAC,EAAE,MAAM;gBAFb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,YAAA;IAE/B,QAAQ,IAAI,MAAM;CAGnB;AAuHD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,aAAa,EAAE,CAMjB;AAiED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,gBAAgB,EAAE,CAQpB;AAkFD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,aAAa,EAAE,CAMjB;AAiCD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAE9E;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAE/E;AAED,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAE/E"}
@@ -0,0 +1,337 @@
1
+ // Narrative validation: anchor resolution, coverage warnings, and the
2
+ // section-required-when-data-present rule.
3
+ import { loadYaml, resolveAnalysisTree } from "../helpers.js";
4
+ import { SemanticError } from "./semantic.js";
5
+ const HREF_RE = /\[[^\]]*\]\(([^)\s]+)\)/g;
6
+ const PARENT_PATH_FORM_RE = /^(?:\.\.\/)+#/;
7
+ const CATEGORIES = new Set([
8
+ "inputs",
9
+ "outputs",
10
+ "decisions",
11
+ "findings",
12
+ "prior_insights",
13
+ "analyses",
14
+ ]);
15
+ const ANALYSES_PREFIX_FORM_RE = new RegExp(`^analyses\\.[^.]+\\.(?:${[...CATEGORIES].sort().join("|")})(?:\\.|$)`);
16
+ const COVERAGE_LABELS = {
17
+ decisions: "Decision",
18
+ findings: "Finding",
19
+ outputs: "Output",
20
+ analyses: "Sub-analysis",
21
+ };
22
+ const NARRATIVE_SECTIONS = ["summary", "findings", "methods", "inputs", "outputs"];
23
+ function asDict(v) {
24
+ return v && typeof v === "object" && !Array.isArray(v) ? v : undefined;
25
+ }
26
+ function asArray(v) {
27
+ return Array.isArray(v) ? v : [];
28
+ }
29
+ export class NarrativeWarning {
30
+ code;
31
+ message;
32
+ path;
33
+ constructor(code, message, path) {
34
+ this.code = code;
35
+ this.message = message;
36
+ this.path = path;
37
+ }
38
+ toString() {
39
+ return this.path ? `[${this.code}] ${this.path}: ${this.message}` : `[${this.code}] ${this.message}`;
40
+ }
41
+ }
42
+ function parseAnchor(raw) {
43
+ let up = 0;
44
+ let remaining = raw;
45
+ while (remaining.startsWith("../")) {
46
+ up += 1;
47
+ remaining = remaining.slice(3);
48
+ }
49
+ if (!remaining)
50
+ return null;
51
+ const segments = remaining.split(".");
52
+ if (segments.some((s) => !s))
53
+ return null;
54
+ let catIdx = -1;
55
+ for (let i = 0; i < segments.length; i++) {
56
+ if (CATEGORIES.has(segments[i])) {
57
+ catIdx = i;
58
+ break;
59
+ }
60
+ }
61
+ if (catIdx === -1)
62
+ return null;
63
+ const subPath = segments.slice(0, catIdx);
64
+ const category = segments[catIdx];
65
+ const tail = segments.slice(catIdx + 1);
66
+ if (tail.length === 0)
67
+ return null;
68
+ const elementId = tail[0];
69
+ let optionId = null;
70
+ if (category === "decisions") {
71
+ if (tail.length === 3 && tail[1] === "options")
72
+ optionId = tail[2];
73
+ else if (tail.length > 1)
74
+ return null;
75
+ }
76
+ else if (tail.length > 1) {
77
+ return null;
78
+ }
79
+ return { raw, upLevels: up, subPath, category, elementId, optionId };
80
+ }
81
+ function getNodeAt(root, path) {
82
+ let current = root;
83
+ for (const seg of path) {
84
+ const analyses = asDict(current.analyses) ?? {};
85
+ if (!(seg in analyses))
86
+ return null;
87
+ const next = asDict(analyses[seg]);
88
+ if (!next)
89
+ return null;
90
+ current = next;
91
+ }
92
+ return current;
93
+ }
94
+ function lookupElement(node, category, elementId, optionId) {
95
+ if (category === "inputs") {
96
+ const ids = asArray(node.inputs).map((i) => i?.id).filter(Boolean);
97
+ return ids.includes(elementId);
98
+ }
99
+ if (category === "outputs") {
100
+ const ids = asArray(node.outputs).map((o) => o?.id).filter(Boolean);
101
+ return ids.includes(elementId);
102
+ }
103
+ if (category === "decisions") {
104
+ const decisions = asDict(node.decisions) ?? {};
105
+ if (!(elementId in decisions))
106
+ return false;
107
+ if (optionId === null)
108
+ return true;
109
+ const options = asDict(decisions[elementId].options) ?? {};
110
+ return optionId in options;
111
+ }
112
+ if (category === "findings")
113
+ return elementId in (asDict(node.findings) ?? {});
114
+ if (category === "prior_insights")
115
+ return elementId in (asDict(node.prior_insights) ?? {});
116
+ if (category === "analyses")
117
+ return elementId in (asDict(node.analyses) ?? {});
118
+ return false;
119
+ }
120
+ function resolveAnchor(anchor, hostingPath, root) {
121
+ if (anchor.upLevels > hostingPath.length)
122
+ return null;
123
+ const base = hostingPath.slice(0, hostingPath.length - anchor.upLevels);
124
+ const targetPath = [...base, ...anchor.subPath];
125
+ const targetNode = getNodeAt(root, targetPath);
126
+ if (!targetNode)
127
+ return null;
128
+ if (!lookupElement(targetNode, anchor.category, anchor.elementId, anchor.optionId))
129
+ return null;
130
+ return { targetPath, category: anchor.category, elementId: anchor.elementId, optionId: anchor.optionId };
131
+ }
132
+ function* iterSections(narrative) {
133
+ const dict = asDict(narrative);
134
+ if (!dict)
135
+ return;
136
+ for (const section of NARRATIVE_SECTIONS) {
137
+ const content = dict[section];
138
+ if (typeof content === "string" && content)
139
+ yield [section, content];
140
+ }
141
+ }
142
+ function* extractSectionHrefs(narrative) {
143
+ for (const [section, content] of iterSections(narrative)) {
144
+ HREF_RE.lastIndex = 0;
145
+ let match;
146
+ while ((match = HREF_RE.exec(content)) !== null) {
147
+ yield [section, match[1]];
148
+ }
149
+ }
150
+ }
151
+ function nodePathStr(path) {
152
+ return path.map((seg) => `analyses.${seg}`).join(".");
153
+ }
154
+ function narrativeReportPath(base, section) {
155
+ return base ? `${base}.narrative.${section}` : `narrative.${section}`;
156
+ }
157
+ export function validateNarrativeAnchors(data, options = {}) {
158
+ let working = data;
159
+ if (options.basePath)
160
+ working = resolveAnalysisTree(data, options.basePath);
161
+ const errors = [];
162
+ walkAnchors(working, [], working, errors);
163
+ return errors;
164
+ }
165
+ function walkAnchors(node, path, root, errors) {
166
+ const narrative = node.narrative;
167
+ if (narrative) {
168
+ const base = nodePathStr(path);
169
+ for (const [section, href] of extractSectionHrefs(narrative)) {
170
+ const narrPath = narrativeReportPath(base, section);
171
+ if (PARENT_PATH_FORM_RE.test(href)) {
172
+ errors.push(new SemanticError("INVALID_NARRATIVE_ANCHOR", `Anchor '${href}' uses non-canonical parent escape; move '../' inside the fragment ` +
173
+ `(e.g. '#../target' instead of '../#target')`, narrPath));
174
+ continue;
175
+ }
176
+ if (!href.startsWith("#"))
177
+ continue;
178
+ const raw = href.slice(1);
179
+ if (!raw.includes("."))
180
+ continue;
181
+ const parsed = parseAnchor(raw);
182
+ if (!parsed) {
183
+ let stripped = raw;
184
+ while (stripped.startsWith("../"))
185
+ stripped = stripped.slice(3);
186
+ if (ANALYSES_PREFIX_FORM_RE.test(stripped)) {
187
+ errors.push(new SemanticError("INVALID_NARRATIVE_ANCHOR", `Anchor '${href}' starts with 'analyses.<sub>' but drilling below the sub-analysis ` +
188
+ `node uses the tree-path form: write '#<sub>.<category>.<id>' (or ` +
189
+ `'#../<sib>.<category>.<id>' from a sibling) instead.`, narrPath));
190
+ continue;
191
+ }
192
+ errors.push(new SemanticError("INVALID_NARRATIVE_ANCHOR", `Anchor '#${raw}' does not match the narrative anchor grammar`, narrPath));
193
+ continue;
194
+ }
195
+ if (resolveAnchor(parsed, path, root) === null) {
196
+ errors.push(new SemanticError("BROKEN_NARRATIVE_ANCHOR", `Anchor '#${raw}' does not resolve to a declared element`, narrPath));
197
+ }
198
+ }
199
+ }
200
+ const subAnalyses = asDict(node.analyses) ?? {};
201
+ for (const [subId, raw] of Object.entries(subAnalyses)) {
202
+ const sub = asDict(raw);
203
+ if (sub)
204
+ walkAnchors(sub, [...path, subId], root, errors);
205
+ }
206
+ }
207
+ export function checkNarrativeCoverage(data, options = {}) {
208
+ let working = data;
209
+ if (options.basePath)
210
+ working = resolveAnalysisTree(data, options.basePath);
211
+ const mentioned = new Set();
212
+ collectMentioned(working, [], working, mentioned);
213
+ const warnings = [];
214
+ walkCoverage(working, [], mentioned, warnings);
215
+ return warnings;
216
+ }
217
+ function mentionKey(path, category, elementId) {
218
+ return `${path.join("/")}|${category}|${elementId}`;
219
+ }
220
+ function collectMentioned(node, path, root, mentioned) {
221
+ const narrative = node.narrative;
222
+ if (narrative) {
223
+ for (const [, href] of extractSectionHrefs(narrative)) {
224
+ if (!href.startsWith("#"))
225
+ continue;
226
+ const raw = href.slice(1);
227
+ if (!raw.includes("."))
228
+ continue;
229
+ const parsed = parseAnchor(raw);
230
+ if (!parsed)
231
+ continue;
232
+ const resolved = resolveAnchor(parsed, path, root);
233
+ if (!resolved)
234
+ continue;
235
+ mentioned.add(mentionKey(resolved.targetPath, resolved.category, resolved.elementId));
236
+ // Each ancestor sub-analysis along the resolved target counts as mentioned.
237
+ for (let i = 0; i < resolved.targetPath.length; i++) {
238
+ mentioned.add(mentionKey(resolved.targetPath.slice(0, i), "analyses", resolved.targetPath[i]));
239
+ }
240
+ }
241
+ }
242
+ const subAnalyses = asDict(node.analyses) ?? {};
243
+ for (const [subId, raw] of Object.entries(subAnalyses)) {
244
+ const sub = asDict(raw);
245
+ if (sub)
246
+ collectMentioned(sub, [...path, subId], root, mentioned);
247
+ }
248
+ }
249
+ function* iterCoverageIds(node, category) {
250
+ if (category === "decisions") {
251
+ const decisions = asDict(node.decisions) ?? {};
252
+ for (const [did, decision] of Object.entries(decisions)) {
253
+ if (decision && decision.from)
254
+ continue;
255
+ yield did;
256
+ }
257
+ }
258
+ else if (category === "outputs") {
259
+ for (const out of asArray(node.outputs)) {
260
+ const oid = out?.id;
261
+ if (oid)
262
+ yield oid;
263
+ }
264
+ }
265
+ else {
266
+ yield* Object.keys(asDict(node[category]) ?? {});
267
+ }
268
+ }
269
+ function walkCoverage(node, path, mentioned, warnings) {
270
+ const base = nodePathStr(path);
271
+ for (const [category, label] of Object.entries(COVERAGE_LABELS)) {
272
+ for (const eid of iterCoverageIds(node, category)) {
273
+ if (mentioned.has(mentionKey(path, category, eid)))
274
+ continue;
275
+ const elementPath = base ? `${base}.${category}.${eid}` : `${category}.${eid}`;
276
+ warnings.push(new NarrativeWarning("NARRATIVE_UNMENTIONED", `${label} '${eid}' is not mentioned in any narrative`, elementPath));
277
+ }
278
+ }
279
+ const subAnalyses = asDict(node.analyses) ?? {};
280
+ for (const [subId, raw] of Object.entries(subAnalyses)) {
281
+ const sub = asDict(raw);
282
+ if (sub)
283
+ walkCoverage(sub, [...path, subId], mentioned, warnings);
284
+ }
285
+ }
286
+ const DATA_TRIGGERED_SECTIONS = {
287
+ findings: ["findings"],
288
+ methods: ["decisions", "analyses"],
289
+ inputs: ["inputs"],
290
+ outputs: ["outputs"],
291
+ };
292
+ export function validateNarrativeSections(data, options = {}) {
293
+ let working = data;
294
+ if (options.basePath)
295
+ working = resolveAnalysisTree(data, options.basePath);
296
+ const errors = [];
297
+ walkSectionRequirements(working, [], errors);
298
+ return errors;
299
+ }
300
+ function walkSectionRequirements(node, path, errors) {
301
+ const narrative = asDict(node.narrative) ?? {};
302
+ const base = nodePathStr(path);
303
+ for (const [section, triggers] of Object.entries(DATA_TRIGGERED_SECTIONS)) {
304
+ const present = triggers.filter((k) => {
305
+ const v = node[k];
306
+ if (Array.isArray(v))
307
+ return v.length > 0;
308
+ if (v && typeof v === "object")
309
+ return Object.keys(v).length > 0;
310
+ return Boolean(v);
311
+ });
312
+ if (present.length === 0)
313
+ continue;
314
+ const content = narrative[section];
315
+ if (typeof content === "string" && content.trim())
316
+ continue;
317
+ const triggersStr = present.map((k) => `'${k}'`).join(" and ");
318
+ errors.push(new SemanticError("NARRATIVE_SECTION_REQUIRED", `Narrative section '${section}' is required because ${triggersStr} has entries`, narrativeReportPath(base, section)));
319
+ }
320
+ const subAnalyses = asDict(node.analyses) ?? {};
321
+ for (const [subId, raw] of Object.entries(subAnalyses)) {
322
+ const sub = asDict(raw);
323
+ if (sub)
324
+ walkSectionRequirements(sub, [...path, subId], errors);
325
+ }
326
+ }
327
+ import { dirname } from "node:path";
328
+ export function validateNarrativeAnchorsFile(filePath) {
329
+ return validateNarrativeAnchors(loadYaml(filePath), { basePath: dirname(filePath) });
330
+ }
331
+ export function checkNarrativeCoverageFile(filePath) {
332
+ return checkNarrativeCoverage(loadYaml(filePath), { basePath: dirname(filePath) });
333
+ }
334
+ export function validateNarrativeSectionsFile(filePath) {
335
+ return validateNarrativeSections(loadYaml(filePath), { basePath: dirname(filePath) });
336
+ }
337
+ //# sourceMappingURL=narrative.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrative.js","sourceRoot":"","sources":["../../src/validation/narrative.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type JsonSchema, type SchemaLoadOptions } from "../schema/index.js";
2
+ export interface ValidateOptions extends SchemaLoadOptions {
3
+ /** Pre-loaded schema. Wins over any loader options. */
4
+ schema?: JsonSchema;
5
+ }
6
+ /** Validate an Analysis dict against the JSON Schema. Returns error
7
+ * strings (empty when valid). The schema is fetched from astra-spec.org
8
+ * on first use unless `opts.schema` is provided. */
9
+ export declare function validateAnalysisData(data: Record<string, unknown>, opts?: ValidateOptions): Promise<string[]>;
10
+ export declare function validateUniverseData(data: Record<string, unknown>, opts?: ValidateOptions): Promise<string[]>;
11
+ export declare function validateAnalysisFile(filePath: string, opts?: ValidateOptions): Promise<string[]>;
12
+ export declare function validateUniverseFile(filePath: string, opts?: ValidateOptions): Promise<string[]>;
13
+ export declare function isValidAnalysis(filePath: string, opts?: ValidateOptions): Promise<boolean>;
14
+ export declare function isValidUniverse(filePath: string, opts?: ValidateOptions): Promise<boolean>;
15
+ export { astraSchemaUrl, loadAstraSchema } from "../schema/index.js";
16
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/validation/schema.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,iBAAiB,EAGvB,MAAM,oBAAoB,CAAC;AAQ5B,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,uDAAuD;IACvD,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAkDD;;qDAEqD;AACrD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAOnB;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnB;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,OAAO,CAAC,CAElB;AAGD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,82 @@
1
+ // Structural (JSON Schema) validation. The schema itself is fetched on
2
+ // demand from astra-spec.org via `loadAstraSchema` and cached in memory
3
+ // + on disk; consumers can also pass a pre-loaded schema directly.
4
+ import Ajv2019 from "ajv/dist/2019.js";
5
+ import addFormats from "ajv-formats";
6
+ import { loadAstraSchema, } from "../schema/index.js";
7
+ import { deepClone, injectAnalysisIdsInPlace, injectUniverseIdsInPlace, loadYaml, } from "../helpers.js";
8
+ const _compiledCache = new WeakMap();
9
+ function compileFor(schema) {
10
+ const cached = _compiledCache.get(schema);
11
+ if (cached)
12
+ return cached;
13
+ // The published spec uses JSON Schema draft 2019-09.
14
+ const ajv = new Ajv2019({ allErrors: true, strict: false, allowUnionTypes: true });
15
+ addFormats(ajv);
16
+ const analysis = ajv.compile(schema);
17
+ // Wrap to validate against `#/$defs/Universe`. Don't spread the root —
18
+ // its top-level Analysis keywords would still apply alongside `$ref`.
19
+ const universeWrapper = {
20
+ $schema: schema.$schema,
21
+ $defs: schema.$defs,
22
+ $ref: "#/$defs/Universe",
23
+ };
24
+ const universe = ajv.compile(universeWrapper);
25
+ const compiled = { analysis, universe };
26
+ _compiledCache.set(schema, compiled);
27
+ return compiled;
28
+ }
29
+ async function resolveSchema(opts) {
30
+ if (opts.schema)
31
+ return opts.schema;
32
+ return loadAstraSchema(opts);
33
+ }
34
+ function formatAjvError(err) {
35
+ const path = err.instancePath
36
+ ? err.instancePath.replace(/^\//, "").split("/").join(".")
37
+ : "(root)";
38
+ let msg = err.message ?? "validation error";
39
+ if (err.keyword === "required" && err.params.missingProperty) {
40
+ const missing = err.params.missingProperty;
41
+ msg = `missing required property '${missing}'`;
42
+ }
43
+ return path === "(root)" ? `(root): ${msg}` : `${path}: ${msg}`;
44
+ }
45
+ /** Validate an Analysis dict against the JSON Schema. Returns error
46
+ * strings (empty when valid). The schema is fetched from astra-spec.org
47
+ * on first use unless `opts.schema` is provided. */
48
+ export async function validateAnalysisData(data, opts = {}) {
49
+ const schema = await resolveSchema(opts);
50
+ const { analysis } = compileFor(schema);
51
+ const prepared = deepClone(data);
52
+ if (prepared.id === undefined)
53
+ prepared.id = "root";
54
+ injectAnalysisIdsInPlace(prepared);
55
+ if (analysis(prepared))
56
+ return [];
57
+ return (analysis.errors ?? []).map(formatAjvError);
58
+ }
59
+ export async function validateUniverseData(data, opts = {}) {
60
+ const schema = await resolveSchema(opts);
61
+ const { universe } = compileFor(schema);
62
+ const prepared = deepClone(data);
63
+ injectUniverseIdsInPlace(prepared);
64
+ if (universe(prepared))
65
+ return [];
66
+ return (universe.errors ?? []).map(formatAjvError);
67
+ }
68
+ export async function validateAnalysisFile(filePath, opts = {}) {
69
+ return validateAnalysisData(loadYaml(filePath), opts);
70
+ }
71
+ export async function validateUniverseFile(filePath, opts = {}) {
72
+ return validateUniverseData(loadYaml(filePath), opts);
73
+ }
74
+ export async function isValidAnalysis(filePath, opts = {}) {
75
+ return (await validateAnalysisFile(filePath, opts)).length === 0;
76
+ }
77
+ export async function isValidUniverse(filePath, opts = {}) {
78
+ return (await validateUniverseFile(filePath, opts)).length === 0;
79
+ }
80
+ // Re-export for convenience so callers don't need to import from two paths.
81
+ export { astraSchemaUrl, loadAstraSchema } from "../schema/index.js";
82
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/validation/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Analysis } from "../types.js";
2
+ export declare class SemanticError {
3
+ readonly code: string;
4
+ readonly message: string;
5
+ readonly path?: string | undefined;
6
+ constructor(code: string, message: string, path?: string | undefined);
7
+ toString(): string;
8
+ }
9
+ type Dict = Record<string, unknown>;
10
+ /** Validate an Analysis dict semantically. Returns the list of errors. */
11
+ export declare function validateAnalysis(data: Analysis | Dict, options?: {
12
+ basePath?: string;
13
+ }): SemanticError[];
14
+ export declare function validateUniverse(universeData: Dict, analysisData: Dict): SemanticError[];
15
+ export declare function validateAnalysisFile(filePath: string): SemanticError[];
16
+ export declare function validateUniverseFile(universePath: string, analysisPath: string): SemanticError[];
17
+ export {};
18
+ //# sourceMappingURL=semantic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../src/validation/semantic.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,qBAAa,aAAa;aAEN,IAAI,EAAE,MAAM;aACZ,OAAO,EAAE,MAAM;aACf,IAAI,CAAC,EAAE,MAAM;gBAFb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,YAAA;IAG/B,QAAQ,IAAI,MAAM;CAGnB;AAID,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAgDpC,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,GAAG,IAAI,EACrB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,aAAa,EAAE,CAwFjB;AAovBD,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,IAAI,EAClB,YAAY,EAAE,IAAI,GACjB,aAAa,EAAE,CAEjB;AA8LD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAEtE;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,aAAa,EAAE,CAEjB"}