@golden-frijoles/kit 0.24.0 → 0.24.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.
@@ -53,10 +53,10 @@ export const AGENT_BIN = {
53
53
  // Harmless here since AGY_MODEL/AGY_FALLBACK_MODEL below are always valid, listed model names (checked via
54
54
  // `agy models`), but it means a future typo in either constant would silently review with the WRONG model
55
55
  // instead of failing loud — watch for that if either constant is ever edited.
56
- // agy-doctor: last verified 2026-10-02 against 1.2.15.
56
+ // agy-doctor: last verified 2026-10-03 against 1.2.16.
57
57
  // ^ machine-managed marker — `node scripts/cross-agent-doctor.mjs agy --fix` rewrites it (with the constant
58
58
  // below) after a green live contract probe. Don't hand-edit the marker's shape.
59
- export const AGY_PINNED = '1.2.15';
59
+ export const AGY_PINNED = '1.2.16';
60
60
 
61
61
  // agy's `--print` mode prints NOTHING unless `--model` names a model — and, crucially, it ALSO prints
62
62
  // nothing (exit 0, empty stdout — the error lands only in agy's log, see --log-file) when the model is
@@ -1405,6 +1405,18 @@ export function runClaudeCode(prompt, stdin, opts = {}, deps = {}) {
1405
1405
  // over agy's argv path for large diffs. Empty stdout is a failure (a quota-capped devin, like agy, exits 0
1406
1406
  // with nothing). Uses the account default model. `deps` is injectable so a node:test drives it without a
1407
1407
  // real devin binary or touching the real filesystem.
1408
+ /**
1409
+ * The line of devin's stderr that says what went wrong. Devin ends its errors with a JSON detail block, so the LAST
1410
+ * line is a bare `}` — which is all the 📝 rail logged for ten days while the real line read "Your weekly usage quota
1411
+ * has been exhausted". Prefer the first `Error:` line, else the last line that is not JSON punctuation.
1412
+ */
1413
+ export function devinErrorLine(stderr) {
1414
+ const lines = String(stderr || '').trim().split('\n').map((l) => l.trim()).filter(Boolean);
1415
+ const error = lines.find((l) => /^error\b/i.test(l));
1416
+ if (error) return error.replace(/:?\s*\{\s*$/, '');
1417
+ return lines.filter((l) => !/^[{}\[\],]+$/.test(l)).pop() || 'unknown error';
1418
+ }
1419
+
1408
1420
  export function runDevin(prompt, opts = {}, deps = {}) {
1409
1421
  const { spawn = spawnSync, writeFile = writeFileSync, mkdtemp = mkdtempSync, rm = rmSync } = deps;
1410
1422
  let dir;
@@ -1425,10 +1437,7 @@ export function runDevin(prompt, opts = {}, deps = {}) {
1425
1437
  opts.soft,
1426
1438
  `devin not found or failed to spawn (${r.error.message}) — install the Devin CLI or use --agent codex/antigravity.`
1427
1439
  );
1428
- if (r.status !== 0) {
1429
- const last = (r.stderr || '').trim().split('\n').filter(Boolean).pop() || 'unknown error';
1430
- return fail(opts.soft, `devin -p failed: ${last}`);
1431
- }
1440
+ if (r.status !== 0) return fail(opts.soft, `devin -p failed: ${devinErrorLine(r.stderr)}`);
1432
1441
  const out = (r.stdout || '').trim();
1433
1442
  if (!out) {
1434
1443
  return fail(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@golden-frijoles/kit",
3
- "version": "0.24.0",
3
+ "version": "0.24.1",
4
4
  "description": "The scripts the Golden Frijoles skills run, packaged so they work in any repo: planning, build-order, reporting and verification rails. Zero dependencies.",
5
5
  "type": "module",
6
6
  "bin": {