@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.
Files changed (206) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +17 -0
  3. package/README.md +6 -2
  4. package/dist/lib/adr-origin.js +59 -0
  5. package/dist/lib/agent-harness.js +28 -0
  6. package/dist/lib/briefing/index.js +13 -0
  7. package/dist/lib/briefing/render.js +123 -0
  8. package/dist/lib/briefing/variables.js +92 -0
  9. package/dist/lib/bundle.js +123 -0
  10. package/dist/lib/catalogue/aggregate.js +2404 -0
  11. package/dist/lib/catalogue/aggregation-manifest-loader.js +173 -0
  12. package/dist/lib/catalogue/application-archetype/expectations.js +119 -0
  13. package/dist/lib/catalogue/application-archetype/vocabulary.js +177 -0
  14. package/dist/lib/catalogue/archetype/maps/android.yaml +66 -0
  15. package/dist/lib/catalogue/archetype/maps/swiftui.yaml +58 -0
  16. package/dist/lib/catalogue/archetype/maps/uikit.yaml +48 -0
  17. package/dist/lib/catalogue/archetype/maps/web-generic.yaml +86 -0
  18. package/dist/lib/catalogue/archetype/openui-archetype-vocabulary.yaml +46 -0
  19. package/dist/lib/catalogue/archetype/resolver.js +103 -0
  20. package/dist/lib/catalogue/archetype/wireframe.js +418 -0
  21. package/dist/lib/catalogue/baseline-check.js +151 -0
  22. package/dist/lib/catalogue/build.js +1502 -0
  23. package/dist/lib/catalogue/builders/adr-supersedes.js +103 -0
  24. package/dist/lib/catalogue/builders/adrs.js +222 -0
  25. package/dist/lib/catalogue/builders/application-conformance-coverage.js +47 -0
  26. package/dist/lib/catalogue/builders/application-data-plane-bindings.js +115 -0
  27. package/dist/lib/catalogue/builders/c4-components.js +229 -0
  28. package/dist/lib/catalogue/builders/c4-containers.js +240 -0
  29. package/dist/lib/catalogue/builders/c4-entity-rollups.js +87 -0
  30. package/dist/lib/catalogue/builders/c4-external-systems.js +194 -0
  31. package/dist/lib/catalogue/builders/c4-l1-candidates.js +107 -0
  32. package/dist/lib/catalogue/builders/c4-systems.js +98 -0
  33. package/dist/lib/catalogue/builders/capabilities.js +488 -0
  34. package/dist/lib/catalogue/builders/capability-domain-model.js +74 -0
  35. package/dist/lib/catalogue/builders/capability-edges.js +256 -0
  36. package/dist/lib/catalogue/builders/capability-spec-walker.js +99 -0
  37. package/dist/lib/catalogue/builders/capability-spec.js +348 -0
  38. package/dist/lib/catalogue/builders/container-dependency.js +183 -0
  39. package/dist/lib/catalogue/builders/contracts.js +402 -0
  40. package/dist/lib/catalogue/builders/data-items.js +344 -0
  41. package/dist/lib/catalogue/builders/data-store-mapping.js +113 -0
  42. package/dist/lib/catalogue/builders/domain-models.js +175 -0
  43. package/dist/lib/catalogue/builders/domains.js +119 -0
  44. package/dist/lib/catalogue/builders/edge-label-merge.js +19 -0
  45. package/dist/lib/catalogue/builders/entities-manifest.js +160 -0
  46. package/dist/lib/catalogue/builders/entities-mermaid.js +189 -0
  47. package/dist/lib/catalogue/builders/entity-persistence.js +102 -0
  48. package/dist/lib/catalogue/builders/entity-slug.js +47 -0
  49. package/dist/lib/catalogue/builders/event-catalog-walker.js +186 -0
  50. package/dist/lib/catalogue/builders/event-edges.js +327 -0
  51. package/dist/lib/catalogue/builders/events.js +168 -0
  52. package/dist/lib/catalogue/builders/evidence-class.js +43 -0
  53. package/dist/lib/catalogue/builders/evidence-target-repo.js +67 -0
  54. package/dist/lib/catalogue/builders/external-system-exemption.js +120 -0
  55. package/dist/lib/catalogue/builders/feature-contract.js +77 -0
  56. package/dist/lib/catalogue/builders/feature-domain-model.js +50 -0
  57. package/dist/lib/catalogue/builders/feature-grounding-walker.js +254 -0
  58. package/dist/lib/catalogue/builders/feature-grounding.js +391 -0
  59. package/dist/lib/catalogue/builders/feature-groups.js +63 -0
  60. package/dist/lib/catalogue/builders/feature-subscription-channels.js +228 -0
  61. package/dist/lib/catalogue/builders/feature-tree-walker.js +295 -0
  62. package/dist/lib/catalogue/builders/features.js +300 -0
  63. package/dist/lib/catalogue/builders/glossary-xref.js +378 -0
  64. package/dist/lib/catalogue/builders/glossary.js +204 -0
  65. package/dist/lib/catalogue/builders/implementations.js +214 -0
  66. package/dist/lib/catalogue/builders/index.js +64 -0
  67. package/dist/lib/catalogue/builders/integration-components.js +344 -0
  68. package/dist/lib/catalogue/builders/integrations.js +181 -0
  69. package/dist/lib/catalogue/builders/persona-c4system.js +149 -0
  70. package/dist/lib/catalogue/builders/persona-container.js +133 -0
  71. package/dist/lib/catalogue/builders/persona-journey-edges.js +133 -0
  72. package/dist/lib/catalogue/builders/personas.js +152 -0
  73. package/dist/lib/catalogue/builders/product-edges.js +106 -0
  74. package/dist/lib/catalogue/builders/product-platform-dependencies.js +405 -0
  75. package/dist/lib/catalogue/builders/products.js +162 -0
  76. package/dist/lib/catalogue/builders/quality-scores.js +635 -0
  77. package/dist/lib/catalogue/builders/repo-capability-exemption.js +61 -0
  78. package/dist/lib/catalogue/builders/repo-dependency.js +127 -0
  79. package/dist/lib/catalogue/builders/repo-edges.js +340 -0
  80. package/dist/lib/catalogue/builders/repositories.js +458 -0
  81. package/dist/lib/catalogue/builders/scaffolds.js +197 -0
  82. package/dist/lib/catalogue/builders/screen-tree.js +222 -0
  83. package/dist/lib/catalogue/builders/screens.js +396 -0
  84. package/dist/lib/catalogue/builders/service-capability-exemption.js +63 -0
  85. package/dist/lib/catalogue/builders/service-contract-consumes.js +186 -0
  86. package/dist/lib/catalogue/builders/service-contract.js +74 -0
  87. package/dist/lib/catalogue/builders/service-entity-tables.js +187 -0
  88. package/dist/lib/catalogue/builders/services.js +232 -0
  89. package/dist/lib/catalogue/builders/system-external-dependency.js +115 -0
  90. package/dist/lib/catalogue/builders/user-journeys.js +253 -0
  91. package/dist/lib/catalogue/canonical-schema.yaml +4117 -0
  92. package/dist/lib/catalogue/cli-version.js +10 -0
  93. package/dist/lib/catalogue/contract-id.js +49 -0
  94. package/dist/lib/catalogue/contract-path-resolution.js +149 -0
  95. package/dist/lib/catalogue/coverage-predicates.js +603 -0
  96. package/dist/lib/catalogue/coverage-render.js +552 -0
  97. package/dist/lib/catalogue/coverage-run.js +115 -0
  98. package/dist/lib/catalogue/csv-reader.js +97 -0
  99. package/dist/lib/catalogue/csv-writer.js +96 -0
  100. package/dist/lib/catalogue/data-item-coverage.js +142 -0
  101. package/dist/lib/catalogue/data-plane-coherence.js +77 -0
  102. package/dist/lib/catalogue/ddl-generator.js +233 -0
  103. package/dist/lib/catalogue/dedupe-keyed-tables.js +0 -0
  104. package/dist/lib/catalogue/engine-validator.js +239 -0
  105. package/dist/lib/catalogue/ext-id.js +76 -0
  106. package/dist/lib/catalogue/feature-grounding-aliases-loader.js +65 -0
  107. package/dist/lib/catalogue/feature-repo-zero-resolution-summary.js +31 -0
  108. package/dist/lib/catalogue/finding-identity.js +183 -0
  109. package/dist/lib/catalogue/findings.js +46 -0
  110. package/dist/lib/catalogue/fk-validator.js +136 -0
  111. package/dist/lib/catalogue/freshness.js +69 -0
  112. package/dist/lib/catalogue/gate-checks.js +338 -0
  113. package/dist/lib/catalogue/graph-projection.js +346 -0
  114. package/dist/lib/catalogue/graph-run.js +64 -0
  115. package/dist/lib/catalogue/impact-run.js +228 -0
  116. package/dist/lib/catalogue/manifest-loader.js +435 -0
  117. package/dist/lib/catalogue/platform-scope.js +7 -0
  118. package/dist/lib/catalogue/population-checks.js +87 -0
  119. package/dist/lib/catalogue/relationship-semantics.js +66 -0
  120. package/dist/lib/catalogue/reverse-product-quality.js +99 -0
  121. package/dist/lib/catalogue/rubric-coverage-map.yaml +871 -0
  122. package/dist/lib/catalogue/runway-vocabulary-loader.js +56 -0
  123. package/dist/lib/catalogue/scaffold-delta.js +261 -0
  124. package/dist/lib/catalogue/schema-compat.js +52 -0
  125. package/dist/lib/catalogue/schema-loader.js +87 -0
  126. package/dist/lib/catalogue/scores-coverage.js +573 -0
  127. package/dist/lib/catalogue/screen-validation-loader.js +89 -0
  128. package/dist/lib/catalogue/service-architecture-parser.js +193 -0
  129. package/dist/lib/catalogue/service-contract-aliases-loader.js +109 -0
  130. package/dist/lib/catalogue/staleness-verdicts.js +345 -0
  131. package/dist/lib/catalogue/traceability-loader.js +350 -0
  132. package/dist/lib/catalogue/validate.js +200 -0
  133. package/dist/lib/catalogue/version.js +18 -0
  134. package/dist/lib/ci-binding/index.js +220 -0
  135. package/dist/lib/ci-binding/module.js +204 -0
  136. package/dist/lib/conformance/binding.js +70 -0
  137. package/dist/lib/context-pull/index.js +151 -0
  138. package/dist/lib/context-pull/resolve.js +70 -0
  139. package/dist/lib/generate-briefing/index.js +77 -0
  140. package/dist/lib/hooks-seed/copilot.js +167 -0
  141. package/dist/lib/hooks-seed/entries.js +47 -0
  142. package/dist/lib/hooks-seed/index.js +17 -0
  143. package/dist/lib/hooks-seed/lifecycle-mapping.js +28 -0
  144. package/dist/lib/hooks-seed/merge.js +128 -0
  145. package/dist/lib/hooks-seed/types.js +20 -0
  146. package/dist/lib/init/ci-workflow.js +98 -0
  147. package/dist/lib/list/discover.js +100 -0
  148. package/dist/lib/list/format.js +84 -0
  149. package/dist/lib/list/index.js +16 -0
  150. package/dist/lib/lock-file.js +437 -0
  151. package/dist/lib/mcp-seed/entries.js +14 -0
  152. package/dist/lib/mcp-seed/index.js +28 -0
  153. package/dist/lib/mcp-seed/merge.js +99 -0
  154. package/dist/lib/mcp-seed/types.js +13 -0
  155. package/dist/lib/pack/builder.js +303 -0
  156. package/dist/lib/pack/index.js +87 -0
  157. package/dist/lib/pack/leakage.js +144 -0
  158. package/dist/lib/pack/log.js +18 -0
  159. package/dist/lib/pack/publish-transform.js +233 -0
  160. package/dist/lib/pack/reference-closure.js +125 -0
  161. package/dist/lib/pack/schema.js +121 -0
  162. package/dist/lib/pack/seed.js +182 -0
  163. package/dist/lib/pack/validate.js +49 -0
  164. package/dist/lib/package-version.js +92 -0
  165. package/dist/lib/repo-kind.js +129 -0
  166. package/dist/lib/scripts.js +7 -0
  167. package/dist/lib/snapshot/catalogue-diff.js +219 -0
  168. package/dist/lib/snapshot/manifest.js +206 -0
  169. package/dist/lib/sync/adr-transitions.js +250 -0
  170. package/dist/lib/sync/apply.js +91 -0
  171. package/dist/lib/sync/briefing-merge.js +90 -0
  172. package/dist/lib/sync/bundle-cache.js +109 -0
  173. package/dist/lib/sync/bundle-source.js +61 -0
  174. package/dist/lib/sync/config.js +72 -0
  175. package/dist/lib/sync/copilot-hooks-merge.js +108 -0
  176. package/dist/lib/sync/diff.js +251 -0
  177. package/dist/lib/sync/index.js +818 -0
  178. package/dist/lib/sync/settings-merge.js +216 -0
  179. package/dist/lib/sync/yaml-block-merge.js +120 -0
  180. package/dist/lib/validate/aggregate.js +51 -0
  181. package/dist/lib/validate/bundle-coherence.js +74 -0
  182. package/dist/lib/validate/dispatch.js +243 -0
  183. package/dist/lib/validate/index.js +110 -0
  184. package/dist/lib/validate/plan.js +54 -0
  185. package/dist/lib/validate/runner.js +85 -0
  186. package/dist/lib/validate/yaml-parse.js +112 -0
  187. package/dist/maintain-bin.js +8 -0
  188. package/dist/maintain-program.js +91 -0
  189. package/dist/maintain-version.json +4 -0
  190. package/dist/verbs/catalogue-maintain.js +110 -0
  191. package/dist/verbs/catalogue-verify.js +114 -0
  192. package/dist/verbs/context.js +39 -0
  193. package/dist/verbs/generate-briefing.js +29 -0
  194. package/dist/verbs/list.js +45 -0
  195. package/dist/verbs/pack-build.js +31 -0
  196. package/dist/verbs/pack-validate.js +17 -0
  197. package/dist/verbs/path-option.js +25 -0
  198. package/dist/verbs/render.js +87 -0
  199. package/dist/verbs/sync.js +110 -0
  200. package/dist/verbs/validate.js +48 -0
  201. package/dist/verify-program.js +122 -0
  202. package/dist/verify-version.json +4 -0
  203. package/package.json +32 -4
  204. package/scripts/validate-app-dependencies.sh +664 -0
  205. package/scripts/validate-app-docs.sh +199 -0
  206. 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