claude-code-templates 1.14.0 → 1.14.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.
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: api-security-audit
3
+ description: Use this agent when conducting security audits for REST APIs. Specializes in authentication vulnerabilities, authorization flaws, injection attacks, data exposure, and API security best practices. Examples: <example>Context: User needs to audit API security. user: 'I need to review my API endpoints for security vulnerabilities' assistant: 'I'll use the api-security-audit agent to perform a comprehensive security audit of your API endpoints' <commentary>Since the user needs API security assessment, use the api-security-audit agent for vulnerability analysis.</commentary></example> <example>Context: User has authentication issues. user: 'My API authentication seems vulnerable to attacks' assistant: 'Let me use the api-security-audit agent to analyze your authentication implementation and identify security weaknesses' <commentary>The user has specific authentication security concerns, so use the api-security-audit agent.</commentary></example>
4
+ color: red
5
+ ---
6
+
7
+ You are an API Security Audit specialist focusing on identifying, analyzing, and resolving security vulnerabilities in REST APIs. Your expertise covers authentication, authorization, data protection, and compliance with security standards.
8
+
9
+ Your core expertise areas:
10
+ - **Authentication Security**: JWT vulnerabilities, token management, session security
11
+ - **Authorization Flaws**: RBAC issues, privilege escalation, access control bypasses
12
+ - **Injection Attacks**: SQL injection, NoSQL injection, command injection prevention
13
+ - **Data Protection**: Sensitive data exposure, encryption, secure transmission
14
+ - **API Security Standards**: OWASP API Top 10, security headers, rate limiting
15
+ - **Compliance**: GDPR, HIPAA, PCI DSS requirements for APIs
16
+
17
+ ## When to Use This Agent
18
+
19
+ Use this agent for:
20
+ - Comprehensive API security audits
21
+ - Authentication and authorization reviews
22
+ - Vulnerability assessments and penetration testing
23
+ - Security compliance validation
24
+ - Incident response and remediation
25
+ - Security architecture reviews
26
+
27
+ ## Security Audit Checklist
28
+
29
+ ### Authentication & Authorization
30
+ ```javascript
31
+ // Secure JWT implementation
32
+ const jwt = require('jsonwebtoken');
33
+ const bcrypt = require('bcrypt');
34
+
35
+ class AuthService {
36
+ generateToken(user) {
37
+ return jwt.sign(
38
+ {
39
+ userId: user.id,
40
+ role: user.role,
41
+ permissions: user.permissions
42
+ },
43
+ process.env.JWT_SECRET,
44
+ {
45
+ expiresIn: '15m',
46
+ issuer: 'your-api',
47
+ audience: 'your-app'
48
+ }
49
+ );
50
+ }
51
+
52
+ verifyToken(token) {
53
+ try {
54
+ return jwt.verify(token, process.env.JWT_SECRET, {
55
+ issuer: 'your-api',
56
+ audience: 'your-app'
57
+ });
58
+ } catch (error) {
59
+ throw new Error('Invalid token');
60
+ }
61
+ }
62
+
63
+ async hashPassword(password) {
64
+ const saltRounds = 12;
65
+ return await bcrypt.hash(password, saltRounds);
66
+ }
67
+ }
68
+ ```
69
+
70
+ ### Input Validation & Sanitization
71
+ ```javascript
72
+ const { body, validationResult } = require('express-validator');
73
+
74
+ const validateUserInput = [
75
+ body('email').isEmail().normalizeEmail(),
76
+ body('password').isLength({ min: 8 }).matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])/),
77
+ body('name').trim().escape().isLength({ min: 1, max: 100 }),
78
+
79
+ (req, res, next) => {
80
+ const errors = validationResult(req);
81
+ if (!errors.isEmpty()) {
82
+ return res.status(400).json({
83
+ error: 'Validation failed',
84
+ details: errors.array()
85
+ });
86
+ }
87
+ next();
88
+ }
89
+ ];
90
+ ```
91
+
92
+ Always provide specific, actionable security recommendations with code examples and remediation steps when conducting API security audits.
@@ -0,0 +1,94 @@
1
+ ---
2
+ name: database-optimization
3
+ description: Use this agent when dealing with database performance issues. Specializes in query optimization, indexing strategies, schema design, connection pooling, and database monitoring. Examples: <example>Context: User has slow database queries. user: 'My database queries are taking too long to execute' assistant: 'I'll use the database-optimization agent to analyze and optimize your slow database queries' <commentary>Since the user has database performance issues, use the database-optimization agent for query analysis and optimization.</commentary></example> <example>Context: User needs indexing strategy. user: 'I need help designing indexes for better database performance' assistant: 'Let me use the database-optimization agent to design an optimal indexing strategy for your database schema' <commentary>The user needs indexing help, so use the database-optimization agent.</commentary></example>
4
+ color: blue
5
+ ---
6
+
7
+ You are a Database Optimization specialist focusing on improving database performance, query efficiency, and overall data access patterns. Your expertise covers SQL optimization, NoSQL performance tuning, and database architecture best practices.
8
+
9
+ Your core expertise areas:
10
+ - **Query Optimization**: SQL query tuning, execution plan analysis, join optimization
11
+ - **Indexing Strategies**: B-tree, hash, composite indexes, covering indexes
12
+ - **Schema Design**: Normalization, denormalization, partitioning strategies
13
+ - **Connection Management**: Connection pooling, transaction optimization
14
+ - **Performance Monitoring**: Query profiling, slow query analysis, metrics tracking
15
+ - **Database Architecture**: Replication, sharding, caching strategies
16
+
17
+ ## When to Use This Agent
18
+
19
+ Use this agent for:
20
+ - Slow query identification and optimization
21
+ - Database schema design and review
22
+ - Index strategy development
23
+ - Performance bottleneck analysis
24
+ - Connection pool configuration
25
+ - Database monitoring setup
26
+
27
+ ## Optimization Strategies
28
+
29
+ ### Query Optimization Examples
30
+ ```sql
31
+ -- Before: Inefficient query with N+1 problem
32
+ SELECT * FROM users WHERE id IN (
33
+ SELECT user_id FROM orders WHERE status = 'pending'
34
+ );
35
+
36
+ -- After: Optimized with proper JOIN
37
+ SELECT DISTINCT u.*
38
+ FROM users u
39
+ INNER JOIN orders o ON u.id = o.user_id
40
+ WHERE o.status = 'pending'
41
+ AND o.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY);
42
+
43
+ -- Add covering index for this query
44
+ CREATE INDEX idx_orders_status_created_userid
45
+ ON orders (status, created_at, user_id);
46
+ ```
47
+
48
+ ### Connection Pool Configuration
49
+ ```javascript
50
+ // Optimized connection pool setup
51
+ const mysql = require('mysql2/promise');
52
+
53
+ const pool = mysql.createPool({
54
+ host: process.env.DB_HOST,
55
+ user: process.env.DB_USER,
56
+ password: process.env.DB_PASSWORD,
57
+ database: process.env.DB_NAME,
58
+ waitForConnections: true,
59
+ connectionLimit: 10, // Adjust based on server capacity
60
+ queueLimit: 0,
61
+ acquireTimeout: 60000,
62
+ timeout: 60000,
63
+ reconnect: true,
64
+ // Enable prepared statements for better performance
65
+ namedPlaceholders: true
66
+ });
67
+
68
+ // Proper transaction handling
69
+ async function transferFunds(fromAccount, toAccount, amount) {
70
+ const connection = await pool.getConnection();
71
+ try {
72
+ await connection.beginTransaction();
73
+
74
+ await connection.execute(
75
+ 'UPDATE accounts SET balance = balance - ? WHERE id = ? AND balance >= ?',
76
+ [amount, fromAccount, amount]
77
+ );
78
+
79
+ await connection.execute(
80
+ 'UPDATE accounts SET balance = balance + ? WHERE id = ?',
81
+ [amount, toAccount]
82
+ );
83
+
84
+ await connection.commit();
85
+ } catch (error) {
86
+ await connection.rollback();
87
+ throw error;
88
+ } finally {
89
+ connection.release();
90
+ }
91
+ }
92
+ ```
93
+
94
+ Always provide specific performance improvements with measurable metrics and explain the reasoning behind optimization recommendations.
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: react-performance-optimization
3
+ description: Use this agent when dealing with React performance issues. Specializes in identifying and fixing performance bottlenecks, bundle optimization, rendering optimization, and memory leaks. Examples: <example>Context: User has slow React application. user: 'My React app is loading slowly and feels sluggish during interactions' assistant: 'I'll use the react-performance-optimization agent to help identify and fix the performance bottlenecks in your React application' <commentary>Since the user has React performance issues, use the react-performance-optimization agent for performance analysis and optimization.</commentary></example> <example>Context: User needs help with bundle size optimization. user: 'My React app bundle is too large and taking too long to load' assistant: 'Let me use the react-performance-optimization agent to help optimize your bundle size and improve loading performance' <commentary>The user needs bundle optimization help, so use the react-performance-optimization agent.</commentary></example>
4
+ color: red
5
+ ---
6
+
7
+ You are a React Performance Optimization specialist focusing on identifying, analyzing, and resolving performance bottlenecks in React applications. Your expertise covers rendering optimization, bundle analysis, memory management, and Core Web Vitals.
8
+
9
+ Your core expertise areas:
10
+ - **Rendering Performance**: Component re-renders, reconciliation optimization
11
+ - **Bundle Optimization**: Code splitting, tree shaking, dynamic imports
12
+ - **Memory Management**: Memory leaks, cleanup patterns, resource management
13
+ - **Network Performance**: Lazy loading, prefetching, caching strategies
14
+ - **Core Web Vitals**: LCP, FID, CLS optimization for React apps
15
+ - **Profiling Tools**: React DevTools Profiler, Chrome DevTools, Lighthouse
16
+
17
+ ## When to Use This Agent
18
+
19
+ Use this agent for:
20
+ - Slow loading React applications
21
+ - Janky or unresponsive user interactions
22
+ - Large bundle sizes affecting load times
23
+ - Memory leaks or excessive memory usage
24
+ - Poor Core Web Vitals scores
25
+ - Performance regression analysis
26
+
27
+ ## Performance Optimization Strategies
28
+
29
+ ### React.memo for Component Memoization
30
+ ```javascript
31
+ const ExpensiveComponent = React.memo(({ data, onUpdate }) => {
32
+ const processedData = useMemo(() => {
33
+ return data.map(item => ({
34
+ ...item,
35
+ computed: heavyComputation(item)
36
+ }));
37
+ }, [data]);
38
+
39
+ return (
40
+ <div>
41
+ {processedData.map(item => (
42
+ <Item key={item.id} item={item} onUpdate={onUpdate} />
43
+ ))}
44
+ </div>
45
+ );
46
+ });
47
+ ```
48
+
49
+ ### Code Splitting with React.lazy
50
+ ```javascript
51
+ const Dashboard = lazy(() => import('./pages/Dashboard'));
52
+
53
+ const App = () => (
54
+ <Router>
55
+ <Suspense fallback={<LoadingSpinner />}>
56
+ <Routes>
57
+ <Route path="/dashboard" element={<Dashboard />} />
58
+ </Routes>
59
+ </Suspense>
60
+ </Router>
61
+ );
62
+ ```
63
+
64
+ Always provide specific, measurable solutions with before/after performance comparisons when helping with React performance optimization.
@@ -0,0 +1,53 @@
1
+ # File Analysis Tool
2
+
3
+ Perform comprehensive analysis of $ARGUMENTS to identify code quality issues, security vulnerabilities, and optimization opportunities.
4
+
5
+ ## Task
6
+
7
+ I'll analyze the specified file and provide detailed insights on:
8
+
9
+ 1. Code quality metrics and maintainability
10
+ 2. Security vulnerabilities and best practices
11
+ 3. Performance bottlenecks and optimization opportunities
12
+ 4. Dependency usage and potential issues
13
+ 5. TypeScript/JavaScript specific patterns and improvements
14
+ 6. Test coverage and missing tests
15
+
16
+ ## Process
17
+
18
+ I'll follow these steps:
19
+
20
+ 1. Read and parse the target file
21
+ 2. Analyze code structure and complexity
22
+ 3. Check for security vulnerabilities and anti-patterns
23
+ 4. Evaluate performance implications
24
+ 5. Review dependency usage and imports
25
+ 6. Provide actionable recommendations for improvement
26
+
27
+ ## Analysis Areas
28
+
29
+ ### Code Quality
30
+ - Cyclomatic complexity and maintainability metrics
31
+ - Code duplication and refactoring opportunities
32
+ - Naming conventions and code organization
33
+ - TypeScript type safety and best practices
34
+
35
+ ### Security Assessment
36
+ - Input validation and sanitization
37
+ - Authentication and authorization patterns
38
+ - Sensitive data exposure risks
39
+ - Common vulnerability patterns (XSS, injection, etc.)
40
+
41
+ ### Performance Review
42
+ - Bundle size impact and optimization opportunities
43
+ - Runtime performance bottlenecks
44
+ - Memory usage patterns
45
+ - Lazy loading and code splitting opportunities
46
+
47
+ ### Best Practices
48
+ - Framework-specific patterns (React, Vue, Angular)
49
+ - Modern JavaScript/TypeScript features usage
50
+ - Error handling and logging practices
51
+ - Testing patterns and coverage gaps
52
+
53
+ I'll provide specific, actionable recommendations tailored to your project's technology stack and architecture.
@@ -0,0 +1,68 @@
1
+ # Test Generator
2
+
3
+ Generate comprehensive test suite for $ARGUMENTS following project testing conventions and best practices.
4
+
5
+ ## Task
6
+
7
+ I'll analyze the target code and create complete test coverage including:
8
+
9
+ 1. Unit tests for individual functions and methods
10
+ 2. Integration tests for component interactions
11
+ 3. Edge case and error handling tests
12
+ 4. Mock implementations for external dependencies
13
+ 5. Test utilities and helpers as needed
14
+ 6. Performance and snapshot tests where appropriate
15
+
16
+ ## Process
17
+
18
+ I'll follow these steps:
19
+
20
+ 1. Analyze the target file/component structure
21
+ 2. Identify all testable functions, methods, and behaviors
22
+ 3. Examine existing test patterns in the project
23
+ 4. Create test files following project naming conventions
24
+ 5. Implement comprehensive test cases with proper setup/teardown
25
+ 6. Add necessary mocks and test utilities
26
+ 7. Verify test coverage and add missing test cases
27
+
28
+ ## Test Types
29
+
30
+ ### Unit Tests
31
+ - Individual function testing with various inputs
32
+ - Component rendering and prop handling
33
+ - State management and lifecycle methods
34
+ - Utility function edge cases and error conditions
35
+
36
+ ### Integration Tests
37
+ - Component interaction testing
38
+ - API integration with mocked responses
39
+ - Service layer integration
40
+ - End-to-end user workflows
41
+
42
+ ### Framework-Specific Tests
43
+ - **React**: Component testing with React Testing Library
44
+ - **Vue**: Component testing with Vue Test Utils
45
+ - **Angular**: Component and service testing with TestBed
46
+ - **Node.js**: API endpoint and middleware testing
47
+
48
+ ## Testing Best Practices
49
+
50
+ ### Test Structure
51
+ - Use descriptive test names that explain the behavior
52
+ - Follow AAA pattern (Arrange, Act, Assert)
53
+ - Group related tests with describe blocks
54
+ - Use proper setup and teardown for test isolation
55
+
56
+ ### Mock Strategy
57
+ - Mock external dependencies and API calls
58
+ - Use factories for test data generation
59
+ - Implement proper cleanup for async operations
60
+ - Mock timers and dates for deterministic tests
61
+
62
+ ### Coverage Goals
63
+ - Aim for 80%+ code coverage
64
+ - Focus on critical business logic paths
65
+ - Test both happy path and error scenarios
66
+ - Include boundary value testing
67
+
68
+ I'll adapt to your project's testing framework (Jest, Vitest, Cypress, etc.) and follow established patterns.
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "DeepGraph Next.js MCP": {
4
+ "command": "npx",
5
+ "args": [
6
+ "-y",
7
+ "mcp-code-graph@latest",
8
+ "vercel/next.js"
9
+ ]
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "DeepGraph React MCP": {
4
+ "command": "npx",
5
+ "args": [
6
+ "-y",
7
+ "mcp-code-graph@latest",
8
+ "facebook/react"
9
+ ]
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "DeepGraph TypeScript MCP": {
4
+ "command": "npx",
5
+ "args": [
6
+ "-y",
7
+ "mcp-code-graph@latest",
8
+ "microsoft/TypeScript"
9
+ ]
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "DeepGraph Vue MCP": {
4
+ "command": "npx",
5
+ "args": [
6
+ "-y",
7
+ "mcp-code-graph@latest",
8
+ "vuejs/core"
9
+ ]
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "filesystem": {
4
+ "command": "npx",
5
+ "args": [
6
+ "-y",
7
+ "@modelcontextprotocol/server-filesystem",
8
+ "/path/to/allowed/files"
9
+ ]
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "github": {
4
+ "command": "npx",
5
+ "args": ["-y", "@modelcontextprotocol/server-github"],
6
+ "env": {
7
+ "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "memory": {
4
+ "command": "npx",
5
+ "args": ["-y", "@modelcontextprotocol/server-memory"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "mysql": {
4
+ "command": "uvx",
5
+ "args": ["mcp-server-mysql"],
6
+ "env": {
7
+ "MYSQL_CONNECTION_STRING": "mysql://user:password@localhost:3306/dbname"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "postgresql": {
4
+ "command": "npx",
5
+ "args": ["-y", "@modelcontextprotocol/server-postgres"],
6
+ "env": {
7
+ "POSTGRES_CONNECTION_STRING": "postgresql://user:password@localhost:5432/dbname"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "fetch": {
4
+ "command": "npx",
5
+ "args": ["-y", "@modelcontextprotocol/server-fetch"]
6
+ }
7
+ }
8
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-templates",
3
- "version": "1.14.0",
3
+ "version": "1.14.1",
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": {
@@ -86,6 +86,7 @@
86
86
  "bin/",
87
87
  "src/",
88
88
  "templates/",
89
+ "components/",
89
90
  "README.md"
90
91
  ],
91
92
  "devDependencies": {
package/src/index.js CHANGED
@@ -14,6 +14,7 @@ const { runHookStats } = require('./hook-stats');
14
14
  const { runMCPStats } = require('./mcp-stats');
15
15
  const { runAnalytics } = require('./analytics');
16
16
  const { runHealthCheck } = require('./health-check');
17
+ const { trackingService } = require('./tracking-service');
17
18
 
18
19
  async function showMainMenu() {
19
20
  console.log('');
@@ -49,12 +50,14 @@ async function showMainMenu() {
49
50
 
50
51
  if (initialChoice.action === 'analytics') {
51
52
  console.log(chalk.blue('📊 Launching Claude Code Analytics Dashboard...'));
53
+ trackingService.trackAnalyticsDashboard({ page: 'dashboard', source: 'interactive_menu' });
52
54
  await runAnalytics({});
53
55
  return;
54
56
  }
55
57
 
56
58
  if (initialChoice.action === 'chats') {
57
59
  console.log(chalk.blue('💬 Launching Claude Code Chats Dashboard...'));
60
+ trackingService.trackAnalyticsDashboard({ page: 'agents', source: 'interactive_menu' });
58
61
  await runAnalytics({ openTo: 'agents' });
59
62
  return;
60
63
  }
@@ -62,6 +65,13 @@ async function showMainMenu() {
62
65
  if (initialChoice.action === 'health') {
63
66
  console.log(chalk.blue('🔍 Running Health Check...'));
64
67
  const healthResult = await runHealthCheck();
68
+
69
+ // Track health check usage
70
+ trackingService.trackHealthCheck({
71
+ setup_recommended: healthResult.runSetup,
72
+ issues_found: healthResult.issues || 0
73
+ });
74
+
65
75
  if (healthResult.runSetup) {
66
76
  console.log(chalk.blue('⚙️ Starting Project Setup...'));
67
77
  // Continue with setup flow
@@ -116,12 +126,14 @@ async function createClaudeConfig(options = {}) {
116
126
 
117
127
  // Handle analytics dashboard
118
128
  if (options.analytics) {
129
+ trackingService.trackAnalyticsDashboard({ page: 'dashboard', source: 'command_line' });
119
130
  await runAnalytics(options);
120
131
  return;
121
132
  }
122
133
 
123
134
  // Handle chats/agents dashboard
124
135
  if (options.chats || options.agents) {
136
+ trackingService.trackAnalyticsDashboard({ page: 'agents', source: 'command_line' });
125
137
  await runAnalytics({ ...options, openTo: 'agents' });
126
138
  return;
127
139
  }
@@ -130,6 +142,14 @@ async function createClaudeConfig(options = {}) {
130
142
  let shouldRunSetup = false;
131
143
  if (options.healthCheck || options.health || options.check || options.verify) {
132
144
  const healthResult = await runHealthCheck();
145
+
146
+ // Track health check usage
147
+ trackingService.trackHealthCheck({
148
+ setup_recommended: healthResult.runSetup,
149
+ issues_found: healthResult.issues || 0,
150
+ source: 'command_line'
151
+ });
152
+
133
153
  if (healthResult.runSetup) {
134
154
  console.log(chalk.blue('⚙️ Starting Project Setup...'));
135
155
  shouldRunSetup = true;
@@ -244,8 +264,8 @@ async function createClaudeConfig(options = {}) {
244
264
  console.log(chalk.white(' 2. Customize the configuration for your project'));
245
265
  console.log(chalk.white(' 3. Start using Claude Code with: claude'));
246
266
  console.log('');
247
- console.log(chalk.blue('🌐 View all available templates at: https://davila7.github.io/claude-code-templates/'));
248
- console.log(chalk.blue('📖 Read the complete documentation at: https://davila7.github.io/claude-code-templates/docu/'));
267
+ console.log(chalk.blue('🌐 View all available templates at: https://aitmpl.com/'));
268
+ console.log(chalk.blue('📖 Read the complete documentation at: https://aitmpl.com/docu/'));
249
269
 
250
270
  if (config.language !== 'common') {
251
271
  console.log(chalk.yellow(`💡 Language-specific features for ${config.language} have been configured`));
@@ -262,6 +282,17 @@ async function createClaudeConfig(options = {}) {
262
282
  if (config.mcps && config.mcps.length > 0) {
263
283
  console.log(chalk.blue(`🔧 ${config.mcps.length} MCP servers have been configured`));
264
284
  }
285
+
286
+ // Track successful template installation
287
+ if (!options.agent && !options.command && !options.mcp) {
288
+ trackingService.trackTemplateInstallation(config.language, config.framework, {
289
+ installation_method: options.setupFromMenu ? 'interactive_menu' : 'command_line',
290
+ dry_run: options.dryRun || false,
291
+ hooks_count: config.hooks ? config.hooks.length : 0,
292
+ mcps_count: config.mcps ? config.mcps.length : 0,
293
+ project_detected: !!options.detectedProject
294
+ });
295
+ }
265
296
 
266
297
  // Run post-installation validation
267
298
  if (!options.dryRun) {
@@ -315,6 +346,14 @@ async function installIndividualAgent(agentName, targetDir, options) {
315
346
 
316
347
  console.log(chalk.green(`✅ Agent "${agentName}" installed successfully!`));
317
348
 
349
+ // Track successful agent installation
350
+ trackingService.trackDownload('agent', agentName, {
351
+ language: language,
352
+ framework: framework,
353
+ installation_type: 'individual_agent',
354
+ template_installed: true
355
+ });
356
+
318
357
  } catch (error) {
319
358
  console.log(chalk.red(`❌ Error installing agent: ${error.message}`));
320
359
  }
@@ -353,6 +392,12 @@ async function installIndividualCommand(commandName, targetDir, options) {
353
392
  console.log(chalk.green(`✅ Command "${commandName}" installed successfully!`));
354
393
  console.log(chalk.cyan(`📁 Installed to: ${path.relative(targetDir, targetFile)}`));
355
394
 
395
+ // Track successful command installation
396
+ trackingService.trackDownload('command', commandName, {
397
+ installation_type: 'individual_command',
398
+ target_directory: path.relative(process.cwd(), targetDir)
399
+ });
400
+
356
401
  } catch (error) {
357
402
  console.log(chalk.red(`❌ Error installing command: ${error.message}`));
358
403
  }
@@ -404,6 +449,13 @@ async function installIndividualMCP(mcpName, targetDir, options) {
404
449
  console.log(chalk.green(`✅ MCP "${mcpName}" installed successfully!`));
405
450
  console.log(chalk.cyan(`📁 Configuration merged into: ${path.relative(targetDir, targetMcpFile)}`));
406
451
 
452
+ // Track successful MCP installation
453
+ trackingService.trackDownload('mcp', mcpName, {
454
+ installation_type: 'individual_mcp',
455
+ merged_with_existing: existingConfig !== null,
456
+ servers_count: Object.keys(mergedConfig.mcpServers || {}).length
457
+ });
458
+
407
459
  } catch (error) {
408
460
  console.log(chalk.red(`❌ Error installing MCP: ${error.message}`));
409
461
  }
@@ -0,0 +1,188 @@
1
+ /**
2
+ * TrackingService - Download analytics using GitHub Issues as backend
3
+ * Records component installations for analytics without impacting user experience
4
+ */
5
+
6
+ class TrackingService {
7
+ constructor() {
8
+ this.repoOwner = 'davila7';
9
+ this.repoName = 'claude-code-templates';
10
+ this.trackingEnabled = this.shouldEnableTracking();
11
+ this.timeout = 5000; // 5s timeout for tracking requests
12
+ }
13
+
14
+ /**
15
+ * Check if tracking should be enabled (respects user privacy)
16
+ */
17
+ shouldEnableTracking() {
18
+ // Allow users to opt-out
19
+ if (process.env.CCT_NO_TRACKING === 'true' ||
20
+ process.env.CCT_NO_ANALYTICS === 'true' ||
21
+ process.env.CI === 'true') {
22
+ return false;
23
+ }
24
+
25
+ // Enable by default (anonymous usage data only)
26
+ return true;
27
+ }
28
+
29
+ /**
30
+ * Track a component download/installation
31
+ * @param {string} componentType - 'agent', 'command', or 'mcp'
32
+ * @param {string} componentName - Name of the component
33
+ * @param {object} metadata - Additional context (optional)
34
+ */
35
+ async trackDownload(componentType, componentName, metadata = {}) {
36
+ if (!this.trackingEnabled) {
37
+ return;
38
+ }
39
+
40
+ try {
41
+ // Create tracking payload
42
+ const trackingData = this.createTrackingPayload(componentType, componentName, metadata);
43
+
44
+ // Fire-and-forget tracking (don't block user experience)
45
+ this.sendTrackingData(trackingData)
46
+ .catch(error => {
47
+ // Silent failure - tracking should never impact functionality
48
+ console.debug('📊 Tracking info (non-critical):', error.message);
49
+ });
50
+
51
+ } catch (error) {
52
+ // Silently handle any tracking errors
53
+ console.debug('📊 Analytics error (non-critical):', error.message);
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Create standardized tracking payload
59
+ */
60
+ createTrackingPayload(componentType, componentName, metadata) {
61
+ const timestamp = new Date().toISOString();
62
+
63
+ return {
64
+ event: 'component_download',
65
+ component_type: componentType,
66
+ component_name: componentName,
67
+ timestamp: timestamp,
68
+ session_id: this.generateSessionId(),
69
+ environment: {
70
+ node_version: process.version,
71
+ platform: process.platform,
72
+ arch: process.arch,
73
+ cli_version: this.getCliVersion()
74
+ },
75
+ metadata: metadata
76
+ };
77
+ }
78
+
79
+ /**
80
+ * Send tracking data to GitHub Issues (async, non-blocking)
81
+ */
82
+ async sendTrackingData(trackingData) {
83
+ const title = `📊 ${trackingData.component_type}:${trackingData.component_name} - ${trackingData.timestamp.split('T')[0]}`;
84
+
85
+ const body = `\`\`\`json
86
+ ${JSON.stringify(trackingData, null, 2)}
87
+ \`\`\`
88
+
89
+ <!-- ANALYTICS_DATA -->
90
+ Component: **${trackingData.component_name}** (${trackingData.component_type})
91
+ Platform: ${trackingData.environment.platform} ${trackingData.environment.arch}
92
+ Node: ${trackingData.environment.node_version}
93
+ CLI: ${trackingData.environment.cli_version}
94
+ Session: \`${trackingData.session_id}\`
95
+ `;
96
+
97
+ const controller = new AbortController();
98
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
99
+
100
+ try {
101
+ const response = await fetch(`https://api.github.com/repos/${this.repoOwner}/${this.repoName}/issues`, {
102
+ method: 'POST',
103
+ headers: {
104
+ 'Content-Type': 'application/json',
105
+ 'User-Agent': 'claude-code-templates-cli'
106
+ },
107
+ body: JSON.stringify({
108
+ title: title,
109
+ body: body,
110
+ labels: ['📊 analytics', 'download-tracking', `type:${trackingData.component_type}`]
111
+ }),
112
+ signal: controller.signal
113
+ });
114
+
115
+ clearTimeout(timeoutId);
116
+
117
+ if (!response.ok) {
118
+ throw new Error(`GitHub API responded with ${response.status}`);
119
+ }
120
+
121
+ console.debug('📊 Download tracked successfully');
122
+
123
+ } catch (error) {
124
+ clearTimeout(timeoutId);
125
+ throw error;
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Generate a session ID for grouping related downloads
131
+ */
132
+ generateSessionId() {
133
+ return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
134
+ }
135
+
136
+ /**
137
+ * Get CLI version from package.json
138
+ */
139
+ getCliVersion() {
140
+ try {
141
+ const path = require('path');
142
+ const fs = require('fs');
143
+ const packagePath = path.join(__dirname, '..', 'package.json');
144
+ const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
145
+ return packageData.version || 'unknown';
146
+ } catch (error) {
147
+ return 'unknown';
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Track template installation (full project setup)
153
+ */
154
+ async trackTemplateInstallation(language, framework, metadata = {}) {
155
+ return this.trackDownload('template', `${language}/${framework}`, {
156
+ ...metadata,
157
+ installation_type: 'full_template'
158
+ });
159
+ }
160
+
161
+ /**
162
+ * Track health check usage
163
+ */
164
+ async trackHealthCheck(results = {}) {
165
+ return this.trackDownload('health-check', 'system-validation', {
166
+ installation_type: 'health_check',
167
+ results_summary: results
168
+ });
169
+ }
170
+
171
+ /**
172
+ * Track analytics dashboard usage
173
+ */
174
+ async trackAnalyticsDashboard(metadata = {}) {
175
+ return this.trackDownload('analytics', 'dashboard-launch', {
176
+ installation_type: 'analytics_dashboard',
177
+ ...metadata
178
+ });
179
+ }
180
+ }
181
+
182
+ // Export singleton instance
183
+ const trackingService = new TrackingService();
184
+
185
+ module.exports = {
186
+ TrackingService,
187
+ trackingService
188
+ };