@sdd-method/sdd-cli 0.9.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/init/index.d.ts.map +1 -1
- package/dist/lib/init/index.js +6 -0
- package/dist/lib/init/index.js.map +1 -1
- package/dist/lib/mcp/build-info.d.ts +1 -1
- package/dist/lib/mcp/build-info.d.ts.map +1 -1
- package/dist/lib/mcp/build-info.js +1 -1
- package/dist/lib/mcp/build-info.js.map +1 -1
- package/dist/lib/repo-kind.d.ts +3 -3
- package/dist/lib/repo-kind.d.ts.map +1 -1
- package/dist/lib/repo-kind.js +4 -0
- package/dist/lib/repo-kind.js.map +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
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,wBAAsB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command, CommanderError } from "commander";
|
|
2
|
+
import { registerCatalogue } from "./verbs/catalogue.js";
|
|
2
3
|
import { registerGenerateClaudeMd } from "./verbs/generate-claude-md.js";
|
|
3
4
|
import { registerInit } from "./verbs/init.js";
|
|
4
5
|
import { registerList } from "./verbs/list.js";
|
|
@@ -28,7 +29,7 @@ function buildProgram() {
|
|
|
28
29
|
program
|
|
29
30
|
.name("sdd-cli")
|
|
30
31
|
.description("Method-layer CLI for SDD repository lifecycle — init, sync, validate, list, plan, generate-claude-md.")
|
|
31
|
-
.version("0.
|
|
32
|
+
.version("0.11.0", "-v, --version")
|
|
32
33
|
.addHelpText("after", `\nSpec: ${SPEC_URL}`)
|
|
33
34
|
.exitOverride()
|
|
34
35
|
.configureOutput({
|
|
@@ -42,6 +43,7 @@ function buildProgram() {
|
|
|
42
43
|
registerPlan(program);
|
|
43
44
|
registerGenerateClaudeMd(program);
|
|
44
45
|
registerMcp(program);
|
|
46
|
+
registerCatalogue(program);
|
|
45
47
|
for (const { verb, summary } of NOT_YET_IMPLEMENTED) {
|
|
46
48
|
registerNotYetImplemented(program, verb, summary);
|
|
47
49
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,QAAQ,GACZ,8FAA8F,CAAC;AAEjG,MAAM,mBAAmB,GAAqD,EAAE,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAuB;IAC/C,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,uBAAuB,CAAC,GAAG,CAAC;YAAE,OAAO;QACzC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CACV,uGAAuG,CACxG;SACA,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type CatalogueDef } from "./schema-loader.js";
|
|
2
|
+
import { parseCatalogueCsv } from "./csv-reader.js";
|
|
3
|
+
import { type CatalogueRow } from "./csv-writer.js";
|
|
4
|
+
export interface AggregateInputs {
|
|
5
|
+
/** Path to the ecosystem-root SDD repo (defaults to cwd). */
|
|
6
|
+
readonly sddPath?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Path to the aggregation manifest. Resolution order:
|
|
9
|
+
* 1. explicit option
|
|
10
|
+
* 2. ecosystem-root manifest's `aggregation_manifest_path`
|
|
11
|
+
* 3. orchestration/aggregation-manifest.yaml
|
|
12
|
+
*/
|
|
13
|
+
readonly manifestPath?: string;
|
|
14
|
+
/** Output directory. Defaults to <sddPath>/catalogues-aggregated. */
|
|
15
|
+
readonly outDir?: string;
|
|
16
|
+
/** Treat any finding as a failure (non-zero exit). */
|
|
17
|
+
readonly strict?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface AggregateResult {
|
|
20
|
+
readonly exitCode: number;
|
|
21
|
+
readonly schemaVersion: string;
|
|
22
|
+
readonly ecosystemRoot: string;
|
|
23
|
+
readonly siblingCount: number;
|
|
24
|
+
readonly rowCounts: ReadonlyMap<string, number>;
|
|
25
|
+
/** Pre-merge per-sibling counts — for the JSON manifest output. */
|
|
26
|
+
readonly perSiblingCounts: ReadonlyMap<string, ReadonlyMap<string, number>>;
|
|
27
|
+
readonly aggregatedFkPass: boolean;
|
|
28
|
+
readonly findingsCount: number;
|
|
29
|
+
readonly outDir: string;
|
|
30
|
+
}
|
|
31
|
+
export type Writer = (s: string) => void;
|
|
32
|
+
export declare function runCatalogueAggregate(inputs: AggregateInputs, write: Writer): Promise<AggregateResult>;
|
|
33
|
+
declare function stampSourceSddId(catalogue: CatalogueDef, rows: readonly Record<string, string>[], sourceSddId: string): CatalogueRow[];
|
|
34
|
+
export declare const __test_only__: {
|
|
35
|
+
stampSourceSddId: typeof stampSourceSddId;
|
|
36
|
+
parseCatalogueCsv: typeof parseCatalogueCsv;
|
|
37
|
+
};
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=aggregate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/aggregate.ts"],"names":[],"mappings":"AA8BA,OAAO,EAA6C,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAoB,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpE,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,mEAAmE;IACnE,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5E,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzC,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAoK1B;AAiFD,iBAAS,gBAAgB,CACvB,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EACvC,WAAW,EAAE,MAAM,GAClB,YAAY,EAAE,CAUhB;AA6KD,eAAO,MAAM,aAAa;;;CAA0C,CAAC"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
// Catalogue aggregator — `sdd-cli catalogue aggregate`.
|
|
2
|
+
//
|
|
3
|
+
// Implements the 8-step contract in
|
|
4
|
+
// docs/method/methods/catalogue-builder-specification.md
|
|
5
|
+
// §"Aggregator contract":
|
|
6
|
+
//
|
|
7
|
+
// 1. Discover sibling SDDs via aggregation-manifest.yaml.
|
|
8
|
+
// 2. Pull each sibling's catalogues/ (filesystem only in v1).
|
|
9
|
+
// 3. Verify schema-version alignment across SDDs.
|
|
10
|
+
// 4. Concatenate per-catalogue rows.
|
|
11
|
+
// 5. Stamp source_sdd_id on every node-catalogue row.
|
|
12
|
+
// 6. Fail on duplicate primary keys.
|
|
13
|
+
// 7. Run full FK validation including external references.
|
|
14
|
+
// 8. Emit catalogues/ + aggregation-manifest.json.
|
|
15
|
+
//
|
|
16
|
+
// The ecosystem-root SDD itself contributes its own catalogues to the
|
|
17
|
+
// aggregation alongside the siblings — it doesn't list itself in the
|
|
18
|
+
// manifest. That's how single-SDD ecosystems and federated ecosystems
|
|
19
|
+
// share the same code path: with zero siblings the aggregator just
|
|
20
|
+
// re-emits the ecosystem-root's catalogues stamped with source_sdd_id.
|
|
21
|
+
import { readFile, stat, writeFile } from "node:fs/promises";
|
|
22
|
+
import { join, relative, resolve } from "node:path";
|
|
23
|
+
import { CLI_VERSION } from "./cli-version.js";
|
|
24
|
+
import { loadAggregationManifest, DEFAULT_AGGREGATION_MANIFEST_REL, } from "./aggregation-manifest-loader.js";
|
|
25
|
+
import { loadSddManifest } from "./manifest-loader.js";
|
|
26
|
+
import { loadCanonicalSchema } from "./schema-loader.js";
|
|
27
|
+
import { readCatalogueCsv, parseCatalogueCsv } from "./csv-reader.js";
|
|
28
|
+
import { writeCatalogue } from "./csv-writer.js";
|
|
29
|
+
import { validateForeignKeys } from "./fk-validator.js";
|
|
30
|
+
import { FindingsLog } from "./findings.js";
|
|
31
|
+
export async function runCatalogueAggregate(inputs, write) {
|
|
32
|
+
const sddPath = resolve(inputs.sddPath ?? process.cwd());
|
|
33
|
+
const findings = new FindingsLog();
|
|
34
|
+
// 0. Load canonical schema.
|
|
35
|
+
const schema = await loadCanonicalSchema();
|
|
36
|
+
write(`sdd-cli catalogue aggregate (canonical schema ${schema.schemaVersion})\n`);
|
|
37
|
+
// 0a. Load ecosystem-root manifest.
|
|
38
|
+
const rootManifest = await loadSddManifest(sddPath, {
|
|
39
|
+
cliVersion: CLI_VERSION,
|
|
40
|
+
});
|
|
41
|
+
write(` ecosystem-root: ${rootManifest.sddId} profile: ${rootManifest.profile}\n`);
|
|
42
|
+
// 1. Resolve aggregation-manifest path + load.
|
|
43
|
+
const manifestPath = resolve(inputs.manifestPath ??
|
|
44
|
+
rootManifest.aggregationManifestPath ??
|
|
45
|
+
join(sddPath, DEFAULT_AGGREGATION_MANIFEST_REL));
|
|
46
|
+
const aggManifest = await loadAggregationManifest(manifestPath, {
|
|
47
|
+
cliVersion: CLI_VERSION,
|
|
48
|
+
ecosystemRootPath: sddPath,
|
|
49
|
+
});
|
|
50
|
+
if (aggManifest.ecosystemRoot !== rootManifest.sddId) {
|
|
51
|
+
throw new Error(`aggregation manifest ecosystem_root="${aggManifest.ecosystemRoot}"\n` +
|
|
52
|
+
` does not match ecosystem-root SDD's sdd_id="${rootManifest.sddId}"\n` +
|
|
53
|
+
` (manifest: ${manifestPath})`);
|
|
54
|
+
}
|
|
55
|
+
write(` aggregation manifest: ${relative(sddPath, manifestPath)}\n`);
|
|
56
|
+
write(` siblings: ${aggManifest.siblings.length}\n`);
|
|
57
|
+
// 2. Pull (filesystem only in v1) — pre-checked at manifest load. Now
|
|
58
|
+
// cross-check each sibling's own .sdd/sdd-manifest.yaml + its
|
|
59
|
+
// vendored schema vs the aggregator's.
|
|
60
|
+
await crossCheckSiblings(sddPath, aggManifest.siblings, schema, write);
|
|
61
|
+
// 3. Schema-version alignment was checked in crossCheckSiblings.
|
|
62
|
+
// 4 + 5. Concatenate per-catalogue rows from the ecosystem-root + every
|
|
63
|
+
// sibling, stamping source_sdd_id on node catalogues as we go.
|
|
64
|
+
const rowsByCatalogue = new Map();
|
|
65
|
+
const perSiblingCounts = new Map();
|
|
66
|
+
for (const cat of schema.catalogues) {
|
|
67
|
+
rowsByCatalogue.set(cat.name, []);
|
|
68
|
+
}
|
|
69
|
+
perSiblingCounts.set(rootManifest.sddId, await mergeCatalogues(schema, rowsByCatalogue, join(sddPath, "catalogues"), rootManifest.sddId));
|
|
70
|
+
for (const sib of aggManifest.siblings) {
|
|
71
|
+
perSiblingCounts.set(sib.sddId, await mergeCatalogues(schema, rowsByCatalogue, sib.cataloguesPath, sib.sddId));
|
|
72
|
+
}
|
|
73
|
+
// 6. Duplicate primary key check.
|
|
74
|
+
const duplicates = findDuplicatePrimaryKeys(schema, rowsByCatalogue);
|
|
75
|
+
if (duplicates.length > 0) {
|
|
76
|
+
write(`\nDuplicate primary keys (${duplicates.length}) — aggregation fails:\n`);
|
|
77
|
+
for (const d of duplicates) {
|
|
78
|
+
write(` ${d.catalogue}.${d.primaryKey}="${d.value}" contributed by [${d.sources.join(", ")}]\n`);
|
|
79
|
+
}
|
|
80
|
+
return finalise({
|
|
81
|
+
schema,
|
|
82
|
+
ecosystemRoot: rootManifest.sddId,
|
|
83
|
+
aggManifest,
|
|
84
|
+
rowsByCatalogue,
|
|
85
|
+
perSiblingCounts,
|
|
86
|
+
aggregatedFkPass: false,
|
|
87
|
+
findings,
|
|
88
|
+
outDir: resolveOutDir(sddPath, inputs.outDir),
|
|
89
|
+
manifestPath,
|
|
90
|
+
writeOutputs: false,
|
|
91
|
+
duplicateCount: duplicates.length,
|
|
92
|
+
write,
|
|
93
|
+
strict: inputs.strict === true,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// 7. Full FK validation, treating external as internal.
|
|
97
|
+
const fk = validateForeignKeys(schema, rowsByCatalogue, findings, {
|
|
98
|
+
treatExternalAsInternal: true,
|
|
99
|
+
});
|
|
100
|
+
// 8. Emit aggregated catalogues + aggregation-manifest.json.
|
|
101
|
+
const outDir = resolveOutDir(sddPath, inputs.outDir);
|
|
102
|
+
const rowCounts = new Map();
|
|
103
|
+
for (const cat of schema.catalogues) {
|
|
104
|
+
const rows = rowsByCatalogue.get(cat.name) ?? [];
|
|
105
|
+
const result = await writeCatalogue({ outDir, catalogue: cat, rows });
|
|
106
|
+
rowCounts.set(cat.name, result.rowCount);
|
|
107
|
+
}
|
|
108
|
+
await writeAggregationManifestJson({
|
|
109
|
+
outDir,
|
|
110
|
+
schemaVersion: schema.schemaVersion,
|
|
111
|
+
ecosystemRoot: rootManifest.sddId,
|
|
112
|
+
siblings: aggManifest.siblings,
|
|
113
|
+
perSiblingCounts,
|
|
114
|
+
aggregatedRowCounts: rowCounts,
|
|
115
|
+
cliVersion: CLI_VERSION,
|
|
116
|
+
});
|
|
117
|
+
// Report.
|
|
118
|
+
write("\nAggregated row counts:\n");
|
|
119
|
+
for (const [name, count] of rowCounts) {
|
|
120
|
+
if (count > 0)
|
|
121
|
+
write(` ${name}: ${count}\n`);
|
|
122
|
+
}
|
|
123
|
+
const emptyCount = [...rowCounts.values()].filter((c) => c === 0).length;
|
|
124
|
+
write(` (${emptyCount} headers-only)\n`);
|
|
125
|
+
const findingsText = findings.render();
|
|
126
|
+
if (findingsText)
|
|
127
|
+
write(`\n${findingsText}\n`);
|
|
128
|
+
if (fk.internalPass) {
|
|
129
|
+
write(`\nAggregated FK validation: PASS\n`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
write(`\nAggregated FK validation: FAIL (${fk.internalFailures.length} dangling)\n`);
|
|
133
|
+
for (const f of fk.internalFailures) {
|
|
134
|
+
const sourceSdd = findSourceSdd(rowsByCatalogue, f.catalogue, f.referencingRow);
|
|
135
|
+
write(` ${f.catalogue}.${f.column}: row pk=${f.referencingRow} → ${f.target}=${f.value || "<empty>"}` +
|
|
136
|
+
(sourceSdd ? ` (from ${sourceSdd})\n` : "\n"));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const strictFail = inputs.strict === true && findings.count() > 0;
|
|
140
|
+
const exitCode = !fk.internalPass || strictFail ? 1 : 0;
|
|
141
|
+
return {
|
|
142
|
+
exitCode,
|
|
143
|
+
schemaVersion: schema.schemaVersion,
|
|
144
|
+
ecosystemRoot: rootManifest.sddId,
|
|
145
|
+
siblingCount: aggManifest.siblings.length,
|
|
146
|
+
rowCounts,
|
|
147
|
+
perSiblingCounts,
|
|
148
|
+
aggregatedFkPass: fk.internalPass,
|
|
149
|
+
findingsCount: findings.count(),
|
|
150
|
+
outDir,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function findDuplicatePrimaryKeys(schema, rowsByCatalogue) {
|
|
154
|
+
const out = [];
|
|
155
|
+
for (const cat of schema.catalogues) {
|
|
156
|
+
const rows = rowsByCatalogue.get(cat.name) ?? [];
|
|
157
|
+
const byKey = new Map();
|
|
158
|
+
for (const row of rows) {
|
|
159
|
+
const pk = row[cat.primaryKey];
|
|
160
|
+
if (pk === undefined || pk === null || pk === "")
|
|
161
|
+
continue;
|
|
162
|
+
const value = String(pk);
|
|
163
|
+
const sourceSdd = String(row["source_sdd_id"] ?? "");
|
|
164
|
+
const list = byKey.get(value) ?? [];
|
|
165
|
+
list.push(sourceSdd || "<unknown>");
|
|
166
|
+
byKey.set(value, list);
|
|
167
|
+
}
|
|
168
|
+
for (const [value, sources] of byKey) {
|
|
169
|
+
if (sources.length > 1) {
|
|
170
|
+
out.push({
|
|
171
|
+
catalogue: cat.name,
|
|
172
|
+
primaryKey: cat.primaryKey,
|
|
173
|
+
value,
|
|
174
|
+
sources,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
async function mergeCatalogues(schema, rowsByCatalogue, cataloguesDir, sourceSddId) {
|
|
182
|
+
const counts = new Map();
|
|
183
|
+
let dirExists = true;
|
|
184
|
+
try {
|
|
185
|
+
const s = await stat(cataloguesDir);
|
|
186
|
+
if (!s.isDirectory())
|
|
187
|
+
dirExists = false;
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
if (err.code === "ENOENT")
|
|
191
|
+
dirExists = false;
|
|
192
|
+
else
|
|
193
|
+
throw err;
|
|
194
|
+
}
|
|
195
|
+
if (!dirExists) {
|
|
196
|
+
throw new Error(`catalogues/ directory not found at ${cataloguesDir}\n` +
|
|
197
|
+
` Run \`sdd-cli catalogue build\` in that SDD before aggregating.`);
|
|
198
|
+
}
|
|
199
|
+
for (const cat of schema.catalogues) {
|
|
200
|
+
const filePath = join(cataloguesDir, `${cat.name}.csv`);
|
|
201
|
+
let parsed;
|
|
202
|
+
try {
|
|
203
|
+
parsed = await readCatalogueCsv(filePath);
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
if (err.code === "ENOENT") {
|
|
207
|
+
counts.set(cat.name, 0);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
throw err;
|
|
211
|
+
}
|
|
212
|
+
const stamped = stampSourceSddId(cat, parsed.rows, sourceSddId);
|
|
213
|
+
rowsByCatalogue.get(cat.name).push(...stamped);
|
|
214
|
+
counts.set(cat.name, stamped.length);
|
|
215
|
+
}
|
|
216
|
+
return counts;
|
|
217
|
+
}
|
|
218
|
+
function stampSourceSddId(catalogue, rows, sourceSddId) {
|
|
219
|
+
const hasColumn = catalogue.columns.some((c) => c.name === "source_sdd_id");
|
|
220
|
+
if (!hasColumn)
|
|
221
|
+
return rows.map((r) => ({ ...r }));
|
|
222
|
+
return rows.map((r) => {
|
|
223
|
+
if (r["source_sdd_id"] && r["source_sdd_id"].trim() !== "") {
|
|
224
|
+
// Already stamped — preserve (chained aggregation).
|
|
225
|
+
return { ...r };
|
|
226
|
+
}
|
|
227
|
+
return { ...r, source_sdd_id: sourceSddId };
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
async function crossCheckSiblings(ecosystemRootPath, siblings, aggregatorSchema, write) {
|
|
231
|
+
const findings = new FindingsLog();
|
|
232
|
+
for (const sib of siblings) {
|
|
233
|
+
// Cross-check sibling's .sdd/sdd-manifest.yaml.
|
|
234
|
+
let sibManifest;
|
|
235
|
+
try {
|
|
236
|
+
sibManifest = await loadSddManifest(sib.sddRoot, {
|
|
237
|
+
cliVersion: CLI_VERSION,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
throw new Error(`aggregator: sibling "${sib.sddId}" at ${relative(ecosystemRootPath, sib.sddRoot)}\n` +
|
|
242
|
+
` failed to load .sdd/sdd-manifest.yaml: ${err.message}`);
|
|
243
|
+
}
|
|
244
|
+
if (sibManifest.sddId !== sib.sddId) {
|
|
245
|
+
throw new Error(`aggregator: sibling "${sib.sddId}" in aggregation manifest\n` +
|
|
246
|
+
` but its own .sdd/sdd-manifest.yaml declares sdd_id="${sibManifest.sddId}"\n` +
|
|
247
|
+
` (rule: sibling_id_matches_sibling_manifest)`);
|
|
248
|
+
}
|
|
249
|
+
// Cross-check sibling's vendored catalogue-schema.yaml against aggregator's.
|
|
250
|
+
const sibSchemaPath = await findVendoredSchema(sib.sddRoot);
|
|
251
|
+
if (sibSchemaPath !== "") {
|
|
252
|
+
const text = await readFile(sibSchemaPath, "utf-8");
|
|
253
|
+
const m = /^schema_version:\s*"?([0-9.]+)"?/m.exec(text);
|
|
254
|
+
const sibVersion = m?.[1] ?? "";
|
|
255
|
+
if (sibVersion !== aggregatorSchema.schemaVersion) {
|
|
256
|
+
throw new Error(`aggregator: sibling "${sib.sddId}" vendored catalogue-schema.yaml\n` +
|
|
257
|
+
` is at ${sibVersion}, aggregator at ${aggregatorSchema.schemaVersion}\n` +
|
|
258
|
+
` Run \`sdd-cli catalogue build\` in the sibling against a matching\n` +
|
|
259
|
+
` schema before aggregating (rule: schema_version_alignment).`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
write(` ✓ ${sib.sddId} (${sibManifest.profile})\n`);
|
|
263
|
+
}
|
|
264
|
+
return { findings };
|
|
265
|
+
}
|
|
266
|
+
async function findVendoredSchema(sddRoot) {
|
|
267
|
+
// Adopters typically vendor canonical schema indirectly via sdd-cli.
|
|
268
|
+
// Some SDDs pin a copy at docs/method/methods/catalogue-schema.yaml.
|
|
269
|
+
for (const candidate of [
|
|
270
|
+
"docs/method/methods/catalogue-schema.yaml",
|
|
271
|
+
]) {
|
|
272
|
+
const path = join(sddRoot, candidate);
|
|
273
|
+
try {
|
|
274
|
+
const s = await stat(path);
|
|
275
|
+
if (s.isFile())
|
|
276
|
+
return path;
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// not present — try next
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return "";
|
|
283
|
+
}
|
|
284
|
+
function resolveOutDir(sddPath, override) {
|
|
285
|
+
if (override !== undefined)
|
|
286
|
+
return resolve(override);
|
|
287
|
+
return join(sddPath, "catalogues-aggregated");
|
|
288
|
+
}
|
|
289
|
+
function findSourceSdd(rowsByCatalogue, catalogue, pkValue) {
|
|
290
|
+
const rows = rowsByCatalogue.get(catalogue) ?? [];
|
|
291
|
+
for (const row of rows) {
|
|
292
|
+
if (String(row["id"] ?? "") === pkValue) {
|
|
293
|
+
const src = String(row["source_sdd_id"] ?? "");
|
|
294
|
+
return src;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return "";
|
|
298
|
+
}
|
|
299
|
+
async function writeAggregationManifestJson(inputs) {
|
|
300
|
+
const out = {
|
|
301
|
+
schema_version: inputs.schemaVersion,
|
|
302
|
+
cli_version: inputs.cliVersion,
|
|
303
|
+
ecosystem_root: inputs.ecosystemRoot,
|
|
304
|
+
siblings: inputs.siblings.map((s) => ({
|
|
305
|
+
sdd_id: s.sddId,
|
|
306
|
+
description: s.description,
|
|
307
|
+
catalogues_path: s.cataloguesPath,
|
|
308
|
+
pre_merge_row_counts: counts(inputs.perSiblingCounts.get(s.sddId)),
|
|
309
|
+
})),
|
|
310
|
+
ecosystem_root_pre_merge_row_counts: counts(inputs.perSiblingCounts.get(inputs.ecosystemRoot)),
|
|
311
|
+
aggregated_row_counts: counts(inputs.aggregatedRowCounts),
|
|
312
|
+
};
|
|
313
|
+
await writeFile(join(inputs.outDir, "aggregation-manifest.json"), JSON.stringify(out, null, 2) + "\n", "utf-8");
|
|
314
|
+
}
|
|
315
|
+
function counts(map) {
|
|
316
|
+
const out = {};
|
|
317
|
+
if (!map)
|
|
318
|
+
return out;
|
|
319
|
+
for (const [k, v] of [...map.entries()].sort(([a], [b]) => a.localeCompare(b))) {
|
|
320
|
+
out[k] = v;
|
|
321
|
+
}
|
|
322
|
+
return out;
|
|
323
|
+
}
|
|
324
|
+
async function finalise(inputs) {
|
|
325
|
+
const rowCounts = new Map();
|
|
326
|
+
for (const cat of inputs.schema.catalogues) {
|
|
327
|
+
rowCounts.set(cat.name, (inputs.rowsByCatalogue.get(cat.name) ?? []).length);
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
exitCode: 1,
|
|
331
|
+
schemaVersion: inputs.schema.schemaVersion,
|
|
332
|
+
ecosystemRoot: inputs.ecosystemRoot,
|
|
333
|
+
siblingCount: inputs.aggManifest.siblings.length,
|
|
334
|
+
rowCounts,
|
|
335
|
+
perSiblingCounts: inputs.perSiblingCounts,
|
|
336
|
+
aggregatedFkPass: inputs.aggregatedFkPass,
|
|
337
|
+
findingsCount: inputs.findings.count(),
|
|
338
|
+
outDir: inputs.outDir,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
// Used by tests that want to round-trip CSV through the aggregator's
|
|
342
|
+
// stamping logic without writing files.
|
|
343
|
+
export const __test_only__ = { stampSourceSddId, parseCatalogueCsv };
|
|
344
|
+
//# sourceMappingURL=aggregate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/lib/catalogue/aggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const DEFAULT_AGGREGATION_MANIFEST_REL = "orchestration/aggregation-manifest.yaml";
|
|
2
|
+
export interface ResolvedSibling {
|
|
3
|
+
readonly sddId: string;
|
|
4
|
+
readonly description: string;
|
|
5
|
+
/** Absolute path to the sibling's `catalogues/` directory. */
|
|
6
|
+
readonly cataloguesPath: string;
|
|
7
|
+
/** Absolute path to the sibling SDD's repo root (parent of catalogues/). */
|
|
8
|
+
readonly sddRoot: string;
|
|
9
|
+
}
|
|
10
|
+
export interface LoadedAggregationManifest {
|
|
11
|
+
readonly schemaVersion: string;
|
|
12
|
+
readonly ecosystemRoot: string;
|
|
13
|
+
readonly siblings: readonly ResolvedSibling[];
|
|
14
|
+
readonly sourcePath: string;
|
|
15
|
+
}
|
|
16
|
+
export interface LoadAggregationManifestOptions {
|
|
17
|
+
readonly cliVersion: string;
|
|
18
|
+
/**
|
|
19
|
+
* Absolute path to the ecosystem-root SDD repo (used to resolve
|
|
20
|
+
* relative `pull.path` values).
|
|
21
|
+
*/
|
|
22
|
+
readonly ecosystemRootPath: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function loadAggregationManifest(manifestPath: string, options: LoadAggregationManifestOptions): Promise<LoadedAggregationManifest>;
|
|
25
|
+
//# sourceMappingURL=aggregation-manifest-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregation-manifest-loader.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/aggregation-manifest-loader.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,gCAAgC,4CACF,CAAC;AAuB5C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,yBAAyB,CAAC,CAgGpC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// Aggregation-manifest loader per
|
|
2
|
+
// docs/method/methods/aggregation-manifest-schema.yaml.
|
|
3
|
+
//
|
|
4
|
+
// v1 supports `pull.kind: filesystem` only; other kinds (git-ref,
|
|
5
|
+
// release-asset, mcp-resource) are schema-reserved and reject with a
|
|
6
|
+
// clear "deferred" error so adopters get unambiguous feedback.
|
|
7
|
+
import { readFile } from "node:fs/promises";
|
|
8
|
+
import { isAbsolute, resolve } from "node:path";
|
|
9
|
+
import { parse as parseYaml } from "yaml";
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { SCHEMA_COMPAT, formatSchemaVersionMismatch } from "./schema-compat.js";
|
|
12
|
+
import { isInRange } from "./manifest-loader.js";
|
|
13
|
+
export const DEFAULT_AGGREGATION_MANIFEST_REL = "orchestration/aggregation-manifest.yaml";
|
|
14
|
+
const PullSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
kind: z.string(),
|
|
17
|
+
path: z.string().optional(),
|
|
18
|
+
})
|
|
19
|
+
.passthrough();
|
|
20
|
+
const SiblingSchema = z.object({
|
|
21
|
+
sdd_id: z.string().regex(/^[a-z][a-z0-9-]*$/, {
|
|
22
|
+
message: "sdd_id must match /^[a-z][a-z0-9-]*$/",
|
|
23
|
+
}),
|
|
24
|
+
pull: PullSchema,
|
|
25
|
+
description: z.string().optional(),
|
|
26
|
+
});
|
|
27
|
+
const AggregationManifestSchema = z.object({
|
|
28
|
+
schema_version: z.string(),
|
|
29
|
+
ecosystem_root: z.string().regex(/^[a-z][a-z0-9-]*$/),
|
|
30
|
+
siblings: z.array(SiblingSchema),
|
|
31
|
+
});
|
|
32
|
+
export async function loadAggregationManifest(manifestPath, options) {
|
|
33
|
+
let text;
|
|
34
|
+
try {
|
|
35
|
+
text = await readFile(manifestPath, "utf-8");
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (err.code === "ENOENT") {
|
|
39
|
+
throw new Error(`Aggregation manifest not found at ${manifestPath}\n\n` +
|
|
40
|
+
`Ecosystem-root SDDs declare an aggregation manifest at the path\n` +
|
|
41
|
+
`recorded in .sdd/sdd-manifest.yaml#aggregation_manifest_path, or\n` +
|
|
42
|
+
`at ${DEFAULT_AGGREGATION_MANIFEST_REL} by default.\n` +
|
|
43
|
+
`Schema: docs/method/methods/aggregation-manifest-schema.yaml.`);
|
|
44
|
+
}
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
let raw;
|
|
48
|
+
try {
|
|
49
|
+
raw = parseYaml(text);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
throw new Error(`failed to parse YAML at ${manifestPath}: ${err.message}`);
|
|
53
|
+
}
|
|
54
|
+
const parsed = AggregationManifestSchema.safeParse(raw);
|
|
55
|
+
if (!parsed.success) {
|
|
56
|
+
const issues = parsed.error.issues
|
|
57
|
+
.map((i) => ` - ${i.path.join(".") || "<root>"}: ${i.message}`)
|
|
58
|
+
.join("\n");
|
|
59
|
+
throw new Error(`invalid aggregation manifest at ${manifestPath}:\n${issues}`);
|
|
60
|
+
}
|
|
61
|
+
if (!isInRange(parsed.data.schema_version, SCHEMA_COMPAT.aggregation_manifest)) {
|
|
62
|
+
throw new Error(formatSchemaVersionMismatch({
|
|
63
|
+
schema: "aggregation_manifest",
|
|
64
|
+
readVersion: parsed.data.schema_version,
|
|
65
|
+
cliVersion: options.cliVersion,
|
|
66
|
+
sourcePath: manifestPath,
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
// Duplicate sibling-id check.
|
|
70
|
+
const seen = new Set();
|
|
71
|
+
for (const s of parsed.data.siblings) {
|
|
72
|
+
if (seen.has(s.sdd_id)) {
|
|
73
|
+
throw new Error(`aggregation manifest has duplicate sibling sdd_id "${s.sdd_id}"\n` +
|
|
74
|
+
` (${manifestPath})`);
|
|
75
|
+
}
|
|
76
|
+
seen.add(s.sdd_id);
|
|
77
|
+
}
|
|
78
|
+
// Resolve each sibling's pull. v1 supports `kind: filesystem` only.
|
|
79
|
+
const resolved = [];
|
|
80
|
+
for (const s of parsed.data.siblings) {
|
|
81
|
+
const kind = s.pull.kind;
|
|
82
|
+
if (kind !== "filesystem") {
|
|
83
|
+
throw new Error(`aggregation manifest: sibling "${s.sdd_id}" uses pull.kind="${kind}"\n` +
|
|
84
|
+
` v1 supports filesystem only. Other kinds (git-ref, release-asset,\n` +
|
|
85
|
+
` mcp-resource) are schema-reserved and not yet implemented.\n` +
|
|
86
|
+
` See: docs/method/methods/aggregation-manifest-schema.yaml#pull_kinds`);
|
|
87
|
+
}
|
|
88
|
+
const path = s.pull.path;
|
|
89
|
+
if (!path || typeof path !== "string") {
|
|
90
|
+
throw new Error(`aggregation manifest: sibling "${s.sdd_id}" pull.kind=filesystem requires \`path\``);
|
|
91
|
+
}
|
|
92
|
+
const cataloguesPath = isAbsolute(path)
|
|
93
|
+
? path
|
|
94
|
+
: resolve(options.ecosystemRootPath, path);
|
|
95
|
+
// The sibling's repo root is the parent of `catalogues/`.
|
|
96
|
+
const sddRoot = resolve(cataloguesPath, "..");
|
|
97
|
+
resolved.push({
|
|
98
|
+
sddId: s.sdd_id,
|
|
99
|
+
description: s.description ?? "",
|
|
100
|
+
cataloguesPath,
|
|
101
|
+
sddRoot,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
schemaVersion: parsed.data.schema_version,
|
|
106
|
+
ecosystemRoot: parsed.data.ecosystem_root,
|
|
107
|
+
siblings: resolved,
|
|
108
|
+
sourcePath: manifestPath,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=aggregation-manifest-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregation-manifest-loader.js","sourceRoot":"","sources":["../../../src/lib/catalogue/aggregation-manifest-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-SDD catalogue builder — `sdd-cli catalogue build` orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* Per ADR 0134 §4.6, the canonical builder reads method-defined declarative
|
|
5
|
+
* inputs and emits `catalogues/*.csv` matching the canonical schema.
|
|
6
|
+
*
|
|
7
|
+
* This is Phase 1 of the canonical-builder implementation per
|
|
8
|
+
* adopt-canonical-catalogue-builder.md Step F. Phase 1 ships:
|
|
9
|
+
* - manifest loading + schema-version compat check,
|
|
10
|
+
* - schema loading,
|
|
11
|
+
* - headers-only emission for every catalogue declared in the schema,
|
|
12
|
+
* - internal FK validation,
|
|
13
|
+
* - findings + row-count reporting.
|
|
14
|
+
*
|
|
15
|
+
* Per-source discoverers (domains, repos, services, capabilities, features,
|
|
16
|
+
* etc.) land in subsequent phases. Until then the builder produces a valid
|
|
17
|
+
* but empty `catalogues/` directory — useful as a smoke test that the
|
|
18
|
+
* infrastructure works end-to-end on any SDD repo.
|
|
19
|
+
*/
|
|
20
|
+
export interface BuildInputs {
|
|
21
|
+
/** SDD repo root (defaults to cwd). */
|
|
22
|
+
readonly sddPath?: string;
|
|
23
|
+
/** Output directory for catalogues/ (defaults to <sddPath>/catalogues). */
|
|
24
|
+
readonly outDir?: string;
|
|
25
|
+
/** Strict mode — non-zero exit on any finding. Default: only internal FK FAIL exits non-zero. */
|
|
26
|
+
readonly strict?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface BuildResult {
|
|
29
|
+
readonly exitCode: number;
|
|
30
|
+
readonly schemaVersion: string;
|
|
31
|
+
readonly sddId: string;
|
|
32
|
+
readonly profile: string;
|
|
33
|
+
readonly category: string;
|
|
34
|
+
readonly rowCounts: ReadonlyMap<string, number>;
|
|
35
|
+
readonly internalFkPass: boolean;
|
|
36
|
+
readonly externalFindings: number;
|
|
37
|
+
readonly findingsCount: number;
|
|
38
|
+
readonly outDir: string;
|
|
39
|
+
}
|
|
40
|
+
export type Writer = (s: string) => void;
|
|
41
|
+
export declare function runCatalogueBuild(inputs: BuildInputs, write: Writer): Promise<BuildResult>;
|
|
42
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA2CH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzC,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CAuEtB"}
|