@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,109 @@
1
+ /**
2
+ * Loader for the optional `.sdd/service-contract-aliases.yaml` config.
3
+ *
4
+ * Adopters use this map to translate outbound interface display text
5
+ * (as it appears in service-architecture.md External Interfaces tables)
6
+ * into canonical contract names that resolve against contracts.csv.
7
+ *
8
+ * File shape:
9
+ *
10
+ * interface_aliases:
11
+ * # Case-insensitive exact match on the Interface column text.
12
+ * Masternauth service: masternauth-oauth-api
13
+ * CWS: cws-paddington-api
14
+ * Paddington: cws-paddington-api
15
+ *
16
+ * interface_contains:
17
+ * # Case-insensitive substring match. The longest key wins on
18
+ * # ties; ordering in the file otherwise matters only when keys
19
+ * # overlap. Use when adopter interface text has many qualified
20
+ * # variants ("Masternauth API", "Masternauth `/token`", etc.).
21
+ * Masternauth: masternauth-oauth-api
22
+ * Paddington: cws-paddington-api
23
+ *
24
+ * skip_callers:
25
+ * # Repo names to skip entirely (postman collections, smoke tests,
26
+ * # legacy folders inside a federated SDD that aren't runtime
27
+ * # services). Use when the federated SDD lacks a services.csv to
28
+ * # gate emission and consumes rows would otherwise dangle at the
29
+ * # aggregator with unresolved service_id.
30
+ * - postman-tacho
31
+ * - smoke-tests
32
+ *
33
+ * same_product_inference:
34
+ * # Maps generic interface text (case-insensitive exact) to a
35
+ * # contract-name template. `{prefix}` is substituted with the
36
+ * # caller's service_id minus a known suffix (-api, -bff, -ui,
37
+ * # -consumer, -web). The builder then looks up the resolved name
38
+ * # in contracts.csv.
39
+ * Private API: "{prefix}-private-api"
40
+ * Private API Gateway: "{prefix}-private-api"
41
+ *
42
+ * Either block is optional. Empty / missing file = no aliases.
43
+ */
44
+ import { readFile } from "node:fs/promises";
45
+ import { join } from "node:path";
46
+ import { parse as parseYaml } from "yaml";
47
+ const ALIASES_FILENAME = join(".sdd", "service-contract-aliases.yaml");
48
+ export async function loadServiceContractAliases(sddPath) {
49
+ const full = join(sddPath, ALIASES_FILENAME);
50
+ let text;
51
+ try {
52
+ text = await readFile(full, "utf-8");
53
+ }
54
+ catch (err) {
55
+ const code = err.code;
56
+ if (code === "ENOENT")
57
+ return null;
58
+ throw err;
59
+ }
60
+ const raw = parseYaml(text);
61
+ if (raw === null || typeof raw !== "object") {
62
+ throw new Error(`${ALIASES_FILENAME}: expected a mapping at the document root`);
63
+ }
64
+ return {
65
+ interfaceAliases: toLowerKeyMap(raw.interface_aliases),
66
+ interfaceContains: toContainsList(raw.interface_contains),
67
+ sameProductTemplates: toLowerKeyMap(raw.same_product_inference),
68
+ skipCallers: toStringSet(raw.skip_callers),
69
+ relPath: ALIASES_FILENAME,
70
+ };
71
+ }
72
+ function toStringSet(raw) {
73
+ const out = new Set();
74
+ if (Array.isArray(raw)) {
75
+ for (const item of raw) {
76
+ if (typeof item === "string" && item !== "")
77
+ out.add(item);
78
+ }
79
+ }
80
+ return out;
81
+ }
82
+ function toContainsList(raw) {
83
+ const out = [];
84
+ if (raw === null || raw === undefined)
85
+ return out;
86
+ if (typeof raw !== "object" || Array.isArray(raw))
87
+ return out;
88
+ for (const [k, v] of Object.entries(raw)) {
89
+ if (typeof v === "string" && v !== "") {
90
+ out.push([k.toLowerCase().trim(), v]);
91
+ }
92
+ }
93
+ // Sort longest-key-first so the most specific substring wins.
94
+ out.sort((a, b) => b[0].length - a[0].length);
95
+ return out;
96
+ }
97
+ function toLowerKeyMap(raw) {
98
+ const out = new Map();
99
+ if (raw === null || raw === undefined)
100
+ return out;
101
+ if (typeof raw !== "object" || Array.isArray(raw))
102
+ return out;
103
+ for (const [k, v] of Object.entries(raw)) {
104
+ if (typeof v === "string" && v !== "")
105
+ out.set(k.toLowerCase().trim(), v);
106
+ }
107
+ return out;
108
+ }
109
+ //# sourceMappingURL=service-contract-aliases-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-contract-aliases-loader.js","sourceRoot":"","sources":["../../../src/lib/catalogue/service-contract-aliases-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;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,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;AAyBvE,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAe;IAEf,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC7C,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,CAAsB,CAAC;IACjD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,GAAG,gBAAgB,2CAA2C,CAC/D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,gBAAgB,EAAE,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACtD,iBAAiB,EAAE,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACzD,oBAAoB,EAAE,aAAa,CAAC,GAAG,CAAC,sBAAsB,CAAC;QAC/D,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;QAC1C,OAAO,EAAE,gBAAgB;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;YACvB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CACrB,GAAwC;IAExC,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC9D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,8DAA8D;IAC9D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CACpB,GAAwC;IAExC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC9D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sdd-method/sdd-cli",
3
- "version": "0.17.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.17.0 enables multi-level federation: organisation-level SDDs can now aggregate from organisation-level children (e.g. CXS aggregating sdd-mining, sdd-latam) via optional level: organisation field on siblings, skipping manifest requirements for pure orchestration repos. v0.16.0 adds organisation-profile support for system-of-systems aggregators (e.g. CXS aggregating sdd-connect, sdd-mining, sdd-latam), closing the gap for organisation-level SDD manifests. v0.15.0 ships catalogue schema 2.4.0 (lockstep with sdd-method): adds feature_contract derived edge (forward: capability_feature ⋈ capability_contract; reverse: feature_service ⋈ service_contract) closing the Capability → Feature → Contract chain pre-implementation, plus the new DomainModel entity per ADR 0142 with domain_models / capability_domain_model / feature_domain_model catalogues sourced from a new traceability.domain_model manifest field (forward) or docs/domains/*/architecture/data-model.mermaid.md file-system scan (reverse). Platform-profile only for domain_models; the metamodel now also documents non-catalogued method artefacts (work orders, discovery stories, execution stories, traceability manifests) so it's a complete reference for the forward SDD method's artefact set. SCHEMA_COMPAT unchanged (still ^2.0.0). 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.",
3
+ "version": "0.21.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.21.0 ships catalogue schema 2.8.0 closing the long-tail contract-consumer mapping gap (K-03a). The contracts builder now also walks the platform-profile layout `docs/domains/<dom>/contracts/{openapi,proto,avro}/<file>.<ext>` documented in reverse/workflows/contract.md, in addition to the canonical `contracts/<subdir>/<dom>/<file>.<ext>` layout — backward-compatible additive change for federated SDDs that don't carry per-domain contracts. Adds a new buildServiceContractConsumes builder that parses each service's `repos/<service>/docs/service-architecture.md` External Interfaces table, reads Outbound rows, and emits `service_contract` rows with role=consumes via an adopter-supplied `.sdd/service-contract-aliases.yaml` (case-insensitive interface_aliases + interface_contains substring tier + same_product_inference templates with `{prefix}` substitution). Schema 2.8.0 marks service_contract.contract_id as external:true so federated SDDs can emit consumes rows pointing to platform-root contracts; aggregator validates the merged catalogue. Resolution failures become convention findings, not FK-invalid rows. Pattern documented in sdd-method ADR 0147. SCHEMA_COMPAT unchanged (still ^2.0.0). v0.19.0 ships catalogue schema 2.6.0 (lockstep with sdd-method): adds optional `sub_integrations:` array on integration-manifest.yaml per ADR 0144. Multi-provider integration monoliths (modernisation-in-flight or intentional permanent gateways brokering N providers) can declare each provider; the integrations.ts builder emits one integrations.csv row per sub_integration with parent_product_id = umbrella SDD's integrationId. Uses the existing parent_product_id column — no new schema columns. Backward compatible (optional field); SDDs without sub_integrations emit identical output to pre-2.6.0. Originating motivation: connect's sdd-camera-platform-legacy covering Surfsight v2 + VisionTrack v1/v2 + SureCam in one Spring-Boot codebase. SCHEMA_COMPAT unchanged (still ^2.0.0). v0.18.0 ships catalogue schema 2.5.0 (lockstep with sdd-method): adds feature-grounding source per ADR 0143. Canonical builder walks `docs/domains/<dom>/design/<capability>/feature-grounding.md` (platform-profile) and `docs/design/integration/feature-grounding.md` (integration-product), parses the markdown table form, and emits features.csv rows (source: feature-grounding, capability-owned) plus capability_feature / feature_repo / feature_service edges derived from the table columns. Optional per-SDD `.sdd/feature-grounding-aliases.yaml` translates display names (class names, file basenames) to canonical service / repo ids. SCHEMA_COMPAT unchanged (still ^2.0.0). v0.17.0 enables multi-level federation: organisation-level SDDs can now aggregate from organisation-level children (e.g. CXS aggregating sdd-mining, sdd-latam) via optional level: organisation field on siblings, skipping manifest requirements for pure orchestration repos. v0.16.0 adds organisation-profile support for system-of-systems aggregators (e.g. CXS aggregating sdd-connect, sdd-mining, sdd-latam), closing the gap for organisation-level SDD manifests. v0.15.0 ships catalogue schema 2.4.0 (lockstep with sdd-method): adds feature_contract derived edge (forward: capability_feature ⋈ capability_contract; reverse: feature_service ⋈ service_contract) closing the Capability → Feature → Contract chain pre-implementation, plus the new DomainModel entity per ADR 0142 with domain_models / capability_domain_model / feature_domain_model catalogues sourced from a new traceability.domain_model manifest field (forward) or docs/domains/*/architecture/data-model.mermaid.md file-system scan (reverse). Platform-profile only for domain_models; the metamodel now also documents non-catalogued method artefacts (work orders, discovery stories, execution stories, traceability manifests) so it's a complete reference for the forward SDD method's artefact set. SCHEMA_COMPAT unchanged (still ^2.0.0). 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",