@sdd-method/sdd-cli 0.31.0 → 0.33.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/lib/catalogue/aggregate.d.ts.map +1 -1
- package/dist/lib/catalogue/aggregate.js +124 -0
- package/dist/lib/catalogue/aggregate.js.map +1 -1
- package/dist/lib/catalogue/build.d.ts +4 -0
- package/dist/lib/catalogue/build.d.ts.map +1 -1
- package/dist/lib/catalogue/build.js +65 -4
- 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 +47 -2
- package/dist/lib/catalogue/builders/capabilities.js.map +1 -1
- package/dist/lib/catalogue/builders/feature-grounding.d.ts +8 -0
- package/dist/lib/catalogue/builders/feature-grounding.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/feature-grounding.js +8 -3
- package/dist/lib/catalogue/builders/feature-grounding.js.map +1 -1
- package/dist/lib/catalogue/builders/features.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/features.js +6 -4
- package/dist/lib/catalogue/builders/features.js.map +1 -1
- package/dist/lib/catalogue/builders/glossary.d.ts +17 -0
- package/dist/lib/catalogue/builders/glossary.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/glossary.js +54 -0
- package/dist/lib/catalogue/builders/glossary.js.map +1 -1
- package/dist/lib/catalogue/builders/index.d.ts +1 -1
- package/dist/lib/catalogue/builders/index.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/index.js +1 -1
- package/dist/lib/catalogue/builders/index.js.map +1 -1
- package/dist/lib/catalogue/builders/repositories.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/repositories.js +56 -6
- package/dist/lib/catalogue/builders/repositories.js.map +1 -1
- package/dist/lib/catalogue/builders/services.d.ts +9 -1
- package/dist/lib/catalogue/builders/services.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/services.js +62 -7
- package/dist/lib/catalogue/builders/services.js.map +1 -1
- package/dist/lib/catalogue/dedupe-keyed-tables.d.ts +52 -0
- package/dist/lib/catalogue/dedupe-keyed-tables.d.ts.map +1 -0
- package/dist/lib/catalogue/dedupe-keyed-tables.js +0 -0
- package/dist/lib/catalogue/dedupe-keyed-tables.js.map +1 -0
- package/dist/lib/catalogue/service-architecture-parser.d.ts +20 -0
- package/dist/lib/catalogue/service-architecture-parser.d.ts.map +1 -0
- package/dist/lib/catalogue/service-architecture-parser.js +193 -0
- package/dist/lib/catalogue/service-architecture-parser.js.map +1 -0
- package/dist/lib/catalogue/traceability-loader.d.ts +13 -1
- package/dist/lib/catalogue/traceability-loader.d.ts.map +1 -1
- package/dist/lib/catalogue/traceability-loader.js +16 -2
- package/dist/lib/catalogue/traceability-loader.js.map +1 -1
- package/package.json +2 -2
|
@@ -7,11 +7,41 @@
|
|
|
7
7
|
// `emits_service_row: true`.
|
|
8
8
|
//
|
|
9
9
|
// This is a derived catalogue: services are 1:1 with their primary
|
|
10
|
-
// repository for the
|
|
10
|
+
// repository for the contextual adoption pattern. Adopters whose
|
|
11
11
|
// services span multiple repos may extend this builder later.
|
|
12
|
+
//
|
|
13
|
+
// Per-service metadata (runtime_type, language, status, confidence,
|
|
14
|
+
// description) is read — faithfully, not inferred — from each service's
|
|
15
|
+
// `repos/<id>/docs/service-architecture.md` via the shared
|
|
16
|
+
// service-architecture-parser module.
|
|
17
|
+
//
|
|
18
|
+
// The `description` column has two authoring sources, honoured per the
|
|
19
|
+
// forward/reverse parity principle (ADR 0157, extended to node columns by
|
|
20
|
+
// ADR 0163):
|
|
21
|
+
// - forward: `orchestration/repo-config/<repo>.yaml` `description:` —
|
|
22
|
+
// the deliberate spec, authored by forward-method adopters.
|
|
23
|
+
// - reverse: the arch doc's `## Purpose` lead paragraph.
|
|
24
|
+
// When both are present for the same service the forward repo-config
|
|
25
|
+
// description wins (matching the ADR 0156 / 0162 merge convention) and a
|
|
26
|
+
// `divergence` finding records the conflict. In practice an adopter has
|
|
27
|
+
// only one of the two, so this is usually a plain coalesce.
|
|
28
|
+
//
|
|
29
|
+
// The four reverse-only columns (runtime_type, language, status,
|
|
30
|
+
// confidence) have no forward authoring source; forward-method adopters
|
|
31
|
+
// legitimately leave them empty (they declare service_type + dependencies
|
|
32
|
+
// instead). See catalogue-metamodel.md §Service.
|
|
12
33
|
import { runtimeServiceTypes, } from "../schema-loader.js";
|
|
13
|
-
|
|
34
|
+
import { EMPTY_METADATA, indexServiceArchitectures, readServiceMetadata, } from "../service-architecture-parser.js";
|
|
35
|
+
export async function buildServices(inputs) {
|
|
14
36
|
const runtime = runtimeServiceTypes(inputs.schema);
|
|
37
|
+
// Index every service-architecture.md under repos/ by its repo slug (the
|
|
38
|
+
// directory above docs/). The layout is either repos/<repo>/docs/... or
|
|
39
|
+
// repos/<group>/<repo>/docs/..., so a recursive walk is required.
|
|
40
|
+
// Services whose architecture doc lives in a federated member SDD (rather
|
|
41
|
+
// than this SDD's own repos/) resolve to no entry here — their metadata is
|
|
42
|
+
// an aggregation-time concern (ADR 0163 P2), not a local build gap.
|
|
43
|
+
const archIndex = await indexServiceArchitectures(inputs.sddPath);
|
|
44
|
+
const repoDescriptions = inputs.repoDescriptions ?? new Map();
|
|
15
45
|
const rows = [];
|
|
16
46
|
for (const repo of inputs.repositories) {
|
|
17
47
|
const componentType = String(repo["component_type"] ?? "");
|
|
@@ -20,21 +50,46 @@ export function buildServices(inputs) {
|
|
|
20
50
|
const repoId = String(repo["id"] ?? "");
|
|
21
51
|
if (repoId === "")
|
|
22
52
|
continue;
|
|
53
|
+
const archPath = archIndex.get(repoId);
|
|
54
|
+
const meta = archPath
|
|
55
|
+
? await readServiceMetadata(archPath)
|
|
56
|
+
: EMPTY_METADATA;
|
|
23
57
|
rows.push({
|
|
24
58
|
id: repoId,
|
|
25
59
|
name: repoId,
|
|
26
60
|
product_id: inputs.productId,
|
|
27
61
|
domain_id: String(repo["domain_id"] ?? ""),
|
|
28
62
|
primary_repo_id: repoId,
|
|
29
|
-
runtime_type:
|
|
30
|
-
language:
|
|
63
|
+
runtime_type: meta.runtime_type,
|
|
64
|
+
language: meta.language,
|
|
31
65
|
component_type: componentType,
|
|
32
|
-
status:
|
|
33
|
-
confidence:
|
|
34
|
-
description: "",
|
|
66
|
+
status: meta.status,
|
|
67
|
+
confidence: meta.confidence,
|
|
68
|
+
description: coalesceDescription(repoId, repoDescriptions.get(repoId) ?? "", meta.description, inputs.findings),
|
|
35
69
|
source_sdd_id: "",
|
|
36
70
|
});
|
|
37
71
|
}
|
|
38
72
|
return rows;
|
|
39
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Coalesce the forward (repo-config) and reverse (## Purpose) description
|
|
76
|
+
* sources. Forward wins when both are present; a `divergence` finding
|
|
77
|
+
* records the conflict so authors can reconcile. Whitespace-only values
|
|
78
|
+
* are treated as empty. Single-quotes/newlines normalised away for the
|
|
79
|
+
* comparison so cosmetic reformatting doesn't trip the finding.
|
|
80
|
+
*/
|
|
81
|
+
function coalesceDescription(serviceId, forward, reverse, findings) {
|
|
82
|
+
const f = forward.trim();
|
|
83
|
+
const r = reverse.trim();
|
|
84
|
+
if (f === "")
|
|
85
|
+
return r;
|
|
86
|
+
if (r !== "" && normalise(f) !== normalise(r)) {
|
|
87
|
+
findings.add("divergence", `services: "${serviceId}" description differs between repo-config (forward) ` +
|
|
88
|
+
`and service-architecture.md ## Purpose (reverse) — repo-config kept`);
|
|
89
|
+
}
|
|
90
|
+
return f;
|
|
91
|
+
}
|
|
92
|
+
function normalise(s) {
|
|
93
|
+
return s.replace(/\s+/g, " ").trim().toLowerCase();
|
|
94
|
+
}
|
|
40
95
|
//# sourceMappingURL=services.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/services.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,wDAAwD;AACxD,EAAE;AACF,oDAAoD;AACpD,mEAAmE;AACnE,oDAAoD;AACpD,6BAA6B;AAC7B,EAAE;AACF,mEAAmE;AACnE,gEAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metamodel-driven primary-key normalisation for the per-SDD build.
|
|
3
|
+
*
|
|
4
|
+
* Every catalogue declares a `primary_key` in the canonical schema. The build
|
|
5
|
+
* collects each catalogue's rows from one or more per-source walkers and
|
|
6
|
+
* concatenates them (see `build.ts` `collectRows`). For most catalogues each
|
|
7
|
+
* walker emits PK-unique rows or dedupes internally, but **edge tables fed by
|
|
8
|
+
* more than one source** (`feature_service`, `feature_repo` — from the
|
|
9
|
+
* feature-grounding *and* capability-spec walkers) can legitimately have the
|
|
10
|
+
* same fact asserted by both sources. Each walker's own `seen…` guard only
|
|
11
|
+
* dedupes intra-walker, so the concatenated result carried duplicate PKs into
|
|
12
|
+
* `catalogues/*.csv`, which `catalogue aggregate` then correctly rejected.
|
|
13
|
+
*
|
|
14
|
+
* This pass makes keyed-table emission **set-correct over the declared PK** for
|
|
15
|
+
* every catalogue, by construction:
|
|
16
|
+
* - identical rows for the same PK → keep one (silent union — the same fact
|
|
17
|
+
* asserted by ≥2 sources is not an error);
|
|
18
|
+
* - same PK with a **differing** payload → a hard conflict the caller fails
|
|
19
|
+
* the build on, with provenance, so this class of defect surfaces at
|
|
20
|
+
* `build` (where the offending SDD is unambiguous) instead of only at
|
|
21
|
+
* `aggregate`.
|
|
22
|
+
*
|
|
23
|
+
* Background: `sdd-method-gov/coordination/feature-edge-cross-source-duplicate-coordination.md`.
|
|
24
|
+
* Sibling precedents (the unconditional-emit fixes whose per-walker dedup this
|
|
25
|
+
* generalises across sources): `feature-grounding-collision-edges-coordination.md`
|
|
26
|
+
* (0.30.2) and `capability-spec-collision-edges-coordination.md` (0.30.3).
|
|
27
|
+
*/
|
|
28
|
+
import type { CanonicalSchema } from "./schema-loader.js";
|
|
29
|
+
import type { CatalogueRow } from "./csv-writer.js";
|
|
30
|
+
import { FindingsLog } from "./findings.js";
|
|
31
|
+
/** A same-PK/different-payload collision the caller must fail the build on. */
|
|
32
|
+
export interface PkConflict {
|
|
33
|
+
readonly catalogue: string;
|
|
34
|
+
readonly primaryKey: string;
|
|
35
|
+
readonly value: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DedupeResult {
|
|
38
|
+
/** Same-PK/different-payload collisions — non-empty ⇒ build must fail. */
|
|
39
|
+
readonly conflicts: readonly PkConflict[];
|
|
40
|
+
/** Count of exact-duplicate rows folded away across all catalogues. */
|
|
41
|
+
readonly unionedRows: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Normalise every keyed catalogue in `rowsByCatalogue` to PK-unique rows.
|
|
45
|
+
* Mutates the map in place (replacing only catalogues that actually had
|
|
46
|
+
* exact-duplicate PKs) and returns the conflicts + union count.
|
|
47
|
+
*
|
|
48
|
+
* First-seen row wins for ordering; the CSV writer re-sorts by PK anyway, so
|
|
49
|
+
* order here is immaterial beyond determinism.
|
|
50
|
+
*/
|
|
51
|
+
export declare function dedupeKeyedTables(schema: CanonicalSchema, rowsByCatalogue: Map<string, readonly CatalogueRow[]>, findings: FindingsLog): DedupeResult;
|
|
52
|
+
//# sourceMappingURL=dedupe-keyed-tables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe-keyed-tables.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/dedupe-keyed-tables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,SAAS,UAAU,EAAE,CAAC;IAC1C,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAoBD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,EACvB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,EACrD,QAAQ,EAAE,WAAW,GACpB,YAAY,CAmDd"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe-keyed-tables.js","sourceRoot":"","sources":["../../../src/lib/catalogue/dedupe-keyed-tables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ServiceMetadata {
|
|
2
|
+
readonly runtime_type: string;
|
|
3
|
+
readonly language: string;
|
|
4
|
+
readonly status: string;
|
|
5
|
+
readonly confidence: string;
|
|
6
|
+
readonly description: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const EMPTY_METADATA: ServiceMetadata;
|
|
9
|
+
/**
|
|
10
|
+
* Walk `<sddPath>/repos/` and index every service-architecture.md by its
|
|
11
|
+
* repo slug — the directory name immediately above `docs/`. Handles both
|
|
12
|
+
* the flat (`repos/<repo>/docs/`) and grouped (`repos/<group>/<repo>/docs/`)
|
|
13
|
+
* layouts. First match wins (deterministic via readdir + walk order).
|
|
14
|
+
*/
|
|
15
|
+
export declare function indexServiceArchitectures(sddPath: string): Promise<Map<string, string>>;
|
|
16
|
+
/** Read and parse a service-architecture.md from disk. */
|
|
17
|
+
export declare function readServiceMetadata(archPath: string): Promise<ServiceMetadata>;
|
|
18
|
+
/** Parse the three metadata blocks out of service-architecture.md text. */
|
|
19
|
+
export declare function parseServiceArchitecture(text: string): ServiceMetadata;
|
|
20
|
+
//# sourceMappingURL=service-architecture-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-architecture-parser.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/service-architecture-parser.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,EAAE,eAM5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6B9B;AAED,0DAA0D;AAC1D,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAS1B;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAatE"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// Shared parser for per-service `repos/<id>/docs/service-architecture.md`.
|
|
2
|
+
//
|
|
3
|
+
// Extracted from builders/services.ts so two callers can share it:
|
|
4
|
+
// - the per-SDD services builder (buildServices), and
|
|
5
|
+
// - the aggregator's federated reverse-metadata enrichment pass
|
|
6
|
+
// (ADR 0163 P2), which reaches member SDDs' arch docs that the
|
|
7
|
+
// platform-root's own build never sees.
|
|
8
|
+
//
|
|
9
|
+
// The metadata is read faithfully — not inferred — from three blocks:
|
|
10
|
+
// - `## Runtime / Build Shape` table `Primary runtime` → runtime_type
|
|
11
|
+
// (+ a derived language token).
|
|
12
|
+
// - `## Operational Status` table `Classification` → status,
|
|
13
|
+
// `Confidence` → confidence (emitted out-of-band by an adopter's
|
|
14
|
+
// derive-operational-evidence script).
|
|
15
|
+
// - `## Purpose` lead paragraph → description.
|
|
16
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
const REPOS_DIR_REL = "repos";
|
|
19
|
+
const SERVICE_ARCHITECTURE_REL = join("docs", "service-architecture.md");
|
|
20
|
+
export const EMPTY_METADATA = {
|
|
21
|
+
runtime_type: "",
|
|
22
|
+
language: "",
|
|
23
|
+
status: "",
|
|
24
|
+
confidence: "",
|
|
25
|
+
description: "",
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Walk `<sddPath>/repos/` and index every service-architecture.md by its
|
|
29
|
+
* repo slug — the directory name immediately above `docs/`. Handles both
|
|
30
|
+
* the flat (`repos/<repo>/docs/`) and grouped (`repos/<group>/<repo>/docs/`)
|
|
31
|
+
* layouts. First match wins (deterministic via readdir + walk order).
|
|
32
|
+
*/
|
|
33
|
+
export async function indexServiceArchitectures(sddPath) {
|
|
34
|
+
const index = new Map();
|
|
35
|
+
const reposDir = join(sddPath, REPOS_DIR_REL);
|
|
36
|
+
async function walk(dir) {
|
|
37
|
+
let entries;
|
|
38
|
+
try {
|
|
39
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
if (!entry.isDirectory())
|
|
46
|
+
continue;
|
|
47
|
+
const child = join(dir, entry.name);
|
|
48
|
+
const archPath = join(child, SERVICE_ARCHITECTURE_REL);
|
|
49
|
+
try {
|
|
50
|
+
const docs = await readdir(join(child, "docs"));
|
|
51
|
+
if (docs.includes("service-architecture.md")) {
|
|
52
|
+
if (!index.has(entry.name))
|
|
53
|
+
index.set(entry.name, archPath);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// no docs/ here — keep descending for the grouped layout.
|
|
58
|
+
}
|
|
59
|
+
await walk(child);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
await walk(reposDir);
|
|
63
|
+
return index;
|
|
64
|
+
}
|
|
65
|
+
/** Read and parse a service-architecture.md from disk. */
|
|
66
|
+
export async function readServiceMetadata(archPath) {
|
|
67
|
+
let text;
|
|
68
|
+
try {
|
|
69
|
+
text = await readFile(archPath, "utf-8");
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (err.code === "ENOENT")
|
|
73
|
+
return EMPTY_METADATA;
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
return parseServiceArchitecture(text);
|
|
77
|
+
}
|
|
78
|
+
/** Parse the three metadata blocks out of service-architecture.md text. */
|
|
79
|
+
export function parseServiceArchitecture(text) {
|
|
80
|
+
const buildShape = parseKeyValueTable(text, /^##\s+Runtime\s*\/\s*Build Shape\b/i);
|
|
81
|
+
const opsStatus = parseKeyValueTable(text, /^##\s+Operational Status\b/i);
|
|
82
|
+
const primaryRuntime = buildShape.get("primary runtime") ?? "";
|
|
83
|
+
return {
|
|
84
|
+
runtime_type: primaryRuntime,
|
|
85
|
+
language: deriveLanguage(primaryRuntime),
|
|
86
|
+
// Strip markdown bold from the classification cell (e.g. **library**).
|
|
87
|
+
status: stripEmphasis(opsStatus.get("classification") ?? ""),
|
|
88
|
+
confidence: stripEmphasis(opsStatus.get("confidence") ?? ""),
|
|
89
|
+
description: parseLeadParagraph(text, /^##\s+Purpose\b/i),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parse a two-column markdown table (`| key | value |`) that follows the
|
|
94
|
+
* first heading matching `headingRe`, returning a lowercased-key → value
|
|
95
|
+
* map. Header and separator rows are skipped. Stops at the next heading or
|
|
96
|
+
* the end of the table block.
|
|
97
|
+
*/
|
|
98
|
+
function parseKeyValueTable(text, headingRe) {
|
|
99
|
+
const out = new Map();
|
|
100
|
+
const lines = text.split(/\r?\n/);
|
|
101
|
+
let inSection = false;
|
|
102
|
+
let seenTable = false;
|
|
103
|
+
for (const line of lines) {
|
|
104
|
+
const t = line.trim();
|
|
105
|
+
if (!inSection) {
|
|
106
|
+
if (headingRe.test(t))
|
|
107
|
+
inSection = true;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (t.startsWith("#"))
|
|
111
|
+
break; // next heading ends the section
|
|
112
|
+
const isRow = t.startsWith("|") && t.endsWith("|");
|
|
113
|
+
if (!isRow) {
|
|
114
|
+
if (seenTable)
|
|
115
|
+
break; // table block ended
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
seenTable = true;
|
|
119
|
+
const cells = t
|
|
120
|
+
.slice(1, -1)
|
|
121
|
+
.split("|")
|
|
122
|
+
.map((c) => c.trim());
|
|
123
|
+
if (cells.length < 2)
|
|
124
|
+
continue;
|
|
125
|
+
const key = cells[0].toLowerCase();
|
|
126
|
+
// Skip header row ("aspect"/"field") and separator row (---).
|
|
127
|
+
if (key === "" || /^:?-+:?$/.test(key) || key === "aspect" || key === "field") {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
out.set(key, cells[1]);
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* First non-empty paragraph block after the heading matching `headingRe`,
|
|
136
|
+
* lines joined with single spaces. "" when the heading is absent.
|
|
137
|
+
*/
|
|
138
|
+
function parseLeadParagraph(text, headingRe) {
|
|
139
|
+
const lines = text.split(/\r?\n/);
|
|
140
|
+
let inSection = false;
|
|
141
|
+
const paragraph = [];
|
|
142
|
+
for (const line of lines) {
|
|
143
|
+
const t = line.trim();
|
|
144
|
+
if (!inSection) {
|
|
145
|
+
if (headingRe.test(t))
|
|
146
|
+
inSection = true;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (t.startsWith("#"))
|
|
150
|
+
break;
|
|
151
|
+
if (t === "") {
|
|
152
|
+
if (paragraph.length > 0)
|
|
153
|
+
break;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
paragraph.push(t);
|
|
157
|
+
}
|
|
158
|
+
return paragraph.join(" ");
|
|
159
|
+
}
|
|
160
|
+
function stripEmphasis(s) {
|
|
161
|
+
return s.replace(/\*\*/g, "").replace(/^_+|_+$/g, "").trim();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Derive a language token from a "Primary runtime" value such as
|
|
165
|
+
* "Java 8", "Node.js 18 / AWS Lambda", "Terraform ~> 1.3",
|
|
166
|
+
* "Vue 3 / TypeScript". Returns "" when nothing recognisable matches.
|
|
167
|
+
*/
|
|
168
|
+
function deriveLanguage(primaryRuntime) {
|
|
169
|
+
const s = primaryRuntime.toLowerCase();
|
|
170
|
+
if (s === "")
|
|
171
|
+
return "";
|
|
172
|
+
// Order matters: more specific signals first.
|
|
173
|
+
if (/\btypescript\b/.test(s))
|
|
174
|
+
return "TypeScript";
|
|
175
|
+
if (/\bvue\b/.test(s))
|
|
176
|
+
return "TypeScript";
|
|
177
|
+
if (/\bnode(\.js)?\b/.test(s))
|
|
178
|
+
return "JavaScript";
|
|
179
|
+
if (/\bjava\b/.test(s))
|
|
180
|
+
return "Java";
|
|
181
|
+
if (/\bkotlin\b/.test(s))
|
|
182
|
+
return "Kotlin";
|
|
183
|
+
if (/\bterraform\b/.test(s))
|
|
184
|
+
return "HCL";
|
|
185
|
+
if (/\bpython\b|\bsynapse\b/.test(s))
|
|
186
|
+
return "Python";
|
|
187
|
+
if (/\bgo(lang)?\b/.test(s))
|
|
188
|
+
return "Go";
|
|
189
|
+
if (/\.net\b|\bc#\b|\bdotnet\b/.test(s))
|
|
190
|
+
return "C#";
|
|
191
|
+
return "";
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=service-architecture-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-architecture-parser.js","sourceRoot":"","sources":["../../../src/lib/catalogue/service-architecture-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
import type { FindingsLog } from "./findings.js";
|
|
2
|
+
/**
|
|
3
|
+
* Normalise an authored `feature_directory` value (string, list of strings,
|
|
4
|
+
* or absent) to a clean `string[]`. Non-string entries and empties are
|
|
5
|
+
* dropped. Lets a capability declare one or several feature dirs.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeFeatureDirs(value: unknown): string[];
|
|
2
8
|
export interface TraceabilityCapabilityBlock {
|
|
3
9
|
readonly id: string;
|
|
4
10
|
readonly domain: string;
|
|
5
11
|
readonly capability_spec?: string;
|
|
6
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Directory (or directories) holding this capability's feature specs.
|
|
14
|
+
* Authored in YAML as either a single string or a list of strings; the
|
|
15
|
+
* loader normalises both to a `string[]`. A capability legitimately owns
|
|
16
|
+
* more than one feature dir (e.g. app-registry → advanced/ + developer-portal/).
|
|
17
|
+
*/
|
|
18
|
+
readonly feature_directory?: readonly string[];
|
|
7
19
|
readonly status?: string;
|
|
8
20
|
/**
|
|
9
21
|
* Keying-axis marker for foundational-tier / synthesis-tier capabilities
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"traceability-loader.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/traceability-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,20 @@ import { readdir, readFile, stat } from "node:fs/promises";
|
|
|
13
13
|
import { join, relative, sep } from "node:path";
|
|
14
14
|
import { parse as parseYaml } from "yaml";
|
|
15
15
|
const DOMAINS_DIR_REL = join("docs", "domains");
|
|
16
|
+
/**
|
|
17
|
+
* Normalise an authored `feature_directory` value (string, list of strings,
|
|
18
|
+
* or absent) to a clean `string[]`. Non-string entries and empties are
|
|
19
|
+
* dropped. Lets a capability declare one or several feature dirs.
|
|
20
|
+
*/
|
|
21
|
+
export function normalizeFeatureDirs(value) {
|
|
22
|
+
if (typeof value === "string") {
|
|
23
|
+
return value.trim() === "" ? [] : [value];
|
|
24
|
+
}
|
|
25
|
+
if (Array.isArray(value)) {
|
|
26
|
+
return value.filter((v) => typeof v === "string" && v.trim() !== "");
|
|
27
|
+
}
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
16
30
|
export async function loadTraceabilityManifests(opts) {
|
|
17
31
|
const root = join(opts.sddPath, DOMAINS_DIR_REL);
|
|
18
32
|
let yamlPaths;
|
|
@@ -61,8 +75,8 @@ export async function loadTraceabilityManifests(opts) {
|
|
|
61
75
|
...(typeof cap["capability_spec"] === "string"
|
|
62
76
|
? { capability_spec: cap["capability_spec"] }
|
|
63
77
|
: {}),
|
|
64
|
-
...(
|
|
65
|
-
? { feature_directory: cap["feature_directory"] }
|
|
78
|
+
...(normalizeFeatureDirs(cap["feature_directory"]).length > 0
|
|
79
|
+
? { feature_directory: normalizeFeatureDirs(cap["feature_directory"]) }
|
|
66
80
|
: {}),
|
|
67
81
|
...(typeof cap["status"] === "string" ? { status: cap["status"] } : {}),
|
|
68
82
|
...(typeof cap["data_subset"] === "string"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traceability-loader.js","sourceRoot":"","sources":["../../../src/lib/catalogue/traceability-loader.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,mCAAmC;AACnC,EAAE;AACF,wEAAwE;AACxE,qEAAqE;AACrE,+DAA+D;AAC/D,uEAAuE;AACvE,kEAAkE;AAClE,EAAE;AACF,uFAAuF;AACvF,8DAA8D;AAE9D,OAAO,EAAE,OAAO,EAAE,QAAQ,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;AAG1C,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"traceability-loader.js","sourceRoot":"","sources":["../../../src/lib/catalogue/traceability-loader.ts"],"names":[],"mappings":"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"}
|