@sdd-method/author-cli 0.0.0-stage → 0.1.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 (203) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +17 -0
  3. package/README.md +6 -2
  4. package/dist/author-bin.js +8 -0
  5. package/dist/author-program.js +99 -0
  6. package/dist/lib/adr-origin.js +59 -0
  7. package/dist/lib/agent-harness.js +37 -0
  8. package/dist/lib/api-surface/__fixtures__/serverless-repo/serverless/serverless.yml +18 -0
  9. package/dist/lib/api-surface/analyzers/library.js +95 -0
  10. package/dist/lib/api-surface/analyzers/serverless.js +336 -0
  11. package/dist/lib/api-surface/analyzers/spring.js +237 -0
  12. package/dist/lib/api-surface/analyzers/terraform.js +109 -0
  13. package/dist/lib/api-surface/detect.js +25 -0
  14. package/dist/lib/api-surface/emit.js +109 -0
  15. package/dist/lib/api-surface/file-set.js +43 -0
  16. package/dist/lib/api-surface/index.js +134 -0
  17. package/dist/lib/api-surface/types.js +17 -0
  18. package/dist/lib/briefing/index.js +13 -0
  19. package/dist/lib/briefing/render.js +132 -0
  20. package/dist/lib/briefing/variables.js +92 -0
  21. package/dist/lib/catalogue/application-archetype/vocabulary.js +177 -0
  22. package/dist/lib/catalogue/archetype/maps/android.yaml +66 -0
  23. package/dist/lib/catalogue/archetype/maps/swiftui.yaml +58 -0
  24. package/dist/lib/catalogue/archetype/maps/uikit.yaml +48 -0
  25. package/dist/lib/catalogue/archetype/maps/web-generic.yaml +86 -0
  26. package/dist/lib/catalogue/archetype/openui-archetype-vocabulary.yaml +46 -0
  27. package/dist/lib/catalogue/archetype/resolver.js +103 -0
  28. package/dist/lib/catalogue/archetype/wireframe.js +418 -0
  29. package/dist/lib/catalogue/baseline-check.js +151 -0
  30. package/dist/lib/catalogue/build.js +1502 -0
  31. package/dist/lib/catalogue/builders/adr-supersedes.js +103 -0
  32. package/dist/lib/catalogue/builders/adrs.js +222 -0
  33. package/dist/lib/catalogue/builders/application-conformance-coverage.js +47 -0
  34. package/dist/lib/catalogue/builders/application-data-plane-bindings.js +115 -0
  35. package/dist/lib/catalogue/builders/c4-components.js +229 -0
  36. package/dist/lib/catalogue/builders/c4-containers.js +240 -0
  37. package/dist/lib/catalogue/builders/c4-entity-rollups.js +87 -0
  38. package/dist/lib/catalogue/builders/c4-external-systems.js +194 -0
  39. package/dist/lib/catalogue/builders/c4-l1-candidates.js +107 -0
  40. package/dist/lib/catalogue/builders/c4-systems.js +98 -0
  41. package/dist/lib/catalogue/builders/capabilities.js +488 -0
  42. package/dist/lib/catalogue/builders/capability-domain-model.js +74 -0
  43. package/dist/lib/catalogue/builders/capability-edges.js +256 -0
  44. package/dist/lib/catalogue/builders/capability-spec-walker.js +99 -0
  45. package/dist/lib/catalogue/builders/capability-spec.js +348 -0
  46. package/dist/lib/catalogue/builders/container-dependency.js +183 -0
  47. package/dist/lib/catalogue/builders/contracts.js +402 -0
  48. package/dist/lib/catalogue/builders/data-items.js +344 -0
  49. package/dist/lib/catalogue/builders/data-store-mapping.js +113 -0
  50. package/dist/lib/catalogue/builders/domain-models.js +175 -0
  51. package/dist/lib/catalogue/builders/domains.js +119 -0
  52. package/dist/lib/catalogue/builders/edge-label-merge.js +19 -0
  53. package/dist/lib/catalogue/builders/entities-manifest.js +160 -0
  54. package/dist/lib/catalogue/builders/entities-mermaid.js +189 -0
  55. package/dist/lib/catalogue/builders/entity-persistence.js +102 -0
  56. package/dist/lib/catalogue/builders/entity-slug.js +47 -0
  57. package/dist/lib/catalogue/builders/event-catalog-walker.js +186 -0
  58. package/dist/lib/catalogue/builders/event-edges.js +327 -0
  59. package/dist/lib/catalogue/builders/events.js +168 -0
  60. package/dist/lib/catalogue/builders/evidence-class.js +43 -0
  61. package/dist/lib/catalogue/builders/evidence-target-repo.js +67 -0
  62. package/dist/lib/catalogue/builders/external-system-exemption.js +120 -0
  63. package/dist/lib/catalogue/builders/feature-contract.js +77 -0
  64. package/dist/lib/catalogue/builders/feature-domain-model.js +50 -0
  65. package/dist/lib/catalogue/builders/feature-grounding-walker.js +254 -0
  66. package/dist/lib/catalogue/builders/feature-grounding.js +391 -0
  67. package/dist/lib/catalogue/builders/feature-groups.js +63 -0
  68. package/dist/lib/catalogue/builders/feature-subscription-channels.js +228 -0
  69. package/dist/lib/catalogue/builders/feature-tree-walker.js +295 -0
  70. package/dist/lib/catalogue/builders/features.js +300 -0
  71. package/dist/lib/catalogue/builders/glossary-xref.js +378 -0
  72. package/dist/lib/catalogue/builders/glossary.js +204 -0
  73. package/dist/lib/catalogue/builders/implementations.js +214 -0
  74. package/dist/lib/catalogue/builders/index.js +64 -0
  75. package/dist/lib/catalogue/builders/integration-components.js +344 -0
  76. package/dist/lib/catalogue/builders/integrations.js +181 -0
  77. package/dist/lib/catalogue/builders/persona-c4system.js +149 -0
  78. package/dist/lib/catalogue/builders/persona-container.js +133 -0
  79. package/dist/lib/catalogue/builders/persona-journey-edges.js +133 -0
  80. package/dist/lib/catalogue/builders/personas.js +152 -0
  81. package/dist/lib/catalogue/builders/product-edges.js +106 -0
  82. package/dist/lib/catalogue/builders/product-platform-dependencies.js +405 -0
  83. package/dist/lib/catalogue/builders/products.js +162 -0
  84. package/dist/lib/catalogue/builders/quality-scores.js +635 -0
  85. package/dist/lib/catalogue/builders/repo-capability-exemption.js +61 -0
  86. package/dist/lib/catalogue/builders/repo-dependency.js +127 -0
  87. package/dist/lib/catalogue/builders/repo-edges.js +340 -0
  88. package/dist/lib/catalogue/builders/repositories.js +458 -0
  89. package/dist/lib/catalogue/builders/scaffolds.js +197 -0
  90. package/dist/lib/catalogue/builders/screen-tree.js +222 -0
  91. package/dist/lib/catalogue/builders/screens.js +396 -0
  92. package/dist/lib/catalogue/builders/service-capability-exemption.js +63 -0
  93. package/dist/lib/catalogue/builders/service-contract-consumes.js +186 -0
  94. package/dist/lib/catalogue/builders/service-contract.js +74 -0
  95. package/dist/lib/catalogue/builders/service-entity-tables.js +187 -0
  96. package/dist/lib/catalogue/builders/services.js +232 -0
  97. package/dist/lib/catalogue/builders/system-external-dependency.js +115 -0
  98. package/dist/lib/catalogue/builders/user-journeys.js +253 -0
  99. package/dist/lib/catalogue/canonical-schema.yaml +4117 -0
  100. package/dist/lib/catalogue/cli-version.js +10 -0
  101. package/dist/lib/catalogue/contract-id.js +49 -0
  102. package/dist/lib/catalogue/coverage-predicates.js +603 -0
  103. package/dist/lib/catalogue/coverage-render.js +552 -0
  104. package/dist/lib/catalogue/coverage-run.js +115 -0
  105. package/dist/lib/catalogue/csv-reader.js +97 -0
  106. package/dist/lib/catalogue/csv-writer.js +96 -0
  107. package/dist/lib/catalogue/data-plane-coherence.js +77 -0
  108. package/dist/lib/catalogue/ddl-generator.js +233 -0
  109. package/dist/lib/catalogue/dedupe-keyed-tables.js +0 -0
  110. package/dist/lib/catalogue/engine-validator.js +239 -0
  111. package/dist/lib/catalogue/ext-id.js +76 -0
  112. package/dist/lib/catalogue/feature-grounding-aliases-loader.js +65 -0
  113. package/dist/lib/catalogue/feature-repo-zero-resolution-summary.js +31 -0
  114. package/dist/lib/catalogue/finding-identity.js +183 -0
  115. package/dist/lib/catalogue/findings.js +46 -0
  116. package/dist/lib/catalogue/fk-validator.js +136 -0
  117. package/dist/lib/catalogue/freshness.js +70 -0
  118. package/dist/lib/catalogue/gate-checks.js +338 -0
  119. package/dist/lib/catalogue/graph-projection.js +346 -0
  120. package/dist/lib/catalogue/impact-run.js +228 -0
  121. package/dist/lib/catalogue/manifest-loader.js +435 -0
  122. package/dist/lib/catalogue/platform-scope.js +7 -0
  123. package/dist/lib/catalogue/population-checks.js +87 -0
  124. package/dist/lib/catalogue/relationship-semantics.js +66 -0
  125. package/dist/lib/catalogue/reverse-product-quality.js +99 -0
  126. package/dist/lib/catalogue/rubric-coverage-map.yaml +871 -0
  127. package/dist/lib/catalogue/runway-vocabulary-loader.js +56 -0
  128. package/dist/lib/catalogue/scaffold-delta.js +261 -0
  129. package/dist/lib/catalogue/schema-compat.js +52 -0
  130. package/dist/lib/catalogue/schema-loader.js +87 -0
  131. package/dist/lib/catalogue/scores-coverage.js +573 -0
  132. package/dist/lib/catalogue/screen-validation-loader.js +89 -0
  133. package/dist/lib/catalogue/service-architecture-parser.js +193 -0
  134. package/dist/lib/catalogue/service-contract-aliases-loader.js +109 -0
  135. package/dist/lib/catalogue/staleness-verdicts.js +345 -0
  136. package/dist/lib/catalogue/traceability-loader.js +350 -0
  137. package/dist/lib/catalogue/validate.js +200 -0
  138. package/dist/lib/catalogue/version.js +18 -0
  139. package/dist/lib/conformance/binding.js +70 -0
  140. package/dist/lib/conformance/finding.js +69 -0
  141. package/dist/lib/conformance/index.js +578 -0
  142. package/dist/lib/context-pull/index.js +191 -0
  143. package/dist/lib/context-pull/resolve.js +70 -0
  144. package/dist/lib/context-pull/retired-mcp-setup.js +7 -0
  145. package/dist/lib/contracts-availability/index.js +267 -0
  146. package/dist/lib/generate-briefing/index.js +77 -0
  147. package/dist/lib/list/discover.js +100 -0
  148. package/dist/lib/list/format.js +84 -0
  149. package/dist/lib/list/index.js +16 -0
  150. package/dist/lib/lock-file.js +437 -0
  151. package/dist/lib/pack/log.js +18 -0
  152. package/dist/lib/pack/schema.js +121 -0
  153. package/dist/lib/pack/seed.js +182 -0
  154. package/dist/lib/pack/validate.js +49 -0
  155. package/dist/lib/package-version.js +92 -0
  156. package/dist/lib/plan/index.js +69 -0
  157. package/dist/lib/plan/read-sdd.js +102 -0
  158. package/dist/lib/plan/render-template.js +84 -0
  159. package/dist/lib/repo-kind.js +129 -0
  160. package/dist/lib/scaffold/domain.js +234 -0
  161. package/dist/lib/scaffold/registry.js +136 -0
  162. package/dist/lib/scripts.js +7 -0
  163. package/dist/lib/sdd-index/repo-config.js +245 -0
  164. package/dist/lib/sdd-reader.js +91 -0
  165. package/dist/lib/snapshot/advance.js +454 -0
  166. package/dist/lib/snapshot/diff.js +190 -0
  167. package/dist/lib/snapshot/fold.js +208 -0
  168. package/dist/lib/snapshot/land.js +178 -0
  169. package/dist/lib/snapshot/manifest.js +206 -0
  170. package/dist/lib/snapshot/targets.js +169 -0
  171. package/dist/lib/snapshot/verify.js +91 -0
  172. package/dist/lib/sync/briefing-merge.js +106 -0
  173. package/dist/lib/sync/bundle-cache.js +109 -0
  174. package/dist/lib/sync/yaml-block-merge.js +120 -0
  175. package/dist/lib/validate/aggregate.js +51 -0
  176. package/dist/lib/validate/bundle-coherence.js +74 -0
  177. package/dist/lib/validate/dispatch.js +243 -0
  178. package/dist/lib/validate/index.js +110 -0
  179. package/dist/lib/validate/plan.js +54 -0
  180. package/dist/lib/validate/runner.js +85 -0
  181. package/dist/lib/validate/yaml-parse.js +112 -0
  182. package/dist/maintain-version.json +4 -0
  183. package/dist/verbs/api-surface.js +71 -0
  184. package/dist/verbs/catalogue-check.js +28 -0
  185. package/dist/verbs/catalogue-verify.js +114 -0
  186. package/dist/verbs/conformance.js +34 -0
  187. package/dist/verbs/context.js +39 -0
  188. package/dist/verbs/contracts.js +34 -0
  189. package/dist/verbs/generate-briefing.js +29 -0
  190. package/dist/verbs/list.js +45 -0
  191. package/dist/verbs/pack-validate.js +17 -0
  192. package/dist/verbs/path-option.js +25 -0
  193. package/dist/verbs/plan.js +42 -0
  194. package/dist/verbs/render.js +87 -0
  195. package/dist/verbs/scaffold.js +83 -0
  196. package/dist/verbs/snapshot.js +134 -0
  197. package/dist/verbs/validate.js +48 -0
  198. package/dist/verify-program.js +122 -0
  199. package/dist/verify-version.json +4 -0
  200. package/package.json +32 -4
  201. package/scripts/validate-app-dependencies.sh +664 -0
  202. package/scripts/validate-app-docs.sh +199 -0
  203. package/scripts/validate-integration-docs.sh +505 -0
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Products discoverer — emits the SDD-as-Product row from the manifest.
3
+ *
4
+ * Per ADR 0134 + catalogue-metamodel.md: every SDD is one Product. The
5
+ * canonical builder emits ONE products.csv row per SDD — the SDD itself.
6
+ * Sibling SDDs (apps, integrations) get their own products.csv rows in
7
+ * their own builds; the aggregator merges by primary key.
8
+ *
9
+ * domain_id selection (per ADR 0136):
10
+ * - 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.
26
+ */
27
+ import { PACKAGING_DEFAULT } from "../manifest-loader.js";
28
+ /**
29
+ * Default domain_id per category when the manifest doesn't declare one.
30
+ * Per ADR 0136 only platform-profile categories carry a default — app
31
+ * and integration products legitimately have an empty domain_id.
32
+ */
33
+ const DEFAULT_DOMAIN_BY_CATEGORY = {
34
+ "platform-root": "platform",
35
+ "platform-subsystem": "platform",
36
+ };
37
+ export function buildProducts(inputs) {
38
+ const m = inputs.manifest;
39
+ const defaulted = DEFAULT_DOMAIN_BY_CATEGORY[m.category];
40
+ let domainId;
41
+ if (m.profile === "platform-profile") {
42
+ const usable = defaulted !== undefined && (inputs.knownDomainIds?.has(defaulted) ?? true) ? defaulted : undefined;
43
+ domainId = m.domainId ?? usable ?? "";
44
+ if (m.domainId === undefined && defaulted !== undefined && usable === undefined) {
45
+ inputs.findings.add("inferred", `products: domain_id left empty: the category=${m.category} default "${defaulted}" is not a domain of this SDD yet (manifest had no domain_id)`);
46
+ }
47
+ else if (m.domainId === undefined && defaulted !== undefined) {
48
+ inputs.findings.add("inferred", `products: domain_id="${defaulted}" inferred from category=${m.category} (manifest had no domain_id)`);
49
+ }
50
+ }
51
+ else {
52
+ // Per ADR 0136: app/integration/support products do not have a
53
+ // primary domain. Even if the manifest declares one (typically the
54
+ // umbrella name like "applications" or "integrations"), clear it
55
+ // here so the products.domain_id FK reference does not dangle
56
+ // against domains.csv (which only platform-profile SDDs populate
57
+ // post-v0.14.0). Emit a finding when the manifest declared a value
58
+ // so the override is traceable.
59
+ domainId = "";
60
+ if (m.domainId !== undefined && m.domainId.length > 0) {
61
+ 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`);
62
+ }
63
+ }
64
+ // Lifecycle (schema 2.22.0): owner-declared in the manifest, default
65
+ // "active". The companion fields are only meaningful when deprecated —
66
+ // per sdd-manifest-schema 1.1.0 they are "ignored otherwise", so a
67
+ // declared-but-inapplicable value is cleared with a convention finding
68
+ // rather than emitted.
69
+ const lifecycle = m.lifecycle ?? "active";
70
+ let deprecatedDate = "";
71
+ let successorSddId = "";
72
+ if (lifecycle === "deprecated") {
73
+ deprecatedDate = m.deprecatedDate ?? "";
74
+ successorSddId = m.successorSddId ?? "";
75
+ }
76
+ else {
77
+ for (const [field, value] of [
78
+ ["deprecated_date", m.deprecatedDate],
79
+ ["successor_sdd_id", m.successorSddId],
80
+ ]) {
81
+ if (value !== undefined) {
82
+ inputs.findings.add("convention", `products: ${field}="${value}" declared but lifecycle is "${lifecycle}" — ` +
83
+ `field is only meaningful when lifecycle=deprecated (ignored per sdd-manifest-schema 1.1.0)`);
84
+ }
85
+ }
86
+ }
87
+ // Application-product traits (surface 0167, packaging 0175,
88
+ // application_archetype 0191; sdd-manifest-schema 1.2.0 / 1.7.0). The three
89
+ // scalar axes M-ADR 0194 §3.1 coordinates, and they compose freely — column
90
+ // order here follows that table. All are application-product-only: emitted
91
+ // with their defaults for application-product, empty for other profiles. A
92
+ // value declared on a non-application-product manifest is cleared with a
93
+ // convention finding (mirrors domain_id). Resolution of the archetype value
94
+ // against the active vocabulary — and the "defaulted to unclassified" /
95
+ // "unresolved value" findings — happen in the build's resolution step,
96
+ // which has the bundle cache; here we only emit the column value.
97
+ const isApp = m.profile === "application-product";
98
+ let surface = "";
99
+ let packaging = "";
100
+ let applicationArchetype = "";
101
+ if (isApp) {
102
+ surface = m.surface ?? "ui";
103
+ // Absent packaging is the unmarked norm, not unknown — a self-operated
104
+ // product is the overwhelming majority case (M-ADR 0175).
105
+ packaging = m.packaging ?? PACKAGING_DEFAULT;
106
+ applicationArchetype = m.applicationArchetype ?? "unclassified";
107
+ }
108
+ else {
109
+ for (const [field, value] of [
110
+ ["surface", m.surface],
111
+ ["packaging", m.packaging],
112
+ ["application_archetype", m.applicationArchetype],
113
+ ]) {
114
+ if (value !== undefined) {
115
+ inputs.findings.add("convention", `products: ${field}="${value}" declared on profile=${m.profile} — ` +
116
+ `${field} is an application-product-only trait (ignored, cleared)`);
117
+ }
118
+ }
119
+ }
120
+ // Reference-exemplar trait (sdd-manifest-schema 1.8.0, catalogue 2.46.0).
121
+ // Deliberately OUTSIDE the isApp block above: this trait is profile-agnostic,
122
+ // so it is neither defaulted per-profile nor cleared with a convention finding
123
+ // off application-product. Absent is the unmarked norm — a real SDD — and
124
+ // raises no finding, matching `packaging`'s absent-resolves-to-norm shape.
125
+ // Emitted as the string "true" or empty rather than "true"/"false": empty is
126
+ // how every other nullable column spells "unmarked", and a column of mostly
127
+ // "false" would invite a consumer to treat the trait as a required decision.
128
+ const exemplar = m.exemplar === true ? "true" : "";
129
+ // Shared-library trait (M-ADR 0217 §4.4): same spelling and same derivation as exemplar.
130
+ const sharedLibrary = m.sharedLibrary === true ? "true" : "";
131
+ return [
132
+ {
133
+ id: m.sddId,
134
+ name: titleCase(m.sddId),
135
+ domain_id: domainId,
136
+ profile: m.profile,
137
+ category: m.category,
138
+ doc_path: ".",
139
+ lifecycle,
140
+ deprecated_date: deprecatedDate,
141
+ successor_sdd_id: successorSddId,
142
+ exemplar,
143
+ shared_library: sharedLibrary,
144
+ surface,
145
+ packaging,
146
+ application_archetype: applicationArchetype,
147
+ synthesis_quality: "",
148
+ synthesis_band: "",
149
+ last_assessed: "",
150
+ highest_snapshot_impact: "",
151
+ repo_count: inputs.repoCount,
152
+ source_sdd_id: "",
153
+ },
154
+ ];
155
+ }
156
+ function titleCase(slug) {
157
+ return slug
158
+ .split("-")
159
+ .map((p) => (p.length === 0 ? p : p[0].toUpperCase() + p.slice(1)))
160
+ .join(" ");
161
+ }
162
+ //# sourceMappingURL=products.js.map