@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,513 @@
1
+ /**
2
+ * connector.ts — Self-healing ticket connector: human-readable Jira evidence reference
3
+ *
4
+ * Phase 2 v16 child: com.bragi.work.bcode-phase2.self-healing-ticket
5
+ * PROD section: OUT-self-healing-ticket (REPROD-2160, bcode 0.12.0-proposed)
6
+ * ADRs applied: 0007 (plan standard thresholds), 0010 (connector adapters),
7
+ * 0012 (reviews as rule sets / >= 3 models), 0013 (leases and blast radius).
8
+ *
9
+ * Contracts consumed: com.bragi.contract.self-healing-reference@0.5.0-proposed
10
+ * Contracts produced: com.bragi.contract.execution-receipt@0.5.0-proposed (ticket step)
11
+ *
12
+ * Depends on: com.bragi.work.bcode-phase2.self-healing-analysis
13
+ * (three independent maximum-context models: reasoning, research, executor)
14
+ *
15
+ * Flow: Analyzer (3-model) -> Ticket -> Fixer. This child creates the
16
+ * human-readable Jira ticket that *references* CodeBus evidence. Evidence
17
+ * itself stays in CodeBus, never pasted into Jira (owner statement
18
+ * factory/dev01/plans/phase2-package/owner-statements/gercho-self-healing.md §1-2).
19
+ *
20
+ * ADR-0012 binding: this step is a DECISION point. It MUST receive an
21
+ * analysis_id referencing a completed 3-model (reasoning+research+executor)
22
+ * analysis from the self-healing-analysis dependency. Without it, ticket
23
+ * creation refuses — a single-agent decision is forbidden.
24
+ *
25
+ * This module follows the repository-protection.ts pattern: pure functions
26
+ * for logic + an injectable store interface for I/O, so unit tests run
27
+ * without a database.
28
+ *
29
+ * Standing reviewer rules enforced (ADR-0012):
30
+ * 1. Validate null/absent fields explicitly — never assume a field is present.
31
+ * 2. Never silently drop unknown ids — preserve all evidence refs and analysis ids.
32
+ * 3. Idempotency lookups BEFORE policy checks on retry paths — an existing
33
+ * ticket is returned immediately without re-running validation that could
34
+ * reject a retry.
35
+ */
36
+ import { resolveConfig } from "../config.js";
37
+ import { makeCtx, workspaceId } from "../client.js";
38
+ import { render } from "../output.js";
39
+ import { CodebusError } from "../errors.js";
40
+ // ── PROD binding ──────────────────────────────────────────────────────
41
+ // From child record: prod_binding.section_id = OUT-self-healing-ticket
42
+ export const SELF_HEALING_TICKET_BINDING = {
43
+ child_id: "com.bragi.work.bcode-phase2.self-healing-ticket",
44
+ product_id: "REPROD-2160",
45
+ product_name: "bcode",
46
+ version: "0.12.0-proposed",
47
+ section_id: "OUT-self-healing-ticket",
48
+ source_path: "docs/human/platform/products/com.bragi.product.bcode/v0.12.0/spec.md",
49
+ adrs_applied: ["ADR-0007", "ADR-0010", "ADR-0012", "ADR-0013"],
50
+ };
51
+ // ── Finite bounds (standing reviewer rule: no unbounded accumulation) ──
52
+ export const MAX_SUMMARY_LENGTH = 200;
53
+ export const MAX_DESCRIPTION_LENGTH = 4000;
54
+ export const MAX_EVIDENCE_REFS = 50;
55
+ // ── Pure functions (no I/O — fully testable) ──────────────────────────
56
+ /**
57
+ * Patterns that indicate rich machine evidence being pasted into a
58
+ * human-readable ticket field. Evidence stays in CodeBus, never pasted
59
+ * into Jira (owner statement factory/dev01/plans/phase2-package/
60
+ * owner-statements/gercho-self-healing.md §1-2, ADR-0010).
61
+ */
62
+ const MACHINE_EVIDENCE_PATTERNS = [
63
+ // `{` at start → JSON object. `[` followed by " { [ digit → JSON array.
64
+ // `[` followed by a letter (e.g. "[Self-Healing]") is human-readable.
65
+ { name: "json_object_start", regex: /^\s*\{/ },
66
+ { name: "json_array_start", regex: /^\s*\[["\{\[\d]/ },
67
+ { name: "traceback", regex: /traceback/i },
68
+ { name: "stack_trace", regex: /stack_trace/i },
69
+ { name: "code_path_ref", regex: /\bat\s+\/[^:]+:\d+:\d+/ },
70
+ { name: "file_line_ref", regex: /\bat\s+\.{3}|\.js:\d+|\.py:\d+|\.ts:\d+/ },
71
+ { name: "analysis_by_model", regex: /analysis_by_model/i },
72
+ { name: "consensus_recommendation", regex: /consensus_recommendation/i },
73
+ { name: "proposed_repair", regex: /proposed_repair/i },
74
+ { name: "model_set", regex: /model_set/i },
75
+ { name: "context_model", regex: /context_model/i },
76
+ { name: "repair_strategy", regex: /repair_strategy/i },
77
+ { name: "stage_\d", regex: /stage_\d+_evidence_collection/i },
78
+ ];
79
+ /**
80
+ * Detect whether text contains rich machine evidence that must never be
81
+ * pasted into a Jira ticket.
82
+ *
83
+ * ADR-0012 standing reviewer rule: validate null/absent fields explicitly.
84
+ */
85
+ export function looksLikeMachineEvidence(text) {
86
+ if (text === null || text === undefined)
87
+ return false;
88
+ const trimmed = text.trim();
89
+ if (trimmed.length === 0)
90
+ return false;
91
+ for (const { regex } of MACHINE_EVIDENCE_PATTERNS) {
92
+ if (regex.test(trimmed))
93
+ return true;
94
+ }
95
+ // Detect JSON-like key-value dumps: 5+ "key": value pairs on one line
96
+ const jsonKeyCount = (trimmed.match(/"[\w_]+":\s*["\{\[]/g) || []).length;
97
+ if (jsonKeyCount >= 5)
98
+ return true;
99
+ return false;
100
+ }
101
+ /**
102
+ * Compute a deterministic digest from evidence references (FNV-1a variant).
103
+ * Same references always yield the same digest — preserves all ref ids
104
+ * and never silently drops any (ADR-0012 standing reviewer rule 2).
105
+ */
106
+ export function computeEvidenceDigest(references) {
107
+ if (!Array.isArray(references))
108
+ return "00000000";
109
+ if (references.length === 0)
110
+ return "00000000";
111
+ // Sort to make digest order-independent (preserve all ids, never drop)
112
+ const serialized = [...references]
113
+ .map((r) => `${r.source || "?"}:${r.ref_id || "?"}:${r.snapshot_sha256 || ""}`)
114
+ .sort()
115
+ .join("|");
116
+ let hash = 0x811c9dc5;
117
+ for (let i = 0; i < serialized.length; i++) {
118
+ hash ^= serialized.charCodeAt(i);
119
+ hash = (hash * 0x01000193) >>> 0;
120
+ }
121
+ return hash.toString(16).padStart(8, "0");
122
+ }
123
+ /**
124
+ * Compute a deterministic idempotency key from issue + evidence digest.
125
+ * Same analysis input always yields the same key → one ticket per issue.
126
+ *
127
+ * ADR-0012: decisions require >= 3 models with maximum context. The
128
+ * analysis_id parameter records which 3-model analysis produced this ticket.
129
+ */
130
+ export function computeIdempotencyKey(issueId, component, team, evidenceDigest, analysisId) {
131
+ if (!issueId || issueId.trim().length === 0) {
132
+ throw new CodebusError("issue_id is required for idempotency key computation");
133
+ }
134
+ if (!evidenceDigest || evidenceDigest.trim().length === 0) {
135
+ throw new CodebusError("evidence digest is required for idempotency key computation");
136
+ }
137
+ if (!analysisId || analysisId.trim().length === 0) {
138
+ throw new CodebusError("analysis_id is required for idempotency key computation (ADR-0012: 3-model analysis)");
139
+ }
140
+ const parts = ["sh", component, team, issueId, evidenceDigest, analysisId.trim()];
141
+ return parts.join("-").slice(0, 255);
142
+ }
143
+ /**
144
+ * Build a CodeBus evidence URI reference (not the evidence itself).
145
+ * The evidence stays in CodeBus; the ticket only holds this pointer.
146
+ */
147
+ export function buildEvidenceUri(issueId, evidenceDigest) {
148
+ return `codebus://evidence/phase2/self-healing-ticket/${issueId}/${evidenceDigest}`;
149
+ }
150
+ /** Build a CodeBus ticket URI reference for the created ticket. */
151
+ export function buildTicketUri(ticketId) {
152
+ return `codebus://ticket/${ticketId}`;
153
+ }
154
+ /**
155
+ * Build a human-readable ticket title from the analysis input.
156
+ * Never includes raw machine evidence (owner: "evidence itself stays in
157
+ * CodeBus, never pasted into Jira").
158
+ *
159
+ * ADR-0012: validate null/absent fields explicitly.
160
+ */
161
+ export function buildTicketTitle(input) {
162
+ if (input.title !== undefined && input.title !== null) {
163
+ const t = String(input.title);
164
+ if (t.trim().length === 0) {
165
+ throw new CodebusError("title must not be empty if provided");
166
+ }
167
+ if (t.length > MAX_SUMMARY_LENGTH) {
168
+ throw new CodebusError(`ticket title exceeds ${MAX_SUMMARY_LENGTH} characters`);
169
+ }
170
+ if (looksLikeMachineEvidence(t)) {
171
+ throw new CodebusError("ticket title contains machine evidence; evidence stays in CodeBus, never pasted into Jira");
172
+ }
173
+ return t;
174
+ }
175
+ const source = (input.issue_type || "unknown").trim();
176
+ const title = `[Self-Healing] [${source.toUpperCase()}] ${input.component} (team: ${input.team})`;
177
+ if (title.length > MAX_SUMMARY_LENGTH) {
178
+ return title.slice(0, MAX_SUMMARY_LENGTH);
179
+ }
180
+ return title;
181
+ }
182
+ /**
183
+ * Build a human-readable ticket description with evidence references
184
+ * (pointers only, never the evidence itself).
185
+ *
186
+ * ADR-0012: validate null/absent fields explicitly.
187
+ * ADR-0010: connector is an adapter — evidence reference, not paste.
188
+ */
189
+ export function buildTicketDescription(input) {
190
+ if (input.description !== undefined && input.description !== null) {
191
+ const d = String(input.description);
192
+ if (d.trim().length === 0) {
193
+ throw new CodebusError("description must not be empty if provided");
194
+ }
195
+ if (d.length > MAX_DESCRIPTION_LENGTH) {
196
+ throw new CodebusError(`ticket description exceeds ${MAX_DESCRIPTION_LENGTH} characters`);
197
+ }
198
+ if (looksLikeMachineEvidence(d)) {
199
+ throw new CodebusError("ticket description contains machine evidence; evidence stays in CodeBus, never pasted into Jira");
200
+ }
201
+ return d;
202
+ }
203
+ const digest = computeEvidenceDigest(input.evidence_references);
204
+ const evidenceUri = buildEvidenceUri(input.issue_id, digest);
205
+ const lines = [];
206
+ lines.push("## Self-healing ticket");
207
+ lines.push("");
208
+ lines.push(`Issue type: ${input.issue_type ?? "unknown"}`);
209
+ lines.push(`Component: ${input.component}`);
210
+ lines.push(`Team: ${input.team}`);
211
+ lines.push(`Candidate ID: ${input.issue_id}`);
212
+ lines.push("");
213
+ // Evidence references — pointers only, never the evidence itself
214
+ if (input.evidence_references && input.evidence_references.length > 0) {
215
+ lines.push(`Evidence references (${input.evidence_references.length} total, stored in CodeBus):`);
216
+ for (const ref of input.evidence_references) {
217
+ const digest8 = (ref.snapshot_sha256 || "").slice(0, 8) || "unknown";
218
+ lines.push(`- [${ref.source}] ${ref.ref_id} (digest: ${digest8})`);
219
+ }
220
+ lines.push("");
221
+ }
222
+ // ADR-0012: acknowledge the 3-model analysis that produced this ticket
223
+ // analysis_id is required (see validateTicketInput), so always present.
224
+ lines.push(`Analysis: ${input.analysis_id.trim()} (three independent maximum-context models: reasoning, research, executor)`);
225
+ if (input.consensus_level !== undefined && input.consensus_level !== null) {
226
+ lines.push(`Consensus level: ${input.consensus_level}`);
227
+ }
228
+ if (input.escalation_required === true) {
229
+ lines.push("**ESCALATION REQUIRED** — human review needed");
230
+ }
231
+ lines.push("");
232
+ lines.push(`Evidence URI: ${evidenceUri}`);
233
+ lines.push("");
234
+ lines.push("All machine-readable evidence is referenced by pointer in CodeBus.");
235
+ lines.push("This ticket is the human-readable reference step (OUT-self-healing-ticket, REPROD-2160).");
236
+ return lines.join("\n");
237
+ }
238
+ /**
239
+ * Validate input fields explicitly (ADR-0012: validate null/absent fields).
240
+ * Throws CodebusError listing all problems.
241
+ */
242
+ export function validateTicketInput(input) {
243
+ const errors = [];
244
+ // Required string fields
245
+ if (input.issue_id === undefined || input.issue_id === null || typeof input.issue_id !== "string" || input.issue_id.trim().length === 0) {
246
+ errors.push("issue_id is required and must be a non-empty string");
247
+ }
248
+ if (input.issue_type === undefined || input.issue_type === null || typeof input.issue_type !== "string" || input.issue_type.trim().length === 0) {
249
+ errors.push("issue_type is required and must be a non-empty string");
250
+ }
251
+ if (input.component === undefined || input.component === null || typeof input.component !== "string" || input.component.trim().length === 0) {
252
+ errors.push("component is required and must be a non-empty string");
253
+ }
254
+ if (input.team === undefined || input.team === null || typeof input.team !== "string" || input.team.trim().length === 0) {
255
+ errors.push("team is required and must be a non-empty string");
256
+ }
257
+ // ADR-0012: analysis_id is REQUIRED — decisions need >= 3 models
258
+ if (input.analysis_id === undefined || input.analysis_id === null || typeof input.analysis_id !== "string" || input.analysis_id.trim().length === 0) {
259
+ errors.push("analysis_id is required: ticket creation requires a 3-model analysis reference (ADR-0012) — never a single-agent decision");
260
+ }
261
+ // Evidence references
262
+ if (input.evidence_references === undefined || input.evidence_references === null) {
263
+ errors.push("evidence_references is required");
264
+ }
265
+ else if (!Array.isArray(input.evidence_references)) {
266
+ errors.push("evidence_references must be an array");
267
+ }
268
+ else {
269
+ if (input.evidence_references.length === 0) {
270
+ errors.push("at least one evidence reference is required");
271
+ }
272
+ if (input.evidence_references.length > MAX_EVIDENCE_REFS) {
273
+ errors.push(`evidence_references exceeds maximum of ${MAX_EVIDENCE_REFS}`);
274
+ }
275
+ for (let i = 0; i < input.evidence_references.length; i++) {
276
+ const ref = input.evidence_references[i];
277
+ if (ref === null || ref === undefined || typeof ref !== "object") {
278
+ errors.push(`evidence_references[${i}] is not an object`);
279
+ continue;
280
+ }
281
+ // Never silently drop unknown source IDs (ADR-0012, standing reviewer rule 2)
282
+ if (ref.source === undefined || ref.source === null || typeof ref.source !== "string" || ref.source.trim().length === 0) {
283
+ errors.push(`evidence_references[${i}].source is required`);
284
+ }
285
+ if (ref.ref_id === undefined || ref.ref_id === null || typeof ref.ref_id !== "string" || ref.ref_id.trim().length === 0) {
286
+ errors.push(`evidence_references[${i}].ref_id is required`);
287
+ }
288
+ // snapshot_sha256 may be explicitly null — validate if present and non-null
289
+ if (ref.snapshot_sha256 !== undefined && ref.snapshot_sha256 !== null) {
290
+ if (typeof ref.snapshot_sha256 !== "string") {
291
+ errors.push(`evidence_references[${i}].snapshot_sha256 must be a string or null`);
292
+ }
293
+ }
294
+ }
295
+ }
296
+ // Optional fields
297
+ if (input.title !== undefined && input.title !== null) {
298
+ if (typeof input.title !== "string")
299
+ errors.push("title must be a string if provided");
300
+ }
301
+ if (input.description !== undefined && input.description !== null) {
302
+ if (typeof input.description !== "string")
303
+ errors.push("description must be a string if provided");
304
+ }
305
+ if (input.assignee !== undefined && input.assignee !== null) {
306
+ if (typeof input.assignee !== "string" || input.assignee.trim().length === 0) {
307
+ errors.push("assignee must be a non-empty string if provided");
308
+ }
309
+ }
310
+ if (input.project_key !== undefined && input.project_key !== null) {
311
+ if (typeof input.project_key !== "string" || input.project_key.trim().length === 0) {
312
+ errors.push("project_key must be a non-empty string if provided");
313
+ }
314
+ }
315
+ if (input.consensus_level !== undefined && input.consensus_level !== null) {
316
+ if (!["high", "medium", "low"].includes(input.consensus_level)) {
317
+ errors.push("consensus_level must be 'high', 'medium', or 'low'");
318
+ }
319
+ }
320
+ if (input.escalation_required !== undefined && input.escalation_required !== null) {
321
+ if (typeof input.escalation_required !== "boolean") {
322
+ errors.push("escalation_required must be a boolean");
323
+ }
324
+ }
325
+ return errors;
326
+ }
327
+ // ── Core: idempotent ticket creation ──────────────────────────────────
328
+ /**
329
+ * Create or retrieve an idempotent self-healing ticket.
330
+ *
331
+ * ADR-0012 standing reviewer rule: idempotency lookups BEFORE policy checks
332
+ * on retry paths. If a ticket already exists for this candidate+evidence,
333
+ * it is returned immediately without re-running policy validation. This
334
+ * prevents a timed-out request retried by the caller from being rejected
335
+ * by policy and then causing a duplicate.
336
+ *
337
+ * ADR-0012 also: decisions require >= 3 models with maximum context. The
338
+ * analysis_id parameter records which 3-model analysis (from the
339
+ * self-healing-analysis dependency) produced this ticket.
340
+ *
341
+ * ADR-0010: evidence is referenced by pointer, never pasted into the ticket.
342
+ */
343
+ export async function createSelfHealingTicket(input, store, workspaceId) {
344
+ // Step 1: Validate input fields explicitly (null/absent checks)
345
+ const errors = validateTicketInput(input);
346
+ if (errors.length > 0) {
347
+ throw new CodebusError(`Invalid self-healing ticket input:\n${errors.map((e) => ` - ${e}`).join("\n")}`);
348
+ }
349
+ // Step 2: Compute evidence digest and idempotency key
350
+ // ADR-0012: analysis_id is required (not null) — included in the key
351
+ const evidenceDigest = computeEvidenceDigest(input.evidence_references);
352
+ const idempotencyKey = computeIdempotencyKey(input.issue_id, input.component, input.team, evidenceDigest, input.analysis_id);
353
+ // Step 3: Idempotency lookup BEFORE policy checks (ADR-0012 standing rule 6)
354
+ const existing = await store.findbyIdempotencyKey(idempotencyKey);
355
+ if (existing) {
356
+ return {
357
+ ticket_id: existing.ticket_id,
358
+ ticket_key: existing.ticket_key,
359
+ title: existing.title,
360
+ status: "existing",
361
+ idempotency_key: idempotencyKey,
362
+ codebus_reference: buildTicketUri(existing.ticket_id),
363
+ evidence_uri: buildEvidenceUri(input.issue_id, evidenceDigest),
364
+ analysis_acked: true, // ADR-0012: analysis_id is always present (required)
365
+ };
366
+ }
367
+ // Step 4: Policy checks — reject rich machine evidence pasted into ticket
368
+ // (only reached when no existing ticket was found)
369
+ const summary = buildTicketTitle(input);
370
+ const description = buildTicketDescription(input);
371
+ if (looksLikeMachineEvidence(summary)) {
372
+ throw new CodebusError("ticket summary contains machine evidence; evidence stays in CodeBus, never pasted into Jira");
373
+ }
374
+ if (looksLikeMachineEvidence(description)) {
375
+ throw new CodebusError("ticket description contains machine evidence; evidence stays in CodeBus, never pasted into Jira");
376
+ }
377
+ // Step 5: Create the ticket via the store
378
+ const record = await store.create({
379
+ workspace_id: workspaceId,
380
+ title: summary,
381
+ summary: description,
382
+ description: description,
383
+ idempotency_key: idempotencyKey,
384
+ evidence_refs: input.evidence_references,
385
+ analysis_id: input.analysis_id,
386
+ assignee: input.assignee ?? null,
387
+ project_key: input.project_key ?? null,
388
+ });
389
+ return {
390
+ ticket_id: record.ticket_id,
391
+ ticket_key: record.ticket_key,
392
+ title: record.title ?? summary,
393
+ status: "created",
394
+ idempotency_key: idempotencyKey,
395
+ codebus_reference: buildTicketUri(record.ticket_id),
396
+ evidence_uri: buildEvidenceUri(input.issue_id, evidenceDigest),
397
+ analysis_acked: true, // ADR-0012: analysis_id is required and always present
398
+ };
399
+ }
400
+ // ── CLI command registration ──────────────────────────────────────────
401
+ export function registerConnector(program, g) {
402
+ g(program
403
+ .command("connector:ticket")
404
+ .description("create an idempotent self-healing Jira ticket referencing CodeBus evidence " +
405
+ "(OUT-self-healing-ticket, REPROD-2160; ADRs 0007 0010 0012 0013)")
406
+ .requiredOption("--issue-id <id>", "unique issue identifier from source system")
407
+ .requiredOption("--issue-type <type>", "source type: sentry|sonar|case|build|github")
408
+ .requiredOption("--component <name>", "system component")
409
+ .requiredOption("--team <name>", "owning team")
410
+ .option("--evidence <refs>", "comma-separated evidence references (source:ref_id:digest)")
411
+ .requiredOption("--analysis-id <id>", "REQUIRED: 3-model analysis reference (ADR-0012: >= 3 models with maximum context)")
412
+ .option("--title <title>", "override ticket title (must be human-readable, no machine evidence)")
413
+ .option("--description <desc>", "override ticket description (must be human-readable, no machine evidence)")
414
+ .option("--assignee <key>", "Jira assignee")
415
+ .option("--project-key <key>", "Jira project key")
416
+ // NOTE: --json is added globally by the `g` wrapper in index.ts;
417
+ // do NOT re-declare it here (commander throws "conflicting flag --json").
418
+ .action(async (opts) => {
419
+ const ctx = await makeCtx(resolveConfig(opts));
420
+ const ws = await workspaceId(ctx);
421
+ const evidenceStr = opts.evidence ?? "";
422
+ const references = evidenceStr
423
+ .split(",")
424
+ .map((e) => e.trim())
425
+ .filter(Boolean)
426
+ .map((ref) => {
427
+ const [source, ref_id, digest] = ref.split(":");
428
+ if (!source || !ref_id) {
429
+ throw new CodebusError(`invalid evidence reference: ${ref}`);
430
+ }
431
+ return {
432
+ source,
433
+ ref_id,
434
+ snapshot_sha256: digest ?? null,
435
+ };
436
+ });
437
+ const input = {
438
+ // commander 12 camelCases dashed flags: --issue-id lands as opts.issueId.
439
+ // Reading opts["issue-id"] here silently produced undefined on every
440
+ // real CLI invocation (only the mocked unit tests passed) — CI fix
441
+ // round for PR #254, caught while covering this action.
442
+ issue_id: opts.issueId,
443
+ issue_type: opts.issueType,
444
+ component: opts.component,
445
+ team: opts.team,
446
+ evidence_references: references,
447
+ analysis_id: opts.analysisId,
448
+ title: opts.title ?? null,
449
+ description: opts.description ?? null,
450
+ assignee: opts.assignee ?? null,
451
+ project_key: opts.projectKey ?? null,
452
+ };
453
+ const store = {
454
+ async findbyIdempotencyKey(key) {
455
+ // ADR-0010 binding: external_tickets has no idempotency_key column;
456
+ // we map the idempotency key to the ticket's `key` column (unique
457
+ // per workspace) so lookups work against the real schema.
458
+ const { data, error } = await ctx.supabase
459
+ .from("external_tickets")
460
+ .select("id, key, summary, status_category, created_at, updated_at")
461
+ .eq("workspace_id", ws)
462
+ .eq("key", key)
463
+ .maybeSingle();
464
+ if (error && error.code !== "PGRST116") {
465
+ throw new CodebusError(`failed to look up idempotent ticket: ${error.message}`);
466
+ }
467
+ if (!data)
468
+ return null;
469
+ // Preserve key even if null/absent (ADR-0012: never silently drop)
470
+ return {
471
+ ticket_id: data.id,
472
+ ticket_key: data.key ?? null,
473
+ title: data.summary ?? null,
474
+ status: "existing",
475
+ idempotency_key: key,
476
+ created_at: data.created_at ?? new Date().toISOString(),
477
+ updated_at: data.updated_at ?? null,
478
+ };
479
+ },
480
+ async create(spec) {
481
+ // ADR-0010 binding: insert only into columns that exist on
482
+ // external_tickets (id, workspace_id, key, summary, status,
483
+ // status_category, url, jira_updated_at, created_at, updated_at,
484
+ // synced_at). The idempotency key is stored as the `key`.
485
+ const { data, error } = await ctx.supabase
486
+ .from("external_tickets")
487
+ .insert({
488
+ workspace_id: spec.workspace_id,
489
+ key: spec.idempotency_key,
490
+ summary: spec.title,
491
+ status_category: "todo",
492
+ })
493
+ .select("id, key, summary, status_category, created_at, updated_at")
494
+ .single();
495
+ if (error || !data) {
496
+ throw new CodebusError(`failed to create self-healing ticket: ${error?.message || "unknown error"}`);
497
+ }
498
+ return {
499
+ ticket_id: data.id,
500
+ ticket_key: data.key ?? null,
501
+ title: data.summary ?? spec.title,
502
+ status: "created",
503
+ idempotency_key: spec.idempotency_key,
504
+ created_at: data.created_at ?? new Date().toISOString(),
505
+ updated_at: data.updated_at ?? null,
506
+ };
507
+ },
508
+ };
509
+ const result = await createSelfHealingTicket(input, store, ws);
510
+ console.log(render([{ ...result }], { json: !!opts.json }));
511
+ }));
512
+ }
513
+ //# sourceMappingURL=connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.js","sourceRoot":"","sources":["../../src/commands/connector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { resolveConfig } from "../config.js";
2
+ import { makeCtx } from "../client.js";
3
+ import { CodebusError } from "../errors.js";
4
+ import { factoryContextReadCore } from "./factory-context-read.js";
5
+ export async function listContractsCore(ctx) {
6
+ const r = await factoryContextReadCore(ctx, "contracts");
7
+ return r.content;
8
+ }
9
+ export async function showContractCore(ctx, id) {
10
+ if (!id.trim())
11
+ throw new CodebusError("contract id is required");
12
+ const content = await listContractsCore(ctx);
13
+ const items = Array.isArray(content) ? content : [content];
14
+ const found = items.find((c) => JSON.stringify(c).includes(id));
15
+ if (!found)
16
+ throw new CodebusError(`contract not found: ${id}`);
17
+ return found;
18
+ }
19
+ async function list(o) {
20
+ const ctx = await makeCtx(resolveConfig(o));
21
+ const content = await listContractsCore(ctx);
22
+ console.log(o.json ? JSON.stringify(content, null, 2) : JSON.stringify(content, null, 2));
23
+ }
24
+ export function registerContract(program, g) {
25
+ const c = program.command("contract").description("read versioned contracts (via context_read_versioned)");
26
+ g(c.command("list").description("list contracts")).action(list);
27
+ g(c.command("show").argument("<id>", "contract id or name fragment").description("show one contract"))
28
+ .action(async (id, o) => {
29
+ const ctx = await makeCtx(resolveConfig(o));
30
+ console.log(JSON.stringify(await showContractCore(ctx, id), null, 2));
31
+ });
32
+ }
33
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/commands/contract.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAa,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,OAAO,EAAO,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAQ;IAC9C,MAAM,CAAC,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC,OAAO,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAQ,EAAE,EAAU;IACzD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,YAAY,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,CAAiC;IACnD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,CAA0B;IAC3E,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,uDAAuD,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;SACnG,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,CAAiC,EAAE,EAAE;QAC9D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACP,CAAC"}