@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,57 @@
1
+ /**
2
+ * Products discoverer — emits the SDD-as-Product row from the manifest.
3
+ *
4
+ * Per ADR 0134 + catalogue-metamodel.md: every SDD is one Product. The
5
+ * canonical builder emits ONE products.csv row per SDD — the SDD itself.
6
+ * Sibling SDDs (apps, integrations) get their own products.csv rows in
7
+ * their own builds; the aggregator merges by primary key.
8
+ *
9
+ * domain_id selection (per ADR 0136):
10
+ * - manifest.domainId when declared,
11
+ * - else a sensible default for platform-profile categories (where a
12
+ * real `platform` domain exists locally),
13
+ * - else empty (app and integration products do not have a primary
14
+ * domain — they are federation nodes that consume capabilities
15
+ * across multiple domains via product_capability).
16
+ */
17
+ /**
18
+ * Default domain_id per category when the manifest doesn't declare one.
19
+ * Per ADR 0136 only platform-profile categories carry a default — app
20
+ * and integration products legitimately have an empty domain_id.
21
+ */
22
+ const DEFAULT_DOMAIN_BY_CATEGORY = {
23
+ "platform-root": "platform",
24
+ "platform-subsystem": "platform",
25
+ };
26
+ export function buildProducts(inputs) {
27
+ const m = inputs.manifest;
28
+ const defaulted = DEFAULT_DOMAIN_BY_CATEGORY[m.category];
29
+ const domainId = m.domainId ?? defaulted ?? "";
30
+ if (m.domainId === undefined && defaulted !== undefined) {
31
+ inputs.findings.add("inferred", `products: domain_id="${defaulted}" inferred from category=${m.category} (manifest had no domain_id)`);
32
+ }
33
+ return [
34
+ {
35
+ id: m.sddId,
36
+ name: titleCase(m.sddId),
37
+ domain_id: domainId,
38
+ profile: m.profile,
39
+ category: m.category,
40
+ doc_path: ".",
41
+ status: "active",
42
+ synthesis_quality: "",
43
+ synthesis_band: "",
44
+ last_assessed: "",
45
+ highest_snapshot_impact: "",
46
+ repo_count: inputs.repoCount,
47
+ source_sdd_id: "",
48
+ },
49
+ ];
50
+ }
51
+ function titleCase(slug) {
52
+ return slug
53
+ .split("-")
54
+ .map((p) => (p.length === 0 ? p : p[0].toUpperCase() + p.slice(1)))
55
+ .join(" ");
56
+ }
57
+ //# sourceMappingURL=products.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/products.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH;;;;GAIG;AACH,MAAM,0BAA0B,GAAgD;IAC9E,eAAe,EAAE,UAAU;IAC3B,oBAAoB,EAAE,UAAU;CACjC,CAAC;AAEF,MAAM,UAAU,aAAa,CAC3B,MAA2B;IAE3B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC1B,MAAM,SAAS,GAAG,0BAA0B,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,SAAS,IAAI,EAAE,CAAC;IAE/C,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,GAAG,CACjB,UAAU,EACV,wBAAwB,SAAS,4BAA4B,CAAC,CAAC,QAAQ,8BAA8B,CACtG,CAAC;IACJ,CAAC;IAED,OAAO;QACL;YACE,EAAE,EAAE,CAAC,CAAC,KAAK;YACX,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;YACxB,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,QAAQ;YAChB,iBAAiB,EAAE,EAAE;YACrB,cAAc,EAAE,EAAE;YAClB,aAAa,EAAE,EAAE;YACjB,uBAAuB,EAAE,EAAE;YAC3B,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,aAAa,EAAE,EAAE;SAClB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACnE,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ import { type ParsedRepoConfig } from "./repositories.js";
4
+ export interface RepoEdgesInputs {
5
+ readonly findings: FindingsLog;
6
+ readonly configs: readonly ParsedRepoConfig[];
7
+ /** Map of capability spec_path → capability id (built from capabilities.csv rows). */
8
+ readonly capabilityIdByPath: ReadonlyMap<string, string>;
9
+ /** Map of contract spec_path → contract id (from contracts builder). */
10
+ readonly contractIdByPath: ReadonlyMap<string, string>;
11
+ }
12
+ export interface RepoEdgesResult {
13
+ readonly repoCapability: CatalogueRow[];
14
+ readonly repoContract: CatalogueRow[];
15
+ readonly featureRepo: CatalogueRow[];
16
+ }
17
+ export declare function buildRepoEdges(inputs: RepoEdgesInputs): RepoEdgesResult;
18
+ //# sourceMappingURL=repo-edges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-edges.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/repo-edges.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,sFAAsF;IACtF,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,cAAc,EAAE,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC;CACtC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAOvE"}
@@ -0,0 +1,113 @@
1
+ // Repo-edge builders — repo_capability, repo_contract, feature_repo.
2
+ //
3
+ // Source: `orchestration/repo-config/<domain>/<repo>.yaml` parsed by the
4
+ // repositories builder. Two block conventions in current adopters:
5
+ //
6
+ // additional_context:
7
+ // - docs/domains/<domain>/product/<capability>.md
8
+ // - docs/domains/<domain>/architecture/adr/ADR XXXX: ....md
9
+ //
10
+ // contracts:
11
+ // openapi: [<path-relative-to-contracts/openapi/>]
12
+ // proto: [<path-relative-to-contracts/proto/>]
13
+ // avro: [<path-relative-to-contracts/avro/>]
14
+ //
15
+ // Resolution rules:
16
+ // - repo_capability: only entries in additional_context that match a
17
+ // known capability's spec_path are emitted. ADR references in the
18
+ // same list are intentionally ignored here (they belong on
19
+ // capability_adr).
20
+ // - repo_contract: each entry under contracts.{kind} is resolved by
21
+ // full path (`contracts/<kind>/<entry>`), suffix (last two path
22
+ // segments), or basename — first match wins.
23
+ // - feature_repo: contextua's current convention does NOT declare
24
+ // repo→feature edges. Per the metamodel this would come from a
25
+ // `contributes_to.artifact_type: feature-set` declaration. Until
26
+ // adopters use it, this builder returns an empty array (the
27
+ // orchestrator emits the headers-only CSV).
28
+ import { basename, sep } from "node:path";
29
+ import { normaliseAdditionalContextEntry, } from "./repositories.js";
30
+ export function buildRepoEdges(inputs) {
31
+ const repoCapability = collectRepoCapability(inputs);
32
+ const repoContract = collectRepoContract(inputs);
33
+ // feature_repo: no current source convention; left empty until
34
+ // contributes_to.artifact_type=feature-set declarations are adopted.
35
+ const featureRepo = [];
36
+ return { repoCapability, repoContract, featureRepo };
37
+ }
38
+ function collectRepoCapability(inputs) {
39
+ const rows = [];
40
+ const seen = new Set();
41
+ for (const cfg of inputs.configs) {
42
+ const extras = cfg.data.additional_context ?? [];
43
+ for (const raw of extras) {
44
+ const reconstructed = normaliseAdditionalContextEntry(raw);
45
+ if (reconstructed === null)
46
+ continue;
47
+ const cleaned = reconstructed.replace(/^\/+/, "");
48
+ const capId = inputs.capabilityIdByPath.get(cleaned);
49
+ if (capId === undefined) {
50
+ // Not a capability spec path (likely an ADR file or freeform doc).
51
+ // We don't log a finding here — additional_context is intentionally
52
+ // multi-purpose; only matches that resolve to capabilities count.
53
+ continue;
54
+ }
55
+ const id = `${cfg.repoId}__${capId}`;
56
+ if (seen.has(id))
57
+ continue;
58
+ seen.add(id);
59
+ rows.push({
60
+ id,
61
+ repo_id: cfg.repoId,
62
+ capability_id: capId,
63
+ });
64
+ }
65
+ }
66
+ return rows;
67
+ }
68
+ function collectRepoContract(inputs) {
69
+ const rows = [];
70
+ const seen = new Set();
71
+ // Pre-compute suffix and basename indexes for fuzzy matching.
72
+ const suffixIndex = new Map();
73
+ const basenameIndex = new Map();
74
+ for (const [path, id] of inputs.contractIdByPath) {
75
+ const parts = path.split(sep);
76
+ if (parts.length >= 2) {
77
+ suffixIndex.set(parts.slice(-2).join("/"), id);
78
+ }
79
+ basenameIndex.set(basename(path), id);
80
+ }
81
+ for (const cfg of inputs.configs) {
82
+ const block = cfg.data.contracts;
83
+ if (!block)
84
+ continue;
85
+ for (const kind of ["openapi", "proto", "avro"]) {
86
+ const list = block[kind] ?? [];
87
+ for (const rawEntry of list) {
88
+ const entry = rawEntry.replace(/^\/+/, "");
89
+ const fullCandidate = `contracts/${kind}/${entry}`;
90
+ const id = inputs.contractIdByPath.get(fullCandidate)
91
+ ?? inputs.contractIdByPath.get(entry)
92
+ ?? suffixIndex.get(fullCandidate)
93
+ ?? suffixIndex.get(entry)
94
+ ?? basenameIndex.get(basename(entry));
95
+ if (id === undefined) {
96
+ inputs.findings.add("orphan", `${cfg.relPath}: contracts.${kind} entry "${entry}" did not match any contract`);
97
+ continue;
98
+ }
99
+ const edgeId = `${cfg.repoId}__${id}`;
100
+ if (seen.has(edgeId))
101
+ continue;
102
+ seen.add(edgeId);
103
+ rows.push({
104
+ id: edgeId,
105
+ repo_id: cfg.repoId,
106
+ contract_id: id,
107
+ });
108
+ }
109
+ }
110
+ }
111
+ return rows;
112
+ }
113
+ //# sourceMappingURL=repo-edges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-edges.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/repo-edges.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { z } from "zod";
2
+ import type { CatalogueRow } from "../csv-writer.js";
3
+ import type { FindingsLog } from "../findings.js";
4
+ import type { SddManifest } from "../manifest-loader.js";
5
+ import { type CanonicalSchema } from "../schema-loader.js";
6
+ export interface RepositoriesBuildInputs {
7
+ readonly sddPath: string;
8
+ readonly manifest: SddManifest;
9
+ readonly schema: CanonicalSchema;
10
+ readonly findings: FindingsLog;
11
+ /**
12
+ * domain_id values that resolve in this build (i.e. emitted in
13
+ * domains.csv). Used to log `[finding] orphan` for repo-config entries
14
+ * that point at a non-existent domain.
15
+ */
16
+ readonly knownDomainIds: ReadonlySet<string>;
17
+ /**
18
+ * Product id for the SDD itself. Each repo points at this product
19
+ * (per the SDD-as-Product invariant). May be empty for support-repo
20
+ * profiles where there's no Product row.
21
+ */
22
+ readonly productId: string;
23
+ }
24
+ declare const RepoConfigSchema: z.ZodObject<{
25
+ repo: z.ZodString;
26
+ domain: z.ZodOptional<z.ZodString>;
27
+ service_type: z.ZodOptional<z.ZodString>;
28
+ description: z.ZodOptional<z.ZodString>;
29
+ tier: z.ZodOptional<z.ZodString>;
30
+ group: z.ZodOptional<z.ZodString>;
31
+ category: z.ZodOptional<z.ZodString>;
32
+ additional_context: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
33
+ contracts: z.ZodOptional<z.ZodObject<{
34
+ openapi: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
+ proto: z.ZodOptional<z.ZodArray<z.ZodString>>;
36
+ avro: z.ZodOptional<z.ZodArray<z.ZodString>>;
37
+ }, z.core.$strip>>;
38
+ events: z.ZodOptional<z.ZodObject<{
39
+ produces: z.ZodOptional<z.ZodArray<z.ZodObject<{
40
+ topic: z.ZodOptional<z.ZodString>;
41
+ schema: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strip>>>;
43
+ consumes: z.ZodOptional<z.ZodArray<z.ZodObject<{
44
+ topic: z.ZodOptional<z.ZodString>;
45
+ schema: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strip>>>;
47
+ }, z.core.$strip>>;
48
+ }, z.core.$strip>;
49
+ /**
50
+ * Reconstruct a string from a possibly-mis-parsed YAML list entry.
51
+ *
52
+ * Adopters sometimes write list entries with unquoted colons like:
53
+ * - docs/.../ADR 0017: Use WorkOS for Auth.md
54
+ *
55
+ * The YAML parser reads each such entry as a single-key object whose key
56
+ * is the part before the first colon and whose value is the part after.
57
+ * This helper rejoins them so the consuming code sees a plain string.
58
+ *
59
+ * Returns null if the entry isn't a string and can't be rejoined cleanly.
60
+ */
61
+ export declare function normaliseAdditionalContextEntry(entry: unknown): string | null;
62
+ export interface ParsedRepoConfig {
63
+ /** Absolute path to the YAML file. */
64
+ readonly path: string;
65
+ /** Path relative to the SDD repo root. */
66
+ readonly relPath: string;
67
+ /** Parsed bare repo-config payload. */
68
+ readonly data: z.infer<typeof RepoConfigSchema>;
69
+ /** Bare repo slug (after the org/ prefix), used as repositories.id. */
70
+ readonly repoId: string;
71
+ }
72
+ export interface RepositoriesBuildResult {
73
+ readonly rows: CatalogueRow[];
74
+ readonly configs: readonly ParsedRepoConfig[];
75
+ }
76
+ export declare function buildRepositories(inputs: RepositoriesBuildInputs): Promise<RepositoriesBuildResult>;
77
+ export {};
78
+ //# sourceMappingURL=repositories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositories.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/repositories.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,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;AACzD,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AA4BD,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;iBAWpB,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAY7E;AAED,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAChD,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC/C;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAyDlC"}
@@ -0,0 +1,204 @@
1
+ // Repositories discoverer — emits `repositories.csv` rows from
2
+ // `orchestration/repo-config/<domain>/<repo>.yaml` (recursive).
3
+ //
4
+ // Per ADR 0134 + Q7.1 resolution: `service_type` is constrained to the
5
+ // canonical `enums.service_type` set (api_service, worker, gateway,
6
+ // frontend, mobile, library, infrastructure, documentation). Unknown
7
+ // values log a `[finding] convention` and are kept verbatim — the FK
8
+ // validator doesn't enforce enum membership today, but a coverage
9
+ // report can flag drift.
10
+ //
11
+ // Each repo's primary_key (`id`) is the bare repo slug (after the org
12
+ // prefix if present). `name` keeps the full `org/slug` form when the
13
+ // config declares it.
14
+ import { readdir, readFile } from "node:fs/promises";
15
+ import { join, relative } from "node:path";
16
+ import { parse as parseYaml } from "yaml";
17
+ import { z } from "zod";
18
+ import { runtimeServiceTypes, } from "../schema-loader.js";
19
+ const REPO_CONFIG_DIR_REL = join("orchestration", "repo-config");
20
+ const ContractsBlockSchema = z
21
+ .object({
22
+ openapi: z.array(z.string()).optional(),
23
+ proto: z.array(z.string()).optional(),
24
+ avro: z.array(z.string()).optional(),
25
+ })
26
+ .optional();
27
+ const EventEntrySchema = z.object({
28
+ topic: z.string().optional(),
29
+ schema: z.string().optional(),
30
+ });
31
+ const EventsBlockSchema = z
32
+ .object({
33
+ produces: z.array(EventEntrySchema).optional(),
34
+ consumes: z.array(EventEntrySchema).optional(),
35
+ })
36
+ .optional();
37
+ // `additional_context` accepts strings OR loosely-parsed key:value
38
+ // objects (which arise when adopters leave colons unquoted in their
39
+ // YAML — e.g. `- docs/.../ADR 0017: Use WorkOS for Auth.md`). The
40
+ // canonical builder reconstructs the original string downstream.
41
+ const RepoConfigSchema = z.object({
42
+ repo: z.string(),
43
+ domain: z.string().optional(),
44
+ service_type: z.string().optional(),
45
+ description: z.string().optional(),
46
+ tier: z.string().optional(),
47
+ group: z.string().optional(),
48
+ category: z.string().optional(),
49
+ additional_context: z.array(z.unknown()).optional(),
50
+ contracts: ContractsBlockSchema,
51
+ events: EventsBlockSchema,
52
+ });
53
+ /**
54
+ * Reconstruct a string from a possibly-mis-parsed YAML list entry.
55
+ *
56
+ * Adopters sometimes write list entries with unquoted colons like:
57
+ * - docs/.../ADR 0017: Use WorkOS for Auth.md
58
+ *
59
+ * The YAML parser reads each such entry as a single-key object whose key
60
+ * is the part before the first colon and whose value is the part after.
61
+ * This helper rejoins them so the consuming code sees a plain string.
62
+ *
63
+ * Returns null if the entry isn't a string and can't be rejoined cleanly.
64
+ */
65
+ export function normaliseAdditionalContextEntry(entry) {
66
+ if (typeof entry === "string")
67
+ return entry;
68
+ if (entry && typeof entry === "object" && !Array.isArray(entry)) {
69
+ const keys = Object.keys(entry);
70
+ if (keys.length === 1) {
71
+ const k = keys[0];
72
+ const v = entry[k];
73
+ if (typeof v === "string")
74
+ return `${k}: ${v}`;
75
+ if (v === null)
76
+ return k;
77
+ }
78
+ }
79
+ return null;
80
+ }
81
+ export async function buildRepositories(inputs) {
82
+ const configs = await loadRepoConfigs(inputs.sddPath, inputs.findings);
83
+ const validServiceTypes = canonicalServiceTypeValues(inputs.schema);
84
+ const rows = [];
85
+ for (const cfg of configs) {
86
+ const repoFull = cfg.data.repo;
87
+ const repoId = cfg.repoId;
88
+ const serviceType = cfg.data.service_type ?? "";
89
+ const domain = cfg.data.domain ?? "";
90
+ if (serviceType !== "" && !validServiceTypes.has(serviceType)) {
91
+ inputs.findings.add("convention", `${cfg.relPath}: service_type "${serviceType}" not in canonical enum (${[...validServiceTypes].join(", ")})`);
92
+ }
93
+ let resolvedDomain = domain;
94
+ if (domain === "") {
95
+ inputs.findings.add("convention", `${cfg.relPath}: missing required \`domain\` field`);
96
+ }
97
+ else if (!inputs.knownDomainIds.has(domain)) {
98
+ // Per ADR 0136: leave domain_id empty when the declared domain
99
+ // doesn't resolve locally (typical for app/integration SDDs whose
100
+ // repo-config declares "applications"/"integrations").
101
+ inputs.findings.add("orphan", `${cfg.relPath}: domain "${domain}" has no docs/domains/${domain}/ directory — domain_id left empty per ADR 0136`);
102
+ resolvedDomain = "";
103
+ }
104
+ rows.push({
105
+ id: repoId,
106
+ name: repoFull,
107
+ domain_id: resolvedDomain,
108
+ product_id: inputs.productId,
109
+ profile: inputs.manifest.profile,
110
+ group: cfg.data.group ?? "",
111
+ category: cfg.data.category ?? "",
112
+ tier: cfg.data.tier ?? "",
113
+ component_type: serviceType,
114
+ files: "",
115
+ code: "",
116
+ comment: "",
117
+ blank: "",
118
+ total_lines: "",
119
+ languages: "",
120
+ doc_path: cfg.relPath,
121
+ source_sdd_id: "",
122
+ });
123
+ }
124
+ return { rows, configs };
125
+ }
126
+ async function loadRepoConfigs(sddPath, findings) {
127
+ const baseDir = join(sddPath, REPO_CONFIG_DIR_REL);
128
+ let yamlPaths;
129
+ try {
130
+ yamlPaths = await collectYamlPaths(baseDir);
131
+ }
132
+ catch (err) {
133
+ const code = err.code;
134
+ if (code === "ENOENT") {
135
+ findings.add("coverage", `${REPO_CONFIG_DIR_REL}/ not found — emitting empty repositories.csv`);
136
+ return [];
137
+ }
138
+ throw err;
139
+ }
140
+ const configs = [];
141
+ for (const path of yamlPaths) {
142
+ if (path.endsWith("schema.yaml") || path.endsWith("schema.yml")) {
143
+ // schema files are tooling, not repo config
144
+ continue;
145
+ }
146
+ const text = await readFile(path, "utf-8");
147
+ let raw;
148
+ try {
149
+ raw = parseYaml(text);
150
+ }
151
+ catch (err) {
152
+ findings.add("convention", `failed to parse YAML at ${relative(sddPath, path)}: ${err.message}`);
153
+ continue;
154
+ }
155
+ if (!raw || typeof raw !== "object") {
156
+ findings.add("convention", `${relative(sddPath, path)}: not an object — skipped`);
157
+ continue;
158
+ }
159
+ const parsed = RepoConfigSchema.safeParse(raw);
160
+ if (!parsed.success) {
161
+ const issues = parsed.error.issues
162
+ .map((i) => `${i.path.join(".") || "<root>"}: ${i.message}`)
163
+ .join("; ");
164
+ findings.add("convention", `${relative(sddPath, path)}: schema violation — ${issues}`);
165
+ continue;
166
+ }
167
+ const repoFull = parsed.data.repo;
168
+ const repoId = repoFull.includes("/")
169
+ ? (repoFull.split("/").slice(-1)[0] ?? repoFull)
170
+ : repoFull;
171
+ configs.push({
172
+ path,
173
+ relPath: relative(sddPath, path),
174
+ data: parsed.data,
175
+ repoId,
176
+ });
177
+ }
178
+ // Deterministic order by relative path (for sorted repo IDs).
179
+ configs.sort((a, b) => a.relPath.localeCompare(b.relPath));
180
+ return configs;
181
+ }
182
+ async function collectYamlPaths(dir) {
183
+ const out = [];
184
+ for (const entry of await readdir(dir, { withFileTypes: true })) {
185
+ const full = join(dir, entry.name);
186
+ if (entry.isDirectory()) {
187
+ out.push(...(await collectYamlPaths(full)));
188
+ }
189
+ else if (entry.isFile() &&
190
+ (entry.name.endsWith(".yaml") || entry.name.endsWith(".yml"))) {
191
+ out.push(full);
192
+ }
193
+ }
194
+ return out;
195
+ }
196
+ function canonicalServiceTypeValues(schema) {
197
+ const enumDef = schema.enums["service_type"];
198
+ if (!enumDef) {
199
+ // Fall back to runtime types if the canonical enum is missing
200
+ return new Set(runtimeServiceTypes(schema));
201
+ }
202
+ return new Set(enumDef.values.map((v) => v.value));
203
+ }
204
+ //# sourceMappingURL=repositories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositories.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/repositories.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 { ParsedRepoConfig } from "./repositories.js";
4
+ export interface ServiceContractInputs {
5
+ readonly findings: FindingsLog;
6
+ readonly configs: readonly ParsedRepoConfig[];
7
+ readonly contractIdByPath: ReadonlyMap<string, string>;
8
+ readonly knownServiceIds: ReadonlySet<string>;
9
+ }
10
+ export declare function buildServiceContract(inputs: ServiceContractInputs): CatalogueRow[];
11
+ //# sourceMappingURL=service-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-contract.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/service-contract.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/C;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,qBAAqB,GAC5B,YAAY,EAAE,CA0ChB"}
@@ -0,0 +1,53 @@
1
+ // service_contract edge — emits one row per (service, contract, exposes)
2
+ // triple from `contracts.{openapi,proto,avro}` blocks in repo-config.
3
+ //
4
+ // Forward method convention: a service's repo-config declares the
5
+ // contracts it exposes. The "consumes" role isn't declared in current
6
+ // adopters; this builder emits role=exposes only.
7
+ import { basename, sep } from "node:path";
8
+ export function buildServiceContract(inputs) {
9
+ const rows = [];
10
+ const seen = new Set();
11
+ // Pre-compute fuzzy indexes for matching.
12
+ const suffixIndex = new Map();
13
+ const basenameIndex = new Map();
14
+ for (const [path, id] of inputs.contractIdByPath) {
15
+ const parts = path.split(sep);
16
+ if (parts.length >= 2)
17
+ suffixIndex.set(parts.slice(-2).join("/"), id);
18
+ basenameIndex.set(basename(path), id);
19
+ }
20
+ for (const cfg of inputs.configs) {
21
+ if (!inputs.knownServiceIds.has(cfg.repoId))
22
+ continue;
23
+ const block = cfg.data.contracts;
24
+ if (!block)
25
+ continue;
26
+ for (const kind of ["openapi", "proto", "avro"]) {
27
+ const list = block[kind] ?? [];
28
+ for (const rawEntry of list) {
29
+ const entry = rawEntry.replace(/^\/+/, "");
30
+ const fullCandidate = `contracts/${kind}/${entry}`;
31
+ const cid = inputs.contractIdByPath.get(fullCandidate)
32
+ ?? inputs.contractIdByPath.get(entry)
33
+ ?? suffixIndex.get(fullCandidate)
34
+ ?? suffixIndex.get(entry)
35
+ ?? basenameIndex.get(basename(entry));
36
+ if (cid === undefined)
37
+ continue;
38
+ const id = `${cfg.repoId}__${cid}__exposes`;
39
+ if (seen.has(id))
40
+ continue;
41
+ seen.add(id);
42
+ rows.push({
43
+ id,
44
+ service_id: cfg.repoId,
45
+ contract_id: cid,
46
+ role: "exposes",
47
+ });
48
+ }
49
+ }
50
+ }
51
+ return rows;
52
+ }
53
+ //# sourceMappingURL=service-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-contract.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/service-contract.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,sEAAsE;AACtE,EAAE;AACF,kEAAkE;AAClE,sEAAsE;AACtE,kDAAkD;AAElD,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAY1C,MAAM,UAAU,oBAAoB,CAClC,MAA6B;IAE7B,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,0CAA0C;IAC1C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QACtD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAU,EAAE,CAAC;YACzD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC3C,MAAM,aAAa,GAAG,aAAa,IAAI,IAAI,KAAK,EAAE,CAAC;gBACnD,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC;uBACjD,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;uBAClC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;uBAC9B,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;uBACtB,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxC,IAAI,GAAG,KAAK,SAAS;oBAAE,SAAS;gBAChC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;gBAC5C,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC;oBACR,EAAE;oBACF,UAAU,EAAE,GAAG,CAAC,MAAM;oBACtB,WAAW,EAAE,GAAG;oBAChB,IAAI,EAAE,SAAS;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ import type { SddManifest } from "../manifest-loader.js";
4
+ import { type CanonicalSchema } from "../schema-loader.js";
5
+ export interface ServicesBuildInputs {
6
+ readonly schema: CanonicalSchema;
7
+ readonly manifest: SddManifest;
8
+ readonly findings: FindingsLog;
9
+ /** Repositories rows from the repositories builder. */
10
+ readonly repositories: readonly CatalogueRow[];
11
+ /** Product id for the SDD itself. */
12
+ readonly productId: string;
13
+ }
14
+ export declare function buildServices(inputs: ServicesBuildInputs): CatalogueRow[];
15
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/services.ts"],"names":[],"mappings":"AAYA,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;AACzD,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,uDAAuD;IACvD,QAAQ,CAAC,YAAY,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/C,qCAAqC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,YAAY,EAAE,CAwBzE"}
@@ -0,0 +1,40 @@
1
+ // Services discoverer — emits `services.csv` rows derived 1:1 from
2
+ // repository rows whose service_type is a runtime kind.
3
+ //
4
+ // Per ADR 0134 + Q7.1 resolution, runtime kinds are
5
+ // {api_service, worker, gateway, frontend, mobile} — read from the
6
+ // canonical schema's enums.service_type block where
7
+ // `emits_service_row: true`.
8
+ //
9
+ // This is a derived catalogue: services are 1:1 with their primary
10
+ // repository for the contextua adoption pattern. Adopters whose
11
+ // services span multiple repos may extend this builder later.
12
+ import { runtimeServiceTypes, } from "../schema-loader.js";
13
+ export function buildServices(inputs) {
14
+ const runtime = runtimeServiceTypes(inputs.schema);
15
+ const rows = [];
16
+ for (const repo of inputs.repositories) {
17
+ const componentType = String(repo["component_type"] ?? "");
18
+ if (!runtime.has(componentType))
19
+ continue;
20
+ const repoId = String(repo["id"] ?? "");
21
+ if (repoId === "")
22
+ continue;
23
+ rows.push({
24
+ id: repoId,
25
+ name: repoId,
26
+ product_id: inputs.productId,
27
+ domain_id: String(repo["domain_id"] ?? ""),
28
+ primary_repo_id: repoId,
29
+ runtime_type: "",
30
+ language: "",
31
+ component_type: componentType,
32
+ status: "",
33
+ confidence: "",
34
+ description: "",
35
+ source_sdd_id: "",
36
+ });
37
+ }
38
+ return rows;
39
+ }
40
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/services.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,wDAAwD;AACxD,EAAE;AACF,oDAAoD;AACpD,mEAAmE;AACnE,oDAAoD;AACpD,6BAA6B;AAC7B,EAAE;AACF,mEAAmE;AACnE,gEAAgE;AAChE,8DAA8D;AAK9D,OAAO,EAEL,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAY7B,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;YAAE,SAAS;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,EAAE;YAAE,SAAS;QAC5B,IAAI,CAAC,IAAI,CAAC;YACR,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC1C,eAAe,EAAE,MAAM;YACvB,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,aAAa;YAC7B,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE;YACd,WAAW,EAAE,EAAE;YACf,aAAa,EAAE,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}