code-auditor-mcp 3.0.5 → 3.0.7

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.
Files changed (76) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.md +31 -1
  3. package/dist/cli.js +416 -111
  4. package/dist/cli.js.map +1 -1
  5. package/dist/generators/AWSQConfigGenerator.d.ts +20 -0
  6. package/dist/generators/AWSQConfigGenerator.d.ts.map +1 -1
  7. package/dist/generators/AWSQConfigGenerator.js +48 -19
  8. package/dist/generators/AWSQConfigGenerator.js.map +1 -1
  9. package/dist/generators/AiderConfigGenerator.d.ts +18 -0
  10. package/dist/generators/AiderConfigGenerator.d.ts.map +1 -1
  11. package/dist/generators/AiderConfigGenerator.js +48 -10
  12. package/dist/generators/AiderConfigGenerator.js.map +1 -1
  13. package/dist/generators/ClaudeConfigGenerator.d.ts +9 -3
  14. package/dist/generators/ClaudeConfigGenerator.d.ts.map +1 -1
  15. package/dist/generators/ClaudeConfigGenerator.js +30 -42
  16. package/dist/generators/ClaudeConfigGenerator.js.map +1 -1
  17. package/dist/generators/ClineConfigGenerator.d.ts +13 -0
  18. package/dist/generators/ClineConfigGenerator.d.ts.map +1 -1
  19. package/dist/generators/ClineConfigGenerator.js +44 -11
  20. package/dist/generators/ClineConfigGenerator.js.map +1 -1
  21. package/dist/generators/CodeiumConfigGenerator.d.ts +15 -0
  22. package/dist/generators/CodeiumConfigGenerator.d.ts.map +1 -1
  23. package/dist/generators/CodeiumConfigGenerator.js +45 -15
  24. package/dist/generators/CodeiumConfigGenerator.js.map +1 -1
  25. package/dist/generators/CodexConfigGenerator.d.ts +29 -0
  26. package/dist/generators/CodexConfigGenerator.d.ts.map +1 -0
  27. package/dist/generators/CodexConfigGenerator.js +80 -0
  28. package/dist/generators/CodexConfigGenerator.js.map +1 -0
  29. package/dist/generators/ConfigGeneratorFactory.d.ts +10 -1
  30. package/dist/generators/ConfigGeneratorFactory.d.ts.map +1 -1
  31. package/dist/generators/ConfigGeneratorFactory.js +22 -8
  32. package/dist/generators/ConfigGeneratorFactory.js.map +1 -1
  33. package/dist/generators/ContinueConfigGenerator.d.ts +16 -1
  34. package/dist/generators/ContinueConfigGenerator.d.ts.map +1 -1
  35. package/dist/generators/ContinueConfigGenerator.js +41 -73
  36. package/dist/generators/ContinueConfigGenerator.js.map +1 -1
  37. package/dist/generators/CopilotConfigGenerator.d.ts +13 -2
  38. package/dist/generators/CopilotConfigGenerator.d.ts.map +1 -1
  39. package/dist/generators/CopilotConfigGenerator.js +31 -51
  40. package/dist/generators/CopilotConfigGenerator.js.map +1 -1
  41. package/dist/generators/CursorConfigGenerator.d.ts +8 -1
  42. package/dist/generators/CursorConfigGenerator.d.ts.map +1 -1
  43. package/dist/generators/CursorConfigGenerator.js +27 -51
  44. package/dist/generators/CursorConfigGenerator.js.map +1 -1
  45. package/dist/generators/GeminiConfigGenerator.d.ts +23 -0
  46. package/dist/generators/GeminiConfigGenerator.d.ts.map +1 -0
  47. package/dist/generators/GeminiConfigGenerator.js +59 -0
  48. package/dist/generators/GeminiConfigGenerator.js.map +1 -0
  49. package/dist/generators/JetBrainsConfigGenerator.d.ts +11 -0
  50. package/dist/generators/JetBrainsConfigGenerator.d.ts.map +1 -1
  51. package/dist/generators/JetBrainsConfigGenerator.js +39 -21
  52. package/dist/generators/JetBrainsConfigGenerator.js.map +1 -1
  53. package/dist/generators/VSCodeConfigGenerator.d.ts +14 -0
  54. package/dist/generators/VSCodeConfigGenerator.d.ts.map +1 -1
  55. package/dist/generators/VSCodeConfigGenerator.js +43 -15
  56. package/dist/generators/VSCodeConfigGenerator.js.map +1 -1
  57. package/dist/hooks/codex.d.ts +20 -0
  58. package/dist/hooks/codex.d.ts.map +1 -0
  59. package/dist/hooks/codex.js +91 -0
  60. package/dist/hooks/codex.js.map +1 -0
  61. package/dist/hooks/core.d.ts +62 -0
  62. package/dist/hooks/core.d.ts.map +1 -0
  63. package/dist/hooks/core.js +119 -0
  64. package/dist/hooks/core.js.map +1 -0
  65. package/dist/hooks/cursor.d.ts +72 -0
  66. package/dist/hooks/cursor.d.ts.map +1 -0
  67. package/dist/hooks/cursor.js +163 -0
  68. package/dist/hooks/cursor.js.map +1 -0
  69. package/dist/installer.d.ts +30 -0
  70. package/dist/installer.d.ts.map +1 -0
  71. package/dist/installer.js +355 -0
  72. package/dist/installer.js.map +1 -0
  73. package/dist/mcp-tools/whitelistTools.d.ts +1 -1
  74. package/package.json +3 -2
  75. package/plugin/.claude-plugin/plugin.json +1 -1
  76. package/plugin/skills/code-auditor/SKILL.md +13 -5
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Installer — code-audit install subcommand logic.
3
+ *
4
+ * Copies the skill folder to agent-specific paths and optionally wires hooks.
5
+ * Phase 0 live-docs verification (2026-07-19):
6
+ * - Cursor: project-only skills, ~/.cursor/skills/ does NOT exist
7
+ * - Codex: both ~/.codex/skills/ (user) and .codex/skills/ (project)
8
+ * - Cursor afterFileEdit is advisory only (cannot block retroactively)
9
+ * - Codex PostToolUse is blocking (exit 2 replaces tool result)
10
+ */
11
+ import { promises as fs } from 'node:fs';
12
+ import { homedir } from 'node:os';
13
+ import { basename, dirname, join, resolve } from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+ import chalk from 'chalk';
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
18
+ // Source: the repo's skill folder (shipped in the npm package at dist/../plugin/skills/code-auditor)
19
+ const SKILL_SOURCE = join(__dirname, '..', 'plugin', 'skills', 'code-auditor');
20
+ // Version recorded in the copied skill folder for idempotent updates
21
+ const PACKAGE_JSON_PATH = join(__dirname, '..', 'package.json');
22
+ const AGENTS = [
23
+ {
24
+ name: 'claude',
25
+ displayName: 'Claude Code',
26
+ userPath: join(homedir(), '.claude', 'skills'),
27
+ projectPath: '.claude/skills',
28
+ hooksAvailable: true,
29
+ hookType: 'blocking',
30
+ },
31
+ {
32
+ name: 'cursor',
33
+ displayName: 'Cursor',
34
+ userPath: null, // Cursor skills are project-only (verified 2026-07-19)
35
+ projectPath: '.cursor/skills',
36
+ hooksAvailable: true,
37
+ hookType: 'advisory',
38
+ },
39
+ {
40
+ name: 'codex',
41
+ displayName: 'Codex',
42
+ userPath: join(homedir(), '.codex', 'skills'),
43
+ projectPath: '.codex/skills',
44
+ hooksAvailable: true,
45
+ hookType: 'blocking',
46
+ },
47
+ {
48
+ name: 'gemini',
49
+ displayName: 'Gemini CLI',
50
+ userPath: join(homedir(), '.gemini', 'skills'),
51
+ projectPath: '.gemini/skills',
52
+ hooksAvailable: false,
53
+ hookType: 'none',
54
+ },
55
+ {
56
+ name: 'agents',
57
+ displayName: 'Other SKILL.md agents',
58
+ userPath: join(homedir(), '.agents', 'skills'),
59
+ projectPath: '.agents/skills',
60
+ hooksAvailable: false,
61
+ hookType: 'none',
62
+ },
63
+ ];
64
+ /**
65
+ * Main entry point for `code-audit install`.
66
+ */
67
+ export async function runInstall(options) {
68
+ if (options.list) {
69
+ await printMatrix();
70
+ return;
71
+ }
72
+ const agentsToInstall = options.agent === 'all'
73
+ ? AGENTS
74
+ : AGENTS.filter(a => a.name === options.agent);
75
+ if (agentsToInstall.length === 0) {
76
+ console.error(chalk.red(`Unknown agent: "${options.agent}". Use --list to see available agents.`));
77
+ process.exit(1);
78
+ }
79
+ // Verify source skill folder exists
80
+ try {
81
+ await fs.access(join(SKILL_SOURCE, 'SKILL.md'));
82
+ }
83
+ catch {
84
+ console.error(chalk.red(`Skill source not found at ${SKILL_SOURCE}. Is the package installed correctly?`));
85
+ process.exit(1);
86
+ }
87
+ const results = [];
88
+ const packageVersion = await getPackageVersion();
89
+ for (const agent of agentsToInstall) {
90
+ const result = await installForAgent(agent, options.scope, options.hooks, packageVersion);
91
+ results.push(result);
92
+ }
93
+ // Print summary
94
+ console.log(chalk.blue('\n── Install summary ──'));
95
+ for (const r of results) {
96
+ if (r.skipped) {
97
+ console.log(` ${chalk.yellow('⊘')} ${r.displayName}: ${chalk.dim(r.skipReason)}`);
98
+ }
99
+ else {
100
+ const parts = [`${chalk.green('✓')} ${r.displayName}: skill → ${r.skillPath}`];
101
+ if (r.hooksWired)
102
+ parts.push('hooks wired');
103
+ console.log(` ${parts.join(', ')}`);
104
+ }
105
+ }
106
+ console.log('');
107
+ }
108
+ /**
109
+ * Print the support matrix (--list).
110
+ */
111
+ async function printMatrix() {
112
+ const packageVersion = await getPackageVersion();
113
+ console.log(chalk.blue('\ncode-audit install — Support Matrix'));
114
+ console.log(chalk.gray(`Version: ${packageVersion}`));
115
+ console.log(chalk.gray(`Source: ${SKILL_SOURCE}`));
116
+ console.log(chalk.gray('Verified against docs: 2026-07-19\n'));
117
+ // Header
118
+ console.log(`${chalk.bold('Agent'.padEnd(18))} ${chalk.bold('Skill (user)'.padEnd(42))} ${chalk.bold('Skill (project)'.padEnd(22))} ${chalk.bold('Hooks'.padEnd(14))} ${chalk.bold('Installed')}`);
119
+ console.log(chalk.gray('─'.repeat(105)));
120
+ for (const agent of AGENTS) {
121
+ const userPath = agent.userPath
122
+ ? join(agent.userPath, 'code-auditor')
123
+ : chalk.dim('(project-only)');
124
+ const projectPath = join(agent.projectPath, 'code-auditor');
125
+ const hookInfo = agent.hooksAvailable
126
+ ? `yes (${agent.hookType})`
127
+ : 'no';
128
+ // Check if installed
129
+ const projectFull = resolve(process.cwd(), agent.projectPath, 'code-auditor');
130
+ let installed = 'no';
131
+ try {
132
+ await fs.access(join(projectFull, 'SKILL.md'));
133
+ installed = chalk.green('yes (project)');
134
+ }
135
+ catch {
136
+ if (agent.userPath) {
137
+ try {
138
+ await fs.access(join(agent.userPath, 'code-auditor', 'SKILL.md'));
139
+ installed = chalk.green('yes (user)');
140
+ }
141
+ catch {
142
+ installed = chalk.red('no');
143
+ }
144
+ }
145
+ else {
146
+ installed = chalk.red('no');
147
+ }
148
+ }
149
+ console.log(`${agent.displayName.padEnd(18)} ${String(userPath).padEnd(42)} ${String(projectPath).padEnd(22)} ${hookInfo.padEnd(14)} ${installed}`);
150
+ }
151
+ console.log('');
152
+ }
153
+ /**
154
+ * Install the skill for one agent.
155
+ */
156
+ async function installForAgent(agent, scope, offerHooks, version) {
157
+ const result = {
158
+ agent: agent.name,
159
+ displayName: agent.displayName,
160
+ skillPath: '',
161
+ installed: false,
162
+ hooksWired: false,
163
+ skipped: false,
164
+ };
165
+ // Determine the target path
166
+ let targetParent = null;
167
+ if (scope === 'user') {
168
+ if (!agent.userPath) {
169
+ result.skipped = true;
170
+ result.skipReason = `${agent.displayName} does not support user-scope skills (project-only). Use --scope project.`;
171
+ console.log(chalk.yellow(`⊘ ${agent.displayName}: user-scope not supported. Skills are project-only. Use --scope project.`));
172
+ return result;
173
+ }
174
+ targetParent = agent.userPath;
175
+ }
176
+ else {
177
+ targetParent = resolve(process.cwd(), agent.projectPath);
178
+ }
179
+ const targetDir = join(targetParent, 'code-auditor');
180
+ // Check if the parent tool directory exists (for --agent all, skip if tool not present)
181
+ if (scope === 'user' && agent.userPath) {
182
+ try {
183
+ await fs.access(agent.userPath);
184
+ }
185
+ catch {
186
+ result.skipped = true;
187
+ result.skipReason = `Parent directory ${agent.userPath} does not exist (${agent.displayName} not installed?).`;
188
+ console.log(chalk.yellow(`⊘ ${agent.displayName}: ${agent.userPath} not found — skipping (tool not installed?).`));
189
+ return result;
190
+ }
191
+ }
192
+ // Create the target directory
193
+ await fs.mkdir(targetDir, { recursive: true });
194
+ // Copy skill files
195
+ const skillFiles = ['SKILL.md', 'SKILL-SEARCH.md', 'SKILL-RULE-KINDS.md'];
196
+ for (const file of skillFiles) {
197
+ const src = join(SKILL_SOURCE, file);
198
+ try {
199
+ await fs.copyFile(src, join(targetDir, file));
200
+ }
201
+ catch (err) {
202
+ // Source file missing — skip (non-fatal: SKILL.md is required, companions are optional)
203
+ if (file === 'SKILL.md')
204
+ throw err;
205
+ }
206
+ }
207
+ // Write version marker
208
+ await fs.writeFile(join(targetDir, '.code-auditor-version'), `${version}\n`);
209
+ result.skillPath = targetDir;
210
+ result.installed = true;
211
+ console.log(chalk.green(`✓ ${agent.displayName}: skill installed to ${targetDir}`));
212
+ // Hook wiring (only for agents with hook support, and only with confirmation)
213
+ if (offerHooks && agent.hooksAvailable) {
214
+ const wired = await offerHookWiring(agent, scope);
215
+ result.hooksWired = wired;
216
+ }
217
+ return result;
218
+ }
219
+ /**
220
+ * Offer to wire hooks for an agent. Shows the exact JSON and requires confirmation.
221
+ * Returns true if hooks were wired, false if user declined.
222
+ */
223
+ async function offerHookWiring(agent, scope) {
224
+ const hookConfig = getHookConfig(agent, scope);
225
+ if (!hookConfig)
226
+ return false;
227
+ const { configFile, json } = hookConfig;
228
+ // In non-interactive mode (--hooks or --no-hooks flag), we already got the answer
229
+ // For simplicity in CLI mode, always show the proposed change and ask via inquirer
230
+ console.log(chalk.cyan(`\n Hook wiring for ${agent.displayName}:`));
231
+ console.log(chalk.gray(` File: ${configFile}`));
232
+ console.log(chalk.gray(` Will add:`));
233
+ console.log(chalk.dim(` ${JSON.stringify(json, null, 2).replace(/\n/g, '\n ')}`));
234
+ // Use inquirer for confirmation
235
+ try {
236
+ const inquirer = (await import('inquirer')).default;
237
+ const { confirmed } = await inquirer.prompt({
238
+ type: 'confirm',
239
+ name: 'confirmed',
240
+ message: ` Write this hook config to ${basename(configFile)}?`,
241
+ default: false,
242
+ });
243
+ if (!confirmed) {
244
+ console.log(chalk.yellow(` ⊘ Hook wiring skipped for ${agent.displayName}`));
245
+ return false;
246
+ }
247
+ // Ensure directory exists
248
+ await fs.mkdir(dirname(configFile), { recursive: true });
249
+ // Check if config already exists; merge if so
250
+ let existing = {};
251
+ try {
252
+ const raw = await fs.readFile(configFile, 'utf-8');
253
+ existing = JSON.parse(raw);
254
+ }
255
+ catch {
256
+ // File doesn't exist or is invalid — start fresh
257
+ }
258
+ // Merge the hook entry
259
+ const merged = deepMerge(existing, json);
260
+ await fs.writeFile(configFile, JSON.stringify(merged, null, 2) + '\n');
261
+ console.log(chalk.green(` ✓ Hook wired for ${agent.displayName}`));
262
+ return true;
263
+ }
264
+ catch {
265
+ // inquirer not available or user aborted — skip hook wiring
266
+ console.log(chalk.yellow(` ⊘ Hook wiring skipped for ${agent.displayName} (non-interactive). Use --hooks to force.`));
267
+ return false;
268
+ }
269
+ }
270
+ /**
271
+ * Get the hook config snippet for a given agent.
272
+ */
273
+ function getHookConfig(agent, scope) {
274
+ switch (agent.name) {
275
+ case 'claude': {
276
+ const configDir = scope === 'user'
277
+ ? join(homedir(), '.claude')
278
+ : resolve(process.cwd(), '.claude');
279
+ // Claude Code uses plugin.json, not per-project hooks.json
280
+ // For --agent claude, we tell the user to use the plugin instead
281
+ console.log(chalk.yellow(` ⊘ Claude Code uses the code-auditor plugin for hooks, not direct hook wiring.`));
282
+ console.log(chalk.gray(` Use: claude plugin install code-auditor`));
283
+ return null;
284
+ }
285
+ case 'cursor': {
286
+ const configFile = scope === 'user'
287
+ ? join(homedir(), '.cursor', 'hooks.json')
288
+ : resolve(process.cwd(), '.cursor', 'hooks.json');
289
+ return {
290
+ configFile,
291
+ json: {
292
+ hooks: {
293
+ afterFileEdit: [
294
+ {
295
+ command: 'npx -y code-auditor-mcp code-audit cursor-hook',
296
+ },
297
+ ],
298
+ },
299
+ },
300
+ };
301
+ }
302
+ case 'codex': {
303
+ const configFile = scope === 'user'
304
+ ? join(homedir(), '.codex', 'hooks.json')
305
+ : resolve(process.cwd(), '.codex', 'hooks.json');
306
+ return {
307
+ configFile,
308
+ json: {
309
+ hooks: {
310
+ PostToolUse: [
311
+ {
312
+ matcher: 'apply_patch',
313
+ hooks: [
314
+ {
315
+ type: 'command',
316
+ command: 'npx -y code-auditor-mcp code-audit codex-hook',
317
+ },
318
+ ],
319
+ },
320
+ ],
321
+ },
322
+ },
323
+ };
324
+ }
325
+ default:
326
+ return null;
327
+ }
328
+ }
329
+ /**
330
+ * Deep merge two objects. b's values take precedence over a's.
331
+ */
332
+ function deepMerge(a, b) {
333
+ if (typeof a !== 'object' || a === null || Array.isArray(a))
334
+ return b ?? a;
335
+ if (typeof b !== 'object' || b === null || Array.isArray(b))
336
+ return b;
337
+ const result = { ...a };
338
+ for (const key of Object.keys(b)) {
339
+ result[key] = deepMerge(a[key], b[key]);
340
+ }
341
+ return result;
342
+ }
343
+ /**
344
+ * Get the package version from package.json.
345
+ */
346
+ async function getPackageVersion() {
347
+ try {
348
+ const raw = await fs.readFile(PACKAGE_JSON_PATH, 'utf-8');
349
+ return JSON.parse(raw).version || 'unknown';
350
+ }
351
+ catch {
352
+ return 'unknown';
353
+ }
354
+ }
355
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { WhitelistType, WhitelistStatus } from '../types/whitelist.js';
5
5
  export declare function handleWhitelistGet(args: any): Promise<{
6
+ error?: undefined;
6
7
  success: boolean;
7
8
  count: number;
8
9
  entries: {
@@ -15,7 +16,6 @@ export declare function handleWhitelistGet(args: any): Promise<{
15
16
  addedBy: "auto-detect" | "llm" | "system" | "user";
16
17
  addedAt: Date;
17
18
  }[];
18
- error?: undefined;
19
19
  } | {
20
20
  count?: undefined;
21
21
  entries?: undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "code-auditor-mcp",
3
- "version": "3.0.5",
3
+ "version": "3.0.7",
4
4
  "description": "Architectural invariants and code quality analysis, enforced inside your AI agent's edit loop. MCP server + CLI + Claude Code plugin. TypeScript, JavaScript, Go.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -11,9 +11,10 @@
11
11
  "code-auditor-mcp": "dist/mcp.js"
12
12
  },
13
13
  "scripts": {
14
- "build": "tsc && pnpm run build:grammars && pnpm run download:natives",
14
+ "build": "tsc && pnpm run build:grammars && pnpm run download:natives && pnpm run build:skills",
15
15
  "download:natives": "bash scripts/download-natives.sh",
16
16
  "build:grammars": "cp node_modules/tree-sitter-typescript/tree-sitter-typescript.wasm node_modules/tree-sitter-typescript/tree-sitter-tsx.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm node_modules/tree-sitter-go/tree-sitter-go.wasm dist/grammars/",
17
+ "build:skills": "cp -r plugin/skills/* ../skills/",
17
18
  "watch": "tsc --watch",
18
19
  "dev": "tsx src/cli.ts",
19
20
  "dev:server": "tsx --watch src/cli.ts start --rest-api",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "code-auditor",
3
3
  "description": "Diff-scoped code quality auditing on every edit. Indexes your codebase, enforces invariants, and feeds violations back to the agent so fixes happen inline.",
4
- "version": "3.0.5",
4
+ "version": "3.0.6",
5
5
  "author": {
6
6
  "name": "Ben Hammond",
7
7
  "email": "ben@benhammond.tech"
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: code-auditor
2
3
  description: Audit code quality, search the codebase semantically, enforce invariants, and fix violations inline.
3
4
  ---
4
5
 
@@ -82,18 +83,17 @@ code-audit map -p . # Generate a codebase map
82
83
 
83
84
  Use this for a high-level architecture overview. Useful when orienting in an unfamiliar codebase.
84
85
 
85
- ### `code-audit generate-config` — generate AI tool integration configs
86
+ ### `code-audit generate-config` — create a default config
86
87
 
87
88
  ```bash
88
- code-audit generate-config # Generate MCP configs for AI coding tools
89
- code-audit generate-config --tool claude # Claude-specific MCP config
89
+ code-audit generate-config # Create .codeauditor.json from defaults
90
90
  ```
91
91
 
92
- Creates MCP server configuration files for AI coding assistants (Claude, Cursor, Continue, Copilot, etc.) so they can connect to code-auditor as an MCP server.
92
+ Creates a `.codeauditor.json` configuration file with invariant rules for your project. Use the interactive mode (`--interactive`) to build rules step-by-step, or generate a scaffold with sensible defaults.
93
93
 
94
94
  ## Interpreting hook feedback
95
95
 
96
- When the PostToolUse hook blocks your edit with a violation message:
96
+ When an edit hook blocks your edit with a violation message:
97
97
 
98
98
  1. **Read the violation** — it includes the invariant rule's `message` field explaining *why* the edit was blocked
99
99
  2. **Fix the violation** — change your approach to comply with the invariant
@@ -102,6 +102,14 @@ When the PostToolUse hook blocks your edit with a violation message:
102
102
 
103
103
  The hook auto-installs the package via npx on first use — no manual npm step needed. If the hook reports `[code-auditor] code-audit could not run`, the npx auto-install failed (network, unsupported platform). The agent should try again; if it persists, `npm install code-auditor-mcp` is the manual fix.
104
104
 
105
+ ## Host-specific notes
106
+
107
+ - **Claude Code**: This skill is bundled in the `code-auditor` plugin (`claude plugin install code-auditor`). The plugin also ships a `PostToolUse` hook on `Write|Edit` that runs `code-audit changed --fail-on critical` automatically — the hook feedback section above describes that behavior. The MCP server is available as `mcp__code-auditor__*` tools for shell-less use.
108
+ - **Cursor**: Skill install via `code-audit install --agent cursor`. Cursor's `afterFileEdit` hook is advisory (fires after the edit; cannot block retroactively) — violations are reported through the strongest available feedback channel.
109
+ - **Codex**: Skill install via `code-audit install --agent codex`. Codex's `PostToolUse` hook provides blocking feedback via exit code 2, replacing the tool result with violation messages.
110
+ - **Gemini CLI**: Skill install only (`code-audit install --agent gemini`). No hook system exists; MCP covers shell-less use.
111
+ - **Other SKILL.md-compliant tools**: Install via `code-audit install --agent agents`. The skill teaches the `code-audit` CLI, which is identical everywhere. The MCP server is the shell-less side door.
112
+
105
113
  ## Quick reference
106
114
 
107
115
  | Task | Command |