claude-code-templates 1.8.3 → 1.10.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/README.md CHANGED
@@ -28,6 +28,16 @@ Monitor and optimize your Claude Code agents with our comprehensive analytics da
28
28
  - **Performance Monitoring**: Track Claude Code agent performance and optimization opportunities
29
29
  - **Web Interface**: Clean, terminal-style dashboard at `http://localhost:3333`
30
30
 
31
+ ### 🔍 Comprehensive Health Check
32
+ Complete system validation and configuration verification:
33
+ - **System Requirements**: Validate OS, Node.js, memory, and network connectivity
34
+ - **Claude Code Setup**: Verify installation, authentication, and permissions
35
+ - **Project Configuration**: Check project structure and configuration files
36
+ - **Custom Commands**: Validate slash commands and syntax
37
+ - **Hooks Configuration**: Verify automation hooks and command availability
38
+ - **Interactive Results**: Real-time progress with immediate feedback and recommendations
39
+ - **Health Score**: Overall system health percentage with actionable insights
40
+
31
41
  ### 📋 Smart Project Setup
32
42
  Intelligent project configuration with framework-specific commands:
33
43
  - **Auto-Detection**: Automatically detect your project type and suggest optimal configurations
@@ -59,7 +69,7 @@ Intelligent project configuration with framework-specific commands:
59
69
  ```bash
60
70
  cd my-react-app
61
71
  npx claude-code-templates
62
- # Choose between Analytics Dashboard or Project Setup
72
+ # Choose between Analytics Dashboard, Health Check, or Project Setup
63
73
  ```
64
74
 
65
75
  ### Analytics Dashboard
@@ -68,6 +78,15 @@ npx claude-code-templates
68
78
  npx claude-code-templates --analytics
69
79
  ```
70
80
 
81
+ ### Health Check
82
+ ```bash
83
+ # Run comprehensive system validation
84
+ npx claude-code-templates --health-check
85
+ npx claude-code-templates --health
86
+ npx claude-code-templates --check
87
+ npx claude-code-templates --verify
88
+ ```
89
+
71
90
  ### Framework-Specific Quick Setup
72
91
  ```bash
73
92
  # React + TypeScript project
@@ -109,6 +128,10 @@ npx create-claude-config # Create-style command
109
128
  | `-y, --yes` | Skip prompts and use defaults | `--yes` |
110
129
  | `--dry-run` | Show what would be installed | `--dry-run` |
111
130
  | `--analytics` | Launch real-time analytics dashboard | `--analytics` |
131
+ | `--health-check` | Run comprehensive system validation | `--health-check` |
132
+ | `--health` | Run system health check (alias) | `--health` |
133
+ | `--check` | Run system validation (alias) | `--check` |
134
+ | `--verify` | Verify system configuration (alias) | `--verify` |
112
135
  | `--commands-stats` | Analyze existing commands | `--commands-stats` |
113
136
  | `--hooks-stats` | Analyze automation hooks | `--hooks-stats` |
114
137
  | `--mcps-stats` | Analyze MCP server configurations | `--mcps-stats` |
@@ -3,7 +3,7 @@
3
3
  const { program } = require('commander');
4
4
  const chalk = require('chalk');
5
5
  const boxen = require('boxen');
6
- const createClaudeConfig = require('../src/index');
6
+ const { createClaudeConfig } = require('../src/index');
7
7
 
8
8
  // ASCII Art for Claude Code Templates
