@sdd-method/sdd-cli 0.10.0 → 0.11.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/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/catalogue/aggregate.d.ts +39 -0
- package/dist/lib/catalogue/aggregate.d.ts.map +1 -0
- package/dist/lib/catalogue/aggregate.js +344 -0
- package/dist/lib/catalogue/aggregate.js.map +1 -0
- package/dist/lib/catalogue/aggregation-manifest-loader.d.ts +25 -0
- package/dist/lib/catalogue/aggregation-manifest-loader.d.ts.map +1 -0
- package/dist/lib/catalogue/aggregation-manifest-loader.js +111 -0
- package/dist/lib/catalogue/aggregation-manifest-loader.js.map +1 -0
- package/dist/lib/catalogue/build.d.ts +42 -0
- package/dist/lib/catalogue/build.d.ts.map +1 -0
- package/dist/lib/catalogue/build.js +373 -0
- package/dist/lib/catalogue/build.js.map +1 -0
- package/dist/lib/catalogue/builders/adr-supersedes.d.ts +14 -0
- package/dist/lib/catalogue/builders/adr-supersedes.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/adr-supersedes.js +62 -0
- package/dist/lib/catalogue/builders/adr-supersedes.js.map +1 -0
- package/dist/lib/catalogue/builders/adrs.d.ts +27 -0
- package/dist/lib/catalogue/builders/adrs.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/adrs.js +191 -0
- package/dist/lib/catalogue/builders/adrs.js.map +1 -0
- package/dist/lib/catalogue/builders/c4-containers.d.ts +16 -0
- package/dist/lib/catalogue/builders/c4-containers.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/c4-containers.js +169 -0
- package/dist/lib/catalogue/builders/c4-containers.js.map +1 -0
- package/dist/lib/catalogue/builders/c4-systems.d.ts +10 -0
- package/dist/lib/catalogue/builders/c4-systems.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/c4-systems.js +99 -0
- package/dist/lib/catalogue/builders/c4-systems.js.map +1 -0
- package/dist/lib/catalogue/builders/capabilities.d.ts +11 -0
- package/dist/lib/catalogue/builders/capabilities.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/capabilities.js +173 -0
- package/dist/lib/catalogue/builders/capabilities.js.map +1 -0
- package/dist/lib/catalogue/builders/capability-edges.d.ts +27 -0
- package/dist/lib/catalogue/builders/capability-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/capability-edges.js +166 -0
- package/dist/lib/catalogue/builders/capability-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/contracts.d.ts +15 -0
- package/dist/lib/catalogue/builders/contracts.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/contracts.js +153 -0
- package/dist/lib/catalogue/builders/contracts.js.map +1 -0
- package/dist/lib/catalogue/builders/domains.d.ts +10 -0
- package/dist/lib/catalogue/builders/domains.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/domains.js +93 -0
- package/dist/lib/catalogue/builders/domains.js.map +1 -0
- package/dist/lib/catalogue/builders/event-edges.d.ts +20 -0
- package/dist/lib/catalogue/builders/event-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/event-edges.js +112 -0
- package/dist/lib/catalogue/builders/event-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/events.d.ts +26 -0
- package/dist/lib/catalogue/builders/events.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/events.js +99 -0
- package/dist/lib/catalogue/builders/events.js.map +1 -0
- package/dist/lib/catalogue/builders/feature-groups.d.ts +10 -0
- package/dist/lib/catalogue/builders/feature-groups.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/feature-groups.js +118 -0
- package/dist/lib/catalogue/builders/feature-groups.js.map +1 -0
- package/dist/lib/catalogue/builders/features.d.ts +35 -0
- package/dist/lib/catalogue/builders/features.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/features.js +206 -0
- package/dist/lib/catalogue/builders/features.js.map +1 -0
- package/dist/lib/catalogue/builders/glossary-xref.d.ts +11 -0
- package/dist/lib/catalogue/builders/glossary-xref.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/glossary-xref.js +107 -0
- package/dist/lib/catalogue/builders/glossary-xref.js.map +1 -0
- package/dist/lib/catalogue/builders/glossary.d.ts +14 -0
- package/dist/lib/catalogue/builders/glossary.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/glossary.js +150 -0
- package/dist/lib/catalogue/builders/glossary.js.map +1 -0
- package/dist/lib/catalogue/builders/index.d.ts +57 -0
- package/dist/lib/catalogue/builders/index.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/index.js +33 -0
- package/dist/lib/catalogue/builders/index.js.map +1 -0
- package/dist/lib/catalogue/builders/integrations.d.ts +12 -0
- package/dist/lib/catalogue/builders/integrations.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/integrations.js +85 -0
- package/dist/lib/catalogue/builders/integrations.js.map +1 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.d.ts +26 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.js +133 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/personas.d.ts +22 -0
- package/dist/lib/catalogue/builders/personas.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/personas.js +150 -0
- package/dist/lib/catalogue/builders/personas.js.map +1 -0
- package/dist/lib/catalogue/builders/product-edges.d.ts +15 -0
- package/dist/lib/catalogue/builders/product-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/product-edges.js +97 -0
- package/dist/lib/catalogue/builders/product-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/products.d.ts +26 -0
- package/dist/lib/catalogue/builders/products.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/products.js +57 -0
- package/dist/lib/catalogue/builders/products.js.map +1 -0
- package/dist/lib/catalogue/builders/repo-edges.d.ts +18 -0
- package/dist/lib/catalogue/builders/repo-edges.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/repo-edges.js +113 -0
- package/dist/lib/catalogue/builders/repo-edges.js.map +1 -0
- package/dist/lib/catalogue/builders/repositories.d.ts +78 -0
- package/dist/lib/catalogue/builders/repositories.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/repositories.js +204 -0
- package/dist/lib/catalogue/builders/repositories.js.map +1 -0
- package/dist/lib/catalogue/builders/service-contract.d.ts +11 -0
- package/dist/lib/catalogue/builders/service-contract.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/service-contract.js +53 -0
- package/dist/lib/catalogue/builders/service-contract.js.map +1 -0
- package/dist/lib/catalogue/builders/services.d.ts +15 -0
- package/dist/lib/catalogue/builders/services.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/services.js +40 -0
- package/dist/lib/catalogue/builders/services.js.map +1 -0
- package/dist/lib/catalogue/builders/user-journeys.d.ts +24 -0
- package/dist/lib/catalogue/builders/user-journeys.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/user-journeys.js +253 -0
- package/dist/lib/catalogue/builders/user-journeys.js.map +1 -0
- package/dist/lib/catalogue/canonical-schema.yaml +624 -0
- package/dist/lib/catalogue/cli-version.d.ts +10 -0
- package/dist/lib/catalogue/cli-version.d.ts.map +1 -0
- package/dist/lib/catalogue/cli-version.js +10 -0
- package/dist/lib/catalogue/cli-version.js.map +1 -0
- package/dist/lib/catalogue/csv-reader.d.ts +7 -0
- package/dist/lib/catalogue/csv-reader.d.ts.map +1 -0
- package/dist/lib/catalogue/csv-reader.js +97 -0
- package/dist/lib/catalogue/csv-reader.js.map +1 -0
- package/dist/lib/catalogue/csv-writer.d.ts +29 -0
- package/dist/lib/catalogue/csv-writer.d.ts.map +1 -0
- package/dist/lib/catalogue/csv-writer.js +55 -0
- package/dist/lib/catalogue/csv-writer.js.map +1 -0
- package/dist/lib/catalogue/findings.d.ts +27 -0
- package/dist/lib/catalogue/findings.d.ts.map +1 -0
- package/dist/lib/catalogue/findings.js +34 -0
- package/dist/lib/catalogue/findings.js.map +1 -0
- package/dist/lib/catalogue/fk-validator.d.ts +44 -0
- package/dist/lib/catalogue/fk-validator.d.ts.map +1 -0
- package/dist/lib/catalogue/fk-validator.js +90 -0
- package/dist/lib/catalogue/fk-validator.js.map +1 -0
- package/dist/lib/catalogue/index.d.ts +27 -0
- package/dist/lib/catalogue/index.d.ts.map +1 -0
- package/dist/lib/catalogue/index.js +18 -0
- package/dist/lib/catalogue/index.js.map +1 -0
- package/dist/lib/catalogue/manifest-loader.d.ts +47 -0
- package/dist/lib/catalogue/manifest-loader.d.ts.map +1 -0
- package/dist/lib/catalogue/manifest-loader.js +161 -0
- package/dist/lib/catalogue/manifest-loader.js.map +1 -0
- package/dist/lib/catalogue/schema-compat.d.ts +47 -0
- package/dist/lib/catalogue/schema-compat.d.ts.map +1 -0
- package/dist/lib/catalogue/schema-compat.js +52 -0
- package/dist/lib/catalogue/schema-compat.js.map +1 -0
- package/dist/lib/catalogue/schema-loader.d.ts +58 -0
- package/dist/lib/catalogue/schema-loader.d.ts.map +1 -0
- package/dist/lib/catalogue/schema-loader.js +86 -0
- package/dist/lib/catalogue/schema-loader.js.map +1 -0
- package/dist/lib/catalogue/traceability-loader.d.ts +56 -0
- package/dist/lib/catalogue/traceability-loader.d.ts.map +1 -0
- package/dist/lib/catalogue/traceability-loader.js +217 -0
- package/dist/lib/catalogue/traceability-loader.js.map +1 -0
- package/dist/lib/catalogue/validate.d.ts +16 -0
- package/dist/lib/catalogue/validate.d.ts.map +1 -0
- package/dist/lib/catalogue/validate.js +137 -0
- package/dist/lib/catalogue/validate.js.map +1 -0
- package/dist/lib/catalogue/version.d.ts +3 -0
- package/dist/lib/catalogue/version.d.ts.map +1 -0
- package/dist/lib/catalogue/version.js +18 -0
- package/dist/lib/catalogue/version.js.map +1 -0
- package/dist/lib/mcp/build-info.d.ts +1 -1
- package/dist/lib/mcp/build-info.js +1 -1
- package/dist/verbs/catalogue.d.ts +3 -0
- package/dist/verbs/catalogue.d.ts.map +1 -0
- package/dist/verbs/catalogue.js +60 -0
- package/dist/verbs/catalogue.js.map +1 -0
- package/package.json +3 -3
- package/scripts/copy-yaml-assets.mjs +38 -0
- package/scripts/sync-canonical-schema.sh +39 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// Capability discoverer — emits `capabilities.csv` rows from
|
|
2
|
+
// traceability YAMLs (authoritative) plus capability spec files
|
|
3
|
+
// (fallback for specs not covered by a traceability).
|
|
4
|
+
//
|
|
5
|
+
// Per ADR 0134 and the catalogue-builder-specification §"Inputs":
|
|
6
|
+
// - Authoritative source: docs/domains/<domain>/product/<cap>.traceability.yaml
|
|
7
|
+
// declares capability.id (canonical), domain, capability_spec, runway.
|
|
8
|
+
// - Fallback: capability spec markdown files at
|
|
9
|
+
// docs/domains/<domain>/product/<cap>.md without an accompanying
|
|
10
|
+
// traceability YAML. Filename stem is used as the capability id.
|
|
11
|
+
// - When a traceability's capability.id differs from the spec file's
|
|
12
|
+
// stem, the canonical id wins; the divergence is logged as a finding.
|
|
13
|
+
import { readFile, stat } from "node:fs/promises";
|
|
14
|
+
import { join, relative, sep } from "node:path";
|
|
15
|
+
import { readdir } from "node:fs/promises";
|
|
16
|
+
const DOMAINS_DIR_REL = join("docs", "domains");
|
|
17
|
+
export async function buildCapabilities(inputs) {
|
|
18
|
+
const rows = [];
|
|
19
|
+
const seen = new Set();
|
|
20
|
+
const usedSpecPaths = new Set();
|
|
21
|
+
// Pass 1 — traceability-declared capabilities (authoritative).
|
|
22
|
+
for (const m of inputs.manifests) {
|
|
23
|
+
const cap = m.capability;
|
|
24
|
+
if (seen.has(cap.id)) {
|
|
25
|
+
inputs.findings.add("divergence", `${m.relPath}: capability.id="${cap.id}" already emitted by an earlier manifest`);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (!inputs.knownDomainIds.has(cap.domain)) {
|
|
29
|
+
inputs.findings.add("orphan", `${m.relPath}: capability.domain="${cap.domain}" has no docs/domains/${cap.domain}/`);
|
|
30
|
+
}
|
|
31
|
+
const specRel = cap.capability_spec ?? "";
|
|
32
|
+
let name = titleCase(cap.id);
|
|
33
|
+
if (specRel) {
|
|
34
|
+
usedSpecPaths.add(specRel);
|
|
35
|
+
const specAbs = join(inputs.sddPath, specRel);
|
|
36
|
+
const headingName = await readSpecH1Name(specAbs);
|
|
37
|
+
if (headingName !== "") {
|
|
38
|
+
name = headingName;
|
|
39
|
+
}
|
|
40
|
+
// Log id ↔ spec stem divergence (informational).
|
|
41
|
+
const stem = stemOf(specRel);
|
|
42
|
+
if (stem !== "" && stem !== cap.id) {
|
|
43
|
+
inputs.findings.add("divergence", `${m.relPath}: capability.id="${cap.id}" differs from spec stem "${stem}"`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
seen.add(cap.id);
|
|
47
|
+
rows.push({
|
|
48
|
+
id: cap.id,
|
|
49
|
+
name,
|
|
50
|
+
domain_id: cap.domain,
|
|
51
|
+
tree_category: "",
|
|
52
|
+
parent_capability_id: "",
|
|
53
|
+
description: "",
|
|
54
|
+
status: cap.status ?? "active",
|
|
55
|
+
spec_path: specRel,
|
|
56
|
+
source: "capability-spec",
|
|
57
|
+
runway_classification: m.traceability.runway?.classification ?? "",
|
|
58
|
+
source_sdd_id: "",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Pass 2 — capability spec files not covered by any traceability.
|
|
62
|
+
const specFiles = await collectCapabilitySpecs(inputs.sddPath);
|
|
63
|
+
for (const spec of specFiles) {
|
|
64
|
+
const relPath = relative(inputs.sddPath, spec);
|
|
65
|
+
if (usedSpecPaths.has(relPath))
|
|
66
|
+
continue;
|
|
67
|
+
if (rows.some((r) => r["spec_path"] === relPath))
|
|
68
|
+
continue;
|
|
69
|
+
const stem = stemOf(relPath);
|
|
70
|
+
if (seen.has(stem))
|
|
71
|
+
continue;
|
|
72
|
+
const domain = inferDomainFromSpec(relPath);
|
|
73
|
+
if (domain === "") {
|
|
74
|
+
inputs.findings.add("orphan", `${relPath}: cannot infer domain from path`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!inputs.knownDomainIds.has(domain)) {
|
|
78
|
+
inputs.findings.add("orphan", `${relPath}: domain "${domain}" has no docs/domains/${domain}/`);
|
|
79
|
+
}
|
|
80
|
+
const heading = await readSpecH1Name(spec);
|
|
81
|
+
seen.add(stem);
|
|
82
|
+
rows.push({
|
|
83
|
+
id: stem,
|
|
84
|
+
name: heading !== "" ? heading : titleCase(stem),
|
|
85
|
+
domain_id: domain,
|
|
86
|
+
tree_category: "",
|
|
87
|
+
parent_capability_id: "",
|
|
88
|
+
description: "",
|
|
89
|
+
status: "active",
|
|
90
|
+
spec_path: relPath,
|
|
91
|
+
source: "capability-spec",
|
|
92
|
+
runway_classification: "",
|
|
93
|
+
source_sdd_id: "",
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return rows;
|
|
97
|
+
}
|
|
98
|
+
async function readSpecH1Name(specAbs) {
|
|
99
|
+
try {
|
|
100
|
+
const s = await stat(specAbs);
|
|
101
|
+
if (!s.isFile())
|
|
102
|
+
return "";
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return "";
|
|
106
|
+
}
|
|
107
|
+
const text = await readFile(specAbs, "utf-8");
|
|
108
|
+
for (const line of text.split(/\r?\n/)) {
|
|
109
|
+
const t = line.trim();
|
|
110
|
+
if (t === "")
|
|
111
|
+
continue;
|
|
112
|
+
if (!t.startsWith("#"))
|
|
113
|
+
return "";
|
|
114
|
+
const stripped = t
|
|
115
|
+
.replace(/^#+\s*/, "")
|
|
116
|
+
.replace(/^(Capability Specification|Spec):\s*/i, "")
|
|
117
|
+
.trim();
|
|
118
|
+
return stripped;
|
|
119
|
+
}
|
|
120
|
+
return "";
|
|
121
|
+
}
|
|
122
|
+
async function collectCapabilitySpecs(sddPath) {
|
|
123
|
+
const out = [];
|
|
124
|
+
const domainsDir = join(sddPath, DOMAINS_DIR_REL);
|
|
125
|
+
let domains;
|
|
126
|
+
try {
|
|
127
|
+
domains = await readdir(domainsDir, { withFileTypes: true });
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
for (const d of domains) {
|
|
133
|
+
if (!d.isDirectory())
|
|
134
|
+
continue;
|
|
135
|
+
const productDir = join(domainsDir, d.name, "product");
|
|
136
|
+
let entries;
|
|
137
|
+
try {
|
|
138
|
+
entries = await readdir(productDir, { withFileTypes: true });
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
for (const e of entries) {
|
|
144
|
+
if (!e.isFile())
|
|
145
|
+
continue;
|
|
146
|
+
if (!e.name.endsWith(".md"))
|
|
147
|
+
continue;
|
|
148
|
+
const lower = e.name.toLowerCase();
|
|
149
|
+
if (lower === "readme.md" || lower === "index.md")
|
|
150
|
+
continue;
|
|
151
|
+
out.push(join(productDir, e.name));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
function inferDomainFromSpec(relPath) {
|
|
157
|
+
const parts = relPath.split(sep);
|
|
158
|
+
const i = parts.indexOf("domains");
|
|
159
|
+
if (i === -1 || i + 1 >= parts.length)
|
|
160
|
+
return "";
|
|
161
|
+
return parts[i + 1] ?? "";
|
|
162
|
+
}
|
|
163
|
+
function stemOf(relPath) {
|
|
164
|
+
const base = relPath.split(sep).slice(-1)[0] ?? "";
|
|
165
|
+
return base.replace(/\.md$/i, "").replace(/\.traceability\.yaml$/i, "");
|
|
166
|
+
}
|
|
167
|
+
function titleCase(slug) {
|
|
168
|
+
return slug
|
|
169
|
+
.split("-")
|
|
170
|
+
.map((p) => (p.length === 0 ? p : p[0].toUpperCase() + p.slice(1)))
|
|
171
|
+
.join(" ");
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CatalogueRow } from "../csv-writer.js";
|
|
2
|
+
import type { FindingsLog } from "../findings.js";
|
|
3
|
+
import type { TraceabilityManifest } from "../traceability-loader.js";
|
|
4
|
+
export interface CapabilityEdgeInputs {
|
|
5
|
+
readonly findings: FindingsLog;
|
|
6
|
+
readonly manifests: readonly TraceabilityManifest[];
|
|
7
|
+
readonly knownCapabilityIds: ReadonlySet<string>;
|
|
8
|
+
}
|
|
9
|
+
export interface CapabilityServiceInputs extends CapabilityEdgeInputs {
|
|
10
|
+
readonly knownServiceIds: ReadonlySet<string>;
|
|
11
|
+
}
|
|
12
|
+
export interface CapabilityAdrInputs extends CapabilityEdgeInputs {
|
|
13
|
+
readonly knownAdrIds: ReadonlySet<string>;
|
|
14
|
+
}
|
|
15
|
+
export interface CapabilityFeatureInputs extends CapabilityEdgeInputs {
|
|
16
|
+
/** Map of feature spec relative path → feature id, for resolving runway.enables entries. */
|
|
17
|
+
readonly featureIdByPath: ReadonlyMap<string, string>;
|
|
18
|
+
}
|
|
19
|
+
export interface CapabilityContractInputs extends CapabilityEdgeInputs {
|
|
20
|
+
/** Map of contract spec relative path → contract id. Also accepts paths matched by suffix and basename. */
|
|
21
|
+
readonly contractIdByPath: ReadonlyMap<string, string>;
|
|
22
|
+
}
|
|
23
|
+
export declare function buildCapabilityService(inputs: CapabilityServiceInputs): CatalogueRow[];
|
|
24
|
+
export declare function buildCapabilityAdr(inputs: CapabilityAdrInputs): CatalogueRow[];
|
|
25
|
+
export declare function buildCapabilityFeature(inputs: CapabilityFeatureInputs): CatalogueRow[];
|
|
26
|
+
export declare function buildCapabilityContract(inputs: CapabilityContractInputs): CatalogueRow[];
|
|
27
|
+
//# sourceMappingURL=capability-edges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-edges.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/capability-edges.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACpD,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC/D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE,4FAA4F;IAC5F,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,wBAAyB,SAAQ,oBAAoB;IACpE,2GAA2G;IAC3G,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxD;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,uBAAuB,GAC9B,YAAY,EAAE,CAsBhB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,mBAAmB,GAC1B,YAAY,EAAE,CAsBhB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,uBAAuB,GAC9B,YAAY,EAAE,CAoBhB;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,wBAAwB,GAC/B,YAAY,EAAE,CA2BhB"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// Edge builders for capability_* catalogues — capability_service,
|
|
2
|
+
// capability_adr, capability_feature, capability_contract.
|
|
3
|
+
//
|
|
4
|
+
// All four read traceability YAMLs as the authoritative source. The
|
|
5
|
+
// canonical schema declares capability_id and the target column as
|
|
6
|
+
// required, internal FKs — so each builder skips entries whose target
|
|
7
|
+
// doesn't resolve in the known-target set passed in.
|
|
8
|
+
//
|
|
9
|
+
// capability_event is intentionally not built here: its source per the
|
|
10
|
+
// metamodel is `## Related Events` markdown tables in capability specs,
|
|
11
|
+
// which depends on a spec-formatting convention that's only partial in
|
|
12
|
+
// the field. Defer to a later phase.
|
|
13
|
+
import { basename, sep } from "node:path";
|
|
14
|
+
export function buildCapabilityService(inputs) {
|
|
15
|
+
const rows = [];
|
|
16
|
+
const seen = new Set();
|
|
17
|
+
for (const m of inputs.manifests) {
|
|
18
|
+
const capId = m.capability.id;
|
|
19
|
+
if (!inputs.knownCapabilityIds.has(capId))
|
|
20
|
+
continue;
|
|
21
|
+
for (const entry of m.traceability.services ?? []) {
|
|
22
|
+
const sid = entry.id;
|
|
23
|
+
if (!inputs.knownServiceIds.has(sid))
|
|
24
|
+
continue;
|
|
25
|
+
const role = entry.role ?? "";
|
|
26
|
+
const id = `${capId}__${sid}__${role !== "" ? role : "related"}`;
|
|
27
|
+
if (seen.has(id))
|
|
28
|
+
continue;
|
|
29
|
+
seen.add(id);
|
|
30
|
+
rows.push({
|
|
31
|
+
id,
|
|
32
|
+
capability_id: capId,
|
|
33
|
+
service_id: sid,
|
|
34
|
+
role,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return rows;
|
|
39
|
+
}
|
|
40
|
+
export function buildCapabilityAdr(inputs) {
|
|
41
|
+
const rows = [];
|
|
42
|
+
const seen = new Set();
|
|
43
|
+
for (const m of inputs.manifests) {
|
|
44
|
+
const capId = m.capability.id;
|
|
45
|
+
if (!inputs.knownCapabilityIds.has(capId))
|
|
46
|
+
continue;
|
|
47
|
+
for (const entry of m.traceability.adrs ?? []) {
|
|
48
|
+
const adrId = canonicaliseAdrId(entry.id);
|
|
49
|
+
if (adrId === "")
|
|
50
|
+
continue;
|
|
51
|
+
if (!inputs.knownAdrIds.has(adrId))
|
|
52
|
+
continue;
|
|
53
|
+
const id = `${capId}__${adrId}`;
|
|
54
|
+
if (seen.has(id))
|
|
55
|
+
continue;
|
|
56
|
+
seen.add(id);
|
|
57
|
+
rows.push({
|
|
58
|
+
id,
|
|
59
|
+
capability_id: capId,
|
|
60
|
+
adr_id: adrId,
|
|
61
|
+
confidence: "spec",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return rows;
|
|
66
|
+
}
|
|
67
|
+
export function buildCapabilityFeature(inputs) {
|
|
68
|
+
const rows = [];
|
|
69
|
+
const seen = new Set();
|
|
70
|
+
for (const m of inputs.manifests) {
|
|
71
|
+
const capId = m.capability.id;
|
|
72
|
+
if (!inputs.knownCapabilityIds.has(capId))
|
|
73
|
+
continue;
|
|
74
|
+
for (const path of m.traceability.runway?.enables ?? []) {
|
|
75
|
+
const featureId = resolveFeaturePath(path, inputs.featureIdByPath);
|
|
76
|
+
if (featureId === "")
|
|
77
|
+
continue;
|
|
78
|
+
const id = `${capId}__${featureId}`;
|
|
79
|
+
if (seen.has(id))
|
|
80
|
+
continue;
|
|
81
|
+
seen.add(id);
|
|
82
|
+
rows.push({
|
|
83
|
+
id,
|
|
84
|
+
capability_id: capId,
|
|
85
|
+
feature_id: featureId,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return rows;
|
|
90
|
+
}
|
|
91
|
+
export function buildCapabilityContract(inputs) {
|
|
92
|
+
const rows = [];
|
|
93
|
+
const seen = new Set();
|
|
94
|
+
for (const m of inputs.manifests) {
|
|
95
|
+
const capId = m.capability.id;
|
|
96
|
+
if (!inputs.knownCapabilityIds.has(capId))
|
|
97
|
+
continue;
|
|
98
|
+
const block = m.traceability.contracts;
|
|
99
|
+
if (!block)
|
|
100
|
+
continue;
|
|
101
|
+
const all = [];
|
|
102
|
+
for (const list of [block.openapi, block.proto, block.avro]) {
|
|
103
|
+
if (Array.isArray(list))
|
|
104
|
+
all.push(...list);
|
|
105
|
+
}
|
|
106
|
+
for (const path of all) {
|
|
107
|
+
const contractId = resolveContractPath(path, inputs.contractIdByPath);
|
|
108
|
+
if (contractId === "")
|
|
109
|
+
continue;
|
|
110
|
+
const id = `${capId}__${contractId}`;
|
|
111
|
+
if (seen.has(id))
|
|
112
|
+
continue;
|
|
113
|
+
seen.add(id);
|
|
114
|
+
rows.push({
|
|
115
|
+
id,
|
|
116
|
+
capability_id: capId,
|
|
117
|
+
contract_id: contractId,
|
|
118
|
+
source: "declared",
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return rows;
|
|
123
|
+
}
|
|
124
|
+
// ─── helpers ────────────────────────────────────────────────────────────
|
|
125
|
+
/**
|
|
126
|
+
* Normalise an ADR ID from a traceability entry. Accepts bare numerics
|
|
127
|
+
* (`"0037"`, `"0058"`) and full forms (`"ADR-0037"`, `"ADR 0037"`); emits
|
|
128
|
+
* `ADR-XXXX` (4-digit zero-padded) which is the canonical adrs.id form.
|
|
129
|
+
*/
|
|
130
|
+
function canonicaliseAdrId(raw) {
|
|
131
|
+
const m = /^(?:ADR[-\s]+)?(\d+)/i.exec(raw);
|
|
132
|
+
if (!m || m[1] === undefined)
|
|
133
|
+
return "";
|
|
134
|
+
const num = parseInt(m[1], 10);
|
|
135
|
+
if (!Number.isFinite(num))
|
|
136
|
+
return "";
|
|
137
|
+
return `ADR-${String(num).padStart(4, "0")}`;
|
|
138
|
+
}
|
|
139
|
+
function resolveFeaturePath(path, index) {
|
|
140
|
+
const cleaned = path.replace(/^\/+/, "");
|
|
141
|
+
return index.get(cleaned) ?? "";
|
|
142
|
+
}
|
|
143
|
+
function resolveContractPath(path, index) {
|
|
144
|
+
const cleaned = path.replace(/^\/+/, "");
|
|
145
|
+
// Try exact path, then suffix matches.
|
|
146
|
+
const direct = index.get(cleaned);
|
|
147
|
+
if (direct !== undefined)
|
|
148
|
+
return direct;
|
|
149
|
+
// Suffix: last two parts (e.g. "asset/asset-twin.yaml")
|
|
150
|
+
const parts = cleaned.split(sep);
|
|
151
|
+
if (parts.length >= 2) {
|
|
152
|
+
const suffix = parts.slice(-2).join("/");
|
|
153
|
+
for (const [k, v] of index) {
|
|
154
|
+
if (k.endsWith(suffix))
|
|
155
|
+
return v;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Basename fallback
|
|
159
|
+
const base = basename(cleaned);
|
|
160
|
+
for (const [k, v] of index) {
|
|
161
|
+
if (basename(k) === base)
|
|
162
|
+
return v;
|
|
163
|
+
}
|
|
164
|
+
return "";
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=capability-edges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-edges.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/capability-edges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CatalogueRow } from "../csv-writer.js";
|
|
2
|
+
import type { FindingsLog } from "../findings.js";
|
|
3
|
+
export interface ContractsBuildInputs {
|
|
4
|
+
readonly sddPath: string;
|
|
5
|
+
readonly findings: FindingsLog;
|
|
6
|
+
/** repository ids known to this build, for source_repo_id resolution. */
|
|
7
|
+
readonly knownRepositoryIds: ReadonlySet<string>;
|
|
8
|
+
}
|
|
9
|
+
export interface ContractsBuildResult {
|
|
10
|
+
readonly rows: CatalogueRow[];
|
|
11
|
+
/** Map of contract spec relative path → contract id, for capability_contract resolution. */
|
|
12
|
+
readonly idByPath: ReadonlyMap<string, string>;
|
|
13
|
+
}
|
|
14
|
+
export declare function buildContracts(inputs: ContractsBuildInputs): Promise<ContractsBuildResult>;
|
|
15
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/contracts.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAgBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAyD/B"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Contracts discoverer — emits `contracts.csv` rows from
|
|
2
|
+
// `contracts/{openapi,proto,avro}/<domain>/<name>.<ext>`.
|
|
3
|
+
//
|
|
4
|
+
// Per the canonical schema (catalogue-schema.yaml):
|
|
5
|
+
// - kind enum: rest | graphql | rpc | event
|
|
6
|
+
// - openapi/*.yaml → rest
|
|
7
|
+
// - proto/*.proto → rpc
|
|
8
|
+
// - avro/*.avsc → event
|
|
9
|
+
// - service_id and source_repo_id are nullable; per ADR 0110 the real
|
|
10
|
+
// contract sources may live in sibling contracts-* repos. The
|
|
11
|
+
// canonical builder leaves these empty by default; an OpenAPI
|
|
12
|
+
// `x-source-repo` extension is honoured as a hint when present
|
|
13
|
+
// (resolved against the known repository set).
|
|
14
|
+
// - For OpenAPI files only, `info.title` becomes `description`,
|
|
15
|
+
// `info.version` becomes `version`. Other formats keep these empty.
|
|
16
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
17
|
+
import { extname, join, relative, sep } from "node:path";
|
|
18
|
+
import { parse as parseYaml } from "yaml";
|
|
19
|
+
const CONTRACTS_DIR_REL = "contracts";
|
|
20
|
+
const KIND_SPECS = [
|
|
21
|
+
{ subdir: "openapi", extensions: [".yaml", ".yml"], kind: "rest" },
|
|
22
|
+
{ subdir: "proto", extensions: [".proto"], kind: "rpc" },
|
|
23
|
+
{ subdir: "avro", extensions: [".avsc"], kind: "event" },
|
|
24
|
+
];
|
|
25
|
+
export async function buildContracts(inputs) {
|
|
26
|
+
const rows = [];
|
|
27
|
+
const idByPath = new Map();
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
for (const spec of KIND_SPECS) {
|
|
30
|
+
const dir = join(inputs.sddPath, CONTRACTS_DIR_REL, spec.subdir);
|
|
31
|
+
const files = await collectFiles(dir, spec.extensions);
|
|
32
|
+
for (const path of files.sort()) {
|
|
33
|
+
const filename = basenameOf(path);
|
|
34
|
+
// Skip schema/config files at any depth.
|
|
35
|
+
if (filename === "schema.yaml" || filename === "schema.yml")
|
|
36
|
+
continue;
|
|
37
|
+
const rel = relative(inputs.sddPath, path);
|
|
38
|
+
const stem = stemOf(filename);
|
|
39
|
+
const domain = domainSegment(rel);
|
|
40
|
+
const slug = domain !== ""
|
|
41
|
+
? slugify(`${domain}-${stem}`)
|
|
42
|
+
: slugify(stem);
|
|
43
|
+
if (seen.has(slug)) {
|
|
44
|
+
inputs.findings.add("divergence", `${rel}: contract id "${slug}" already emitted by an earlier file`);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
seen.add(slug);
|
|
48
|
+
let description = "";
|
|
49
|
+
let version = "";
|
|
50
|
+
let sourceRepoId = "";
|
|
51
|
+
if (spec.kind === "rest") {
|
|
52
|
+
const meta = await tryReadOpenapiInfo(path);
|
|
53
|
+
description = meta.description;
|
|
54
|
+
version = meta.version;
|
|
55
|
+
if (meta.xSourceRepo !== "" && inputs.knownRepositoryIds.has(meta.xSourceRepo)) {
|
|
56
|
+
sourceRepoId = meta.xSourceRepo;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
rows.push({
|
|
60
|
+
id: slug,
|
|
61
|
+
name: stem,
|
|
62
|
+
service_id: "",
|
|
63
|
+
source_repo_id: sourceRepoId,
|
|
64
|
+
kind: spec.kind,
|
|
65
|
+
version,
|
|
66
|
+
status: "active",
|
|
67
|
+
spec_path: rel,
|
|
68
|
+
visibility: "internal",
|
|
69
|
+
description,
|
|
70
|
+
source_sdd_id: "",
|
|
71
|
+
});
|
|
72
|
+
idByPath.set(rel, slug);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { rows, idByPath };
|
|
76
|
+
}
|
|
77
|
+
async function tryReadOpenapiInfo(path) {
|
|
78
|
+
try {
|
|
79
|
+
const text = await readFile(path, "utf-8");
|
|
80
|
+
const raw = parseYaml(text);
|
|
81
|
+
if (!raw || typeof raw !== "object") {
|
|
82
|
+
return { description: "", version: "", xSourceRepo: "" };
|
|
83
|
+
}
|
|
84
|
+
const info = raw["info"];
|
|
85
|
+
const xSourceRepo = String(raw["x-source-repo"] ?? "").trim();
|
|
86
|
+
const versionRaw = info?.["version"];
|
|
87
|
+
const descRaw = info?.["description"];
|
|
88
|
+
const description = typeof descRaw === "string"
|
|
89
|
+
? firstSentence(descRaw)
|
|
90
|
+
: "";
|
|
91
|
+
const version = typeof versionRaw === "string"
|
|
92
|
+
? versionRaw
|
|
93
|
+
: versionRaw !== undefined
|
|
94
|
+
? String(versionRaw)
|
|
95
|
+
: "";
|
|
96
|
+
return { description, version, xSourceRepo };
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Not all *.yaml files in contracts/openapi/ are full specs (some are
|
|
100
|
+
// shared component fragments). Failing to parse is not an error here.
|
|
101
|
+
return { description: "", version: "", xSourceRepo: "" };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function firstSentence(s) {
|
|
105
|
+
// Take up to the first paragraph break, capped at 500 chars.
|
|
106
|
+
const para = s.split(/\r?\n\r?\n/)[0] ?? "";
|
|
107
|
+
return para.replace(/\s+/g, " ").trim().slice(0, 500);
|
|
108
|
+
}
|
|
109
|
+
async function collectFiles(dir, extensions) {
|
|
110
|
+
const out = [];
|
|
111
|
+
let entries;
|
|
112
|
+
try {
|
|
113
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
const code = err.code;
|
|
117
|
+
if (code === "ENOENT")
|
|
118
|
+
return [];
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
const full = join(dir, entry.name);
|
|
123
|
+
if (entry.isDirectory()) {
|
|
124
|
+
out.push(...(await collectFiles(full, extensions)));
|
|
125
|
+
}
|
|
126
|
+
else if (entry.isFile() && extensions.includes(extname(entry.name).toLowerCase())) {
|
|
127
|
+
out.push(full);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
function basenameOf(absPath) {
|
|
133
|
+
return absPath.split(sep).slice(-1)[0] ?? "";
|
|
134
|
+
}
|
|
135
|
+
function stemOf(filename) {
|
|
136
|
+
return filename.replace(/\.[^.]+$/, "");
|
|
137
|
+
}
|
|
138
|
+
function domainSegment(relPath) {
|
|
139
|
+
// Layout: contracts/<subdir>/<domain>/<file>.<ext>
|
|
140
|
+
// → parts = ["contracts", subdir, domain, file]
|
|
141
|
+
const parts = relPath.split(sep);
|
|
142
|
+
if (parts.length < 4)
|
|
143
|
+
return "";
|
|
144
|
+
return parts[2] ?? "";
|
|
145
|
+
}
|
|
146
|
+
function slugify(s) {
|
|
147
|
+
return s
|
|
148
|
+
.toLowerCase()
|
|
149
|
+
.replace(/^_+/, "") // turn _common into common
|
|
150
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
151
|
+
.replace(/^-+|-+$/g, "");
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CatalogueRow } from "../csv-writer.js";
|
|
2
|
+
import type { FindingsLog } from "../findings.js";
|
|
3
|
+
import type { SddManifest } from "../manifest-loader.js";
|
|
4
|
+
export interface DomainsBuildInputs {
|
|
5
|
+
readonly sddPath: string;
|
|
6
|
+
readonly manifest: SddManifest;
|
|
7
|
+
readonly findings: FindingsLog;
|
|
8
|
+
}
|
|
9
|
+
export declare function buildDomains(inputs: DomainsBuildInputs): Promise<CatalogueRow[]>;
|
|
10
|
+
//# sourceMappingURL=domains.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/domains.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAID,wBAAsB,YAAY,CAChC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,EAAE,CAAC,CAwCzB"}
|