#!/usr/bin/env node // Conduit client — thin CLI wrapper for Claude to call the conduit server. // Usage: // node client/index.js [key=value ...] // node client/index.js list-actions // node client/index.js edit-file filename=/workspace/foo.js const BASE_URL = process.env.CONDUIT_URL || "http://localhost:3333"; async function callAction(action, params = {}) { const res = await fetch(`${BASE_URL}/action`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action, ...params }), }); const body = await res.json(); return { status: res.status, body }; } function parseArgs(argv) { const [, , action, ...rest] = argv; const params = {}; for (const arg of rest) { const eq = arg.indexOf("="); if (eq === -1) { console.error(`Bad argument (expected key=value): ${arg}`); process.exit(1); } params[arg.slice(0, eq)] = arg.slice(eq + 1); } return { action, params }; } async function main() { if (process.argv.length < 3) { console.error("Usage: conduit [key=value ...]"); process.exit(1); } const { action, params } = parseArgs(process.argv); const { status, body } = await callAction(action, params); console.log(JSON.stringify(body, null, 2)); process.exit(status >= 400 ? 1 : 0); } main().catch((err) => { console.error("Conduit error:", err.message); process.exit(1); });