@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.
- package/dist/ci-hooks/ci-hooks.js +126 -0
- package/dist/ci-hooks/ci-hooks.js.map +1 -0
- package/dist/commands/adr.js +30 -0
- package/dist/commands/adr.js.map +1 -0
- package/dist/commands/agent.js +175 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/as.js +1 -1
- package/dist/commands/as.js.map +1 -1
- package/dist/commands/ask.js +1 -1
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/checkin.js +1 -1
- package/dist/commands/checkin.js.map +1 -1
- package/dist/commands/ci-findings.js +129 -0
- package/dist/commands/ci-findings.js.map +1 -0
- package/dist/commands/ci-reply.js +117 -0
- package/dist/commands/ci-reply.js.map +1 -0
- package/dist/commands/ci-steer-escalate.js +65 -0
- package/dist/commands/ci-steer-escalate.js.map +1 -0
- package/dist/commands/cli-mcp-correlation.js +131 -0
- package/dist/commands/cli-mcp-correlation.js.map +1 -0
- package/dist/commands/connector-attach-detach.js +542 -0
- package/dist/commands/connector-attach-detach.js.map +1 -0
- package/dist/commands/connector.js +513 -0
- package/dist/commands/connector.js.map +1 -0
- package/dist/commands/contract.js +33 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/correlation.js +194 -0
- package/dist/commands/correlation.js.map +1 -0
- package/dist/commands/decision.js +63 -0
- package/dist/commands/decision.js.map +1 -1
- package/dist/commands/digest.js +14 -3
- package/dist/commands/digest.js.map +1 -1
- package/dist/commands/do.js +127 -0
- package/dist/commands/do.js.map +1 -0
- package/dist/commands/factory-attention.js +106 -0
- package/dist/commands/factory-attention.js.map +1 -0
- package/dist/commands/factory-context-read.js +171 -0
- package/dist/commands/factory-context-read.js.map +1 -0
- package/dist/commands/factory-interventions.js +102 -0
- package/dist/commands/factory-interventions.js.map +1 -0
- package/dist/commands/factory.js +187 -0
- package/dist/commands/factory.js.map +1 -1
- package/dist/commands/github-login.js +109 -53
- package/dist/commands/github-login.js.map +1 -1
- package/dist/commands/graph-pull.js +130 -0
- package/dist/commands/graph-pull.js.map +1 -0
- package/dist/commands/graph.js +5 -1
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/inbox.js +7 -7
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/ingest.js +1 -1
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.js +10 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +1160 -55
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/integration-ledger.js +81 -0
- package/dist/commands/integration-ledger.js.map +1 -0
- package/dist/commands/knowledge.js +194 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/links.js +1 -1
- package/dist/commands/links.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/morning.js +50 -1
- package/dist/commands/morning.js.map +1 -1
- package/dist/commands/plan-compiler.js +260 -0
- package/dist/commands/plan-compiler.js.map +1 -0
- package/dist/commands/plan-lint.js +275 -0
- package/dist/commands/plan-lint.js.map +1 -0
- package/dist/commands/plan-score.js +203 -0
- package/dist/commands/plan-score.js.map +1 -0
- package/dist/commands/plan.js +481 -15
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/product-validity.js +168 -0
- package/dist/commands/product-validity.js.map +1 -0
- package/dist/commands/question.js +1 -1
- package/dist/commands/question.js.map +1 -1
- package/dist/commands/read-policy.js +131 -0
- package/dist/commands/read-policy.js.map +1 -0
- package/dist/commands/read.js +1 -1
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/repo.js +106 -8
- package/dist/commands/repo.js.map +1 -1
- package/dist/commands/repository-protection.js +209 -0
- package/dist/commands/repository-protection.js.map +1 -0
- package/dist/commands/resolve.js +2 -2
- package/dist/commands/resolve.js.map +1 -1
- package/dist/commands/self-healing.js +26 -0
- package/dist/commands/self-healing.js.map +1 -0
- package/dist/commands/send.js +1 -1
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/serial-merge.js +303 -0
- package/dist/commands/serial-merge.js.map +1 -0
- package/dist/commands/session.js +1 -1
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/spend.js +31 -0
- package/dist/commands/spend.js.map +1 -0
- package/dist/commands/task.js +92 -1
- package/dist/commands/task.js.map +1 -1
- package/dist/commands/taxonomy.js +21 -0
- package/dist/commands/taxonomy.js.map +1 -0
- package/dist/commands/verify.js +77 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/config/self-healing-analysis.json +158 -0
- package/dist/errors.js +18 -4
- package/dist/errors.js.map +1 -1
- package/dist/execution/client.js +53 -0
- package/dist/execution/client.js.map +1 -0
- package/dist/execution/local.js +24 -0
- package/dist/execution/local.js.map +1 -0
- package/dist/execution/ssh.js +38 -0
- package/dist/execution/ssh.js.map +1 -0
- package/dist/graph.js +78 -16
- package/dist/graph.js.map +1 -1
- package/dist/index.js +40 -2
- package/dist/index.js.map +1 -1
- package/dist/json-lite.js +248 -0
- package/dist/json-lite.js.map +1 -0
- package/dist/knowledge-drift.js +40 -0
- package/dist/knowledge-drift.js.map +1 -0
- package/dist/lint/parallelism.js +414 -0
- package/dist/lint/parallelism.js.map +1 -0
- package/dist/mail-latency.js +11 -1
- package/dist/mail-latency.js.map +1 -1
- package/dist/mcp-ci-findings.js +31 -0
- package/dist/mcp-ci-findings.js.map +1 -0
- package/dist/mcp-correlation.js +290 -0
- package/dist/mcp-correlation.js.map +1 -0
- package/dist/mcp-factory-context-read.js +81 -0
- package/dist/mcp-factory-context-read.js.map +1 -0
- package/dist/mcp-registry.js +147 -1
- package/dist/mcp-registry.js.map +1 -1
- package/dist/mcp.js +94 -5
- package/dist/mcp.js.map +1 -1
- package/dist/openrouter-reservation-guard.js +97 -0
- package/dist/openrouter-reservation-guard.js.map +1 -0
- package/dist/self-healing-analysis-loader.js +150 -0
- package/dist/self-healing-analysis-loader.js.map +1 -0
- package/dist/sender.js +11 -9
- package/dist/sender.js.map +1 -1
- package/dist/toml-lite.js +546 -0
- package/dist/toml-lite.js.map +1 -0
- package/dist/version-check.js +23 -7
- package/dist/version-check.js.map +1 -1
- 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"}
|