@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.
- package/LICENSE +201 -0
- package/NOTICE +17 -0
- package/README.md +6 -2
- package/dist/author-bin.js +8 -0
- package/dist/author-program.js +99 -0
- package/dist/lib/adr-origin.js +59 -0
- package/dist/lib/agent-harness.js +37 -0
- package/dist/lib/api-surface/__fixtures__/serverless-repo/serverless/serverless.yml +18 -0
- package/dist/lib/api-surface/analyzers/library.js +95 -0
- package/dist/lib/api-surface/analyzers/serverless.js +336 -0
- package/dist/lib/api-surface/analyzers/spring.js +237 -0
- package/dist/lib/api-surface/analyzers/terraform.js +109 -0
- package/dist/lib/api-surface/detect.js +25 -0
- package/dist/lib/api-surface/emit.js +109 -0
- package/dist/lib/api-surface/file-set.js +43 -0
- package/dist/lib/api-surface/index.js +134 -0
- package/dist/lib/api-surface/types.js +17 -0
- package/dist/lib/briefing/index.js +13 -0
- package/dist/lib/briefing/render.js +132 -0
- package/dist/lib/briefing/variables.js +92 -0
- package/dist/lib/catalogue/application-archetype/vocabulary.js +177 -0
- package/dist/lib/catalogue/archetype/maps/android.yaml +66 -0
- package/dist/lib/catalogue/archetype/maps/swiftui.yaml +58 -0
- package/dist/lib/catalogue/archetype/maps/uikit.yaml +48 -0
- package/dist/lib/catalogue/archetype/maps/web-generic.yaml +86 -0
- package/dist/lib/catalogue/archetype/openui-archetype-vocabulary.yaml +46 -0
- package/dist/lib/catalogue/archetype/resolver.js +103 -0
- package/dist/lib/catalogue/archetype/wireframe.js +418 -0
- package/dist/lib/catalogue/baseline-check.js +151 -0
- package/dist/lib/catalogue/build.js +1502 -0
- package/dist/lib/catalogue/builders/adr-supersedes.js +103 -0
- package/dist/lib/catalogue/builders/adrs.js +222 -0
- package/dist/lib/catalogue/builders/application-conformance-coverage.js +47 -0
- package/dist/lib/catalogue/builders/application-data-plane-bindings.js +115 -0
- package/dist/lib/catalogue/builders/c4-components.js +229 -0
- package/dist/lib/catalogue/builders/c4-containers.js +240 -0
- package/dist/lib/catalogue/builders/c4-entity-rollups.js +87 -0
- package/dist/lib/catalogue/builders/c4-external-systems.js +194 -0
- package/dist/lib/catalogue/builders/c4-l1-candidates.js +107 -0
- package/dist/lib/catalogue/builders/c4-systems.js +98 -0
- package/dist/lib/catalogue/builders/capabilities.js +488 -0
- package/dist/lib/catalogue/builders/capability-domain-model.js +74 -0
- package/dist/lib/catalogue/builders/capability-edges.js +256 -0
- package/dist/lib/catalogue/builders/capability-spec-walker.js +99 -0
- package/dist/lib/catalogue/builders/capability-spec.js +348 -0
- package/dist/lib/catalogue/builders/container-dependency.js +183 -0
- package/dist/lib/catalogue/builders/contracts.js +402 -0
- package/dist/lib/catalogue/builders/data-items.js +344 -0
- package/dist/lib/catalogue/builders/data-store-mapping.js +113 -0
- package/dist/lib/catalogue/builders/domain-models.js +175 -0
- package/dist/lib/catalogue/builders/domains.js +119 -0
- package/dist/lib/catalogue/builders/edge-label-merge.js +19 -0
- package/dist/lib/catalogue/builders/entities-manifest.js +160 -0
- package/dist/lib/catalogue/builders/entities-mermaid.js +189 -0
- package/dist/lib/catalogue/builders/entity-persistence.js +102 -0
- package/dist/lib/catalogue/builders/entity-slug.js +47 -0
- package/dist/lib/catalogue/builders/event-catalog-walker.js +186 -0
- package/dist/lib/catalogue/builders/event-edges.js +327 -0
- package/dist/lib/catalogue/builders/events.js +168 -0
- package/dist/lib/catalogue/builders/evidence-class.js +43 -0
- package/dist/lib/catalogue/builders/evidence-target-repo.js +67 -0
- package/dist/lib/catalogue/builders/external-system-exemption.js +120 -0
- package/dist/lib/catalogue/builders/feature-contract.js +77 -0
- package/dist/lib/catalogue/builders/feature-domain-model.js +50 -0
- package/dist/lib/catalogue/builders/feature-grounding-walker.js +254 -0
- package/dist/lib/catalogue/builders/feature-grounding.js +391 -0
- package/dist/lib/catalogue/builders/feature-groups.js +63 -0
- package/dist/lib/catalogue/builders/feature-subscription-channels.js +228 -0
- package/dist/lib/catalogue/builders/feature-tree-walker.js +295 -0
- package/dist/lib/catalogue/builders/features.js +300 -0
- package/dist/lib/catalogue/builders/glossary-xref.js +378 -0
- package/dist/lib/catalogue/builders/glossary.js +204 -0
- package/dist/lib/catalogue/builders/implementations.js +214 -0
- package/dist/lib/catalogue/builders/index.js +64 -0
- package/dist/lib/catalogue/builders/integration-components.js +344 -0
- package/dist/lib/catalogue/builders/integrations.js +181 -0
- package/dist/lib/catalogue/builders/persona-c4system.js +149 -0
- package/dist/lib/catalogue/builders/persona-container.js +133 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.js +133 -0
- package/dist/lib/catalogue/builders/personas.js +152 -0
- package/dist/lib/catalogue/builders/product-edges.js +106 -0
- package/dist/lib/catalogue/builders/product-platform-dependencies.js +405 -0
- package/dist/lib/catalogue/builders/products.js +162 -0
- package/dist/lib/catalogue/builders/quality-scores.js +635 -0
- package/dist/lib/catalogue/builders/repo-capability-exemption.js +61 -0
- package/dist/lib/catalogue/builders/repo-dependency.js +127 -0
- package/dist/lib/catalogue/builders/repo-edges.js +340 -0
- package/dist/lib/catalogue/builders/repositories.js +458 -0
- package/dist/lib/catalogue/builders/scaffolds.js +197 -0
- package/dist/lib/catalogue/builders/screen-tree.js +222 -0
- package/dist/lib/catalogue/builders/screens.js +396 -0
- package/dist/lib/catalogue/builders/service-capability-exemption.js +63 -0
- package/dist/lib/catalogue/builders/service-contract-consumes.js +186 -0
- package/dist/lib/catalogue/builders/service-contract.js +74 -0
- package/dist/lib/catalogue/builders/service-entity-tables.js +187 -0
- package/dist/lib/catalogue/builders/services.js +232 -0
- package/dist/lib/catalogue/builders/system-external-dependency.js +115 -0
- package/dist/lib/catalogue/builders/user-journeys.js +253 -0
- package/dist/lib/catalogue/canonical-schema.yaml +4117 -0
- package/dist/lib/catalogue/cli-version.js +10 -0
- package/dist/lib/catalogue/contract-id.js +49 -0
- package/dist/lib/catalogue/coverage-predicates.js +603 -0
- package/dist/lib/catalogue/coverage-render.js +552 -0
- package/dist/lib/catalogue/coverage-run.js +115 -0
- package/dist/lib/catalogue/csv-reader.js +97 -0
- package/dist/lib/catalogue/csv-writer.js +96 -0
- package/dist/lib/catalogue/data-plane-coherence.js +77 -0
- package/dist/lib/catalogue/ddl-generator.js +233 -0
- package/dist/lib/catalogue/dedupe-keyed-tables.js +0 -0
- package/dist/lib/catalogue/engine-validator.js +239 -0
- package/dist/lib/catalogue/ext-id.js +76 -0
- package/dist/lib/catalogue/feature-grounding-aliases-loader.js +65 -0
- package/dist/lib/catalogue/feature-repo-zero-resolution-summary.js +31 -0
- package/dist/lib/catalogue/finding-identity.js +183 -0
- package/dist/lib/catalogue/findings.js +46 -0
- package/dist/lib/catalogue/fk-validator.js +136 -0
- package/dist/lib/catalogue/freshness.js +70 -0
- package/dist/lib/catalogue/gate-checks.js +338 -0
- package/dist/lib/catalogue/graph-projection.js +346 -0
- package/dist/lib/catalogue/impact-run.js +228 -0
- package/dist/lib/catalogue/manifest-loader.js +435 -0
- package/dist/lib/catalogue/platform-scope.js +7 -0
- package/dist/lib/catalogue/population-checks.js +87 -0
- package/dist/lib/catalogue/relationship-semantics.js +66 -0
- package/dist/lib/catalogue/reverse-product-quality.js +99 -0
- package/dist/lib/catalogue/rubric-coverage-map.yaml +871 -0
- package/dist/lib/catalogue/runway-vocabulary-loader.js +56 -0
- package/dist/lib/catalogue/scaffold-delta.js +261 -0
- package/dist/lib/catalogue/schema-compat.js +52 -0
- package/dist/lib/catalogue/schema-loader.js +87 -0
- package/dist/lib/catalogue/scores-coverage.js +573 -0
- package/dist/lib/catalogue/screen-validation-loader.js +89 -0
- package/dist/lib/catalogue/service-architecture-parser.js +193 -0
- package/dist/lib/catalogue/service-contract-aliases-loader.js +109 -0
- package/dist/lib/catalogue/staleness-verdicts.js +345 -0
- package/dist/lib/catalogue/traceability-loader.js +350 -0
- package/dist/lib/catalogue/validate.js +200 -0
- package/dist/lib/catalogue/version.js +18 -0
- package/dist/lib/conformance/binding.js +70 -0
- package/dist/lib/conformance/finding.js +69 -0
- package/dist/lib/conformance/index.js +578 -0
- package/dist/lib/context-pull/index.js +191 -0
- package/dist/lib/context-pull/resolve.js +70 -0
- package/dist/lib/context-pull/retired-mcp-setup.js +7 -0
- package/dist/lib/contracts-availability/index.js +267 -0
- package/dist/lib/generate-briefing/index.js +77 -0
- package/dist/lib/list/discover.js +100 -0
- package/dist/lib/list/format.js +84 -0
- package/dist/lib/list/index.js +16 -0
- package/dist/lib/lock-file.js +437 -0
- package/dist/lib/pack/log.js +18 -0
- package/dist/lib/pack/schema.js +121 -0
- package/dist/lib/pack/seed.js +182 -0
- package/dist/lib/pack/validate.js +49 -0
- package/dist/lib/package-version.js +92 -0
- package/dist/lib/plan/index.js +69 -0
- package/dist/lib/plan/read-sdd.js +102 -0
- package/dist/lib/plan/render-template.js +84 -0
- package/dist/lib/repo-kind.js +129 -0
- package/dist/lib/scaffold/domain.js +234 -0
- package/dist/lib/scaffold/registry.js +136 -0
- package/dist/lib/scripts.js +7 -0
- package/dist/lib/sdd-index/repo-config.js +245 -0
- package/dist/lib/sdd-reader.js +91 -0
- package/dist/lib/snapshot/advance.js +454 -0
- package/dist/lib/snapshot/diff.js +190 -0
- package/dist/lib/snapshot/fold.js +208 -0
- package/dist/lib/snapshot/land.js +178 -0
- package/dist/lib/snapshot/manifest.js +206 -0
- package/dist/lib/snapshot/targets.js +169 -0
- package/dist/lib/snapshot/verify.js +91 -0
- package/dist/lib/sync/briefing-merge.js +106 -0
- package/dist/lib/sync/bundle-cache.js +109 -0
- package/dist/lib/sync/yaml-block-merge.js +120 -0
- package/dist/lib/validate/aggregate.js +51 -0
- package/dist/lib/validate/bundle-coherence.js +74 -0
- package/dist/lib/validate/dispatch.js +243 -0
- package/dist/lib/validate/index.js +110 -0
- package/dist/lib/validate/plan.js +54 -0
- package/dist/lib/validate/runner.js +85 -0
- package/dist/lib/validate/yaml-parse.js +112 -0
- package/dist/maintain-version.json +4 -0
- package/dist/verbs/api-surface.js +71 -0
- package/dist/verbs/catalogue-check.js +28 -0
- package/dist/verbs/catalogue-verify.js +114 -0
- package/dist/verbs/conformance.js +34 -0
- package/dist/verbs/context.js +39 -0
- package/dist/verbs/contracts.js +34 -0
- package/dist/verbs/generate-briefing.js +29 -0
- package/dist/verbs/list.js +45 -0
- package/dist/verbs/pack-validate.js +17 -0
- package/dist/verbs/path-option.js +25 -0
- package/dist/verbs/plan.js +42 -0
- package/dist/verbs/render.js +87 -0
- package/dist/verbs/scaffold.js +83 -0
- package/dist/verbs/snapshot.js +134 -0
- package/dist/verbs/validate.js +48 -0
- package/dist/verify-program.js +122 -0
- package/dist/verify-version.json +4 -0
- package/package.json +32 -4
- package/scripts/validate-app-dependencies.sh +664 -0
- package/scripts/validate-app-docs.sh +199 -0
- 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
|