@sdd-method/maintain-cli 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +17 -0
- package/README.md +6 -2
- package/dist/lib/adr-origin.js +59 -0
- package/dist/lib/agent-harness.js +28 -0
- package/dist/lib/briefing/index.js +13 -0
- package/dist/lib/briefing/render.js +123 -0
- package/dist/lib/briefing/variables.js +92 -0
- package/dist/lib/bundle.js +123 -0
- package/dist/lib/catalogue/aggregate.js +2404 -0
- package/dist/lib/catalogue/aggregation-manifest-loader.js +173 -0
- package/dist/lib/catalogue/application-archetype/expectations.js +119 -0
- package/dist/lib/catalogue/application-archetype/vocabulary.js +177 -0
- package/dist/lib/catalogue/archetype/maps/android.yaml +66 -0
- package/dist/lib/catalogue/archetype/maps/swiftui.yaml +58 -0
- package/dist/lib/catalogue/archetype/maps/uikit.yaml +48 -0
- package/dist/lib/catalogue/archetype/maps/web-generic.yaml +86 -0
- package/dist/lib/catalogue/archetype/openui-archetype-vocabulary.yaml +46 -0
- package/dist/lib/catalogue/archetype/resolver.js +103 -0
- package/dist/lib/catalogue/archetype/wireframe.js +418 -0
- package/dist/lib/catalogue/baseline-check.js +151 -0
- package/dist/lib/catalogue/build.js +1502 -0
- package/dist/lib/catalogue/builders/adr-supersedes.js +103 -0
- package/dist/lib/catalogue/builders/adrs.js +222 -0
- package/dist/lib/catalogue/builders/application-conformance-coverage.js +47 -0
- package/dist/lib/catalogue/builders/application-data-plane-bindings.js +115 -0
- package/dist/lib/catalogue/builders/c4-components.js +229 -0
- package/dist/lib/catalogue/builders/c4-containers.js +240 -0
- package/dist/lib/catalogue/builders/c4-entity-rollups.js +87 -0
- package/dist/lib/catalogue/builders/c4-external-systems.js +194 -0
- package/dist/lib/catalogue/builders/c4-l1-candidates.js +107 -0
- package/dist/lib/catalogue/builders/c4-systems.js +98 -0
- package/dist/lib/catalogue/builders/capabilities.js +488 -0
- package/dist/lib/catalogue/builders/capability-domain-model.js +74 -0
- package/dist/lib/catalogue/builders/capability-edges.js +256 -0
- package/dist/lib/catalogue/builders/capability-spec-walker.js +99 -0
- package/dist/lib/catalogue/builders/capability-spec.js +348 -0
- package/dist/lib/catalogue/builders/container-dependency.js +183 -0
- package/dist/lib/catalogue/builders/contracts.js +402 -0
- package/dist/lib/catalogue/builders/data-items.js +344 -0
- package/dist/lib/catalogue/builders/data-store-mapping.js +113 -0
- package/dist/lib/catalogue/builders/domain-models.js +175 -0
- package/dist/lib/catalogue/builders/domains.js +119 -0
- package/dist/lib/catalogue/builders/edge-label-merge.js +19 -0
- package/dist/lib/catalogue/builders/entities-manifest.js +160 -0
- package/dist/lib/catalogue/builders/entities-mermaid.js +189 -0
- package/dist/lib/catalogue/builders/entity-persistence.js +102 -0
- package/dist/lib/catalogue/builders/entity-slug.js +47 -0
- package/dist/lib/catalogue/builders/event-catalog-walker.js +186 -0
- package/dist/lib/catalogue/builders/event-edges.js +327 -0
- package/dist/lib/catalogue/builders/events.js +168 -0
- package/dist/lib/catalogue/builders/evidence-class.js +43 -0
- package/dist/lib/catalogue/builders/evidence-target-repo.js +67 -0
- package/dist/lib/catalogue/builders/external-system-exemption.js +120 -0
- package/dist/lib/catalogue/builders/feature-contract.js +77 -0
- package/dist/lib/catalogue/builders/feature-domain-model.js +50 -0
- package/dist/lib/catalogue/builders/feature-grounding-walker.js +254 -0
- package/dist/lib/catalogue/builders/feature-grounding.js +391 -0
- package/dist/lib/catalogue/builders/feature-groups.js +63 -0
- package/dist/lib/catalogue/builders/feature-subscription-channels.js +228 -0
- package/dist/lib/catalogue/builders/feature-tree-walker.js +295 -0
- package/dist/lib/catalogue/builders/features.js +300 -0
- package/dist/lib/catalogue/builders/glossary-xref.js +378 -0
- package/dist/lib/catalogue/builders/glossary.js +204 -0
- package/dist/lib/catalogue/builders/implementations.js +214 -0
- package/dist/lib/catalogue/builders/index.js +64 -0
- package/dist/lib/catalogue/builders/integration-components.js +344 -0
- package/dist/lib/catalogue/builders/integrations.js +181 -0
- package/dist/lib/catalogue/builders/persona-c4system.js +149 -0
- package/dist/lib/catalogue/builders/persona-container.js +133 -0
- package/dist/lib/catalogue/builders/persona-journey-edges.js +133 -0
- package/dist/lib/catalogue/builders/personas.js +152 -0
- package/dist/lib/catalogue/builders/product-edges.js +106 -0
- package/dist/lib/catalogue/builders/product-platform-dependencies.js +405 -0
- package/dist/lib/catalogue/builders/products.js +162 -0
- package/dist/lib/catalogue/builders/quality-scores.js +635 -0
- package/dist/lib/catalogue/builders/repo-capability-exemption.js +61 -0
- package/dist/lib/catalogue/builders/repo-dependency.js +127 -0
- package/dist/lib/catalogue/builders/repo-edges.js +340 -0
- package/dist/lib/catalogue/builders/repositories.js +458 -0
- package/dist/lib/catalogue/builders/scaffolds.js +197 -0
- package/dist/lib/catalogue/builders/screen-tree.js +222 -0
- package/dist/lib/catalogue/builders/screens.js +396 -0
- package/dist/lib/catalogue/builders/service-capability-exemption.js +63 -0
- package/dist/lib/catalogue/builders/service-contract-consumes.js +186 -0
- package/dist/lib/catalogue/builders/service-contract.js +74 -0
- package/dist/lib/catalogue/builders/service-entity-tables.js +187 -0
- package/dist/lib/catalogue/builders/services.js +232 -0
- package/dist/lib/catalogue/builders/system-external-dependency.js +115 -0
- package/dist/lib/catalogue/builders/user-journeys.js +253 -0
- package/dist/lib/catalogue/canonical-schema.yaml +4117 -0
- package/dist/lib/catalogue/cli-version.js +10 -0
- package/dist/lib/catalogue/contract-id.js +49 -0
- package/dist/lib/catalogue/contract-path-resolution.js +149 -0
- package/dist/lib/catalogue/coverage-predicates.js +603 -0
- package/dist/lib/catalogue/coverage-render.js +552 -0
- package/dist/lib/catalogue/coverage-run.js +115 -0
- package/dist/lib/catalogue/csv-reader.js +97 -0
- package/dist/lib/catalogue/csv-writer.js +96 -0
- package/dist/lib/catalogue/data-item-coverage.js +142 -0
- package/dist/lib/catalogue/data-plane-coherence.js +77 -0
- package/dist/lib/catalogue/ddl-generator.js +233 -0
- package/dist/lib/catalogue/dedupe-keyed-tables.js +0 -0
- package/dist/lib/catalogue/engine-validator.js +239 -0
- package/dist/lib/catalogue/ext-id.js +76 -0
- package/dist/lib/catalogue/feature-grounding-aliases-loader.js +65 -0
- package/dist/lib/catalogue/feature-repo-zero-resolution-summary.js +31 -0
- package/dist/lib/catalogue/finding-identity.js +183 -0
- package/dist/lib/catalogue/findings.js +46 -0
- package/dist/lib/catalogue/fk-validator.js +136 -0
- package/dist/lib/catalogue/freshness.js +69 -0
- package/dist/lib/catalogue/gate-checks.js +338 -0
- package/dist/lib/catalogue/graph-projection.js +346 -0
- package/dist/lib/catalogue/graph-run.js +64 -0
- package/dist/lib/catalogue/impact-run.js +228 -0
- package/dist/lib/catalogue/manifest-loader.js +435 -0
- package/dist/lib/catalogue/platform-scope.js +7 -0
- package/dist/lib/catalogue/population-checks.js +87 -0
- package/dist/lib/catalogue/relationship-semantics.js +66 -0
- package/dist/lib/catalogue/reverse-product-quality.js +99 -0
- package/dist/lib/catalogue/rubric-coverage-map.yaml +871 -0
- package/dist/lib/catalogue/runway-vocabulary-loader.js +56 -0
- package/dist/lib/catalogue/scaffold-delta.js +261 -0
- package/dist/lib/catalogue/schema-compat.js +52 -0
- package/dist/lib/catalogue/schema-loader.js +87 -0
- package/dist/lib/catalogue/scores-coverage.js +573 -0
- package/dist/lib/catalogue/screen-validation-loader.js +89 -0
- package/dist/lib/catalogue/service-architecture-parser.js +193 -0
- package/dist/lib/catalogue/service-contract-aliases-loader.js +109 -0
- package/dist/lib/catalogue/staleness-verdicts.js +345 -0
- package/dist/lib/catalogue/traceability-loader.js +350 -0
- package/dist/lib/catalogue/validate.js +200 -0
- package/dist/lib/catalogue/version.js +18 -0
- package/dist/lib/ci-binding/index.js +220 -0
- package/dist/lib/ci-binding/module.js +204 -0
- package/dist/lib/conformance/binding.js +70 -0
- package/dist/lib/context-pull/index.js +151 -0
- package/dist/lib/context-pull/resolve.js +70 -0
- package/dist/lib/generate-briefing/index.js +77 -0
- package/dist/lib/hooks-seed/copilot.js +167 -0
- package/dist/lib/hooks-seed/entries.js +47 -0
- package/dist/lib/hooks-seed/index.js +17 -0
- package/dist/lib/hooks-seed/lifecycle-mapping.js +28 -0
- package/dist/lib/hooks-seed/merge.js +128 -0
- package/dist/lib/hooks-seed/types.js +20 -0
- package/dist/lib/init/ci-workflow.js +98 -0
- package/dist/lib/list/discover.js +100 -0
- package/dist/lib/list/format.js +84 -0
- package/dist/lib/list/index.js +16 -0
- package/dist/lib/lock-file.js +437 -0
- package/dist/lib/mcp-seed/entries.js +14 -0
- package/dist/lib/mcp-seed/index.js +28 -0
- package/dist/lib/mcp-seed/merge.js +99 -0
- package/dist/lib/mcp-seed/types.js +13 -0
- package/dist/lib/pack/builder.js +303 -0
- package/dist/lib/pack/index.js +87 -0
- package/dist/lib/pack/leakage.js +144 -0
- package/dist/lib/pack/log.js +18 -0
- package/dist/lib/pack/publish-transform.js +233 -0
- package/dist/lib/pack/reference-closure.js +125 -0
- package/dist/lib/pack/schema.js +121 -0
- package/dist/lib/pack/seed.js +182 -0
- package/dist/lib/pack/validate.js +49 -0
- package/dist/lib/package-version.js +92 -0
- package/dist/lib/repo-kind.js +129 -0
- package/dist/lib/scripts.js +7 -0
- package/dist/lib/snapshot/catalogue-diff.js +219 -0
- package/dist/lib/snapshot/manifest.js +206 -0
- package/dist/lib/sync/adr-transitions.js +250 -0
- package/dist/lib/sync/apply.js +91 -0
- package/dist/lib/sync/briefing-merge.js +90 -0
- package/dist/lib/sync/bundle-cache.js +109 -0
- package/dist/lib/sync/bundle-source.js +61 -0
- package/dist/lib/sync/config.js +72 -0
- package/dist/lib/sync/copilot-hooks-merge.js +108 -0
- package/dist/lib/sync/diff.js +251 -0
- package/dist/lib/sync/index.js +818 -0
- package/dist/lib/sync/settings-merge.js +216 -0
- package/dist/lib/sync/yaml-block-merge.js +120 -0
- package/dist/lib/validate/aggregate.js +51 -0
- package/dist/lib/validate/bundle-coherence.js +74 -0
- package/dist/lib/validate/dispatch.js +243 -0
- package/dist/lib/validate/index.js +110 -0
- package/dist/lib/validate/plan.js +54 -0
- package/dist/lib/validate/runner.js +85 -0
- package/dist/lib/validate/yaml-parse.js +112 -0
- package/dist/maintain-bin.js +8 -0
- package/dist/maintain-program.js +91 -0
- package/dist/maintain-version.json +4 -0
- package/dist/verbs/catalogue-maintain.js +110 -0
- package/dist/verbs/catalogue-verify.js +114 -0
- package/dist/verbs/context.js +39 -0
- package/dist/verbs/generate-briefing.js +29 -0
- package/dist/verbs/list.js +45 -0
- package/dist/verbs/pack-build.js +31 -0
- package/dist/verbs/pack-validate.js +17 -0
- package/dist/verbs/path-option.js +25 -0
- package/dist/verbs/render.js +87 -0
- package/dist/verbs/sync.js +110 -0
- package/dist/verbs/validate.js +48 -0
- package/dist/verify-program.js +122 -0
- package/dist/verify-version.json +4 -0
- package/package.json +32 -4
- package/scripts/validate-app-dependencies.sh +664 -0
- package/scripts/validate-app-docs.sh +199 -0
- package/scripts/validate-integration-docs.sh +505 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sdd-cli version constant, used in error messages from the catalogue
|
|
3
|
+
* builder + aggregator + validate subcommands.
|
|
4
|
+
*
|
|
5
|
+
* Read from package.json via getSddCliVersion() (the ENGINE version, also in a persona package) to guarantee the
|
|
6
|
+
* constant cannot drift from the published version.
|
|
7
|
+
*/
|
|
8
|
+
import { getSddCliVersion } from "../package-version.js";
|
|
9
|
+
export const CLI_VERSION = getSddCliVersion();
|
|
10
|
+
//# sourceMappingURL=cli-version.js.map
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Contract row identity (schema 3.0.0) and the legacy-id migration map —
|
|
2
|
+
// M-ADR 0203 §4.4, the cut's acid test.
|
|
3
|
+
//
|
|
4
|
+
// From 3.0.0 a contract id carries its KIND component: `{domain}-{stem}-{kind}`
|
|
5
|
+
// (kind ∈ rest | graphql | rpc | event | authz). The kindless 2.x form made one
|
|
6
|
+
// measured collision class unrepresentable: a service published as two contract
|
|
7
|
+
// families (`calendar-service.yaml` + `calendar_service.proto`) minted one id,
|
|
8
|
+
// costing a live estate one row and two edges permanently, and mislabelling
|
|
9
|
+
// legitimate shared-contract citation as divergence.
|
|
10
|
+
//
|
|
11
|
+
// The map is mechanical in both directions: new id = `${old id}-${kind}`, from
|
|
12
|
+
// two columns every committed catalogue carries (`id`, `kind`). It ships via
|
|
13
|
+
// `sdd-cli catalogue migration-map`; the alias-file re-key (M-ADR 0147 targets
|
|
14
|
+
// are authored copies of tool-minted ids — regenerable, not drift, the same
|
|
15
|
+
// rule as external_system_exemption) consults the in-build form of it.
|
|
16
|
+
/** The 3.0.0 contract id: the kindless slug with its kind appended. */
|
|
17
|
+
export function contractIdWithKind(kindlessSlug, kind) {
|
|
18
|
+
return kindlessSlug === "" ? "" : `${kindlessSlug}-${kind}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* legacy (2.x, kindless) id → the 3.0.0 kind-suffixed ids it maps to, from
|
|
22
|
+
* built rows. More than one target means the id was a measured collision
|
|
23
|
+
* under 2.x (two families sharing one kindless slug) — the consumer decides
|
|
24
|
+
* which family is meant, loudly, never by guess.
|
|
25
|
+
*/
|
|
26
|
+
export function buildLegacyContractIdMap(rows) {
|
|
27
|
+
const map = new Map();
|
|
28
|
+
for (const row of rows) {
|
|
29
|
+
const id = String(row["id"] ?? "");
|
|
30
|
+
const kind = String(row["kind"] ?? "");
|
|
31
|
+
if (id === "" || kind === "" || !id.endsWith(`-${kind}`))
|
|
32
|
+
continue;
|
|
33
|
+
const legacy = id.slice(0, -(kind.length + 1));
|
|
34
|
+
if (legacy === "")
|
|
35
|
+
continue;
|
|
36
|
+
const ids = map.get(legacy);
|
|
37
|
+
if (ids) {
|
|
38
|
+
if (!ids.includes(id))
|
|
39
|
+
ids.push(id);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
map.set(legacy, [id]);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const ids of map.values())
|
|
46
|
+
ids.sort((a, b) => a.localeCompare(b));
|
|
47
|
+
return map;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=contract-id.js.map
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Contract-path resolution at aggregation tier (post-3.0.0-followons.md A2 step 5).
|
|
2
|
+
//
|
|
3
|
+
// WHY THIS LIVES AT AGGREGATE TIER AND NOWHERE ELSE
|
|
4
|
+
// `app-platform-dependencies.yaml` declares, per dependency, the contract the
|
|
5
|
+
// consuming app binds to. Both distributed templates say that path is relative
|
|
6
|
+
// to the platform repo root — and in a federation that rule cannot express the
|
|
7
|
+
// truth, because one app's dependencies span several platform SDDs. Measured in
|
|
8
|
+
// a 67-SDD reverse estate: 21 of 152 declared paths name a contract owned by a
|
|
9
|
+
// DIFFERENT platform SDD than the one the app would be validated against, and
|
|
10
|
+
// their authors compensated by prefixing `platform/<sdd-id>/` — writing the
|
|
11
|
+
// truth against a rule that could not hold it.
|
|
12
|
+
//
|
|
13
|
+
// The app-tier gate therefore cannot resolve these at all: given one
|
|
14
|
+
// --platform-root it reports LOCKED UNMET for a contract that exists. That is a
|
|
15
|
+
// false failure of the instrument, and no amount of app-tier cleverness fixes it
|
|
16
|
+
// — the file is in a sibling the app repo cannot see. At aggregate tier every
|
|
17
|
+
// SDD root IS visible, so resolution becomes possible for the first time.
|
|
18
|
+
// Same argument as M-ADR 0198: a join that can span SDDs belongs where the SDDs
|
|
19
|
+
// are all present.
|
|
20
|
+
//
|
|
21
|
+
// WHAT IT DOES NOT DO
|
|
22
|
+
// It does not rewrite anything or pick a winner when a path is ambiguous. An
|
|
23
|
+
// ambiguous path is reported as a divergence and left alone, because guessing
|
|
24
|
+
// which sibling a contract came from is exactly the silent-wrong-answer this
|
|
25
|
+
// whole arc has been removing.
|
|
26
|
+
/**
|
|
27
|
+
* True when the declared value is shaped like a repo-relative path, as opposed to
|
|
28
|
+
* a sentinel or a prose note.
|
|
29
|
+
*
|
|
30
|
+
* The reverse template types this field `<platform-relative-path-or-unknown>`,
|
|
31
|
+
* which openly admits a non-path value — so `n/a` is the template being followed
|
|
32
|
+
* and free text is that licence stretched. Both are reported, neither is treated
|
|
33
|
+
* as a path, and NEITHER is silently ignored: an unresolvable declaration that
|
|
34
|
+
* nothing mentions is indistinguishable from a resolved one in the output.
|
|
35
|
+
*/
|
|
36
|
+
export function isPathShaped(value) {
|
|
37
|
+
const v = value.trim();
|
|
38
|
+
if (v === "" || v === "null")
|
|
39
|
+
return false;
|
|
40
|
+
if (v.toLowerCase().startsWith("n/a"))
|
|
41
|
+
return false;
|
|
42
|
+
if (v.startsWith("["))
|
|
43
|
+
return false;
|
|
44
|
+
// Prose gives itself away with whitespace before the first separator
|
|
45
|
+
// ("Kafka (<vendor> bus): topic-a / topic-b", "Kinesis: <stream-name>").
|
|
46
|
+
const firstSegment = v.split("/")[0] ?? "";
|
|
47
|
+
if (/\s/.test(firstSegment))
|
|
48
|
+
return false;
|
|
49
|
+
// A path must actually have a directory part; a bare token is not a contract path.
|
|
50
|
+
return v.includes("/");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Strip a leading `platform/<name>/` when `<name>` identifies a known SDD — by its
|
|
54
|
+
* sdd_id OR by its directory basename, and the distinction is not cosmetic: an
|
|
55
|
+
* author writing this prefix is reading it off the filesystem, so it is the
|
|
56
|
+
* DIRECTORY they write. In one measured estate every such prefix is
|
|
57
|
+
* `platform/sdd-experience-platform/` while that SDD's declared sdd_id is
|
|
58
|
+
* `experience-platform` — matching on sdd_id alone therefore split nothing and
|
|
59
|
+
* reported 13 existing contracts as missing. Both keys are accepted.
|
|
60
|
+
*
|
|
61
|
+
* That prefix
|
|
62
|
+
* is the estate-relative form authors reached for when the declared
|
|
63
|
+
* platform-root-relative base could not name a sibling's contract. Returns the
|
|
64
|
+
* owning SDD id and the path relative to ITS root, or null when the value carries
|
|
65
|
+
* no such prefix.
|
|
66
|
+
*/
|
|
67
|
+
export function splitEstateRelative(value, roots) {
|
|
68
|
+
const parts = value.trim().split("/");
|
|
69
|
+
if (parts.length < 3)
|
|
70
|
+
return null;
|
|
71
|
+
if (parts[0] !== "platform")
|
|
72
|
+
return null;
|
|
73
|
+
const sddId = parts[1] ?? "";
|
|
74
|
+
if (!roots.has(sddId))
|
|
75
|
+
return null;
|
|
76
|
+
return { sddId, relPath: parts.slice(2).join("/") };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve every declared contract_path against the SDD roots present in this
|
|
80
|
+
* aggregation, emitting one finding per unresolved declaration.
|
|
81
|
+
*
|
|
82
|
+
* `exists` is injected so this is testable without a filesystem, and so the
|
|
83
|
+
* caller owns the stat strategy.
|
|
84
|
+
*/
|
|
85
|
+
export async function resolveContractPaths(productPlatformDeps, roots, aliases, exists, findings) {
|
|
86
|
+
let resolved = 0;
|
|
87
|
+
let missing = 0;
|
|
88
|
+
let ambiguous = 0;
|
|
89
|
+
let nonPath = 0;
|
|
90
|
+
let absent = 0;
|
|
91
|
+
// One stat per (root, path) pair at worst. Cached because a shared platform
|
|
92
|
+
// contract is declared by many consumers — in the measured estate the same
|
|
93
|
+
// embedding contract is named by 21 dependencies.
|
|
94
|
+
const cache = new Map();
|
|
95
|
+
const existsCached = async (abs) => {
|
|
96
|
+
const hit = cache.get(abs);
|
|
97
|
+
if (hit !== undefined)
|
|
98
|
+
return hit;
|
|
99
|
+
const got = await exists(abs);
|
|
100
|
+
cache.set(abs, got);
|
|
101
|
+
return got;
|
|
102
|
+
};
|
|
103
|
+
for (const dep of productPlatformDeps) {
|
|
104
|
+
const declared = String(dep["contract_path"] ?? "").trim();
|
|
105
|
+
const who = `${String(dep["source_sdd_id"] ?? "")}/${String(dep["product_id"] ?? "")}`;
|
|
106
|
+
const target = String(dep["target_service_id"] ?? "") ||
|
|
107
|
+
String(dep["target_capability_id"] ?? "") ||
|
|
108
|
+
"(unnamed target)";
|
|
109
|
+
if (declared === "" || declared === "null") {
|
|
110
|
+
absent++;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (!isPathShaped(declared)) {
|
|
114
|
+
nonPath++;
|
|
115
|
+
findings.add("convention", `contract_path: ${who} → ${target} declares contract_path="${declared}", which is not a path — it cannot be resolved, and the dependency has no verifiable contract`);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const estate = splitEstateRelative(declared, aliases);
|
|
119
|
+
if (estate !== null) {
|
|
120
|
+
const abs = `${aliases.get(estate.sddId)}/${estate.relPath}`;
|
|
121
|
+
if (await existsCached(abs)) {
|
|
122
|
+
resolved++;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
missing++;
|
|
126
|
+
findings.add("orphan", `contract_path: ${who} → ${target} declares contract_path="${declared}", naming SDD "${estate.sddId}", but no file exists there`);
|
|
127
|
+
}
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const hits = [];
|
|
131
|
+
for (const [sddId, root] of roots) {
|
|
132
|
+
if (await existsCached(`${root}/${declared}`))
|
|
133
|
+
hits.push(sddId);
|
|
134
|
+
}
|
|
135
|
+
if (hits.length === 1) {
|
|
136
|
+
resolved++;
|
|
137
|
+
}
|
|
138
|
+
else if (hits.length === 0) {
|
|
139
|
+
missing++;
|
|
140
|
+
findings.add("orphan", `contract_path: ${who} → ${target} declares contract_path="${declared}" but it resolves under none of the ${roots.size} SDD root(s) in this aggregation`);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
ambiguous++;
|
|
144
|
+
findings.add("divergence", `contract_path: ${who} → ${target} declares contract_path="${declared}", which resolves under ${hits.length} SDD roots (${hits.join(", ")}) — not guessed; qualify the path or name the owning SDD`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { resolved, missing, ambiguous, nonPath, absent };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=contract-path-resolution.js.map
|