@sdd-method/sdd-cli 0.9.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 (182) 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/init/index.d.ts.map +1 -1
  166. package/dist/lib/init/index.js +6 -0
  167. package/dist/lib/init/index.js.map +1 -1
  168. package/dist/lib/mcp/build-info.d.ts +1 -1
  169. package/dist/lib/mcp/build-info.d.ts.map +1 -1
  170. package/dist/lib/mcp/build-info.js +1 -1
  171. package/dist/lib/mcp/build-info.js.map +1 -1
  172. package/dist/lib/repo-kind.d.ts +3 -3
  173. package/dist/lib/repo-kind.d.ts.map +1 -1
  174. package/dist/lib/repo-kind.js +4 -0
  175. package/dist/lib/repo-kind.js.map +1 -1
  176. package/dist/verbs/catalogue.d.ts +3 -0
  177. package/dist/verbs/catalogue.d.ts.map +1 -0
  178. package/dist/verbs/catalogue.js +60 -0
  179. package/dist/verbs/catalogue.js.map +1 -0
  180. package/package.json +3 -3
  181. package/scripts/copy-yaml-assets.mjs +38 -0
  182. package/scripts/sync-canonical-schema.sh +39 -0
@@ -0,0 +1,191 @@
1
+ // ADR discoverer — emits `adrs.csv` rows from every `adr/*.md` file
2
+ // under `docs/`.
3
+ //
4
+ // Source paths discovered:
5
+ // - docs/platform/adr/ADR XXXX: Title.md (platform-scoped)
6
+ // - docs/method/adr/ADR XXXX: Title.md (method-scoped → domain_id=platform)
7
+ // - docs/domains/<domain>/architecture/adr/ADR XXXX: Title.md
8
+ //
9
+ // Per ADR 0136 the method-scope ADRs are owned by the platform-root in
10
+ // the federation chain (the highest-up SDD that holds them via the seed-
11
+ // file distribution). App and integration profile SDDs skip emission of
12
+ // method-scope ADRs so the aggregated catalogue carries each method ADR
13
+ // exactly once with an unambiguous source_sdd_id.
14
+ //
15
+ // File-content extraction (best-effort, no failure on missing fields):
16
+ // - **Status:** value
17
+ // - **Date:** YYYY-MM-DD
18
+ // - **Supersedes:** raw text (captured into supersedes_raw for the
19
+ // adr_supersedes builder to parse)
20
+ //
21
+ // ID canonicalisation: filename stem `ADR XXXX[: Title]` → `ADR-{0-padded}`.
22
+ // Title = the portion after the colon when present, else the file stem
23
+ // minus the prefix.
24
+ import { readdir, readFile, stat } from "node:fs/promises";
25
+ import { join, relative, sep } from "node:path";
26
+ const PROFILES_THAT_OWN_METHOD_SCOPE = new Set([
27
+ "platform-profile",
28
+ ]);
29
+ const FILENAME_RE = /^ADR[\s-]?(\d{3,4})(?:[:\s-]+(.*))?$/i;
30
+ export async function buildAdrs(inputs) {
31
+ const docsDir = join(inputs.sddPath, "docs");
32
+ const files = await collectAdrFiles(docsDir);
33
+ const seen = new Set();
34
+ const parsed = [];
35
+ const ownsMethodScope = PROFILES_THAT_OWN_METHOD_SCOPE.has(inputs.profile);
36
+ let methodScopeSkipCount = 0;
37
+ for (const file of files.sort()) {
38
+ const stem = baseStem(file);
39
+ const m = FILENAME_RE.exec(stem);
40
+ if (!m || m[1] === undefined) {
41
+ // Template file (e.g. `ADR {0000}: ...`) or non-ADR markdown — skip silently.
42
+ continue;
43
+ }
44
+ const num = parseInt(m[1], 10);
45
+ if (!Number.isFinite(num))
46
+ continue;
47
+ const adrId = `ADR-${String(num).padStart(4, "0")}`;
48
+ if (seen.has(adrId)) {
49
+ inputs.findings.add("divergence", `${relative(inputs.sddPath, file)}: ADR id ${adrId} already emitted by an earlier file`);
50
+ continue;
51
+ }
52
+ const relPath = relative(inputs.sddPath, file);
53
+ const { domainId, scope } = scopeFromPath(relPath);
54
+ if ((scope === "method" || scope === "platform") && !ownsMethodScope) {
55
+ // Per ADR 0136: method- and platform-scope ADRs are emitted only by
56
+ // the SDD that owns the platform scope (platform-profile in
57
+ // adopting ecosystems). App and integration SDDs hold seed-file
58
+ // copies on disk but do not contribute them to the federated
59
+ // catalogue.
60
+ methodScopeSkipCount++;
61
+ continue;
62
+ }
63
+ seen.add(adrId);
64
+ const titleFromFilename = (m[2] ?? "").trim() || stem;
65
+ const text = await readFile(file, "utf-8");
66
+ const title = extractH1Title(text) || titleFromFilename;
67
+ const status = extractField(text, "Status") || "Accepted";
68
+ const decisionDate = extractField(text, "Date") || "";
69
+ const supersedesRaw = extractField(text, "Supersedes") || "";
70
+ if (scope === "domain" && !inputs.knownDomainIds.has(domainId)) {
71
+ inputs.findings.add("orphan", `${relPath}: ADR is in domain "${domainId}" but no docs/domains/${domainId}/ exists`);
72
+ }
73
+ if (scope === "method") {
74
+ // Method ADRs are method-cross-cutting; conventionally bound to the
75
+ // platform domain for FK resolution.
76
+ inputs.findings.add("inferred", `${relPath}: method-scoped ADR ${adrId} bound to domain_id=platform for FK resolution`);
77
+ }
78
+ parsed.push({
79
+ id: adrId,
80
+ title,
81
+ status,
82
+ domainId,
83
+ decisionDate,
84
+ docPath: relPath,
85
+ supersedesRaw,
86
+ });
87
+ }
88
+ if (methodScopeSkipCount > 0) {
89
+ inputs.findings.add("coverage", `${methodScopeSkipCount} method/platform-scope ADR(s) skipped — emitted by ecosystem root only per ADR 0136`);
90
+ }
91
+ const rows = parsed.map((a) => ({
92
+ id: a.id,
93
+ title: a.title,
94
+ status: a.status,
95
+ domain_id: a.domainId,
96
+ decision_date: a.decisionDate,
97
+ doc_path: a.docPath,
98
+ superseded_by_id: "", // populated in a backfill pass after adr_supersedes builds
99
+ inference_confidence: "",
100
+ supersedes_raw: a.supersedesRaw,
101
+ source_sdd_id: "",
102
+ }));
103
+ return { rows, parsed };
104
+ }
105
+ function baseStem(absPath) {
106
+ const base = absPath.split(sep).slice(-1)[0] ?? "";
107
+ return base.replace(/\.md$/i, "");
108
+ }
109
+ function scopeFromPath(relPath) {
110
+ const parts = relPath.split(sep);
111
+ const domainsIdx = parts.indexOf("domains");
112
+ if (domainsIdx !== -1 && domainsIdx + 1 < parts.length) {
113
+ return { domainId: parts[domainsIdx + 1] ?? "", scope: "domain" };
114
+ }
115
+ if (parts.includes("method")) {
116
+ return { domainId: "platform", scope: "method" };
117
+ }
118
+ return { domainId: "platform", scope: "platform" };
119
+ }
120
+ function extractH1Title(text) {
121
+ for (const line of text.split(/\r?\n/)) {
122
+ const t = line.trim();
123
+ if (t === "")
124
+ continue;
125
+ if (!t.startsWith("#"))
126
+ return "";
127
+ // `# ADR 0001: Title` → `Title`; otherwise return the heading text.
128
+ const stripped = t.replace(/^#+\s*/, "").trim();
129
+ const adrPrefix = /^ADR[\s-]?\d+(?:[:\s-]+(.*))?$/i.exec(stripped);
130
+ if (adrPrefix) {
131
+ return (adrPrefix[1] ?? "").trim();
132
+ }
133
+ return stripped;
134
+ }
135
+ return "";
136
+ }
137
+ /**
138
+ * Extract a value from a metadata bullet of the form:
139
+ * * **Field:** value
140
+ * - **Field:** value
141
+ * **Field:** value
142
+ * Returns the trimmed value, or empty string if not found.
143
+ */
144
+ function extractField(text, field) {
145
+ const re = new RegExp(`^\\s*[*\\-]?\\s*\\*\\*${escapeRegex(field)}:\\*\\*\\s*(.*?)\\s*$`, "im");
146
+ const m = re.exec(text);
147
+ if (!m || m[1] === undefined)
148
+ return "";
149
+ return m[1].trim();
150
+ }
151
+ function escapeRegex(s) {
152
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
153
+ }
154
+ async function collectAdrFiles(docsDir) {
155
+ const out = [];
156
+ let entries;
157
+ try {
158
+ entries = await readdir(docsDir, { withFileTypes: true });
159
+ }
160
+ catch (err) {
161
+ const code = err.code;
162
+ if (code === "ENOENT")
163
+ return [];
164
+ throw err;
165
+ }
166
+ for (const entry of entries) {
167
+ const full = join(docsDir, entry.name);
168
+ if (entry.isDirectory()) {
169
+ if (entry.name === "adr") {
170
+ // Walk all files in the adr/ directory (no nesting expected).
171
+ const inner = await readdir(full, { withFileTypes: true });
172
+ for (const f of inner) {
173
+ if (f.isFile() && f.name.endsWith(".md") && !isTemplate(f.name)) {
174
+ out.push(join(full, f.name));
175
+ }
176
+ }
177
+ }
178
+ else {
179
+ out.push(...(await collectAdrFiles(full)));
180
+ }
181
+ }
182
+ }
183
+ return out;
184
+ }
185
+ function isTemplate(filename) {
186
+ // Excludes template files like `ADR {0000}: {Short, Descriptive Title}.md`.
187
+ return /[{}]/.test(filename);
188
+ }
189
+ /** Drop-in stat used during testing — unused at runtime but kept exported for symmetry. */
190
+ export const _statForTest = stat;
191
+ //# sourceMappingURL=adrs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adrs.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/adrs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ import type { SddManifest } from "../manifest-loader.js";
4
+ export interface C4ContainersBuildInputs {
5
+ readonly sddPath: string;
6
+ readonly manifest: SddManifest;
7
+ readonly findings: FindingsLog;
8
+ /** known c4_systems ids — for single-system ecosystems, a one-element set. */
9
+ readonly knownSystemIds: ReadonlySet<string>;
10
+ /** known service ids — for opportunistic service_id matching. */
11
+ readonly knownServiceIds: ReadonlySet<string>;
12
+ /** known domain ids — guards the denormalised domain_id column. */
13
+ readonly knownDomainIds: ReadonlySet<string>;
14
+ }
15
+ export declare function buildC4Containers(inputs: C4ContainersBuildInputs): Promise<CatalogueRow[]>;
16
+ //# sourceMappingURL=c4-containers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c4-containers.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/c4-containers.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,iEAAiE;IACjE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,mEAAmE;IACnE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC9C;AA+BD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,YAAY,EAAE,CAAC,CAsDzB"}
@@ -0,0 +1,169 @@
1
+ // C4 L2 containers discoverer — emits `c4_containers.csv` rows from
2
+ // C4-PlantUML-style mermaid in:
3
+ // - docs/domains/<slug>/architecture/diagrams/c4-l2-container.mermaid.md
4
+ // - docs/platform/diagrams/c4-l2-container.mermaid.md
5
+ //
6
+ // Per schema 2.0.0:
7
+ // - system_id (required FK to c4_systems.id) — for single-system
8
+ // ecosystems we use {sddId}-system. Multi-system support (parsing a
9
+ // `**System:** <id>` metadata line) is a future hook.
10
+ // - domain_id (nullable, denormalised) derived from the L2 file path:
11
+ // docs/domains/<slug>/... → <slug>; platform-wide L2 → empty.
12
+ // - service_id (optional) — opportunistic match on the C4 entry's id
13
+ // or a slug of its display name to a known service id.
14
+ //
15
+ // We only consider entries inside System_Boundary or Container_Boundary
16
+ // blocks — mirrors the python reference and excludes Person/System_Ext
17
+ // declarations that decorate the diagram.
18
+ //
19
+ // Dedupe is by row id; first-seen wins (a container appearing in
20
+ // multiple L2 files becomes one row).
21
+ import { readdir, readFile, stat } from "node:fs/promises";
22
+ import { join, sep } from "node:path";
23
+ const L2_BASENAME = "c4-l2-container.mermaid.md";
24
+ // Boundary opener: `System_Boundary(id, "name") {` or `Container_Boundary(...)`.
25
+ const BOUNDARY_OPEN_RE = /^(System_Boundary|Container_Boundary)\s*\(\s*\w+/;
26
+ // C4-PlantUML container entries inside boundaries.
27
+ // Container(id, "name", "tech", "desc")
28
+ // ContainerDb(id, "name", "tech", "desc")
29
+ // ContainerQueue(id, "name", "tech", "desc")
30
+ // Container_Ext(id, "name", "tech", "desc")
31
+ const ENTRY_RE = /(Container|ContainerDb|ContainerQueue|Container_Ext)\s*\(\s*(\w+)\s*,\s*"([^"]+)"\s*(?:,\s*"([^"]*)")?\s*(?:,\s*"([^"]*)")?\s*\)/;
32
+ const TYPE_BY_KIND = {
33
+ Container: "Application",
34
+ ContainerDb: "Data Store",
35
+ ContainerQueue: "Infrastructure",
36
+ Container_Ext: "External System",
37
+ };
38
+ export async function buildC4Containers(inputs) {
39
+ const systemId = `${inputs.manifest.sddId}-system`;
40
+ if (!inputs.knownSystemIds.has(systemId)) {
41
+ // Non-architectural SDD — c4-systems emitted no row, so no FK target
42
+ // exists. Skip silently; c4-systems already logged the situation.
43
+ return [];
44
+ }
45
+ const files = await collectL2Files(inputs.sddPath);
46
+ const rows = [];
47
+ const seen = new Set();
48
+ for (const file of files) {
49
+ const content = await readFile(file.absPath, "utf-8");
50
+ for (const entry of parseBoundaryEntries(content)) {
51
+ const slug = slugify(entry.name);
52
+ if (slug === "")
53
+ continue;
54
+ const id = `${systemId}-${slug}`;
55
+ if (seen.has(id))
56
+ continue;
57
+ seen.add(id);
58
+ const serviceId = inputs.knownServiceIds.has(entry.entryId)
59
+ ? entry.entryId
60
+ : inputs.knownServiceIds.has(slug)
61
+ ? slug
62
+ : "";
63
+ const domainId = file.domainId !== "" && inputs.knownDomainIds.has(file.domainId)
64
+ ? file.domainId
65
+ : "";
66
+ if (file.domainId !== "" && domainId === "") {
67
+ inputs.findings.add("orphan", `c4_containers: L2 file at ${file.relPath} references unknown domain "${file.domainId}" — domain_id left empty`);
68
+ }
69
+ rows.push({
70
+ id,
71
+ name: entry.name,
72
+ system_id: systemId,
73
+ domain_id: domainId,
74
+ service_id: serviceId,
75
+ type: TYPE_BY_KIND[entry.kind] ?? "",
76
+ technology: entry.technology,
77
+ description: entry.description,
78
+ source_sdd_id: "",
79
+ });
80
+ }
81
+ }
82
+ rows.sort((a, b) => String(a["id"]).localeCompare(String(b["id"])));
83
+ return rows;
84
+ }
85
+ async function collectL2Files(sddPath) {
86
+ const out = [];
87
+ // 1. Per-domain L2 files.
88
+ const domainsDir = join(sddPath, "docs", "domains");
89
+ let domainEntries;
90
+ try {
91
+ domainEntries = (await readdir(domainsDir, { withFileTypes: true }))
92
+ .filter((e) => e.isDirectory())
93
+ .map((e) => ({ name: e.name }));
94
+ }
95
+ catch (err) {
96
+ if (err.code !== "ENOENT")
97
+ throw err;
98
+ domainEntries = [];
99
+ }
100
+ for (const entry of domainEntries.sort((a, b) => a.name.localeCompare(b.name))) {
101
+ const rel = join("docs", "domains", entry.name, "architecture", "diagrams", L2_BASENAME);
102
+ const abs = join(sddPath, rel);
103
+ if (await isFile(abs)) {
104
+ out.push({
105
+ absPath: abs,
106
+ relPath: rel.split(sep).join("/"),
107
+ domainId: entry.name,
108
+ });
109
+ }
110
+ }
111
+ // 2. Platform-wide L2.
112
+ const platformRel = join("docs", "platform", "diagrams", L2_BASENAME);
113
+ const platformAbs = join(sddPath, platformRel);
114
+ if (await isFile(platformAbs)) {
115
+ out.push({
116
+ absPath: platformAbs,
117
+ relPath: platformRel.split(sep).join("/"),
118
+ domainId: "",
119
+ });
120
+ }
121
+ return out;
122
+ }
123
+ async function isFile(path) {
124
+ try {
125
+ const s = await stat(path);
126
+ return s.isFile();
127
+ }
128
+ catch (err) {
129
+ if (err.code === "ENOENT")
130
+ return false;
131
+ throw err;
132
+ }
133
+ }
134
+ function parseBoundaryEntries(content) {
135
+ const out = [];
136
+ const stack = [];
137
+ for (const raw of content.split(/\r?\n/)) {
138
+ const line = raw.trim();
139
+ if (BOUNDARY_OPEN_RE.test(line) && line.includes("{")) {
140
+ stack.push("boundary");
141
+ continue;
142
+ }
143
+ if (line === "}" && stack.length > 0) {
144
+ stack.pop();
145
+ continue;
146
+ }
147
+ if (stack.length === 0)
148
+ continue;
149
+ const m = ENTRY_RE.exec(line);
150
+ if (!m)
151
+ continue;
152
+ out.push({
153
+ kind: m[1] ?? "",
154
+ entryId: m[2] ?? "",
155
+ name: m[3] ?? "",
156
+ technology: m[4] ?? "",
157
+ description: m[5] ?? "",
158
+ });
159
+ }
160
+ return out;
161
+ }
162
+ function slugify(s) {
163
+ return s
164
+ .toLowerCase()
165
+ .replace(/\s*\([^)]+\)/g, "")
166
+ .replace(/[^a-z0-9]+/g, "-")
167
+ .replace(/^-+|-+$/g, "");
168
+ }
169
+ //# sourceMappingURL=c4-containers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c4-containers.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/c4-containers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ import type { SddManifest } from "../manifest-loader.js";
4
+ export interface C4SystemsBuildInputs {
5
+ readonly sddPath: string;
6
+ readonly manifest: SddManifest;
7
+ readonly findings: FindingsLog;
8
+ }
9
+ export declare function buildC4Systems(inputs: C4SystemsBuildInputs): Promise<CatalogueRow[]>;
10
+ //# sourceMappingURL=c4-systems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c4-systems.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/c4-systems.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAqBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,YAAY,EAAE,CAAC,CAgCzB"}
@@ -0,0 +1,99 @@
1
+ // C4 L1 systems discoverer — emits at most one `c4_systems.csv` row.
2
+ //
3
+ // Per ADR 0134's federation model, each SDD emits its OWN c4_systems
4
+ // row when its manifest category is architectural. Categories map to
5
+ // the c4_system_kind enum (catalogue-schema.yaml):
6
+ // platform-root → platform
7
+ // application-product → application
8
+ // integration-provider → integration
9
+ // Non-architectural categories (platform-subsystem, integration-umbrella,
10
+ // support-repo) emit zero rows.
11
+ //
12
+ // The id is `{sddId}-system` to match the products row's product_id FK.
13
+ // Description is parsed from the L1 mermaid `System(...)` line when a
14
+ // platform L1 file exists, otherwise left empty (visible coverage gap).
15
+ import { readFile, stat } from "node:fs/promises";
16
+ import { join } from "node:path";
17
+ const KIND_BY_CATEGORY = {
18
+ "platform-root": "platform",
19
+ "application-product": "application",
20
+ "integration-provider": "integration",
21
+ };
22
+ // L1 candidate paths in priority order. First existing file wins.
23
+ const L1_CANDIDATES = [
24
+ "docs/platform/diagrams/c4-l1-context.mermaid.md",
25
+ "docs/diagrams/c4-l1-context.mermaid.md",
26
+ "docs/application/c4-l1.md",
27
+ "docs/c4-l1.md",
28
+ ];
29
+ // Match `System(id, "name", "description")` — the L1 root-system entry.
30
+ // Permissive about whitespace and the optional description argument.
31
+ const SYSTEM_RE = /^System\s*\(\s*\w+\s*,\s*"([^"]+)"\s*(?:,\s*"([^"]*)")?\s*\)/;
32
+ export async function buildC4Systems(inputs) {
33
+ const kind = KIND_BY_CATEGORY[inputs.manifest.category];
34
+ if (kind === undefined) {
35
+ // Non-architectural — emit zero rows by design (no finding; the
36
+ // metamodel says these categories never have a system row).
37
+ return [];
38
+ }
39
+ const { diagramPath, name, description } = await findL1(inputs.sddPath, inputs.manifest.sddId);
40
+ if (diagramPath === "") {
41
+ inputs.findings.add("coverage", `c4_systems: no L1 diagram found for ${inputs.manifest.sddId} — diagram_path empty`);
42
+ }
43
+ const sddId = inputs.manifest.sddId;
44
+ return [
45
+ {
46
+ id: `${sddId}-system`,
47
+ name: name !== "" ? name : titleCase(sddId),
48
+ product_id: sddId,
49
+ kind,
50
+ diagram_path: diagramPath,
51
+ description,
52
+ source_sdd_id: "",
53
+ },
54
+ ];
55
+ }
56
+ async function findL1(sddPath, sddId) {
57
+ for (const rel of L1_CANDIDATES) {
58
+ const abs = join(sddPath, rel);
59
+ try {
60
+ const s = await stat(abs);
61
+ if (!s.isFile())
62
+ continue;
63
+ const content = await readFile(abs, "utf-8");
64
+ const parsed = parseSystemLine(content);
65
+ return {
66
+ diagramPath: rel,
67
+ name: parsed?.name ?? "",
68
+ description: parsed?.description ?? "",
69
+ };
70
+ }
71
+ catch (err) {
72
+ const code = err.code;
73
+ if (code !== "ENOENT")
74
+ throw err;
75
+ }
76
+ }
77
+ void sddId;
78
+ return { diagramPath: "", name: "", description: "" };
79
+ }
80
+ function parseSystemLine(content) {
81
+ for (const raw of content.split(/\r?\n/)) {
82
+ const line = raw.trim();
83
+ if (line.startsWith("System_Ext") || line.startsWith("System_Boundary")) {
84
+ continue;
85
+ }
86
+ const m = SYSTEM_RE.exec(line);
87
+ if (m) {
88
+ return { name: m[1] ?? "", description: m[2] ?? "" };
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ function titleCase(slug) {
94
+ return slug
95
+ .split("-")
96
+ .map((p) => (p.length === 0 ? p : p[0].toUpperCase() + p.slice(1)))
97
+ .join(" ");
98
+ }
99
+ //# sourceMappingURL=c4-systems.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c4-systems.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/c4-systems.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
+ import type { TraceabilityManifest } from "../traceability-loader.js";
4
+ export interface CapabilitiesBuildInputs {
5
+ readonly sddPath: string;
6
+ readonly findings: FindingsLog;
7
+ readonly manifests: readonly TraceabilityManifest[];
8
+ readonly knownDomainIds: ReadonlySet<string>;
9
+ }
10
+ export declare function buildCapabilities(inputs: CapabilitiesBuildInputs): Promise<CatalogueRow[]>;
11
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/capabilities.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGtE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACpD,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC9C;AAID,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,YAAY,EAAE,CAAC,CA8FzB"}