@sdd-method/sdd-cli 1.1.0 → 1.3.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 (83) hide show
  1. package/dist/lib/catalogue/aggregate.d.ts.map +1 -1
  2. package/dist/lib/catalogue/aggregate.js +5 -4
  3. package/dist/lib/catalogue/aggregate.js.map +1 -1
  4. package/dist/lib/catalogue/build.d.ts.map +1 -1
  5. package/dist/lib/catalogue/build.js +16 -7
  6. package/dist/lib/catalogue/build.js.map +1 -1
  7. package/dist/lib/catalogue/builders/capability-edges.d.ts.map +1 -1
  8. package/dist/lib/catalogue/builders/capability-edges.js +10 -1
  9. package/dist/lib/catalogue/builders/capability-edges.js.map +1 -1
  10. package/dist/lib/catalogue/builders/capability-spec.d.ts +9 -3
  11. package/dist/lib/catalogue/builders/capability-spec.d.ts.map +1 -1
  12. package/dist/lib/catalogue/builders/capability-spec.js +9 -3
  13. package/dist/lib/catalogue/builders/capability-spec.js.map +1 -1
  14. package/dist/lib/catalogue/builders/index.d.ts +2 -0
  15. package/dist/lib/catalogue/builders/index.d.ts.map +1 -1
  16. package/dist/lib/catalogue/builders/index.js +1 -0
  17. package/dist/lib/catalogue/builders/index.js.map +1 -1
  18. package/dist/lib/catalogue/builders/quality-scores.d.ts +14 -0
  19. package/dist/lib/catalogue/builders/quality-scores.d.ts.map +1 -0
  20. package/dist/lib/catalogue/builders/quality-scores.js +321 -0
  21. package/dist/lib/catalogue/builders/quality-scores.js.map +1 -0
  22. package/dist/lib/catalogue/builders/services.d.ts.map +1 -1
  23. package/dist/lib/catalogue/builders/services.js +5 -1
  24. package/dist/lib/catalogue/builders/services.js.map +1 -1
  25. package/dist/lib/catalogue/canonical-schema.yaml +255 -6
  26. package/dist/lib/catalogue/coverage-predicates.d.ts +176 -0
  27. package/dist/lib/catalogue/coverage-predicates.d.ts.map +1 -0
  28. package/dist/lib/catalogue/coverage-predicates.js +603 -0
  29. package/dist/lib/catalogue/coverage-predicates.js.map +1 -0
  30. package/dist/lib/catalogue/coverage-render.d.ts +54 -0
  31. package/dist/lib/catalogue/coverage-render.d.ts.map +1 -0
  32. package/dist/lib/catalogue/coverage-render.js +432 -0
  33. package/dist/lib/catalogue/coverage-render.js.map +1 -0
  34. package/dist/lib/catalogue/coverage-run.d.ts +33 -0
  35. package/dist/lib/catalogue/coverage-run.d.ts.map +1 -0
  36. package/dist/lib/catalogue/coverage-run.js +97 -0
  37. package/dist/lib/catalogue/coverage-run.js.map +1 -0
  38. package/dist/lib/catalogue/ddl-generator.d.ts +80 -0
  39. package/dist/lib/catalogue/ddl-generator.d.ts.map +1 -0
  40. package/dist/lib/catalogue/ddl-generator.js +215 -0
  41. package/dist/lib/catalogue/ddl-generator.js.map +1 -0
  42. package/dist/lib/catalogue/engine-validator.d.ts +103 -0
  43. package/dist/lib/catalogue/engine-validator.d.ts.map +1 -0
  44. package/dist/lib/catalogue/engine-validator.js +221 -0
  45. package/dist/lib/catalogue/engine-validator.js.map +1 -0
  46. package/dist/lib/catalogue/enum-validator.d.ts.map +1 -1
  47. package/dist/lib/catalogue/enum-validator.js +15 -0
  48. package/dist/lib/catalogue/enum-validator.js.map +1 -1
  49. package/dist/lib/catalogue/fk-validator.d.ts +6 -0
  50. package/dist/lib/catalogue/fk-validator.d.ts.map +1 -1
  51. package/dist/lib/catalogue/fk-validator.js +6 -0
  52. package/dist/lib/catalogue/fk-validator.js.map +1 -1
  53. package/dist/lib/catalogue/gate-checks.d.ts +117 -0
  54. package/dist/lib/catalogue/gate-checks.d.ts.map +1 -0
  55. package/dist/lib/catalogue/gate-checks.js +261 -0
  56. package/dist/lib/catalogue/gate-checks.js.map +1 -0
  57. package/dist/lib/catalogue/parity-harness.d.ts +48 -0
  58. package/dist/lib/catalogue/parity-harness.d.ts.map +1 -0
  59. package/dist/lib/catalogue/parity-harness.js +76 -0
  60. package/dist/lib/catalogue/parity-harness.js.map +1 -0
  61. package/dist/lib/catalogue/schema-compat.d.ts +3 -3
  62. package/dist/lib/catalogue/schema-compat.js +3 -3
  63. package/dist/lib/catalogue/scores-coverage.d.ts +138 -0
  64. package/dist/lib/catalogue/scores-coverage.d.ts.map +1 -0
  65. package/dist/lib/catalogue/scores-coverage.js +346 -0
  66. package/dist/lib/catalogue/scores-coverage.js.map +1 -0
  67. package/dist/lib/catalogue/validate.d.ts.map +1 -1
  68. package/dist/lib/catalogue/validate.js +6 -11
  69. package/dist/lib/catalogue/validate.js.map +1 -1
  70. package/dist/lib/mcp/parse/gate-registry.d.ts +63 -4
  71. package/dist/lib/mcp/parse/gate-registry.d.ts.map +1 -1
  72. package/dist/lib/mcp/parse/gate-registry.js +127 -31
  73. package/dist/lib/mcp/parse/gate-registry.js.map +1 -1
  74. package/dist/lib/mcp/resources/gates.d.ts.map +1 -1
  75. package/dist/lib/mcp/resources/gates.js +13 -27
  76. package/dist/lib/mcp/resources/gates.js.map +1 -1
  77. package/dist/lib/mcp/tools/query-gate-status.d.ts.map +1 -1
  78. package/dist/lib/mcp/tools/query-gate-status.js +13 -27
  79. package/dist/lib/mcp/tools/query-gate-status.js.map +1 -1
  80. package/dist/verbs/catalogue.d.ts.map +1 -1
  81. package/dist/verbs/catalogue.js +24 -0
  82. package/dist/verbs/catalogue.js.map +1 -1
  83. package/package.json +3 -2
