@bragi-gmbh/codebus 1.4.0 → 1.6.1

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 (146) hide show
  1. package/dist/ci-hooks/ci-hooks.js +126 -0
  2. package/dist/ci-hooks/ci-hooks.js.map +1 -0
  3. package/dist/commands/adr.js +30 -0
  4. package/dist/commands/adr.js.map +1 -0
  5. package/dist/commands/agent.js +175 -0
  6. package/dist/commands/agent.js.map +1 -0
  7. package/dist/commands/as.js +1 -1
  8. package/dist/commands/as.js.map +1 -1
  9. package/dist/commands/ask.js +1 -1
  10. package/dist/commands/ask.js.map +1 -1
  11. package/dist/commands/checkin.js +1 -1
  12. package/dist/commands/checkin.js.map +1 -1
  13. package/dist/commands/ci-findings.js +129 -0
  14. package/dist/commands/ci-findings.js.map +1 -0
  15. package/dist/commands/ci-reply.js +117 -0
  16. package/dist/commands/ci-reply.js.map +1 -0
  17. package/dist/commands/ci-steer-escalate.js +65 -0
  18. package/dist/commands/ci-steer-escalate.js.map +1 -0
  19. package/dist/commands/cli-mcp-correlation.js +131 -0
  20. package/dist/commands/cli-mcp-correlation.js.map +1 -0
  21. package/dist/commands/connector-attach-detach.js +542 -0
  22. package/dist/commands/connector-attach-detach.js.map +1 -0
  23. package/dist/commands/connector.js +513 -0
  24. package/dist/commands/connector.js.map +1 -0
  25. package/dist/commands/contract.js +33 -0
  26. package/dist/commands/contract.js.map +1 -0
  27. package/dist/commands/correlation.js +194 -0
  28. package/dist/commands/correlation.js.map +1 -0
  29. package/dist/commands/decision.js +63 -0
  30. package/dist/commands/decision.js.map +1 -1
  31. package/dist/commands/digest.js +14 -3
  32. package/dist/commands/digest.js.map +1 -1
  33. package/dist/commands/do.js +127 -0
  34. package/dist/commands/do.js.map +1 -0
  35. package/dist/commands/factory-attention.js +106 -0
  36. package/dist/commands/factory-attention.js.map +1 -0
  37. package/dist/commands/factory-context-read.js +171 -0
  38. package/dist/commands/factory-context-read.js.map +1 -0
  39. package/dist/commands/factory-interventions.js +102 -0
  40. package/dist/commands/factory-interventions.js.map +1 -0
  41. package/dist/commands/factory.js +187 -0
  42. package/dist/commands/factory.js.map +1 -1
  43. package/dist/commands/github-login.js +109 -53
  44. package/dist/commands/github-login.js.map +1 -1
  45. package/dist/commands/graph-pull.js +130 -0
  46. package/dist/commands/graph-pull.js.map +1 -0
  47. package/dist/commands/graph.js +5 -1
  48. package/dist/commands/graph.js.map +1 -1
  49. package/dist/commands/inbox.js +7 -7
  50. package/dist/commands/inbox.js.map +1 -1
  51. package/dist/commands/ingest.js +1 -1
  52. package/dist/commands/ingest.js.map +1 -1
  53. package/dist/commands/init.js +10 -1
  54. package/dist/commands/init.js.map +1 -1
  55. package/dist/commands/install.js +1160 -55
  56. package/dist/commands/install.js.map +1 -1
  57. package/dist/commands/integration-ledger.js +81 -0
  58. package/dist/commands/integration-ledger.js.map +1 -0
  59. package/dist/commands/knowledge.js +194 -0
  60. package/dist/commands/knowledge.js.map +1 -0
  61. package/dist/commands/links.js +1 -1
  62. package/dist/commands/links.js.map +1 -1
  63. package/dist/commands/login.js +1 -1
  64. package/dist/commands/login.js.map +1 -1
  65. package/dist/commands/morning.js +50 -1
  66. package/dist/commands/morning.js.map +1 -1
  67. package/dist/commands/plan-compiler.js +260 -0
  68. package/dist/commands/plan-compiler.js.map +1 -0
  69. package/dist/commands/plan-lint.js +275 -0
  70. package/dist/commands/plan-lint.js.map +1 -0
  71. package/dist/commands/plan-score.js +203 -0
  72. package/dist/commands/plan-score.js.map +1 -0
  73. package/dist/commands/plan.js +481 -15
  74. package/dist/commands/plan.js.map +1 -1
  75. package/dist/commands/product-validity.js +168 -0
  76. package/dist/commands/product-validity.js.map +1 -0
  77. package/dist/commands/question.js +1 -1
  78. package/dist/commands/question.js.map +1 -1
  79. package/dist/commands/read-policy.js +131 -0
  80. package/dist/commands/read-policy.js.map +1 -0
  81. package/dist/commands/read.js +1 -1
  82. package/dist/commands/read.js.map +1 -1
  83. package/dist/commands/repo.js +106 -8
  84. package/dist/commands/repo.js.map +1 -1
  85. package/dist/commands/repository-protection.js +209 -0
  86. package/dist/commands/repository-protection.js.map +1 -0
  87. package/dist/commands/resolve.js +2 -2
  88. package/dist/commands/resolve.js.map +1 -1
  89. package/dist/commands/self-healing.js +26 -0
  90. package/dist/commands/self-healing.js.map +1 -0
  91. package/dist/commands/send.js +1 -1
  92. package/dist/commands/send.js.map +1 -1
  93. package/dist/commands/serial-merge.js +303 -0
  94. package/dist/commands/serial-merge.js.map +1 -0
  95. package/dist/commands/session.js +1 -1
  96. package/dist/commands/session.js.map +1 -1
  97. package/dist/commands/spend.js +31 -0
  98. package/dist/commands/spend.js.map +1 -0
  99. package/dist/commands/task.js +92 -1
  100. package/dist/commands/task.js.map +1 -1
  101. package/dist/commands/taxonomy.js +21 -0
  102. package/dist/commands/taxonomy.js.map +1 -0
  103. package/dist/commands/verify.js +77 -0
  104. package/dist/commands/verify.js.map +1 -0
  105. package/dist/config/self-healing-analysis.json +158 -0
  106. package/dist/errors.js +18 -4
  107. package/dist/errors.js.map +1 -1
  108. package/dist/execution/client.js +53 -0
  109. package/dist/execution/client.js.map +1 -0
  110. package/dist/execution/local.js +24 -0
  111. package/dist/execution/local.js.map +1 -0
  112. package/dist/execution/ssh.js +38 -0
  113. package/dist/execution/ssh.js.map +1 -0
  114. package/dist/graph.js +78 -16
  115. package/dist/graph.js.map +1 -1
  116. package/dist/index.js +40 -2
  117. package/dist/index.js.map +1 -1
  118. package/dist/json-lite.js +248 -0
  119. package/dist/json-lite.js.map +1 -0
  120. package/dist/knowledge-drift.js +40 -0
  121. package/dist/knowledge-drift.js.map +1 -0
  122. package/dist/lint/parallelism.js +414 -0
  123. package/dist/lint/parallelism.js.map +1 -0
  124. package/dist/mail-latency.js +11 -1
  125. package/dist/mail-latency.js.map +1 -1
  126. package/dist/mcp-ci-findings.js +31 -0
  127. package/dist/mcp-ci-findings.js.map +1 -0
  128. package/dist/mcp-correlation.js +290 -0
  129. package/dist/mcp-correlation.js.map +1 -0
  130. package/dist/mcp-factory-context-read.js +81 -0
  131. package/dist/mcp-factory-context-read.js.map +1 -0
  132. package/dist/mcp-registry.js +147 -1
  133. package/dist/mcp-registry.js.map +1 -1
  134. package/dist/mcp.js +94 -5
  135. package/dist/mcp.js.map +1 -1
  136. package/dist/openrouter-reservation-guard.js +97 -0
  137. package/dist/openrouter-reservation-guard.js.map +1 -0
  138. package/dist/self-healing-analysis-loader.js +150 -0
  139. package/dist/self-healing-analysis-loader.js.map +1 -0
  140. package/dist/sender.js +11 -9
  141. package/dist/sender.js.map +1 -1
  142. package/dist/toml-lite.js +546 -0
  143. package/dist/toml-lite.js.map +1 -0
  144. package/dist/version-check.js +23 -7
  145. package/dist/version-check.js.map +1 -1
  146. package/package.json +5 -3
