agent-roast 0.24.0 → 0.25.0
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 +3 -1
- package/dist/{chunk-U5MFYERX.js → chunk-ELOEHPEC.js} +61 -17
- package/dist/cli.js +13 -8
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ npx agent-roast # review what you have not committed yet (on a clean tr
|
|
|
37
37
|
## Stop your coding agent from doing it
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
|
-
npx agent-roast hook install # Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and
|
|
40
|
+
npx agent-roast hook install # Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Factory Droid, Kiro and Antigravity CLI
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
For Claude Code there is also a plugin: `/plugin install agent-roast --marketplace Nari-Ab/agent-roast`. Any agent that speaks
|
|
@@ -167,6 +167,8 @@ It is a review aid. It cannot prove who wrote a change or that code is correct,
|
|
|
167
167
|
configuration, exceptions, baselines, limits) · [Comparison](docs/comparison.md) · [Measurements](docs/benchmarks.md) ·
|
|
168
168
|
[Real blocks](docs/examples.md) · [Try it on your repository](docs/pilot.md) · [Contributing](CONTRIBUTING.md) · [Changelog](CHANGELOG.md)
|
|
169
169
|
|
|
170
|
+
[MCP server setup](docs/integrations.md#mcp-server) · [](https://mcprush.com/nari-ab/agent-roast-mcp)
|
|
171
|
+
|
|
170
172
|
Found a finding that was wrong, or a shortcut it missed? That is the most useful report there is:
|
|
171
173
|
[open an issue](https://github.com/Nari-Ab/agent-roast/issues/new/choose).
|
|
172
174
|
|
|
@@ -5095,7 +5095,7 @@ function formatReplayTerminal(result, allRules = false) {
|
|
|
5095
5095
|
// src/hook.ts
|
|
5096
5096
|
import path8 from "path";
|
|
5097
5097
|
import * as fs7 from "fs/promises";
|
|
5098
|
-
var HOOK_AGENTS = ["claude", "codex", "cursor", "gemini", "copilot", "droid"];
|
|
5098
|
+
var HOOK_AGENTS = ["claude", "codex", "cursor", "gemini", "copilot", "droid", "kiro", "antigravity"];
|
|
5099
5099
|
var DEFAULT_TIMEOUT_MS = 25e3;
|
|
5100
5100
|
var PAUSE_FILE = "agent-roast-hook-paused";
|
|
5101
5101
|
var LISTED = 6;
|
|
@@ -5103,14 +5103,16 @@ var LISTED_WARNINGS = 3;
|
|
|
5103
5103
|
function detectAgent(input) {
|
|
5104
5104
|
if ("workspace_roots" in input || "cursor_version" in input || "conversation_id" in input) return "cursor";
|
|
5105
5105
|
if (input.hook_event_name === "AfterAgent" || "prompt_response" in input) return "gemini";
|
|
5106
|
+
if ("conversationId" in input || "fullyIdle" in input) return "antigravity";
|
|
5106
5107
|
if ("turn_id" in input) return "codex";
|
|
5107
5108
|
return "claude";
|
|
5108
5109
|
}
|
|
5109
5110
|
function inputCwd(agent, input, env) {
|
|
5110
5111
|
const roots = input.workspace_roots;
|
|
5111
5112
|
if (agent === "cursor" && Array.isArray(roots) && typeof roots[0] === "string") return roots[0];
|
|
5113
|
+
if (agent === "antigravity" && Array.isArray(input.workspacePaths) && typeof input.workspacePaths[0] === "string") return input.workspacePaths[0];
|
|
5112
5114
|
if (typeof input.cwd === "string" && input.cwd) return input.cwd;
|
|
5113
|
-
return env.CLAUDE_PROJECT_DIR || env.CURSOR_PROJECT_DIR || env.GEMINI_PROJECT_DIR || env.FACTORY_PROJECT_DIR || process.cwd();
|
|
5115
|
+
return env.CLAUDE_PROJECT_DIR || env.CURSOR_PROJECT_DIR || env.GEMINI_PROJECT_DIR || env.FACTORY_PROJECT_DIR || env.KIRO_PROJECT_DIR || env.ANTIGRAVITY_PROJECT_DIR || process.cwd();
|
|
5114
5116
|
}
|
|
5115
5117
|
function clip(text, limit) {
|
|
5116
5118
|
const flat = terminalText(text).replace(/\s+/g, " ").trim();
|
|
@@ -5174,7 +5176,7 @@ function parseDuration(text) {
|
|
|
5174
5176
|
if (!match || Number(match[1]) < 1) throw new ConfigError("Use a duration such as 30m, 2h or 1d.");
|
|
5175
5177
|
return Number(match[1]) * { m: 6e4, h: 36e5, d: 864e5 }[match[2].toLowerCase()];
|
|
5176
5178
|
}
|
|
5177
|
-
var outcome = (action, stdout = "", stderr = "", result) => ({ action, stdout, stderr, exitCode
|
|
5179
|
+
var outcome = (action, stdout = "", stderr = "", result, exitCode = 0) => ({ action, stdout, stderr, exitCode, result });
|
|
5178
5180
|
async function runHook(rawInput, options = {}) {
|
|
5179
5181
|
const env = options.env ?? process.env;
|
|
5180
5182
|
let input = {};
|
|
@@ -5205,16 +5207,25 @@ async function runHook(rawInput, options = {}) {
|
|
|
5205
5207
|
} finally {
|
|
5206
5208
|
clearTimeout(timer);
|
|
5207
5209
|
}
|
|
5208
|
-
if (!result.failedRules.length)
|
|
5210
|
+
if (!result.failedRules.length) {
|
|
5211
|
+
const fine = agent === "cursor" || agent === "gemini" ? "{}\n" : agent === "antigravity" ? '{"decision":"stop"}\n' : "";
|
|
5212
|
+
return outcome("pass", fine, "", result);
|
|
5213
|
+
}
|
|
5209
5214
|
const alreadyAsked = input.stop_hook_active === true || typeof input.loop_count === "number" && input.loop_count > 0;
|
|
5210
5215
|
if (alreadyAsked || advisory) {
|
|
5211
5216
|
const warning = formatUserWarning(result);
|
|
5217
|
+
if (agent === "kiro") return outcome("warn", "", advisory ? `${warning}
|
|
5218
|
+
` : "", result);
|
|
5219
|
+
if (agent === "antigravity") return outcome("warn", '{"decision":"stop"}\n', advisory ? `${warning}
|
|
5220
|
+
` : "", result);
|
|
5212
5221
|
const notice = agent === "copilot" ? { type: "progress", message: warning } : { systemMessage: warning };
|
|
5213
5222
|
return outcome("warn", agent === "cursor" ? "{}\n" : JSON.stringify(notice) + "\n", agent === "cursor" && advisory ? `${warning}
|
|
5214
5223
|
` : "", result);
|
|
5215
5224
|
}
|
|
5216
5225
|
const message = formatAgentFeedback(result);
|
|
5217
|
-
|
|
5226
|
+
if (agent === "kiro") return outcome("block", "", `${message}
|
|
5227
|
+
`, result, 1);
|
|
5228
|
+
const answer = agent === "cursor" ? { followup_message: message } : agent === "antigravity" ? { decision: "continue", reason: message } : { decision: agent === "gemini" ? "deny" : "block", reason: message };
|
|
5218
5229
|
return outcome("block", JSON.stringify(answer) + "\n", "", result);
|
|
5219
5230
|
}
|
|
5220
5231
|
|
|
@@ -5225,9 +5236,18 @@ import path9 from "path";
|
|
|
5225
5236
|
import { randomUUID as randomUUID4 } from "crypto";
|
|
5226
5237
|
import { createRequire as createRequire2 } from "module";
|
|
5227
5238
|
import { spawnSync as spawnSync3 } from "child_process";
|
|
5228
|
-
var AGENT_LABELS = {
|
|
5239
|
+
var AGENT_LABELS = {
|
|
5240
|
+
claude: "Claude Code",
|
|
5241
|
+
codex: "Codex",
|
|
5242
|
+
cursor: "Cursor",
|
|
5243
|
+
gemini: "Gemini CLI",
|
|
5244
|
+
copilot: "GitHub Copilot",
|
|
5245
|
+
droid: "Factory Droid",
|
|
5246
|
+
kiro: "Kiro",
|
|
5247
|
+
antigravity: "Antigravity CLI"
|
|
5248
|
+
};
|
|
5229
5249
|
var TIMEOUT_SECONDS = 60;
|
|
5230
|
-
var FINISH_EVENT = { claude: "Stop", codex: "Stop", cursor: "stop", gemini: "AfterAgent", copilot: "Stop", droid: "Stop" };
|
|
5250
|
+
var FINISH_EVENT = { claude: "Stop", codex: "Stop", cursor: "stop", gemini: "AfterAgent", copilot: "Stop", droid: "Stop", kiro: "Stop", antigravity: "Stop" };
|
|
5231
5251
|
function packageVersion() {
|
|
5232
5252
|
const require3 = createRequire2(import.meta.url);
|
|
5233
5253
|
return String(require3("../package.json").version);
|
|
@@ -5257,6 +5277,8 @@ function hookConfigPath(agent, scope, root, home, env = process.env) {
|
|
|
5257
5277
|
if (agent === "gemini") return path9.join(scope === "global" ? home : root, ".gemini", "settings.json");
|
|
5258
5278
|
if (agent === "copilot") return path9.join(scope === "global" ? env.COPILOT_HOME || path9.join(home, ".copilot") : path9.join(root, ".github"), "hooks", "agent-roast.json");
|
|
5259
5279
|
if (agent === "droid") return path9.join(scope === "global" ? home : root, ".factory", "hooks.json");
|
|
5280
|
+
if (agent === "kiro") return path9.join(scope === "global" ? home : root, ".kiro", "hooks", "agent-roast.json");
|
|
5281
|
+
if (agent === "antigravity") return path9.join(scope === "global" ? path9.join(home, ".gemini", "config") : path9.join(root, ".agents"), "hooks.json");
|
|
5260
5282
|
return path9.join(scope === "global" ? env.CODEX_HOME || path9.join(home, ".codex") : path9.join(root, ".codex"), "hooks.json");
|
|
5261
5283
|
}
|
|
5262
5284
|
function readJsonFile(file) {
|
|
@@ -5293,21 +5315,34 @@ function writeJsonFile(link, json) {
|
|
|
5293
5315
|
}
|
|
5294
5316
|
var asArray = (value) => Array.isArray(value) ? value : [];
|
|
5295
5317
|
var isObject = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
5318
|
+
var containerKey = (agent) => agent === "antigravity" ? "agent-roast" : "hooks";
|
|
5296
5319
|
function eventMap(agent, data, create) {
|
|
5297
5320
|
if (agent === "droid") return data;
|
|
5298
|
-
|
|
5299
|
-
|
|
5321
|
+
const key = containerKey(agent);
|
|
5322
|
+
if (create && !isObject(data[key])) data[key] = {};
|
|
5323
|
+
return isObject(data[key]) ? data[key] : void 0;
|
|
5300
5324
|
}
|
|
5301
|
-
var isFlat = (agent) => agent === "cursor" || agent === "copilot";
|
|
5325
|
+
var isFlat = (agent) => agent === "cursor" || agent === "copilot" || agent === "antigravity";
|
|
5302
5326
|
function addStopHook(agent, data, command) {
|
|
5303
5327
|
const before = JSON.stringify(data);
|
|
5328
|
+
if (agent === "kiro") {
|
|
5329
|
+
data.version ??= "v1";
|
|
5330
|
+
const hooks = asArray(data.hooks);
|
|
5331
|
+
const ours = hooks.find((hook) => isOurs(hook?.action?.command));
|
|
5332
|
+
if (ours) ours.action.command = command;
|
|
5333
|
+
else hooks.push({ name: "agent-roast", trigger: FINISH_EVENT.kiro, action: { type: "command", command }, timeout: TIMEOUT_SECONDS });
|
|
5334
|
+
data.hooks = hooks;
|
|
5335
|
+
return JSON.stringify(data) !== before;
|
|
5336
|
+
}
|
|
5304
5337
|
const events = eventMap(agent, data, true), event = FINISH_EVENT[agent];
|
|
5305
5338
|
if (isFlat(agent)) {
|
|
5306
|
-
data.version ??= 1;
|
|
5339
|
+
if (agent !== "antigravity") data.version ??= 1;
|
|
5307
5340
|
const handlers = asArray(events[event]);
|
|
5308
5341
|
const ours = handlers.find((handler) => isOurs(handler?.command));
|
|
5309
5342
|
if (ours) ours.command = command;
|
|
5310
|
-
else handlers.push(
|
|
5343
|
+
else handlers.push(
|
|
5344
|
+
agent === "cursor" ? { command, timeout: TIMEOUT_SECONDS, loop_limit: 2 } : agent === "antigravity" ? { type: "command", command, timeout: TIMEOUT_SECONDS } : { type: "command", command, timeoutSec: TIMEOUT_SECONDS }
|
|
5345
|
+
);
|
|
5311
5346
|
events[event] = handlers;
|
|
5312
5347
|
} else {
|
|
5313
5348
|
const groups = asArray(events[event]);
|
|
@@ -5320,6 +5355,12 @@ function addStopHook(agent, data, command) {
|
|
|
5320
5355
|
}
|
|
5321
5356
|
function removeStopHook(agent, data) {
|
|
5322
5357
|
const before = JSON.stringify(data);
|
|
5358
|
+
if (agent === "kiro") {
|
|
5359
|
+
const kept = asArray(data.hooks).filter((hook) => !isOurs(hook?.action?.command));
|
|
5360
|
+
if (kept.length) data.hooks = kept;
|
|
5361
|
+
else delete data.hooks;
|
|
5362
|
+
return JSON.stringify(data) !== before;
|
|
5363
|
+
}
|
|
5323
5364
|
const events = eventMap(agent, data, false), event = FINISH_EVENT[agent];
|
|
5324
5365
|
if (!events) return false;
|
|
5325
5366
|
if (isFlat(agent)) {
|
|
@@ -5332,7 +5373,7 @@ function removeStopHook(agent, data) {
|
|
|
5332
5373
|
if (kept.length) events[event] = kept;
|
|
5333
5374
|
else delete events[event];
|
|
5334
5375
|
}
|
|
5335
|
-
if (events !== data && !Object.keys(events).length) delete data
|
|
5376
|
+
if (events !== data && !Object.keys(events).length) delete data[containerKey(agent)];
|
|
5336
5377
|
return JSON.stringify(data) !== before;
|
|
5337
5378
|
}
|
|
5338
5379
|
function context(options) {
|
|
@@ -5362,16 +5403,19 @@ function uninstallHooks(options) {
|
|
|
5362
5403
|
function hookStatus(options) {
|
|
5363
5404
|
const { root, home, env } = context({ ...options, scope: "project" });
|
|
5364
5405
|
const rows = [];
|
|
5365
|
-
for (const agent of ["claude", "codex", "cursor", "gemini", "copilot", "droid"]) {
|
|
5406
|
+
for (const agent of ["claude", "codex", "cursor", "gemini", "copilot", "droid", "kiro", "antigravity"]) {
|
|
5366
5407
|
for (const scope of ["project", "local", "global"]) {
|
|
5367
5408
|
if (scope === "local" && agent !== "claude") continue;
|
|
5368
5409
|
const file = hookConfigPath(agent, scope, root, home, env);
|
|
5369
5410
|
let command;
|
|
5370
5411
|
try {
|
|
5371
5412
|
const data = readJsonFile(file).data;
|
|
5372
|
-
|
|
5373
|
-
|
|
5374
|
-
|
|
5413
|
+
if (agent === "kiro") command = asArray(data.hooks).map((hook) => hook?.action?.command).find(isOurs);
|
|
5414
|
+
else {
|
|
5415
|
+
const listed = asArray(eventMap(agent, data, false)?.[FINISH_EVENT[agent]]);
|
|
5416
|
+
const handlers = isFlat(agent) ? listed : listed.flatMap((group) => asArray(group?.hooks));
|
|
5417
|
+
command = handlers.map((handler) => handler?.command).find(isOurs);
|
|
5418
|
+
}
|
|
5375
5419
|
} catch {
|
|
5376
5420
|
}
|
|
5377
5421
|
rows.push({ agent, scope, file, command, installed: Boolean(command), advisory: isAdvisory(command), action: command ? "unchanged" : "absent" });
|
package/dist/cli.js
CHANGED
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
terminalText,
|
|
39
39
|
uninstallHooks,
|
|
40
40
|
writeBaseline
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-ELOEHPEC.js";
|
|
42
42
|
|
|
43
43
|
// src/cli.ts
|
|
44
44
|
import { Command } from "commander";
|
|
@@ -100,7 +100,7 @@ function isDefaultInvocation(options) {
|
|
|
100
100
|
var NEXT_STEPS = [
|
|
101
101
|
"",
|
|
102
102
|
pc.bold("Next steps"),
|
|
103
|
-
` ${pc.cyan("npx agent-roast hook install")} stop your coding agent from weakening checks (Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Factory Droid)`,
|
|
103
|
+
` ${pc.cyan("npx agent-roast hook install")} stop your coding agent from weakening checks (Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Factory Droid, Kiro, Antigravity CLI)`,
|
|
104
104
|
` ${pc.cyan("npx agent-roast init --ci")} add the pull-request check (GitHub Actions)`,
|
|
105
105
|
` ${pc.cyan("npx agent-roast demo")} see a scripted example`,
|
|
106
106
|
""
|
|
@@ -505,7 +505,7 @@ program.command("demo").description('See what agent-roast reports for a scripted
|
|
|
505
505
|
}
|
|
506
506
|
});
|
|
507
507
|
program.command("audit").description("Score the Git history by the shortcuts it adds (the original agent-roast report)").argument("[path]", "Path to git repository (default: current directory)", ".").action((repoPath) => rootAction(repoPath, { ...program.opts(), forceLegacy: true }));
|
|
508
|
-
var hook = program.command("hook").description("Guard a coding agent: send it back to fix the code when it weakens a check (Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Factory Droid)");
|
|
508
|
+
var hook = program.command("hook").description("Guard a coding agent: send it back to fix the code when it weakens a check (Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Factory Droid, Kiro, Antigravity CLI)");
|
|
509
509
|
hook.command("run").description("Run by the agent when it is about to finish; reads the agent's JSON on stdin and answers in its dialect").option("--agent <agent>", `${HOOK_AGENTS.join(", ")} (detected from the input when omitted)`).option("--advisory", "only warn the person; never send the agent back", false).action(async (opts) => {
|
|
510
510
|
let agent;
|
|
511
511
|
try {
|
|
@@ -525,13 +525,16 @@ hook.command("run").description("Run by the agent when it is about to finish; re
|
|
|
525
525
|
process.exitCode = 0;
|
|
526
526
|
}
|
|
527
527
|
});
|
|
528
|
-
hook.command("install").description("Add the hook to Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot
|
|
528
|
+
hook.command("install").description("Add the hook to Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Factory Droid, Kiro or Antigravity CLI in this repository").argument("[agents...]", `${HOOK_AGENTS.join(", ")} (default: the agents that already have a folder in this repository)`).option("--global", "install for every repository of this user instead", false).option("--local", "Claude Code only: use .claude/settings.local.json, which stays out of Git", false).option("--command <program>", "program to run instead of 'npx --yes agent-roast@<version>', for example 'agent-roast' when installed globally").option("--advisory", "try it without risk: the hook only warns you and never sends the agent back", false).option("--instructions", "also write a short 'keep the checks honest' paragraph into AGENTS.md / CLAUDE.md", false).option("--dry-run", "show what would change without writing anything", false).action((names, opts) => {
|
|
529
529
|
try {
|
|
530
530
|
if (opts.global && opts.local) throw new ConfigError("Choose --global or --local, not both.");
|
|
531
531
|
let agents = parseAgents(names);
|
|
532
532
|
const root = repositoryRoot(process.cwd());
|
|
533
|
-
if (!agents.length) agents = HOOK_AGENTS.filter((agent) => fs.existsSync(path.join(
|
|
534
|
-
|
|
533
|
+
if (!agents.length) agents = HOOK_AGENTS.filter((agent) => fs.existsSync(path.join(
|
|
534
|
+
root,
|
|
535
|
+
{ claude: ".claude", codex: ".codex", cursor: ".cursor", gemini: ".gemini", copilot: ".github/hooks", droid: ".factory", kiro: ".kiro", antigravity: ".agents" }[agent]
|
|
536
|
+
)));
|
|
537
|
+
if (!agents.length) throw new ConfigError("Name the agent to guard: agent-roast hook install claude (or codex, cursor, gemini, copilot, droid, kiro, antigravity).");
|
|
535
538
|
const scope = opts.global ? "global" : opts.local ? "local" : "project";
|
|
536
539
|
const advisory = opts.advisory || program.opts().advisory === true;
|
|
537
540
|
const changes = installHooks({ cwd: process.cwd(), agents, scope, command: opts.command, advisory, dryRun: opts.dryRun });
|
|
@@ -545,6 +548,8 @@ hook.command("install").description("Add the hook to Claude Code, Codex, Cursor,
|
|
|
545
548
|
if (agents.includes("gemini")) console.log("\nGemini CLI warns the first time it sees a project hook, and again when its command changes; /hooks panel shows it.");
|
|
546
549
|
if (agents.includes("copilot")) console.log("\nGitHub Copilot reads hook files when it starts: restart it. The cloud agent loads them from the default branch only.");
|
|
547
550
|
if (agents.includes("droid")) console.log("\nFactory Droid takes a snapshot of its hooks at startup: restart it, and review the hook with /hooks.");
|
|
551
|
+
if (agents.includes("kiro")) console.log("\nKiro reads hooks when a session starts: restart it. Its Stop hook sends the agent back on any error; there is no documented way to tell a first try from a retry, so every run until the agent fixes it sends the agent back again.");
|
|
552
|
+
if (agents.includes("antigravity")) console.log("\nAntigravity CLI reads hooks when a session starts: restart it, or run /hooks to see what is loaded. --advisory is a one-line warning in its log, not a message to you inside the session: Antigravity CLI documents no channel for that.");
|
|
548
553
|
if (!opts.dryRun && advisory) console.log("\nAdvisory mode: when the agent finishes with weakened checks you get a one-line warning and the agent is never sent back.\nStart sending it back: agent-roast hook install (without --advisory) \xB7 remove it: agent-roast hook uninstall");
|
|
549
554
|
else if (!opts.dryRun) console.log("\nWhen the agent is about to finish with weakened checks it is sent back once to fix the code.\nTurn it off for a while: agent-roast hook pause \xB7 only warn instead: agent-roast hook install --advisory \xB7 remove it: agent-roast hook uninstall");
|
|
550
555
|
} catch (error) {
|
|
@@ -552,7 +557,7 @@ hook.command("install").description("Add the hook to Claude Code, Codex, Cursor,
|
|
|
552
557
|
process.exitCode = 2;
|
|
553
558
|
}
|
|
554
559
|
});
|
|
555
|
-
hook.command("uninstall").description("Remove the hook from Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot or
|
|
560
|
+
hook.command("uninstall").description("Remove the hook from Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Factory Droid, Kiro or Antigravity CLI").argument("[agents...]", `${HOOK_AGENTS.join(", ")} (default: all)`).option("--global", "remove it from the user-level files", false).option("--local", "Claude Code only: remove it from .claude/settings.local.json", false).option("--dry-run", "show what would change without writing anything", false).action((names, opts) => {
|
|
556
561
|
try {
|
|
557
562
|
if (opts.global && opts.local) throw new ConfigError("Choose --global or --local, not both.");
|
|
558
563
|
const agents = names.length ? parseAgents(names) : [...HOOK_AGENTS].filter((agent) => !(opts.local && agent !== "claude"));
|
|
@@ -572,7 +577,7 @@ hook.command("status").description("Show where the hook is installed").action(as
|
|
|
572
577
|
const paused = await hookPausedUntil(process.cwd());
|
|
573
578
|
if (paused) console.log(`
|
|
574
579
|
Paused in this repository until ${paused.toLocaleString()} (agent-roast hook resume).`);
|
|
575
|
-
if (!rows.some((row) => row.installed)) console.log("\n Install it with: agent-roast hook install claude (or codex, cursor, gemini, copilot, droid)");
|
|
580
|
+
if (!rows.some((row) => row.installed)) console.log("\n Install it with: agent-roast hook install claude (or codex, cursor, gemini, copilot, droid, kiro, antigravity)");
|
|
576
581
|
} catch (error) {
|
|
577
582
|
console.error(`agent-roast hook status error: ${errorMessage(error)}`);
|
|
578
583
|
process.exitCode = 2;
|
package/dist/index.d.ts
CHANGED
|
@@ -475,7 +475,7 @@ declare function replayHistory(options?: ReplayOptions): Promise<ReplayResult>;
|
|
|
475
475
|
declare function formatReplayTerminal(result: ReplayResult, allRules?: boolean): string;
|
|
476
476
|
|
|
477
477
|
/** Coding agents that can run a command when they are about to finish and feed its answer back. */
|
|
478
|
-
type HookAgent = "claude" | "codex" | "cursor" | "gemini" | "copilot" | "droid";
|
|
478
|
+
type HookAgent = "claude" | "codex" | "cursor" | "gemini" | "copilot" | "droid" | "kiro" | "antigravity";
|
|
479
479
|
declare const HOOK_AGENTS: readonly HookAgent[];
|
|
480
480
|
interface HookOptions {
|
|
481
481
|
/** Which agent is calling. Detected from its input when omitted. */
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-roast",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Stops AI agents (and rushed humans) weakening tests, coverage gates or CI to get a green build. Hook for
|
|
3
|
+
"version": "0.25.0",
|
|
4
|
+
"description": "Stops AI agents (and rushed humans) weakening tests, coverage gates or CI to get a green build. Hook for 8 coding agents, pre-commit, GitHub Action. Offline.",
|
|
5
5
|
"mcpName": "io.github.Nari-Ab/agent-roast",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|