@sdd-method/sdd-cli 0.21.0 → 0.23.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/README.md +30 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-harness.d.ts +20 -0
- package/dist/lib/agent-harness.d.ts.map +1 -0
- package/dist/lib/agent-harness.js +28 -0
- package/dist/lib/agent-harness.js.map +1 -0
- package/dist/lib/briefing/index.d.ts +15 -0
- package/dist/lib/briefing/index.d.ts.map +1 -0
- package/dist/lib/briefing/index.js +13 -0
- package/dist/lib/briefing/index.js.map +1 -0
- package/dist/lib/briefing/render.d.ts +57 -0
- package/dist/lib/briefing/render.d.ts.map +1 -0
- package/dist/lib/briefing/render.js +112 -0
- package/dist/lib/briefing/render.js.map +1 -0
- package/dist/lib/briefing/variables.d.ts +49 -0
- package/dist/lib/briefing/variables.d.ts.map +1 -0
- package/dist/lib/briefing/variables.js +92 -0
- package/dist/lib/briefing/variables.js.map +1 -0
- package/dist/lib/bundle.d.ts +57 -2
- package/dist/lib/bundle.d.ts.map +1 -1
- package/dist/lib/bundle.js +53 -19
- package/dist/lib/bundle.js.map +1 -1
- package/dist/lib/catalogue/aggregate.d.ts +19 -0
- package/dist/lib/catalogue/aggregate.d.ts.map +1 -1
- package/dist/lib/catalogue/aggregate.js +88 -0
- package/dist/lib/catalogue/aggregate.js.map +1 -1
- package/dist/lib/catalogue/build.d.ts.map +1 -1
- package/dist/lib/catalogue/build.js +24 -1
- package/dist/lib/catalogue/build.js.map +1 -1
- package/dist/lib/catalogue/builders/capabilities.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/capabilities.js +18 -4
- package/dist/lib/catalogue/builders/capabilities.js.map +1 -1
- package/dist/lib/catalogue/builders/feature-subscription-channels.d.ts +12 -0
- package/dist/lib/catalogue/builders/feature-subscription-channels.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/feature-subscription-channels.js +197 -0
- package/dist/lib/catalogue/builders/feature-subscription-channels.js.map +1 -0
- package/dist/lib/catalogue/builders/index.d.ts +4 -0
- package/dist/lib/catalogue/builders/index.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/index.js +2 -0
- package/dist/lib/catalogue/builders/index.js.map +1 -1
- package/dist/lib/catalogue/builders/product-platform-dependencies.d.ts +10 -0
- package/dist/lib/catalogue/builders/product-platform-dependencies.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/product-platform-dependencies.js +155 -0
- package/dist/lib/catalogue/builders/product-platform-dependencies.js.map +1 -0
- package/dist/lib/catalogue/canonical-schema.yaml +96 -1
- package/dist/lib/catalogue/traceability-loader.d.ts +17 -0
- package/dist/lib/catalogue/traceability-loader.d.ts.map +1 -1
- package/dist/lib/catalogue/traceability-loader.js +6 -0
- package/dist/lib/catalogue/traceability-loader.js.map +1 -1
- package/dist/lib/generate-briefing/index.d.ts +22 -0
- package/dist/lib/generate-briefing/index.d.ts.map +1 -0
- package/dist/lib/generate-briefing/index.js +77 -0
- package/dist/lib/generate-briefing/index.js.map +1 -0
- package/dist/lib/hooks-seed/copilot.d.ts +93 -0
- package/dist/lib/hooks-seed/copilot.d.ts.map +1 -0
- package/dist/lib/hooks-seed/copilot.js +167 -0
- package/dist/lib/hooks-seed/copilot.js.map +1 -0
- package/dist/lib/hooks-seed/index.d.ts +4 -0
- package/dist/lib/hooks-seed/index.d.ts.map +1 -1
- package/dist/lib/hooks-seed/index.js +2 -0
- package/dist/lib/hooks-seed/index.js.map +1 -1
- package/dist/lib/hooks-seed/lifecycle-mapping.d.ts +12 -0
- package/dist/lib/hooks-seed/lifecycle-mapping.d.ts.map +1 -0
- package/dist/lib/hooks-seed/lifecycle-mapping.js +28 -0
- package/dist/lib/hooks-seed/lifecycle-mapping.js.map +1 -0
- package/dist/lib/init/index.d.ts +6 -4
- package/dist/lib/init/index.d.ts.map +1 -1
- package/dist/lib/init/index.js +5 -26
- package/dist/lib/init/index.js.map +1 -1
- package/dist/lib/init/platform.d.ts +9 -0
- package/dist/lib/init/platform.d.ts.map +1 -1
- package/dist/lib/init/platform.js +8 -2
- package/dist/lib/init/platform.js.map +1 -1
- package/dist/lib/list/discover.d.ts +28 -0
- package/dist/lib/list/discover.d.ts.map +1 -1
- package/dist/lib/list/discover.js +27 -11
- package/dist/lib/list/discover.js.map +1 -1
- package/dist/lib/list/format.d.ts +2 -0
- package/dist/lib/list/format.d.ts.map +1 -1
- package/dist/lib/list/format.js +44 -4
- package/dist/lib/list/format.js.map +1 -1
- package/dist/lib/list/index.d.ts +1 -0
- package/dist/lib/list/index.d.ts.map +1 -1
- package/dist/lib/list/index.js +1 -0
- package/dist/lib/list/index.js.map +1 -1
- package/dist/lib/lock-file.d.ts +23 -5
- package/dist/lib/lock-file.d.ts.map +1 -1
- package/dist/lib/lock-file.js +86 -9
- package/dist/lib/lock-file.js.map +1 -1
- package/dist/lib/pack/builder.d.ts +55 -0
- package/dist/lib/pack/builder.d.ts.map +1 -0
- package/dist/lib/pack/builder.js +226 -0
- package/dist/lib/pack/builder.js.map +1 -0
- package/dist/lib/pack/index.d.ts +26 -0
- package/dist/lib/pack/index.d.ts.map +1 -0
- package/dist/lib/pack/index.js +85 -0
- package/dist/lib/pack/index.js.map +1 -0
- package/dist/lib/pack/leakage.d.ts +55 -0
- package/dist/lib/pack/leakage.d.ts.map +1 -0
- package/dist/lib/pack/leakage.js +133 -0
- package/dist/lib/pack/leakage.js.map +1 -0
- package/dist/lib/pack/schema.d.ts +36 -0
- package/dist/lib/pack/schema.d.ts.map +1 -0
- package/dist/lib/pack/schema.js +63 -0
- package/dist/lib/pack/schema.js.map +1 -0
- package/dist/lib/pack/seed.d.ts +46 -0
- package/dist/lib/pack/seed.d.ts.map +1 -0
- package/dist/lib/pack/seed.js +107 -0
- package/dist/lib/pack/seed.js.map +1 -0
- package/dist/lib/repo-kind.d.ts +8 -4
- package/dist/lib/repo-kind.d.ts.map +1 -1
- package/dist/lib/repo-kind.js +10 -2
- package/dist/lib/repo-kind.js.map +1 -1
- package/dist/lib/sync/briefing-merge.d.ts +34 -0
- package/dist/lib/sync/briefing-merge.d.ts.map +1 -0
- package/dist/lib/sync/briefing-merge.js +82 -0
- package/dist/lib/sync/briefing-merge.js.map +1 -0
- package/dist/lib/sync/config.d.ts +33 -0
- package/dist/lib/sync/config.d.ts.map +1 -0
- package/dist/lib/sync/config.js +40 -0
- package/dist/lib/sync/config.js.map +1 -0
- package/dist/lib/sync/copilot-hooks-merge.d.ts +30 -0
- package/dist/lib/sync/copilot-hooks-merge.d.ts.map +1 -0
- package/dist/lib/sync/copilot-hooks-merge.js +96 -0
- package/dist/lib/sync/copilot-hooks-merge.js.map +1 -0
- package/dist/lib/sync/index.d.ts +40 -3
- package/dist/lib/sync/index.d.ts.map +1 -1
- package/dist/lib/sync/index.js +186 -26
- package/dist/lib/sync/index.js.map +1 -1
- package/dist/lib/sync/source-tag.d.ts +5 -0
- package/dist/lib/sync/source-tag.d.ts.map +1 -0
- package/dist/lib/sync/source-tag.js +34 -0
- package/dist/lib/sync/source-tag.js.map +1 -0
- package/dist/verbs/generate-briefing.d.ts +3 -0
- package/dist/verbs/generate-briefing.d.ts.map +1 -0
- package/dist/verbs/generate-briefing.js +28 -0
- package/dist/verbs/generate-briefing.js.map +1 -0
- package/dist/verbs/init.d.ts.map +1 -1
- package/dist/verbs/init.js +11 -8
- package/dist/verbs/init.js.map +1 -1
- package/dist/verbs/list.d.ts.map +1 -1
- package/dist/verbs/list.js +3 -1
- package/dist/verbs/list.js.map +1 -1
- package/dist/verbs/pack.d.ts +3 -0
- package/dist/verbs/pack.d.ts.map +1 -0
- package/dist/verbs/pack.js +35 -0
- package/dist/verbs/pack.js.map +1 -0
- package/dist/verbs/sync.d.ts.map +1 -1
- package/dist/verbs/sync.js +56 -15
- package/dist/verbs/sync.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
// feature_subscription_channels builder — emits one row per
|
|
2
|
+
// `subscription_channels:` entry in any `reverse-evidence/feature-grounding-evidence.yaml`
|
|
3
|
+
// file in the SDD. Added in schema 2.9.0.
|
|
4
|
+
//
|
|
5
|
+
// Per resolved decision §1 of `content/plans/v0-9-0-cohort-sweep-derived-bundle.md`
|
|
6
|
+
// (see also `docs/method/methods/reverse/rubrics/reverse-application-evidence-quality.md`
|
|
7
|
+
// per-feature slot vocabulary): `subscription_channels:` is a peer of
|
|
8
|
+
// `graphql_operations:` in the per-feature evidence shape — `graphql_operations:`
|
|
9
|
+
// carries the operation names declared in the GraphQL schema; this builder
|
|
10
|
+
// captures the channel/topic layer (AppSync WebSocket, Pekko WS, MQTT, SSE,
|
|
11
|
+
// etc.) that physically delivers push events.
|
|
12
|
+
//
|
|
13
|
+
// Input shape (per the rubric):
|
|
14
|
+
//
|
|
15
|
+
// features:
|
|
16
|
+
// - feature_slug: <slug>
|
|
17
|
+
// subscription_channels:
|
|
18
|
+
// - name: <channel-identifier>
|
|
19
|
+
// transport: appsync-websocket | pekko-ws | mqtt | sse | webhook-push | other
|
|
20
|
+
// evidence: <sub-repo>/<path>:<line>
|
|
21
|
+
// payload_ref: <event-name> # optional
|
|
22
|
+
//
|
|
23
|
+
// Feature-id resolution: the canonical builder emits feature rows with ids
|
|
24
|
+
// shaped `{product_id|capability_id}-{feature_slug}`. Adopters' evidence
|
|
25
|
+
// yamls carry only the bare `feature_slug:`. This builder accepts a set of
|
|
26
|
+
// known feature ids (`existingFeatureIds`) and probes each candidate
|
|
27
|
+
// resolution (`{productId}-{slug}` and `{slug}` and `<capability>-{slug}`
|
|
28
|
+
// for any capability id ending in `-{slug}`). When no candidate resolves,
|
|
29
|
+
// the row is dropped and an `orphan` finding is emitted so reviewers can
|
|
30
|
+
// reconcile.
|
|
31
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
32
|
+
import { join, relative, sep } from "node:path";
|
|
33
|
+
import { parse as parseYaml } from "yaml";
|
|
34
|
+
const EVIDENCE_FILE_REL = join("reverse-evidence", "feature-grounding-evidence.yaml");
|
|
35
|
+
const VALID_TRANSPORTS = new Set([
|
|
36
|
+
"appsync-websocket",
|
|
37
|
+
"pekko-ws",
|
|
38
|
+
"mqtt",
|
|
39
|
+
"sse",
|
|
40
|
+
"webhook-push",
|
|
41
|
+
"other",
|
|
42
|
+
]);
|
|
43
|
+
export async function buildFeatureSubscriptionChannels(inputs) {
|
|
44
|
+
const rows = [];
|
|
45
|
+
const seenIds = new Set();
|
|
46
|
+
const evidenceFiles = await collectEvidenceFiles(inputs.sddPath);
|
|
47
|
+
for (const file of evidenceFiles) {
|
|
48
|
+
const relPath = relative(inputs.sddPath, file);
|
|
49
|
+
let text;
|
|
50
|
+
try {
|
|
51
|
+
text = await readFile(file, "utf-8");
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
inputs.findings.add("convention", `${relPath}: cannot read evidence file`);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
let parsed;
|
|
58
|
+
try {
|
|
59
|
+
parsed = parseYaml(text);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
63
|
+
inputs.findings.add("convention", `${relPath}: invalid YAML — ${msg}`);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (!parsed || typeof parsed !== "object")
|
|
67
|
+
continue;
|
|
68
|
+
const features = parsed["features"];
|
|
69
|
+
if (!Array.isArray(features))
|
|
70
|
+
continue;
|
|
71
|
+
for (const f of features) {
|
|
72
|
+
if (!f || typeof f !== "object")
|
|
73
|
+
continue;
|
|
74
|
+
const feat = f;
|
|
75
|
+
const slug = String(feat["feature_slug"] ?? "").trim();
|
|
76
|
+
if (slug === "")
|
|
77
|
+
continue;
|
|
78
|
+
const channels = feat["subscription_channels"];
|
|
79
|
+
if (!Array.isArray(channels) || channels.length === 0)
|
|
80
|
+
continue;
|
|
81
|
+
const featureId = resolveFeatureId(slug, inputs.productId, inputs.existingFeatureIds);
|
|
82
|
+
if (featureId === "") {
|
|
83
|
+
inputs.findings.add("orphan", `${relPath}: feature_slug="${slug}" carries subscription_channels but does not resolve to any catalogue feature id`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
for (const ch of channels) {
|
|
87
|
+
if (!ch || typeof ch !== "object")
|
|
88
|
+
continue;
|
|
89
|
+
const channelObj = ch;
|
|
90
|
+
const channelName = String(channelObj["name"] ?? "").trim();
|
|
91
|
+
if (channelName === "") {
|
|
92
|
+
inputs.findings.add("convention", `${relPath}: subscription_channels entry under feature_slug="${slug}" missing required "name" field`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const transport = String(channelObj["transport"] ?? "").trim();
|
|
96
|
+
if (transport === "") {
|
|
97
|
+
inputs.findings.add("convention", `${relPath}: subscription_channels entry "${channelName}" under feature_slug="${slug}" missing required "transport" field`);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (!VALID_TRANSPORTS.has(transport)) {
|
|
101
|
+
inputs.findings.add("convention", `${relPath}: subscription_channels entry "${channelName}" under feature_slug="${slug}" has unknown transport="${transport}" (expected one of ${[...VALID_TRANSPORTS].join(", ")})`);
|
|
102
|
+
// Don't drop — emit the row with the literal transport. The
|
|
103
|
+
// schema accepts any string; this finding lets reviewers
|
|
104
|
+
// notice the deviation.
|
|
105
|
+
}
|
|
106
|
+
const evidence = typeof channelObj["evidence"] === "string"
|
|
107
|
+
? channelObj["evidence"].trim()
|
|
108
|
+
: "";
|
|
109
|
+
const payloadRef = typeof channelObj["payload_ref"] === "string"
|
|
110
|
+
? channelObj["payload_ref"].trim()
|
|
111
|
+
: "";
|
|
112
|
+
const rowId = `${featureId}__${channelName}`;
|
|
113
|
+
if (seenIds.has(rowId)) {
|
|
114
|
+
inputs.findings.add("divergence", `${relPath}: duplicate subscription_channels row id="${rowId}" — same (feature_id, channel_name) already emitted`);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
seenIds.add(rowId);
|
|
118
|
+
rows.push({
|
|
119
|
+
id: rowId,
|
|
120
|
+
feature_id: featureId,
|
|
121
|
+
channel_name: channelName,
|
|
122
|
+
transport,
|
|
123
|
+
evidence,
|
|
124
|
+
payload_ref: payloadRef,
|
|
125
|
+
source_sdd_id: "",
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return rows;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolve a bare `feature_slug` from evidence yaml to a canonical feature id
|
|
134
|
+
* present in `existingFeatureIds`. Candidates probed in order:
|
|
135
|
+
* 1. `{productId}-{slug}` — typical for application-product / integration-product features.
|
|
136
|
+
* 2. The slug as-is — when the feature id is just the slug (legacy / capability-spec source).
|
|
137
|
+
* 3. Any existing id ending in `-{slug}` — covers `{capability-id}-{slug}` for capability-spec sourced features.
|
|
138
|
+
*
|
|
139
|
+
* Returns `""` when no candidate resolves.
|
|
140
|
+
*/
|
|
141
|
+
function resolveFeatureId(slug, productId, existing) {
|
|
142
|
+
if (productId !== "") {
|
|
143
|
+
const candidate = `${productId}-${slug}`;
|
|
144
|
+
if (existing.has(candidate))
|
|
145
|
+
return candidate;
|
|
146
|
+
}
|
|
147
|
+
if (existing.has(slug))
|
|
148
|
+
return slug;
|
|
149
|
+
for (const id of existing) {
|
|
150
|
+
if (id.endsWith(`-${slug}`))
|
|
151
|
+
return id;
|
|
152
|
+
}
|
|
153
|
+
return "";
|
|
154
|
+
}
|
|
155
|
+
async function collectEvidenceFiles(sddPath) {
|
|
156
|
+
const out = [];
|
|
157
|
+
await walk(sddPath, sddPath, out);
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
async function walk(root, current, out) {
|
|
161
|
+
let entries;
|
|
162
|
+
try {
|
|
163
|
+
entries = await readdir(current, { withFileTypes: true });
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
for (const e of entries) {
|
|
169
|
+
if (e.name === "node_modules" || e.name === ".git" || e.name === "source" || e.name === "catalogues" || e.name === "dist") {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const abs = join(current, e.name);
|
|
173
|
+
if (e.isDirectory()) {
|
|
174
|
+
// Check whether this is the reverse-evidence dir; if so, look for the file directly.
|
|
175
|
+
if (e.name === "reverse-evidence") {
|
|
176
|
+
const candidate = join(abs, "feature-grounding-evidence.yaml");
|
|
177
|
+
try {
|
|
178
|
+
const s = await stat(candidate);
|
|
179
|
+
if (s.isFile())
|
|
180
|
+
out.push(candidate);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// No file in this reverse-evidence dir — skip silently.
|
|
184
|
+
}
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
// Bound recursion depth via a heuristic on path component count from root
|
|
188
|
+
// to avoid pathological deep trees; reverse-evidence lives at most a few
|
|
189
|
+
// levels deep in adopters we've seen.
|
|
190
|
+
const rel = relative(root, abs);
|
|
191
|
+
if (rel.split(sep).length > 8)
|
|
192
|
+
continue;
|
|
193
|
+
await walk(root, abs, out);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=feature-subscription-channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-subscription-channels.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/feature-subscription-channels.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,2FAA2F;AAC3F,0CAA0C;AAC1C,EAAE;AACF,oFAAoF;AACpF,0FAA0F;AAC1F,sEAAsE;AACtE,kFAAkF;AAClF,2EAA2E;AAC3E,4EAA4E;AAC5E,8CAA8C;AAC9C,EAAE;AACF,gCAAgC;AAChC,EAAE;AACF,cAAc;AACd,6BAA6B;AAC7B,+BAA+B;AAC/B,uCAAuC;AACvC,wFAAwF;AACxF,+CAA+C;AAC/C,0DAA0D;AAC1D,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,qEAAqE;AACrE,0EAA0E;AAC1E,0EAA0E;AAC1E,yEAAyE;AACzE,aAAa;AAEb,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAa1C,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,EAAE,iCAAiC,CAAC,CAAC;AAEtF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,mBAAmB;IACnB,UAAU;IACV,MAAM;IACN,KAAK;IACL,cAAc;IACd,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,MAA8C;IAE9C,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjE,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,OAAO,6BAA6B,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QACD,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,OAAO,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACvE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QACpD,MAAM,QAAQ,GAAI,MAAkC,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEvC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,SAAS;YAC1C,MAAM,IAAI,GAAG,CAA4B,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,IAAI,IAAI,KAAK,EAAE;gBAAE,SAAS;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEhE,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACtF,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;gBACrB,MAAM,CAAC,QAAQ,CAAC,GAAG,CACjB,QAAQ,EACR,GAAG,OAAO,mBAAmB,IAAI,kFAAkF,CACpH,CAAC;gBACF,SAAS;YACX,CAAC;YAED,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;oBAAE,SAAS;gBAC5C,MAAM,UAAU,GAAG,EAA6B,CAAC;gBACjD,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5D,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;oBACvB,MAAM,CAAC,QAAQ,CAAC,GAAG,CACjB,YAAY,EACZ,GAAG,OAAO,qDAAqD,IAAI,iCAAiC,CACrG,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC/D,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;oBACrB,MAAM,CAAC,QAAQ,CAAC,GAAG,CACjB,YAAY,EACZ,GAAG,OAAO,kCAAkC,WAAW,yBAAyB,IAAI,sCAAsC,CAC3H,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrC,MAAM,CAAC,QAAQ,CAAC,GAAG,CACjB,YAAY,EACZ,GAAG,OAAO,kCAAkC,WAAW,yBAAyB,IAAI,4BAA4B,SAAS,sBAAsB,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACnL,CAAC;oBACF,4DAA4D;oBAC5D,yDAAyD;oBACzD,wBAAwB;gBAC1B,CAAC;gBACD,MAAM,QAAQ,GAAG,OAAO,UAAU,CAAC,UAAU,CAAC,KAAK,QAAQ;oBACzD,CAAC,CAAE,UAAU,CAAC,UAAU,CAAY,CAAC,IAAI,EAAE;oBAC3C,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,aAAa,CAAC,KAAK,QAAQ;oBAC9D,CAAC,CAAE,UAAU,CAAC,aAAa,CAAY,CAAC,IAAI,EAAE;oBAC9C,CAAC,CAAC,EAAE,CAAC;gBAEP,MAAM,KAAK,GAAG,GAAG,SAAS,KAAK,WAAW,EAAE,CAAC;gBAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,QAAQ,CAAC,GAAG,CACjB,YAAY,EACZ,GAAG,OAAO,6CAA6C,KAAK,qDAAqD,CAClH,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC;oBACR,EAAE,EAAE,KAAK;oBACT,UAAU,EAAE,SAAS;oBACrB,YAAY,EAAE,WAAW;oBACzB,SAAS;oBACT,QAAQ;oBACR,WAAW,EAAE,UAAU;oBACvB,aAAa,EAAE,EAAE;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CACvB,IAAY,EACZ,SAAiB,EACjB,QAA6B;IAE7B,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAChD,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACjD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAClC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,IAAY,EACZ,OAAe,EACf,GAAa;IAEb,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1H,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACpB,qFAAqF;YACrF,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC;gBAC/D,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;oBAChC,IAAI,CAAC,CAAC,MAAM,EAAE;wBAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtC,CAAC;gBAAC,MAAM,CAAC;oBACP,wDAAwD;gBAC1D,CAAC;gBACD,SAAS;YACX,CAAC;YACD,0EAA0E;YAC1E,yEAAyE;YACzE,sCAAsC;YACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAChC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YACxC,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -68,4 +68,8 @@ export { buildCapabilityDomainModel } from "./capability-domain-model.js";
|
|
|
68
68
|
export type { CapabilityDomainModelInputs } from "./capability-domain-model.js";
|
|
69
69
|
export { buildFeatureDomainModel } from "./feature-domain-model.js";
|
|
70
70
|
export type { FeatureDomainModelInputs } from "./feature-domain-model.js";
|
|
71
|
+
export { buildFeatureSubscriptionChannels } from "./feature-subscription-channels.js";
|
|
72
|
+
export type { FeatureSubscriptionChannelsBuildInputs } from "./feature-subscription-channels.js";
|
|
73
|
+
export { buildProductPlatformDependencies } from "./product-platform-dependencies.js";
|
|
74
|
+
export type { ProductPlatformDependenciesBuildInputs } from "./product-platform-dependencies.js";
|
|
71
75
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,YAAY,EACV,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EACV,eAAe,EACf,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,YAAY,EACV,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,YAAY,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EACV,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EACV,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EACV,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,YAAY,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,4 +37,6 @@ export { buildFeatureContract } from "./feature-contract.js";
|
|
|
37
37
|
export { buildDomainModels } from "./domain-models.js";
|
|
38
38
|
export { buildCapabilityDomainModel } from "./capability-domain-model.js";
|
|
39
39
|
export { buildFeatureDomainModel } from "./feature-domain-model.js";
|
|
40
|
+
export { buildFeatureSubscriptionChannels } from "./feature-subscription-channels.js";
|
|
41
|
+
export { buildProductPlatformDependencies } from "./product-platform-dependencies.js";
|
|
40
42
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAK/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAK3D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM1C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAK3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAKnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAK/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAK3D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM1C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAK3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAKnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AAEtF,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CatalogueRow } from "../csv-writer.js";
|
|
2
|
+
import type { FindingsLog } from "../findings.js";
|
|
3
|
+
export interface ProductPlatformDependenciesBuildInputs {
|
|
4
|
+
readonly sddPath: string;
|
|
5
|
+
readonly findings: FindingsLog;
|
|
6
|
+
/** SDD's product id (the consuming product). */
|
|
7
|
+
readonly productId: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function buildProductPlatformDependencies(inputs: ProductPlatformDependenciesBuildInputs): Promise<CatalogueRow[]>;
|
|
10
|
+
//# sourceMappingURL=product-platform-dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-platform-dependencies.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/product-platform-dependencies.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC,YAAY,EAAE,CAAC,CAkFzB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// product_platform_dependencies builder — emits per-SDD rows recording
|
|
2
|
+
// platform consumption declared in `reverse-evidence/feature-grounding-evidence.yaml`
|
|
3
|
+
// under the product-scoped `platform_dependencies:` block. Added in
|
|
4
|
+
// schema 2.9.0.
|
|
5
|
+
//
|
|
6
|
+
// The source shape (per the cohort source files):
|
|
7
|
+
//
|
|
8
|
+
// platform_dependencies:
|
|
9
|
+
// - capability_id: <target-capability-slug> # platform-side capability
|
|
10
|
+
// service_id: <target-service-slug> # platform-side service
|
|
11
|
+
// domain: <domain-hint> # optional, free-text
|
|
12
|
+
// contract_type: rest | graphql | openapi | grpc | event | other
|
|
13
|
+
// required_stability: locked | provisional | unknown
|
|
14
|
+
// contract_path: <relative-path-in-platform-sdd>
|
|
15
|
+
// consumed_by:
|
|
16
|
+
// - <service-name-within-this-product>
|
|
17
|
+
//
|
|
18
|
+
// Each entry emits one row keyed by `(product_id, target_capability_id,
|
|
19
|
+
// target_service_id)`. The aggregator subsequently joins these rows
|
|
20
|
+
// against platform-side `capability_service` to derive
|
|
21
|
+
// `cross_sdd_platform_capability` edges (per ADR 0134, federation).
|
|
22
|
+
//
|
|
23
|
+
// Cross-SDD references (target_capability_id, target_service_id) are
|
|
24
|
+
// declared `external: true` in the schema — per-SDD FK validation
|
|
25
|
+
// doesn't run them.
|
|
26
|
+
//
|
|
27
|
+
// Defensive shape:
|
|
28
|
+
// - Missing capability_id OR service_id → skip the entry, log `convention`.
|
|
29
|
+
// - Multiple platform_dependencies blocks across multiple evidence files in
|
|
30
|
+
// the SDD are merged. Duplicate (product_id, target_capability_id,
|
|
31
|
+
// target_service_id) emit `divergence` and keep the first.
|
|
32
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
33
|
+
import { join, relative, sep } from "node:path";
|
|
34
|
+
import { parse as parseYaml } from "yaml";
|
|
35
|
+
export async function buildProductPlatformDependencies(inputs) {
|
|
36
|
+
const rows = [];
|
|
37
|
+
const seenIds = new Set();
|
|
38
|
+
if (inputs.productId === "") {
|
|
39
|
+
// No product id means no rows can be emitted — product_platform_dependencies
|
|
40
|
+
// is product-scoped. Return empty silently (the orchestrator decides
|
|
41
|
+
// whether to log this as a finding).
|
|
42
|
+
return rows;
|
|
43
|
+
}
|
|
44
|
+
const evidenceFiles = await collectEvidenceFiles(inputs.sddPath);
|
|
45
|
+
for (const file of evidenceFiles) {
|
|
46
|
+
const relPath = relative(inputs.sddPath, file);
|
|
47
|
+
let text;
|
|
48
|
+
try {
|
|
49
|
+
text = await readFile(file, "utf-8");
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
inputs.findings.add("convention", `${relPath}: cannot read evidence file`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
let parsed;
|
|
56
|
+
try {
|
|
57
|
+
parsed = parseYaml(text);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
61
|
+
inputs.findings.add("convention", `${relPath}: invalid YAML — ${msg}`);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (!parsed || typeof parsed !== "object")
|
|
65
|
+
continue;
|
|
66
|
+
const deps = parsed["platform_dependencies"];
|
|
67
|
+
if (!Array.isArray(deps))
|
|
68
|
+
continue;
|
|
69
|
+
for (const d of deps) {
|
|
70
|
+
if (!d || typeof d !== "object")
|
|
71
|
+
continue;
|
|
72
|
+
const dep = d;
|
|
73
|
+
const capabilityId = String(dep["capability_id"] ?? "").trim();
|
|
74
|
+
const serviceId = String(dep["service_id"] ?? "").trim();
|
|
75
|
+
if (capabilityId === "" || serviceId === "") {
|
|
76
|
+
inputs.findings.add("convention", `${relPath}: platform_dependencies entry missing required capability_id or service_id (capability_id="${capabilityId}", service_id="${serviceId}")`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const rowId = `${inputs.productId}__${capabilityId}__${serviceId}`;
|
|
80
|
+
if (seenIds.has(rowId)) {
|
|
81
|
+
inputs.findings.add("divergence", `${relPath}: duplicate platform_dependencies row id="${rowId}" — same (product_id, target_capability_id, target_service_id) already emitted`);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
seenIds.add(rowId);
|
|
85
|
+
const consumedBy = dep["consumed_by"];
|
|
86
|
+
const consumedByJoined = Array.isArray(consumedBy)
|
|
87
|
+
? consumedBy
|
|
88
|
+
.map((v) => String(v).trim())
|
|
89
|
+
.filter((v) => v !== "")
|
|
90
|
+
.join(",")
|
|
91
|
+
: typeof consumedBy === "string"
|
|
92
|
+
? consumedBy.trim()
|
|
93
|
+
: "";
|
|
94
|
+
rows.push({
|
|
95
|
+
id: rowId,
|
|
96
|
+
product_id: inputs.productId,
|
|
97
|
+
target_capability_id: capabilityId,
|
|
98
|
+
target_service_id: serviceId,
|
|
99
|
+
target_domain: optString(dep["domain"]),
|
|
100
|
+
contract_type: optString(dep["contract_type"]),
|
|
101
|
+
required_stability: optString(dep["required_stability"]),
|
|
102
|
+
contract_path: optString(dep["contract_path"]),
|
|
103
|
+
consumed_by_services: consumedByJoined,
|
|
104
|
+
source_sdd_id: "",
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return rows;
|
|
109
|
+
}
|
|
110
|
+
function optString(value) {
|
|
111
|
+
return typeof value === "string" ? value.trim() : "";
|
|
112
|
+
}
|
|
113
|
+
async function collectEvidenceFiles(sddPath) {
|
|
114
|
+
const out = [];
|
|
115
|
+
await walk(sddPath, sddPath, out);
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
async function walk(root, current, out) {
|
|
119
|
+
let entries;
|
|
120
|
+
try {
|
|
121
|
+
entries = await readdir(current, { withFileTypes: true });
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
for (const e of entries) {
|
|
127
|
+
if (e.name === "node_modules" ||
|
|
128
|
+
e.name === ".git" ||
|
|
129
|
+
e.name === "source" ||
|
|
130
|
+
e.name === "catalogues" ||
|
|
131
|
+
e.name === "dist") {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const abs = join(current, e.name);
|
|
135
|
+
if (e.isDirectory()) {
|
|
136
|
+
if (e.name === "reverse-evidence") {
|
|
137
|
+
const candidate = join(abs, "feature-grounding-evidence.yaml");
|
|
138
|
+
try {
|
|
139
|
+
const s = await stat(candidate);
|
|
140
|
+
if (s.isFile())
|
|
141
|
+
out.push(candidate);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// No file in this reverse-evidence dir — skip silently.
|
|
145
|
+
}
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const rel = relative(root, abs);
|
|
149
|
+
if (rel.split(sep).length > 8)
|
|
150
|
+
continue;
|
|
151
|
+
await walk(root, abs, out);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=product-platform-dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-platform-dependencies.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/product-platform-dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,9 +45,22 @@
|
|
|
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.
|
|
48
|
+
schema_version: "2.9.0"
|
|
49
49
|
schema_owner: "sdd-method"
|
|
50
50
|
schema_status: "canonical"
|
|
51
|
+
# Bump rationale (2.9.0 — additive minor): adds the Track 2 cohort-sweep
|
|
52
|
+
# field set (`capabilities.data_subset`, `capabilities.slice_scope`), a new
|
|
53
|
+
# per-feature edge catalogue `feature_subscription_channels` for the
|
|
54
|
+
# AppSync / Pekko-WS / MQTT / SSE delivery layer (peer of `graphql_operations:`
|
|
55
|
+
# per resolved decision §1 of `content/plans/v0-9-0-cohort-sweep-derived-bundle.md`),
|
|
56
|
+
# a new per-SDD edge catalogue `product_platform_dependencies` capturing
|
|
57
|
+
# product-scoped platform consumption rows from
|
|
58
|
+
# `reverse-evidence/feature-grounding-evidence.yaml`, and a new federated
|
|
59
|
+
# edge catalogue `cross_sdd_platform_capability` that joins those rows
|
|
60
|
+
# against platform-side `capability_service` at aggregation time to
|
|
61
|
+
# surface ecosystem-wide product → platform-capability relationships.
|
|
62
|
+
# Backward-compatible — older readers ignore the new columns + new
|
|
63
|
+
# catalogues; SCHEMA_COMPAT stays at "^2.0.0".
|
|
51
64
|
|
|
52
65
|
# ─── Canonical enums ────────────────────────────────────────────────────────
|
|
53
66
|
#
|
|
@@ -231,6 +244,8 @@ catalogues:
|
|
|
231
244
|
- { name: spec_path, type: string, nullable: true, description: "Path to capability spec file when one exists." }
|
|
232
245
|
- { name: source, type: string, nullable: false, description: "capability-tree | product-map | capability-spec." }
|
|
233
246
|
- { name: runway_classification, type: string, nullable: true, description: "Business | Enabler-Runway | Hybrid (forward declares; reverse nullable until backfilled)." }
|
|
247
|
+
- { name: data_subset, type: string, nullable: true, description: "Keying-axis marker for foundational-tier / synthesis-tier capabilities whose evidence is keyed by ownership boundary or data subset rather than app group. Populated from `capability.data_subset` in the traceability manifest. Empty for implementing-tier capabilities (those use app_group on per-evidence rows). See `docs/method/methods/reverse/rubrics/reverse-platform-evidence-quality.md` §`app_group:` → `data_subset:` rename. Added in schema 2.9.0." }
|
|
248
|
+
- { name: slice_scope, type: string, nullable: true, description: "Per-slice marker when one capability legitimately covers multiple app groups or data subsets (e.g. a compliance capability spanning several regulated-fleet sub-groups). Same capability_id may appear across multiple rows when sliced; row identity is then `(id, slice_scope)`. Empty when the capability is not sliced. Per-slice AC numbering convention: AC1-ACN unsuffixed for the first slice; subsequent slices use AC numbering suffixed by slice. See `docs/method/methods/reverse/rubrics/reverse-platform-evidence-quality.md` §`slice_scope:` and `docs/method/methods/capability-spec-template.md` Guideline 9. Added in schema 2.9.0." }
|
|
234
249
|
- { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
|
|
235
250
|
|
|
236
251
|
feature_groups:
|
|
@@ -614,6 +629,20 @@ catalogues:
|
|
|
614
629
|
- { name: contract_id, type: string, nullable: false }
|
|
615
630
|
- { name: derivation_path, type: string, nullable: true, description: "cap-feature-cap-contract | feature-service-service-contract. Diagnostic only — records which join path produced the row." }
|
|
616
631
|
|
|
632
|
+
feature_subscription_channels:
|
|
633
|
+
primary_key: id
|
|
634
|
+
description: "Edge: feature delivers async push via a named channel/topic. Peer of `graphql_operations:` in the per-feature evidence shape — `graphql_operations:` carries the GraphQL operation names declared in the schema (Queries / Mutations / Subscriptions); `feature_subscription_channels` rows carry the channel/topic layer that physically delivers the push events (AppSync WebSocket endpoints, Pekko WS channels, MQTT topics, server-sent-event streams). Per resolved decision §1 of `content/plans/v0-9-0-cohort-sweep-derived-bundle.md`: a single GraphQL Subscription operation may listen on multiple channels; one channel may be consumed by multiple operations — modelling as a separate edge catalogue (not as a feature column) accommodates the many-to-many. Built per-SDD from `reverse-evidence/feature-grounding-evidence.yaml` `subscription_channels:` entries on each feature. Added in schema 2.9.0."
|
|
635
|
+
foreign_keys:
|
|
636
|
+
- { column: feature_id, references: features.id, nullable: false }
|
|
637
|
+
columns:
|
|
638
|
+
- { name: id, type: string, nullable: false, description: "{feature_id}__{channel_name}." }
|
|
639
|
+
- { name: feature_id, type: string, nullable: false }
|
|
640
|
+
- { name: channel_name, type: string, nullable: false, description: "Channel identifier (kebab-case slug, namespaced as the source evidence carries it — e.g. `customer.<customerId>.tracking-points` for AppSync subscription channels)." }
|
|
641
|
+
- { name: transport, type: string, nullable: false, description: "Delivery protocol: `appsync-websocket | pekko-ws | mqtt | sse | webhook-push | other`. The `other` value is escape-valve; adopters using it SHOULD record the actual transport in evidence." }
|
|
642
|
+
- { name: evidence, type: string, nullable: true, description: "Evidence-file citation (`<sub-repo>/<path>:<line>`) anchoring the channel declaration. Mirrors the citation pattern used elsewhere in evidence yamls." }
|
|
643
|
+
- { name: payload_ref, type: string, nullable: true, description: "Optional reference to a payload-contract event (`{event-name}` in the `events` catalogue) when the channel carries a contract-shaped payload. Empty when the payload is channel-private." }
|
|
644
|
+
- { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
|
|
645
|
+
|
|
617
646
|
capability_domain_model:
|
|
618
647
|
primary_key: id
|
|
619
648
|
description: "Edge: capability references a domain model. Forward: declared in `traceability.domain_model` field of the capability traceability manifest. Reverse: inferred via capability → domain → domain_model. Platform-profile only. Added in schema 2.4.0; see ADR 0142."
|
|
@@ -672,3 +701,69 @@ catalogues:
|
|
|
672
701
|
- { name: id, type: string, nullable: false }
|
|
673
702
|
- { name: superseding_adr_id, type: string, nullable: false }
|
|
674
703
|
- { name: superseded_adr_id, type: string, nullable: false }
|
|
704
|
+
|
|
705
|
+
product_platform_dependencies:
|
|
706
|
+
primary_key: id
|
|
707
|
+
description: >
|
|
708
|
+
Per-SDD edge: an application-side or integration-side SDD declares
|
|
709
|
+
that its product depends on a platform-side capability + service
|
|
710
|
+
pair. Built from `reverse-evidence/feature-grounding-evidence.yaml`
|
|
711
|
+
`platform_dependencies:` block (product-level — the cohort source
|
|
712
|
+
shape carries product-scoped dependency rows with a `consumed_by:`
|
|
713
|
+
list naming which services within the consuming product depend on
|
|
714
|
+
the target). Each row records one (consuming product, target
|
|
715
|
+
capability, target service) triple. The aggregator then joins
|
|
716
|
+
these rows against platform-side `capability_service` to emit
|
|
717
|
+
`cross_sdd_platform_capability` edges at aggregation time. Cross-
|
|
718
|
+
SDD references (target_capability_id, target_service_id) are
|
|
719
|
+
external — they're not expected to resolve in the per-SDD build,
|
|
720
|
+
only at aggregation. Added in schema 2.9.0; see
|
|
721
|
+
`content/plans/v0-9-0-cohort-sweep-derived-bundle.md`
|
|
722
|
+
§"Cross-SDD platform-capability-edge".
|
|
723
|
+
foreign_keys:
|
|
724
|
+
- { column: product_id, references: products.id, nullable: false }
|
|
725
|
+
- { column: target_capability_id, references: capabilities.id, nullable: false, external: true }
|
|
726
|
+
- { column: target_service_id, references: services.id, nullable: false, external: true }
|
|
727
|
+
columns:
|
|
728
|
+
- { name: id, type: string, nullable: false, description: "{product_id}__{target_capability_id}__{target_service_id}." }
|
|
729
|
+
- { name: product_id, type: string, nullable: false, description: "Consuming product (this SDD's product id)." }
|
|
730
|
+
- { name: target_capability_id, type: string, nullable: false, description: "Capability the consuming product depends on. Resolves at aggregation against a sibling SDD's capabilities.id; external by definition." }
|
|
731
|
+
- { name: target_service_id, type: string, nullable: false, description: "Service identifier the consuming product depends on. Resolves at aggregation against a sibling SDD's services.id; external by definition. The join key the aggregator uses to derive cross_sdd_platform_capability." }
|
|
732
|
+
- { name: target_domain, type: string, nullable: true, description: "Domain hint as declared in the consuming SDD's evidence (free-form; reviewer-facing annotation). May be a comma-separated list when the target spans multiple domains." }
|
|
733
|
+
- { name: contract_type, type: string, nullable: true, description: "rest | graphql | openapi | grpc | event | other. Optional; reflects what the consuming SDD declares." }
|
|
734
|
+
- { name: required_stability, type: string, nullable: true, description: "locked | provisional | unknown. Optional; the consuming SDD's expectation of contract stability." }
|
|
735
|
+
- { name: contract_path, type: string, nullable: true, description: "Path to the contract file the dependency is against, as declared in the consuming SDD's evidence. External — resolution happens at aggregation if it happens at all." }
|
|
736
|
+
- { name: consumed_by_services, type: string, nullable: true, description: "Comma-separated list of service names within the consuming product that consume the dependency. Free-text; not FK-validated (services are within-product and resolution is owner-side concern)." }
|
|
737
|
+
- { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
|
|
738
|
+
|
|
739
|
+
cross_sdd_platform_capability:
|
|
740
|
+
primary_key: id
|
|
741
|
+
description: >
|
|
742
|
+
Federated edge: an application-side or integration-side SDD's
|
|
743
|
+
`product_platform_dependencies` reference resolves against a
|
|
744
|
+
platform-side SDD's capability spec via the platform capability's
|
|
745
|
+
`capability_service` roster. Surfaces ecosystem-wide platform-
|
|
746
|
+
consumer relationships at product → capability granularity.
|
|
747
|
+
Built **only at aggregation time** — `sdd-cli catalogue aggregate`
|
|
748
|
+
joins each consuming SDD's `product_platform_dependencies` rows
|
|
749
|
+
against every other SDD's `capability_service` rows on
|
|
750
|
+
`target_service_id == service_id`, emitting one row per resolved
|
|
751
|
+
(consuming-product, platform-capability) pair. Per-SDD builders
|
|
752
|
+
emit nothing for this catalogue; the aggregator owns it entirely.
|
|
753
|
+
A platform-dependency whose target_service_id doesn't resolve to
|
|
754
|
+
any platform-side capability_service row is logged as an `orphan`
|
|
755
|
+
finding and produces no row. Cross-SDD references are external
|
|
756
|
+
by definition. Added in schema 2.9.0; see
|
|
757
|
+
`content/plans/v0-9-0-cohort-sweep-derived-bundle.md`
|
|
758
|
+
§"Cross-SDD platform-capability-edge" and ADR 0134.
|
|
759
|
+
foreign_keys:
|
|
760
|
+
- { column: consuming_product_id, references: products.id, nullable: false, external: true }
|
|
761
|
+
- { column: platform_capability_id, references: capabilities.id, nullable: false, external: true }
|
|
762
|
+
- { column: service_id, references: services.id, nullable: false, external: true }
|
|
763
|
+
columns:
|
|
764
|
+
- { name: id, type: string, nullable: false, description: "{consuming_sdd_id}__{consuming_product_id}__{platform_sdd_id}__{platform_capability_id}__{service_id}. Composite encoding so the same (consuming product, platform capability) pair can appear once per resolving service when a product depends on multiple services owned by the same capability." }
|
|
765
|
+
- { name: consuming_sdd_id, type: string, nullable: false, description: "SDD slug of the consuming side (application-product or integration-product SDD)." }
|
|
766
|
+
- { name: consuming_product_id, type: string, nullable: false, description: "Product in the consuming SDD that declares the platform_dependencies entry." }
|
|
767
|
+
- { name: platform_sdd_id, type: string, nullable: false, description: "SDD slug of the platform side that owns the resolved capability." }
|
|
768
|
+
- { name: platform_capability_id, type: string, nullable: false, description: "Capability in the platform SDD whose capability_service includes the resolved service." }
|
|
769
|
+
- { name: service_id, type: string, nullable: false, description: "Service identifier the consuming SDD references and the platform SDD owns. The join key." }
|
|
@@ -5,6 +5,23 @@ export interface TraceabilityCapabilityBlock {
|
|
|
5
5
|
readonly capability_spec?: string;
|
|
6
6
|
readonly feature_directory?: string;
|
|
7
7
|
readonly status?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Keying-axis marker for foundational-tier / synthesis-tier capabilities
|
|
10
|
+
* whose evidence is keyed by ownership boundary or data subset rather
|
|
11
|
+
* than app group. Added in schema 2.9.0. See
|
|
12
|
+
* `docs/method/methods/reverse/rubrics/reverse-platform-evidence-quality.md`
|
|
13
|
+
* §`app_group:` → `data_subset:` rename.
|
|
14
|
+
*/
|
|
15
|
+
readonly data_subset?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Per-slice marker when one capability legitimately covers multiple
|
|
18
|
+
* app groups or data subsets. Same capability_id may appear across
|
|
19
|
+
* multiple manifests with distinct `slice_scope` values; the
|
|
20
|
+
* capabilities builder emits one row per slice, identity composed of
|
|
21
|
+
* `(id, slice_scope)`. Empty when the capability is not sliced.
|
|
22
|
+
* Added in schema 2.9.0.
|
|
23
|
+
*/
|
|
24
|
+
readonly slice_scope?: string;
|
|
8
25
|
}
|
|
9
26
|
export interface TraceabilityRunwayBlock {
|
|
10
27
|
readonly classification?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traceability-loader.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/traceability-loader.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"traceability-loader.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/traceability-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,6 +65,12 @@ export async function loadTraceabilityManifests(opts) {
|
|
|
65
65
|
? { feature_directory: cap["feature_directory"] }
|
|
66
66
|
: {}),
|
|
67
67
|
...(typeof cap["status"] === "string" ? { status: cap["status"] } : {}),
|
|
68
|
+
...(typeof cap["data_subset"] === "string"
|
|
69
|
+
? { data_subset: cap["data_subset"] }
|
|
70
|
+
: {}),
|
|
71
|
+
...(typeof cap["slice_scope"] === "string"
|
|
72
|
+
? { slice_scope: cap["slice_scope"] }
|
|
73
|
+
: {}),
|
|
68
74
|
};
|
|
69
75
|
manifests.push({
|
|
70
76
|
path,
|