cmp-standards 2.8.1 → 3.1.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/dist/analytics/CrossProjectAnalytics.d.ts +128 -0
- package/dist/analytics/CrossProjectAnalytics.d.ts.map +1 -0
- package/dist/analytics/CrossProjectAnalytics.js +434 -0
- package/dist/analytics/CrossProjectAnalytics.js.map +1 -0
- package/dist/analytics/index.d.ts +1 -0
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +2 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/cache/EmbeddingCache.d.ts +6 -4
- package/dist/cache/EmbeddingCache.d.ts.map +1 -1
- package/dist/cache/EmbeddingCache.js +28 -17
- package/dist/cache/EmbeddingCache.js.map +1 -1
- package/dist/cli/index.js +658 -141
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ui.d.ts +134 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +311 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/dashboard/tokens.d.ts +228 -0
- package/dist/dashboard/tokens.d.ts.map +1 -0
- package/dist/dashboard/tokens.js +450 -0
- package/dist/dashboard/tokens.js.map +1 -0
- package/dist/dashboard/ui.d.ts +3 -0
- package/dist/dashboard/ui.d.ts.map +1 -1
- package/dist/dashboard/ui.js +95 -61
- package/dist/dashboard/ui.js.map +1 -1
- package/dist/db/cloud.d.ts +11 -0
- package/dist/db/cloud.d.ts.map +1 -1
- package/dist/db/cloud.js +49 -1
- package/dist/db/cloud.js.map +1 -1
- package/dist/db/migrations.d.ts +1 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +109 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/turso-client.d.ts.map +1 -1
- package/dist/db/turso-client.js +3 -0
- package/dist/db/turso-client.js.map +1 -1
- package/dist/events/EventBus.d.ts +21 -0
- package/dist/events/EventBus.d.ts.map +1 -1
- package/dist/events/EventBus.js +81 -30
- package/dist/events/EventBus.js.map +1 -1
- package/dist/events/index.d.ts +1 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -1
- package/dist/events/index.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/startup-verify.d.ts +31 -0
- package/dist/hooks/startup-verify.d.ts.map +1 -0
- package/dist/hooks/startup-verify.js +360 -0
- package/dist/hooks/startup-verify.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +160 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +417 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +7 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/schema/expert-types.d.ts +2 -2
- package/dist/services/AuditLog.d.ts +205 -0
- package/dist/services/AuditLog.d.ts.map +1 -0
- package/dist/services/AuditLog.js +352 -0
- package/dist/services/AuditLog.js.map +1 -0
- package/dist/services/FeedbackCollector.d.ts +8 -0
- package/dist/services/FeedbackCollector.d.ts.map +1 -1
- package/dist/services/FeedbackCollector.js +19 -2
- package/dist/services/FeedbackCollector.js.map +1 -1
- package/dist/services/GitIntegration.d.ts +140 -0
- package/dist/services/GitIntegration.d.ts.map +1 -0
- package/dist/services/GitIntegration.js +423 -0
- package/dist/services/GitIntegration.js.map +1 -0
- package/dist/services/HookVerifier.d.ts +95 -0
- package/dist/services/HookVerifier.d.ts.map +1 -0
- package/dist/services/HookVerifier.js +493 -0
- package/dist/services/HookVerifier.js.map +1 -0
- package/dist/services/MemoryRelationshipService.d.ts +187 -0
- package/dist/services/MemoryRelationshipService.d.ts.map +1 -0
- package/dist/services/MemoryRelationshipService.js +375 -0
- package/dist/services/MemoryRelationshipService.js.map +1 -0
- package/dist/services/MemoryVersioning.d.ts +108 -0
- package/dist/services/MemoryVersioning.d.ts.map +1 -0
- package/dist/services/MemoryVersioning.js +281 -0
- package/dist/services/MemoryVersioning.js.map +1 -0
- package/dist/services/context-injector.d.ts +8 -0
- package/dist/services/context-injector.d.ts.map +1 -1
- package/dist/services/context-injector.js +19 -2
- package/dist/services/context-injector.js.map +1 -1
- package/dist/services/index.d.ts +5 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +7 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/memory-router.d.ts +8 -0
- package/dist/services/memory-router.d.ts.map +1 -1
- package/dist/services/memory-router.js +19 -2
- package/dist/services/memory-router.js.map +1 -1
- package/dist/services/pattern-tracker.d.ts +13 -0
- package/dist/services/pattern-tracker.d.ts.map +1 -1
- package/dist/services/pattern-tracker.js +33 -3
- package/dist/services/pattern-tracker.js.map +1 -1
- package/dist/services/semantic-search.d.ts +12 -0
- package/dist/services/semantic-search.d.ts.map +1 -1
- package/dist/services/semantic-search.js +93 -17
- package/dist/services/semantic-search.js.map +1 -1
- package/dist/testing/index.d.ts +148 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +370 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/resilience.d.ts +256 -0
- package/dist/utils/resilience.d.ts.map +1 -0
- package/dist/utils/resilience.js +499 -0
- package/dist/utils/resilience.js.map +1 -0
- package/package.json +12 -1
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook Verifier Service
|
|
3
|
+
*
|
|
4
|
+
* Validates and auto-fixes Claude Code hook configurations:
|
|
5
|
+
* - Checks if hooks are properly configured in .claude/settings.json
|
|
6
|
+
* - Verifies hook files exist and have proper CLI entry points
|
|
7
|
+
* - Auto-fixes misconfigured hooks
|
|
8
|
+
* - Can run automatically on startup or via CLI
|
|
9
|
+
*
|
|
10
|
+
* @version 2.9.0
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Hook Verifier Service
|
|
16
|
+
// =============================================================================
|
|
17
|
+
export class HookVerifierService {
|
|
18
|
+
projectPath;
|
|
19
|
+
constructor(projectPath) {
|
|
20
|
+
this.projectPath = projectPath ?? process.cwd();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Verify all hooks in the project
|
|
24
|
+
*/
|
|
25
|
+
async verify(autoFix = false) {
|
|
26
|
+
const settingsPath = path.join(this.projectPath, '.claude', 'settings.json');
|
|
27
|
+
const report = {
|
|
28
|
+
projectPath: this.projectPath,
|
|
29
|
+
settingsPath,
|
|
30
|
+
settingsExists: false,
|
|
31
|
+
hooksConfigured: 0,
|
|
32
|
+
results: [],
|
|
33
|
+
errors: [],
|
|
34
|
+
warnings: [],
|
|
35
|
+
allValid: true,
|
|
36
|
+
fixedCount: 0,
|
|
37
|
+
};
|
|
38
|
+
// Check if settings file exists
|
|
39
|
+
if (!fs.existsSync(settingsPath)) {
|
|
40
|
+
report.warnings.push('Claude settings file not found at .claude/settings.json');
|
|
41
|
+
return report;
|
|
42
|
+
}
|
|
43
|
+
report.settingsExists = true;
|
|
44
|
+
// Parse settings
|
|
45
|
+
let settings;
|
|
46
|
+
try {
|
|
47
|
+
const content = fs.readFileSync(settingsPath, 'utf-8');
|
|
48
|
+
settings = JSON.parse(content);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
report.errors.push(`Failed to parse settings.json: ${error instanceof Error ? error.message : String(error)}`);
|
|
52
|
+
report.allValid = false;
|
|
53
|
+
return report;
|
|
54
|
+
}
|
|
55
|
+
if (!settings.hooks) {
|
|
56
|
+
report.warnings.push('No hooks configured in settings.json');
|
|
57
|
+
return report;
|
|
58
|
+
}
|
|
59
|
+
// Verify each hook type
|
|
60
|
+
const hookTypes = ['PreToolUse', 'PostToolUse', 'Notification', 'Stop', 'SubagentStop'];
|
|
61
|
+
for (const hookType of hookTypes) {
|
|
62
|
+
const hooks = settings.hooks[hookType];
|
|
63
|
+
if (!hooks || hooks.length === 0)
|
|
64
|
+
continue;
|
|
65
|
+
for (const hook of hooks) {
|
|
66
|
+
report.hooksConfigured++;
|
|
67
|
+
const result = await this.verifyHook(hook, hookType);
|
|
68
|
+
if (result.status !== 'valid') {
|
|
69
|
+
report.allValid = false;
|
|
70
|
+
// Attempt auto-fix if requested
|
|
71
|
+
if (autoFix && result.autoFixable) {
|
|
72
|
+
const fixed = await this.fixHook(result);
|
|
73
|
+
result.fixed = fixed;
|
|
74
|
+
if (fixed) {
|
|
75
|
+
report.fixedCount++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
report.results.push(result);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return report;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Verify a single hook configuration
|
|
86
|
+
*/
|
|
87
|
+
async verifyHook(hook, hookType) {
|
|
88
|
+
const command = hook.command;
|
|
89
|
+
// Extract the file path from the command
|
|
90
|
+
const hookPath = this.extractHookPath(command);
|
|
91
|
+
if (!hookPath) {
|
|
92
|
+
return {
|
|
93
|
+
hookPath: command,
|
|
94
|
+
hookType,
|
|
95
|
+
status: 'invalid_syntax',
|
|
96
|
+
message: `Could not extract hook file path from command: ${command}`,
|
|
97
|
+
autoFixable: false,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const absolutePath = path.isAbsolute(hookPath)
|
|
101
|
+
? hookPath
|
|
102
|
+
: path.join(this.projectPath, hookPath);
|
|
103
|
+
// Check if file exists
|
|
104
|
+
if (!fs.existsSync(absolutePath)) {
|
|
105
|
+
return {
|
|
106
|
+
hookPath,
|
|
107
|
+
hookType,
|
|
108
|
+
status: 'missing_file',
|
|
109
|
+
message: `Hook file not found: ${absolutePath}`,
|
|
110
|
+
autoFixable: false,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// Read file content
|
|
114
|
+
let content;
|
|
115
|
+
try {
|
|
116
|
+
content = fs.readFileSync(absolutePath, 'utf-8');
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return {
|
|
120
|
+
hookPath,
|
|
121
|
+
hookType,
|
|
122
|
+
status: 'missing_file',
|
|
123
|
+
message: `Could not read hook file: ${absolutePath}`,
|
|
124
|
+
autoFixable: false,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// Check for proper entry point
|
|
128
|
+
const hasEntryPoint = this.hasValidEntryPoint(content, hookPath);
|
|
129
|
+
if (!hasEntryPoint) {
|
|
130
|
+
return {
|
|
131
|
+
hookPath,
|
|
132
|
+
hookType,
|
|
133
|
+
status: 'missing_entry_point',
|
|
134
|
+
message: `Hook file lacks CLI entry point. It exports functions but doesn't execute them when run directly.`,
|
|
135
|
+
autoFixable: true,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// Check for shebang (for shell scripts)
|
|
139
|
+
if (hookPath.endsWith('.sh') && !content.startsWith('#!')) {
|
|
140
|
+
return {
|
|
141
|
+
hookPath,
|
|
142
|
+
hookType,
|
|
143
|
+
status: 'missing_shebang',
|
|
144
|
+
message: `Shell script missing shebang line`,
|
|
145
|
+
autoFixable: true,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
hookPath,
|
|
150
|
+
hookType,
|
|
151
|
+
status: 'valid',
|
|
152
|
+
message: 'Hook is properly configured',
|
|
153
|
+
autoFixable: false,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Extract hook file path from command
|
|
158
|
+
*/
|
|
159
|
+
extractHookPath(command) {
|
|
160
|
+
// Handle various command formats:
|
|
161
|
+
// "npx tsx hooks/my-hook.ts"
|
|
162
|
+
// "node hooks/my-hook.js"
|
|
163
|
+
// "ts-node hooks/my-hook.ts"
|
|
164
|
+
// "./hooks/my-hook.sh"
|
|
165
|
+
// "bash hooks/my-hook.sh"
|
|
166
|
+
const patterns = [
|
|
167
|
+
/(?:npx\s+tsx|ts-node|node|bun|deno\s+run)\s+["']?([^\s"']+\.(?:ts|js|mjs))["']?/i,
|
|
168
|
+
/(?:bash|sh|zsh)\s+["']?([^\s"']+\.sh)["']?/i,
|
|
169
|
+
/^\.?\/?([\w\-./]+\.(?:ts|js|mjs|sh))$/,
|
|
170
|
+
];
|
|
171
|
+
for (const pattern of patterns) {
|
|
172
|
+
const match = command.match(pattern);
|
|
173
|
+
if (match) {
|
|
174
|
+
return match[1];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Try to find any file path in the command
|
|
178
|
+
const fileMatch = command.match(/([\w\-./]+\.(?:ts|js|mjs|sh))/);
|
|
179
|
+
return fileMatch ? fileMatch[1] : null;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Check if the file has a valid CLI entry point
|
|
183
|
+
*/
|
|
184
|
+
hasValidEntryPoint(content, hookPath) {
|
|
185
|
+
// TypeScript/JavaScript files
|
|
186
|
+
if (hookPath.endsWith('.ts') || hookPath.endsWith('.js') || hookPath.endsWith('.mjs')) {
|
|
187
|
+
// Check for common entry point patterns
|
|
188
|
+
const entryPatterns = [
|
|
189
|
+
// Direct function call at module level
|
|
190
|
+
/(?:^|\n)main\s*\(\s*\)/m,
|
|
191
|
+
/(?:^|\n)run\s*\(\s*\)/m,
|
|
192
|
+
/(?:^|\n)execute\s*\(\s*\)/m,
|
|
193
|
+
/(?:^|\n)start\s*\(\s*\)/m,
|
|
194
|
+
// Conditional execution based on argv
|
|
195
|
+
/if\s*\(\s*process\.argv\[1\].*?\.includes\s*\(/,
|
|
196
|
+
/if\s*\(\s*import\.meta\.url/,
|
|
197
|
+
/if\s*\(\s*require\.main\s*===\s*module\s*\)/,
|
|
198
|
+
// Top-level await (ESM)
|
|
199
|
+
/(?:^|\n)await\s+\w+\s*\(/m,
|
|
200
|
+
// IIFE
|
|
201
|
+
/\(\s*async\s*\(\s*\)\s*=>\s*\{[\s\S]*\}\s*\)\s*\(\s*\)/,
|
|
202
|
+
/\(\s*function\s*\(\s*\)\s*\{[\s\S]*\}\s*\)\s*\(\s*\)/,
|
|
203
|
+
// CLI-specific patterns
|
|
204
|
+
/commander|yargs|meow|inquirer.*prompt/i,
|
|
205
|
+
// Reading stdin (common for hooks)
|
|
206
|
+
/process\.stdin/,
|
|
207
|
+
/readline\.createInterface/,
|
|
208
|
+
];
|
|
209
|
+
return entryPatterns.some(pattern => pattern.test(content));
|
|
210
|
+
}
|
|
211
|
+
// Shell scripts
|
|
212
|
+
if (hookPath.endsWith('.sh')) {
|
|
213
|
+
// Shell scripts are typically always executable
|
|
214
|
+
// Just check they have actual commands (not just comments/functions)
|
|
215
|
+
const lines = content.split('\n');
|
|
216
|
+
const executableLines = lines.filter(line => {
|
|
217
|
+
const trimmed = line.trim();
|
|
218
|
+
return trimmed &&
|
|
219
|
+
!trimmed.startsWith('#') &&
|
|
220
|
+
!trimmed.startsWith('function ') &&
|
|
221
|
+
!trimmed.match(/^\w+\s*\(\s*\)\s*\{/);
|
|
222
|
+
});
|
|
223
|
+
return executableLines.length > 0;
|
|
224
|
+
}
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Attempt to fix a hook issue
|
|
229
|
+
*/
|
|
230
|
+
async fixHook(result) {
|
|
231
|
+
const absolutePath = path.isAbsolute(result.hookPath)
|
|
232
|
+
? result.hookPath
|
|
233
|
+
: path.join(this.projectPath, result.hookPath);
|
|
234
|
+
try {
|
|
235
|
+
switch (result.status) {
|
|
236
|
+
case 'missing_entry_point':
|
|
237
|
+
return this.fixMissingEntryPoint(absolutePath);
|
|
238
|
+
case 'missing_shebang':
|
|
239
|
+
return this.fixMissingShebang(absolutePath);
|
|
240
|
+
default:
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Fix missing entry point by adding CLI execution code
|
|
250
|
+
*/
|
|
251
|
+
fixMissingEntryPoint(filePath) {
|
|
252
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
253
|
+
const ext = path.extname(filePath);
|
|
254
|
+
let newContent = content;
|
|
255
|
+
if (ext === '.ts' || ext === '.mts') {
|
|
256
|
+
// Find exported main/run function
|
|
257
|
+
const mainMatch = content.match(/export\s+(?:async\s+)?function\s+(\w+)\s*\(/m);
|
|
258
|
+
const mainFnName = mainMatch?.[1] ?? 'main';
|
|
259
|
+
// Add entry point
|
|
260
|
+
const entryPoint = `
|
|
261
|
+
// CLI Entry Point
|
|
262
|
+
if (process.argv[1]?.includes('${path.basename(filePath, ext)}')) {
|
|
263
|
+
${mainFnName}().catch(console.error)
|
|
264
|
+
}
|
|
265
|
+
`;
|
|
266
|
+
newContent = content + '\n' + entryPoint;
|
|
267
|
+
}
|
|
268
|
+
else if (ext === '.js' || ext === '.mjs') {
|
|
269
|
+
// Similar for JS
|
|
270
|
+
const mainMatch = content.match(/(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(/m);
|
|
271
|
+
const mainFnName = mainMatch?.[1] ?? 'main';
|
|
272
|
+
const entryPoint = `
|
|
273
|
+
// CLI Entry Point
|
|
274
|
+
if (process.argv[1]?.includes('${path.basename(filePath, ext)}')) {
|
|
275
|
+
${mainFnName}().catch(console.error)
|
|
276
|
+
}
|
|
277
|
+
`;
|
|
278
|
+
newContent = content + '\n' + entryPoint;
|
|
279
|
+
}
|
|
280
|
+
if (newContent !== content) {
|
|
281
|
+
fs.writeFileSync(filePath, newContent, 'utf-8');
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Fix missing shebang in shell script
|
|
288
|
+
*/
|
|
289
|
+
fixMissingShebang(filePath) {
|
|
290
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
291
|
+
if (!content.startsWith('#!')) {
|
|
292
|
+
const newContent = '#!/usr/bin/env bash\n' + content;
|
|
293
|
+
fs.writeFileSync(filePath, newContent, 'utf-8');
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Generate hook template
|
|
300
|
+
*/
|
|
301
|
+
static generateHookTemplate(hookType, language = 'ts') {
|
|
302
|
+
if (language === 'sh') {
|
|
303
|
+
return `#!/usr/bin/env bash
|
|
304
|
+
# Hook: ${hookType}
|
|
305
|
+
# Auto-generated by cmp-standards
|
|
306
|
+
|
|
307
|
+
# Read input from stdin
|
|
308
|
+
input=$(cat)
|
|
309
|
+
|
|
310
|
+
# Parse JSON input (requires jq)
|
|
311
|
+
event_type=$(echo "$input" | jq -r '.type // empty')
|
|
312
|
+
tool_name=$(echo "$input" | jq -r '.tool_name // empty')
|
|
313
|
+
|
|
314
|
+
# Your hook logic here
|
|
315
|
+
echo "Hook executed: $event_type - $tool_name" >&2
|
|
316
|
+
|
|
317
|
+
# Output: continue, block, or modify
|
|
318
|
+
echo '{"decision": "continue"}'
|
|
319
|
+
`;
|
|
320
|
+
}
|
|
321
|
+
const isTS = language === 'ts';
|
|
322
|
+
return `${isTS ? '#!/usr/bin/env npx tsx' : '#!/usr/bin/env node'}
|
|
323
|
+
/**
|
|
324
|
+
* Hook: ${hookType}
|
|
325
|
+
* Auto-generated by cmp-standards
|
|
326
|
+
*/
|
|
327
|
+
|
|
328
|
+
${isTS ? `interface HookInput {
|
|
329
|
+
type: string
|
|
330
|
+
tool_name?: string
|
|
331
|
+
tool_input?: Record<string, unknown>
|
|
332
|
+
session_id?: string
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
interface HookOutput {
|
|
336
|
+
decision: 'continue' | 'block'
|
|
337
|
+
reason?: string
|
|
338
|
+
}
|
|
339
|
+
` : ''}
|
|
340
|
+
async function main()${isTS ? ': Promise<void>' : ''} {
|
|
341
|
+
// Read input from stdin
|
|
342
|
+
const chunks${isTS ? ': Buffer[]' : ''} = []
|
|
343
|
+
for await (const chunk of process.stdin) {
|
|
344
|
+
chunks.push(chunk)
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const input${isTS ? ': HookInput' : ''} = JSON.parse(Buffer.concat(chunks).toString('utf-8'))
|
|
348
|
+
|
|
349
|
+
// Your hook logic here
|
|
350
|
+
console.error(\`Hook executed: \${input.type} - \${input.tool_name ?? 'N/A'}\`)
|
|
351
|
+
|
|
352
|
+
// Output: continue, block, or modify
|
|
353
|
+
const output${isTS ? ': HookOutput' : ''} = {
|
|
354
|
+
decision: 'continue'
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
console.log(JSON.stringify(output))
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// CLI Entry Point
|
|
361
|
+
if (process.argv[1]?.includes('${hookType.toLowerCase()}')) {
|
|
362
|
+
main().catch(console.error)
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
export { main }
|
|
366
|
+
`;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Create a new hook file with proper structure
|
|
370
|
+
*/
|
|
371
|
+
async createHook(hookType, fileName, language = 'ts') {
|
|
372
|
+
const hooksDir = path.join(this.projectPath, '.claude', 'hooks');
|
|
373
|
+
// Create hooks directory if it doesn't exist
|
|
374
|
+
if (!fs.existsSync(hooksDir)) {
|
|
375
|
+
fs.mkdirSync(hooksDir, { recursive: true });
|
|
376
|
+
}
|
|
377
|
+
const ext = language === 'sh' ? '.sh' : language === 'ts' ? '.ts' : '.js';
|
|
378
|
+
const filePath = path.join(hooksDir, `${fileName}${ext}`);
|
|
379
|
+
if (fs.existsSync(filePath)) {
|
|
380
|
+
throw new Error(`Hook file already exists: ${filePath}`);
|
|
381
|
+
}
|
|
382
|
+
const template = HookVerifierService.generateHookTemplate(hookType, language);
|
|
383
|
+
fs.writeFileSync(filePath, template, 'utf-8');
|
|
384
|
+
// Make shell scripts executable
|
|
385
|
+
if (language === 'sh') {
|
|
386
|
+
fs.chmodSync(filePath, '755');
|
|
387
|
+
}
|
|
388
|
+
return filePath;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Add hook to settings.json
|
|
392
|
+
*/
|
|
393
|
+
async addHookToSettings(hookType, command) {
|
|
394
|
+
const settingsPath = path.join(this.projectPath, '.claude', 'settings.json');
|
|
395
|
+
const settingsDir = path.dirname(settingsPath);
|
|
396
|
+
// Create .claude directory if needed
|
|
397
|
+
if (!fs.existsSync(settingsDir)) {
|
|
398
|
+
fs.mkdirSync(settingsDir, { recursive: true });
|
|
399
|
+
}
|
|
400
|
+
// Load or create settings
|
|
401
|
+
let settings = {};
|
|
402
|
+
if (fs.existsSync(settingsPath)) {
|
|
403
|
+
try {
|
|
404
|
+
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
// Start fresh if invalid
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
// Initialize hooks object
|
|
411
|
+
if (!settings.hooks) {
|
|
412
|
+
settings.hooks = {};
|
|
413
|
+
}
|
|
414
|
+
// Initialize hook type array
|
|
415
|
+
if (!settings.hooks[hookType]) {
|
|
416
|
+
settings.hooks[hookType] = [];
|
|
417
|
+
}
|
|
418
|
+
// Add hook if not already present
|
|
419
|
+
const exists = settings.hooks[hookType].some(h => h.command === command);
|
|
420
|
+
if (!exists) {
|
|
421
|
+
settings.hooks[hookType].push({ type: 'command', command });
|
|
422
|
+
}
|
|
423
|
+
// Write settings
|
|
424
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
// =============================================================================
|
|
428
|
+
// CLI Output Helpers
|
|
429
|
+
// =============================================================================
|
|
430
|
+
export function formatVerificationReport(report) {
|
|
431
|
+
const lines = [];
|
|
432
|
+
lines.push('='.repeat(60));
|
|
433
|
+
lines.push('Hook Verification Report');
|
|
434
|
+
lines.push('='.repeat(60));
|
|
435
|
+
lines.push('');
|
|
436
|
+
lines.push(`Project: ${report.projectPath}`);
|
|
437
|
+
lines.push(`Settings: ${report.settingsExists ? 'Found' : 'Not Found'}`);
|
|
438
|
+
lines.push(`Hooks Configured: ${report.hooksConfigured}`);
|
|
439
|
+
lines.push('');
|
|
440
|
+
if (report.errors.length > 0) {
|
|
441
|
+
lines.push('ERRORS:');
|
|
442
|
+
for (const error of report.errors) {
|
|
443
|
+
lines.push(` [X] ${error}`);
|
|
444
|
+
}
|
|
445
|
+
lines.push('');
|
|
446
|
+
}
|
|
447
|
+
if (report.warnings.length > 0) {
|
|
448
|
+
lines.push('WARNINGS:');
|
|
449
|
+
for (const warning of report.warnings) {
|
|
450
|
+
lines.push(` [!] ${warning}`);
|
|
451
|
+
}
|
|
452
|
+
lines.push('');
|
|
453
|
+
}
|
|
454
|
+
if (report.results.length > 0) {
|
|
455
|
+
lines.push('HOOK RESULTS:');
|
|
456
|
+
for (const result of report.results) {
|
|
457
|
+
const icon = result.status === 'valid'
|
|
458
|
+
? '[OK]'
|
|
459
|
+
: result.fixed
|
|
460
|
+
? '[FIXED]'
|
|
461
|
+
: '[FAIL]';
|
|
462
|
+
lines.push(` ${icon} ${result.hookType}: ${result.hookPath}`);
|
|
463
|
+
if (result.status !== 'valid') {
|
|
464
|
+
lines.push(` ${result.message}`);
|
|
465
|
+
if (result.autoFixable && !result.fixed) {
|
|
466
|
+
lines.push(` (Auto-fixable - run with --fix)`);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
lines.push('');
|
|
471
|
+
}
|
|
472
|
+
lines.push('-'.repeat(60));
|
|
473
|
+
lines.push(`Status: ${report.allValid ? 'ALL VALID' : 'ISSUES FOUND'}`);
|
|
474
|
+
if (report.fixedCount > 0) {
|
|
475
|
+
lines.push(`Fixed: ${report.fixedCount} hook(s)`);
|
|
476
|
+
}
|
|
477
|
+
lines.push('='.repeat(60));
|
|
478
|
+
return lines.join('\n');
|
|
479
|
+
}
|
|
480
|
+
// =============================================================================
|
|
481
|
+
// Singleton
|
|
482
|
+
// =============================================================================
|
|
483
|
+
let instance = null;
|
|
484
|
+
export function getHookVerifier(projectPath) {
|
|
485
|
+
if (!instance || (projectPath && instance['projectPath'] !== projectPath)) {
|
|
486
|
+
instance = new HookVerifierService(projectPath);
|
|
487
|
+
}
|
|
488
|
+
return instance;
|
|
489
|
+
}
|
|
490
|
+
export function resetHookVerifier() {
|
|
491
|
+
instance = null;
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=HookVerifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HookVerifier.js","sourceRoot":"","sources":["../../src/services/HookVerifier.ts"],"names":[],"mappings":"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"}
|