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 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 Factory Droid
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) · [![MCPRush scan grade for the Agent Roast MCP server](https://mcprush.com/badge/agent-roast-mcp/score.svg)](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: 0, result });
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) return outcome("pass", agent === "cursor" || agent === "gemini" ? "{}\n" : "", "", result);
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
- const answer = agent === "cursor" ? { followup_message: message } : { decision: agent === "gemini" ? "deny" : "block", reason: message };
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 = { claude: "Claude Code", codex: "Codex", cursor: "Cursor", gemini: "Gemini CLI", copilot: "GitHub Copilot", droid: "Factory Droid" };
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
- if (create && !isObject(data.hooks)) data.hooks = {};
5299
- return isObject(data.hooks) ? data.hooks : void 0;
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(agent === "cursor" ? { command, timeout: TIMEOUT_SECONDS, loop_limit: 2 } : { type: "command", command, timeoutSec: TIMEOUT_SECONDS });
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.hooks;
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
- const listed = asArray(eventMap(agent, data, false)?.[FINISH_EVENT[agent]]);
5373
- const handlers = isFlat(agent) ? listed : listed.flatMap((group) => asArray(group?.hooks));
5374
- command = handlers.map((handler) => handler?.command).find(isOurs);
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-U5MFYERX.js";
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 or Factory Droid 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) => {
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(root, { claude: ".claude", codex: ".codex", cursor: ".cursor", gemini: ".gemini", copilot: ".github/hooks", droid: ".factory" }[agent])));
534
- if (!agents.length) throw new ConfigError("Name the agent to guard: agent-roast hook install claude (or codex, cursor, gemini, copilot, droid).");
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 Factory Droid").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) => {
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
@@ -92,7 +92,7 @@ import {
92
92
  unquoteGitPath,
93
93
  validateExceptions,
94
94
  writeBaseline
95
- } from "./chunk-U5MFYERX.js";
95
+ } from "./chunk-ELOEHPEC.js";
96
96
  export {
97
97
  AGENT_LABELS,
98
98
  CONFIG_FILENAMES,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-roast",
3
- "version": "0.24.0",
4
- "description": "Stops AI agents (and rushed humans) weakening tests, coverage gates or CI to get a green build. Hook for Claude Code, Codex, Cursor, Gemini CLI, Copilot, Droid; pre-commit; GitHub Action. Offline.",
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",