@sdd-method/sdd-cli 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/catalogue/aggregate.d.ts +39 -0
- package/dist/lib/catalogue/aggregate.d.ts.map +1 -0
- package/dist/lib/catalogue/aggregate.js +344 -0
- package/dist/lib/catalogue/aggregate.js.map +1 -0
- package/dist/lib/catalogue/aggregation-manifest-loader.d.ts +25 -0
- package/dist/lib/catalogue/aggregation-manifest-loader.d.ts.map +1 -0
- package/dist/lib/catalogue/aggregation-manifest-loader.js +111 -0
- package/dist/lib/catalogue/aggregation-manifest-loader.js.map +1 -0
- package/dist/lib/catalogue/build.d.ts +42 -0
- package/dist/lib/catalogue/build.d.ts.map +1 -0
- package/dist/lib/catalogue/build.js +373 -0
- package/dist/lib/catalogue/build.js.map +1 -0
- package/dist/lib/catalogue/builders/adr-supersedes.d.ts +14 -0
- package/dist/lib/catalogue/builders/adr-supersedes.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/adr-supersedes.js +62 -0
- package/dist/lib/catalogue/builders/adr-supersedes.js.map +1 -0
- package/dist/lib/catalogue/builders/adrs.d.ts +27 -0
- package/dist/lib/catalogue/builders/adrs.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/adrs.js +191 -0
- package/dist/lib/catalogue/builders/adrs.js.map +1 -0
- package/dist/lib/catalogue/builders/c4-containers.d.ts +16 -0
- package/dist/lib/catalogue/builders/c4-containers.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/c4-containers.js +169 -0
- package/dist/lib/catalogue/builders/c4-containers.js.map +1 -0
- package/dist/lib/catalogue/builders/c4-systems.d.ts +10 -0
- package/dist/lib/catalogue/builders/c4-systems.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/c4-systems.js +99 -0
- package/dist/lib/catalogue/builders/c4-systems.js.map +1 -0
- package/dist/lib/catalogue/builders/capabilities.d.ts +11 -0
- package/dist/lib/catalogue/builders/capabilities.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/capabilities.js +173 -0
- package/dist/lib/catalogue/builders/capabilities.js.map +1 -0
- package/dist/lib/catalogue/builders/capability-edges.d.ts +27 -0
- package/dist/lib/catalogue/builders/capability-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/capability-edges.js +166 -0
- package/dist/lib/catalogue/builders/capability-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/contracts.d.ts +15 -0
- package/dist/lib/catalogue/builders/contracts.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/contracts.js +153 -0
- package/dist/lib/catalogue/builders/contracts.js.map +1 -0
- package/dist/lib/catalogue/builders/domains.d.ts +10 -0
- package/dist/lib/catalogue/builders/domains.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/domains.js +93 -0
- package/dist/lib/catalogue/builders/domains.js.map +1 -0
- package/dist/lib/catalogue/builders/event-edges.d.ts +20 -0
- package/dist/lib/catalogue/builders/event-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/event-edges.js +112 -0
- package/dist/lib/catalogue/builders/event-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/events.d.ts +26 -0
- package/dist/lib/catalogue/builders/events.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/events.js +99 -0
- package/dist/lib/catalogue/builders/events.js.map +1 -0
- package/dist/lib/catalogue/builders/feature-groups.d.ts +10 -0
- package/dist/lib/catalogue/builders/feature-groups.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/feature-groups.js +118 -0
- package/dist/lib/catalogue/builders/feature-groups.js.map +1 -0
- package/dist/lib/catalogue/builders/features.d.ts +35 -0
- package/dist/lib/catalogue/builders/features.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/features.js +206 -0
- package/dist/lib/catalogue/builders/features.js.map +1 -0
- package/dist/lib/catalogue/builders/glossary-xref.d.ts +11 -0
- package/dist/lib/catalogue/builders/glossary-xref.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/glossary-xref.js +107 -0
- package/dist/lib/catalogue/builders/glossary-xref.js.map +1 -0
- package/dist/lib/catalogue/builders/glossary.d.ts +14 -0
- package/dist/lib/catalogue/builders/glossary.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/glossary.js +150 -0
- package/dist/lib/catalogue/builders/glossary.js.map +1 -0
- package/dist/lib/catalogue/builders/index.d.ts +57 -0
- package/dist/lib/catalogue/builders/index.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/index.js +33 -0
- package/dist/lib/catalogue/builders/index.js.map +1 -0
- package/dist/lib/catalogue/builders/integrations.d.ts +12 -0
- package/dist/lib/catalogue/builders/integrations.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/integrations.js +85 -0
- package/dist/lib/catalogue/builders/integrations.js.map +1 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.d.ts +26 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.js +133 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/personas.d.ts +22 -0
- package/dist/lib/catalogue/builders/personas.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/personas.js +150 -0
- package/dist/lib/catalogue/builders/personas.js.map +1 -0
- package/dist/lib/catalogue/builders/product-edges.d.ts +15 -0
- package/dist/lib/catalogue/builders/product-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/product-edges.js +97 -0
- package/dist/lib/catalogue/builders/product-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/products.d.ts +26 -0
- package/dist/lib/catalogue/builders/products.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/products.js +57 -0
- package/dist/lib/catalogue/builders/products.js.map +1 -0
- package/dist/lib/catalogue/builders/repo-edges.d.ts +18 -0
- package/dist/lib/catalogue/builders/repo-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/repo-edges.js +113 -0
- package/dist/lib/catalogue/builders/repo-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/repositories.d.ts +78 -0
- package/dist/lib/catalogue/builders/repositories.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/repositories.js +204 -0
- package/dist/lib/catalogue/builders/repositories.js.map +1 -0
- package/dist/lib/catalogue/builders/service-contract.d.ts +11 -0
- package/dist/lib/catalogue/builders/service-contract.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/service-contract.js +53 -0
- package/dist/lib/catalogue/builders/service-contract.js.map +1 -0
- package/dist/lib/catalogue/builders/services.d.ts +15 -0
- package/dist/lib/catalogue/builders/services.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/services.js +40 -0
- package/dist/lib/catalogue/builders/services.js.map +1 -0
- package/dist/lib/catalogue/builders/user-journeys.d.ts +24 -0
- package/dist/lib/catalogue/builders/user-journeys.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/user-journeys.js +253 -0
- package/dist/lib/catalogue/builders/user-journeys.js.map +1 -0
- package/dist/lib/catalogue/canonical-schema.yaml +624 -0
- package/dist/lib/catalogue/cli-version.d.ts +10 -0
- package/dist/lib/catalogue/cli-version.d.ts.map +1 -0
- package/dist/lib/catalogue/cli-version.js +10 -0
- package/dist/lib/catalogue/cli-version.js.map +1 -0
- package/dist/lib/catalogue/csv-reader.d.ts +7 -0
- package/dist/lib/catalogue/csv-reader.d.ts.map +1 -0
- package/dist/lib/catalogue/csv-reader.js +97 -0
- package/dist/lib/catalogue/csv-reader.js.map +1 -0
- package/dist/lib/catalogue/csv-writer.d.ts +29 -0
- package/dist/lib/catalogue/csv-writer.d.ts.map +1 -0
- package/dist/lib/catalogue/csv-writer.js +55 -0
- package/dist/lib/catalogue/csv-writer.js.map +1 -0
- package/dist/lib/catalogue/findings.d.ts +27 -0
- package/dist/lib/catalogue/findings.d.ts.map +1 -0
- package/dist/lib/catalogue/findings.js +34 -0
- package/dist/lib/catalogue/findings.js.map +1 -0
- package/dist/lib/catalogue/fk-validator.d.ts +44 -0
- package/dist/lib/catalogue/fk-validator.d.ts.map +1 -0
- package/dist/lib/catalogue/fk-validator.js +90 -0
- package/dist/lib/catalogue/fk-validator.js.map +1 -0
- package/dist/lib/catalogue/index.d.ts +27 -0
- package/dist/lib/catalogue/index.d.ts.map +1 -0
- package/dist/lib/catalogue/index.js +18 -0
- package/dist/lib/catalogue/index.js.map +1 -0
- package/dist/lib/catalogue/manifest-loader.d.ts +47 -0
- package/dist/lib/catalogue/manifest-loader.d.ts.map +1 -0
- package/dist/lib/catalogue/manifest-loader.js +161 -0
- package/dist/lib/catalogue/manifest-loader.js.map +1 -0
- package/dist/lib/catalogue/schema-compat.d.ts +47 -0
- package/dist/lib/catalogue/schema-compat.d.ts.map +1 -0
- package/dist/lib/catalogue/schema-compat.js +52 -0
- package/dist/lib/catalogue/schema-compat.js.map +1 -0
- package/dist/lib/catalogue/schema-loader.d.ts +58 -0
- package/dist/lib/catalogue/schema-loader.d.ts.map +1 -0
- package/dist/lib/catalogue/schema-loader.js +86 -0
- package/dist/lib/catalogue/schema-loader.js.map +1 -0
- package/dist/lib/catalogue/traceability-loader.d.ts +56 -0
- package/dist/lib/catalogue/traceability-loader.d.ts.map +1 -0
- package/dist/lib/catalogue/traceability-loader.js +217 -0
- package/dist/lib/catalogue/traceability-loader.js.map +1 -0
- package/dist/lib/catalogue/validate.d.ts +16 -0
- package/dist/lib/catalogue/validate.d.ts.map +1 -0
- package/dist/lib/catalogue/validate.js +137 -0
- package/dist/lib/catalogue/validate.js.map +1 -0
- package/dist/lib/catalogue/version.d.ts +3 -0
- package/dist/lib/catalogue/version.d.ts.map +1 -0
- package/dist/lib/catalogue/version.js +18 -0
- package/dist/lib/catalogue/version.js.map +1 -0
- package/dist/lib/init/index.d.ts.map +1 -1
- package/dist/lib/init/index.js +6 -1
- package/dist/lib/init/index.js.map +1 -1
- package/dist/lib/init/integration.d.ts +1 -1
- package/dist/lib/init/integration.d.ts.map +1 -1
- package/dist/lib/init/integration.js +5 -0
- package/dist/lib/init/integration.js.map +1 -1
- package/dist/lib/list/discover.js +8 -1
- package/dist/lib/list/discover.js.map +1 -1
- package/dist/lib/lock-file.d.ts +38 -3
- package/dist/lib/lock-file.d.ts.map +1 -1
- package/dist/lib/lock-file.js +213 -29
- package/dist/lib/lock-file.js.map +1 -1
- package/dist/lib/mcp/build-info.d.ts +1 -1
- package/dist/lib/mcp/build-info.js +1 -1
- package/dist/lib/repo-kind.d.ts +17 -2
- package/dist/lib/repo-kind.d.ts.map +1 -1
- package/dist/lib/repo-kind.js +46 -2
- package/dist/lib/repo-kind.js.map +1 -1
- package/dist/lib/sync/index.d.ts.map +1 -1
- package/dist/lib/sync/index.js +65 -20
- package/dist/lib/sync/index.js.map +1 -1
- package/dist/verbs/catalogue.d.ts +3 -0
- package/dist/verbs/catalogue.d.ts.map +1 -0
- package/dist/verbs/catalogue.js +60 -0
- package/dist/verbs/catalogue.js.map +1 -0
- package/package.json +3 -3
- package/scripts/copy-yaml-assets.mjs +38 -0
- package/scripts/sync-canonical-schema.sh +39 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loader for the per-SDD `.sdd/sdd-manifest.yaml` per the schema at
|
|
3
|
+
* docs/method/methods/sdd-manifest-schema.yaml in sdd-method.
|
|
4
|
+
*
|
|
5
|
+
* Validates schema_version against SCHEMA_COMPAT and the
|
|
6
|
+
* profile↔category invariant from product-category-taxonomy.md.
|
|
7
|
+
*/
|
|
8
|
+
import { readFile } from "node:fs/promises";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { parse as parseYaml } from "yaml";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { SCHEMA_COMPAT, formatSchemaVersionMismatch } from "./schema-compat.js";
|
|
13
|
+
export const MANIFEST_REL_PATH = ".sdd/sdd-manifest.yaml";
|
|
14
|
+
export const PROFILES = [
|
|
15
|
+
"platform-profile",
|
|
16
|
+
"application-product",
|
|
17
|
+
"integration-product",
|
|
18
|
+
"support-repo",
|
|
19
|
+
];
|
|
20
|
+
export const CATEGORIES = [
|
|
21
|
+
"platform-root",
|
|
22
|
+
"platform-subsystem",
|
|
23
|
+
"application-product",
|
|
24
|
+
"integration-provider",
|
|
25
|
+
"integration-umbrella",
|
|
26
|
+
"support-repo",
|
|
27
|
+
];
|
|
28
|
+
const PROFILE_CATEGORY_INVARIANT = {
|
|
29
|
+
"platform-profile": ["platform-root", "platform-subsystem"],
|
|
30
|
+
"application-product": ["application-product"],
|
|
31
|
+
"integration-product": ["integration-provider", "integration-umbrella"],
|
|
32
|
+
"support-repo": ["support-repo"],
|
|
33
|
+
};
|
|
34
|
+
const ManifestSchema = z.object({
|
|
35
|
+
schema_version: z.string(),
|
|
36
|
+
sdd_id: z.string().regex(/^[a-z][a-z0-9-]*$/, {
|
|
37
|
+
message: "sdd_id must match /^[a-z][a-z0-9-]*$/",
|
|
38
|
+
}),
|
|
39
|
+
profile: z.enum(PROFILES),
|
|
40
|
+
category: z.enum(CATEGORIES),
|
|
41
|
+
domain_id: z
|
|
42
|
+
.string()
|
|
43
|
+
.regex(/^[a-z][a-z0-9-]*$/)
|
|
44
|
+
.optional(),
|
|
45
|
+
ecosystem_root: z.string().optional(),
|
|
46
|
+
aggregation_manifest_path: z.string().optional(),
|
|
47
|
+
description: z.string().optional(),
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* Read and validate the `.sdd/sdd-manifest.yaml` at the given SDD repo root.
|
|
51
|
+
*
|
|
52
|
+
* Throws on:
|
|
53
|
+
* - file missing
|
|
54
|
+
* - YAML parse error
|
|
55
|
+
* - shape violation (missing fields, bad enum value, bad slug pattern)
|
|
56
|
+
* - profile↔category invariant violation
|
|
57
|
+
* - schema_version outside SCHEMA_COMPAT.sdd_manifest range
|
|
58
|
+
*/
|
|
59
|
+
export async function loadSddManifest(sddPath, options) {
|
|
60
|
+
const sourcePath = join(sddPath, MANIFEST_REL_PATH);
|
|
61
|
+
let text;
|
|
62
|
+
try {
|
|
63
|
+
text = await readFile(sourcePath, "utf-8");
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const code = err.code;
|
|
67
|
+
if (code === "ENOENT") {
|
|
68
|
+
throw new Error(`SDD manifest not found at ${sourcePath}\n\n` +
|
|
69
|
+
`Every SDD repo MUST declare an .sdd/sdd-manifest.yaml per ADR 0134 §4.6.\n` +
|
|
70
|
+
`Schema: docs/method/methods/sdd-manifest-schema.yaml in sdd-method.\n` +
|
|
71
|
+
`Bootstrap: \`sdd-cli init\` (when migrated to support manifest authoring).`);
|
|
72
|
+
}
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
let raw;
|
|
76
|
+
try {
|
|
77
|
+
raw = parseYaml(text);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
throw new Error(`failed to parse YAML at ${sourcePath}: ${err.message}`);
|
|
81
|
+
}
|
|
82
|
+
const parsed = ManifestSchema.safeParse(raw);
|
|
83
|
+
if (!parsed.success) {
|
|
84
|
+
const issues = parsed.error.issues
|
|
85
|
+
.map((i) => ` - ${i.path.join(".") || "<root>"}: ${i.message}`)
|
|
86
|
+
.join("\n");
|
|
87
|
+
throw new Error(`invalid SDD manifest at ${sourcePath}:\n${issues}`);
|
|
88
|
+
}
|
|
89
|
+
// Compat range check.
|
|
90
|
+
if (!isInRange(parsed.data.schema_version, SCHEMA_COMPAT.sdd_manifest)) {
|
|
91
|
+
throw new Error(formatSchemaVersionMismatch({
|
|
92
|
+
schema: "sdd_manifest",
|
|
93
|
+
readVersion: parsed.data.schema_version,
|
|
94
|
+
cliVersion: options.cliVersion,
|
|
95
|
+
sourcePath,
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
// Profile ↔ category invariant.
|
|
99
|
+
const permitted = PROFILE_CATEGORY_INVARIANT[parsed.data.profile];
|
|
100
|
+
if (!permitted.includes(parsed.data.category)) {
|
|
101
|
+
throw new Error(`invalid profile/category combination at ${sourcePath}:\n` +
|
|
102
|
+
` profile=${parsed.data.profile}, category=${parsed.data.category}\n` +
|
|
103
|
+
` permitted categories under profile=${parsed.data.profile}: ${permitted.join(", ")}\n` +
|
|
104
|
+
` per docs/method/methods/product-category-taxonomy.md`);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
schemaVersion: parsed.data.schema_version,
|
|
108
|
+
sddId: parsed.data.sdd_id,
|
|
109
|
+
profile: parsed.data.profile,
|
|
110
|
+
category: parsed.data.category,
|
|
111
|
+
...(parsed.data.domain_id !== undefined ? { domainId: parsed.data.domain_id } : {}),
|
|
112
|
+
...(parsed.data.ecosystem_root !== undefined
|
|
113
|
+
? { ecosystemRoot: parsed.data.ecosystem_root }
|
|
114
|
+
: {}),
|
|
115
|
+
...(parsed.data.aggregation_manifest_path !== undefined
|
|
116
|
+
? { aggregationManifestPath: parsed.data.aggregation_manifest_path }
|
|
117
|
+
: {}),
|
|
118
|
+
...(parsed.data.description !== undefined ? { description: parsed.data.description } : {}),
|
|
119
|
+
sourcePath,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Caret-prefixed semver range check. Accepts X in `^1.2.3` if X.major === 1
|
|
124
|
+
* and X >= 1.2.3.
|
|
125
|
+
*
|
|
126
|
+
* Restricted to the `^X.Y.Z` shape — that's the only form SCHEMA_COMPAT uses.
|
|
127
|
+
*/
|
|
128
|
+
export function isInRange(version, range) {
|
|
129
|
+
if (!range.startsWith("^")) {
|
|
130
|
+
throw new Error(`unsupported range syntax: ${range}`);
|
|
131
|
+
}
|
|
132
|
+
const v = parseSemver(version);
|
|
133
|
+
const r = parseSemver(range.slice(1));
|
|
134
|
+
if (v === null || r === null)
|
|
135
|
+
return false;
|
|
136
|
+
if (v.major !== r.major)
|
|
137
|
+
return false;
|
|
138
|
+
if (v.major === 0) {
|
|
139
|
+
// Per semver, 0.x is unstable; ^0.x.y matches only 0.x.y itself.
|
|
140
|
+
return v.minor === r.minor && v.patch >= r.patch;
|
|
141
|
+
}
|
|
142
|
+
if (v.minor < r.minor)
|
|
143
|
+
return false;
|
|
144
|
+
if (v.minor === r.minor && v.patch < r.patch)
|
|
145
|
+
return false;
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
function parseSemver(s) {
|
|
149
|
+
const m = /^(\d+)\.(\d+)\.(\d+)/.exec(s);
|
|
150
|
+
if (!m)
|
|
151
|
+
return null;
|
|
152
|
+
const [, maj, min, pat] = m;
|
|
153
|
+
if (maj === undefined || min === undefined || pat === undefined)
|
|
154
|
+
return null;
|
|
155
|
+
return {
|
|
156
|
+
major: parseInt(maj, 10),
|
|
157
|
+
minor: parseInt(min, 10),
|
|
158
|
+
patch: parseInt(pat, 10),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=manifest-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-loader.js","sourceRoot":"","sources":["../../../src/lib/catalogue/manifest-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-schema compatibility ranges declared by this sdd-cli build.
|
|
3
|
+
*
|
|
4
|
+
* Per resolution of adopt-canonical-catalogue-builder.md §7.5, the three
|
|
5
|
+
* sdd-method-distributed schemas version independently. The CLI declares
|
|
6
|
+
* the version range it accepts for each and fails fast at read time on
|
|
7
|
+
* out-of-range manifests.
|
|
8
|
+
*
|
|
9
|
+
* Range semantics: caret-prefixed semver (`^X.Y.Z`) — accept any version
|
|
10
|
+
* in the same major. Bump these in lockstep with sdd-method releases that
|
|
11
|
+
* change a schema's major version. Minor/patch bumps in sdd-method should
|
|
12
|
+
* NOT require updating the entries here.
|
|
13
|
+
*
|
|
14
|
+
* Schemas:
|
|
15
|
+
* - catalogue_schema: docs/method/methods/catalogue-schema.yaml
|
|
16
|
+
* - sdd_manifest: docs/method/methods/sdd-manifest-schema.yaml
|
|
17
|
+
* - aggregation_manifest: docs/method/methods/aggregation-manifest-schema.yaml
|
|
18
|
+
*
|
|
19
|
+
* Bump rules per schema (in their respective YAML headers):
|
|
20
|
+
* - Patch: typo / description / non-structural fix.
|
|
21
|
+
* - Minor: additive change. Backward compatible — older readers ignore
|
|
22
|
+
* new fields. SCHEMA_COMPAT does NOT need updating.
|
|
23
|
+
* - Major: breaking change. SCHEMA_COMPAT MUST be updated in this
|
|
24
|
+
* release; migration tooling (`sdd-cli migrate <schema> --to <v>`,
|
|
25
|
+
* planned) covers downgrade paths.
|
|
26
|
+
*
|
|
27
|
+
* See ADR 0132 (catalogue-integrity gate's schema-drift digest hook) +
|
|
28
|
+
* ADR 0134 §4.6 (canonical builder + aggregator).
|
|
29
|
+
*/
|
|
30
|
+
export declare const SCHEMA_COMPAT: {
|
|
31
|
+
readonly catalogue_schema: "^2.0.0";
|
|
32
|
+
readonly sdd_manifest: "^1.0.0";
|
|
33
|
+
readonly aggregation_manifest: "^1.0.0";
|
|
34
|
+
};
|
|
35
|
+
export type SchemaName = keyof typeof SCHEMA_COMPAT;
|
|
36
|
+
/**
|
|
37
|
+
* Format a schema-version mismatch error consistently across all three
|
|
38
|
+
* schemas. Used by the per-SDD builder, the aggregator, and the
|
|
39
|
+
* `sdd-cli catalogue validate` subcommand.
|
|
40
|
+
*/
|
|
41
|
+
export declare function formatSchemaVersionMismatch(args: {
|
|
42
|
+
schema: SchemaName;
|
|
43
|
+
readVersion: string;
|
|
44
|
+
cliVersion: string;
|
|
45
|
+
sourcePath: string;
|
|
46
|
+
}): string;
|
|
47
|
+
//# sourceMappingURL=schema-compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-compat.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/schema-compat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,aAAa,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAWT"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-schema compatibility ranges declared by this sdd-cli build.
|
|
3
|
+
*
|
|
4
|
+
* Per resolution of adopt-canonical-catalogue-builder.md §7.5, the three
|
|
5
|
+
* sdd-method-distributed schemas version independently. The CLI declares
|
|
6
|
+
* the version range it accepts for each and fails fast at read time on
|
|
7
|
+
* out-of-range manifests.
|
|
8
|
+
*
|
|
9
|
+
* Range semantics: caret-prefixed semver (`^X.Y.Z`) — accept any version
|
|
10
|
+
* in the same major. Bump these in lockstep with sdd-method releases that
|
|
11
|
+
* change a schema's major version. Minor/patch bumps in sdd-method should
|
|
12
|
+
* NOT require updating the entries here.
|
|
13
|
+
*
|
|
14
|
+
* Schemas:
|
|
15
|
+
* - catalogue_schema: docs/method/methods/catalogue-schema.yaml
|
|
16
|
+
* - sdd_manifest: docs/method/methods/sdd-manifest-schema.yaml
|
|
17
|
+
* - aggregation_manifest: docs/method/methods/aggregation-manifest-schema.yaml
|
|
18
|
+
*
|
|
19
|
+
* Bump rules per schema (in their respective YAML headers):
|
|
20
|
+
* - Patch: typo / description / non-structural fix.
|
|
21
|
+
* - Minor: additive change. Backward compatible — older readers ignore
|
|
22
|
+
* new fields. SCHEMA_COMPAT does NOT need updating.
|
|
23
|
+
* - Major: breaking change. SCHEMA_COMPAT MUST be updated in this
|
|
24
|
+
* release; migration tooling (`sdd-cli migrate <schema> --to <v>`,
|
|
25
|
+
* planned) covers downgrade paths.
|
|
26
|
+
*
|
|
27
|
+
* See ADR 0132 (catalogue-integrity gate's schema-drift digest hook) +
|
|
28
|
+
* ADR 0134 §4.6 (canonical builder + aggregator).
|
|
29
|
+
*/
|
|
30
|
+
export const SCHEMA_COMPAT = {
|
|
31
|
+
catalogue_schema: "^2.0.0",
|
|
32
|
+
sdd_manifest: "^1.0.0",
|
|
33
|
+
aggregation_manifest: "^1.0.0",
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Format a schema-version mismatch error consistently across all three
|
|
37
|
+
* schemas. Used by the per-SDD builder, the aggregator, and the
|
|
38
|
+
* `sdd-cli catalogue validate` subcommand.
|
|
39
|
+
*/
|
|
40
|
+
export function formatSchemaVersionMismatch(args) {
|
|
41
|
+
const supports = SCHEMA_COMPAT[args.schema];
|
|
42
|
+
return [
|
|
43
|
+
`schema version mismatch for ${args.schema}`,
|
|
44
|
+
` read: ${args.sourcePath} @ schema_version ${args.readVersion}`,
|
|
45
|
+
` cli: sdd-cli v${args.cliVersion}`,
|
|
46
|
+
` supports: ${supports}`,
|
|
47
|
+
"",
|
|
48
|
+
"Upgrade sdd-cli or downgrade the manifest. Migration tooling:",
|
|
49
|
+
`sdd-cli migrate ${args.schema} --to <version> (planned, not yet shipped).`,
|
|
50
|
+
].join("\n");
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=schema-compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-compat.js","sourceRoot":"","sources":["../../../src/lib/catalogue/schema-compat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,gBAAgB,EAAE,QAAQ;IAC1B,YAAY,EAAE,QAAQ;IACtB,oBAAoB,EAAE,QAAQ;CACtB,CAAC;AAIX;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAK3C;IACC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO;QACL,+BAA+B,IAAI,CAAC,MAAM,EAAE;QAC5C,gBAAgB,IAAI,CAAC,UAAU,qBAAqB,IAAI,CAAC,WAAW,EAAE;QACtE,yBAAyB,IAAI,CAAC,UAAU,EAAE;QAC1C,gBAAgB,QAAQ,EAAE;QAC1B,EAAE;QACF,+DAA+D;QAC/D,mBAAmB,IAAI,CAAC,MAAM,6CAA6C;KAC5E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loader for the canonical catalogue-schema.yaml vendored from sdd-method.
|
|
3
|
+
*
|
|
4
|
+
* Per ADR 0134 §4.6 the canonical builder reads the schema rather than
|
|
5
|
+
* hardcoding column shapes or FK rules. This loader is the only place in
|
|
6
|
+
* the CLI that knows the schema file's location.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Default location of the vendored canonical schema, relative to this
|
|
10
|
+
* compiled module. The build copies the YAML alongside the JS via
|
|
11
|
+
* scripts/copy-yaml-assets.mjs, so at runtime it sits next to the
|
|
12
|
+
* compiled schema-loader.js.
|
|
13
|
+
*/
|
|
14
|
+
export declare const VENDORED_SCHEMA_PATH: string;
|
|
15
|
+
export interface ColumnDef {
|
|
16
|
+
readonly name: string;
|
|
17
|
+
readonly type: string;
|
|
18
|
+
readonly nullable: boolean;
|
|
19
|
+
readonly description?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ForeignKeyDef {
|
|
22
|
+
readonly column: string;
|
|
23
|
+
readonly references: string;
|
|
24
|
+
readonly nullable: boolean;
|
|
25
|
+
readonly external: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface CatalogueDef {
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly primaryKey: string;
|
|
30
|
+
readonly description?: string;
|
|
31
|
+
readonly columns: readonly ColumnDef[];
|
|
32
|
+
readonly foreignKeys: readonly ForeignKeyDef[];
|
|
33
|
+
readonly columnEnums: Readonly<Record<string, string>>;
|
|
34
|
+
}
|
|
35
|
+
export interface EnumValueDef {
|
|
36
|
+
readonly value: string;
|
|
37
|
+
readonly runtime?: boolean;
|
|
38
|
+
readonly emitsServiceRow?: boolean;
|
|
39
|
+
readonly description?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface EnumDef {
|
|
42
|
+
readonly name: string;
|
|
43
|
+
readonly description?: string;
|
|
44
|
+
readonly values: readonly EnumValueDef[];
|
|
45
|
+
}
|
|
46
|
+
export interface CanonicalSchema {
|
|
47
|
+
readonly schemaVersion: string;
|
|
48
|
+
readonly schemaOwner: string;
|
|
49
|
+
readonly schemaStatus: string;
|
|
50
|
+
readonly catalogues: readonly CatalogueDef[];
|
|
51
|
+
readonly enums: Readonly<Record<string, EnumDef>>;
|
|
52
|
+
}
|
|
53
|
+
export declare function loadCanonicalSchema(schemaPath?: string): Promise<CanonicalSchema>;
|
|
54
|
+
/** Look up a catalogue by name; throws if absent. */
|
|
55
|
+
export declare function findCatalogue(schema: CanonicalSchema, name: string): CatalogueDef;
|
|
56
|
+
/** Returns the set of `service_type` values that are runtime services (emit_service_row=true). */
|
|
57
|
+
export declare function runtimeServiceTypes(schema: CanonicalSchema): ReadonlySet<string>;
|
|
58
|
+
//# sourceMappingURL=schema-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-loader.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/schema-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAA2C,CAAC;AAE7E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AA4CD,wBAAsB,mBAAmB,CACvC,UAAU,GAAE,MAA6B,GACxC,OAAO,CAAC,eAAe,CAAC,CAO1B;AAiDD,qDAAqD;AACrD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,GACX,YAAY,CAMd;AAED,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,CAMhF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loader for the canonical catalogue-schema.yaml vendored from sdd-method.
|
|
3
|
+
*
|
|
4
|
+
* Per ADR 0134 §4.6 the canonical builder reads the schema rather than
|
|
5
|
+
* hardcoding column shapes or FK rules. This loader is the only place in
|
|
6
|
+
* the CLI that knows the schema file's location.
|
|
7
|
+
*/
|
|
8
|
+
import { readFile } from "node:fs/promises";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { dirname, join } from "node:path";
|
|
11
|
+
import { parse as parseYaml } from "yaml";
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = dirname(__filename);
|
|
14
|
+
/**
|
|
15
|
+
* Default location of the vendored canonical schema, relative to this
|
|
16
|
+
* compiled module. The build copies the YAML alongside the JS via
|
|
17
|
+
* scripts/copy-yaml-assets.mjs, so at runtime it sits next to the
|
|
18
|
+
* compiled schema-loader.js.
|
|
19
|
+
*/
|
|
20
|
+
export const VENDORED_SCHEMA_PATH = join(__dirname, "canonical-schema.yaml");
|
|
21
|
+
export async function loadCanonicalSchema(schemaPath = VENDORED_SCHEMA_PATH) {
|
|
22
|
+
const text = await readFile(schemaPath, "utf-8");
|
|
23
|
+
// `merge: true` resolves YAML merge keys (`<<: *anchor`) — used by
|
|
24
|
+
// `applications: <<: *products_def` in the canonical schema to express
|
|
25
|
+
// the filtered-view catalogue without duplicating the products def.
|
|
26
|
+
const raw = parseYaml(text, { merge: true });
|
|
27
|
+
return normalise(raw);
|
|
28
|
+
}
|
|
29
|
+
function normalise(raw) {
|
|
30
|
+
const catalogues = Object.entries(raw.catalogues).map(([name, def]) => ({
|
|
31
|
+
name,
|
|
32
|
+
primaryKey: def.primary_key,
|
|
33
|
+
...(def.description !== undefined ? { description: def.description } : {}),
|
|
34
|
+
columns: def.columns.map((c) => ({
|
|
35
|
+
name: c.name,
|
|
36
|
+
type: c.type,
|
|
37
|
+
nullable: c.nullable ?? false,
|
|
38
|
+
...(c.description !== undefined ? { description: c.description } : {}),
|
|
39
|
+
})),
|
|
40
|
+
foreignKeys: (def.foreign_keys ?? []).map((fk) => ({
|
|
41
|
+
column: fk.column,
|
|
42
|
+
references: fk.references,
|
|
43
|
+
nullable: fk.nullable ?? false,
|
|
44
|
+
external: fk.external ?? false,
|
|
45
|
+
})),
|
|
46
|
+
columnEnums: def.column_enums ?? {},
|
|
47
|
+
}));
|
|
48
|
+
const enums = {};
|
|
49
|
+
for (const [name, def] of Object.entries(raw.enums ?? {})) {
|
|
50
|
+
enums[name] = {
|
|
51
|
+
name,
|
|
52
|
+
...(def.description !== undefined ? { description: def.description } : {}),
|
|
53
|
+
values: def.values.map((v) => ({
|
|
54
|
+
value: v.value,
|
|
55
|
+
...(v.runtime !== undefined ? { runtime: v.runtime } : {}),
|
|
56
|
+
...(v.emits_service_row !== undefined
|
|
57
|
+
? { emitsServiceRow: v.emits_service_row }
|
|
58
|
+
: {}),
|
|
59
|
+
...(v.description !== undefined ? { description: v.description } : {}),
|
|
60
|
+
})),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
schemaVersion: raw.schema_version,
|
|
65
|
+
schemaOwner: raw.schema_owner,
|
|
66
|
+
schemaStatus: raw.schema_status,
|
|
67
|
+
catalogues,
|
|
68
|
+
enums,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Look up a catalogue by name; throws if absent. */
|
|
72
|
+
export function findCatalogue(schema, name) {
|
|
73
|
+
const found = schema.catalogues.find((c) => c.name === name);
|
|
74
|
+
if (!found) {
|
|
75
|
+
throw new Error(`catalogue "${name}" not declared in canonical schema`);
|
|
76
|
+
}
|
|
77
|
+
return found;
|
|
78
|
+
}
|
|
79
|
+
/** Returns the set of `service_type` values that are runtime services (emit_service_row=true). */
|
|
80
|
+
export function runtimeServiceTypes(schema) {
|
|
81
|
+
const enumDef = schema.enums["service_type"];
|
|
82
|
+
if (!enumDef)
|
|
83
|
+
return new Set();
|
|
84
|
+
return new Set(enumDef.values.filter((v) => v.emitsServiceRow === true).map((v) => v.value));
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=schema-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-loader.js","sourceRoot":"","sources":["../../../src/lib/catalogue/schema-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { FindingsLog } from "./findings.js";
|
|
2
|
+
export interface TraceabilityCapabilityBlock {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly domain: string;
|
|
5
|
+
readonly capability_spec?: string;
|
|
6
|
+
readonly feature_directory?: string;
|
|
7
|
+
readonly status?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface TraceabilityRunwayBlock {
|
|
10
|
+
readonly classification?: string;
|
|
11
|
+
readonly enables?: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
export interface TraceabilityAdrEntry {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly path?: string;
|
|
16
|
+
readonly relationship?: string;
|
|
17
|
+
readonly notes?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface TraceabilityServiceEntry {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly owner_domain?: string;
|
|
22
|
+
readonly role?: string;
|
|
23
|
+
readonly status?: string;
|
|
24
|
+
readonly notes?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface TraceabilityContractsBlock {
|
|
27
|
+
readonly openapi?: readonly string[];
|
|
28
|
+
readonly proto?: readonly string[];
|
|
29
|
+
readonly avro?: readonly string[];
|
|
30
|
+
}
|
|
31
|
+
export interface TraceabilityBlock {
|
|
32
|
+
readonly runway?: TraceabilityRunwayBlock;
|
|
33
|
+
readonly adrs?: readonly TraceabilityAdrEntry[];
|
|
34
|
+
readonly services?: readonly TraceabilityServiceEntry[];
|
|
35
|
+
readonly contracts?: TraceabilityContractsBlock;
|
|
36
|
+
}
|
|
37
|
+
export interface TraceabilityManifest {
|
|
38
|
+
/** Absolute path to the YAML file. */
|
|
39
|
+
readonly path: string;
|
|
40
|
+
/** Path relative to the SDD repo root. */
|
|
41
|
+
readonly relPath: string;
|
|
42
|
+
/** Domain slug derived from the path (`docs/domains/<domain>/...`). */
|
|
43
|
+
readonly domainFromPath: string;
|
|
44
|
+
readonly capability: TraceabilityCapabilityBlock;
|
|
45
|
+
readonly traceability: TraceabilityBlock;
|
|
46
|
+
/** Raw parsed data (for builders that need fields not in the typed shape). */
|
|
47
|
+
readonly data: unknown;
|
|
48
|
+
}
|
|
49
|
+
export interface LoadTraceabilityOptions {
|
|
50
|
+
readonly sddPath: string;
|
|
51
|
+
readonly findings: FindingsLog;
|
|
52
|
+
}
|
|
53
|
+
export declare function loadTraceabilityManifests(opts: LoadTraceabilityOptions): Promise<TraceabilityManifest[]>;
|
|
54
|
+
/** Convenience: read a file's first non-empty line, returning the trimmed value. */
|
|
55
|
+
export declare function readFirstNonEmptyLine(path: string): Promise<string>;
|
|
56
|
+
//# sourceMappingURL=traceability-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceability-loader.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/traceability-loader.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACxD,QAAQ,CAAC,SAAS,CAAC,EAAE,0BAA0B,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA4EjC;AAqHD,oFAAoF;AACpF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAazE"}
|