code-auditor-mcp 3.0.6 → 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/README.md +31 -1
- package/dist/cli.js +51 -0
- 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/skills/code-auditor/SKILL.md +13 -5
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cursor hook adapter — `code-audit cursor-hook`.
|
|
4
|
+
*
|
|
5
|
+
* Reads Cursor's postToolUse stdin JSON (native or Claude Code compat) and
|
|
6
|
+
* runs a scoped audit on edited files. Blocks edits with critical violations.
|
|
7
|
+
*
|
|
8
|
+
* Phase 0 verification (2026-07-20):
|
|
9
|
+
* - Source: cursor.com/docs/hooks + cursor.com/docs/reference/third-party-hooks
|
|
10
|
+
* - postToolUse with Write matcher IS BLOCKING: exit 2 blocks the action
|
|
11
|
+
* - additional_context is injected into the conversation after the tool result
|
|
12
|
+
* - afterFileEdit EXISTS but is observation-only ("No output fields defined")
|
|
13
|
+
* - Cursor natively reads .claude/settings.json hooks (PostToolUse→postToolUse)
|
|
14
|
+
* - Tool name mapping: Edit→Write, Bash→Shell
|
|
15
|
+
* - Dual response format support: both Claude nested format and Cursor flat format
|
|
16
|
+
*
|
|
17
|
+
* Input formats (both accepted):
|
|
18
|
+
* Cursor native: { tool_name, tool_input, tool_output, tool_use_id, cwd, ... }
|
|
19
|
+
* Claude Code compat: { tool_name, tool_input, tool_output, session_id, cwd, ... }
|
|
20
|
+
* (CLAUDE_PROJECT_DIR env var set in Claude Code compat mode)
|
|
21
|
+
*
|
|
22
|
+
* Exit codes:
|
|
23
|
+
* 0 — no critical violations found
|
|
24
|
+
* 2 — critical violations found (blocks the action, additional_context injected)
|
|
25
|
+
* 1 — internal error (adapter crash, not violation-related)
|
|
26
|
+
*/
|
|
27
|
+
import { readStdin, runHookAudit } from './core.js';
|
|
28
|
+
import chalk from 'chalk';
|
|
29
|
+
/**
|
|
30
|
+
* Detect whether this is a Write/Edit tool invocation we should audit.
|
|
31
|
+
*/
|
|
32
|
+
export function isWriteOrEdit(event) {
|
|
33
|
+
const toolName = (event.tool_name || event.toolName || '').toLowerCase();
|
|
34
|
+
// Cursor native: "Write" (camelCase mapped). Claude Code compat: "Edit".
|
|
35
|
+
// Also accept "edit", "write" for robustness.
|
|
36
|
+
return toolName === 'write' || toolName === 'edit';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Extract the edited file path from tool_input.
|
|
40
|
+
* Cursor Write: tool_input.file_path
|
|
41
|
+
* Claude Code Edit: tool_input.file_path
|
|
42
|
+
*/
|
|
43
|
+
export function extractFilePath(event) {
|
|
44
|
+
const input = event.tool_input || event.toolInput;
|
|
45
|
+
if (!input)
|
|
46
|
+
return null;
|
|
47
|
+
const filePath = input.file_path;
|
|
48
|
+
if (filePath && typeof filePath === 'string')
|
|
49
|
+
return filePath;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build the additional_context string for violations.
|
|
54
|
+
*/
|
|
55
|
+
export function formatViolationContext(output) {
|
|
56
|
+
const criticals = output.violations.filter((v) => v.severity === 'critical');
|
|
57
|
+
const warnings = output.violations.filter((v) => v.severity === 'warning');
|
|
58
|
+
const suggestions = output.violations.filter((v) => v.severity === 'suggestion');
|
|
59
|
+
if (criticals.length > 0) {
|
|
60
|
+
const lines = [
|
|
61
|
+
`🚨 **Code Auditor found ${criticals.length} critical violation(s)**`,
|
|
62
|
+
'',
|
|
63
|
+
...criticals.map((v) => `- **${v.file}${v.line ? `:${v.line}` : ''}** — ${v.message}` +
|
|
64
|
+
(v.suggestion ? `\n Suggestion: ${v.suggestion}` : '')),
|
|
65
|
+
];
|
|
66
|
+
if (warnings.length > 0 || suggestions.length > 0) {
|
|
67
|
+
lines.push('', `Also found: ${warnings.length} warning(s), ${suggestions.length} suggestion(s).`);
|
|
68
|
+
}
|
|
69
|
+
lines.push('', 'Fix the critical violations above and retry. The edit has been blocked.');
|
|
70
|
+
return { context: lines.join('\n'), isBlocking: true };
|
|
71
|
+
}
|
|
72
|
+
if (warnings.length > 0 || suggestions.length > 0) {
|
|
73
|
+
const notes = [];
|
|
74
|
+
if (warnings.length > 0) {
|
|
75
|
+
notes.push(`${warnings.length} warning(s):`);
|
|
76
|
+
warnings.forEach((v) => {
|
|
77
|
+
notes.push(` - ${v.file}${v.line ? `:${v.line}` : ''} — ${v.message}`);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
if (suggestions.length > 0) {
|
|
81
|
+
notes.push(`${suggestions.length} suggestion(s):`);
|
|
82
|
+
suggestions.forEach((v) => {
|
|
83
|
+
notes.push(` - ${v.file}${v.line ? `:${v.line}` : ''} — ${v.message}`);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
context: `ℹ️ **Code Auditor notes:**\n${notes.join('\n')}`,
|
|
88
|
+
isBlocking: false,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return { context: '', isBlocking: false };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Process a Cursor postToolUse event and return the hook result.
|
|
95
|
+
* Extracted from main() for testability — tests inject a mock audit function.
|
|
96
|
+
*/
|
|
97
|
+
export async function processCursorEvent(rawStdin, auditFn = async (filePaths, projectRoot) => runHookAudit({ filePaths, projectRoot, failOn: 'critical' })) {
|
|
98
|
+
const result = { exitCode: 0, stdout: '', stderr: '' };
|
|
99
|
+
if (!rawStdin) {
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
let event;
|
|
103
|
+
try {
|
|
104
|
+
event = JSON.parse(rawStdin);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
result.stderr = chalk.red(`[code-auditor cursor-hook] Failed to parse stdin JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
108
|
+
// Degrade gracefully — never wedge the agent on parse errors
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
// Guard: only audit Write/Edit tool calls
|
|
112
|
+
if (!isWriteOrEdit(event)) {
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
const filePath = extractFilePath(event);
|
|
116
|
+
if (!filePath) {
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
// Determine project root:
|
|
120
|
+
// 1. cwd from the event (native Cursor)
|
|
121
|
+
// 2. CLAUDE_PROJECT_DIR env var (Claude Code compat mode)
|
|
122
|
+
// 3. process.cwd() fallback
|
|
123
|
+
const projectRoot = (event.cwd && event.cwd.trim()) ||
|
|
124
|
+
process.env.CLAUDE_PROJECT_DIR ||
|
|
125
|
+
process.cwd();
|
|
126
|
+
try {
|
|
127
|
+
const output = await auditFn([filePath], projectRoot);
|
|
128
|
+
const { context, isBlocking } = formatViolationContext(output);
|
|
129
|
+
if (context) {
|
|
130
|
+
const response = { additional_context: context };
|
|
131
|
+
result.stdout = JSON.stringify(response) + '\n';
|
|
132
|
+
if (isBlocking) {
|
|
133
|
+
result.exitCode = 2;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
result.stderr = chalk.red(`[code-auditor cursor-hook] Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
139
|
+
// Internal error — never wedge the agent loop
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* CLI entry point — reads stdin, processes, writes result, exits.
|
|
145
|
+
* Exported so the CLI can call it explicitly after importing.
|
|
146
|
+
*/
|
|
147
|
+
export async function main() {
|
|
148
|
+
const raw = await readStdin();
|
|
149
|
+
const result = await processCursorEvent(raw);
|
|
150
|
+
if (result.stderr) {
|
|
151
|
+
console.error(result.stderr);
|
|
152
|
+
}
|
|
153
|
+
if (result.stdout) {
|
|
154
|
+
process.stdout.write(result.stdout);
|
|
155
|
+
}
|
|
156
|
+
process.exit(result.exitCode);
|
|
157
|
+
}
|
|
158
|
+
// Auto-run when executed as an entry point (not imported by tests)
|
|
159
|
+
// vitest sets process.env.VITEST; when set, tests call processCursorEvent directly
|
|
160
|
+
if (!process.env.VITEST) {
|
|
161
|
+
main();
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/hooks/cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
export interface InstallOptions {
|
|
12
|
+
agent: string;
|
|
13
|
+
scope: 'user' | 'project';
|
|
14
|
+
hooks: boolean;
|
|
15
|
+
list: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface InstallResult {
|
|
18
|
+
agent: string;
|
|
19
|
+
displayName: string;
|
|
20
|
+
skillPath: string;
|
|
21
|
+
installed: boolean;
|
|
22
|
+
hooksWired: boolean;
|
|
23
|
+
skipped: boolean;
|
|
24
|
+
skipReason?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Main entry point for `code-audit install`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function runInstall(options: InstallOptions): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CvE"}
|
|
@@ -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,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 |
|