@principled/cairn 1.0.0-beta
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.
- package/README.md +182 -0
- package/dist/analysis/analyzer.d.ts +13 -0
- package/dist/analysis/analyzer.d.ts.map +1 -0
- package/dist/analysis/analyzer.js +47 -0
- package/dist/analysis/analyzer.js.map +1 -0
- package/dist/analysis/embedding-provider.d.ts +12 -0
- package/dist/analysis/embedding-provider.d.ts.map +1 -0
- package/dist/analysis/embedding-provider.js +21 -0
- package/dist/analysis/embedding-provider.js.map +1 -0
- package/dist/analysis/index.d.ts +4 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +4 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/stub-provider.d.ts +12 -0
- package/dist/analysis/stub-provider.d.ts.map +1 -0
- package/dist/analysis/stub-provider.js +30 -0
- package/dist/analysis/stub-provider.js.map +1 -0
- package/dist/catalog/catalog.d.ts +40 -0
- package/dist/catalog/catalog.d.ts.map +1 -0
- package/dist/catalog/catalog.js +118 -0
- package/dist/catalog/catalog.js.map +1 -0
- package/dist/catalog/category-merger.d.ts +25 -0
- package/dist/catalog/category-merger.d.ts.map +1 -0
- package/dist/catalog/category-merger.js +75 -0
- package/dist/catalog/category-merger.js.map +1 -0
- package/dist/catalog/index.d.ts +4 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +4 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/post-merge-validation.d.ts +7 -0
- package/dist/catalog/post-merge-validation.d.ts.map +1 -0
- package/dist/catalog/post-merge-validation.js +59 -0
- package/dist/catalog/post-merge-validation.js.map +1 -0
- package/dist/cli/commands/add.d.ts +3 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +107 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +3 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +44 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +3 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +69 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/edit.d.ts +3 -0
- package/dist/cli/commands/edit.d.ts.map +1 -0
- package/dist/cli/commands/edit.js +93 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/export.d.ts +3 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +46 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +21 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +3 -0
- package/dist/cli/commands/inspect.d.ts.map +1 -0
- package/dist/cli/commands/inspect.js +153 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/query.d.ts +3 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +77 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/review.d.ts +3 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +118 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +125 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/helpers.d.ts +24 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +152 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +34 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +45 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +201 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +37 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +42 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/data/data/defaults.yaml +101 -0
- package/dist/data/defaults.yaml +101 -0
- package/dist/errors.d.ts +45 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +84 -0
- package/dist/errors.js.map +1 -0
- package/dist/exporters/base.d.ts +17 -0
- package/dist/exporters/base.d.ts.map +1 -0
- package/dist/exporters/base.js +7 -0
- package/dist/exporters/base.js.map +1 -0
- package/dist/exporters/csv-exporter.d.ts +13 -0
- package/dist/exporters/csv-exporter.d.ts.map +1 -0
- package/dist/exporters/csv-exporter.js +73 -0
- package/dist/exporters/csv-exporter.js.map +1 -0
- package/dist/exporters/dot-exporter.d.ts +12 -0
- package/dist/exporters/dot-exporter.d.ts.map +1 -0
- package/dist/exporters/dot-exporter.js +72 -0
- package/dist/exporters/dot-exporter.js.map +1 -0
- package/dist/exporters/index.d.ts +8 -0
- package/dist/exporters/index.d.ts.map +1 -0
- package/dist/exporters/index.js +8 -0
- package/dist/exporters/index.js.map +1 -0
- package/dist/exporters/json-exporter.d.ts +14 -0
- package/dist/exporters/json-exporter.d.ts.map +1 -0
- package/dist/exporters/json-exporter.js +41 -0
- package/dist/exporters/json-exporter.js.map +1 -0
- package/dist/exporters/markdown-exporter.d.ts +14 -0
- package/dist/exporters/markdown-exporter.d.ts.map +1 -0
- package/dist/exporters/markdown-exporter.js +65 -0
- package/dist/exporters/markdown-exporter.js.map +1 -0
- package/dist/exporters/registry.d.ts +4 -0
- package/dist/exporters/registry.d.ts.map +1 -0
- package/dist/exporters/registry.js +20 -0
- package/dist/exporters/registry.js.map +1 -0
- package/dist/exporters/sqlite-exporter.d.ts +10 -0
- package/dist/exporters/sqlite-exporter.d.ts.map +1 -0
- package/dist/exporters/sqlite-exporter.js +20 -0
- package/dist/exporters/sqlite-exporter.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/inheritance/alias-resolver.d.ts +21 -0
- package/dist/inheritance/alias-resolver.d.ts.map +1 -0
- package/dist/inheritance/alias-resolver.js +40 -0
- package/dist/inheritance/alias-resolver.js.map +1 -0
- package/dist/inheritance/index.d.ts +9 -0
- package/dist/inheritance/index.d.ts.map +1 -0
- package/dist/inheritance/index.js +5 -0
- package/dist/inheritance/index.js.map +1 -0
- package/dist/inheritance/inheritance-resolver.d.ts +37 -0
- package/dist/inheritance/inheritance-resolver.d.ts.map +1 -0
- package/dist/inheritance/inheritance-resolver.js +164 -0
- package/dist/inheritance/inheritance-resolver.js.map +1 -0
- package/dist/inheritance/reference-parser.d.ts +27 -0
- package/dist/inheritance/reference-parser.d.ts.map +1 -0
- package/dist/inheritance/reference-parser.js +74 -0
- package/dist/inheritance/reference-parser.js.map +1 -0
- package/dist/inheritance/source-resolver.d.ts +29 -0
- package/dist/inheritance/source-resolver.d.ts.map +1 -0
- package/dist/inheritance/source-resolver.js +87 -0
- package/dist/inheritance/source-resolver.js.map +1 -0
- package/dist/model/category-registry.d.ts +48 -0
- package/dist/model/category-registry.d.ts.map +1 -0
- package/dist/model/category-registry.js +83 -0
- package/dist/model/category-registry.js.map +1 -0
- package/dist/model/document-meta.d.ts +38 -0
- package/dist/model/document-meta.d.ts.map +1 -0
- package/dist/model/document-meta.js +62 -0
- package/dist/model/document-meta.js.map +1 -0
- package/dist/model/document-parser.d.ts +17 -0
- package/dist/model/document-parser.d.ts.map +1 -0
- package/dist/model/document-parser.js +66 -0
- package/dist/model/document-parser.js.map +1 -0
- package/dist/model/document.d.ts +27 -0
- package/dist/model/document.d.ts.map +1 -0
- package/dist/model/document.js +42 -0
- package/dist/model/document.js.map +1 -0
- package/dist/model/element.d.ts +51 -0
- package/dist/model/element.d.ts.map +1 -0
- package/dist/model/element.js +78 -0
- package/dist/model/element.js.map +1 -0
- package/dist/model/graph.d.ts +42 -0
- package/dist/model/graph.d.ts.map +1 -0
- package/dist/model/graph.js +177 -0
- package/dist/model/graph.js.map +1 -0
- package/dist/model/index.d.ts +8 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +7 -0
- package/dist/model/index.js.map +1 -0
- package/dist/parsers/base.d.ts +28 -0
- package/dist/parsers/base.d.ts.map +1 -0
- package/dist/parsers/base.js +19 -0
- package/dist/parsers/base.js.map +1 -0
- package/dist/parsers/index.d.ts +6 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +6 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/markdown-parser.d.ts +12 -0
- package/dist/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/parsers/markdown-parser.js +37 -0
- package/dist/parsers/markdown-parser.js.map +1 -0
- package/dist/parsers/registry.d.ts +11 -0
- package/dist/parsers/registry.d.ts.map +1 -0
- package/dist/parsers/registry.js +21 -0
- package/dist/parsers/registry.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +12 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +74 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/parsers/yaml-parser.d.ts +12 -0
- package/dist/parsers/yaml-parser.d.ts.map +1 -0
- package/dist/parsers/yaml-parser.js +30 -0
- package/dist/parsers/yaml-parser.js.map +1 -0
- package/dist/provenance/index.d.ts +5 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +4 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/provenance/review-hash.d.ts +11 -0
- package/dist/provenance/review-hash.d.ts.map +1 -0
- package/dist/provenance/review-hash.js +18 -0
- package/dist/provenance/review-hash.js.map +1 -0
- package/dist/provenance/schemas.d.ts +36 -0
- package/dist/provenance/schemas.d.ts.map +1 -0
- package/dist/provenance/schemas.js +26 -0
- package/dist/provenance/schemas.js.map +1 -0
- package/dist/provenance/staleness.d.ts +12 -0
- package/dist/provenance/staleness.d.ts.map +1 -0
- package/dist/provenance/staleness.js +46 -0
- package/dist/provenance/staleness.js.map +1 -0
- package/dist/refs/git-diff-tracer.d.ts +35 -0
- package/dist/refs/git-diff-tracer.d.ts.map +1 -0
- package/dist/refs/git-diff-tracer.js +143 -0
- package/dist/refs/git-diff-tracer.js.map +1 -0
- package/dist/schema/build-schema.d.ts +15 -0
- package/dist/schema/build-schema.d.ts.map +1 -0
- package/dist/schema/build-schema.js +83 -0
- package/dist/schema/build-schema.js.map +1 -0
- package/dist/schema/category-definition.d.ts +41 -0
- package/dist/schema/category-definition.d.ts.map +1 -0
- package/dist/schema/category-definition.js +22 -0
- package/dist/schema/category-definition.js.map +1 -0
- package/dist/schema/combined-schema.d.ts +17 -0
- package/dist/schema/combined-schema.d.ts.map +1 -0
- package/dist/schema/combined-schema.js +23 -0
- package/dist/schema/combined-schema.js.map +1 -0
- package/dist/schema/datetime.d.ts +11 -0
- package/dist/schema/datetime.d.ts.map +1 -0
- package/dist/schema/datetime.js +81 -0
- package/dist/schema/datetime.js.map +1 -0
- package/dist/schema/defaults-loader.d.ts +21 -0
- package/dist/schema/defaults-loader.d.ts.map +1 -0
- package/dist/schema/defaults-loader.js +55 -0
- package/dist/schema/defaults-loader.js.map +1 -0
- package/dist/schema/field-schema.d.ts +23 -0
- package/dist/schema/field-schema.d.ts.map +1 -0
- package/dist/schema/field-schema.js +18 -0
- package/dist/schema/field-schema.js.map +1 -0
- package/dist/schema/index.d.ts +17 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +17 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/reserved-fields.d.ts +32 -0
- package/dist/schema/reserved-fields.d.ts.map +1 -0
- package/dist/schema/reserved-fields.js +42 -0
- package/dist/schema/reserved-fields.js.map +1 -0
- package/dist/schema/types.d.ts +7 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +9 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +16 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/project-root.d.ts +14 -0
- package/dist/utils/project-root.d.ts.map +1 -0
- package/dist/utils/project-root.js +48 -0
- package/dist/utils/project-root.js.map +1 -0
- package/dist/validation/diagnostic.d.ts +23 -0
- package/dist/validation/diagnostic.d.ts.map +1 -0
- package/dist/validation/diagnostic.js +5 -0
- package/dist/validation/diagnostic.js.map +1 -0
- package/dist/validation/index.d.ts +6 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +4 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/passes/coverage-pass.d.ts +10 -0
- package/dist/validation/passes/coverage-pass.d.ts.map +1 -0
- package/dist/validation/passes/coverage-pass.js +99 -0
- package/dist/validation/passes/coverage-pass.js.map +1 -0
- package/dist/validation/passes/index.d.ts +6 -0
- package/dist/validation/passes/index.d.ts.map +1 -0
- package/dist/validation/passes/index.js +19 -0
- package/dist/validation/passes/index.js.map +1 -0
- package/dist/validation/passes/schema-pass.d.ts +12 -0
- package/dist/validation/passes/schema-pass.d.ts.map +1 -0
- package/dist/validation/passes/schema-pass.js +38 -0
- package/dist/validation/passes/schema-pass.js.map +1 -0
- package/dist/validation/passes/semantic-pass.d.ts +8 -0
- package/dist/validation/passes/semantic-pass.d.ts.map +1 -0
- package/dist/validation/passes/semantic-pass.js +126 -0
- package/dist/validation/passes/semantic-pass.js.map +1 -0
- package/dist/validation/passes/structural-pass.d.ts +8 -0
- package/dist/validation/passes/structural-pass.d.ts.map +1 -0
- package/dist/validation/passes/structural-pass.js +150 -0
- package/dist/validation/passes/structural-pass.js.map +1 -0
- package/dist/validation/passes/traceability-pass.d.ts +9 -0
- package/dist/validation/passes/traceability-pass.d.ts.map +1 -0
- package/dist/validation/passes/traceability-pass.js +87 -0
- package/dist/validation/passes/traceability-pass.js.map +1 -0
- package/dist/validation/passes/user-rules-pass.d.ts +9 -0
- package/dist/validation/passes/user-rules-pass.d.ts.map +1 -0
- package/dist/validation/passes/user-rules-pass.js +72 -0
- package/dist/validation/passes/user-rules-pass.js.map +1 -0
- package/dist/validation/runner.d.ts +17 -0
- package/dist/validation/runner.d.ts.map +1 -0
- package/dist/validation/runner.js +33 -0
- package/dist/validation/runner.js.map +1 -0
- package/package.json +43 -0
- package/src/data/defaults.yaml +101 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/yaml-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;IAC1C,QAAQ,CAAC,UAAU,WAAqB;IAExC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAyBrG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { RefParser } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parser for YAML files. Identifier = top-level key.
|
|
4
|
+
*/
|
|
5
|
+
export class YamlRefParser extends RefParser {
|
|
6
|
+
extensions = ['.yaml', '.yml'];
|
|
7
|
+
extractIdentifiers(content, matching) {
|
|
8
|
+
const results = [];
|
|
9
|
+
const lines = content.split('\n');
|
|
10
|
+
// Find all top-level keys (no indentation)
|
|
11
|
+
const topKeys = [];
|
|
12
|
+
for (let i = 0; i < lines.length; i++) {
|
|
13
|
+
const m = lines[i].match(/^(\w[\w-]*)\s*:/);
|
|
14
|
+
if (m) {
|
|
15
|
+
topKeys.push({ name: m[1], lineIndex: i });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
for (let k = 0; k < topKeys.length; k++) {
|
|
19
|
+
const key = topKeys[k];
|
|
20
|
+
if (matching && key.name !== matching)
|
|
21
|
+
continue;
|
|
22
|
+
// Block extends to next top-level key or end of file
|
|
23
|
+
const endLine = k + 1 < topKeys.length ? topKeys[k + 1].lineIndex : lines.length;
|
|
24
|
+
const block = lines.slice(key.lineIndex, endLine).join('\n');
|
|
25
|
+
results.push({ identifier: key.name, block });
|
|
26
|
+
}
|
|
27
|
+
return results;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=yaml-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-parser.js","sourceRoot":"","sources":["../../src/parsers/yaml-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,SAAS;IACjC,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAExC,kBAAkB,CAAC,OAAe,EAAE,QAAiB;QACnD,MAAM,OAAO,GAAiD,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,2CAA2C;QAC3C,MAAM,OAAO,GAA+C,EAAE,CAAC;QAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YACxB,IAAI,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAEhD,qDAAqD;YACrD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YAClF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { originEntrySchema, updateEntrySchema, reviewEntrySchema } from './schemas.js';
|
|
2
|
+
export type { OriginEntry, UpdateEntry, ReviewEntry } from './schemas.js';
|
|
3
|
+
export { isStale, getUnreviewedUpdates } from './staleness.js';
|
|
4
|
+
export { computeReviewHash, validateReviewHash } from './review-hash.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provenance/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provenance/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEvF,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute a review hash from pending update IDs (DEC-4.5).
|
|
3
|
+
* The hash encodes which updates were shown during review.
|
|
4
|
+
* Used for --approve token validation.
|
|
5
|
+
*/
|
|
6
|
+
export declare function computeReviewHash(updateIds: string[]): string;
|
|
7
|
+
/**
|
|
8
|
+
* Validate a review hash against pending update IDs.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateReviewHash(hash: string, updateIds: string[]): boolean;
|
|
11
|
+
//# sourceMappingURL=review-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-hash.d.ts","sourceRoot":"","sources":["../../src/provenance/review-hash.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAI7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAE7E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Compute a review hash from pending update IDs (DEC-4.5).
|
|
4
|
+
* The hash encodes which updates were shown during review.
|
|
5
|
+
* Used for --approve token validation.
|
|
6
|
+
*/
|
|
7
|
+
export function computeReviewHash(updateIds) {
|
|
8
|
+
const sorted = [...updateIds].sort();
|
|
9
|
+
const data = sorted.join(':');
|
|
10
|
+
return createHash('sha256').update(data).digest('hex').substring(0, 16);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Validate a review hash against pending update IDs.
|
|
14
|
+
*/
|
|
15
|
+
export function validateReviewHash(hash, updateIds) {
|
|
16
|
+
return computeReviewHash(updateIds) === hash;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=review-hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-hash.js","sourceRoot":"","sources":["../../src/provenance/review-hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAmB;IACnD,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAmB;IAClE,OAAO,iBAAiB,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Origin entry schema (DEC-4.7: creation record) */
|
|
3
|
+
export declare const originEntrySchema: z.ZodObject<{
|
|
4
|
+
id: z.ZodDefault<z.ZodString>;
|
|
5
|
+
date: z.ZodString;
|
|
6
|
+
by: z.ZodOptional<z.ZodObject<{
|
|
7
|
+
name: z.ZodString;
|
|
8
|
+
email: z.ZodString;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
/** Update entry schema (DEC-4.7: change record) */
|
|
12
|
+
export declare const updateEntrySchema: z.ZodObject<{
|
|
13
|
+
id: z.ZodDefault<z.ZodString>;
|
|
14
|
+
date: z.ZodString;
|
|
15
|
+
by: z.ZodOptional<z.ZodObject<{
|
|
16
|
+
name: z.ZodString;
|
|
17
|
+
email: z.ZodString;
|
|
18
|
+
}, z.core.$strip>>;
|
|
19
|
+
rationale: z.ZodString;
|
|
20
|
+
skip_review: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
/** Review entry schema (DEC-4.7: review record) */
|
|
23
|
+
export declare const reviewEntrySchema: z.ZodObject<{
|
|
24
|
+
id: z.ZodDefault<z.ZodString>;
|
|
25
|
+
date: z.ZodString;
|
|
26
|
+
by: z.ZodOptional<z.ZodObject<{
|
|
27
|
+
name: z.ZodString;
|
|
28
|
+
email: z.ZodString;
|
|
29
|
+
}, z.core.$strip>>;
|
|
30
|
+
updates_reviewed: z.ZodArray<z.ZodString>;
|
|
31
|
+
note: z.ZodOptional<z.ZodString>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export type OriginEntry = z.infer<typeof originEntrySchema>;
|
|
34
|
+
export type UpdateEntry = z.infer<typeof updateEntrySchema>;
|
|
35
|
+
export type ReviewEntry = z.infer<typeof reviewEntrySchema>;
|
|
36
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/provenance/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,qDAAqD;AACrD,eAAO,MAAM,iBAAiB;;;;;;;iBAI5B,CAAC;AAEH,mDAAmD;AACnD,eAAO,MAAM,iBAAiB;;;;;;;;;iBAM5B,CAAC;AAEH,mDAAmD;AACnD,eAAO,MAAM,iBAAiB;;;;;;;;;iBAM5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { userIdentitySchema } from '../config/schema.js';
|
|
4
|
+
/** Origin entry schema (DEC-4.7: creation record) */
|
|
5
|
+
export const originEntrySchema = z.object({
|
|
6
|
+
id: z.string().default(() => randomUUID()),
|
|
7
|
+
date: z.string(), // ISO 8601 datetime
|
|
8
|
+
by: userIdentitySchema.optional(),
|
|
9
|
+
});
|
|
10
|
+
/** Update entry schema (DEC-4.7: change record) */
|
|
11
|
+
export const updateEntrySchema = z.object({
|
|
12
|
+
id: z.string().default(() => randomUUID()),
|
|
13
|
+
date: z.string(),
|
|
14
|
+
by: userIdentitySchema.optional(),
|
|
15
|
+
rationale: z.string(),
|
|
16
|
+
skip_review: z.boolean().optional().default(false),
|
|
17
|
+
});
|
|
18
|
+
/** Review entry schema (DEC-4.7: review record) */
|
|
19
|
+
export const reviewEntrySchema = z.object({
|
|
20
|
+
id: z.string().default(() => randomUUID()),
|
|
21
|
+
date: z.string(),
|
|
22
|
+
by: userIdentitySchema.optional(),
|
|
23
|
+
updates_reviewed: z.array(z.string()), // UUIDs of update entries
|
|
24
|
+
note: z.string().optional(),
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/provenance/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,qDAAqD;AACrD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB;IACtC,EAAE,EAAE,kBAAkB,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,mDAAmD;AACnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,EAAE,EAAE,kBAAkB,CAAC,QAAQ,EAAE;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACnD,CAAC,CAAC;AAEH,mDAAmD;AACnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,EAAE,EAAE,kBAAkB,CAAC,QAAQ,EAAE;IACjC,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,0BAA0B;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Element } from '../model/element.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check if an element is stale (DEC-4.7).
|
|
4
|
+
* An element is stale if it has any non-skip-review update whose ID
|
|
5
|
+
* does not appear in any review's updates_reviewed list.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isStale(element: Element): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Get the list of unreviewed update IDs for an element.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getUnreviewedUpdates(element: Element): string[];
|
|
12
|
+
//# sourceMappingURL=staleness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staleness.d.ts","sourceRoot":"","sources":["../../src/provenance/staleness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAuBjD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAgB/D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if an element is stale (DEC-4.7).
|
|
3
|
+
* An element is stale if it has any non-skip-review update whose ID
|
|
4
|
+
* does not appear in any review's updates_reviewed list.
|
|
5
|
+
*/
|
|
6
|
+
export function isStale(element) {
|
|
7
|
+
const updatedBy = (element.get('updated_by') ?? []);
|
|
8
|
+
const reviewedBy = (element.get('reviewed_by') ?? []);
|
|
9
|
+
// Get all reviewed update IDs across all reviews
|
|
10
|
+
const reviewedUpdateIds = new Set();
|
|
11
|
+
for (const review of reviewedBy) {
|
|
12
|
+
if (review.updates_reviewed) {
|
|
13
|
+
for (const id of review.updates_reviewed) {
|
|
14
|
+
reviewedUpdateIds.add(id);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// Check if any non-skip-review update is unreviewed
|
|
19
|
+
for (const update of updatedBy) {
|
|
20
|
+
if (update.skip_review)
|
|
21
|
+
continue;
|
|
22
|
+
if (!reviewedUpdateIds.has(update.id)) {
|
|
23
|
+
return true; // This update hasn't been reviewed
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get the list of unreviewed update IDs for an element.
|
|
30
|
+
*/
|
|
31
|
+
export function getUnreviewedUpdates(element) {
|
|
32
|
+
const updatedBy = (element.get('updated_by') ?? []);
|
|
33
|
+
const reviewedBy = (element.get('reviewed_by') ?? []);
|
|
34
|
+
const reviewedUpdateIds = new Set();
|
|
35
|
+
for (const review of reviewedBy) {
|
|
36
|
+
if (review.updates_reviewed) {
|
|
37
|
+
for (const id of review.updates_reviewed) {
|
|
38
|
+
reviewedUpdateIds.add(id);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return updatedBy
|
|
43
|
+
.filter(u => !u.skip_review && !reviewedUpdateIds.has(u.id))
|
|
44
|
+
.map(u => u.id);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=staleness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staleness.js","sourceRoot":"","sources":["../../src/provenance/staleness.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,OAAgB;IACtC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAkB,CAAC;IACrE,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAkB,CAAC;IAEvE,iDAAiD;IACjD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC5B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACzC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,WAAW;YAAE,SAAS;QACjC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,CAAC,mCAAmC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAkB,CAAC;IACrE,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAkB,CAAC;IAEvE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC5B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACzC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS;SACb,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Element } from '../model/element.js';
|
|
2
|
+
import type { Catalog } from '../catalog/catalog.js';
|
|
3
|
+
export interface RefChange {
|
|
4
|
+
element: Element;
|
|
5
|
+
ref: {
|
|
6
|
+
file: string;
|
|
7
|
+
identifier: string;
|
|
8
|
+
role: string;
|
|
9
|
+
};
|
|
10
|
+
changeType: 'modified' | 'removed' | 'added';
|
|
11
|
+
/** Lines of the identifier block at commit A (null if added) */
|
|
12
|
+
blockBefore: string | null;
|
|
13
|
+
/** Lines of the identifier block at commit B (null if removed) */
|
|
14
|
+
blockAfter: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface DiffTraceResult {
|
|
17
|
+
commitA: string;
|
|
18
|
+
commitB: string;
|
|
19
|
+
changedFiles: string[];
|
|
20
|
+
refChanges: RefChange[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Trace changes between two commits back to GVP decisions via refs.
|
|
24
|
+
*
|
|
25
|
+
* 1. Get changed files between commitA and commitB
|
|
26
|
+
* 2. Find all elements with refs pointing to changed files
|
|
27
|
+
* 3. For each matching ref, extract the identifier block at both commits
|
|
28
|
+
* 4. Compare — report if the identifier changed, was added, or was removed
|
|
29
|
+
*/
|
|
30
|
+
export declare function traceGitDiff(catalog: Catalog, commitA: string, commitB: string, cwd: string): DiffTraceResult;
|
|
31
|
+
/**
|
|
32
|
+
* Format a DiffTraceResult for display.
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatDiffTrace(result: DiffTraceResult, catalog: Catalog): string;
|
|
35
|
+
//# sourceMappingURL=git-diff-tracer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff-tracer.d.ts","sourceRoot":"","sources":["../../src/refs/git-diff-tracer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;IAC7C,gEAAgE;IAChE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kEAAkE;IAClE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AA+BD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,eAAe,CA0DjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAmCjF"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { createRefParserRegistry, findParser } from '../parsers/registry.js';
|
|
4
|
+
/**
|
|
5
|
+
* Get the list of files changed between two commits.
|
|
6
|
+
*/
|
|
7
|
+
function getChangedFiles(commitA, commitB, cwd) {
|
|
8
|
+
try {
|
|
9
|
+
const output = execSync(`git diff --name-only ${commitA} ${commitB}`, { cwd, encoding: 'utf-8' });
|
|
10
|
+
return output.trim().split('\n').filter(f => f.length > 0);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get file content at a specific commit.
|
|
18
|
+
*/
|
|
19
|
+
function getFileAtCommit(filePath, commit, cwd) {
|
|
20
|
+
try {
|
|
21
|
+
return execSync(`git show ${commit}:${filePath}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null; // File doesn't exist at this commit
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Trace changes between two commits back to GVP decisions via refs.
|
|
29
|
+
*
|
|
30
|
+
* 1. Get changed files between commitA and commitB
|
|
31
|
+
* 2. Find all elements with refs pointing to changed files
|
|
32
|
+
* 3. For each matching ref, extract the identifier block at both commits
|
|
33
|
+
* 4. Compare — report if the identifier changed, was added, or was removed
|
|
34
|
+
*/
|
|
35
|
+
export function traceGitDiff(catalog, commitA, commitB, cwd) {
|
|
36
|
+
const parsers = createRefParserRegistry();
|
|
37
|
+
const changedFiles = getChangedFiles(commitA, commitB, cwd);
|
|
38
|
+
// Build a set of changed file paths for quick lookup
|
|
39
|
+
const changedSet = new Set(changedFiles);
|
|
40
|
+
// Find all elements with refs pointing to changed files
|
|
41
|
+
const refChanges = [];
|
|
42
|
+
for (const element of catalog.getAllElements()) {
|
|
43
|
+
const refs = element.get('refs');
|
|
44
|
+
if (!refs || !Array.isArray(refs))
|
|
45
|
+
continue;
|
|
46
|
+
for (const ref of refs) {
|
|
47
|
+
if (!changedSet.has(ref.file))
|
|
48
|
+
continue;
|
|
49
|
+
// This ref points to a changed file — check the identifier
|
|
50
|
+
const ext = path.extname(ref.file);
|
|
51
|
+
const parser = findParser(ext, parsers);
|
|
52
|
+
const contentBefore = getFileAtCommit(ref.file, commitA, cwd);
|
|
53
|
+
const contentAfter = getFileAtCommit(ref.file, commitB, cwd);
|
|
54
|
+
let blockBefore = null;
|
|
55
|
+
let blockAfter = null;
|
|
56
|
+
if (parser) {
|
|
57
|
+
if (contentBefore)
|
|
58
|
+
blockBefore = parser.extractBlock(contentBefore, ref.identifier);
|
|
59
|
+
if (contentAfter)
|
|
60
|
+
blockAfter = parser.extractBlock(contentAfter, ref.identifier);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// No parser — use file-level comparison (DEC-10.15)
|
|
64
|
+
blockBefore = contentBefore;
|
|
65
|
+
blockAfter = contentAfter;
|
|
66
|
+
}
|
|
67
|
+
let changeType;
|
|
68
|
+
if (!blockBefore && blockAfter) {
|
|
69
|
+
changeType = 'added';
|
|
70
|
+
}
|
|
71
|
+
else if (blockBefore && !blockAfter) {
|
|
72
|
+
changeType = 'removed';
|
|
73
|
+
}
|
|
74
|
+
else if (blockBefore !== blockAfter) {
|
|
75
|
+
changeType = 'modified';
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
continue; // No change to this identifier
|
|
79
|
+
}
|
|
80
|
+
refChanges.push({
|
|
81
|
+
element,
|
|
82
|
+
ref,
|
|
83
|
+
changeType,
|
|
84
|
+
blockBefore,
|
|
85
|
+
blockAfter,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { commitA, commitB, changedFiles, refChanges };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Format a DiffTraceResult for display.
|
|
93
|
+
*/
|
|
94
|
+
export function formatDiffTrace(result, catalog) {
|
|
95
|
+
const lines = [];
|
|
96
|
+
lines.push(`Git diff: ${result.commitA.substring(0, 7)}..${result.commitB.substring(0, 7)}`);
|
|
97
|
+
lines.push(`Changed files: ${result.changedFiles.length}`);
|
|
98
|
+
lines.push('');
|
|
99
|
+
if (result.refChanges.length === 0) {
|
|
100
|
+
lines.push('No GVP-traced changes detected.');
|
|
101
|
+
return lines.join('\n');
|
|
102
|
+
}
|
|
103
|
+
lines.push(`Traced changes: ${result.refChanges.length}`);
|
|
104
|
+
lines.push('');
|
|
105
|
+
for (const change of result.refChanges) {
|
|
106
|
+
const icon = change.changeType === 'modified' ? '~' :
|
|
107
|
+
change.changeType === 'added' ? '+' :
|
|
108
|
+
'-';
|
|
109
|
+
lines.push(`[${icon}] ${change.ref.file}::${change.ref.identifier}`);
|
|
110
|
+
lines.push(` Role: ${change.ref.role}`);
|
|
111
|
+
lines.push(` Element: ${change.element.toString()} (${change.element.categoryName})`);
|
|
112
|
+
// Trace the element upward through maps_to
|
|
113
|
+
const ancestors = traceAncestors(change.element, catalog);
|
|
114
|
+
if (ancestors.length > 0) {
|
|
115
|
+
lines.push(` Traces to:`);
|
|
116
|
+
for (const ancestor of ancestors) {
|
|
117
|
+
lines.push(` → ${ancestor.toString()} (${ancestor.categoryName})`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
lines.push('');
|
|
121
|
+
}
|
|
122
|
+
return lines.join('\n');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Simple ancestor tracing — follow maps_to to find goals/values.
|
|
126
|
+
*/
|
|
127
|
+
function traceAncestors(element, catalog) {
|
|
128
|
+
const visited = new Set();
|
|
129
|
+
const ancestors = [];
|
|
130
|
+
function walk(el) {
|
|
131
|
+
for (const ref of el.maps_to) {
|
|
132
|
+
const target = catalog.getAllElements().find(e => e.toLibraryId() === ref || e.hashKey() === ref);
|
|
133
|
+
if (target && !visited.has(target.hashKey())) {
|
|
134
|
+
visited.add(target.hashKey());
|
|
135
|
+
ancestors.push(target);
|
|
136
|
+
walk(target);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
walk(element);
|
|
141
|
+
return ancestors;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=git-diff-tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff-tracer.js","sourceRoot":"","sources":["../../src/refs/git-diff-tracer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { FieldSchemaEntry } from './field-schema.js';
|
|
3
|
+
interface BuildOptions {
|
|
4
|
+
defaultTimezone?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Build a Zod object schema from a field_schemas definition (DEC-3.1).
|
|
8
|
+
* This is the TypeScript equivalent of Pydantic's create_model().
|
|
9
|
+
*
|
|
10
|
+
* Each field in fieldSchemas becomes a property on the resulting Zod object schema.
|
|
11
|
+
* Fields are optional unless `required: true`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildZodSchema(fieldSchemas: Record<string, FieldSchemaEntry>, options?: BuildOptions): z.ZodObject<Record<string, z.ZodType>>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=build-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-schema.d.ts","sourceRoot":"","sources":["../../src/schema/build-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,UAAU,YAAY;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA8ED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC9C,OAAO,GAAE,YAAiB,GACzB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAYxC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createDatetimeSchema } from './datetime.js';
|
|
3
|
+
import { SchemaError } from '../errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Convert a single FieldSchemaEntry into a Zod schema.
|
|
6
|
+
* Handles all 8 types recursively (DEC-3.1, DEC-3.4, DEC-3.10, DEC-3.12, DEC-10.11).
|
|
7
|
+
*/
|
|
8
|
+
function fieldEntryToZod(entry, options) {
|
|
9
|
+
let schema;
|
|
10
|
+
switch (entry.type) {
|
|
11
|
+
case 'string':
|
|
12
|
+
schema = z.string();
|
|
13
|
+
break;
|
|
14
|
+
case 'number':
|
|
15
|
+
schema = z.number();
|
|
16
|
+
break;
|
|
17
|
+
case 'boolean':
|
|
18
|
+
schema = z.boolean();
|
|
19
|
+
break;
|
|
20
|
+
case 'datetime':
|
|
21
|
+
schema = createDatetimeSchema(options.defaultTimezone);
|
|
22
|
+
break;
|
|
23
|
+
case 'enum': {
|
|
24
|
+
const values = entry.values;
|
|
25
|
+
if (!Array.isArray(values) || values.length === 0) {
|
|
26
|
+
throw new SchemaError(`Enum field requires a non-empty 'values' array of strings`);
|
|
27
|
+
}
|
|
28
|
+
schema = z.enum(values);
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
case 'list': {
|
|
32
|
+
const itemSchema = entry.items
|
|
33
|
+
? fieldEntryToZod(entry.items, options)
|
|
34
|
+
: z.unknown();
|
|
35
|
+
schema = z.array(itemSchema);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case 'dict': {
|
|
39
|
+
const valueSchema = entry.values && !Array.isArray(entry.values)
|
|
40
|
+
? fieldEntryToZod(entry.values, options)
|
|
41
|
+
: z.unknown();
|
|
42
|
+
schema = z.record(z.string(), valueSchema);
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'model': {
|
|
46
|
+
if (!entry.fields) {
|
|
47
|
+
throw new SchemaError(`Model field requires a 'fields' definition`);
|
|
48
|
+
}
|
|
49
|
+
const shape = {};
|
|
50
|
+
for (const [key, fieldEntry] of Object.entries(entry.fields)) {
|
|
51
|
+
let fieldSchema = fieldEntryToZod(fieldEntry, options);
|
|
52
|
+
if (!fieldEntry.required) {
|
|
53
|
+
fieldSchema = fieldSchema.optional();
|
|
54
|
+
}
|
|
55
|
+
shape[key] = fieldSchema;
|
|
56
|
+
}
|
|
57
|
+
schema = z.object(shape);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
throw new SchemaError(`Unknown field type: '${entry.type}'`);
|
|
62
|
+
}
|
|
63
|
+
return schema;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build a Zod object schema from a field_schemas definition (DEC-3.1).
|
|
67
|
+
* This is the TypeScript equivalent of Pydantic's create_model().
|
|
68
|
+
*
|
|
69
|
+
* Each field in fieldSchemas becomes a property on the resulting Zod object schema.
|
|
70
|
+
* Fields are optional unless `required: true`.
|
|
71
|
+
*/
|
|
72
|
+
export function buildZodSchema(fieldSchemas, options = {}) {
|
|
73
|
+
const shape = {};
|
|
74
|
+
for (const [key, entry] of Object.entries(fieldSchemas)) {
|
|
75
|
+
let fieldSchema = fieldEntryToZod(entry, options);
|
|
76
|
+
if (!entry.required) {
|
|
77
|
+
fieldSchema = fieldSchema.optional();
|
|
78
|
+
}
|
|
79
|
+
shape[key] = fieldSchema;
|
|
80
|
+
}
|
|
81
|
+
return z.object(shape);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=build-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-schema.js","sourceRoot":"","sources":["../../src/schema/build-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { FieldSchemaEntry } from './field-schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* Category definition from defaults.yaml or user library (DOM-5).
|
|
5
|
+
*/
|
|
6
|
+
export interface CategoryDefinition {
|
|
7
|
+
yaml_key: string;
|
|
8
|
+
id_prefix: string;
|
|
9
|
+
primary_field?: string;
|
|
10
|
+
display_label?: string;
|
|
11
|
+
color?: string;
|
|
12
|
+
is_root?: boolean;
|
|
13
|
+
mapping_rules?: string[][];
|
|
14
|
+
field_schemas?: Record<string, FieldSchemaEntry>;
|
|
15
|
+
export_options?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
/** Zod schema for category definitions */
|
|
18
|
+
export declare const categoryDefinitionSchema: z.ZodType<CategoryDefinition>;
|
|
19
|
+
/**
|
|
20
|
+
* The _all block that applies field_schemas to all categories.
|
|
21
|
+
*/
|
|
22
|
+
export interface AllFieldSchemas {
|
|
23
|
+
field_schemas?: Record<string, FieldSchemaEntry>;
|
|
24
|
+
}
|
|
25
|
+
export declare const allFieldSchemasSchema: z.ZodObject<{
|
|
26
|
+
field_schemas: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<FieldSchemaEntry, unknown, z.core.$ZodTypeInternals<FieldSchemaEntry, unknown>>>>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
/**
|
|
29
|
+
* The full defaults.yaml file structure.
|
|
30
|
+
*/
|
|
31
|
+
export interface DefaultsFile {
|
|
32
|
+
_all?: AllFieldSchemas;
|
|
33
|
+
categories: Record<string, CategoryDefinition>;
|
|
34
|
+
}
|
|
35
|
+
export declare const defaultsFileSchema: z.ZodObject<{
|
|
36
|
+
_all: z.ZodOptional<z.ZodObject<{
|
|
37
|
+
field_schemas: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<FieldSchemaEntry, unknown, z.core.$ZodTypeInternals<FieldSchemaEntry, unknown>>>>;
|
|
38
|
+
}, z.core.$strip>>;
|
|
39
|
+
categories: z.ZodRecord<z.ZodString, z.ZodType<CategoryDefinition, unknown, z.core.$ZodTypeInternals<CategoryDefinition, unknown>>>;
|
|
40
|
+
}, z.core.$strip>;
|
|
41
|
+
//# sourceMappingURL=category-definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-definition.d.ts","sourceRoot":"","sources":["../../src/schema/category-definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,0CAA0C;AAC1C,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAUjE,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAClD;AAED,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,kBAAkB;;;;;iBAG7B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { fieldSchemaEntrySchema } from './field-schema.js';
|
|
3
|
+
/** Zod schema for category definitions */
|
|
4
|
+
export const categoryDefinitionSchema = z.object({
|
|
5
|
+
yaml_key: z.string(),
|
|
6
|
+
id_prefix: z.string(),
|
|
7
|
+
primary_field: z.string().optional(),
|
|
8
|
+
display_label: z.string().optional(),
|
|
9
|
+
color: z.string().optional(),
|
|
10
|
+
is_root: z.boolean().optional(),
|
|
11
|
+
mapping_rules: z.array(z.array(z.string())).optional(),
|
|
12
|
+
field_schemas: z.record(z.string(), fieldSchemaEntrySchema).optional(),
|
|
13
|
+
export_options: z.record(z.string(), z.unknown()).optional(),
|
|
14
|
+
});
|
|
15
|
+
export const allFieldSchemasSchema = z.object({
|
|
16
|
+
field_schemas: z.record(z.string(), fieldSchemaEntrySchema).optional(),
|
|
17
|
+
});
|
|
18
|
+
export const defaultsFileSchema = z.object({
|
|
19
|
+
_all: allFieldSchemasSchema.optional(),
|
|
20
|
+
categories: z.record(z.string(), categoryDefinitionSchema),
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=category-definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-definition.js","sourceRoot":"","sources":["../../src/schema/category-definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAiB3D,0CAA0C;AAC1C,MAAM,CAAC,MAAM,wBAAwB,GAAkC,CAAC,CAAC,MAAM,CAAC;IAC9E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtD,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,QAAQ,EAAE;IACtE,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,QAAQ,EAAE;CACvE,CAAC,CAAC;AAUH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC;CAC3D,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { FieldSchemaEntry } from './field-schema.js';
|
|
3
|
+
interface BuildOptions {
|
|
4
|
+
defaultTimezone?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Build a complete element Zod schema: reserved fields + dynamic fields (DEC-3.7).
|
|
8
|
+
*
|
|
9
|
+
* 1. Checks for reserved field collisions (DEC-3.2) — throws SchemaError
|
|
10
|
+
* 2. Builds dynamic schema from field_schemas
|
|
11
|
+
* 3. Merges reserved + dynamic into one flat Zod object schema
|
|
12
|
+
*
|
|
13
|
+
* The resulting schema validates a complete element in one pass.
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildElementSchema(fieldSchemas: Record<string, FieldSchemaEntry>, options?: BuildOptions): z.ZodObject<Record<string, z.ZodType>>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=combined-schema.d.ts.map
|