patchwork-os 0.2.0-beta.10.canary.98 → 0.2.0-beta.11
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/README.md +20 -1
- package/dist/adapters/grok.js +6 -1
- package/dist/adapters/grok.js.map +1 -1
- package/dist/approvalHttp.js +61 -66
- package/dist/approvalHttp.js.map +1 -1
- package/dist/bridge.js +3 -2
- package/dist/bridge.js.map +1 -1
- package/dist/claudeOrchestrator.js +15 -0
- package/dist/claudeOrchestrator.js.map +1 -1
- package/dist/commands/connect.d.ts +47 -0
- package/dist/commands/connect.js +419 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/patchworkInit.d.ts +7 -0
- package/dist/commands/patchworkInit.js +26 -0
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +14 -0
- package/dist/commands/recipe.js +51 -0
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.js +15 -0
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/connectors/postgres.d.ts +7 -0
- package/dist/connectors/postgres.js +16 -2
- package/dist/connectors/postgres.js.map +1 -1
- package/dist/connectors/snowflake.js +6 -0
- package/dist/connectors/snowflake.js.map +1 -1
- package/dist/connectors/tokenStorage.d.ts +8 -0
- package/dist/connectors/tokenStorage.js +42 -3
- package/dist/connectors/tokenStorage.js.map +1 -1
- package/dist/drivers/claude/api.js +15 -2
- package/dist/drivers/claude/api.js.map +1 -1
- package/dist/drivers/claude/subprocess.js +1 -29
- package/dist/drivers/claude/subprocess.js.map +1 -1
- package/dist/drivers/gemini/index.js +9 -5
- package/dist/drivers/gemini/index.js.map +1 -1
- package/dist/drivers/openai/index.js +29 -4
- package/dist/drivers/openai/index.js.map +1 -1
- package/dist/drivers/outputCap.d.ts +27 -0
- package/dist/drivers/outputCap.js +50 -0
- package/dist/drivers/outputCap.js.map +1 -0
- package/dist/featureFlags.d.ts +9 -0
- package/dist/featureFlags.js +16 -0
- package/dist/featureFlags.js.map +1 -1
- package/dist/fp/commandDescription.d.ts +6 -0
- package/dist/fp/commandDescription.js +4 -4
- package/dist/fp/commandDescription.js.map +1 -1
- package/dist/fp/policyParser.js +13 -7
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/haltPushDispatch.js +7 -22
- package/dist/haltPushDispatch.js.map +1 -1
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -1
- package/dist/mcpRoutes.js +1 -1
- package/dist/mcpRoutes.js.map +1 -1
- package/dist/oauth.d.ts +13 -0
- package/dist/oauth.js +34 -1
- package/dist/oauth.js.map +1 -1
- package/dist/recipeOrchestration.js +10 -0
- package/dist/recipeOrchestration.js.map +1 -1
- package/dist/recipeRoutes.d.ts +39 -0
- package/dist/recipeRoutes.js +214 -12
- package/dist/recipeRoutes.js.map +1 -1
- package/dist/recipes/agentExecutor.d.ts +20 -0
- package/dist/recipes/agentExecutor.js +32 -10
- package/dist/recipes/agentExecutor.js.map +1 -1
- package/dist/recipes/chainedRunner.d.ts +41 -2
- package/dist/recipes/chainedRunner.js +134 -6
- package/dist/recipes/chainedRunner.js.map +1 -1
- package/dist/recipes/connectorPreflight.js +30 -0
- package/dist/recipes/connectorPreflight.js.map +1 -1
- package/dist/recipes/haltCategory.d.ts +5 -0
- package/dist/recipes/haltCategory.js +7 -1
- package/dist/recipes/haltCategory.js.map +1 -1
- package/dist/recipes/judgeVerdict.d.ts +10 -0
- package/dist/recipes/judgeVerdict.js +10 -0
- package/dist/recipes/judgeVerdict.js.map +1 -1
- package/dist/recipes/names.d.ts +5 -0
- package/dist/recipes/names.js +10 -5
- package/dist/recipes/names.js.map +1 -1
- package/dist/recipes/parser.js +32 -9
- package/dist/recipes/parser.js.map +1 -1
- package/dist/recipes/pricing/costRouter.d.ts +43 -0
- package/dist/recipes/pricing/costRouter.js +44 -0
- package/dist/recipes/pricing/costRouter.js.map +1 -0
- package/dist/recipes/pricing/priceTable.d.ts +76 -0
- package/dist/recipes/pricing/priceTable.js +144 -0
- package/dist/recipes/pricing/priceTable.js.map +1 -0
- package/dist/recipes/runBudget.d.ts +82 -32
- package/dist/recipes/runBudget.js +182 -49
- package/dist/recipes/runBudget.js.map +1 -1
- package/dist/recipes/schema.d.ts +25 -4
- package/dist/recipes/schemaGenerator.d.ts +9 -0
- package/dist/recipes/schemaGenerator.js +386 -75
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/simulation/aggregateRunRisk.d.ts +43 -0
- package/dist/recipes/simulation/aggregateRunRisk.js +117 -0
- package/dist/recipes/simulation/aggregateRunRisk.js.map +1 -0
- package/dist/recipes/simulation/costProjector.d.ts +32 -0
- package/dist/recipes/simulation/costProjector.js +194 -0
- package/dist/recipes/simulation/costProjector.js.map +1 -0
- package/dist/recipes/simulation/sideEffects.d.ts +32 -0
- package/dist/recipes/simulation/sideEffects.js +62 -0
- package/dist/recipes/simulation/sideEffects.js.map +1 -0
- package/dist/recipes/simulation/simulate.d.ts +36 -0
- package/dist/recipes/simulation/simulate.js +264 -0
- package/dist/recipes/simulation/simulate.js.map +1 -0
- package/dist/recipes/simulation/simulateMockedRun.d.ts +52 -0
- package/dist/recipes/simulation/simulateMockedRun.js +72 -0
- package/dist/recipes/simulation/simulateMockedRun.js.map +1 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.d.ts +31 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js +50 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js.map +1 -0
- package/dist/recipes/simulation/types.d.ts +198 -0
- package/dist/recipes/simulation/types.js +30 -0
- package/dist/recipes/simulation/types.js.map +1 -0
- package/dist/recipes/stepObservation.d.ts +12 -0
- package/dist/recipes/stepObservation.js +21 -1
- package/dist/recipes/stepObservation.js.map +1 -1
- package/dist/recipes/tools/airtable.d.ts +15 -0
- package/dist/recipes/tools/airtable.js +240 -0
- package/dist/recipes/tools/airtable.js.map +1 -0
- package/dist/recipes/tools/caldiy.d.ts +13 -0
- package/dist/recipes/tools/caldiy.js +214 -0
- package/dist/recipes/tools/caldiy.js.map +1 -0
- package/dist/recipes/tools/circleci.d.ts +10 -0
- package/dist/recipes/tools/circleci.js +204 -0
- package/dist/recipes/tools/circleci.js.map +1 -0
- package/dist/recipes/tools/cloudflare.d.ts +13 -0
- package/dist/recipes/tools/cloudflare.js +211 -0
- package/dist/recipes/tools/cloudflare.js.map +1 -0
- package/dist/recipes/tools/docs.d.ts +18 -0
- package/dist/recipes/tools/docs.js +94 -0
- package/dist/recipes/tools/docs.js.map +1 -0
- package/dist/recipes/tools/elasticsearch.d.ts +11 -0
- package/dist/recipes/tools/elasticsearch.js +156 -0
- package/dist/recipes/tools/elasticsearch.js.map +1 -0
- package/dist/recipes/tools/figma.d.ts +12 -0
- package/dist/recipes/tools/figma.js +194 -0
- package/dist/recipes/tools/figma.js.map +1 -0
- package/dist/recipes/tools/grafana.d.ts +11 -0
- package/dist/recipes/tools/grafana.js +216 -0
- package/dist/recipes/tools/grafana.js.map +1 -0
- package/dist/recipes/tools/http.d.ts +1 -1
- package/dist/recipes/tools/http.js +10 -28
- package/dist/recipes/tools/http.js.map +1 -1
- package/dist/recipes/tools/index.d.ts +26 -0
- package/dist/recipes/tools/index.js +26 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/monday.d.ts +22 -0
- package/dist/recipes/tools/monday.js +242 -0
- package/dist/recipes/tools/monday.js.map +1 -0
- package/dist/recipes/tools/obsidian.d.ts +15 -0
- package/dist/recipes/tools/obsidian.js +172 -0
- package/dist/recipes/tools/obsidian.js.map +1 -0
- package/dist/recipes/tools/paystack.d.ts +11 -0
- package/dist/recipes/tools/paystack.js +211 -0
- package/dist/recipes/tools/paystack.js.map +1 -0
- package/dist/recipes/tools/pipedrive.d.ts +16 -0
- package/dist/recipes/tools/pipedrive.js +233 -0
- package/dist/recipes/tools/pipedrive.js.map +1 -0
- package/dist/recipes/tools/postgres.d.ts +15 -0
- package/dist/recipes/tools/postgres.js +185 -0
- package/dist/recipes/tools/postgres.js.map +1 -0
- package/dist/recipes/tools/posthog.d.ts +16 -0
- package/dist/recipes/tools/posthog.js +219 -0
- package/dist/recipes/tools/posthog.js.map +1 -0
- package/dist/recipes/tools/redis.d.ts +9 -0
- package/dist/recipes/tools/redis.js +140 -0
- package/dist/recipes/tools/redis.js.map +1 -0
- package/dist/recipes/tools/resend.d.ts +8 -0
- package/dist/recipes/tools/resend.js +153 -0
- package/dist/recipes/tools/resend.js.map +1 -0
- package/dist/recipes/tools/salesforce.d.ts +16 -0
- package/dist/recipes/tools/salesforce.js +184 -0
- package/dist/recipes/tools/salesforce.js.map +1 -0
- package/dist/recipes/tools/sendgrid.d.ts +9 -0
- package/dist/recipes/tools/sendgrid.js +174 -0
- package/dist/recipes/tools/sendgrid.js.map +1 -0
- package/dist/recipes/tools/shopify.d.ts +16 -0
- package/dist/recipes/tools/shopify.js +265 -0
- package/dist/recipes/tools/shopify.js.map +1 -0
- package/dist/recipes/tools/snowflake.d.ts +16 -0
- package/dist/recipes/tools/snowflake.js +173 -0
- package/dist/recipes/tools/snowflake.js.map +1 -0
- package/dist/recipes/tools/stripe.js +13 -12
- package/dist/recipes/tools/stripe.js.map +1 -1
- package/dist/recipes/tools/supabase.d.ts +9 -0
- package/dist/recipes/tools/supabase.js +132 -0
- package/dist/recipes/tools/supabase.js.map +1 -0
- package/dist/recipes/tools/todoist.d.ts +15 -0
- package/dist/recipes/tools/todoist.js +227 -0
- package/dist/recipes/tools/todoist.js.map +1 -0
- package/dist/recipes/tools/twilio.d.ts +11 -0
- package/dist/recipes/tools/twilio.js +180 -0
- package/dist/recipes/tools/twilio.js.map +1 -0
- package/dist/recipes/tools/vercel.d.ts +9 -0
- package/dist/recipes/tools/vercel.js +145 -0
- package/dist/recipes/tools/vercel.js.map +1 -0
- package/dist/recipes/tools/webflow.d.ts +11 -0
- package/dist/recipes/tools/webflow.js +243 -0
- package/dist/recipes/tools/webflow.js.map +1 -0
- package/dist/recipes/tools/woocommerce.d.ts +18 -0
- package/dist/recipes/tools/woocommerce.js +259 -0
- package/dist/recipes/tools/woocommerce.js.map +1 -0
- package/dist/recipes/tools/wrapConnectorExecute.d.ts +25 -0
- package/dist/recipes/tools/wrapConnectorExecute.js +37 -0
- package/dist/recipes/tools/wrapConnectorExecute.js.map +1 -0
- package/dist/recipes/validation.js +264 -0
- package/dist/recipes/validation.js.map +1 -1
- package/dist/recipes/yamlRunner.d.ts +112 -3
- package/dist/recipes/yamlRunner.js +482 -19
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/runLog.d.ts +46 -0
- package/dist/runLog.js +4 -0
- package/dist/runLog.js.map +1 -1
- package/dist/schemas/recipe.v1.json +217 -11
- package/dist/server.d.ts +3 -0
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/streamableHttp.js +3 -2
- package/dist/streamableHttp.js.map +1 -1
- package/dist/tools/gitWrite.js +5 -1
- package/dist/tools/gitWrite.js.map +1 -1
- package/dist/tools/terminal.js +15 -49
- package/dist/tools/terminal.js.map +1 -1
- package/dist/transport.d.ts +1 -0
- package/dist/transport.js +7 -0
- package/dist/transport.js.map +1 -1
- package/package.json +3 -3
- package/scripts/mcp-stdio-shim.cjs +218 -84
- package/templates/recipes/incident-to-pr.yaml +187 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `patchwork connect` — the connector front-door.
|
|
3
|
+
*
|
|
4
|
+
* A thin CLI→HTTP shim over the bridge's already-built `/connections/*`
|
|
5
|
+
* routes (see src/connectorRoutes.ts). 23 connector error messages already
|
|
6
|
+
* tell users to "Run: patchwork connect <vendor>"; this is that command.
|
|
7
|
+
*
|
|
8
|
+
* NO new bridge or connector logic lives here — every verb maps to one
|
|
9
|
+
* existing HTTP route:
|
|
10
|
+
* - list → GET /connections (Bearer)
|
|
11
|
+
* - <vendor> → GET /connections/<id>/auth (OAuth, 302 Location)
|
|
12
|
+
* or POST /connections/<id>/connect (PAT, {token})
|
|
13
|
+
* - test → POST /connections/<id>/test (health probe)
|
|
14
|
+
* - disconnect → DELETE /connections/<id> (revoke)
|
|
15
|
+
*
|
|
16
|
+
* Bridge discovery + Bearer auth mirror src/commands/task.ts. All side
|
|
17
|
+
* effects (lock discovery, fetch, stdout/stderr, exit) are injectable so
|
|
18
|
+
* the command is unit-testable without a live bridge.
|
|
19
|
+
*/
|
|
20
|
+
import { CONNECTORS, } from "../connectors/connectorRegistry.js";
|
|
21
|
+
const TIMEOUT_MS = 10_000;
|
|
22
|
+
function parseArgs(argv) {
|
|
23
|
+
const out = {
|
|
24
|
+
positional: [],
|
|
25
|
+
json: false,
|
|
26
|
+
urlOnly: false,
|
|
27
|
+
help: false,
|
|
28
|
+
};
|
|
29
|
+
for (let i = 0; i < argv.length; i++) {
|
|
30
|
+
const a = argv[i];
|
|
31
|
+
if (a === undefined)
|
|
32
|
+
continue;
|
|
33
|
+
if (a === "--json")
|
|
34
|
+
out.json = true;
|
|
35
|
+
else if (a === "--url-only")
|
|
36
|
+
out.urlOnly = true;
|
|
37
|
+
else if (a === "--help" || a === "-h")
|
|
38
|
+
out.help = true;
|
|
39
|
+
else if (a === "--token") {
|
|
40
|
+
const next = argv[++i];
|
|
41
|
+
if (next !== undefined)
|
|
42
|
+
out.token = next;
|
|
43
|
+
}
|
|
44
|
+
else if (a === "--port") {
|
|
45
|
+
const next = argv[++i];
|
|
46
|
+
if (next !== undefined)
|
|
47
|
+
out.port = Number(next);
|
|
48
|
+
}
|
|
49
|
+
else if (!a.startsWith("-")) {
|
|
50
|
+
out.positional.push(a);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
// ── helpers ──────────────────────────────────────────────────────────────────
|
|
56
|
+
function bearer(lock) {
|
|
57
|
+
return { Authorization: `Bearer ${lock.authToken}` };
|
|
58
|
+
}
|
|
59
|
+
function statusGlyph(status) {
|
|
60
|
+
if (status === "connected")
|
|
61
|
+
return "✓ connected";
|
|
62
|
+
if (status === "needs_reauth")
|
|
63
|
+
return "⚠ needs reauth";
|
|
64
|
+
return "✗ not connected";
|
|
65
|
+
}
|
|
66
|
+
function normalizeStatus(raw) {
|
|
67
|
+
if (raw === "connected" || raw === "needs_reauth")
|
|
68
|
+
return raw;
|
|
69
|
+
return "disconnected";
|
|
70
|
+
}
|
|
71
|
+
/** Levenshtein distance for "did you mean" suggestions. */
|
|
72
|
+
function editDistance(a, b) {
|
|
73
|
+
const m = a.length;
|
|
74
|
+
const n = b.length;
|
|
75
|
+
const prev = Array.from({ length: n + 1 }, (_, j) => j);
|
|
76
|
+
const curr = new Array(n + 1).fill(0);
|
|
77
|
+
for (let i = 1; i <= m; i++) {
|
|
78
|
+
curr[0] = i;
|
|
79
|
+
for (let j = 1; j <= n; j++) {
|
|
80
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
81
|
+
const del = (prev[j] ?? 0) + 1;
|
|
82
|
+
const ins = (curr[j - 1] ?? 0) + 1;
|
|
83
|
+
const sub = (prev[j - 1] ?? 0) + cost;
|
|
84
|
+
curr[j] = Math.min(del, ins, sub);
|
|
85
|
+
}
|
|
86
|
+
for (let j = 0; j <= n; j++)
|
|
87
|
+
prev[j] = curr[j] ?? 0;
|
|
88
|
+
}
|
|
89
|
+
return prev[n] ?? 0;
|
|
90
|
+
}
|
|
91
|
+
function suggestVendor(input, connectors) {
|
|
92
|
+
let best;
|
|
93
|
+
for (const c of connectors) {
|
|
94
|
+
const dist = editDistance(input, c.id);
|
|
95
|
+
if (!best || dist < best.dist)
|
|
96
|
+
best = { id: c.id, dist };
|
|
97
|
+
}
|
|
98
|
+
// Only suggest when reasonably close.
|
|
99
|
+
return best && best.dist <= 3 ? best.id : undefined;
|
|
100
|
+
}
|
|
101
|
+
function resolveLock(deps, port) {
|
|
102
|
+
const lock = deps.findBridgeLock(port);
|
|
103
|
+
if (!lock) {
|
|
104
|
+
deps.writeErr("No running bridge — start it with: patchwork start\n" +
|
|
105
|
+
(port !== undefined
|
|
106
|
+
? `(checked port ${port}; lock missing, IDE-owned, or dead)\n`
|
|
107
|
+
: ""));
|
|
108
|
+
deps.exit(1);
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return lock;
|
|
112
|
+
}
|
|
113
|
+
async function readJson(res) {
|
|
114
|
+
const text = await res.text();
|
|
115
|
+
if (!text)
|
|
116
|
+
return null;
|
|
117
|
+
try {
|
|
118
|
+
return JSON.parse(text);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function networkError(deps, err, json) {
|
|
125
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
126
|
+
if (json) {
|
|
127
|
+
deps.write(`${JSON.stringify({ ok: false, error: msg })}\n`);
|
|
128
|
+
}
|
|
129
|
+
deps.writeErr(`Error contacting bridge: ${msg}\n`);
|
|
130
|
+
deps.exit(1);
|
|
131
|
+
}
|
|
132
|
+
// ── verbs ────────────────────────────────────────────────────────────────────
|
|
133
|
+
async function runList(deps, args) {
|
|
134
|
+
const lock = resolveLock(deps, args.port);
|
|
135
|
+
if (!lock)
|
|
136
|
+
return;
|
|
137
|
+
let live;
|
|
138
|
+
try {
|
|
139
|
+
const res = await deps.fetchFn(`http://127.0.0.1:${lock.port}/connections`, {
|
|
140
|
+
method: "GET",
|
|
141
|
+
headers: bearer(lock),
|
|
142
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
143
|
+
});
|
|
144
|
+
live = await readJson(res);
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
networkError(deps, err, args.json);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Join live status onto the full registry roster so connectors absent
|
|
151
|
+
// from the response render as not-connected rather than vanishing.
|
|
152
|
+
const statusById = new Map();
|
|
153
|
+
for (const c of live?.connectors ?? []) {
|
|
154
|
+
if (c.id)
|
|
155
|
+
statusById.set(c.id, normalizeStatus(c.status));
|
|
156
|
+
}
|
|
157
|
+
const rows = deps.connectors.map((c) => ({
|
|
158
|
+
id: c.id,
|
|
159
|
+
label: c.label,
|
|
160
|
+
authKind: c.authKind,
|
|
161
|
+
status: statusById.get(c.id) ?? "disconnected",
|
|
162
|
+
}));
|
|
163
|
+
if (args.json) {
|
|
164
|
+
deps.write(`${JSON.stringify({ connectors: rows })}\n`);
|
|
165
|
+
deps.exit(0);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// Connected first, then needs_reauth, then disconnected; stable by label.
|
|
169
|
+
const rank = {
|
|
170
|
+
connected: 0,
|
|
171
|
+
needs_reauth: 1,
|
|
172
|
+
disconnected: 2,
|
|
173
|
+
};
|
|
174
|
+
rows.sort((a, b) => rank[a.status] - rank[b.status] || a.label.localeCompare(b.label));
|
|
175
|
+
const idWidth = Math.max(...rows.map((r) => r.id.length), 2);
|
|
176
|
+
deps.write("Connectors:\n");
|
|
177
|
+
for (const r of rows) {
|
|
178
|
+
deps.write(` ${r.id.padEnd(idWidth)} ${statusGlyph(r.status).padEnd(16)}` +
|
|
179
|
+
`${r.label} (${r.authKind})\n`);
|
|
180
|
+
}
|
|
181
|
+
deps.exit(0);
|
|
182
|
+
}
|
|
183
|
+
async function runOauth(deps, descriptor, args) {
|
|
184
|
+
const lock = resolveLock(deps, args.port);
|
|
185
|
+
if (!lock)
|
|
186
|
+
return;
|
|
187
|
+
let res;
|
|
188
|
+
try {
|
|
189
|
+
res = await deps.fetchFn(`http://127.0.0.1:${lock.port}/connections/${descriptor.id}/auth`, {
|
|
190
|
+
method: "GET",
|
|
191
|
+
headers: bearer(lock),
|
|
192
|
+
redirect: "manual",
|
|
193
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
networkError(deps, err, args.json);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const location = res.headers.get("location");
|
|
201
|
+
if (res.status === 302 && location) {
|
|
202
|
+
if (args.json) {
|
|
203
|
+
deps.write(`${JSON.stringify({ ok: true, url: location })}\n`);
|
|
204
|
+
}
|
|
205
|
+
else if (args.urlOnly) {
|
|
206
|
+
deps.write(`${location}\n`);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
deps.write(`Open this URL in your browser to authorize ${descriptor.label}:\n` +
|
|
210
|
+
` ${location}\n`);
|
|
211
|
+
}
|
|
212
|
+
deps.exit(0);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
// No redirect — surface the bridge's error body if present.
|
|
216
|
+
const body = await readJson(res);
|
|
217
|
+
const detail = body?.error ?? `HTTP ${res.status}`;
|
|
218
|
+
if (args.json) {
|
|
219
|
+
deps.write(`${JSON.stringify({ ok: false, error: detail })}\n`);
|
|
220
|
+
}
|
|
221
|
+
deps.writeErr(`Could not start ${descriptor.label} authorization: ${detail}\n`);
|
|
222
|
+
deps.exit(1);
|
|
223
|
+
}
|
|
224
|
+
async function runPatConnect(deps, descriptor, args) {
|
|
225
|
+
if (!args.token) {
|
|
226
|
+
// No token supplied — print honest instructions rather than guessing.
|
|
227
|
+
deps.write(`${descriptor.label} is a token (PAT) connector.\n` +
|
|
228
|
+
` Pass a token directly:\n` +
|
|
229
|
+
` patchwork connect ${descriptor.id} --token <TOKEN>\n` +
|
|
230
|
+
` Some connectors need more than one field (e.g. Jira/Confluence/` +
|
|
231
|
+
`Zendesk/Datadog need a URL + email + token).\n` +
|
|
232
|
+
` For those, use the dashboard /connections page to connect.\n`);
|
|
233
|
+
deps.exit(0);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const lock = resolveLock(deps, args.port);
|
|
237
|
+
if (!lock)
|
|
238
|
+
return;
|
|
239
|
+
let res;
|
|
240
|
+
try {
|
|
241
|
+
res = await deps.fetchFn(`http://127.0.0.1:${lock.port}/connections/${descriptor.id}/connect`, {
|
|
242
|
+
method: "POST",
|
|
243
|
+
headers: { ...bearer(lock), "Content-Type": "application/json" },
|
|
244
|
+
body: JSON.stringify({ token: args.token }),
|
|
245
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
networkError(deps, err, args.json);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const body = await readJson(res);
|
|
253
|
+
const ok = res.status >= 200 && res.status < 300 && body?.ok !== false;
|
|
254
|
+
if (args.json) {
|
|
255
|
+
deps.write(`${JSON.stringify({ ok, ...(body ?? {}) })}\n`);
|
|
256
|
+
}
|
|
257
|
+
else if (ok) {
|
|
258
|
+
const where = body?.workspace ? ` (workspace: ${body.workspace})` : "";
|
|
259
|
+
deps.write(`✓ Connected ${descriptor.label}${where}\n`);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
deps.writeErr(`✗ Failed to connect ${descriptor.label}: ${body?.error ?? `HTTP ${res.status}`}\n`);
|
|
263
|
+
}
|
|
264
|
+
deps.exit(ok ? 0 : 1);
|
|
265
|
+
}
|
|
266
|
+
async function runTest(deps, vendor, args) {
|
|
267
|
+
const descriptor = resolveVendor(deps, vendor);
|
|
268
|
+
if (!descriptor)
|
|
269
|
+
return;
|
|
270
|
+
const lock = resolveLock(deps, args.port);
|
|
271
|
+
if (!lock)
|
|
272
|
+
return;
|
|
273
|
+
let res;
|
|
274
|
+
try {
|
|
275
|
+
res = await deps.fetchFn(`http://127.0.0.1:${lock.port}/connections/${descriptor.id}/test`, {
|
|
276
|
+
method: "POST",
|
|
277
|
+
headers: bearer(lock),
|
|
278
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
networkError(deps, err, args.json);
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const body = await readJson(res);
|
|
286
|
+
const ok = res.status >= 200 && res.status < 300 && body?.ok !== false;
|
|
287
|
+
if (args.json) {
|
|
288
|
+
deps.write(`${JSON.stringify({ ok, ...(body ?? {}) })}\n`);
|
|
289
|
+
}
|
|
290
|
+
else if (ok) {
|
|
291
|
+
deps.write(`✓ ${descriptor.label} is healthy\n`);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
deps.writeErr(`✗ ${descriptor.label} test failed: ${body?.error ?? `HTTP ${res.status}`}\n`);
|
|
295
|
+
}
|
|
296
|
+
deps.exit(ok ? 0 : 1);
|
|
297
|
+
}
|
|
298
|
+
async function runDisconnect(deps, vendor, args) {
|
|
299
|
+
const descriptor = resolveVendor(deps, vendor);
|
|
300
|
+
if (!descriptor)
|
|
301
|
+
return;
|
|
302
|
+
const lock = resolveLock(deps, args.port);
|
|
303
|
+
if (!lock)
|
|
304
|
+
return;
|
|
305
|
+
let res;
|
|
306
|
+
try {
|
|
307
|
+
res = await deps.fetchFn(`http://127.0.0.1:${lock.port}/connections/${descriptor.id}`, {
|
|
308
|
+
method: "DELETE",
|
|
309
|
+
headers: bearer(lock),
|
|
310
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
networkError(deps, err, args.json);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const body = await readJson(res);
|
|
318
|
+
const ok = res.status >= 200 && res.status < 300 && body?.ok !== false;
|
|
319
|
+
if (args.json) {
|
|
320
|
+
deps.write(`${JSON.stringify({ ok, ...(body ?? {}) })}\n`);
|
|
321
|
+
}
|
|
322
|
+
else if (ok) {
|
|
323
|
+
deps.write(`✓ Disconnected ${descriptor.label}\n`);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
deps.writeErr(`✗ Failed to disconnect ${descriptor.label}: ${body?.error ?? `HTTP ${res.status}`}\n`);
|
|
327
|
+
}
|
|
328
|
+
deps.exit(ok ? 0 : 1);
|
|
329
|
+
}
|
|
330
|
+
/** Resolve a vendor id to its descriptor, or emit an error + exit(1). */
|
|
331
|
+
function resolveVendor(deps, vendor) {
|
|
332
|
+
if (!vendor) {
|
|
333
|
+
deps.writeErr("Missing connector id.\n");
|
|
334
|
+
deps.exit(1);
|
|
335
|
+
return undefined;
|
|
336
|
+
}
|
|
337
|
+
const descriptor = deps.connectors.find((c) => c.id === vendor);
|
|
338
|
+
if (!descriptor) {
|
|
339
|
+
const hint = suggestVendor(vendor, deps.connectors);
|
|
340
|
+
const validIds = deps.connectors.map((c) => c.id).join(", ");
|
|
341
|
+
deps.writeErr(`Unknown connector "${vendor}".\n` +
|
|
342
|
+
(hint ? `Did you mean "${hint}"?\n` : "") +
|
|
343
|
+
`Valid ids: ${validIds}\n`);
|
|
344
|
+
deps.exit(1);
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
347
|
+
return descriptor;
|
|
348
|
+
}
|
|
349
|
+
function printHelp(deps) {
|
|
350
|
+
deps.write("Usage: patchwork connect [<vendor>|list|test <vendor>|disconnect <vendor>]\n" +
|
|
351
|
+
"\n" +
|
|
352
|
+
" connect [list] [--json] List connectors + connection status\n" +
|
|
353
|
+
" connect <vendor> [--url-only] OAuth: print the authorize URL to open\n" +
|
|
354
|
+
" connect <vendor> --token <TOKEN> PAT: paste a token to connect\n" +
|
|
355
|
+
" connect test <vendor> [--json] Health-probe a connector\n" +
|
|
356
|
+
" connect disconnect <vendor> Revoke a connector\n" +
|
|
357
|
+
"\n" +
|
|
358
|
+
" --port <n> Target a specific bridge lock\n" +
|
|
359
|
+
" --url-only Print only the OAuth URL (headless/CI)\n" +
|
|
360
|
+
" --json Machine-readable output\n");
|
|
361
|
+
deps.exit(0);
|
|
362
|
+
}
|
|
363
|
+
// ── entrypoint ───────────────────────────────────────────────────────────────
|
|
364
|
+
const DEFAULT_DEPS = {
|
|
365
|
+
fetchFn: globalThis.fetch,
|
|
366
|
+
connectors: CONNECTORS,
|
|
367
|
+
write: (s) => process.stdout.write(s),
|
|
368
|
+
writeErr: (s) => process.stderr.write(s),
|
|
369
|
+
exit: (c) => process.exit(c),
|
|
370
|
+
};
|
|
371
|
+
/**
|
|
372
|
+
* `patchwork connect ...` dispatcher.
|
|
373
|
+
*
|
|
374
|
+
* `deps` is fully injectable for tests. In production, callers pass
|
|
375
|
+
* `findBridgeLock` (from src/commands/task.ts's lock helper) plus any
|
|
376
|
+
* overrides; everything else defaults to real process I/O.
|
|
377
|
+
*/
|
|
378
|
+
export async function runConnect(argv, deps) {
|
|
379
|
+
const resolved = { ...DEFAULT_DEPS, ...deps };
|
|
380
|
+
const args = parseArgs(argv);
|
|
381
|
+
if (args.help) {
|
|
382
|
+
printHelp(resolved);
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
const verb = args.positional[0];
|
|
386
|
+
// Bare `connect` or `connect list` → list.
|
|
387
|
+
if (verb === undefined || verb === "list") {
|
|
388
|
+
await runList(resolved, args);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
if (verb === "test") {
|
|
392
|
+
await runTest(resolved, args.positional[1], args);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
if (verb === "disconnect") {
|
|
396
|
+
await runDisconnect(resolved, args.positional[1], args);
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
// Otherwise `verb` is a vendor id: OAuth (auth) or PAT (connect).
|
|
400
|
+
const descriptor = resolveVendor(resolved, verb);
|
|
401
|
+
if (!descriptor)
|
|
402
|
+
return;
|
|
403
|
+
if (descriptor.authKind === "oauth" && descriptor.supports.auth) {
|
|
404
|
+
await runOauth(resolved, descriptor, args);
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
if (descriptor.supports.connect) {
|
|
408
|
+
await runPatConnect(resolved, descriptor, args);
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
// OAuth-capable PAT connectors (auth:true but pat): prefer the token path.
|
|
412
|
+
if (descriptor.supports.auth) {
|
|
413
|
+
await runOauth(resolved, descriptor, args);
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
resolved.writeErr(`Connector "${descriptor.id}" does not support an interactive connect flow.\n`);
|
|
417
|
+
resolved.exit(1);
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,12 @@ export declare function ensureDashboardEnv(patchworkDir: string): {
|
|
|
2
2
|
password: string;
|
|
3
3
|
generated: boolean;
|
|
4
4
|
};
|
|
5
|
+
/**
|
|
6
|
+
* Detect Grok Build (the Grok CLI). Probes `grok --version`; if the binary
|
|
7
|
+
* isn't on PATH (e.g. a fresh install whose shell PATH hasn't been reloaded yet)
|
|
8
|
+
* it falls back to the path the official installer symlinks. Exported for tests.
|
|
9
|
+
*/
|
|
10
|
+
export declare function detectGrokCli(home: string): boolean;
|
|
5
11
|
interface InitResult {
|
|
6
12
|
configPath: string;
|
|
7
13
|
recipesDir: string;
|
|
@@ -9,6 +15,7 @@ interface InitResult {
|
|
|
9
15
|
recipesSkipped: number;
|
|
10
16
|
ollamaDetected: boolean;
|
|
11
17
|
geminiCliDetected: boolean;
|
|
18
|
+
grokCliDetected: boolean;
|
|
12
19
|
configAction: "created" | "merged" | "overwritten";
|
|
13
20
|
/**
|
|
14
21
|
* State of the Claude Code PreToolUse hook after init ran.
|
|
@@ -132,6 +132,27 @@ function detectGeminiCli() {
|
|
|
132
132
|
return false;
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Detect Grok Build (the Grok CLI). Probes `grok --version`; if the binary
|
|
137
|
+
* isn't on PATH (e.g. a fresh install whose shell PATH hasn't been reloaded yet)
|
|
138
|
+
* it falls back to the path the official installer symlinks. Exported for tests.
|
|
139
|
+
*/
|
|
140
|
+
export function detectGrokCli(home) {
|
|
141
|
+
try {
|
|
142
|
+
// grok is `.cmd` on Windows when installed via npm — without ensureCmdShim
|
|
143
|
+
// this silently returns false on Windows (mirrors the detectGeminiCli note).
|
|
144
|
+
const r = spawnSync(ensureCmdShim("grok"), ["--version"], {
|
|
145
|
+
stdio: "pipe",
|
|
146
|
+
timeout: 3000,
|
|
147
|
+
});
|
|
148
|
+
if (r.status === 0)
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// not on PATH — fall through to the filesystem check
|
|
153
|
+
}
|
|
154
|
+
return existsSync(join(home, ".grok", "bin", "grok"));
|
|
155
|
+
}
|
|
135
156
|
async function detectOllama(timeoutMs = 500) {
|
|
136
157
|
try {
|
|
137
158
|
const controller = new AbortController();
|
|
@@ -201,6 +222,10 @@ export async function runPatchworkInit(argv, opts = {}) {
|
|
|
201
222
|
log(geminiCliDetected
|
|
202
223
|
? ` ✓ Gemini CLI detected — driver will default to gemini\n`
|
|
203
224
|
: ` · Gemini CLI not detected (install from https://github.com/google-gemini/gemini-cli)\n`);
|
|
225
|
+
const grokCliDetected = detectGrokCli(home);
|
|
226
|
+
log(grokCliDetected
|
|
227
|
+
? ` ✓ Grok Build (Grok CLI) detected — to use the bridge's tools from it, add the stdio-shim block to ~/.grok/config.toml (see "Connecting Grok Build" in the README) and set approvalGate to "high"/"off" so calls don't queue for approval.\n`
|
|
228
|
+
: ` · Grok Build not detected (install from https://x.ai/cli)\n`);
|
|
204
229
|
let ollamaDetected = false;
|
|
205
230
|
if (!parsed.skipOllama) {
|
|
206
231
|
ollamaDetected = await detectOllama();
|
|
@@ -296,6 +321,7 @@ Next:
|
|
|
296
321
|
recipesSkipped,
|
|
297
322
|
ollamaDetected,
|
|
298
323
|
geminiCliDetected,
|
|
324
|
+
grokCliDetected,
|
|
299
325
|
configAction,
|
|
300
326
|
preToolUseHook,
|
|
301
327
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patchworkInit.js","sourceRoot":"","sources":["../../src/commands/patchworkInit.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"patchworkInit.js","sourceRoot":"","sources":["../../src/commands/patchworkInit.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import "../recipes/tools/index.js";
|
|
7
7
|
import { type HaltCategory } from "../recipes/haltCategory.js";
|
|
8
|
+
import type { RecipeSimulationReport } from "../recipes/simulation/types.js";
|
|
8
9
|
import { type LintIssue, type LintResult } from "../recipes/validation.js";
|
|
9
10
|
import { type RunnerDeps, type RunResult, type YamlRecipe } from "../recipes/yamlRunner.js";
|
|
11
|
+
import type { RecipeRunLog } from "../runLog.js";
|
|
10
12
|
export interface NewOptions {
|
|
11
13
|
name: string;
|
|
12
14
|
description: string;
|
|
@@ -224,6 +226,18 @@ export interface RecipeDryRunPlan {
|
|
|
224
226
|
};
|
|
225
227
|
}
|
|
226
228
|
export declare function runRecipeDryPlan(recipeRef: string, options?: RunRecipeOptions): Promise<RecipeDryRunPlan>;
|
|
229
|
+
/**
|
|
230
|
+
* What-If Preview — run a static counterfactual simulation of a recipe.
|
|
231
|
+
*
|
|
232
|
+
* Produces the dry-run plan first (no execution), then transforms it into a
|
|
233
|
+
* {@link RecipeSimulationReport} that projects actions, side-effect taxonomy,
|
|
234
|
+
* blast-radius-aware risk, a tier-only approval projection (honestly flagged as
|
|
235
|
+
* NOT gated on recipe steps today), a low-confidence cost estimate, and the
|
|
236
|
+
* conditional branches it refuses to resolve statically. Zero side effects.
|
|
237
|
+
*/
|
|
238
|
+
export declare function runRecipeSimulate(recipeRef: string, options?: RunRecipeOptions & {
|
|
239
|
+
runLog?: RecipeRunLog;
|
|
240
|
+
}): Promise<RecipeSimulationReport>;
|
|
227
241
|
export type PreflightIssueCode = "unresolved-tool" | "unacknowledged-write" | "missing-fixture" | "lint-error" | "lint-warning" | "into-shadows-builtin" | "into-duplicate";
|
|
228
242
|
export interface PreflightIssue {
|
|
229
243
|
level: "error" | "warning";
|
package/dist/commands/recipe.js
CHANGED
|
@@ -16,6 +16,9 @@ import { HALT_CATEGORY_HINTS, HALT_CATEGORY_LABELS, } from "../recipes/haltCateg
|
|
|
16
16
|
import { defaultDeprecationWarn, normalizeRecipeForRuntime, } from "../recipes/migrations/index.js";
|
|
17
17
|
import { tryResolveRecipePath } from "../recipes/resolveRecipePath.js";
|
|
18
18
|
import { generateSchemaSet, writeSchemas } from "../recipes/schemaGenerator.js";
|
|
19
|
+
import { projectCost } from "../recipes/simulation/costProjector.js";
|
|
20
|
+
import { simulateFromPlan, simulateMockedFromPlan, } from "../recipes/simulation/simulate.js";
|
|
21
|
+
import { simulateMockedRun } from "../recipes/simulation/simulateMockedRun.js";
|
|
19
22
|
import { getTool, isConnectorNamespace, listConnectorNamespaces, listTools, seedToolOutputPreviewContext, } from "../recipes/toolRegistry.js";
|
|
20
23
|
import { validateRecipeDefinition, } from "../recipes/validation.js";
|
|
21
24
|
import { buildChainedDeps, dispatchRecipe, loadYamlRecipe, render, runYamlRecipe, } from "../recipes/yamlRunner.js";
|
|
@@ -1172,6 +1175,54 @@ export async function runRecipeDryPlan(recipeRef, options = {}) {
|
|
|
1172
1175
|
lint,
|
|
1173
1176
|
};
|
|
1174
1177
|
}
|
|
1178
|
+
/**
|
|
1179
|
+
* What-If Preview — run a static counterfactual simulation of a recipe.
|
|
1180
|
+
*
|
|
1181
|
+
* Produces the dry-run plan first (no execution), then transforms it into a
|
|
1182
|
+
* {@link RecipeSimulationReport} that projects actions, side-effect taxonomy,
|
|
1183
|
+
* blast-radius-aware risk, a tier-only approval projection (honestly flagged as
|
|
1184
|
+
* NOT gated on recipe steps today), a low-confidence cost estimate, and the
|
|
1185
|
+
* conditional branches it refuses to resolve statically. Zero side effects.
|
|
1186
|
+
*/
|
|
1187
|
+
export async function runRecipeSimulate(recipeRef, options = {}) {
|
|
1188
|
+
const plan = await runRecipeDryPlan(recipeRef, options);
|
|
1189
|
+
// P2 mocked sandbox — ONLY for chained recipes WITH run history and a
|
|
1190
|
+
// provided runLog. Flat recipes ALWAYS stay static (hard guard: the runner
|
|
1191
|
+
// is never driven for a flat recipe). Callers with no runLog (CLI) stay
|
|
1192
|
+
// static too.
|
|
1193
|
+
let report;
|
|
1194
|
+
if (plan.triggerType === "chained" && options.runLog) {
|
|
1195
|
+
try {
|
|
1196
|
+
const recipePath = resolveRecipePath(recipeRef);
|
|
1197
|
+
const recipe = loadYamlRecipe(recipePath);
|
|
1198
|
+
const recipeToPlan = options.step
|
|
1199
|
+
? { ...recipe, steps: [selectRecipeStep(recipe, options.step).step] }
|
|
1200
|
+
: recipe;
|
|
1201
|
+
const chainedRecipe = recipeToPlan;
|
|
1202
|
+
const mocked = await simulateMockedRun(chainedRecipe, options.runLog);
|
|
1203
|
+
if (mocked.sampleRuns > 0) {
|
|
1204
|
+
report = simulateMockedFromPlan(plan, mocked);
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
catch {
|
|
1208
|
+
// Fail-soft: fall through to the static report.
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
if (!report)
|
|
1212
|
+
report = simulateFromPlan(plan);
|
|
1213
|
+
// P3 cost projection — whenever a runLog is available (any fidelity/topology),
|
|
1214
|
+
// overlay a history-backed cost estimate. Degrades to the chars/4 heuristic /
|
|
1215
|
+
// "unavailable" shape when there is no usable history, so it is always safe.
|
|
1216
|
+
if (options.runLog) {
|
|
1217
|
+
try {
|
|
1218
|
+
report = { ...report, cost: projectCost(plan, options.runLog) };
|
|
1219
|
+
}
|
|
1220
|
+
catch {
|
|
1221
|
+
// Fail-soft: keep the static cost estimate already on the report.
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
return report;
|
|
1225
|
+
}
|
|
1175
1226
|
/**
|
|
1176
1227
|
* Static policy check over a recipe: lint + dry-plan + unresolved/write/fixture checks.
|
|
1177
1228
|
* No connector calls, no agent calls — safe to run in CI.
|