@uxcontinuum/ccaudit 1.0.0 → 1.0.1

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 (2) hide show
  1. package/index.js +28 -7
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -145,6 +145,10 @@ function inspectClaudeDir(claudeDir) {
145
145
  preToolUseHooks: 0,
146
146
  postToolUseHooks: 0,
147
147
  userPromptSubmitHooks: 0,
148
+ stopHooks: 0,
149
+ subagentStopHooks: 0,
150
+ notificationHooks: 0,
151
+ autoMemoryEnabled: false,
148
152
  hookFiles: [],
149
153
  hasClaudeMd: false,
150
154
  claudeMdBytes: 0,
@@ -163,6 +167,10 @@ function inspectClaudeDir(claudeDir) {
163
167
  out.preToolUseHooks = count(hooks.PreToolUse);
164
168
  out.postToolUseHooks = count(hooks.PostToolUse);
165
169
  out.userPromptSubmitHooks = count(hooks.UserPromptSubmit);
170
+ out.stopHooks = count(hooks.Stop);
171
+ out.subagentStopHooks = count(hooks.SubagentStop);
172
+ out.notificationHooks = count(hooks.Notification);
173
+ out.autoMemoryEnabled = s.autoMemoryEnabled === true;
166
174
  } catch (_) {}
167
175
  }
168
176
  } catch (_) {}
@@ -275,20 +283,33 @@ function grade(stats, setup) {
275
283
  const agent = stats.agent || {};
276
284
 
277
285
  // 1. Hook coverage. Lives at the setup layer, applies to everyone.
278
- const hookSignals = setup.preToolUseHooks + setup.postToolUseHooks + setup.userPromptSubmitHooks;
286
+ const hookSignals =
287
+ setup.preToolUseHooks + setup.postToolUseHooks + setup.userPromptSubmitHooks +
288
+ setup.stopHooks + setup.subagentStopHooks + setup.notificationHooks;
279
289
  let hookScore;
280
290
  if (hookSignals === 0) hookScore = 35;
281
- else if (hookSignals === 1) hookScore = 65;
291
+ else if (hookSignals === 1) hookScore = 68;
282
292
  else if (hookSignals === 2) hookScore = 82;
283
- else hookScore = Math.min(100, 88 + hookSignals * 2);
293
+ else if (hookSignals === 3) hookScore = 90;
294
+ else hookScore = Math.min(100, 92 + hookSignals);
295
+ if (setup.autoMemoryEnabled) hookScore = Math.min(100, hookScore + 3);
296
+ const hookBreakdown = [
297
+ setup.preToolUseHooks ? `${setup.preToolUseHooks} PreToolUse` : null,
298
+ setup.postToolUseHooks ? `${setup.postToolUseHooks} PostToolUse` : null,
299
+ setup.userPromptSubmitHooks ? `${setup.userPromptSubmitHooks} UserPromptSubmit` : null,
300
+ setup.stopHooks ? `${setup.stopHooks} Stop` : null,
301
+ setup.subagentStopHooks ? `${setup.subagentStopHooks} SubagentStop` : null,
302
+ setup.notificationHooks ? `${setup.notificationHooks} Notification` : null,
303
+ setup.autoMemoryEnabled ? 'autoMemory plugin' : null,
304
+ ].filter(Boolean).join(', ');
284
305
  dims.push({
285
306
  name: 'Hook coverage',
286
307
  score: hookScore,
287
308
  detail: hookSignals === 0
288
- ? 'No PreToolUse, PostToolUse, or UserPromptSubmit hooks installed. Anything could happen overnight.'
289
- : `${setup.preToolUseHooks} PreToolUse, ${setup.postToolUseHooks} PostToolUse, ${setup.userPromptSubmitHooks} UserPromptSubmit hook(s) installed.`,
309
+ ? 'No hooks installed across any event. Anything could happen overnight.'
310
+ : `${hookBreakdown}.`,
290
311
  fix: hookSignals === 0
291
- ? 'Install claude-loop-sentinel for runaway-loop protection: npm i @uxcontinuum/claude-loop-sentinel'
312
+ ? 'Install claude-loop-sentinel for runaway-loop protection: https://github.com/turleydesigns/claude-loop-sentinel'
292
313
  : null,
293
314
  });
294
315
 
@@ -403,7 +424,7 @@ function renderCard(stats, setup, graded) {
403
424
  if (stats.agent) {
404
425
  pr(` ${C.dim}Agent sessions:${C.reset} ${stats.agent.sessions} sessions, ${(stats.agent.outputTokens / 1e6).toFixed(2)}M output tokens`);
405
426
  }
406
- pr(` ${C.dim}Hooks installed:${C.reset} ${setup.preToolUseHooks + setup.postToolUseHooks + setup.userPromptSubmitHooks} (${setup.hookFiles.length} hook file(s) in ~/.claude/hooks/)`);
427
+ pr(` ${C.dim}Hooks installed:${C.reset} ${setup.preToolUseHooks + setup.postToolUseHooks + setup.userPromptSubmitHooks + setup.stopHooks + setup.subagentStopHooks + setup.notificationHooks} across all event types (${setup.hookFiles.length} hook file(s) in ~/.claude/hooks/)`);
407
428
  pr(` ${C.dim}CLAUDE.md:${C.reset} ${setup.hasClaudeMd ? `${setup.claudeMdBytes} bytes` : 'not found'}`);
408
429
  pr(` ${C.dim}Skills installed:${C.reset} ${setup.skillCount}`);
409
430
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uxcontinuum/ccaudit",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "A diagnostic for your Claude Code setup. Reads ~/.claude/ locally, grades you across hook coverage, project hygiene, tool balance, prompt tells, and pipeline ops. Zero install: npx @uxcontinuum/ccaudit",
5
5
  "main": "index.js",
6
6
  "bin": {