9
9
  const banner = chalk.hex('#D97706')(`
@@ -45,6 +45,7 @@ program
45
45
  .option('--hook-stats, --hooks-stats', 'analyze existing automation hooks and offer optimization')
46
46
  .option('--mcp-stats, --mcps-stats', 'analyze existing MCP server configurations and offer optimization')
47
47
  .option('--analytics', 'launch real-time Claude Code analytics dashboard')
48
+ .option('--health-check, --health, --check, --verify', 'run comprehensive health check to verify Claude Code setup')
48
49
  .action(async (options) => {
49
50
  try {
50
51
  await createClaudeConfig(options);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-templates",
3
- "version": "1.8.3",
3
+ "version": "1.10.0",
4
4
  "description": "CLI tool to setup Claude Code configurations with framework-specific commands, automation hooks and MCP Servers for your projects",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -31,7 +31,7 @@
31
31
  "dev:link": "npm link",
32
32
  "dev:unlink": "npm unlink -g claude-code-templates",
33
33
  "pretest:commands": "npm run dev:link",
34
- "prepublishOnly-disabled": "npm run test:coverage",
34
+ "prepublishOnly": "echo 'Skipping tests for Health Check release'",
35
35
  "analytics:start": "node src/analytics.js",
36
36
  "analytics:test": "npm run test:analytics"
37
37
  },
@@ -110,6 +110,9 @@ class ConversationAnalyzer {
110
110
  const tokenUsage = await this.getCachedTokenUsage(filePath, parsedMessages);
111
111
  const modelInfo = await this.getCachedModelInfo(filePath, parsedMessages);
112
112
 
113
+ // Calculate tool usage data with caching
114
+ const toolUsage = await this.getCachedToolUsage(filePath, parsedMessages);
115
+
113
116
  const conversation = {
114
117
  id: filename.replace('.jsonl', ''),
115
118
  filename: filename,
@@ -121,6 +124,7 @@ class ConversationAnalyzer {
121
124
  tokens: tokenUsage.total > 0 ? tokenUsage.total : this.estimateTokens(await this.getFileContent(filePath)),
122
125
  tokenUsage: tokenUsage,
123
126
  modelInfo: modelInfo,
127
+ toolUsage: toolUsage,
124
128
  project: projectFromPath || this.extractProjectFromConversation(parsedMessages),
125
129
  status: stateCalculator.determineConversationStatus(parsedMessages, stats.mtime),
126
130
  conversationState: stateCalculator.determineConversationState(parsedMessages, stats.mtime),
@@ -279,6 +283,21 @@ class ConversationAnalyzer {
279
283
  return this.generateStatusSquares(parsedMessages);
280
284
  }
281
285
 
286
+ /**
287
+ * Get cached tool usage analysis
288
+ * @param {string} filepath - File path
289
+ * @param {Array} parsedMessages - Parsed messages array
290
+ * @returns {Promise<Object>} Tool usage data
291
+ */
292
+ async getCachedToolUsage(filepath, parsedMessages) {
293
+ if (this.dataCache) {
294
+ return await this.dataCache.getCachedToolUsage(filepath, () => {
295
+ return this.extractToolUsage(parsedMessages);
296
+ });
297
+ }
298
+ return this.extractToolUsage(parsedMessages);
299
+ }
300
+
282
301
  /**
283
302
  * Calculate real token usage from message usage data
284
303
  * @param {Array} parsedMessages - Array of parsed message objects
@@ -387,6 +406,65 @@ class ConversationAnalyzer {
387
406
  return 'Unknown';
388
407
  }
389
408
 
409
+ /**
410
+ * Extract tool usage statistics from parsed messages
411
+ * @param {Array} parsedMessages - Array of parsed message objects
412
+ * @returns {Object} Tool usage statistics
413
+ */
414
+ extractToolUsage(parsedMessages) {
415
+ const toolStats = {};
416
+ const toolTimeline = [];
417
+ let totalToolCalls = 0;
418
+
419
+ parsedMessages.forEach(message => {
420
+ if (message.role === 'assistant' && message.content) {
421
+ const content = message.content;
422
+ const timestamp = message.timestamp;
423
+
424
+ // Handle string content with tool indicators
425
+ if (typeof content === 'string') {
426
+ const toolMatches = content.match(/\[Tool:\s*([^\]]+)\]/g);
427
+ if (toolMatches) {
428
+ toolMatches.forEach(match => {
429
+ const toolName = match.replace(/\[Tool:\s*([^\]]+)\]/, '$1').trim();
430
+ toolStats[toolName] = (toolStats[toolName] || 0) + 1;
431
+ totalToolCalls++;
432
+ toolTimeline.push({
433
+ tool: toolName,
434
+ timestamp: timestamp,
435
+ type: 'usage'
436
+ });
437
+ });
438
+ }
439
+ }
440
+
441
+ // Handle array content with tool_use blocks
442
+ if (Array.isArray(content)) {
443
+ content.forEach(block => {
444
+ if (block.type === 'tool_use') {
445
+ const toolName = block.name || 'Unknown Tool';
446
+ toolStats[toolName] = (toolStats[toolName] || 0) + 1;
447
+ totalToolCalls++;
448
+ toolTimeline.push({
449
+ tool: toolName,
450
+ timestamp: timestamp,
451
+ type: 'usage',
452
+ parameters: block.input || {}
453
+ });
454
+ }
455
+ });
456
+ }
457
+ }
458
+ });
459
+
460
+ return {
461
+ toolStats,
462
+ toolTimeline: toolTimeline.sort((a, b) => new Date(a.timestamp) - new Date(b.timestamp)),
463
+ totalToolCalls,
464
+ uniqueTools: Object.keys(toolStats).length
465
+ };
466
+ }
467
+
390
468
  /**
391
469
  * Generate status indicators for conversation messages
392
470
  * @param {Array} messages - Array of message objects
@@ -19,6 +19,7 @@ class DataCache {
19
19
  tokenUsage: new Map(), // filepath -> { usage, timestamp }
20
20
  modelInfo: new Map(), // filepath -> { info, timestamp }
21
21
  statusSquares: new Map(), // filepath -> { squares, timestamp }
22
+ toolUsage: new Map(), // filepath -> { usage, timestamp }
22
23
 
23
24
  // Expensive computations cache
24
25
  sessions: { data: null, timestamp: 0, dependencies: new Set() },
@@ -319,6 +320,32 @@ class DataCache {
319
320
  return squares;
320
321
  }
321
322
 
323
+ /**
324
+ * Cache tool usage analysis
325
+ * @param {string} filepath - File path
326
+ * @param {Function} extractFn - Tool usage extraction function
327
+ * @returns {Promise<Object>} Tool usage data
328
+ */
329
+ async getCachedToolUsage(filepath, extractFn) {
330
+ const cached = this.caches.toolUsage.get(filepath);
331
+ const fileStats = await this.getFileStats(filepath);
332
+
333
+ if (cached && cached.timestamp >= fileStats.mtime.getTime()) {
334
+ this.metrics.hits++;
335
+ return cached.usage;
336
+ }
337
+
338
+ this.metrics.misses++;
339
+ const usage = await extractFn();
340
+
341
+ this.caches.toolUsage.set(filepath, {
342
+ usage,
343
+ timestamp: fileStats.mtime.getTime()
344
+ });
345
+
346
+ return usage;
347
+ }
348
+
322
349
  /**
323
350
  * Smart invalidation based on file changes
324
351
  * @param {string} filepath - Path of changed file
@@ -332,6 +359,7 @@ class DataCache {
332
359
  this.caches.tokenUsage.delete(filepath);
333
360
  this.caches.modelInfo.delete(filepath);
334
361
  this.caches.statusSquares.delete(filepath);
362
+ this.caches.toolUsage.delete(filepath);
335
363
  this.caches.fileStats.delete(filepath);
336
364
 
337
365
  // Invalidate computations that depend on this file
@@ -450,6 +478,7 @@ class DataCache {
450
478
  ['tokenUsage', this.caches.tokenUsage],
451
479
  ['modelInfo', this.caches.modelInfo],
452
480
  ['statusSquares', this.caches.statusSquares],
481
+ ['toolUsage', this.caches.toolUsage],
453
482
  ['fileStats', this.caches.fileStats],
454
483
  ['projectStats', this.caches.projectStats]
455
484
  ];
@@ -507,6 +536,7 @@ class DataCache {
507
536
  tokenUsage: this.caches.tokenUsage.size,
508
537
  modelInfo: this.caches.modelInfo.size,
509
538
  statusSquares: this.caches.statusSquares.size,
539
+ toolUsage: this.caches.toolUsage.size,
510
540
  fileStats: this.caches.fileStats.size,
511
541
  projectStats: this.caches.projectStats.size,
512
542
  },