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.
- package/.claude-plugin/marketplace.json +1 -1
- package/README.md +31 -1
- package/dist/cli.js +416 -111
- package/dist/cli.js.map +1 -1
- package/dist/generators/AWSQConfigGenerator.d.ts +20 -0
- package/dist/generators/AWSQConfigGenerator.d.ts.map +1 -1
- package/dist/generators/AWSQConfigGenerator.js +48 -19
- package/dist/generators/AWSQConfigGenerator.js.map +1 -1
- package/dist/generators/AiderConfigGenerator.d.ts +18 -0
- package/dist/generators/AiderConfigGenerator.d.ts.map +1 -1
- package/dist/generators/AiderConfigGenerator.js +48 -10
- package/dist/generators/AiderConfigGenerator.js.map +1 -1
- package/dist/generators/ClaudeConfigGenerator.d.ts +9 -3
- package/dist/generators/ClaudeConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ClaudeConfigGenerator.js +30 -42
- package/dist/generators/ClaudeConfigGenerator.js.map +1 -1
- package/dist/generators/ClineConfigGenerator.d.ts +13 -0
- package/dist/generators/ClineConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ClineConfigGenerator.js +44 -11
- package/dist/generators/ClineConfigGenerator.js.map +1 -1
- package/dist/generators/CodeiumConfigGenerator.d.ts +15 -0
- package/dist/generators/CodeiumConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CodeiumConfigGenerator.js +45 -15
- package/dist/generators/CodeiumConfigGenerator.js.map +1 -1
- package/dist/generators/CodexConfigGenerator.d.ts +29 -0
- package/dist/generators/CodexConfigGenerator.d.ts.map +1 -0
- package/dist/generators/CodexConfigGenerator.js +80 -0
- package/dist/generators/CodexConfigGenerator.js.map +1 -0
- package/dist/generators/ConfigGeneratorFactory.d.ts +10 -1
- package/dist/generators/ConfigGeneratorFactory.d.ts.map +1 -1
- package/dist/generators/ConfigGeneratorFactory.js +22 -8
- package/dist/generators/ConfigGeneratorFactory.js.map +1 -1
- package/dist/generators/ContinueConfigGenerator.d.ts +16 -1
- package/dist/generators/ContinueConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ContinueConfigGenerator.js +41 -73
- package/dist/generators/ContinueConfigGenerator.js.map +1 -1
- package/dist/generators/CopilotConfigGenerator.d.ts +13 -2
- package/dist/generators/CopilotConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CopilotConfigGenerator.js +31 -51
- package/dist/generators/CopilotConfigGenerator.js.map +1 -1
- package/dist/generators/CursorConfigGenerator.d.ts +8 -1
- package/dist/generators/CursorConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CursorConfigGenerator.js +27 -51
- package/dist/generators/CursorConfigGenerator.js.map +1 -1
- package/dist/generators/GeminiConfigGenerator.d.ts +23 -0
- package/dist/generators/GeminiConfigGenerator.d.ts.map +1 -0
- package/dist/generators/GeminiConfigGenerator.js +59 -0
- package/dist/generators/GeminiConfigGenerator.js.map +1 -0
- package/dist/generators/JetBrainsConfigGenerator.d.ts +11 -0
- package/dist/generators/JetBrainsConfigGenerator.d.ts.map +1 -1
- package/dist/generators/JetBrainsConfigGenerator.js +39 -21
- package/dist/generators/JetBrainsConfigGenerator.js.map +1 -1
- package/dist/generators/VSCodeConfigGenerator.d.ts +14 -0
- package/dist/generators/VSCodeConfigGenerator.d.ts.map +1 -1
- package/dist/generators/VSCodeConfigGenerator.js +43 -15
- package/dist/generators/VSCodeConfigGenerator.js.map +1 -1
- package/dist/hooks/codex.d.ts +20 -0
- package/dist/hooks/codex.d.ts.map +1 -0
- package/dist/hooks/codex.js +91 -0
- package/dist/hooks/codex.js.map +1 -0
- package/dist/hooks/core.d.ts +62 -0
- package/dist/hooks/core.d.ts.map +1 -0
- package/dist/hooks/core.js +119 -0
- package/dist/hooks/core.js.map +1 -0
- package/dist/hooks/cursor.d.ts +72 -0
- package/dist/hooks/cursor.d.ts.map +1 -0
- package/dist/hooks/cursor.js +163 -0
- package/dist/hooks/cursor.js.map +1 -0
- package/dist/installer.d.ts +30 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +355 -0
- package/dist/installer.js.map +1 -0
- package/dist/mcp-tools/whitelistTools.d.ts +1 -1
- package/package.json +3 -2
- package/plugin/.claude-plugin/plugin.json +1 -1
- 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.
|
|
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.
|
|
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` —
|
|
86
|
+
### `code-audit generate-config` — create a default config
|
|
86
87
|
|
|
87
88
|
```bash
|
|
88
|
-
code-audit generate-config #
|
|
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
|
|
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
|
|
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 |
|