@sdd-method/sdd-cli 0.17.0 → 0.21.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 (46) hide show
  1. package/dist/lib/catalogue/build.d.ts.map +1 -1
  2. package/dist/lib/catalogue/build.js +92 -5
  3. package/dist/lib/catalogue/build.js.map +1 -1
  4. package/dist/lib/catalogue/builders/c4-containers.d.ts.map +1 -1
  5. package/dist/lib/catalogue/builders/c4-containers.js +15 -0
  6. package/dist/lib/catalogue/builders/c4-containers.js.map +1 -1
  7. package/dist/lib/catalogue/builders/capability-spec-walker.d.ts +55 -0
  8. package/dist/lib/catalogue/builders/capability-spec-walker.d.ts.map +1 -0
  9. package/dist/lib/catalogue/builders/capability-spec-walker.js +99 -0
  10. package/dist/lib/catalogue/builders/capability-spec-walker.js.map +1 -0
  11. package/dist/lib/catalogue/builders/capability-spec.d.ts +51 -0
  12. package/dist/lib/catalogue/builders/capability-spec.d.ts.map +1 -0
  13. package/dist/lib/catalogue/builders/capability-spec.js +276 -0
  14. package/dist/lib/catalogue/builders/capability-spec.js.map +1 -0
  15. package/dist/lib/catalogue/builders/contracts.d.ts.map +1 -1
  16. package/dist/lib/catalogue/builders/contracts.js +88 -41
  17. package/dist/lib/catalogue/builders/contracts.js.map +1 -1
  18. package/dist/lib/catalogue/builders/feature-grounding-walker.d.ts +68 -0
  19. package/dist/lib/catalogue/builders/feature-grounding-walker.d.ts.map +1 -0
  20. package/dist/lib/catalogue/builders/feature-grounding-walker.js +254 -0
  21. package/dist/lib/catalogue/builders/feature-grounding-walker.js.map +1 -0
  22. package/dist/lib/catalogue/builders/feature-grounding.d.ts +53 -0
  23. package/dist/lib/catalogue/builders/feature-grounding.d.ts.map +1 -0
  24. package/dist/lib/catalogue/builders/feature-grounding.js +312 -0
  25. package/dist/lib/catalogue/builders/feature-grounding.js.map +1 -0
  26. package/dist/lib/catalogue/builders/index.d.ts +6 -0
  27. package/dist/lib/catalogue/builders/index.d.ts.map +1 -1
  28. package/dist/lib/catalogue/builders/index.js +3 -0
  29. package/dist/lib/catalogue/builders/index.js.map +1 -1
  30. package/dist/lib/catalogue/builders/integrations.d.ts.map +1 -1
  31. package/dist/lib/catalogue/builders/integrations.js +69 -14
  32. package/dist/lib/catalogue/builders/integrations.js.map +1 -1
  33. package/dist/lib/catalogue/builders/service-contract-consumes.d.ts +24 -0
  34. package/dist/lib/catalogue/builders/service-contract-consumes.d.ts.map +1 -0
  35. package/dist/lib/catalogue/builders/service-contract-consumes.js +173 -0
  36. package/dist/lib/catalogue/builders/service-contract-consumes.js.map +1 -0
  37. package/dist/lib/catalogue/canonical-schema.yaml +7 -7
  38. package/dist/lib/catalogue/feature-grounding-aliases-loader.d.ts +36 -0
  39. package/dist/lib/catalogue/feature-grounding-aliases-loader.d.ts.map +1 -0
  40. package/dist/lib/catalogue/feature-grounding-aliases-loader.js +65 -0
  41. package/dist/lib/catalogue/feature-grounding-aliases-loader.js.map +1 -0
  42. package/dist/lib/catalogue/service-contract-aliases-loader.d.ts +60 -0
  43. package/dist/lib/catalogue/service-contract-aliases-loader.d.ts.map +1 -0
  44. package/dist/lib/catalogue/service-contract-aliases-loader.js +109 -0
  45. package/dist/lib/catalogue/service-contract-aliases-loader.js.map +1 -0
  46. package/package.json +2 -2
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Capability-spec feature extractor per ADR 0145 (schema 2.7.0).
3
+ *
4
+ * Walks `docs/domains/<dom>/product/<capability>.md` (platform-profile),
5
+ * parses the `## Feature Grounding (code-path trace)` markdown table,
6
+ * and emits four catalogue contributions:
7
+ *
8
+ * - `features.csv` rows with `source: capability-spec`.
9
+ * - `capability_feature.csv` rows (1:1 with each feature row).
10
+ * - `feature_repo.csv` rows derived from file-path references in
11
+ * the Implementation column.
12
+ * - `feature_service.csv` rows derived from class names / file
13
+ * basenames / route fragments in the Implementation column,
14
+ * resolved via `services.csv` + the optional per-SDD alias map
15
+ * introduced by ADR 0143.
16
+ *
17
+ * Resolution failures (unresolved capability, service, repo) emit
18
+ * findings but never break FK validation — only confidently-resolved
19
+ * rows are emitted.
20
+ *
21
+ * Precedence per ADR 0145 §4.7: feature-tree, feature-spec, and
22
+ * feature-grounding rows win on id collision (they are more specific
23
+ * sources); capability-spec rows are skipped with a divergence finding
24
+ * when their id is already taken.
25
+ */
26
+ import { readFile } from "node:fs/promises";
27
+ import { relative } from "node:path";
28
+ import { capabilityIdFromSpecPath, findCapabilitySpecFiles, parseCapabilitySpecTable, } from "./capability-spec-walker.js";
29
+ const DESCRIPTION_MAX = 500;
30
+ /** Columns the service-name resolver scans for class names / route fragments. */
31
+ const SERVICE_RESOLUTION_COLUMNS = ["implementation"];
32
+ /** Columns the repo-name resolver scans for file-path references. */
33
+ const REPO_RESOLUTION_COLUMNS = ["implementation", "grounding_doc"];
34
+ export async function buildCapabilitySpec(inputs) {
35
+ const featureRows = [];
36
+ const capabilityFeatureRows = [];
37
+ const featureRepoRows = [];
38
+ const featureServiceRows = [];
39
+ const seenFeatureRepo = new Set();
40
+ const seenFeatureService = new Set();
41
+ const seenFeatures = new Set(inputs.existingFeatureIds);
42
+ if (inputs.profile !== "platform-profile") {
43
+ return {
44
+ featureRows,
45
+ capabilityFeatureRows,
46
+ featureRepoRows,
47
+ featureServiceRows,
48
+ };
49
+ }
50
+ const files = await findCapabilitySpecFiles(inputs.sddPath);
51
+ for (const absPath of files) {
52
+ const capabilityId = capabilityIdFromSpecPath(absPath, inputs.sddPath);
53
+ const relPath = relative(inputs.sddPath, absPath);
54
+ if (capabilityId === "") {
55
+ inputs.findings.add("convention", `${relPath}: capability id could not be resolved from file path`);
56
+ continue;
57
+ }
58
+ if (!inputs.knownCapabilityIds.has(capabilityId)) {
59
+ // Common for product README-style files that aren't capability specs.
60
+ // Treat as orphan, not convention — silently skip.
61
+ inputs.findings.add("orphan", `${relPath}: filename stem "${capabilityId}" does not match any capability id in capabilities.csv — skipping`);
62
+ continue;
63
+ }
64
+ const text = await readFile(absPath, "utf-8");
65
+ const rows = parseCapabilitySpecTable(text);
66
+ if (rows.length === 0) {
67
+ inputs.findings.add("coverage", `${relPath}: capability spec found but no "## Feature Grounding (code-path trace)" table recognised`);
68
+ continue;
69
+ }
70
+ const slugsInThisFile = new Set();
71
+ for (const row of rows) {
72
+ if (slugsInThisFile.has(row.slug)) {
73
+ inputs.findings.add("divergence", `${relPath}:${row.lineNumber}: duplicate feature slug "${row.slug}" in same file (first occurrence wins)`);
74
+ continue;
75
+ }
76
+ slugsInThisFile.add(row.slug);
77
+ const featureId = `${capabilityId}-${row.slug}`;
78
+ if (seenFeatures.has(featureId)) {
79
+ inputs.findings.add("divergence", `${relPath}:${row.lineNumber}: feature id "${featureId}" already emitted by an earlier source (feature-tree / feature-spec / feature-grounding wins)`);
80
+ continue;
81
+ }
82
+ seenFeatures.add(featureId);
83
+ featureRows.push({
84
+ id: featureId,
85
+ name: row.slug,
86
+ product_id: "",
87
+ capability_id: capabilityId,
88
+ parent_group_id: "",
89
+ parent_feature_id: "",
90
+ description: deriveDescription(row),
91
+ maturity: "",
92
+ status: "active",
93
+ source: "capability-spec",
94
+ runway: "",
95
+ source_sdd_id: "",
96
+ });
97
+ const cfId = `${capabilityId}__${featureId}`;
98
+ capabilityFeatureRows.push({
99
+ id: cfId,
100
+ capability_id: capabilityId,
101
+ feature_id: featureId,
102
+ });
103
+ // feature_service edges
104
+ const services = resolveServices(row, inputs);
105
+ for (const serviceId of services) {
106
+ const edgeId = `${featureId}__${serviceId}`;
107
+ if (seenFeatureService.has(edgeId))
108
+ continue;
109
+ seenFeatureService.add(edgeId);
110
+ featureServiceRows.push({
111
+ id: edgeId,
112
+ feature_id: featureId,
113
+ service_id: serviceId,
114
+ });
115
+ }
116
+ // feature_repo edges
117
+ const repos = resolveRepos(row, inputs);
118
+ for (const repoKey of repos) {
119
+ const edgeId = `${featureId}__${repoKey}`;
120
+ if (seenFeatureRepo.has(edgeId))
121
+ continue;
122
+ seenFeatureRepo.add(edgeId);
123
+ featureRepoRows.push({
124
+ id: edgeId,
125
+ feature_id: featureId,
126
+ repo_id: repoKey,
127
+ });
128
+ }
129
+ }
130
+ }
131
+ return {
132
+ featureRows,
133
+ capabilityFeatureRows,
134
+ featureRepoRows,
135
+ featureServiceRows,
136
+ };
137
+ }
138
+ /**
139
+ * Build the description column by joining non-feature cells, capped at
140
+ * 500 chars to match the feature-grounding convention.
141
+ */
142
+ function deriveDescription(row) {
143
+ const parts = [];
144
+ for (const [key, value] of row.cells) {
145
+ if (value === "")
146
+ continue;
147
+ parts.push(`${prettyHeader(key)}: ${value}`);
148
+ }
149
+ const joined = parts.join(" • ");
150
+ return joined.length > DESCRIPTION_MAX
151
+ ? joined.slice(0, DESCRIPTION_MAX)
152
+ : joined;
153
+ }
154
+ function prettyHeader(key) {
155
+ return key
156
+ .split("_")
157
+ .map((p) => (p.length === 0 ? p : p[0].toUpperCase() + p.slice(1)))
158
+ .join(" ");
159
+ }
160
+ /**
161
+ * Resolve service ids referenced in a row's Implementation cell.
162
+ * Same strategy as feature-grounding: tokenize, alias-lookup, normalise,
163
+ * known-id lookup.
164
+ */
165
+ function resolveServices(row, inputs) {
166
+ const out = new Set();
167
+ for (const col of SERVICE_RESOLUTION_COLUMNS) {
168
+ const cell = row.cells.get(col) ?? "";
169
+ if (cell === "")
170
+ continue;
171
+ for (const token of tokenize(cell)) {
172
+ const resolved = resolveServiceToken(token, inputs);
173
+ if (resolved !== null)
174
+ out.add(resolved);
175
+ }
176
+ }
177
+ return [...out].sort();
178
+ }
179
+ function resolveServiceToken(rawToken, inputs) {
180
+ if (inputs.aliases !== null) {
181
+ const aliased = inputs.aliases.serviceAliases.get(rawToken);
182
+ if (aliased !== undefined && inputs.knownServiceIds.has(aliased)) {
183
+ return aliased;
184
+ }
185
+ }
186
+ const normalised = normaliseToken(rawToken);
187
+ if (normalised === "")
188
+ return null;
189
+ if (inputs.knownServiceIds.has(normalised))
190
+ return normalised;
191
+ if (inputs.aliases !== null) {
192
+ const aliased = inputs.aliases.serviceAliases.get(normalised);
193
+ if (aliased !== undefined && inputs.knownServiceIds.has(aliased)) {
194
+ return aliased;
195
+ }
196
+ }
197
+ return null;
198
+ }
199
+ function resolveRepos(row, inputs) {
200
+ const out = new Set();
201
+ for (const col of REPO_RESOLUTION_COLUMNS) {
202
+ const cell = row.cells.get(col) ?? "";
203
+ if (cell === "")
204
+ continue;
205
+ for (const token of tokenize(cell)) {
206
+ const resolved = resolveRepoToken(token, inputs);
207
+ if (resolved !== null)
208
+ out.add(resolved);
209
+ }
210
+ }
211
+ return [...out].sort();
212
+ }
213
+ function resolveRepoToken(rawToken, inputs) {
214
+ if (inputs.aliases !== null) {
215
+ const aliased = inputs.aliases.repoAliases.get(rawToken);
216
+ if (aliased !== undefined && inputs.knownRepoKeys.has(aliased)) {
217
+ return aliased;
218
+ }
219
+ }
220
+ if (inputs.knownRepoKeys.has(rawToken))
221
+ return rawToken;
222
+ for (const segment of rawToken.split("/")) {
223
+ const stripped = segment
224
+ .replace(/-master@.*$/, "")
225
+ .replace(/@[^/]+$/, "");
226
+ if (stripped !== "" && inputs.knownRepoKeys.has(stripped)) {
227
+ return stripped;
228
+ }
229
+ const trailingMaster = stripped.replace(/-master$/, "");
230
+ if (trailingMaster !== stripped &&
231
+ inputs.knownRepoKeys.has(trailingMaster)) {
232
+ return trailingMaster;
233
+ }
234
+ }
235
+ return null;
236
+ }
237
+ /**
238
+ * Tokenize a markdown cell — mirrors the feature-grounding tokenizer.
239
+ * Matches backticked spans, bare CamelCase / kebab-case identifiers,
240
+ * and path-like tokens. Strips method call parens and array indexers.
241
+ */
242
+ function tokenize(cell) {
243
+ const out = new Set();
244
+ for (const match of cell.matchAll(/`([^`]+)`/g)) {
245
+ const inner = match[1] ?? "";
246
+ addCandidatesFromToken(inner, out);
247
+ }
248
+ const stripped = cell.replace(/`[^`]+`/g, " ");
249
+ for (const match of stripped.matchAll(/[A-Za-z][A-Za-z0-9._@/-]*[A-Za-z0-9]/g)) {
250
+ addCandidatesFromToken(match[0], out);
251
+ }
252
+ return [...out];
253
+ }
254
+ function addCandidatesFromToken(token, out) {
255
+ if (token === "")
256
+ return;
257
+ if (token.includes("/")) {
258
+ out.add(token);
259
+ const first = token.split("/")[0] ?? "";
260
+ if (first !== "" && first !== token)
261
+ out.add(first);
262
+ return;
263
+ }
264
+ const head = token.split(/[(.[]/)[0] ?? "";
265
+ if (head !== "")
266
+ out.add(head);
267
+ out.add(token);
268
+ }
269
+ function normaliseToken(token) {
270
+ return token
271
+ .toLowerCase()
272
+ .replace(/\.(ts|tsx|js|jsx|java|kt|kts|py|go|rs|yaml|yml|json|md)$/i, "")
273
+ .replace(/\(\)$/, "")
274
+ .trim();
275
+ }
276
+ //# sourceMappingURL=capability-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-spec.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/capability-spec.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/contracts.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAgBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAyD/B"}
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/contracts.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAwBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA6F/B"}
@@ -1,5 +1,7 @@
1
1
  // Contracts discoverer — emits `contracts.csv` rows from
2
- // `contracts/{openapi,proto,avro}/<domain>/<name>.<ext>`.
2
+ // `contracts/{openapi,proto,avro}/<domain>/<name>.<ext>` (canonical) and
3
+ // `docs/domains/<domain>/contracts/{openapi,proto,avro}/<name>.<ext>`
4
+ // (platform-profile per reverse/workflows/contract.md).
3
5
  //
4
6
  // Per the canonical schema (catalogue-schema.yaml):
5
7
  // - kind enum: rest | graphql | rpc | event
@@ -17,6 +19,7 @@ import { readdir, readFile } from "node:fs/promises";
17
19
  import { extname, join, relative, sep } from "node:path";
18
20
  import { parse as parseYaml } from "yaml";
19
21
  const CONTRACTS_DIR_REL = "contracts";
22
+ const DOCS_DOMAINS_DIR_REL = join("docs", "domains");
20
23
  const KIND_SPECS = [
21
24
  { subdir: "openapi", extensions: [".yaml", ".yml"], kind: "rest" },
22
25
  { subdir: "proto", extensions: [".proto"], kind: "rpc" },
@@ -26,54 +29,98 @@ export async function buildContracts(inputs) {
26
29
  const rows = [];
27
30
  const idByPath = new Map();
28
31
  const seen = new Set();
32
+ const discovered = [];
33
+ // Layout 1: canonical SDD-root layout — contracts/<subdir>/<domain>/<file>.<ext>.
29
34
  for (const spec of KIND_SPECS) {
30
35
  const dir = join(inputs.sddPath, CONTRACTS_DIR_REL, spec.subdir);
31
36
  const files = await collectFiles(dir, spec.extensions);
32
- for (const path of files.sort()) {
33
- const filename = basenameOf(path);
34
- // Skip schema/config files at any depth.
35
- if (filename === "schema.yaml" || filename === "schema.yml")
36
- continue;
37
+ for (const path of files) {
37
38
  const rel = relative(inputs.sddPath, path);
38
- const stem = stemOf(filename);
39
- const domain = domainSegment(rel);
40
- const slug = domain !== ""
41
- ? slugify(`${domain}-${stem}`)
42
- : slugify(stem);
43
- if (seen.has(slug)) {
44
- inputs.findings.add("divergence", `${rel}: contract id "${slug}" already emitted by an earlier file`);
45
- continue;
46
- }
47
- seen.add(slug);
48
- let description = "";
49
- let version = "";
50
- let sourceRepoId = "";
51
- if (spec.kind === "rest") {
52
- const meta = await tryReadOpenapiInfo(path);
53
- description = meta.description;
54
- version = meta.version;
55
- if (meta.xSourceRepo !== "" && inputs.knownRepositoryIds.has(meta.xSourceRepo)) {
56
- sourceRepoId = meta.xSourceRepo;
57
- }
58
- }
59
- rows.push({
60
- id: slug,
61
- name: stem,
62
- service_id: "",
63
- source_repo_id: sourceRepoId,
39
+ discovered.push({
40
+ absPath: path,
41
+ relPath: rel,
42
+ domain: domainSegmentCanonical(rel),
64
43
  kind: spec.kind,
65
- version,
66
- status: "active",
67
- spec_path: rel,
68
- visibility: "internal",
69
- description,
70
- source_sdd_id: "",
71
44
  });
72
- idByPath.set(rel, slug);
73
45
  }
74
46
  }
47
+ // Layout 2: platform-profile layout — docs/domains/<domain>/contracts/<subdir>/<file>.<ext>.
48
+ // Canonical for platform-profile SDDs per reverse/workflows/contract.md and
49
+ // reverse/workflow.md §3 ("docs/domains/{domain}/contracts/openapi/*.yaml ←
50
+ // refresh API surfaces"). Federated SDDs without docs/domains/ harmlessly
51
+ // contribute zero rows.
52
+ const domainsRoot = join(inputs.sddPath, DOCS_DOMAINS_DIR_REL);
53
+ const domainDirs = await listDirs(domainsRoot);
54
+ for (const domainName of domainDirs) {
55
+ for (const spec of KIND_SPECS) {
56
+ const dir = join(domainsRoot, domainName, CONTRACTS_DIR_REL, spec.subdir);
57
+ const files = await collectFiles(dir, spec.extensions);
58
+ for (const path of files) {
59
+ const rel = relative(inputs.sddPath, path);
60
+ discovered.push({
61
+ absPath: path,
62
+ relPath: rel,
63
+ domain: domainName,
64
+ kind: spec.kind,
65
+ });
66
+ }
67
+ }
68
+ }
69
+ discovered.sort((a, b) => a.relPath.localeCompare(b.relPath));
70
+ for (const entry of discovered) {
71
+ const filename = basenameOf(entry.absPath);
72
+ // Skip schema/config files at any depth.
73
+ if (filename === "schema.yaml" || filename === "schema.yml")
74
+ continue;
75
+ const stem = stemOf(filename);
76
+ const slug = entry.domain !== ""
77
+ ? slugify(`${entry.domain}-${stem}`)
78
+ : slugify(stem);
79
+ if (seen.has(slug)) {
80
+ inputs.findings.add("divergence", `${entry.relPath}: contract id "${slug}" already emitted by an earlier file`);
81
+ continue;
82
+ }
83
+ seen.add(slug);
84
+ let description = "";
85
+ let version = "";
86
+ let sourceRepoId = "";
87
+ if (entry.kind === "rest") {
88
+ const meta = await tryReadOpenapiInfo(entry.absPath);
89
+ description = meta.description;
90
+ version = meta.version;
91
+ if (meta.xSourceRepo !== "" && inputs.knownRepositoryIds.has(meta.xSourceRepo)) {
92
+ sourceRepoId = meta.xSourceRepo;
93
+ }
94
+ }
95
+ rows.push({
96
+ id: slug,
97
+ name: stem,
98
+ service_id: "",
99
+ source_repo_id: sourceRepoId,
100
+ kind: entry.kind,
101
+ version,
102
+ status: "active",
103
+ spec_path: entry.relPath,
104
+ visibility: "internal",
105
+ description,
106
+ source_sdd_id: "",
107
+ });
108
+ idByPath.set(entry.relPath, slug);
109
+ }
75
110
  return { rows, idByPath };
76
111
  }
112
+ async function listDirs(parent) {
113
+ try {
114
+ const entries = await readdir(parent, { withFileTypes: true });
115
+ return entries.filter((e) => e.isDirectory()).map((e) => e.name);
116
+ }
117
+ catch (err) {
118
+ const code = err.code;
119
+ if (code === "ENOENT")
120
+ return [];
121
+ throw err;
122
+ }
123
+ }
77
124
  async function tryReadOpenapiInfo(path) {
78
125
  try {
79
126
  const text = await readFile(path, "utf-8");
@@ -135,8 +182,8 @@ function basenameOf(absPath) {
135
182
  function stemOf(filename) {
136
183
  return filename.replace(/\.[^.]+$/, "");
137
184
  }
138
- function domainSegment(relPath) {
139
- // Layout: contracts/<subdir>/<domain>/<file>.<ext>
185
+ function domainSegmentCanonical(relPath) {
186
+ // Canonical layout: contracts/<subdir>/<domain>/<file>.<ext>
140
187
  // → parts = ["contracts", subdir, domain, file]
141
188
  const parts = relPath.split(sep);
142
189
  if (parts.length < 4)
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Walker for `feature-grounding.md` files per ADR 0143 (schema 2.5.0).
3
+ *
4
+ * Reads markdown tables of the canonical shape:
5
+ *
6
+ * | Feature | UI Components | API Routes | Backend Handlers | Data Entities | Evidence |
7
+ * |---|---|---|---|---|---|
8
+ * | `oauth2-login` | ... | BFF `GET /login` | `AuthHandler.handle...()` | Token | `auth-handler.ts` |
9
+ *
10
+ * Path conventions (per ADR 0143 §4.3):
11
+ * - platform-profile: `docs/domains/<dom>/design/<capability>/feature-grounding.md`
12
+ * - integration-product: `docs/design/integration/feature-grounding.md`
13
+ *
14
+ * Tolerant of column re-ordering and missing optional columns. The only
15
+ * required column is `Feature`. Lines inside ```fenced``` code blocks
16
+ * are skipped. Recovery is row-local — a malformed row emits a finding
17
+ * and the walker continues with the next row.
18
+ */
19
+ /** Discovered grounding file plus its parsed table rows. */
20
+ export interface GroundingFile {
21
+ readonly absPath: string;
22
+ readonly relPath: string;
23
+ /**
24
+ * Capability id resolved from the file path. For platform-profile
25
+ * files this is the parent folder name. For integration-product
26
+ * files this is the empty string — the integration is the
27
+ * capability surface (caller fills it from the SDD's product id).
28
+ */
29
+ readonly capabilityIdFromPath: string;
30
+ readonly rows: readonly GroundingRow[];
31
+ }
32
+ export interface GroundingRow {
33
+ /** Feature slug from the first column, backticks stripped. */
34
+ readonly slug: string;
35
+ /**
36
+ * Other columns keyed by their normalised header (lowercase,
37
+ * spaces → underscores). Cell content is the raw markdown — no
38
+ * link / backtick unwrap. Empty cells are present with value "".
39
+ */
40
+ readonly cells: ReadonlyMap<string, string>;
41
+ /** 1-based line number of the row in the source file (for findings). */
42
+ readonly lineNumber: number;
43
+ }
44
+ /**
45
+ * Find all `docs/domains/<dom>/design/<capability>/feature-grounding.md`
46
+ * files under the SDD root. Sorted for deterministic output.
47
+ */
48
+ export declare function findPlatformGroundingFiles(sddPath: string): Promise<string[]>;
49
+ /**
50
+ * Find the single integration-product feature-grounding.md, if any.
51
+ * Path: `docs/design/integration/feature-grounding.md`.
52
+ */
53
+ export declare function findIntegrationGroundingFile(sddPath: string): Promise<string | null>;
54
+ /**
55
+ * Resolve the capability id from a platform-profile grounding file's
56
+ * absolute path. Returns the parent folder name. Callers verify the
57
+ * id resolves against `capabilities.csv` and emit findings on miss.
58
+ */
59
+ export declare function capabilityIdFromPath(absPath: string, sddPath: string): string;
60
+ /**
61
+ * Parse the markdown content of a feature-grounding.md file and return
62
+ * the rows from its first valid feature table. A "valid table" has a
63
+ * header row whose first non-empty cell normalises to `feature`.
64
+ * Returns an empty array if no such table is found (caller logs a
65
+ * coverage finding).
66
+ */
67
+ export declare function parseGroundingTable(text: string): GroundingRow[];
68
+ //# sourceMappingURL=feature-grounding-walker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-grounding-walker.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/feature-grounding-walker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAKD;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAgCnB;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAkChE"}