@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,206 @@
1
+ // Features discoverer — emits `features.csv` rows from feature spec files
2
+ // under `docs/domains/<domain>/product/features/<folder>/*.md`.
3
+ //
4
+ // Folder→capability mapping uses two sources, in order:
5
+ // 1. Traceability manifest's `capability.feature_directory` field —
6
+ // authoritative when a capability spec uses a folder name that
7
+ // differs from the canonical capability_id (e.g. capability_id
8
+ // "alerts-rules-engine" with feature_directory pointing at
9
+ // "features/alerts-rules/").
10
+ // 2. Folder name itself, when it equals a known capability_id.
11
+ //
12
+ // id format: `{capability_id}-{feature-slug}` (matching the python
13
+ // builder convention).
14
+ //
15
+ // name: feature slug; description: feature spec H1 title.
16
+ import { readdir, readFile } from "node:fs/promises";
17
+ import { basename, join, relative, sep } from "node:path";
18
+ const DOMAINS_DIR_REL = join("docs", "domains");
19
+ export async function buildFeatures(inputs) {
20
+ // Build folder→capability_id map from traceability feature_directory.
21
+ const folderToCap = new Map();
22
+ for (const m of inputs.manifests) {
23
+ const featDir = m.capability.feature_directory;
24
+ if (!featDir)
25
+ continue;
26
+ if (!inputs.knownCapabilityIds.has(m.capability.id))
27
+ continue;
28
+ const folder = basename(featDir.replace(/\/+$/, ""));
29
+ folderToCap.set(folder, m.capability.id);
30
+ }
31
+ const featurePaths = await collectFeatureSpecs(inputs.sddPath);
32
+ const rows = [];
33
+ const idByPath = new Map();
34
+ const idBySlug = new Map();
35
+ const seen = new Set();
36
+ for (const path of featurePaths) {
37
+ const relPath = relative(inputs.sddPath, path);
38
+ const folder = parentFolder(relPath);
39
+ const capId = folderToCap.get(folder)
40
+ ?? (inputs.knownCapabilityIds.has(folder) ? folder : "");
41
+ if (capId === "") {
42
+ inputs.findings.add("orphan", `${relPath}: feature folder "${folder}" has no matching capability (no traceability feature_directory + folder is not a capability id)`);
43
+ continue;
44
+ }
45
+ const stem = basename(relPath).replace(/\.md$/i, "");
46
+ const id = `${capId}-${stem}`;
47
+ if (seen.has(id)) {
48
+ inputs.findings.add("divergence", `${relPath}: feature id "${id}" already emitted by an earlier file`);
49
+ continue;
50
+ }
51
+ seen.add(id);
52
+ const text = await readFile(path, "utf-8");
53
+ const description = extractH1Title(text);
54
+ rows.push({
55
+ id,
56
+ name: stem,
57
+ product_id: "",
58
+ capability_id: capId,
59
+ parent_group_id: "",
60
+ parent_feature_id: "",
61
+ description,
62
+ maturity: "",
63
+ status: "active",
64
+ source: "feature-spec",
65
+ source_sdd_id: "",
66
+ });
67
+ idByPath.set(relPath, id);
68
+ if (!idBySlug.has(stem))
69
+ idBySlug.set(stem, id);
70
+ }
71
+ // App-product profile: also walk `features/<group>/<file>.md` at SDD root.
72
+ // These features are owned by the SDD's product (not by a capability) —
73
+ // capability_id is left empty; product_id carries the link.
74
+ if (inputs.profile === "application-product") {
75
+ const appFeatures = await collectAppFeatureSpecs(inputs.sddPath);
76
+ for (const path of appFeatures) {
77
+ const relPath = relative(inputs.sddPath, path);
78
+ const stem = basename(relPath).replace(/\.md$/i, "");
79
+ const id = `${inputs.productId}-${stem}`;
80
+ if (seen.has(id)) {
81
+ inputs.findings.add("divergence", `${relPath}: feature id "${id}" already emitted by an earlier file`);
82
+ continue;
83
+ }
84
+ seen.add(id);
85
+ const text = await readFile(path, "utf-8");
86
+ const description = extractH1Title(text);
87
+ rows.push({
88
+ id,
89
+ name: stem,
90
+ product_id: inputs.productId,
91
+ capability_id: "",
92
+ parent_group_id: "",
93
+ parent_feature_id: "",
94
+ description,
95
+ maturity: "",
96
+ status: "active",
97
+ source: "feature-spec",
98
+ source_sdd_id: "",
99
+ });
100
+ idByPath.set(relPath, id);
101
+ if (!idBySlug.has(stem))
102
+ idBySlug.set(stem, id);
103
+ }
104
+ }
105
+ return { rows, idByPath, idBySlug };
106
+ }
107
+ const FEATURES_DIR_REL = "features";
108
+ async function collectAppFeatureSpecs(sddPath) {
109
+ const out = [];
110
+ const featuresDir = join(sddPath, FEATURES_DIR_REL);
111
+ let groups;
112
+ try {
113
+ groups = await readdir(featuresDir, { withFileTypes: true });
114
+ }
115
+ catch {
116
+ return out;
117
+ }
118
+ for (const g of groups) {
119
+ if (!g.isDirectory())
120
+ continue;
121
+ const groupDir = join(featuresDir, g.name);
122
+ let entries;
123
+ try {
124
+ entries = await readdir(groupDir, { withFileTypes: true });
125
+ }
126
+ catch {
127
+ continue;
128
+ }
129
+ for (const e of entries) {
130
+ if (!e.isFile())
131
+ continue;
132
+ if (!e.name.endsWith(".md"))
133
+ continue;
134
+ const lower = e.name.toLowerCase();
135
+ if (lower === "readme.md" || lower === "index.md")
136
+ continue;
137
+ out.push(join(groupDir, e.name));
138
+ }
139
+ }
140
+ return out.sort();
141
+ }
142
+ async function collectFeatureSpecs(sddPath) {
143
+ const out = [];
144
+ const domainsDir = join(sddPath, DOMAINS_DIR_REL);
145
+ let domains;
146
+ try {
147
+ domains = await readdir(domainsDir, { withFileTypes: true });
148
+ }
149
+ catch {
150
+ return out;
151
+ }
152
+ for (const d of domains) {
153
+ if (!d.isDirectory())
154
+ continue;
155
+ const featuresDir = join(domainsDir, d.name, "product", "features");
156
+ let folders;
157
+ try {
158
+ folders = await readdir(featuresDir, { withFileTypes: true });
159
+ }
160
+ catch {
161
+ continue;
162
+ }
163
+ for (const f of folders) {
164
+ if (!f.isDirectory())
165
+ continue;
166
+ const folderPath = join(featuresDir, f.name);
167
+ let entries;
168
+ try {
169
+ entries = await readdir(folderPath, { withFileTypes: true });
170
+ }
171
+ catch {
172
+ continue;
173
+ }
174
+ for (const e of entries) {
175
+ if (!e.isFile())
176
+ continue;
177
+ if (!e.name.endsWith(".md"))
178
+ continue;
179
+ const lower = e.name.toLowerCase();
180
+ if (lower === "readme.md" || lower === "index.md")
181
+ continue;
182
+ out.push(join(folderPath, e.name));
183
+ }
184
+ }
185
+ }
186
+ return out.sort();
187
+ }
188
+ function parentFolder(relPath) {
189
+ const parts = relPath.split(sep);
190
+ return parts[parts.length - 2] ?? "";
191
+ }
192
+ function extractH1Title(text) {
193
+ for (const line of text.split(/\r?\n/)) {
194
+ const t = line.trim();
195
+ if (t === "")
196
+ continue;
197
+ if (!t.startsWith("#"))
198
+ return "";
199
+ return t
200
+ .replace(/^#+\s*/, "")
201
+ .replace(/^(Feature Specification|Spec):\s*/i, "")
202
+ .trim();
203
+ }
204
+ return "";
205
+ }
206
+ //# sourceMappingURL=features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/features.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ export interface GlossaryXrefInputs {
4
+ readonly sddPath: string;
5
+ readonly findings: FindingsLog;
6
+ /** From the glossary builder: `<domain>:<term>` (lower-case term) → glossary_items.id. */
7
+ readonly idByDomainTerm: ReadonlyMap<string, string>;
8
+ readonly knownGlossaryIds: ReadonlySet<string>;
9
+ }
10
+ export declare function buildGlossaryXref(inputs: GlossaryXrefInputs): Promise<CatalogueRow[]>;
11
+ //# sourceMappingURL=glossary-xref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glossary-xref.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/glossary-xref.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,0FAA0F;IAC1F,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChD;AASD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,EAAE,CAAC,CAqEzB"}
@@ -0,0 +1,107 @@
1
+ // glossary_xref edge builder — emits cross-domain glossary
2
+ // relationships from `docs/platform/reference/glossary-alignment-manifest.yaml`.
3
+ //
4
+ // Expected manifest shape (canonical):
5
+ //
6
+ // aliases:
7
+ // - source: <source-domain>:<term>
8
+ // target: <target-domain>:<term>
9
+ // conflicts:
10
+ // - source: <source-domain>:<term>
11
+ // target: <target-domain>:<term>
12
+ //
13
+ // Or the per-entry shape with `source_id`/`target_id` fields directly.
14
+ //
15
+ // Adopters whose alignment manifest is in a different shape (e.g.
16
+ // data-dictionary alignment rather than cross-domain term aliasing)
17
+ // will simply produce zero rows. This builder logs a `convention`
18
+ // finding when a manifest exists but no expected blocks are present.
19
+ import { readFile } from "node:fs/promises";
20
+ import { join } from "node:path";
21
+ import { parse as parseYaml } from "yaml";
22
+ const MANIFEST_REL_PATH = join("docs", "platform", "reference", "glossary-alignment-manifest.yaml");
23
+ export async function buildGlossaryXref(inputs) {
24
+ const path = join(inputs.sddPath, MANIFEST_REL_PATH);
25
+ let text;
26
+ try {
27
+ text = await readFile(path, "utf-8");
28
+ }
29
+ catch (err) {
30
+ const code = err.code;
31
+ if (code === "ENOENT")
32
+ return [];
33
+ throw err;
34
+ }
35
+ let raw;
36
+ try {
37
+ raw = parseYaml(text);
38
+ }
39
+ catch (err) {
40
+ inputs.findings.add("convention", `${MANIFEST_REL_PATH}: failed to parse YAML — ${err.message}`);
41
+ return [];
42
+ }
43
+ if (!raw || typeof raw !== "object")
44
+ return [];
45
+ const obj = raw;
46
+ const aliases = collectPairs(obj["aliases"]);
47
+ const conflicts = collectPairs(obj["conflicts_with"] ?? obj["conflicts"]);
48
+ if (aliases.length === 0 && conflicts.length === 0) {
49
+ inputs.findings.add("convention", `${MANIFEST_REL_PATH}: present but no aliases/conflicts blocks recognised — emitting 0 xref rows`);
50
+ return [];
51
+ }
52
+ const rows = [];
53
+ const seen = new Set();
54
+ const emit = (rawSource, rawTarget, relation) => {
55
+ const sourceId = resolveTerm(rawSource, inputs);
56
+ const targetId = resolveTerm(rawTarget, inputs);
57
+ if (sourceId === undefined) {
58
+ inputs.findings.add("orphan", `${MANIFEST_REL_PATH}: ${relation} source "${rawSource}" doesn't resolve to a known glossary item`);
59
+ return;
60
+ }
61
+ if (targetId === undefined) {
62
+ inputs.findings.add("orphan", `${MANIFEST_REL_PATH}: ${relation} target "${rawTarget}" doesn't resolve to a known glossary item`);
63
+ return;
64
+ }
65
+ if (sourceId === targetId)
66
+ return; // self-reference is meaningless
67
+ const id = `${sourceId}__${relation}__${targetId}`;
68
+ if (seen.has(id))
69
+ return;
70
+ seen.add(id);
71
+ rows.push({ id, source_id: sourceId, target_id: targetId, relation });
72
+ };
73
+ for (const { source, target } of aliases)
74
+ emit(source, target, "alias-of");
75
+ for (const { source, target } of conflicts)
76
+ emit(source, target, "conflicts-with");
77
+ return rows;
78
+ }
79
+ function collectPairs(raw) {
80
+ if (!Array.isArray(raw))
81
+ return [];
82
+ const out = [];
83
+ for (const item of raw) {
84
+ if (!item || typeof item !== "object")
85
+ continue;
86
+ const o = item;
87
+ const source = String(o["source"] ?? o["source_id"] ?? "").trim();
88
+ const target = String(o["target"] ?? o["target_id"] ?? "").trim();
89
+ if (source !== "" && target !== "")
90
+ out.push({ source, target });
91
+ }
92
+ return out;
93
+ }
94
+ function resolveTerm(raw, inputs) {
95
+ // Direct id (e.g. "asset-vehicle")
96
+ if (inputs.knownGlossaryIds.has(raw))
97
+ return raw;
98
+ // domain:term lookup
99
+ const colonIdx = raw.indexOf(":");
100
+ if (colonIdx > 0) {
101
+ const domain = raw.slice(0, colonIdx).trim().toLowerCase();
102
+ const term = raw.slice(colonIdx + 1).trim().toLowerCase();
103
+ return inputs.idByDomainTerm.get(`${domain}:${term}`);
104
+ }
105
+ return undefined;
106
+ }
107
+ //# sourceMappingURL=glossary-xref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glossary-xref.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/glossary-xref.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ export interface GlossaryItemsBuildInputs {
4
+ readonly sddPath: string;
5
+ readonly findings: FindingsLog;
6
+ readonly knownDomainIds: ReadonlySet<string>;
7
+ }
8
+ export interface GlossaryItemsResult {
9
+ readonly rows: CatalogueRow[];
10
+ /** Map of `<domain>:<term>` (case-insensitive) → item id, used by xref resolution. */
11
+ readonly idByDomainTerm: ReadonlyMap<string, string>;
12
+ }
13
+ export declare function buildGlossaryItems(inputs: GlossaryItemsBuildInputs): Promise<GlossaryItemsResult>;
14
+ //# sourceMappingURL=glossary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glossary.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/glossary.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,sFAAsF;IACtF,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtD;AAKD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CA+C9B"}
@@ -0,0 +1,150 @@
1
+ // Glossary discoverer — emits `glossary_items.csv` rows from
2
+ // `docs/domains/<domain>/architecture/glossary.md` "## Owned Terms"
3
+ // tables.
4
+ //
5
+ // Convention (per the catalogue-metamodel.md + contextua-platform's
6
+ // existing layout):
7
+ // ## Owned Terms
8
+ //
9
+ // | Term | Definition | Notes |
10
+ // |------|------------|-------|
11
+ // | <term> | <definition> | <optional notes> |
12
+ //
13
+ // Borrowed terms and deprecated-terms tables are intentionally NOT
14
+ // emitted — borrowed terms reference a canonical entry in another
15
+ // domain (which is already captured by that domain's Owned Terms),
16
+ // and deprecated terms are migration noise.
17
+ //
18
+ // Item id: `<domain>-<slug>` so terms in different domains can reuse
19
+ // the same word without collision.
20
+ import { readdir, readFile } from "node:fs/promises";
21
+ import { join, relative, sep } from "node:path";
22
+ const DOMAINS_DIR_REL = join("docs", "domains");
23
+ const SECTION_HEADING_RE = /^##\s+(Owned|Borrowed|Deprecated)\s+Terms?\s*$/i;
24
+ export async function buildGlossaryItems(inputs) {
25
+ const rows = [];
26
+ const idByDomainTerm = new Map();
27
+ const seen = new Set();
28
+ const glossaryFiles = await collectGlossaryFiles(inputs.sddPath);
29
+ for (const path of glossaryFiles) {
30
+ const relPath = relative(inputs.sddPath, path);
31
+ const domain = inferDomainFromPath(relPath);
32
+ if (domain === "")
33
+ continue;
34
+ if (!inputs.knownDomainIds.has(domain)) {
35
+ inputs.findings.add("orphan", `${relPath}: glossary path implies domain "${domain}" but no docs/domains/${domain}/ exists`);
36
+ continue;
37
+ }
38
+ const text = await readFile(path, "utf-8");
39
+ const ownedTerms = extractOwnedTerms(text);
40
+ for (const { term, definition, notes } of ownedTerms) {
41
+ const slug = slugify(term);
42
+ if (slug === "")
43
+ continue;
44
+ const id = `${domain}-${slug}`;
45
+ if (seen.has(id)) {
46
+ inputs.findings.add("divergence", `${relPath}: glossary item "${id}" already emitted (term="${term}")`);
47
+ continue;
48
+ }
49
+ seen.add(id);
50
+ rows.push({
51
+ id,
52
+ term,
53
+ definition,
54
+ owning_domain_id: domain,
55
+ canonical_term_id: "",
56
+ aliases: "",
57
+ evidence: "",
58
+ notes,
59
+ source_sdd_id: "",
60
+ });
61
+ idByDomainTerm.set(`${domain}:${term.toLowerCase()}`, id);
62
+ }
63
+ }
64
+ return { rows, idByDomainTerm };
65
+ }
66
+ function extractOwnedTerms(text) {
67
+ const out = [];
68
+ let inOwnedSection = false;
69
+ let sawHeader = false;
70
+ for (const rawLine of text.split(/\r?\n/)) {
71
+ const line = rawLine.trimEnd();
72
+ const heading = SECTION_HEADING_RE.exec(line.trim());
73
+ if (heading) {
74
+ inOwnedSection = (heading[1] ?? "").toLowerCase() === "owned";
75
+ sawHeader = false;
76
+ continue;
77
+ }
78
+ if (!inOwnedSection)
79
+ continue;
80
+ // Header row: `| Term | Definition | ... |`
81
+ if (/^\s*\|\s*Term\b/i.test(line)) {
82
+ sawHeader = true;
83
+ continue;
84
+ }
85
+ // Separator row: `|---|---|...`
86
+ if (/^\s*\|[\s-:|]+\|\s*$/.test(line))
87
+ continue;
88
+ if (!sawHeader)
89
+ continue;
90
+ if (!line.trim().startsWith("|"))
91
+ continue;
92
+ const cells = splitTableRow(line);
93
+ if (cells.length < 2 || cells[0] === "")
94
+ continue;
95
+ out.push({
96
+ term: cells[0] ?? "",
97
+ definition: cells[1] ?? "",
98
+ notes: cells[2] ?? "",
99
+ });
100
+ }
101
+ return out;
102
+ }
103
+ function splitTableRow(line) {
104
+ // Trim outer pipes, split on |, strip cells. Doesn't try to handle
105
+ // escaped pipes — adopter convention says: avoid raw | in cells, use
106
+ // "or" instead. We honour that.
107
+ const trimmed = line.trim().replace(/^\|/, "").replace(/\|$/, "");
108
+ return trimmed.split("|").map((c) => c.trim());
109
+ }
110
+ async function collectGlossaryFiles(sddPath) {
111
+ const out = [];
112
+ const domainsDir = join(sddPath, DOMAINS_DIR_REL);
113
+ let domains;
114
+ try {
115
+ domains = await readdir(domainsDir, { withFileTypes: true });
116
+ }
117
+ catch {
118
+ return out;
119
+ }
120
+ for (const d of domains) {
121
+ if (!d.isDirectory())
122
+ continue;
123
+ const path = join(domainsDir, d.name, "architecture", "glossary.md");
124
+ try {
125
+ await readFile(path, "utf-8");
126
+ out.push(path);
127
+ }
128
+ catch (err) {
129
+ const code = err.code;
130
+ if (code !== "ENOENT")
131
+ throw err;
132
+ }
133
+ }
134
+ return out.sort();
135
+ }
136
+ function inferDomainFromPath(relPath) {
137
+ const parts = relPath.split(sep);
138
+ const idx = parts.indexOf("domains");
139
+ if (idx === -1 || idx + 1 >= parts.length)
140
+ return "";
141
+ return parts[idx + 1] ?? "";
142
+ }
143
+ function slugify(text) {
144
+ return text
145
+ .toLowerCase()
146
+ .replace(/&/g, " and ")
147
+ .replace(/[^a-z0-9]+/g, "-")
148
+ .replace(/^-+|-+$/g, "");
149
+ }
150
+ //# sourceMappingURL=glossary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glossary.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/glossary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Re-exports for the per-source row discoverers used by the canonical
3
+ * `sdd-cli catalogue build` orchestrator.
4
+ *
5
+ * Each builder is responsible for exactly one node catalogue (or a small
6
+ * tightly-coupled group when reading the same source). The orchestrator
7
+ * in build.ts composes them with a deterministic order.
8
+ */
9
+ export { buildDomains } from "./domains.js";
10
+ export type { DomainsBuildInputs } from "./domains.js";
11
+ export { buildProducts } from "./products.js";
12
+ export type { ProductsBuildInputs } from "./products.js";
13
+ export { buildRepositories } from "./repositories.js";
14
+ export type { RepositoriesBuildInputs, RepositoriesBuildResult, ParsedRepoConfig, } from "./repositories.js";
15
+ export { buildServices } from "./services.js";
16
+ export type { ServicesBuildInputs } from "./services.js";
17
+ export { buildAdrs } from "./adrs.js";
18
+ export type { AdrsBuildInputs, ParsedAdr } from "./adrs.js";
19
+ export { buildAdrSupersedes } from "./adr-supersedes.js";
20
+ export type { AdrSupersedesInputs, AdrSupersedesResult, } from "./adr-supersedes.js";
21
+ export { buildFeatures } from "./features.js";
22
+ export type { FeaturesBuildInputs, FeaturesBuildResult, } from "./features.js";
23
+ export { buildFeatureGroups } from "./feature-groups.js";
24
+ export type { FeatureGroupsBuildInputs } from "./feature-groups.js";
25
+ export { buildContracts } from "./contracts.js";
26
+ export type { ContractsBuildInputs, ContractsBuildResult, } from "./contracts.js";
27
+ export { buildRepoEdges } from "./repo-edges.js";
28
+ export type { RepoEdgesInputs, RepoEdgesResult, } from "./repo-edges.js";
29
+ export { buildEvents } from "./events.js";
30
+ export type { EventsBuildInputs, EventsBuildResult, PublisherIndex, } from "./events.js";
31
+ export { buildServiceEvent, buildCapabilityEvent } from "./event-edges.js";
32
+ export type { ServiceEventInputs, CapabilityEventInputs, } from "./event-edges.js";
33
+ export { buildServiceContract } from "./service-contract.js";
34
+ export type { ServiceContractInputs } from "./service-contract.js";
35
+ export { buildGlossaryItems } from "./glossary.js";
36
+ export type { GlossaryItemsBuildInputs, GlossaryItemsResult, } from "./glossary.js";
37
+ export { buildGlossaryXref } from "./glossary-xref.js";
38
+ export type { GlossaryXrefInputs } from "./glossary-xref.js";
39
+ export { buildCapabilities } from "./capabilities.js";
40
+ export type { CapabilitiesBuildInputs } from "./capabilities.js";
41
+ export { buildC4Systems } from "./c4-systems.js";
42
+ export type { C4SystemsBuildInputs } from "./c4-systems.js";
43
+ export { buildC4Containers } from "./c4-containers.js";
44
+ export type { C4ContainersBuildInputs } from "./c4-containers.js";
45
+ export { buildPersonas } from "./personas.js";
46
+ export type { PersonasBuildInputs, PersonasBuildResult, } from "./personas.js";
47
+ export { buildUserJourneys } from "./user-journeys.js";
48
+ export type { UserJourneysBuildInputs, UserJourneysBuildResult, } from "./user-journeys.js";
49
+ export { buildPersonaJourney, buildPersonaFeature, buildJourneyFeature, } from "./persona-journey-edges.js";
50
+ export type { PersonaJourneyEdgeInputs, PersonaFeatureEdgeInputs, JourneyFeatureEdgeInputs, } from "./persona-journey-edges.js";
51
+ export { buildProductEdges } from "./product-edges.js";
52
+ export type { ProductEdgesInputs, ProductEdgesResult, } from "./product-edges.js";
53
+ export { buildIntegrations } from "./integrations.js";
54
+ export type { IntegrationsBuildInputs } from "./integrations.js";
55
+ export { buildCapabilityService, buildCapabilityAdr, buildCapabilityFeature, buildCapabilityContract, } from "./capability-edges.js";
56
+ export type { CapabilityServiceInputs, CapabilityAdrInputs, CapabilityFeatureInputs, CapabilityContractInputs, } from "./capability-edges.js";
57
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Re-exports for the per-source row discoverers used by the canonical
3
+ * `sdd-cli catalogue build` orchestrator.
4
+ *
5
+ * Each builder is responsible for exactly one node catalogue (or a small
6
+ * tightly-coupled group when reading the same source). The orchestrator
7
+ * in build.ts composes them with a deterministic order.
8
+ */
9
+ export { buildDomains } from "./domains.js";
10
+ export { buildProducts } from "./products.js";
11
+ export { buildRepositories } from "./repositories.js";
12
+ export { buildServices } from "./services.js";
13
+ export { buildAdrs } from "./adrs.js";
14
+ export { buildAdrSupersedes } from "./adr-supersedes.js";
15
+ export { buildFeatures } from "./features.js";
16
+ export { buildFeatureGroups } from "./feature-groups.js";
17
+ export { buildContracts } from "./contracts.js";
18
+ export { buildRepoEdges } from "./repo-edges.js";
19
+ export { buildEvents } from "./events.js";
20
+ export { buildServiceEvent, buildCapabilityEvent } from "./event-edges.js";
21
+ export { buildServiceContract } from "./service-contract.js";
22
+ export { buildGlossaryItems } from "./glossary.js";
23
+ export { buildGlossaryXref } from "./glossary-xref.js";
24
+ export { buildCapabilities } from "./capabilities.js";
25
+ export { buildC4Systems } from "./c4-systems.js";
26
+ export { buildC4Containers } from "./c4-containers.js";
27
+ export { buildPersonas } from "./personas.js";
28
+ export { buildUserJourneys } from "./user-journeys.js";
29
+ export { buildPersonaJourney, buildPersonaFeature, buildJourneyFeature, } from "./persona-journey-edges.js";
30
+ export { buildProductEdges } from "./product-edges.js";
31
+ export { buildIntegrations } from "./integrations.js";
32
+ export { buildCapabilityService, buildCapabilityAdr, buildCapabilityFeature, buildCapabilityContract, } from "./capability-edges.js";
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM1C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAK3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAKnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ import type { Profile } from "../manifest-loader.js";
4
+ export interface IntegrationsBuildInputs {
5
+ readonly sddPath: string;
6
+ readonly findings: FindingsLog;
7
+ readonly profile: Profile;
8
+ readonly sddId: string;
9
+ readonly repoCount: number;
10
+ }
11
+ export declare function buildIntegrations(inputs: IntegrationsBuildInputs): Promise<CatalogueRow[]>;
12
+ //# sourceMappingURL=integrations.d.ts.map