@@ -1,56 +1,104 @@
1
1
  /**
2
2
  * YAML reader for orchestration/gate-registry/<gate>-scores.yaml.
3
- * Schema is conventional (schema_version, description, pass_threshold,
4
- * plus per-entry records keyed by artefact ID). We treat the file as a
5
- * generic YAML document and extract the artefact entries after
6
- * excluding the known header fields.
3
+ *
4
+ * Registry shape: header fields (schema_version, description, pass_threshold,
5
+ * and the reverse family's registry_type / assessed_at / assessed_by) plus ONE
6
+ * container key holding the per-artefact entries. The container key is not a
7
+ * stable name — it drifts between the method template and live estate data,
8
+ * and is not unique across rubrics — so it is unwrapped rather than trusted.
9
+ *
10
+ * Three defects were found here by the M-ADR 0205 Phase-B survey (2026-08-06)
11
+ * and fixed together, since all three are the same mistake in different
12
+ * places: assuming the registry population looks like the reader's model of it.
13
+ *
14
+ * - `listGates` hard-coded ten names, so gate discovery was silently blind
15
+ * to nine of the nineteen rubric families now in existence (five newer
16
+ * method-side registries and four reverse-only ones). An unlisted gate
17
+ * read as absent. It now enumerates the directory.
18
+ * - `entries` returned the CONTAINER, not the artefacts, so the summary in
19
+ * `resources/gates.ts` reported `total: 1` for a registry holding 99
20
+ * scored ADRs — while its own description advertised "per-artefact
21
+ * entries". It now unwraps the single container.
22
+ * - `parseYaml` ran unguarded, so a malformed registry threw a raw
23
+ * YAMLParseError through two surfaces that otherwise honour the
24
+ * McpEnvelopeError contract. Measured: three of one estate's ten
25
+ * registries are unparseable. It now reports `parseError` and returns an
26
+ * empty-but-well-formed registry, leaving each caller to decide how to
27
+ * surface it — the reader's job is to report, not to throw.
7
28
  */