@@ -0,0 +1,414 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { parse, YAMLParseError } from "yaml";
3
+ // Hermetic parallelism check for an execution manifest (ADR 0008; plan §0e).
4
+ // Ported from factory/dev01/~/plan-runs/phase2-triage/check-parallelism.py so the
5
+ // CLI and the triage loop score the same manifest identically. A manifest whose
6
+ // children form a chain is a plan defect regardless of prose quality.
7
+ //
8
+ // Thresholds (owner, 2026-09-17) — a manifest FAILS unless every one holds:
9
+ // wave 0 (children with no in-manifest dependency) >= 24
10
+ // dependency waves (distinct longest-path levels) <= 6
11
+ // critical path (max sum of max_minutes to a leaf) <= 6 h
12
+ // children per coordinator stage 4..10
13
+ // independent tracks (with at least one child) >= 3
14
+ //
15
+ // ADR 0008 isolation contract (same schema as the real execution manifests,
16
+ // com.bragi.contract.execution-manifest@0.5.0): every child declares
17
+ // own_worktree: true, own_pr: true and a non-empty allowed_paths list (P007);
18
+ // sibling children within one coordinator stage declare pairwise-disjoint
19
+ // allowed_paths and PR branches are unique across the manifest (P008).
20
+ // Both are waivable by the reasoned override like the numeric thresholds.
21
+ //
22
+ // A manifest may waive the five thresholds with an explicit, reasoned override:
23
+ // lint_overrides: { parallelism: { reason: "<why>" } }
24
+ // The override must carry a non-empty reason (a bare flag is ignored, so it can
25
+ // never be set by accident). Structural defects — a malformed manifest (P000)
26
+ // or a dependency cycle (P006) — are NOT waivable: they mean the input is not a
27
+ // well-formed DAG at all, so it is never scored.
28
+ //
29
+ // Structural contract (every violation is P000, checked before any scoring):
30
+ // tracks is an array; every track is an object with a non-empty string id
31
+ // (unique across the manifest, no '/' — stage keys are `trackId/stageId`) and
32
+ // a stages array; every stage is an object with a non-empty string id (unique
33
+ // within its track, no '/') and a children array; every child is an object
34
+ // with a non-empty string id (unique across the
35
+ // manifest), depends_on (when the key is present — an explicit null counts as present
36
+ // and is invalid; omit the key or use []) an array of non-empty strings, and
37
+ // max_minutes (same null rule) a finite number >= 0. Stage sizes are accounted
38
+ // per (track, stage) pair — with unique track and stage ids nothing can merge
39
+ // by id collision — and EVERY stage counts, so an empty stage is size 0 and
40
+ // trips P004 rather than disappearing. The tracks metric counts only tracks
41
+ // carrying at least one child: an empty track is not an independent track.
42
+ export const PARALLELISM_THRESHOLDS = {
43
+ minWave0: 24,
44
+ maxWaves: 6,
45
+ maxCriticalPathH: 6,
46
+ minChildrenPerStage: 4,
47
+ maxChildrenPerStage: 10,
48
+ minTracks: 3,
49
+ defaultChildMinutes: 75,
50
+ };
51
+ const text = (value) => (typeof value === "string" ? value : "");
52
+ const list = (value) => (Array.isArray(value) ? value : []);
53
+ const object = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
54
+ const num = (value) => (typeof value === "number" && Number.isFinite(value) ? value : undefined);
55
+ const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
56
+ // Codes waivable by an explicit reasoned override (the five ADR 0008 thresholds).
57
+ const WAIVABLE = new Set(["P001", "P002", "P003", "P004", "P005", "P007", "P008"]);
58
+ const emptyMetrics = () => ({
59
+ children: 0, tracks: 0, waves: 0, wave0: 0,
60
+ criticalPathMinutes: 0, criticalPathH: 0, wavesHist: {}, stageSizes: {},
61
+ });
62
+ function detectOverride(manifest) {
63
+ const reason = text(object(object(manifest.lint_overrides).parallelism).reason).trim();
64
+ return reason.length > 0 ? { overridden: true, reason } : { overridden: false };
65
+ }
66
+ const validMinutes = (value) => {
67
+ const mm = num(value);
68
+ return mm !== undefined && mm >= 0;
69
+ };
70
+ // Full structural pass BEFORE any scoring: a malformed document is never scored
71
+ // (and can therefore never be waived into a pass by an override).
72
+ function validateManifest(manifest) {
73
+ const findings = [];
74
+ const bad = (message, path) => findings.push({ code: "P000", message, path });
75
+ if (!Array.isArray(manifest.tracks)) {
76
+ bad("manifest.tracks must be an array of track objects", "tracks");
77
+ return findings;
78
+ }
79
+ const defaults = manifest.child_defaults;
80
+ if (defaults !== undefined) {
81
+ const mm = isObject(defaults) ? defaults.max_minutes : undefined;
82
+ if (!isObject(defaults) || (mm !== undefined && !validMinutes(mm))) {
83
+ bad("child_defaults must be an object with an optional non-negative numeric max_minutes (explicit null is invalid)", "child_defaults");
84
+ }
85
+ }
86
+ const childIds = new Set();
87
+ const trackIds = new Set();
88
+ for (const [ti, track] of manifest.tracks.entries()) {
89
+ const tp = `tracks[${ti}]`;
90
+ if (!isObject(track) || !text(track.id)) {
91
+ bad(`${tp} must be an object with a non-empty string id`, tp);
92
+ continue;
93
+ }
94
+ const trackId = text(track.id);
95
+ if (trackId.includes("/")) {
96
+ bad(`${tp}.id must not contain '/' — stage keys are trackId/stageId and must stay collision-free`, `${tp}.id`);
97
+ continue;
98
+ }
99
+ if (trackIds.has(trackId)) {
100
+ bad(`${tp}.id '${trackId}' is duplicated in the manifest`, `${tp}.id`);
101
+ continue;
102
+ }
103
+ trackIds.add(trackId);
104
+ if (!Array.isArray(track.stages)) {
105
+ bad(`${tp}.stages must be an array of stage objects`, `${tp}.stages`);
106
+ continue;
107
+ }
108
+ const stageIds = new Set();
109
+ for (const [si, stage] of track.stages.entries()) {
110
+ const sp = `${tp}.stages[${si}]`;
111
+ if (!isObject(stage) || !text(stage.id)) {
112
+ bad(`${sp} must be an object with a non-empty string id`, sp);
113
+ continue;
114
+ }
115
+ const stageId = text(stage.id);
116
+ if (stageId.includes("/")) {
117
+ bad(`${sp}.id must not contain '/' — stage keys are trackId/stageId and must stay collision-free`, `${sp}.id`);
118
+ continue;
119
+ }
120
+ if (stageIds.has(stageId)) {
121
+ bad(`${sp}.id '${stageId}' is duplicated within track '${trackId}'`, `${sp}.id`);
122
+ continue;
123
+ }
124
+ stageIds.add(stageId);
125
+ if (!Array.isArray(stage.children)) {
126
+ bad(`${sp}.children must be an array of child objects`, `${sp}.children`);
127
+ continue;
128
+ }
129
+ for (const [ci, child] of stage.children.entries()) {
130
+ const cpos = `${sp}.children[${ci}]`;
131
+ if (!isObject(child) || !text(child.id)) {
132
+ bad(`${cpos} must be an object with a non-empty string id`, cpos);
133
+ continue;
134
+ }
135
+ const id = text(child.id);
136
+ if (childIds.has(id)) {
137
+ bad(`${cpos}.id '${id}' is duplicated in the manifest`, `${cpos}.id`);
138
+ continue;
139
+ }
140
+ childIds.add(id);
141
+ const deps = child.depends_on;
142
+ if (deps !== undefined && (!Array.isArray(deps) || deps.some((dep) => typeof dep !== "string" || dep.length === 0))) {
143
+ bad(`${cpos}.depends_on must be an array of non-empty child ids (explicit null is invalid — omit the key or use [])`, `${cpos}.depends_on`);
144
+ }
145
+ const mm = child.max_minutes;
146
+ if (mm !== undefined && !validMinutes(mm)) {
147
+ bad(`${cpos}.max_minutes must be a non-negative number (explicit null is invalid — omit the key)`, `${cpos}.max_minutes`);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ return findings;
153
+ }
154
+ // Every stage is accounted — including empty ones (size 0, trips P004) — and keyed
155
+ // by (track, stage); track and stage ids are validated unique, so nothing can merge
156
+ // by id collision. Tracks carrying at least one child are counted: an empty track
157
+ // is not an independent execution track and must not satisfy `tracks >= 3`.
158
+ function collectChildren(manifest) {
159
+ const fallback = num(object(manifest.child_defaults).max_minutes);
160
+ const defaultMinutes = fallback !== undefined && fallback !== 0 ? fallback : PARALLELISM_THRESHOLDS.defaultChildMinutes;
161
+ const nodes = new Map();
162
+ const stageSizes = {};
163
+ let activeTracks = 0;
164
+ for (const track of list(manifest.tracks)) {
165
+ const t = object(track);
166
+ const trackId = text(t.id);
167
+ let trackChildren = 0;
168
+ for (const stage of list(t.stages)) {
169
+ const s = object(stage);
170
+ const key = `${trackId}/${text(s.id)}`;
171
+ stageSizes[key] = stageSizes[key] ?? 0;
172
+ for (const child of list(s.children)) {
173
+ const c = object(child);
174
+ const raw = num(c.max_minutes);
175
+ nodes.set(text(c.id), {
176
+ id: text(c.id),
177
+ minutes: raw !== undefined && raw !== 0 ? raw : defaultMinutes,
178
+ deps: list(c.depends_on).map(text).filter((dep) => dep.length > 0),
179
+ stageKey: key,
180
+ ownWorktree: c.own_worktree,
181
+ ownPr: c.own_pr,
182
+ allowedPaths: c.allowed_paths,
183
+ prBranch: isObject(c.pr) ? c.pr.branch : undefined,
184
+ });
185
+ stageSizes[key] += 1;
186
+ trackChildren += 1;
187
+ }
188
+ }
189
+ if (trackChildren > 0)
190
+ activeTracks += 1;
191
+ }
192
+ return { nodes, stageSizes, tracks: activeTracks };
193
+ }
194
+ // Iterative longest-path layering (Kahn). level(n) = 0 for roots else 1 + max(level(deps));
195
+ // cp(n) = minutes(n) + max(cp(deps)). Only in-manifest deps count as edges (unknown ids ignored,
196
+ // matching the reference). Any node left unresolved is part of a dependency cycle.
197
+ function layer(nodes) {
198
+ const level = new Map();
199
+ const cp = new Map();
200
+ const indegree = new Map();
201
+ const dependents = new Map();
202
+ for (const [id, node] of nodes) {
203
+ const known = node.deps.filter((dep) => nodes.has(dep));
204
+ indegree.set(id, known.length);
205
+ level.set(id, 0);
206
+ cp.set(id, node.minutes);
207
+ for (const dep of known) {
208
+ const bucket = dependents.get(dep);
209
+ if (bucket)
210
+ bucket.push(id);
211
+ else
212
+ dependents.set(dep, [id]);
213
+ }
214
+ }
215
+ const queue = [];
216
+ for (const [id, deg] of indegree)
217
+ if (deg === 0)
218
+ queue.push(id);
219
+ let processed = 0;
220
+ while (queue.length > 0) {
221
+ const id = queue.shift();
222
+ processed += 1;
223
+ for (const next of dependents.get(id) ?? []) {
224
+ level.set(next, Math.max(level.get(next), level.get(id) + 1));
225
+ cp.set(next, Math.max(cp.get(next), cp.get(id) + nodes.get(next).minutes));
226
+ const deg = indegree.get(next) - 1;
227
+ indegree.set(next, deg);
228
+ if (deg === 0)
229
+ queue.push(next);
230
+ }
231
+ }
232
+ const cyclic = processed < nodes.size ? [...nodes.keys()].filter((id) => indegree.get(id) > 0) : [];
233
+ return { level, cp, cyclic };
234
+ }
235
+ const segments = (path) => path.split("/").filter((part) => part.length > 0);
236
+ const isWildcard = (segment) => segment.includes("*") || segment.includes("?");
237
+ const literalPrefix = (path) => {
238
+ const out = [];
239
+ for (const segment of segments(path)) {
240
+ if (isWildcard(segment))
241
+ break;
242
+ out.push(segment);
243
+ }
244
+ return out;
245
+ };
246
+ // Two allowed_paths entries conflict when one can address the other's files: literal
247
+ // paths conflict when one is a segment-prefix of the other; a path containing a wildcard
248
+ // conflicts when the literal prefixes before the first wildcard are compatible. This is
249
+ // conservative for exotic globs (over-flags, never under-flags) and exact for the literal
250
+ // paths real manifests use.
251
+ export function pathsConflict(a, b) {
252
+ const A = literalPrefix(a);
253
+ const B = literalPrefix(b);
254
+ const n = Math.min(A.length, B.length);
255
+ for (let i = 0; i < n; i += 1)
256
+ if (A[i] !== B[i])
257
+ return false;
258
+ return true;
259
+ }
260
+ const validPaths = (value) => Array.isArray(value) && value.length > 0 && value.every((entry) => typeof entry === "string" && entry.trim().length > 0);
261
+ // ADR 0008: children depend on contract versions, not siblings; shared resources are split
262
+ // into disjoint files; every child has its own worktree and PR.
263
+ function isolationFindings(nodes) {
264
+ const findings = [];
265
+ const cap = (items) => `${items.slice(0, 8).join(", ")}${items.length > 8 ? ", …" : ""}`;
266
+ const missingMeta = [];
267
+ for (const node of nodes.values()) {
268
+ if (node.ownWorktree !== true || node.ownPr !== true || !validPaths(node.allowedPaths))
269
+ missingMeta.push(node.id);
270
+ }
271
+ if (missingMeta.length > 0) {
272
+ findings.push({
273
+ code: "P007",
274
+ message: `children without own_worktree: true, own_pr: true and a non-empty allowed_paths list: ${cap(missingMeta)}`,
275
+ path: "tracks[].stages[].children[]",
276
+ });
277
+ }
278
+ const conflicts = [];
279
+ const byStage = new Map();
280
+ for (const node of nodes.values()) {
281
+ const bucket = byStage.get(node.stageKey);
282
+ if (bucket)
283
+ bucket.push(node);
284
+ else
285
+ byStage.set(node.stageKey, [node]);
286
+ }
287
+ for (const [stageKey, kids] of byStage) {
288
+ for (let i = 0; i < kids.length; i += 1) {
289
+ for (let j = i + 1; j < kids.length; j += 1) {
290
+ const rawA = kids[i].allowedPaths;
291
+ const rawB = kids[j].allowedPaths;
292
+ const pathsA = validPaths(rawA) ? rawA : [];
293
+ const pathsB = validPaths(rawB) ? rawB : [];
294
+ for (const a of pathsA) {
295
+ for (const b of pathsB) {
296
+ if (pathsConflict(a, b))
297
+ conflicts.push(`${stageKey}: ${kids[i].id}[${a}] x ${kids[j].id}[${b}]`);
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
303
+ const branches = new Map();
304
+ for (const node of nodes.values()) {
305
+ if (typeof node.prBranch !== "string" || node.prBranch.length === 0)
306
+ continue;
307
+ const owner = branches.get(node.prBranch);
308
+ if (owner)
309
+ conflicts.push(`pr.branch '${node.prBranch}' shared by ${owner} and ${node.id}`);
310
+ else
311
+ branches.set(node.prBranch, node.id);
312
+ }
313
+ if (conflicts.length > 0) {
314
+ findings.push({
315
+ code: "P008",
316
+ message: `children in a stage must declare disjoint allowed_paths and own their PR branch: ${cap(conflicts)}`,
317
+ path: "tracks[].stages[].children[].allowed_paths",
318
+ });
319
+ }
320
+ return findings;
321
+ }
322
+ export function lintParallelism(source) {
323
+ if (!isObject(source)) {
324
+ return {
325
+ metrics: emptyMetrics(),
326
+ findings: [{ code: "P000", message: "execution manifest must be a YAML object with tracks[]" }],
327
+ overridden: false,
328
+ };
329
+ }
330
+ const manifest = source;
331
+ const { overridden, reason } = detectOverride(manifest);
332
+ const structural = validateManifest(manifest);
333
+ if (structural.length > 0) {
334
+ // Never scored, never waivable: a malformed document is not an execution manifest.
335
+ // The override (if any) is reported for transparency but cannot affect the verdict.
336
+ return { metrics: emptyMetrics(), findings: structural, overridden, ...(reason ? { overrideReason: reason } : {}) };
337
+ }
338
+ const { nodes, stageSizes, tracks } = collectChildren(manifest);
339
+ const { level, cp, cyclic } = layer(nodes);
340
+ const findings = [];
341
+ if (cyclic.length > 0) {
342
+ findings.push({
343
+ code: "P006",
344
+ message: `depends_on contains a cycle among children: ${cyclic.slice(0, 8).join(", ")}${cyclic.length > 8 ? ", …" : ""}`,
345
+ path: "tracks[].stages[].children[].depends_on",
346
+ });
347
+ }
348
+ const wavesHist = {};
349
+ for (const lvl of level.values())
350
+ wavesHist[lvl] = (wavesHist[lvl] ?? 0) + 1;
351
+ const wave0 = wavesHist[0] ?? 0;
352
+ const waves = Object.keys(wavesHist).length;
353
+ let criticalPathMinutes = 0;
354
+ for (const value of cp.values())
355
+ criticalPathMinutes = Math.max(criticalPathMinutes, value);
356
+ const criticalPathH = criticalPathMinutes / 60;
357
+ const metrics = {
358
+ children: nodes.size, tracks, waves, wave0,
359
+ criticalPathMinutes, criticalPathH, wavesHist, stageSizes,
360
+ };
361
+ const t = PARALLELISM_THRESHOLDS;
362
+ if (wave0 < t.minWave0)
363
+ findings.push({ code: "P001", message: `wave0 ${wave0} < ${t.minWave0}`, path: "tracks[].stages[].children[]" });
364
+ if (waves > t.maxWaves)
365
+ findings.push({ code: "P002", message: `waves ${waves} > ${t.maxWaves}` });
366
+ if (criticalPathH > t.maxCriticalPathH)
367
+ findings.push({ code: "P003", message: `critical path ${criticalPathH.toFixed(1)}h > ${t.maxCriticalPathH}h` });
368
+ const badStages = Object.entries(stageSizes).filter(([, n]) => n < t.minChildrenPerStage || n > t.maxChildrenPerStage);
369
+ if (badStages.length > 0) {
370
+ const shown = badStages.map(([stage, n]) => `${stage}=${n}`).join(", ");
371
+ findings.push({ code: "P004", message: `stages outside ${t.minChildrenPerStage}-${t.maxChildrenPerStage} children: ${shown}`, path: "tracks[].stages[]" });
372
+ }
373
+ if (tracks < t.minTracks)
374
+ findings.push({ code: "P005", message: `tracks ${tracks} < ${t.minTracks}`, path: "tracks" });
375
+ findings.push(...isolationFindings(nodes));
376
+ return { metrics, findings, overridden, ...(reason ? { overrideReason: reason } : {}) };
377
+ }
378
+ export function lintParallelismFile(path) {
379
+ let source;
380
+ try {
381
+ // Real execution manifests reuse YAML anchors heavily (source/process/authority blocks
382
+ // aliased into every child, child_defaults merged into every child via `<<`); the library
383
+ // default (100 expanded aliases) rejects them and this library does not expand `<<` merge
384
+ // keys unless asked, while the PyYAML-based reference does both. Keep a generous finite
385
+ // alias cap so the guard against alias-expansion bombs stays intact.
386
+ source = parse(readFileSync(path, "utf8"), { maxAliasCount: 100_000, merge: true });
387
+ }
388
+ catch (error) {
389
+ const message = error instanceof YAMLParseError ? `invalid YAML: ${error.message}` : `cannot read YAML: ${String(error)}`;
390
+ return {
391
+ verdict: "fail", overridden: false, metrics: emptyMetrics(),
392
+ findings: [{ code: "P000", message }], path,
393
+ };
394
+ }
395
+ const report = lintParallelism(source);
396
+ return { ...report, verdict: verdictOf(report), path };
397
+ }
398
+ // Structural findings (P000 malformed manifest, P006 cycle) always fail and are never waivable.
399
+ // Threshold findings (P001-P005, P007, P008) fail unless an explicit reasoned override is present.
400
+ export function verdictOf(report) {
401
+ const structural = report.findings.some((finding) => !WAIVABLE.has(finding.code));
402
+ const threshold = report.findings.some((finding) => WAIVABLE.has(finding.code));
403
+ if (structural)
404
+ return "fail";
405
+ return threshold && !report.overridden ? "fail" : "pass";
406
+ }
407
+ export function formatParallelism(report) {
408
+ const m = report.metrics;
409
+ const hist = Object.entries(m.wavesHist).sort((a, b) => Number(a[0]) - Number(b[0]))
410
+ .map(([lvl, n]) => `${lvl}:${n}`).join(" ");
411
+ return `children=${m.children} tracks=${m.tracks} waves=${m.waves} wave0=${m.wave0} ` +
412
+ `critical_path_h=${m.criticalPathH.toFixed(1)} waves_hist={${hist}}`;
413
+ }
414
+ //# sourceMappingURL=parallelism.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallelism.js","sourceRoot":"","sources":["../../src/lint/parallelism.ts"],"names":[],"mappings":"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"}
@@ -10,10 +10,20 @@ import { readFileSync } from "node:fs";
10
10
  import { homedir } from "node:os";
11
11
  import { join } from "node:path";
12
12
  import { workspaceId } from "./client.js";
13
+ // Luna finding: this used a serialized substring check
14
+ // (JSON.stringify(...).includes("codebus tick")) over the WHOLE Stop array —
15
+ // the exact antipattern hookEventHasCommand (below) exists to replace, and
16
+ // which install.ts's own installClaude()/installCodexHooks() had already
17
+ // migrated away from for the same reason: any unrelated hook whose
18
+ // description, argument, or command merely CONTAINS "codebus tick" makes
19
+ // this report `true` when turn-boundary mail surfacing is not actually
20
+ // wired — doctor claims bounded delivery, checkin skips its watch fallback,
21
+ // and nothing ever pulls new mail. Now delegates to hookEventHasCommand for
22
+ // the same exact command-field match installCodex's detection path uses.
13
23
  export function stopHookInstalled() {
14
24
  try {
15
25
  const s = JSON.parse(readFileSync(join(homedir(), ".claude", "settings.json"), "utf8"));
16
- return JSON.stringify(s?.hooks?.Stop ?? []).includes("codebus tick");
26
+ return hookEventHasCommand(s?.hooks?.Stop, "codebus tick --hook");
17
27
  }
18
28
  catch {
19
29
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"mail-latency.js","sourceRoot":"","sources":["../src/mail-latency.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mail-latency.js","sourceRoot":"","sources":["../src/mail-latency.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,qEAAqE;AACrE,qEAAqE;AACrE,yEAAyE;AACzE,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAY,MAAM,aAAa,CAAC;AAEpD,uDAAuD;AACvD,6EAA6E;AAC7E,2EAA2E;AAC3E,yEAAyE;AACzE,mEAAmE;AACnE,yEAAyE;AACzE,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACxF,OAAO,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,+EAA+E;AAC/E,+EAA+E;AAC/E,+EAA+E;AAC/E,0EAA0E;AAC1E,0EAA0E;AAC1E,+EAA+E;AAC/E,4EAA4E;AAC5E,6DAA6D;AAC7D,iFAAiF;AACjF,gFAAgF;AAChF,kFAAkF;AAClF,gFAAgF;AAChF,kFAAkF;AAClF,0EAA0E;AAC1E,6EAA6E;AAC7E,iEAAiE;AACjE,MAAM,UAAU,mBAAmB,CAAC,SAAkB,EAAE,GAAW;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,SAAS,CAAC,IAAI,CACnB,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,KAA6B,CAAC,KAAK,CAAC;QAC1F,KAA8B,CAAC,KAAK,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAC3B,CAAwB,CAAC,IAAI,KAAK,SAAS;YAC3C,CAA2B,CAAC,OAAO,KAAK,GAAG,CAC/C,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACpF,OAAO,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,0EAA0E;AAC1E,6EAA6E;AAC7E,4EAA4E;AAC5E,yEAAyE;AACzE,6EAA6E;AAC7E,2EAA2E;AAC3E,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAClC,CAAC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,mEAAmE;AACnE,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,oEAAoE;AACpE,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AACvC,CAAC;AAED,6EAA6E;AAC7E,iFAAiF;AACjF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAErD,2EAA2E;AAC3E,0EAA0E;AAC1E,0EAA0E;AAC1E,4EAA4E;AAC5E,6EAA6E;AAC7E,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAQ,EAAE,WAAW,GAAG,sBAAsB;IACrF,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ;aAChC,IAAI,CAAC,aAAa,CAAC;aACnB,MAAM,CAAC,gCAAgC,CAAC;aACxC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;aACnB,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;aACtB,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,SAAS,CAAC;aAChC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;aACzC,KAAK,CAAC,CAAC,CAAC,CAAC;QACZ,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAuC,CAAC;QAClE,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,2EAA2E;AAC3E,0EAA0E;AAC1E,6EAA6E;AAC7E,wEAAwE;AACxE,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAoB;IAC5D,MAAM,OAAO,GAAG,CAAC,mBAAmB,EAAE,IAAI,iBAAiB,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAC9G,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,OAAO,EAAE,EAAE,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAC/B,iHAAiH;IACjH,mGAAmG;IACnG,yFAAyF,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * MCP transport for CI findings — parity wrapper over the CLI command core.
3
+ *
4
+ * Implements the CLI/MCP parity rule: this module contains NO independent
5
+ * finding logic; it delegates to ./commands/ci-findings.js so CLI and MCP
6
+ * return identical findings for identical inputs.
7
+ */
8
+ import { listFindings, parseFindings, validateFinding, } from "./commands/ci-findings.js";
9
+ /** MCP tool handler: parse payload text, run the shared core, return structured result. */
10
+ export function mcpCiFindingsList(payloadText, opts = {}) {
11
+ const findings = parseFindings(payloadText);
12
+ return listFindings(findings, opts);
13
+ }
14
+ /** MCP tool handler: validate a single finding. */
15
+ export function mcpCiFindingValidate(finding) {
16
+ const errors = validateFinding(finding);
17
+ return { valid: errors.length === 0, errors };
18
+ }
19
+ export const MCP_CI_FINDINGS_TOOL = {
20
+ name: "ci_findings_list",
21
+ description: "List CI findings (ci_finding work-orders). Same core as the ci-findings CLI command.",
22
+ inputSchema: {
23
+ type: "object",
24
+ properties: {
25
+ findings: { type: "array", description: "Array of ci-finding v1 objects" },
26
+ kind: { type: "string", description: "Filter by kind" },
27
+ next_action: { type: "string", description: "Filter by next_action" },
28
+ },
29
+ },
30
+ };
31
+ //# sourceMappingURL=mcp-ci-findings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-ci-findings.js","sourceRoot":"","sources":["../src/mcp-ci-findings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAGL,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,2BAA2B,CAAC;AASnC,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,OAA0B,EAAE;IACjF,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,sFAAsF;IACnG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gCAAgC,EAAE;YAC1E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;YACvD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;SACtE;KACF;CACO,CAAC"}