@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,373 @@
1
+ /**
2
+ * Per-SDD catalogue builder — `sdd-cli catalogue build` orchestrator.
3
+ *
4
+ * Per ADR 0134 §4.6, the canonical builder reads method-defined declarative
5
+ * inputs and emits `catalogues/*.csv` matching the canonical schema.
6
+ *
7
+ * This is Phase 1 of the canonical-builder implementation per
8
+ * adopt-canonical-catalogue-builder.md Step F. Phase 1 ships:
9
+ * - manifest loading + schema-version compat check,
10
+ * - schema loading,
11
+ * - headers-only emission for every catalogue declared in the schema,
12
+ * - internal FK validation,
13
+ * - findings + row-count reporting.
14
+ *
15
+ * Per-source discoverers (domains, repos, services, capabilities, features,
16
+ * etc.) land in subsequent phases. Until then the builder produces a valid
17
+ * but empty `catalogues/` directory — useful as a smoke test that the
18
+ * infrastructure works end-to-end on any SDD repo.
19
+ */
20
+ import { join, resolve } from "node:path";
21
+ import { CLI_VERSION } from "./cli-version.js";
22
+ import { loadCanonicalSchema } from "./schema-loader.js";
23
+ import { loadSddManifest } from "./manifest-loader.js";
24
+ import { writeCatalogue } from "./csv-writer.js";
25
+ import { validateForeignKeys } from "./fk-validator.js";
26
+ import { FindingsLog } from "./findings.js";
27
+ import { buildDomains, buildProducts, buildRepositories, buildServices, buildCapabilities, buildCapabilityService, buildCapabilityAdr, buildCapabilityFeature, buildCapabilityContract, buildAdrs, buildAdrSupersedes, buildFeatures, buildFeatureGroups, buildContracts, buildRepoEdges, buildEvents, buildServiceEvent, buildCapabilityEvent, buildServiceContract, buildGlossaryItems, buildGlossaryXref, buildC4Systems, buildC4Containers, buildPersonas, buildUserJourneys, buildPersonaJourney, buildPersonaFeature, buildJourneyFeature, buildProductEdges, buildIntegrations, } from "./builders/index.js";
28
+ import { loadTraceabilityManifests } from "./traceability-loader.js";
29
+ export async function runCatalogueBuild(inputs, write) {
30
+ const sddPath = resolve(inputs.sddPath ?? process.cwd());
31
+ const outDir = resolve(inputs.outDir ?? join(sddPath, "catalogues"));
32
+ // 1. Load canonical schema.
33
+ const schema = await loadCanonicalSchema();
34
+ write(`sdd-cli catalogue build (canonical schema ${schema.schemaVersion})\n`);
35
+ // 2. Load SDD manifest + compat check.
36
+ const manifest = await loadSddManifest(sddPath, { cliVersion: CLI_VERSION });
37
+ write(` sdd_id: ${manifest.sddId} profile: ${manifest.profile} category: ${manifest.category}\n`);
38
+ // 3. Build per-catalogue rows via discoverers.
39
+ const findings = new FindingsLog();
40
+ const rowsByCatalogue = await collectRows(schema, manifest, findings, sddPath);
41
+ // 4. Write CSVs (headers + rows).
42
+ const rowCounts = new Map();
43
+ for (const cat of schema.catalogues) {
44
+ const rows = rowsByCatalogue.get(cat.name) ?? [];
45
+ const result = await writeCatalogue({ outDir, catalogue: cat, rows });
46
+ rowCounts.set(cat.name, result.rowCount);
47
+ }
48
+ // 5. Internal FK validation (external FKs logged as findings).
49
+ const fk = validateForeignKeys(schema, rowsByCatalogue, findings);
50
+ // 6. Report.
51
+ write("\nRow counts:\n");
52
+ for (const [name, count] of rowCounts) {
53
+ if (count > 0)
54
+ write(` ${name}: ${count}\n`);
55
+ }
56
+ const emptyCount = [...rowCounts.values()].filter((c) => c === 0).length;
57
+ write(` (${emptyCount} headers-only)\n`);
58
+ const findingsText = findings.render();
59
+ if (findingsText) {
60
+ write(`\n${findingsText}\n`);
61
+ }
62
+ if (fk.internalPass) {
63
+ write(`\nFK validation (internal): PASS\n`);
64
+ }
65
+ else {
66
+ write(`\nFK validation (internal): FAIL (${fk.internalFailures.length} dangling)\n`);
67
+ for (const f of fk.internalFailures) {
68
+ write(` ${f.catalogue}.${f.column}: row pk=${f.referencingRow} → ${f.target}=${f.value || "<empty>"}\n`);
69
+ }
70
+ }
71
+ write(`External findings: ${fk.externalFindings} (validated by aggregator)\n`);
72
+ const strictFail = inputs.strict === true && findings.count() > 0;
73
+ const exitCode = !fk.internalPass || strictFail ? 1 : 0;
74
+ return {
75
+ exitCode,
76
+ schemaVersion: schema.schemaVersion,
77
+ sddId: manifest.sddId,
78
+ profile: manifest.profile,
79
+ category: manifest.category,
80
+ rowCounts,
81
+ internalFkPass: fk.internalPass,
82
+ externalFindings: fk.externalFindings,
83
+ findingsCount: findings.count(),
84
+ outDir,
85
+ };
86
+ }
87
+ /**
88
+ * Collect rows per catalogue. Each per-source discoverer populates one
89
+ * (or a small group) of catalogues; everything else stays headers-only
90
+ * until later phases land their builders.
91
+ *
92
+ * Order matters for catalogues that depend on each other:
93
+ * 1. domains (from docs/domains/*) — populates known-domain set
94
+ * 2. repositories (from orchestration/repo-config) — needs the domain
95
+ * set + the SDD's product_id
96
+ * 3. products (from manifest) — needs repo_count and a domain that
97
+ * resolves
98
+ * 4. final pass: backfill domains.repo_count from the discovered repos
99
+ */
100
+ async function collectRows(schema, manifest, findings, sddPath) {
101
+ const out = new Map();
102
+ for (const cat of schema.catalogues) {
103
+ out.set(cat.name, []);
104
+ }
105
+ // 1. Domains — pure filesystem read, no dependencies.
106
+ const domains = await buildDomains({ sddPath, manifest, findings });
107
+ out.set("domains", domains);
108
+ const knownDomainIds = new Set(domains.map((d) => String(d["id"])));
109
+ // 2. Repositories — needs domain set + the SDD's product_id (= sddId).
110
+ const reposResult = await buildRepositories({
111
+ sddPath,
112
+ manifest,
113
+ schema,
114
+ findings,
115
+ knownDomainIds,
116
+ productId: manifest.sddId,
117
+ });
118
+ const repos = reposResult.rows;
119
+ out.set("repositories", repos);
120
+ // 3. Products — emits ONE row for this SDD, with repo_count from above.
121
+ const products = buildProducts({
122
+ manifest,
123
+ repoCount: repos.length,
124
+ findings,
125
+ });
126
+ out.set("products", products);
127
+ // `applications.csv` is a filtered view: profile=application-product.
128
+ out.set("applications", products.filter((p) => p["profile"] === "application-product"));
129
+ // 4. Backfill domains.repo_count from repos.
130
+ if (domains.length > 0) {
131
+ const repoCountByDomain = new Map();
132
+ for (const r of repos) {
133
+ const d = String(r["domain_id"] ?? "");
134
+ if (d === "")
135
+ continue;
136
+ repoCountByDomain.set(d, (repoCountByDomain.get(d) ?? 0) + 1);
137
+ }
138
+ out.set("domains", domains.map((d) => ({
139
+ ...d,
140
+ repo_count: repoCountByDomain.get(String(d["id"])) ?? 0,
141
+ })));
142
+ }
143
+ // 5. Services derived 1:1 from runtime-typed repositories.
144
+ const services = buildServices({
145
+ schema,
146
+ manifest,
147
+ findings,
148
+ repositories: repos,
149
+ productId: manifest.sddId,
150
+ });
151
+ out.set("services", services);
152
+ // 6. ADRs + adr_supersedes — runs before capabilities edges so
153
+ // capability_adr can resolve.
154
+ const adrResult = await buildAdrs({
155
+ sddPath,
156
+ findings,
157
+ knownDomainIds,
158
+ profile: manifest.profile,
159
+ });
160
+ const supersedes = buildAdrSupersedes({ findings, adrs: adrResult.parsed });
161
+ out.set("adr_supersedes", supersedes.rows);
162
+ // Backfill `superseded_by_id` on adrs.csv from the edge index.
163
+ const adrsWithBackfill = adrResult.rows.map((row) => {
164
+ const id = String(row["id"]);
165
+ const supersededBy = supersedes.supersededByIndex.get(id);
166
+ if (supersededBy === undefined)
167
+ return row;
168
+ return { ...row, superseded_by_id: supersededBy };
169
+ });
170
+ out.set("adrs", adrsWithBackfill);
171
+ const knownAdrIds = new Set(adrResult.parsed.map((a) => a.id));
172
+ // 7. Capabilities + capability_* edges from traceability YAMLs.
173
+ const traceability = await loadTraceabilityManifests({ sddPath, findings });
174
+ const capabilities = await buildCapabilities({
175
+ sddPath,
176
+ findings,
177
+ manifests: traceability,
178
+ knownDomainIds,
179
+ });
180
+ out.set("capabilities", capabilities);
181
+ const knownCapabilityIds = new Set(capabilities.map((c) => String(c["id"])));
182
+ const knownServiceIds = new Set(services.map((s) => String(s["id"])));
183
+ out.set("capability_service", buildCapabilityService({
184
+ findings,
185
+ manifests: traceability,
186
+ knownCapabilityIds,
187
+ knownServiceIds,
188
+ }));
189
+ out.set("capability_adr", buildCapabilityAdr({
190
+ findings,
191
+ manifests: traceability,
192
+ knownCapabilityIds,
193
+ knownAdrIds,
194
+ }));
195
+ // 8. Features + feature_groups (per Q7.2 first-class groups).
196
+ const featureGroups = await buildFeatureGroups({
197
+ sddPath,
198
+ findings,
199
+ productId: manifest.sddId,
200
+ });
201
+ out.set("feature_groups", featureGroups);
202
+ const featuresResult = await buildFeatures({
203
+ sddPath,
204
+ findings,
205
+ manifests: traceability,
206
+ knownCapabilityIds,
207
+ profile: manifest.profile,
208
+ productId: manifest.sddId,
209
+ });
210
+ out.set("features", featuresResult.rows);
211
+ out.set("capability_feature", buildCapabilityFeature({
212
+ findings,
213
+ manifests: traceability,
214
+ knownCapabilityIds,
215
+ featureIdByPath: featuresResult.idByPath,
216
+ }));
217
+ // 9. Contracts + capability_contract edge.
218
+ const contractsResult = await buildContracts({
219
+ sddPath,
220
+ findings,
221
+ knownRepositoryIds: new Set(repos.map((r) => String(r["id"]))),
222
+ });
223
+ out.set("contracts", contractsResult.rows);
224
+ out.set("capability_contract", buildCapabilityContract({
225
+ findings,
226
+ manifests: traceability,
227
+ knownCapabilityIds,
228
+ contractIdByPath: contractsResult.idByPath,
229
+ }));
230
+ // 10. Repo edges — repo_capability, repo_contract (feature_repo empty).
231
+ const capabilityIdByPath = new Map();
232
+ for (const cap of capabilities) {
233
+ const sp = String(cap["spec_path"] ?? "");
234
+ if (sp !== "")
235
+ capabilityIdByPath.set(sp, String(cap["id"]));
236
+ }
237
+ const repoEdges = buildRepoEdges({
238
+ findings,
239
+ configs: reposResult.configs,
240
+ capabilityIdByPath,
241
+ contractIdByPath: contractsResult.idByPath,
242
+ });
243
+ out.set("repo_capability", repoEdges.repoCapability);
244
+ out.set("repo_contract", repoEdges.repoContract);
245
+ out.set("feature_repo", repoEdges.featureRepo);
246
+ // 11. Events + service_event + capability_event.
247
+ const avroContracts = contractsResult.rows.filter((c) => c["kind"] === "event");
248
+ const eventsResult = buildEvents({
249
+ findings,
250
+ avroContracts,
251
+ contractIdByPath: contractsResult.idByPath,
252
+ configs: reposResult.configs,
253
+ knownServiceIds,
254
+ knownDomainIds,
255
+ });
256
+ out.set("events", eventsResult.rows);
257
+ const knownEventIds = new Set(eventsResult.rows.map((e) => String(e["id"])));
258
+ out.set("service_event", buildServiceEvent({
259
+ findings,
260
+ configs: reposResult.configs,
261
+ contractIdByPath: contractsResult.idByPath,
262
+ knownServiceIds,
263
+ knownEventIds,
264
+ }));
265
+ out.set("capability_event", buildCapabilityEvent({
266
+ findings,
267
+ manifests: traceability,
268
+ knownCapabilityIds,
269
+ knownEventIds,
270
+ }));
271
+ // 12. service_contract — exposes-only role from repo-config contracts block.
272
+ out.set("service_contract", buildServiceContract({
273
+ findings,
274
+ configs: reposResult.configs,
275
+ contractIdByPath: contractsResult.idByPath,
276
+ knownServiceIds,
277
+ }));
278
+ // 13. App-product profile builders (personas, journeys, persona/journey
279
+ // edges, product-edges). Per ADR 0134, app-product SDDs emit these
280
+ // catalogues; other profiles emit zero rows. Per ADR 0136, product_*
281
+ // edges' capability_id and service_id are external FKs validated by
282
+ // the aggregator, not here.
283
+ const featureIdByPath = featuresResult.idByPath;
284
+ const featureIdBySlug = featuresResult.idBySlug;
285
+ const personasResult = await buildPersonas({
286
+ sddPath,
287
+ findings,
288
+ profile: manifest.profile,
289
+ productId: manifest.sddId,
290
+ });
291
+ out.set("personas", personasResult.rows);
292
+ const journeysResult = await buildUserJourneys({
293
+ sddPath,
294
+ findings,
295
+ profile: manifest.profile,
296
+ productId: manifest.sddId,
297
+ });
298
+ out.set("user_journeys", journeysResult.rows);
299
+ out.set("persona_journey", buildPersonaJourney({
300
+ findings,
301
+ personaIdByName: personasResult.idByName,
302
+ personaIdBySlug: personasResult.idBySlug,
303
+ journeyPrimaryPersonaById: journeysResult.primaryPersonaById,
304
+ journeySupportingPersonasById: journeysResult.supportingPersonasById,
305
+ }));
306
+ out.set("persona_feature", buildPersonaFeature({
307
+ findings,
308
+ relatedFeaturesById: personasResult.relatedFeaturesById,
309
+ featureIdByPath,
310
+ featureIdBySlug,
311
+ }));
312
+ out.set("journey_feature", buildJourneyFeature({
313
+ findings,
314
+ journeyFeaturePathsById: journeysResult.featurePathsById,
315
+ journeyRelatedFeatureSlugsById: journeysResult.relatedFeatureSlugsById,
316
+ featureIdByPath,
317
+ featureIdBySlug,
318
+ }));
319
+ const productEdges = await buildProductEdges({
320
+ sddPath,
321
+ findings,
322
+ profile: manifest.profile,
323
+ productId: manifest.sddId,
324
+ });
325
+ out.set("product_capability", productEdges.productCapability);
326
+ out.set("product_service", productEdges.productService);
327
+ // 14. Integration-product profile: emit one integrations.csv row per
328
+ // integration-provider SDD from `integration-manifest.yaml`.
329
+ const integrationsRows = await buildIntegrations({
330
+ sddPath,
331
+ findings,
332
+ profile: manifest.profile,
333
+ sddId: manifest.sddId,
334
+ repoCount: repos.length,
335
+ });
336
+ out.set("integrations", integrationsRows);
337
+ // 15. C4 systems + containers (L1 + L2). c4_components stays headers-only
338
+ // (Path B in resume-canonical-builder-phase-2.md): walking sibling code
339
+ // repos for components is adopter-specific and deferred.
340
+ const c4Systems = await buildC4Systems({
341
+ sddPath,
342
+ manifest,
343
+ findings,
344
+ });
345
+ out.set("c4_systems", c4Systems);
346
+ const knownSystemIds = new Set(c4Systems.map((r) => String(r["id"])));
347
+ const c4Containers = await buildC4Containers({
348
+ sddPath,
349
+ manifest,
350
+ findings,
351
+ knownSystemIds,
352
+ knownServiceIds,
353
+ knownDomainIds,
354
+ });
355
+ out.set("c4_containers", c4Containers);
356
+ // 16. Glossary items + cross-references.
357
+ const glossaryResult = await buildGlossaryItems({
358
+ sddPath,
359
+ findings,
360
+ knownDomainIds,
361
+ });
362
+ out.set("glossary_items", glossaryResult.rows);
363
+ const knownGlossaryIds = new Set(glossaryResult.rows.map((r) => String(r["id"])));
364
+ const xref = await buildGlossaryXref({
365
+ sddPath,
366
+ findings,
367
+ idByDomainTerm: glossaryResult.idByDomainTerm,
368
+ knownGlossaryIds,
369
+ });
370
+ out.set("glossary_xref", xref);
371
+ return out;
372
+ }
373
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/lib/catalogue/build.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
+ import type { ParsedAdr } from "./adrs.js";
4
+ export interface AdrSupersedesInputs {
5
+ readonly findings: FindingsLog;
6
+ readonly adrs: readonly ParsedAdr[];
7
+ }
8
+ export interface AdrSupersedesResult {
9
+ readonly rows: CatalogueRow[];
10
+ /** Map of superseded ADR id → superseding ADR id, for backfilling adrs.superseded_by_id. */
11
+ readonly supersededByIndex: ReadonlyMap<string, string>;
12
+ }
13
+ export declare function buildAdrSupersedes(inputs: AdrSupersedesInputs): AdrSupersedesResult;
14
+ //# sourceMappingURL=adr-supersedes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr-supersedes.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/adr-supersedes.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzD;AAID,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,mBAAmB,GAC1B,mBAAmB,CAwCrB"}
@@ -0,0 +1,62 @@
1
+ // adr_supersedes edge builder — emits one row per (superseding, superseded)
2
+ // ADR pair where the superseding ADR's `supersedes_raw` text references a
3
+ // known ADR id.
4
+ //
5
+ // Only rows where BOTH endpoints resolve to known ADR ids are emitted —
6
+ // the canonical schema's FKs on this edge are required+internal.
7
+ //
8
+ // Also computes the inverse (`superseded_by_id`) backfill values that the
9
+ // orchestrator stitches into adrs.csv after this builder runs.
10
+ const ADR_REF_RE = /\bADR[\s\-_]?(\d{3,4})\b/gi;
11
+ export function buildAdrSupersedes(inputs) {
12
+ const knownIds = new Set(inputs.adrs.map((a) => a.id));
13
+ const rows = [];
14
+ const seen = new Set();
15
+ const supersededByIndex = new Map();
16
+ for (const adr of inputs.adrs) {
17
+ if (adr.supersedesRaw === "")
18
+ continue;
19
+ const refs = extractAdrRefs(adr.supersedesRaw);
20
+ for (const supersededId of refs) {
21
+ if (supersededId === adr.id)
22
+ continue; // self-supersession is nonsense
23
+ if (!knownIds.has(supersededId)) {
24
+ inputs.findings.add("orphan", `${adr.docPath}: Supersedes references "${supersededId}" but no such ADR exists`);
25
+ continue;
26
+ }
27
+ const id = `${adr.id}__${supersededId}`;
28
+ if (seen.has(id))
29
+ continue;
30
+ seen.add(id);
31
+ rows.push({
32
+ id,
33
+ superseding_adr_id: adr.id,
34
+ superseded_adr_id: supersededId,
35
+ });
36
+ // Last writer wins on the inverse index — multiple superseders for
37
+ // the same ADR is rare; if it happens we surface a finding.
38
+ const prior = supersededByIndex.get(supersededId);
39
+ if (prior !== undefined && prior !== adr.id) {
40
+ inputs.findings.add("divergence", `ADR ${supersededId} is superseded by both ${prior} and ${adr.id}`);
41
+ }
42
+ supersededByIndex.set(supersededId, adr.id);
43
+ }
44
+ }
45
+ return { rows, supersededByIndex };
46
+ }
47
+ function extractAdrRefs(raw) {
48
+ const out = [];
49
+ let m;
50
+ // Reset regex state between calls.
51
+ ADR_REF_RE.lastIndex = 0;
52
+ while ((m = ADR_REF_RE.exec(raw)) !== null) {
53
+ if (m[1] === undefined)
54
+ continue;
55
+ const num = parseInt(m[1], 10);
56
+ if (!Number.isFinite(num))
57
+ continue;
58
+ out.push(`ADR-${String(num).padStart(4, "0")}`);
59
+ }
60
+ return out;
61
+ }
62
+ //# sourceMappingURL=adr-supersedes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr-supersedes.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/adr-supersedes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { stat } from "node:fs/promises";
2
+ import type { CatalogueRow } from "../csv-writer.js";
3
+ import type { FindingsLog } from "../findings.js";
4
+ import type { Profile } from "../manifest-loader.js";
5
+ export interface AdrsBuildInputs {
6
+ readonly sddPath: string;
7
+ readonly findings: FindingsLog;
8
+ readonly knownDomainIds: ReadonlySet<string>;
9
+ /** SDD profile — drives method-scope ownership per ADR 0136. */
10
+ readonly profile: Profile;
11
+ }
12
+ export interface ParsedAdr {
13
+ readonly id: string;
14
+ readonly title: string;
15
+ readonly status: string;
16
+ readonly domainId: string;
17
+ readonly decisionDate: string;
18
+ readonly docPath: string;
19
+ readonly supersedesRaw: string;
20
+ }
21
+ export declare function buildAdrs(inputs: AdrsBuildInputs): Promise<{
22
+ rows: CatalogueRow[];
23
+ parsed: readonly ParsedAdr[];
24
+ }>;
25
+ /** Drop-in stat used during testing — unused at runtime but kept exported for symmetry. */
26
+ export declare const _statForTest: typeof stat;
27
+ //# sourceMappingURL=adrs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adrs.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/adrs.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAqB,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAMD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAID,wBAAsB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC;IAChE,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;CAC9B,CAAC,CAiGD;AA6FD,2FAA2F;AAC3F,eAAO,MAAM,YAAY,aAAO,CAAC"}