@sdd-method/sdd-cli 0.14.0 → 0.14.1

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.
@@ -7,12 +7,22 @@
7
7
  * their own builds; the aggregator merges by primary key.
8
8
  *
9
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).
10
+ * - For platform-profile SDDs: manifest.domainId when declared, else
11
+ * a sensible default for platform-profile categories (where a real
12
+ * `platform` domain exists locally).
13
+ * - For application-product / integration-product / support-repo
14
+ * SDDs: always empty. App and integration products do not have a
15
+ * primary domain they are federation nodes that consume
16
+ * capabilities across multiple domains via product_capability. Any
17
+ * domain_id declared in the manifest of a non-platform SDD is
18
+ * typically the umbrella name (e.g. "applications", "integrations")
19
+ * used as a structural-organisation convention; that umbrella is
20
+ * not a domain row in any SDD's domains.csv (only platform-profile
21
+ * SDDs emit domain rows post-v0.14.0), so propagating it would
22
+ * produce a dangling FK reference.
23
+ *
24
+ * When such a manifest declaration is present, we clear the field
25
+ * and emit an "inferred" finding so the override is traceable.
16
26
  */
17
27
  import type { CatalogueRow } from "../csv-writer.js";
18
28
  import type { FindingsLog } from "../findings.js";
@@ -1 +1 @@
1
- {"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/products.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAYD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,GAC1B,YAAY,EAAE,CA6BhB"}
1
+ {"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/products.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAYD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,GAC1B,YAAY,EAAE,CA+ChB"}
@@ -7,12 +7,22 @@
7
7
  * their own builds; the aggregator merges by primary key.
8
8
  *
9
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).
10
+ * - For platform-profile SDDs: manifest.domainId when declared, else
11
+ * a sensible default for platform-profile categories (where a real
12
+ * `platform` domain exists locally).
13
+ * - For application-product / integration-product / support-repo
14
+ * SDDs: always empty. App and integration products do not have a
15
+ * primary domain they are federation nodes that consume
16
+ * capabilities across multiple domains via product_capability. Any
17
+ * domain_id declared in the manifest of a non-platform SDD is
18
+ * typically the umbrella name (e.g. "applications", "integrations")
19
+ * used as a structural-organisation convention; that umbrella is
20
+ * not a domain row in any SDD's domains.csv (only platform-profile
21
+ * SDDs emit domain rows post-v0.14.0), so propagating it would
22
+ * produce a dangling FK reference.
23
+ *
24
+ * When such a manifest declaration is present, we clear the field
25
+ * and emit an "inferred" finding so the override is traceable.
16
26
  */
17
27
  /**
18
28
  * Default domain_id per category when the manifest doesn't declare one.
@@ -26,9 +36,25 @@ const DEFAULT_DOMAIN_BY_CATEGORY = {
26
36
  export function buildProducts(inputs) {
27
37
  const m = inputs.manifest;
28
38
  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)`);
39
+ let domainId;
40
+ if (m.profile === "platform-profile") {
41
+ domainId = m.domainId ?? defaulted ?? "";
42
+ if (m.domainId === undefined && defaulted !== undefined) {
43
+ inputs.findings.add("inferred", `products: domain_id="${defaulted}" inferred from category=${m.category} (manifest had no domain_id)`);
44
+ }
45
+ }
46
+ else {
47
+ // Per ADR 0136: app/integration/support products do not have a
48
+ // primary domain. Even if the manifest declares one (typically the
49
+ // umbrella name like "applications" or "integrations"), clear it
50
+ // here so the products.domain_id FK reference does not dangle
51
+ // against domains.csv (which only platform-profile SDDs populate
52
+ // post-v0.14.0). Emit a finding when the manifest declared a value
53
+ // so the override is traceable.
54
+ domainId = "";
55
+ if (m.domainId !== undefined && m.domainId.length > 0) {
56
+ inputs.findings.add("inferred", `products: domain_id cleared (manifest declared "${m.domainId}") for profile=${m.profile} per ADR 0136 — app/integration/support products do not have a primary domain`);
57
+ }
32
58
  }
33
59
  return [
34
60
  {
@@ -1 +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"}
1
+ {"version":3,"file":"products.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/products.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;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;IAEzD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC,CAAC,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACrC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,SAAS,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACxD,MAAM,CAAC,QAAQ,CAAC,GAAG,CACjB,UAAU,EACV,wBAAwB,SAAS,4BAA4B,CAAC,CAAC,QAAQ,8BAA8B,CACtG,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,+DAA+D;QAC/D,mEAAmE;QACnE,iEAAiE;QACjE,8DAA8D;QAC9D,iEAAiE;QACjE,mEAAmE;QACnE,gCAAgC;QAChC,QAAQ,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,QAAQ,CAAC,GAAG,CACjB,UAAU,EACV,mDAAmD,CAAC,CAAC,QAAQ,kBAAkB,CAAC,CAAC,OAAO,+EAA+E,CACxK,CAAC;QACJ,CAAC;IACH,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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sdd-method/sdd-cli",
3
- "version": "0.14.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.14.0 ships two post-v0.9.0-release fixes surfaced by the connect-cohort sync: (1) sync now enforces minimum_sdd_cli_version declared by bundle manifests — previously the orchestration check existed only in the shell sync script and was a no-op when adopters used `sdd-cli sync`, leaving the safety net for stale-CLI scenarios silently absent; (2) per ADR 0136 (App and Integration Products Do Not Belong to a Primary Domain), the domains.ts catalogue builder now skips row emission for non-platform-profile SDDs — application-product and integration-product SDDs that have a docs/domains/<umbrella>/ subdirectory as a structural-organisation convention no longer emit a member-declaration row that collides on PK at aggregation against the canonical platform-profile contribution. v0.13.2 fixed the aggregator's sibling-vendored-schema cross-check to use semver range satisfaction against SCHEMA_COMPAT.catalogue_schema (^2.0.0) instead of strict equality — siblings vendored at lower minor versions inside the same major are now accepted, unblocking aggregation across federated cohorts where the canonical schema is ahead of the bundled schema. 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.",
3
+ "version": "0.14.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.14.1 patches v0.14.0's domains-builder fix: products-builder now also clears domain_id for non-platform-profile rows even when manifest.domainId is declared. v0.14.0 stopped emitting umbrella domain rows but products.domain_id (and the applications.csv filtered view) still pointed at them, dangling at FK validation. Per ADR 0136 + schema description for products.domain_id, app/integration/support products do not have a primary domain — the builder now honours that statement regardless of manifest declaration, and emits an inferred finding when a manifest-declared value is overridden. v0.14.0 ships two post-v0.9.0-release fixes surfaced by the connect-cohort sync: (1) sync now enforces minimum_sdd_cli_version declared by bundle manifests — previously the orchestration check existed only in the shell sync script and was a no-op when adopters used `sdd-cli sync`, leaving the safety net for stale-CLI scenarios silently absent; (2) per ADR 0136 (App and Integration Products Do Not Belong to a Primary Domain), the domains.ts catalogue builder now skips row emission for non-platform-profile SDDs — application-product and integration-product SDDs that have a docs/domains/<umbrella>/ subdirectory as a structural-organisation convention no longer emit a member-declaration row that collides on PK at aggregation against the canonical platform-profile contribution. v0.13.2 fixed the aggregator's sibling-vendored-schema cross-check to use semver range satisfaction against SCHEMA_COMPAT.catalogue_schema (^2.0.0) instead of strict equality — siblings vendored at lower minor versions inside the same major are now accepted, unblocking aggregation across federated cohorts where the canonical schema is ahead of the bundled schema. 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",