@sdd-method/sdd-cli 0.12.1 → 0.13.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.
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA2CH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzC,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CAuEtB"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA4CH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzC,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CAuEtB"}
@@ -26,6 +26,7 @@ import { validateForeignKeys } from "./fk-validator.js";
26
26
  import { FindingsLog } from "./findings.js";
27
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
28
  import { loadTraceabilityManifests } from "./traceability-loader.js";
29
+ import { loadRunwayVocabulary } from "./runway-vocabulary-loader.js";
29
30
  export async function runCatalogueBuild(inputs, write) {
30
31
  const sddPath = resolve(inputs.sddPath ?? process.cwd());
31
32
  const outDir = resolve(inputs.outDir ?? join(sddPath, "catalogues"));
@@ -199,6 +200,9 @@ async function collectRows(schema, manifest, findings, sddPath) {
199
200
  productId: manifest.sddId,
200
201
  });
201
202
  out.set("feature_groups", featureGroups);
203
+ // Schema 2.2.0+: optional adopter-owned runway vocabulary at SDD root.
204
+ // Absent → no validation runs; bullet runway values accepted verbatim.
205
+ const runwayVocab = await loadRunwayVocabulary(sddPath);
202
206
  const featuresResult = await buildFeatures({
203
207
  sddPath,
204
208
  findings,
@@ -206,6 +210,7 @@ async function collectRows(schema, manifest, findings, sddPath) {
206
210
  knownCapabilityIds,
207
211
  profile: manifest.profile,
208
212
  productId: manifest.sddId,
213
+ runwayVocabulary: runwayVocab?.values ?? null,
209
214
  });
210
215
  out.set("features", featuresResult.rows);
211
216
  out.set("capability_feature", buildCapabilityFeature({
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/lib/catalogue/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/lib/catalogue/build.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"feature-groups.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/feature-groups.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,uFAAuF;IACvF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAOD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,YAAY,EAAE,CAAC,CAkDzB"}
1
+ {"version":3,"file":"feature-groups.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/feature-groups.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAOlD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,uFAAuF;IACvF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,YAAY,EAAE,CAAC,CAmDzB"}
@@ -2,41 +2,32 @@
2
2
  // hierarchical `feature-tree.md` files.
3
3
  //
4
4
  // Per Q7.2 resolution (adopt-canonical-catalogue-builder.md §7.2),
5
- // FeatureGroups are first-class entities. This builder parses pure
6
- // markdown H2/H3 headings as the hierarchical structure:
7
- // - H2 heading top-level FeatureGroup (parent_group_id = "")
8
- // - H3 heading → child FeatureGroup (parent_group_id = enclosing H2's id)
5
+ // FeatureGroups are first-class entities. This builder consumes the
6
+ // shared `feature-tree-walker` and emits one row per H2/H3 heading
7
+ // outside fenced code blocks.
9
8
  //
10
9
  // ASCII-tree representations inside fenced code blocks are NOT parsed
11
10
  // — those are an adopter authoring style that doesn't map cleanly to
12
11
  // catalogue entities. Adopters wanting first-class groups format their
13
12
  // feature trees with proper H2/H3 headings.
14
13
  //
15
- // Source paths checked (in order, first match wins):
16
- // - <sddRoot>/feature-tree.md (typical for app-product SDDs)
17
- // - <sddRoot>/docs/platform/feature-tree.md (typical for platform SDDs)
14
+ // Source paths: see `findFeatureTreeFile` in feature-tree-walker.ts.
18
15
  import { readFile } from "node:fs/promises";
19
- import { join, relative } from "node:path";
20
- const CANDIDATE_PATHS_REL = [
21
- "feature-tree.md",
22
- join("docs", "platform", "feature-tree.md"),
23
- ];
16
+ import { relative } from "node:path";
17
+ import { featureGroupId, findFeatureTreeFile, walkFeatureTree, } from "./feature-tree-walker.js";
24
18
  export async function buildFeatureGroups(inputs) {
25
- const featureTreePath = await firstExisting(inputs.sddPath, CANDIDATE_PATHS_REL);
19
+ const featureTreePath = await findFeatureTreeFile(inputs.sddPath);
26
20
  if (!featureTreePath) {
27
21
  return [];
28
22
  }
29
23
  const text = await readFile(featureTreePath, "utf-8");
30
- const headings = extractHeadingsOutsideCodeFences(text);
24
+ const events = walkFeatureTree(text);
31
25
  const rows = [];
32
- let currentH2Id = "";
33
- for (const h of headings) {
34
- if (h.level === 2) {
35
- const id = `${inputs.productId}-group-${slugify(h.text)}`;
36
- currentH2Id = id;
26
+ for (const ev of events) {
27
+ if (ev.kind === "h2") {
37
28
  rows.push({
38
- id,
39
- name: h.text,
29
+ id: featureGroupId(inputs.productId, ev.slug),
30
+ name: ev.text,
40
31
  product_id: inputs.productId,
41
32
  capability_id: "",
42
33
  parent_group_id: "",
@@ -45,20 +36,22 @@ export async function buildFeatureGroups(inputs) {
45
36
  source_sdd_id: "",
46
37
  });
47
38
  }
48
- else if (h.level === 3) {
49
- if (currentH2Id === "") {
39
+ else if (ev.kind === "h3") {
40
+ if (ev.parentH2Slug === "") {
50
41
  // H3 with no enclosing H2 — orphan; surface as finding but emit anyway.
51
- inputs.findings.add("convention", `${relative(inputs.sddPath, featureTreePath)}: H3 "${h.text}" has no enclosing H2`);
42
+ inputs.findings.add("convention", `${relative(inputs.sddPath, featureTreePath)}: H3 "${ev.text}" has no enclosing H2`);
52
43
  }
53
- const id = currentH2Id !== ""
54
- ? `${currentH2Id}-${slugify(h.text)}`
55
- : `${inputs.productId}-group-${slugify(h.text)}`;
44
+ const id = ev.parentH2Slug !== ""
45
+ ? featureGroupId(inputs.productId, ev.parentH2Slug, ev.slug)
46
+ : featureGroupId(inputs.productId, ev.slug);
56
47
  rows.push({
57
48
  id,
58
- name: h.text,
49
+ name: ev.text,
59
50
  product_id: inputs.productId,
60
51
  capability_id: "",
61
- parent_group_id: currentH2Id,
52
+ parent_group_id: ev.parentH2Slug !== ""
53
+ ? featureGroupId(inputs.productId, ev.parentH2Slug)
54
+ : "",
62
55
  description: "",
63
56
  source: "feature-tree-h3",
64
57
  source_sdd_id: "",
@@ -67,52 +60,4 @@ export async function buildFeatureGroups(inputs) {
67
60
  }
68
61
  return rows;
69
62
  }
70
- function extractHeadingsOutsideCodeFences(text) {
71
- const out = [];
72
- let inFence = false;
73
- for (const rawLine of text.split(/\r?\n/)) {
74
- const line = rawLine.trimEnd();
75
- if (line.startsWith("```")) {
76
- inFence = !inFence;
77
- continue;
78
- }
79
- if (inFence)
80
- continue;
81
- const m = /^(#{2,3})\s+(.+?)\s*$/.exec(line);
82
- if (!m || m[1] === undefined || m[2] === undefined)
83
- continue;
84
- const level = m[1].length === 2 ? 2 : 3;
85
- const headingText = m[2]
86
- .replace(/^[\d.]+\s*/, "") // strip leading "1.", "1.1", etc.
87
- .replace(/\s*\[.+?\]\s*$/, "") // strip trailing "[Business]" / "[Enabler-Runway]" tags
88
- .trim();
89
- if (headingText === "")
90
- continue;
91
- out.push({ level, text: headingText });
92
- }
93
- return out;
94
- }
95
- function slugify(text) {
96
- return text
97
- .toLowerCase()
98
- .replace(/&/g, " and ")
99
- .replace(/[^a-z0-9]+/g, "-")
100
- .replace(/^-+|-+$/g, "");
101
- }
102
- async function firstExisting(sddPath, candidates) {
103
- for (const rel of candidates) {
104
- const full = join(sddPath, rel);
105
- try {
106
- await readFile(full, "utf-8");
107
- return full;
108
- }
109
- catch (err) {
110
- const code = err.code;
111
- if (code === "ENOENT")
112
- continue;
113
- throw err;
114
- }
115
- }
116
- return null;
117
- }
118
63
  //# sourceMappingURL=feature-groups.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-groups.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/feature-groups.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature-groups.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/feature-groups.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,wCAAwC;AACxC,EAAE;AACF,mEAAmE;AACnE,oEAAoE;AACpE,mEAAmE;AACnE,8BAA8B;AAC9B,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,uEAAuE;AACvE,4CAA4C;AAC5C,EAAE;AACF,qEAAqE;AAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AASlC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAgC;IAEhC,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC;gBACR,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC;gBAC7C,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,UAAU,EAAE,MAAM,CAAC,SAAS;gBAC5B,aAAa,EAAE,EAAE;gBACjB,eAAe,EAAE,EAAE;gBACnB,WAAW,EAAE,EAAE;gBACf,MAAM,EAAE,iBAAiB;gBACzB,aAAa,EAAE,EAAE;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,EAAE,CAAC,YAAY,KAAK,EAAE,EAAE,CAAC;gBAC3B,wEAAwE;gBACxE,MAAM,CAAC,QAAQ,CAAC,GAAG,CACjB,YAAY,EACZ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC,IAAI,uBAAuB,CACpF,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,GACN,EAAE,CAAC,YAAY,KAAK,EAAE;gBACpB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC;gBAC5D,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC;gBACR,EAAE;gBACF,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,UAAU,EAAE,MAAM,CAAC,SAAS;gBAC5B,aAAa,EAAE,EAAE;gBACjB,eAAe,EACb,EAAE,CAAC,YAAY,KAAK,EAAE;oBACpB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC;oBACnD,CAAC,CAAC,EAAE;gBACR,WAAW,EAAE,EAAE;gBACf,MAAM,EAAE,iBAAiB;gBACzB,aAAa,EAAE,EAAE;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Shared walker for `feature-tree.md` files. Used by:
3
+ * - `buildFeatureGroups` — consumes H2/H3 events to emit `feature_groups.csv`.
4
+ * - `buildFeatures` (bullet branch, schema 2.2.0+) — consumes bullet
5
+ * events to emit `features.csv` rows with `source: "feature-tree"`.
6
+ *
7
+ * Both consumers need:
8
+ * - in-fence detection (skip headings/bullets inside ``` blocks),
9
+ * - the same H2/H3 slug derivation,
10
+ * - the same group-id format (`{productId}-group-{h2}[-{h3}]`),
11
+ * - the same candidate-paths order (`<root>/feature-tree.md` then
12
+ * `<root>/docs/platform/feature-tree.md`).
13
+ *
14
+ * Lifting these into one module keeps both builders honest about the
15
+ * exact shape of the file they read.
16
+ */
17
+ /** Resolve the first existing `feature-tree.md` candidate at the SDD root. */
18
+ export declare function findFeatureTreeFile(sddPath: string): Promise<string | null>;
19
+ /** Lowercase-hyphenated slug used by feature-group ids and bullet ids. */
20
+ export declare function slugify(text: string): string;
21
+ /**
22
+ * Build a feature-group id from a product id and one or two heading
23
+ * slugs. Single-arg form returns the H2-level id; two-arg form returns
24
+ * the nested H3-level id. Matches `feature-groups.ts` row emission so
25
+ * the bullet parser's `parent_group_id` resolves cleanly.
26
+ */
27
+ export declare function featureGroupId(productId: string, h2Slug: string, h3Slug?: string): string;
28
+ export interface HeadingEvent {
29
+ readonly kind: "h2" | "h3";
30
+ /** Cleaned heading text (numeric prefixes + trailing tags stripped). */
31
+ readonly text: string;
32
+ /** Slugified text (matches the id format used in `feature_groups.csv`). */
33
+ readonly slug: string;
34
+ /** Most recent H2 slug seen before this event (empty when an H3 has no enclosing H2). */
35
+ readonly parentH2Slug: string;
36
+ }
37
+ export interface BulletEvent {
38
+ readonly kind: "bullet";
39
+ /** Slug captured from `` `{slug}` `` — lowercase-hyphenated. */
40
+ readonly slug: string;
41
+ /** Description text after the em-dash, with any trailing `[runway: ...]` token stripped. */
42
+ readonly description: string;
43
+ /**
44
+ * Captured runway marker, verbatim (no normalisation, no prefix
45
+ * stripping). Empty when no `[runway: ...]` token was present.
46
+ */
47
+ readonly runway: string;
48
+ /** Most recent H2 slug at the bullet's position. Empty if none seen. */
49
+ readonly parentH2Slug: string;
50
+ /** Most recent H3 slug at the bullet's position. Empty if none seen since the last H2. */
51
+ readonly parentH3Slug: string;
52
+ }
53
+ export type FeatureTreeEvent = HeadingEvent | BulletEvent;
54
+ /**
55
+ * Walk a `feature-tree.md` text body and emit headings + bullets in
56
+ * source order. Inside fenced code blocks (```), nothing is emitted.
57
+ *
58
+ * Heading rules (mirror `feature-groups.ts` for compatibility):
59
+ * - H2/H3 lines emit a HeadingEvent. Numeric prefixes (`1.`, `1.1`)
60
+ * and trailing `[Tag]` markers are stripped from the displayed
61
+ * text and from the slug.
62
+ * - An H3 without an enclosing H2 emits with `parentH2Slug: ""`.
63
+ *
64
+ * Bullet rules (canonical form per
65
+ * `reverse/templates/application-product/feature-tree.md`):
66
+ *
67
+ * - `{slug}` — {description} `[runway: {marker}]`
68
+ *
69
+ * - Required: leading `-` or `*`, slug-in-backticks.
70
+ * - Optional: em-dash + description (description may be empty).
71
+ * - Optional trailing `` `[runway: ...]` `` token; captured verbatim
72
+ * into `runway` and stripped from `description`.
73
+ *
74
+ * The walker does NOT enforce a description-length cap — that's a
75
+ * builder concern. Slugs not matching `[a-z0-9][a-z0-9-]*` are
76
+ * skipped (defensive: avoids accidentally claiming free-form
77
+ * backtick-wrapped prose like inline code refs).
78
+ */
79
+ export declare function walkFeatureTree(text: string): FeatureTreeEvent[];
80
+ //# sourceMappingURL=feature-tree-walker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-tree-walker.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/feature-tree-walker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,8EAA8E;AAC9E,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAGR;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4FAA4F;IAC5F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,0FAA0F;IAC1F,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,WAAW,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAqDhE"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Shared walker for `feature-tree.md` files. Used by:
3
+ * - `buildFeatureGroups` — consumes H2/H3 events to emit `feature_groups.csv`.
4
+ * - `buildFeatures` (bullet branch, schema 2.2.0+) — consumes bullet
5
+ * events to emit `features.csv` rows with `source: "feature-tree"`.
6
+ *
7
+ * Both consumers need:
8
+ * - in-fence detection (skip headings/bullets inside ``` blocks),
9
+ * - the same H2/H3 slug derivation,
10
+ * - the same group-id format (`{productId}-group-{h2}[-{h3}]`),
11
+ * - the same candidate-paths order (`<root>/feature-tree.md` then
12
+ * `<root>/docs/platform/feature-tree.md`).
13
+ *
14
+ * Lifting these into one module keeps both builders honest about the
15
+ * exact shape of the file they read.
16
+ */
17
+ import { readFile } from "node:fs/promises";
18
+ import { join } from "node:path";
19
+ const CANDIDATE_PATHS_REL = [
20
+ "feature-tree.md",
21
+ join("docs", "platform", "feature-tree.md"),
22
+ ];
23
+ /** Resolve the first existing `feature-tree.md` candidate at the SDD root. */
24
+ export async function findFeatureTreeFile(sddPath) {
25
+ for (const rel of CANDIDATE_PATHS_REL) {
26
+ const full = join(sddPath, rel);
27
+ try {
28
+ await readFile(full, "utf-8");
29
+ return full;
30
+ }
31
+ catch (err) {
32
+ const code = err.code;
33
+ if (code === "ENOENT")
34
+ continue;
35
+ throw err;
36
+ }
37
+ }
38
+ return null;
39
+ }
40
+ /** Lowercase-hyphenated slug used by feature-group ids and bullet ids. */
41
+ export function slugify(text) {
42
+ return text
43
+ .toLowerCase()
44
+ .replace(/&/g, " and ")
45
+ .replace(/[^a-z0-9]+/g, "-")
46
+ .replace(/^-+|-+$/g, "");
47
+ }
48
+ /**
49
+ * Build a feature-group id from a product id and one or two heading
50
+ * slugs. Single-arg form returns the H2-level id; two-arg form returns
51
+ * the nested H3-level id. Matches `feature-groups.ts` row emission so
52
+ * the bullet parser's `parent_group_id` resolves cleanly.
53
+ */
54
+ export function featureGroupId(productId, h2Slug, h3Slug) {
55
+ const base = `${productId}-group-${h2Slug}`;
56
+ return h3Slug !== undefined && h3Slug !== "" ? `${base}-${h3Slug}` : base;
57
+ }
58
+ /**
59
+ * Walk a `feature-tree.md` text body and emit headings + bullets in
60
+ * source order. Inside fenced code blocks (```), nothing is emitted.
61
+ *
62
+ * Heading rules (mirror `feature-groups.ts` for compatibility):
63
+ * - H2/H3 lines emit a HeadingEvent. Numeric prefixes (`1.`, `1.1`)
64
+ * and trailing `[Tag]` markers are stripped from the displayed
65
+ * text and from the slug.
66
+ * - An H3 without an enclosing H2 emits with `parentH2Slug: ""`.
67
+ *
68
+ * Bullet rules (canonical form per
69
+ * `reverse/templates/application-product/feature-tree.md`):
70
+ *
71
+ * - `{slug}` — {description} `[runway: {marker}]`
72
+ *
73
+ * - Required: leading `-` or `*`, slug-in-backticks.
74
+ * - Optional: em-dash + description (description may be empty).
75
+ * - Optional trailing `` `[runway: ...]` `` token; captured verbatim
76
+ * into `runway` and stripped from `description`.
77
+ *
78
+ * The walker does NOT enforce a description-length cap — that's a
79
+ * builder concern. Slugs not matching `[a-z0-9][a-z0-9-]*` are
80
+ * skipped (defensive: avoids accidentally claiming free-form
81
+ * backtick-wrapped prose like inline code refs).
82
+ */
83
+ export function walkFeatureTree(text) {
84
+ const out = [];
85
+ let inFence = false;
86
+ let currentH2Slug = "";
87
+ let currentH3Slug = "";
88
+ for (const rawLine of text.split(/\r?\n/)) {
89
+ const line = rawLine.trimEnd();
90
+ if (line.startsWith("```")) {
91
+ inFence = !inFence;
92
+ continue;
93
+ }
94
+ if (inFence)
95
+ continue;
96
+ const heading = matchHeading(line);
97
+ if (heading !== null) {
98
+ const slug = slugify(heading.text);
99
+ if (slug === "")
100
+ continue;
101
+ if (heading.level === 2) {
102
+ currentH2Slug = slug;
103
+ currentH3Slug = "";
104
+ out.push({
105
+ kind: "h2",
106
+ text: heading.text,
107
+ slug,
108
+ parentH2Slug: "",
109
+ });
110
+ }
111
+ else {
112
+ currentH3Slug = slug;
113
+ out.push({
114
+ kind: "h3",
115
+ text: heading.text,
116
+ slug,
117
+ parentH2Slug: currentH2Slug,
118
+ });
119
+ }
120
+ continue;
121
+ }
122
+ const bullet = matchBullet(line);
123
+ if (bullet !== null) {
124
+ out.push({
125
+ kind: "bullet",
126
+ slug: bullet.slug,
127
+ description: bullet.description,
128
+ runway: bullet.runway,
129
+ parentH2Slug: currentH2Slug,
130
+ parentH3Slug: currentH3Slug,
131
+ });
132
+ }
133
+ }
134
+ return out;
135
+ }
136
+ function matchHeading(line) {
137
+ const m = /^(#{2,3})\s+(.+?)\s*$/.exec(line);
138
+ if (!m || m[1] === undefined || m[2] === undefined)
139
+ return null;
140
+ const level = m[1].length === 2 ? 2 : 3;
141
+ const text = m[2]
142
+ .replace(/^[\d.]+\s*/, "")
143
+ .replace(/\s*\[.+?\]\s*$/, "")
144
+ .trim();
145
+ if (text === "")
146
+ return null;
147
+ return { level, text };
148
+ }
149
+ const BULLET_RE = /^\s*[-*]\s+`([a-z0-9][a-z0-9-]*)`(?:\s*[—–-]\s*(.*))?\s*$/;
150
+ const RUNWAY_TAIL_RE = /\s*`\[runway:\s*([^\]]+?)\s*\]`\s*$/;
151
+ function matchBullet(line) {
152
+ const m = BULLET_RE.exec(line);
153
+ if (!m || m[1] === undefined)
154
+ return null;
155
+ const slug = m[1];
156
+ let rest = (m[2] ?? "").trim();
157
+ let runway = "";
158
+ const r = RUNWAY_TAIL_RE.exec(rest);
159
+ if (r !== null && r[1] !== undefined) {
160
+ runway = r[1];
161
+ rest = rest.slice(0, r.index).trim();
162
+ }
163
+ return { slug, description: rest, runway };
164
+ }
165
+ //# sourceMappingURL=feature-tree-walker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-tree-walker.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/feature-tree-walker.ts"],"names":[],"mappings":"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"}
@@ -18,16 +18,24 @@ export interface FeaturesBuildInputs {
18
18
  * platform-profile SDDs.
19
19
  */
20
20
  readonly productId: string;
21
+ /**
22
+ * Adopter-declared controlled vocabulary for `runway` values
23
+ * (schema 2.2.0+). When provided, bullet rows whose runway marker
24
+ * is not in this set emit a `convention` finding. When `null`, no
25
+ * validation runs and all values are accepted verbatim.
26
+ */
27
+ readonly runwayVocabulary?: ReadonlySet<string> | null;
21
28
  }
22
29
  export interface FeaturesBuildResult {
23
30
  readonly rows: CatalogueRow[];
24
31
  /** Map of feature spec relative path → feature id (for capability_feature edge resolution). */
25
32
  readonly idByPath: ReadonlyMap<string, string>;
26
33
  /**
27
- * Map of feature slug (filename stem) → feature id, for resolving
28
- * bare-slug references in personas/journeys content. First-seen wins
29
- * when the same slug appears under multiple capabilities; the orphan
30
- * finding from the consumer side surfaces the (rare) collision.
34
+ * Map of feature slug (filename stem or bullet slug) → feature id,
35
+ * for resolving bare-slug references in personas/journeys content.
36
+ * First-seen wins when the same slug appears under multiple
37
+ * sources; the orphan finding from the consumer side surfaces the
38
+ * (rare) collision.
31
39
  */
32
40
  readonly idBySlug: ReadonlyMap<string, string>;
33
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/features.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACpD,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAID,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAkG9B"}
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/features.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAOtE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACpD,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAKD,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CA+G9B"}
@@ -1,21 +1,38 @@
1
- // Features discoverer — emits `features.csv` rows from feature spec files
2
- // under `docs/domains/<domain>/product/features/<folder>/*.md`.
1
+ // Features discoverer — emits `features.csv` rows from three sources:
3
2
  //
4
- // Folder→capability mapping uses two sources, in order:
5
- // 1. Traceability manifest's `capability.feature_directory` field —
6
- // authoritative when a capability spec uses a folder name that
7
- // differs from the canonical capability_id (e.g. capability_id
8
- // "alerts-rules-engine" with feature_directory pointing at
9
- // "features/alerts-rules/").
10
- // 2. Folder name itself, when it equals a known capability_id.
3
+ // 1. Capability-scoped specs at `docs/domains/<d>/product/features/<folder>/*.md`.
4
+ // Folder→capability mapping uses (a) the traceability manifest's
5
+ // `capability.feature_directory` field authoritative when a
6
+ // capability spec uses a folder name that differs from the
7
+ // canonical capability_id (e.g. capability_id "alerts-rules-engine"
8
+ // with feature_directory pointing at "features/alerts-rules/")
9
+ // then (b) the folder name itself when it equals a known capability_id.
10
+ // id format: `{capability_id}-{feature-slug}`.
11
11
  //
12
- // id format: `{capability_id}-{feature-slug}` (matching the python
13
- // builder convention).
12
+ // 2. Application-product profile only: standalone specs at
13
+ // `features/<group>/<file>.md` under the SDD root.
14
+ // id format: `{productId}-{stem}`.
14
15
  //
15
- // name: feature slug; description: feature spec H1 title.
16
+ // 3. Application-product profile only (schema 2.2.0+): bullets in
17
+ // `feature-tree.md`. Canonical form:
18
+ //
19
+ // - `{slug}` — {description} `[runway: {marker}]`
20
+ //
21
+ // id format: `{productId}-{slug}`. Source path resolved via the
22
+ // shared `feature-tree-walker` (same candidates that
23
+ // buildFeatureGroups walks).
24
+ //
25
+ // Dedup ordering matters: walker (1) runs first (capability features),
26
+ // then walker (2) (standalone specs), then walker (3) (bullets). When
27
+ // a bullet's id is already in `seen` from a standalone spec the spec
28
+ // wins — divergence finding fires for the bullet. This matches the
29
+ // "standalone is more authoritative than bullet inventory" rule from
30
+ // plan extract-feature-tree-bullets.md §1.4.
16
31
  import { readdir, readFile } from "node:fs/promises";
17
32
  import { basename, join, relative, sep } from "node:path";
33
+ import { featureGroupId, findFeatureTreeFile, walkFeatureTree, } from "./feature-tree-walker.js";
18
34
  const DOMAINS_DIR_REL = join("docs", "domains");
35
+ const DESCRIPTION_MAX = 500;
19
36
  export async function buildFeatures(inputs) {
20
37
  // Build folder→capability_id map from traceability feature_directory.
21
38
  const folderToCap = new Map();
@@ -62,6 +79,7 @@ export async function buildFeatures(inputs) {
62
79
  maturity: "",
63
80
  status: "active",
64
81
  source: "feature-spec",
82
+ runway: "",
65
83
  source_sdd_id: "",
66
84
  });
67
85
  idByPath.set(relPath, id);
@@ -95,15 +113,78 @@ export async function buildFeatures(inputs) {
95
113
  maturity: "",
96
114
  status: "active",
97
115
  source: "feature-spec",
116
+ runway: "",
98
117
  source_sdd_id: "",
99
118
  });
100
119
  idByPath.set(relPath, id);
101
120
  if (!idBySlug.has(stem))
102
121
  idBySlug.set(stem, id);
103
122
  }
123
+ // Bullet branch — feature-tree.md.
124
+ await emitBulletRows({
125
+ sddPath: inputs.sddPath,
126
+ productId: inputs.productId,
127
+ findings: inputs.findings,
128
+ runwayVocabulary: inputs.runwayVocabulary ?? null,
129
+ seen,
130
+ rows,
131
+ idBySlug,
132
+ });
104
133
  }
105
134
  return { rows, idByPath, idBySlug };
106
135
  }
136
+ async function emitBulletRows(ctx) {
137
+ const featureTreePath = await findFeatureTreeFile(ctx.sddPath);
138
+ if (!featureTreePath)
139
+ return;
140
+ const text = await readFile(featureTreePath, "utf-8");
141
+ const events = walkFeatureTree(text);
142
+ const relPath = relative(ctx.sddPath, featureTreePath);
143
+ let bulletCount = 0;
144
+ for (const ev of events) {
145
+ if (ev.kind !== "bullet")
146
+ continue;
147
+ bulletCount++;
148
+ const id = `${ctx.productId}-${ev.slug}`;
149
+ if (ctx.seen.has(id)) {
150
+ ctx.findings.add("divergence", `${relPath}: feature-tree.md bullet "${ev.slug}" superseded by an earlier feature spec with id "${id}"`);
151
+ continue;
152
+ }
153
+ ctx.seen.add(id);
154
+ if (ev.runway !== "" &&
155
+ ctx.runwayVocabulary !== null &&
156
+ !ctx.runwayVocabulary.has(ev.runway)) {
157
+ ctx.findings.add("convention", `${relPath}: unrecognised runway value "${ev.runway}" in feature "${ev.slug}" — declare it in feature-runway-vocabulary.yaml`);
158
+ }
159
+ const parentGroupId = ev.parentH3Slug !== ""
160
+ ? featureGroupId(ctx.productId, ev.parentH2Slug !== "" ? ev.parentH2Slug : ev.parentH3Slug, ev.parentH2Slug !== "" ? ev.parentH3Slug : undefined)
161
+ : ev.parentH2Slug !== ""
162
+ ? featureGroupId(ctx.productId, ev.parentH2Slug)
163
+ : "";
164
+ const description = ev.description.length > DESCRIPTION_MAX
165
+ ? ev.description.slice(0, DESCRIPTION_MAX)
166
+ : ev.description;
167
+ ctx.rows.push({
168
+ id,
169
+ name: ev.slug,
170
+ product_id: ctx.productId,
171
+ capability_id: "",
172
+ parent_group_id: parentGroupId,
173
+ parent_feature_id: "",
174
+ description,
175
+ maturity: "",
176
+ status: "active",
177
+ source: "feature-tree",
178
+ runway: ev.runway,
179
+ source_sdd_id: "",
180
+ });
181
+ if (!ctx.idBySlug.has(ev.slug))
182
+ ctx.idBySlug.set(ev.slug, id);
183
+ }
184
+ if (bulletCount === 0) {
185
+ ctx.findings.add("coverage", `${relPath}: feature-tree.md found but no recognisable feature bullets — features.csv populated only from features/ specs`);
186
+ }
187
+ }
107
188
  const FEATURES_DIR_REL = "features";
108
189
  async function collectAppFeatureSpecs(sddPath) {
109
190
  const out = [];
@@ -1 +1 @@
1
- {"version":3,"file":"features.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/features.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/features.ts"],"names":[],"mappings":"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"}
@@ -45,7 +45,7 @@
45
45
  # Builder contract: see docs/method/methods/catalogue-builder-specification.md.
46
46
  # Category taxonomy: see docs/method/methods/product-category-taxonomy.md.
47
47
 
48
- schema_version: "2.1.0"
48
+ schema_version: "2.2.0"
49
49
  schema_owner: "sdd-method"
50
50
  schema_status: "canonical"
51
51
 
@@ -275,7 +275,8 @@ catalogues:
275
275
  - { name: description, type: string, nullable: true }
276
276
  - { name: maturity, type: string, nullable: true, description: "Standard: working | provisional | unknown | absent. Ecosystem-specific values may be added with parser awareness." }
277
277
  - { name: status, type: string, nullable: false, description: "Default 'active'." }
278
- - { name: source, type: string, nullable: false, description: "feature-tree | feature-set | capability-spec | feature-spec (forward-only). NOTE: feature-tree-group source removed in 1.3.0 — groups are now first-class in feature_groups.csv." }
278
+ - { name: source, type: string, nullable: false, description: "feature-tree | feature-set | capability-spec | feature-spec. NOTE: feature-tree-group source removed in 1.3.0 — groups are now first-class in feature_groups.csv. As of schema 2.2.0, source: feature-tree is emitted by the canonical builder for rows derived from feature-tree.md bullets." }
279
+ - { name: runway, type: string, nullable: true, description: "Optional adopter-owned lifecycle / migration marker. Free string at method level — the schema declares no enum and ships no controlled vocabulary. Adopters MAY declare a per-SDD `feature-runway-vocabulary.yaml` at their SDD root; when present, the canonical builder validates captured values against it and emits a `convention` finding for unknown values. Empty when the adopter does not track migration state. Comparability across SDDs requires ecosystem-level vocabulary alignment as an explicit pre-step. Added in schema 2.2.0." }
279
280
  - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
280
281
 
281
282
  personas:
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Loader for the optional `feature-runway-vocabulary.yaml` config that
3
+ * adopters can ship at the SDD root (schema 2.2.0+).
4
+ *
5
+ * The file declares a controlled vocabulary for the `runway` column on
6
+ * `features.csv`. When present, the canonical builder validates
7
+ * captured runway values against the declared `values[*].id` set;
8
+ * unknown values emit a `convention` finding. When absent, no
9
+ * validation runs and any runway value is accepted verbatim.
10
+ *
11
+ * The method does NOT bless any vocabulary — there is no method-level
12
+ * enum, no canonical mapping, no normalisation. See
13
+ * catalogue-metamodel.md §"Runway vocabulary (informative recipe)" for
14
+ * the rationale.
15
+ */
16
+ export interface LoadedRunwayVocabulary {
17
+ /** Set of recognised `runway` values, derived from `values[*].id`. */
18
+ readonly values: ReadonlySet<string>;
19
+ /** Path the vocabulary was loaded from (relative to SDD root). */
20
+ readonly relPath: string;
21
+ }
22
+ /**
23
+ * Load the optional vocabulary from `<sddPath>/feature-runway-vocabulary.yaml`.
24
+ * Returns `null` when the file is absent — callers treat that as "no
25
+ * validation runs". Throws on malformed YAML or a missing/non-array
26
+ * `values` key (the file exists, so the adopter intends validation;
27
+ * fail loud rather than silently disable it).
28
+ */
29
+ export declare function loadRunwayVocabulary(sddPath: string): Promise<LoadedRunwayVocabulary | null>;
30
+ //# sourceMappingURL=runway-vocabulary-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runway-vocabulary-loader.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/runway-vocabulary-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAUD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CA+BxC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Loader for the optional `feature-runway-vocabulary.yaml` config that
3
+ * adopters can ship at the SDD root (schema 2.2.0+).
4
+ *
5
+ * The file declares a controlled vocabulary for the `runway` column on
6
+ * `features.csv`. When present, the canonical builder validates
7
+ * captured runway values against the declared `values[*].id` set;
8
+ * unknown values emit a `convention` finding. When absent, no
9
+ * validation runs and any runway value is accepted verbatim.
10
+ *
11
+ * The method does NOT bless any vocabulary — there is no method-level
12
+ * enum, no canonical mapping, no normalisation. See
13
+ * catalogue-metamodel.md §"Runway vocabulary (informative recipe)" for
14
+ * the rationale.
15
+ */
16
+ import { readFile } from "node:fs/promises";
17
+ import { join } from "node:path";
18
+ import { parse as parseYaml } from "yaml";
19
+ const VOCABULARY_FILENAME = "feature-runway-vocabulary.yaml";
20
+ /**
21
+ * Load the optional vocabulary from `<sddPath>/feature-runway-vocabulary.yaml`.
22
+ * Returns `null` when the file is absent — callers treat that as "no
23
+ * validation runs". Throws on malformed YAML or a missing/non-array
24
+ * `values` key (the file exists, so the adopter intends validation;
25
+ * fail loud rather than silently disable it).
26
+ */
27
+ export async function loadRunwayVocabulary(sddPath) {
28
+ const full = join(sddPath, VOCABULARY_FILENAME);
29
+ let text;
30
+ try {
31
+ text = await readFile(full, "utf-8");
32
+ }
33
+ catch (err) {
34
+ const code = err.code;
35
+ if (code === "ENOENT")
36
+ return null;
37
+ throw err;
38
+ }
39
+ const raw = parseYaml(text);
40
+ if (raw === null || typeof raw !== "object") {
41
+ throw new Error(`${VOCABULARY_FILENAME}: expected a mapping at the document root`);
42
+ }
43
+ if (!Array.isArray(raw.values)) {
44
+ throw new Error(`${VOCABULARY_FILENAME}: expected a 'values:' array at the document root`);
45
+ }
46
+ const values = new Set();
47
+ for (const entry of raw.values) {
48
+ if (entry === null || typeof entry !== "object")
49
+ continue;
50
+ const id = entry.id;
51
+ if (typeof id === "string" && id !== "")
52
+ values.add(id);
53
+ }
54
+ return { values, relPath: VOCABULARY_FILENAME };
55
+ }
56
+ //# sourceMappingURL=runway-vocabulary-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runway-vocabulary-loader.js","sourceRoot":"","sources":["../../../src/lib/catalogue/runway-vocabulary-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,MAAM,mBAAmB,GAAG,gCAAgC,CAAC;AAiB7D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAe;IAEf,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAChD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAyB,CAAC;IACpD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,GAAG,mBAAmB,2CAA2C,CAClE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,GAAG,mBAAmB,mDAAmD,CAC1E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAC1D,MAAM,EAAE,GAAI,KAAkB,CAAC,EAAE,CAAC;QAClC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAClD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks-seed/merge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,aAAa,EAEb,UAAU,EACV,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,sEAAsE;IACtE,QAAQ,CAAC,aAAa,EAAE,SAAS,aAAa,EAAE,CAAC;IACjD,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,UAAU,GAChB,iBAAiB,CAgDnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,UAAU,GAChB,SAAS,aAAa,EAAE,CAkB1B"}
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks-seed/merge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEV,aAAa,EAEb,UAAU,EACV,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAwCpB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,sEAAsE;IACtE,QAAQ,CAAC,aAAa,EAAE,SAAS,aAAa,EAAE,CAAC;IACjD,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,UAAU,GAChB,iBAAiB,CAuEnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,UAAU,GAChB,SAAS,aAAa,EAAE,CAkB1B"}
@@ -5,7 +5,42 @@
5
5
  * commands. Adopter-added matchers lack the sentinel and survive
6
6
  * sync untouched.
7
7
  */
8
- import { isMethodManagedMatcher } from "./types.js";
8
+ import { METHOD_MANAGED_SENTINEL, isMethodManagedMatcher } from "./types.js";
9
+ /**
10
+ * Strip the method-managed sentinel and trailing whitespace from a hook
11
+ * command so two commands can be compared modulo ownership marker.
12
+ */
13
+ function normaliseCommand(command) {
14
+ return command.replace(METHOD_MANAGED_SENTINEL, "").trimEnd();
15
+ }
16
+ /**
17
+ * Two matchers are equivalent (modulo sentinel) when:
18
+ * - their `matcher` strings are equal, AND
19
+ * - their `hooks` arrays have the same length, AND
20
+ * - each pair of corresponding `hooks[i]` has the same `type` and the
21
+ * same normalised `command` (sentinel suffix stripped, trailing
22
+ * whitespace trimmed).
23
+ *
24
+ * This handles the case where an adopter manually authored the method's
25
+ * hook before the first managed sync — the resulting entry differs from
26
+ * the method-supplied one only in the missing sentinel suffix.
27
+ */
28
+ function matchersEquivalentExcludingSentinel(a, b) {
29
+ if (a.matcher !== b.matcher)
30
+ return false;
31
+ if (a.hooks.length !== b.hooks.length)
32
+ return false;
33
+ for (let i = 0; i < a.hooks.length; i++) {
34
+ const ha = a.hooks[i];
35
+ const hb = b.hooks[i];
36
+ if (ha.type !== hb.type)
37
+ return false;
38
+ if (normaliseCommand(ha.command) !== normaliseCommand(hb.command)) {
39
+ return false;
40
+ }
41
+ }
42
+ return true;
43
+ }
9
44
  export function upsertMethodManagedHooks(existing, owned) {
10
45
  const current = isHooksObject(existing["hooks"])
11
46
  ? existing["hooks"]
@@ -13,10 +48,29 @@ export function upsertMethodManagedHooks(existing, owned) {
13
48
  const nextHooks = {};
14
49
  const changedEvents = [];
15
50
  // Start by copying every existing event's adopter-owned matchers.
51
+ // Drop adopter matchers that are equivalent (modulo sentinel) to a
52
+ // method-managed matcher we're about to add — otherwise we'd leave
53
+ // a duplicated entry. This handles two cases:
54
+ // (a) Adopter authored the method's hook by hand before the first
55
+ // managed sync (no sentinel on their entry).
56
+ // (b) A historical sync that already produced the duplicate state
57
+ // (one marked entry + one unmarked equivalent); the unmarked
58
+ // twin is auto-cleaned on next merge.
59
+ let dedupedAny = false;
16
60
  for (const [event, matchers] of Object.entries(current)) {
17
61
  if (!matchers)
18
62
  continue;
19
- const adopterMatchers = matchers.filter((m) => !isMethodManagedMatcher(m));
63
+ const ownedForEvent = owned[event] ?? [];
64
+ const adopterMatchers = matchers.filter((m) => {
65
+ if (isMethodManagedMatcher(m))
66
+ return false;
67
+ const equivalent = ownedForEvent.some((o) => matchersEquivalentExcludingSentinel(m, o));
68
+ if (equivalent) {
69
+ dedupedAny = true;
70
+ return false;
71
+ }
72
+ return true;
73
+ });
20
74
  if (adopterMatchers.length > 0)
21
75
  nextHooks[event] = [...adopterMatchers];
22
76
  }
@@ -33,8 +87,9 @@ export function upsertMethodManagedHooks(existing, owned) {
33
87
  bucket.push(...ownedMatchers);
34
88
  nextHooks[event] = bucket;
35
89
  }
36
- const changed = changedEvents.length > 0;
37
- if (!changed && Object.keys(nextHooks).length === Object.keys(current).length) {
90
+ const changed = changedEvents.length > 0 || dedupedAny;
91
+ if (!changed &&
92
+ Object.keys(nextHooks).length === Object.keys(current).length) {
38
93
  // No method-managed changes AND no adopter matchers reshuffled.
39
94
  return { settings: existing, changedEvents: [], changed: false };
40
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/lib/hooks-seed/merge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/lib/hooks-seed/merge.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sdd-method/sdd-cli",
3
- "version": "0.12.1",
4
- "description": "Method-layer CLI for SDD repository lifecycle — init, sync, validate, list, plan, generate-claude-md, mcp serve, catalogue {build,aggregate,validate,version}. v0.12.0 extends the integration profileType enum to 11 values (per sdd-method ADR 0137 adds device-platform, oem-platform, fleet-partner, camera-platform, data-aggregator) and fixes the init→sync conflict that aborted bootstrap mid-flight when the scaffold step's seed files collided with the bundle's canonical versions. v0.11.0 shipped the canonical catalogue surface per ADR 0134 + schema 2.1.0 (ADR 0136): per-SDD catalogue build covering all four profiles, federation aggregator, validate + version subcommands, and the C4 + persona/journey/product-edge builders that complete Phase 2.",
3
+ "version": "0.13.0",
4
+ "description": "Method-layer CLI for SDD repository lifecycle — init, sync, validate, list, plan, generate-claude-md, mcp serve, catalogue {build,aggregate,validate,version}. v0.13.0 ships the feature-tree.md bullet parser per sdd-method schema 2.2.0 + plan extract-feature-tree-bullets.md: application-product builders now emit features.csv rows with source: \"feature-tree\" from per-app feature-tree.md bullets, populating the previously-empty edge catalogues (persona_feature, journey_feature) for portfolio monoliths whose feature inventory lives in the bullet form. Adds the optional runway column on features.csv with adopter-owned controlled-vocabulary validation via feature-runway-vocabulary.yaml at the SDD root. v0.12.2 dedupes equivalent unmarked adopter PreToolUse entries on settings.json upsert. v0.12.0 extends the integration profileType enum to 11 values (per sdd-method ADR 0137) and fixes the init→sync conflict. v0.11.0 shipped the canonical catalogue surface per ADR 0134 + schema 2.1.0.",
5
5
  "keywords": [
6
6
  "sdd-method",
7
7
  "sdd",