#!/usr/bin/env node // cost-outcome — thin wrapper around `hooks model-outcome` so cost-optimize // recommendations can be emitted as pre-formatted shell commands. The agent // (or human) runs this once per applied recommendation and the router learns. // // Usage: // node scripts/outcome.mjs // outcome ∈ { success, escalated, failure } // // Example: // node scripts/outcome.mjs "format imports" haiku success // node scripts/outcome.mjs "design auth flow" sonnet escalated // // Why a wrapper: `hooks model-outcome` takes `-t -m -o` and quoting through // shell pipelines is error-prone. This script uses spawnSync with explicit // argv so a task description with quotes/newlines is preserved. import { spawnSync } from 'node:child_process'; const ALLOWED = new Set(['success', 'escalated', 'failure']); function main() { const [task, model, outcome] = process.argv.slice(2); if (!task || !model || !outcome) { console.error('usage: outcome.mjs '); console.error(' outcome ∈ {success, escalated, failure}'); process.exit(2); } if (!ALLOWED.has(outcome)) { console.error(`invalid outcome '${outcome}' — must be one of: success, escalated, failure`); process.exit(2); } const r = spawnSync('npx', [ '@claude-flow/cli@latest', 'hooks', 'model-outcome', '-t', task, '-m', model, '-o', outcome, ], { stdio: 'inherit', shell: process.platform === 'win32' }); if (r.status !== 0) { console.error(`emit failed (exit ${r.status})`); process.exit(r.status || 1); } } main();