@sdd-method/sdd-cli 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +3 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/catalogue/aggregate.d.ts +39 -0
  5. package/dist/lib/catalogue/aggregate.d.ts.map +1 -0
  6. package/dist/lib/catalogue/aggregate.js +344 -0
  7. package/dist/lib/catalogue/aggregate.js.map +1 -0
  8. package/dist/lib/catalogue/aggregation-manifest-loader.d.ts +25 -0
  9. package/dist/lib/catalogue/aggregation-manifest-loader.d.ts.map +1 -0
  10. package/dist/lib/catalogue/aggregation-manifest-loader.js +111 -0
  11. package/dist/lib/catalogue/aggregation-manifest-loader.js.map +1 -0
  12. package/dist/lib/catalogue/build.d.ts +42 -0
  13. package/dist/lib/catalogue/build.d.ts.map +1 -0
  14. package/dist/lib/catalogue/build.js +373 -0
  15. package/dist/lib/catalogue/build.js.map +1 -0
  16. package/dist/lib/catalogue/builders/adr-supersedes.d.ts +14 -0
  17. package/dist/lib/catalogue/builders/adr-supersedes.d.ts.map +1 -0
  18. package/dist/lib/catalogue/builders/adr-supersedes.js +62 -0
  19. package/dist/lib/catalogue/builders/adr-supersedes.js.map +1 -0
  20. package/dist/lib/catalogue/builders/adrs.d.ts +27 -0
  21. package/dist/lib/catalogue/builders/adrs.d.ts.map +1 -0
  22. package/dist/lib/catalogue/builders/adrs.js +191 -0
  23. package/dist/lib/catalogue/builders/adrs.js.map +1 -0
  24. package/dist/lib/catalogue/builders/c4-containers.d.ts +16 -0
  25. package/dist/lib/catalogue/builders/c4-containers.d.ts.map +1 -0
  26. package/dist/lib/catalogue/builders/c4-containers.js +169 -0
  27. package/dist/lib/catalogue/builders/c4-containers.js.map +1 -0
  28. package/dist/lib/catalogue/builders/c4-systems.d.ts +10 -0
  29. package/dist/lib/catalogue/builders/c4-systems.d.ts.map +1 -0
  30. package/dist/lib/catalogue/builders/c4-systems.js +99 -0
  31. package/dist/lib/catalogue/builders/c4-systems.js.map +1 -0
  32. package/dist/lib/catalogue/builders/capabilities.d.ts +11 -0
  33. package/dist/lib/catalogue/builders/capabilities.d.ts.map +1 -0
  34. package/dist/lib/catalogue/builders/capabilities.js +173 -0
  35. package/dist/lib/catalogue/builders/capabilities.js.map +1 -0
  36. package/dist/lib/catalogue/builders/capability-edges.d.ts +27 -0
  37. package/dist/lib/catalogue/builders/capability-edges.d.ts.map +1 -0
  38. package/dist/lib/catalogue/builders/capability-edges.js +166 -0
  39. package/dist/lib/catalogue/builders/capability-edges.js.map +1 -0
  40. package/dist/lib/catalogue/builders/contracts.d.ts +15 -0
  41. package/dist/lib/catalogue/builders/contracts.d.ts.map +1 -0
  42. package/dist/lib/catalogue/builders/contracts.js +153 -0
  43. package/dist/lib/catalogue/builders/contracts.js.map +1 -0
  44. package/dist/lib/catalogue/builders/domains.d.ts +10 -0
  45. package/dist/lib/catalogue/builders/domains.d.ts.map +1 -0
  46. package/dist/lib/catalogue/builders/domains.js +93 -0
  47. package/dist/lib/catalogue/builders/domains.js.map +1 -0
  48. package/dist/lib/catalogue/builders/event-edges.d.ts +20 -0
  49. package/dist/lib/catalogue/builders/event-edges.d.ts.map +1 -0
  50. package/dist/lib/catalogue/builders/event-edges.js +112 -0
  51. package/dist/lib/catalogue/builders/event-edges.js.map +1 -0
  52. package/dist/lib/catalogue/builders/events.d.ts +26 -0
  53. package/dist/lib/catalogue/builders/events.d.ts.map +1 -0
  54. package/dist/lib/catalogue/builders/events.js +99 -0
  55. package/dist/lib/catalogue/builders/events.js.map +1 -0
  56. package/dist/lib/catalogue/builders/feature-groups.d.ts +10 -0
  57. package/dist/lib/catalogue/builders/feature-groups.d.ts.map +1 -0
  58. package/dist/lib/catalogue/builders/feature-groups.js +118 -0
  59. package/dist/lib/catalogue/builders/feature-groups.js.map +1 -0
  60. package/dist/lib/catalogue/builders/features.d.ts +35 -0
  61. package/dist/lib/catalogue/builders/features.d.ts.map +1 -0
  62. package/dist/lib/catalogue/builders/features.js +206 -0
  63. package/dist/lib/catalogue/builders/features.js.map +1 -0
  64. package/dist/lib/catalogue/builders/glossary-xref.d.ts +11 -0
  65. package/dist/lib/catalogue/builders/glossary-xref.d.ts.map +1 -0
  66. package/dist/lib/catalogue/builders/glossary-xref.js +107 -0
  67. package/dist/lib/catalogue/builders/glossary-xref.js.map +1 -0
  68. package/dist/lib/catalogue/builders/glossary.d.ts +14 -0
  69. package/dist/lib/catalogue/builders/glossary.d.ts.map +1 -0
  70. package/dist/lib/catalogue/builders/glossary.js +150 -0
  71. package/dist/lib/catalogue/builders/glossary.js.map +1 -0
  72. package/dist/lib/catalogue/builders/index.d.ts +57 -0
  73. package/dist/lib/catalogue/builders/index.d.ts.map +1 -0
  74. package/dist/lib/catalogue/builders/index.js +33 -0
  75. package/dist/lib/catalogue/builders/index.js.map +1 -0
  76. package/dist/lib/catalogue/builders/integrations.d.ts +12 -0
  77. package/dist/lib/catalogue/builders/integrations.d.ts.map +1 -0
  78. package/dist/lib/catalogue/builders/integrations.js +85 -0
  79. package/dist/lib/catalogue/builders/integrations.js.map +1 -0
  80. package/dist/lib/catalogue/builders/persona-journey-edges.d.ts +26 -0
  81. package/dist/lib/catalogue/builders/persona-journey-edges.d.ts.map +1 -0
  82. package/dist/lib/catalogue/builders/persona-journey-edges.js +133 -0
  83. package/dist/lib/catalogue/builders/persona-journey-edges.js.map +1 -0
  84. package/dist/lib/catalogue/builders/personas.d.ts +22 -0
  85. package/dist/lib/catalogue/builders/personas.d.ts.map +1 -0
  86. package/dist/lib/catalogue/builders/personas.js +150 -0
  87. package/dist/lib/catalogue/builders/personas.js.map +1 -0
  88. package/dist/lib/catalogue/builders/product-edges.d.ts +15 -0
  89. package/dist/lib/catalogue/builders/product-edges.d.ts.map +1 -0
  90. package/dist/lib/catalogue/builders/product-edges.js +97 -0
  91. package/dist/lib/catalogue/builders/product-edges.js.map +1 -0
  92. package/dist/lib/catalogue/builders/products.d.ts +26 -0
  93. package/dist/lib/catalogue/builders/products.d.ts.map +1 -0
  94. package/dist/lib/catalogue/builders/products.js +57 -0
  95. package/dist/lib/catalogue/builders/products.js.map +1 -0
  96. package/dist/lib/catalogue/builders/repo-edges.d.ts +18 -0
  97. package/dist/lib/catalogue/builders/repo-edges.d.ts.map +1 -0
  98. package/dist/lib/catalogue/builders/repo-edges.js +113 -0
  99. package/dist/lib/catalogue/builders/repo-edges.js.map +1 -0
  100. package/dist/lib/catalogue/builders/repositories.d.ts +78 -0
  101. package/dist/lib/catalogue/builders/repositories.d.ts.map +1 -0
  102. package/dist/lib/catalogue/builders/repositories.js +204 -0
  103. package/dist/lib/catalogue/builders/repositories.js.map +1 -0
  104. package/dist/lib/catalogue/builders/service-contract.d.ts +11 -0
  105. package/dist/lib/catalogue/builders/service-contract.d.ts.map +1 -0
  106. package/dist/lib/catalogue/builders/service-contract.js +53 -0
  107. package/dist/lib/catalogue/builders/service-contract.js.map +1 -0
  108. package/dist/lib/catalogue/builders/services.d.ts +15 -0
  109. package/dist/lib/catalogue/builders/services.d.ts.map +1 -0
  110. package/dist/lib/catalogue/builders/services.js +40 -0
  111. package/dist/lib/catalogue/builders/services.js.map +1 -0
  112. package/dist/lib/catalogue/builders/user-journeys.d.ts +24 -0
  113. package/dist/lib/catalogue/builders/user-journeys.d.ts.map +1 -0
  114. package/dist/lib/catalogue/builders/user-journeys.js +253 -0
  115. package/dist/lib/catalogue/builders/user-journeys.js.map +1 -0
  116. package/dist/lib/catalogue/canonical-schema.yaml +624 -0
  117. package/dist/lib/catalogue/cli-version.d.ts +10 -0
  118. package/dist/lib/catalogue/cli-version.d.ts.map +1 -0
  119. package/dist/lib/catalogue/cli-version.js +10 -0
  120. package/dist/lib/catalogue/cli-version.js.map +1 -0
  121. package/dist/lib/catalogue/csv-reader.d.ts +7 -0
  122. package/dist/lib/catalogue/csv-reader.d.ts.map +1 -0
  123. package/dist/lib/catalogue/csv-reader.js +97 -0
  124. package/dist/lib/catalogue/csv-reader.js.map +1 -0
  125. package/dist/lib/catalogue/csv-writer.d.ts +29 -0
  126. package/dist/lib/catalogue/csv-writer.d.ts.map +1 -0
  127. package/dist/lib/catalogue/csv-writer.js +55 -0
  128. package/dist/lib/catalogue/csv-writer.js.map +1 -0
  129. package/dist/lib/catalogue/findings.d.ts +27 -0
  130. package/dist/lib/catalogue/findings.d.ts.map +1 -0
  131. package/dist/lib/catalogue/findings.js +34 -0
  132. package/dist/lib/catalogue/findings.js.map +1 -0
  133. package/dist/lib/catalogue/fk-validator.d.ts +44 -0
  134. package/dist/lib/catalogue/fk-validator.d.ts.map +1 -0
  135. package/dist/lib/catalogue/fk-validator.js +90 -0
  136. package/dist/lib/catalogue/fk-validator.js.map +1 -0
  137. package/dist/lib/catalogue/index.d.ts +27 -0
  138. package/dist/lib/catalogue/index.d.ts.map +1 -0
  139. package/dist/lib/catalogue/index.js +18 -0
  140. package/dist/lib/catalogue/index.js.map +1 -0
  141. package/dist/lib/catalogue/manifest-loader.d.ts +47 -0
  142. package/dist/lib/catalogue/manifest-loader.d.ts.map +1 -0
  143. package/dist/lib/catalogue/manifest-loader.js +161 -0
  144. package/dist/lib/catalogue/manifest-loader.js.map +1 -0
  145. package/dist/lib/catalogue/schema-compat.d.ts +47 -0
  146. package/dist/lib/catalogue/schema-compat.d.ts.map +1 -0
  147. package/dist/lib/catalogue/schema-compat.js +52 -0
  148. package/dist/lib/catalogue/schema-compat.js.map +1 -0
  149. package/dist/lib/catalogue/schema-loader.d.ts +58 -0
  150. package/dist/lib/catalogue/schema-loader.d.ts.map +1 -0
  151. package/dist/lib/catalogue/schema-loader.js +86 -0
  152. package/dist/lib/catalogue/schema-loader.js.map +1 -0
  153. package/dist/lib/catalogue/traceability-loader.d.ts +56 -0
  154. package/dist/lib/catalogue/traceability-loader.d.ts.map +1 -0
  155. package/dist/lib/catalogue/traceability-loader.js +217 -0
  156. package/dist/lib/catalogue/traceability-loader.js.map +1 -0
  157. package/dist/lib/catalogue/validate.d.ts +16 -0
  158. package/dist/lib/catalogue/validate.d.ts.map +1 -0
  159. package/dist/lib/catalogue/validate.js +137 -0
  160. package/dist/lib/catalogue/validate.js.map +1 -0
  161. package/dist/lib/catalogue/version.d.ts +3 -0
  162. package/dist/lib/catalogue/version.d.ts.map +1 -0
  163. package/dist/lib/catalogue/version.js +18 -0
  164. package/dist/lib/catalogue/version.js.map +1 -0
  165. package/dist/lib/mcp/build-info.d.ts +1 -1
  166. package/dist/lib/mcp/build-info.js +1 -1
  167. package/dist/verbs/catalogue.d.ts +3 -0
  168. package/dist/verbs/catalogue.d.ts.map +1 -0
  169. package/dist/verbs/catalogue.js +60 -0
  170. package/dist/verbs/catalogue.js.map +1 -0
  171. package/package.json +3 -3
  172. package/scripts/copy-yaml-assets.mjs +38 -0
  173. 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"}