8
- import { readFileSync } from "node:fs";
29
+ import { readFileSync, readdirSync } from "node:fs";
9
30
  import { join } from "node:path";
10
31
  import { parse as parseYaml } from "yaml";
11
32
  import { safeIsFile } from "./paths.js";
33
+ /** File-level keys that are registry metadata rather than the entry container. */
12
34
  const HEADER_KEYS = new Set([
13
35
  "schema_version",
14
36
  "description",
15
37
  "pass_threshold",
38
+ "registry_type",
39
+ "assessed_at",
40
+ "assessed_by",
16
41
  ]);
17
42
  export function gateRegistryPath(sddRoot, gate) {
18
43
  return join(sddRoot, "orchestration", "gate-registry", `${gate}-scores.yaml`);
19
44
  }
45
+ /**
46
+ * Every gate this SDD actually carries, by enumeration — never a fixed list.
47
+ * A registry is any `<gate>-scores.yaml` in the gate-registry directory, so a
48
+ * newly-shipped rubric is discoverable the moment its registry exists.
49
+ */
20
50
  export function listGates(sddRoot) {
21
- const candidates = [
22
- "adr-quality",
23
- "c4-diagram",
24
- "contract-quality",
25
- "domain-architecture",
26
- "feature-grounding",
27
- "intent-quality",
28
- "strategic-doc",
29
- "traceability-manifest",
30
- "user-story",
31
- "work-order",
32
- ];
33
- return candidates.filter((g) => safeIsFile(gateRegistryPath(sddRoot, g)));
51
+ const dir = join(sddRoot, "orchestration", "gate-registry");
52
+ let names;
53
+ try {
54
+ names = readdirSync(dir);
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ return names
60
+ .filter((n) => n.endsWith("-scores.yaml"))
61
+ .map((n) => n.slice(0, -".yaml".length).replace(/-scores$/, ""))
62
+ .filter((g) => safeIsFile(gateRegistryPath(sddRoot, g)))
63
+ .sort();
34
64
  }
35
65
  export function readGateRegistry(sddRoot, gate) {
36
66
  const path = gateRegistryPath(sddRoot, gate);
37
67
  if (!safeIsFile(path))
38
68
  return undefined;
39
69
  const raw = readFileSync(path, "utf8");
40
- const parsed = parseYaml(raw);
41
- if (!parsed || typeof parsed !== "object") {
42
- return {
43
- gate,
44
- path,
45
- schemaVersion: null,
46
- description: null,
47
- passThreshold: null,
48
- entries: {},
49
- };
70
+ const empty = (parseError) => ({
71
+ gate,
72
+ path,
73
+ schemaVersion: null,
74
+ description: null,
75
+ passThreshold: null,
76
+ entries: {},
77
+ entryContainer: null,
78
+ parseError,
79
+ });
80
+ let parsed;
81
+ try {
82
+ parsed = parseYaml(raw);
50
83
  }
51
- const entries = {};
52
- for (const [k, v] of Object.entries(parsed)) {
53
- if (!HEADER_KEYS.has(k))
84
+ catch (e) {
85
+ return empty(String(e.message).split("\n")[0] ?? "unparseable YAML");
86
+ }
87
+ if (!parsed || typeof parsed !== "object")
88
+ return empty(null);
89
+ // Exactly one non-header mapping key is the entry container. Zero means a
90
+ // headers-only registry (a deliberate, common state); more than one is
91
+ // ambiguous, and the whole document is returned rather than a guessed pick.
92
+ const containers = Object.entries(parsed).filter(([k, v]) => !HEADER_KEYS.has(k) && typeof v === "object" && v !== null && !Array.isArray(v));
93
+ let entries = {};
94
+ let entryContainer = null;
95
+ if (containers.length === 1) {
96
+ const [key, value] = containers[0];
97
+ entryContainer = key;
98
+ entries = value;
99
+ }
100
+ else if (containers.length > 1) {
101
+ for (const [k, v] of containers)
54
102
  entries[k] = v;
55
103
  }
56
104
  return {
@@ -60,9 +108,57 @@ export function readGateRegistry(sddRoot, gate) {
60
108
  description: typeOrNull(parsed["description"]),
61
109
  passThreshold: parsed["pass_threshold"] ?? null,
62
110
  entries,
111
+ entryContainer,
112
+ parseError: null,
63
113
  };
64
114
  }
65
115
  function typeOrNull(v) {
66
116
  return typeof v === "string" ? v : null;
67
117
  }
118
+ /**
119
+ * Verdict tally over unwrapped entries. ONE implementation, deliberately: this
120
+ * existed identically in both MCP consumers, and a duplicated counter is a
121
+ * drift surface that only shows up as two surfaces disagreeing about the same
122
+ * registry.
123
+ *
124
+ * Reads BOTH authored dialects. The gate sits at `entry.current.gate` in the
125
+ * nested shape all fifteen method templates specify, and at `entry.gate` in
126
+ * the flat shape the live estate data overwhelmingly uses. Reading only the
127
+ * flat one reports every nested entry as `unscored` — a confident false zero
128
+ * of exactly the kind this arc keeps paying for.
129
+ *
130
+ * An out-of-vocabulary verdict counts as `unscored` rather than being dropped,
131
+ * so `pass + conditional + fail + unscored === total` always holds and the
132
+ * tally can never quietly lose a row.
133
+ */
134
+ export function summariseGateEntries(entries) {
135
+ let total = 0;
136
+ let pass = 0;
137
+ let conditional = 0;
138
+ let fail = 0;
139
+ let unscored = 0;
140
+ for (const value of Object.values(entries)) {
141
+ total++;
142
+ if (value && typeof value === "object" && !Array.isArray(value)) {
143
+ const entry = value;
144
+ const nested = entry["current"];
145
+ const source = nested && typeof nested === "object" && !Array.isArray(nested)
146
+ ? nested
147
+ : entry;
148
+ const gateVal = source["gate"];
149
+ if (gateVal === "pass")
150
+ pass++;
151
+ else if (gateVal === "conditional")
152
+ conditional++;
153
+ else if (gateVal === "fail")
154
+ fail++;
155
+ else
156
+ unscored++;
157
+ }
158
+ else {
159
+ unscored++;
160
+ }
161
+ }
162
+ return { total, pass, conditional, fail, unscored };
163
+ }
68
164
  //# sourceMappingURL=gate-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gate-registry.js","sourceRoot":"","sources":["../../../../src/lib/mcp/parse/gate-registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,gBAAgB;IAChB,aAAa;IACb,gBAAgB;CACjB,CAAC,CAAC;AAWH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,IAAY;IAC5D,OAAO,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,UAAU,GAAG;QACjB,aAAa;QACb,YAAY;QACZ,kBAAkB;QAClB,qBAAqB;QACrB,mBAAmB;QACnB,gBAAgB;QAChB,eAAe;QACf,uBAAuB;QACvB,YAAY;QACZ,YAAY;KACb,CAAC;IACF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,IAAY;IAEZ,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAmC,CAAC;IAChE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO;YACL,IAAI;YACJ,IAAI;YACJ,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACnD,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9C,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,IAAI;QAC/C,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"gate-registry.js","sourceRoot":"","sources":["../../../../src/lib/mcp/parse/gate-registry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gates.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/gates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA8DjE"}
1
+ {"version":3,"file":"gates.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/gates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA0EjE"}
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
8
8
  import { McpEnvelopeError } from "../errors.js";
9
- import { listGates, readGateRegistry } from "../parse/gate-registry.js";
9
+ import { listGates, readGateRegistry, summariseGateEntries } from "../parse/gate-registry.js";
10
10
  export function register(server, sddRoot) {
11
11
  server.registerResource("gate", new ResourceTemplate("sdd://gates/{gate}", {
12
12
  list: async () => {
@@ -41,12 +41,23 @@ export function register(server, sddRoot) {
41
41
  context: { gate, sdd_root: sddRoot },
42
42
  });
43
43
  }
44
- const summary = summarise(registry.entries);
44
+ // A malformed registry must never read as a clean, empty one — reported
45
+ // through the envelope contract rather than thrown raw at the caller.
46
+ if (registry.parseError !== null) {
47
+ throw new McpEnvelopeError({
48
+ code: "GATE_REGISTRY_UNPARSEABLE",
49
+ message: `Gate registry ${registry.path} is not parseable YAML: ${registry.parseError}`,
50
+ remediation: "Repair the registry. Two shapes account for every case seen so far: a container mixing mapping entries with sequence entries, and a duplicate key — the latter silently discards one of two judgments in parsers that tolerate it, so treat a duplicate as two contradictory verdicts, not a typo.",
51
+ context: { gate, path: registry.path, parse_error: registry.parseError },
52
+ });
53
+ }
54
+ const summary = summariseGateEntries(registry.entries);
45
55
  const payload = {
46
56
  gate,
47
57
  schema_version: registry.schemaVersion,
48
58
  description: registry.description,
49
59
  pass_threshold: registry.passThreshold,
60
+ entry_container: registry.entryContainer,
50
61
  summary,
51
62
  entries: registry.entries,
52
63
  path: registry.path,
@@ -62,29 +73,4 @@ export function register(server, sddRoot) {
62
73
  };
63
74
  });
64
75
  }
65
- function summarise(entries) {
66
- let total = 0;
67
- let pass = 0;
68
- let conditional = 0;
69
- let fail = 0;
70
- let unscored = 0;
71
- for (const value of Object.values(entries)) {
72
- total++;
73
- if (value && typeof value === "object") {
74
- const gateVal = value["gate"];
75
- if (gateVal === "pass")
76
- pass++;
77
- else if (gateVal === "conditional")
78
- conditional++;
79
- else if (gateVal === "fail")
80
- fail++;
81
- else
82
- unscored++;
83
- }
84
- else {
85
- unscored++;
86
- }
87
- }
88
- return { total, pass, conditional, fail, unscored };
89
- }
90
76
  //# sourceMappingURL=gates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gates.js","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/gates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gates.js","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/gates.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-gate-status.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/query-gate-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAoEjE"}
1
+ {"version":3,"file":"query-gate-status.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/query-gate-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgFjE"}
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { McpEnvelopeError } from "../errors.js";
3
- import { listGates, readGateRegistry } from "../parse/gate-registry.js";
3
+ import { listGates, readGateRegistry, summariseGateEntries } from "../parse/gate-registry.js";
4
4
  import { readerFor } from "../pin/index.js";
5
5
  export function register(server, sddRoot) {
6
6
  server.registerTool("query_gate_status", {
@@ -34,11 +34,22 @@ export function register(server, sddRoot) {
34
34
  },
35
35
  });
36
36
  }
37
+ // A malformed registry must never read as a clean, empty one. Reported
38
+ // through the envelope contract like every other failure on this surface
39
+ // — before the fix it threw a raw YAMLParseError straight through.
40
+ if (registry.parseError !== null) {
41
+ throw new McpEnvelopeError({
42
+ code: "GATE_REGISTRY_UNPARSEABLE",
43
+ message: `Gate registry ${registry.path} is not parseable YAML: ${registry.parseError}`,
44
+ remediation: "Repair the registry. Two shapes account for every case seen so far: a container mixing mapping entries with sequence entries, and a duplicate key — the latter silently discards one of two judgments in parsers that tolerate it, so treat a duplicate as two contradictory verdicts, not a typo.",
45
+ context: { gate, path: registry.path, parse_error: registry.parseError },
46
+ });
47
+ }
37
48
  const wantScope = scope?.toLowerCase();
38
49
  const entries = wantScope
39
50
  ? Object.fromEntries(Object.entries(registry.entries).filter(([k]) => k.toLowerCase().includes(wantScope)))
40
51
  : registry.entries;
41
- const summary = summarise(entries);
52
+ const summary = summariseGateEntries(entries);
42
53
  const payload = {
43
54
  gate,
44
55
  scope_filter: scope ?? null,
@@ -54,29 +65,4 @@ export function register(server, sddRoot) {
54
65
  };
55
66
  });
56
67
  }
57
- function summarise(entries) {
58
- let total = 0;
59
- let pass = 0;
60
- let conditional = 0;
61
- let fail = 0;
62
- let unscored = 0;
63
- for (const value of Object.values(entries)) {
64
- total++;
65
- if (value && typeof value === "object") {
66
- const gateVal = value["gate"];
67
- if (gateVal === "pass")
68
- pass++;
69
- else if (gateVal === "conditional")
70
- conditional++;
71
- else if (gateVal === "fail")
72
- fail++;
73
- else
74
- unscored++;
75
- }
76
- else {
77
- unscored++;
78
- }
79
- }
80
- return { total, pass, conditional, fail, unscored };
81
- }
82
68
  //# sourceMappingURL=query-gate-status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-gate-status.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/query-gate-status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-gate-status.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/query-gate-status.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../../src/verbs/catalogue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+GxD"}
1
+ {"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../../src/verbs/catalogue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6JxD"}
@@ -1,4 +1,5 @@
1
1
  import { runCatalogueBuild, runCatalogueAggregate, runCatalogueMigrationMap, runCatalogueValidate, runCatalogueVersion, } from "../lib/catalogue/index.js";
2
+ import { runCatalogueCoverage } from "../lib/catalogue/coverage-run.js";
2
3
  export function registerCatalogue(program) {
3
4
  const catalogue = program
4
5
  .command("catalogue")
@@ -42,7 +43,30 @@ export function registerCatalogue(program) {
42
43
  .description("Re-run column-shape + FK validation against existing catalogues/ (no rebuild)")
43
44
  .option("--sdd-path <path>", "Path to the SDD repo root (defaults to cwd)")
44
45
  .option("--strict", "Treat findings as failures")
46
+ .option("--coverage", "Coverage mode: run the engine coverage predicates instead (same lines the gate scripts printed; exit 0 — gating stays the baseline's job)")
47
+ .option("--tier <tier>", "Coverage tier, explicit never inferred (member | aggregate; default member)")
48
+ .option("--catalogues-dir <dir>", "Coverage mode: catalogues directory relative to the SDD root (default catalogues)")
45
49
  .action(async (opts) => {
50
+ if (opts.coverage === true) {
51
+ if (opts.tier !== undefined &&
52
+ opts.tier !== "member" &&
53
+ opts.tier !== "aggregate") {
54
+ process.stderr.write(`--tier must be 'member' or 'aggregate' (got: ${opts.tier})\n`);
55
+ process.exit(2);
56
+ }
57
+ const result = await runCatalogueCoverage({
58
+ ...(opts.sddPath !== undefined ? { sddPath: opts.sddPath } : {}),
59
+ ...(opts.cataloguesDir !== undefined
60
+ ? { cataloguesDir: opts.cataloguesDir }
61
+ : {}),
62
+ ...(opts.tier !== undefined
63
+ ? { tier: opts.tier }
64
+ : {}),
65
+ }, (s) => process.stdout.write(s));
66
+ if (result.exitCode !== 0)
67
+ process.exit(result.exitCode);
68
+ return;
69
+ }
46
70
  const result = await runCatalogueValidate({
47
71
  ...(opts.sddPath !== undefined ? { sddPath: opts.sddPath } : {}),
48
72
  ...(opts.strict !== undefined ? { strict: opts.strict } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"catalogue.js","sourceRoot":"","sources":["../../src/verbs/catalogue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalogue.js","sourceRoot":"","sources":["../../src/verbs/catalogue.ts"],"names":[],"mappings":"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"}