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.
Files changed (119) hide show
  1. package/dist/analytics/CrossProjectAnalytics.d.ts +128 -0
  2. package/dist/analytics/CrossProjectAnalytics.d.ts.map +1 -0
  3. package/dist/analytics/CrossProjectAnalytics.js +434 -0
  4. package/dist/analytics/CrossProjectAnalytics.js.map +1 -0
  5. package/dist/analytics/index.d.ts +1 -0
  6. package/dist/analytics/index.d.ts.map +1 -1
  7. package/dist/analytics/index.js +2 -0
  8. package/dist/analytics/index.js.map +1 -1
  9. package/dist/cache/EmbeddingCache.d.ts +6 -4
  10. package/dist/cache/EmbeddingCache.d.ts.map +1 -1
  11. package/dist/cache/EmbeddingCache.js +28 -17
  12. package/dist/cache/EmbeddingCache.js.map +1 -1
  13. package/dist/cli/index.js +658 -141
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/ui.d.ts +134 -0
  16. package/dist/cli/ui.d.ts.map +1 -0
  17. package/dist/cli/ui.js +311 -0
  18. package/dist/cli/ui.js.map +1 -0
  19. package/dist/dashboard/tokens.d.ts +228 -0
  20. package/dist/dashboard/tokens.d.ts.map +1 -0
  21. package/dist/dashboard/tokens.js +450 -0
  22. package/dist/dashboard/tokens.js.map +1 -0
  23. package/dist/dashboard/ui.d.ts +3 -0
  24. package/dist/dashboard/ui.d.ts.map +1 -1
  25. package/dist/dashboard/ui.js +95 -61
  26. package/dist/dashboard/ui.js.map +1 -1
  27. package/dist/db/cloud.d.ts +11 -0
  28. package/dist/db/cloud.d.ts.map +1 -1
  29. package/dist/db/cloud.js +49 -1
  30. package/dist/db/cloud.js.map +1 -1
  31. package/dist/db/migrations.d.ts +1 -0
  32. package/dist/db/migrations.d.ts.map +1 -1
  33. package/dist/db/migrations.js +109 -0
  34. package/dist/db/migrations.js.map +1 -1
  35. package/dist/db/turso-client.d.ts.map +1 -1
  36. package/dist/db/turso-client.js +3 -0
  37. package/dist/db/turso-client.js.map +1 -1
  38. package/dist/events/EventBus.d.ts +21 -0
  39. package/dist/events/EventBus.d.ts.map +1 -1
  40. package/dist/events/EventBus.js +81 -30
  41. package/dist/events/EventBus.js.map +1 -1
  42. package/dist/events/index.d.ts +1 -1
  43. package/dist/events/index.d.ts.map +1 -1
  44. package/dist/events/index.js +1 -1
  45. package/dist/events/index.js.map +1 -1
  46. package/dist/hooks/index.d.ts +1 -0
  47. package/dist/hooks/index.d.ts.map +1 -1
  48. package/dist/hooks/index.js +2 -0
  49. package/dist/hooks/index.js.map +1 -1
  50. package/dist/hooks/startup-verify.d.ts +31 -0
  51. package/dist/hooks/startup-verify.d.ts.map +1 -0
  52. package/dist/hooks/startup-verify.js +360 -0
  53. package/dist/hooks/startup-verify.js.map +1 -0
  54. package/dist/plugins/PluginManager.d.ts +160 -0
  55. package/dist/plugins/PluginManager.d.ts.map +1 -0
  56. package/dist/plugins/PluginManager.js +417 -0
  57. package/dist/plugins/PluginManager.js.map +1 -0
  58. package/dist/plugins/index.d.ts +7 -0
  59. package/dist/plugins/index.d.ts.map +1 -0
  60. package/dist/plugins/index.js +7 -0
  61. package/dist/plugins/index.js.map +1 -0
  62. package/dist/schema/expert-types.d.ts +2 -2
  63. package/dist/services/AuditLog.d.ts +205 -0
  64. package/dist/services/AuditLog.d.ts.map +1 -0
  65. package/dist/services/AuditLog.js +352 -0
  66. package/dist/services/AuditLog.js.map +1 -0
  67. package/dist/services/FeedbackCollector.d.ts +8 -0
  68. package/dist/services/FeedbackCollector.d.ts.map +1 -1
  69. package/dist/services/FeedbackCollector.js +19 -2
  70. package/dist/services/FeedbackCollector.js.map +1 -1
  71. package/dist/services/GitIntegration.d.ts +140 -0
  72. package/dist/services/GitIntegration.d.ts.map +1 -0
  73. package/dist/services/GitIntegration.js +423 -0
  74. package/dist/services/GitIntegration.js.map +1 -0
  75. package/dist/services/HookVerifier.d.ts +95 -0
  76. package/dist/services/HookVerifier.d.ts.map +1 -0
  77. package/dist/services/HookVerifier.js +493 -0
  78. package/dist/services/HookVerifier.js.map +1 -0
  79. package/dist/services/MemoryRelationshipService.d.ts +187 -0
  80. package/dist/services/MemoryRelationshipService.d.ts.map +1 -0
  81. package/dist/services/MemoryRelationshipService.js +375 -0
  82. package/dist/services/MemoryRelationshipService.js.map +1 -0
  83. package/dist/services/MemoryVersioning.d.ts +108 -0
  84. package/dist/services/MemoryVersioning.d.ts.map +1 -0
  85. package/dist/services/MemoryVersioning.js +281 -0
  86. package/dist/services/MemoryVersioning.js.map +1 -0
  87. package/dist/services/context-injector.d.ts +8 -0
  88. package/dist/services/context-injector.d.ts.map +1 -1
  89. package/dist/services/context-injector.js +19 -2
  90. package/dist/services/context-injector.js.map +1 -1
  91. package/dist/services/index.d.ts +5 -0
  92. package/dist/services/index.d.ts.map +1 -1
  93. package/dist/services/index.js +7 -0
  94. package/dist/services/index.js.map +1 -1
  95. package/dist/services/memory-router.d.ts +8 -0
  96. package/dist/services/memory-router.d.ts.map +1 -1
  97. package/dist/services/memory-router.js +19 -2
  98. package/dist/services/memory-router.js.map +1 -1
  99. package/dist/services/pattern-tracker.d.ts +13 -0
  100. package/dist/services/pattern-tracker.d.ts.map +1 -1
  101. package/dist/services/pattern-tracker.js +33 -3
  102. package/dist/services/pattern-tracker.js.map +1 -1
  103. package/dist/services/semantic-search.d.ts +12 -0
  104. package/dist/services/semantic-search.d.ts.map +1 -1
  105. package/dist/services/semantic-search.js +93 -17
  106. package/dist/services/semantic-search.js.map +1 -1
  107. package/dist/testing/index.d.ts +148 -0
  108. package/dist/testing/index.d.ts.map +1 -0
  109. package/dist/testing/index.js +370 -0
  110. package/dist/testing/index.js.map +1 -0
  111. package/dist/types/index.d.ts +1 -0
  112. package/dist/types/index.d.ts.map +1 -1
  113. package/dist/types/index.js +1 -0
  114. package/dist/types/index.js.map +1 -1
  115. package/dist/utils/resilience.d.ts +256 -0
  116. package/dist/utils/resilience.d.ts.map +1 -0
  117. package/dist/utils/resilience.js +499 -0
  118. package/dist/utils/resilience.js.map +1 -0
  119. 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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"}