@paulduvall/claude-dev-toolkit 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +88 -37
  3. package/bin/claude-commands +307 -65
  4. package/commands/active/xarchitecture.md +393 -0
  5. package/commands/active/xconfig.md +127 -0
  6. package/commands/active/xcontinue.md +92 -0
  7. package/commands/active/xdebug.md +130 -0
  8. package/commands/active/xdocs.md +178 -0
  9. package/commands/active/xexplore.md +94 -0
  10. package/commands/active/xgit.md +149 -0
  11. package/commands/active/xpipeline.md +152 -0
  12. package/commands/active/xquality.md +96 -0
  13. package/commands/active/xrefactor.md +198 -0
  14. package/commands/active/xrelease.md +142 -0
  15. package/commands/active/xsecurity.md +92 -0
  16. package/commands/active/xspec.md +174 -0
  17. package/commands/active/xtdd.md +151 -0
  18. package/commands/active/xtest.md +89 -0
  19. package/commands/active/xverify.md +80 -0
  20. package/commands/experiments/xact.md +742 -0
  21. package/commands/experiments/xanalytics.md +113 -0
  22. package/commands/experiments/xanalyze.md +70 -0
  23. package/commands/experiments/xapi.md +161 -0
  24. package/commands/experiments/xatomic.md +112 -0
  25. package/commands/experiments/xaws.md +85 -0
  26. package/commands/experiments/xcicd.md +337 -0
  27. package/commands/experiments/xcommit.md +122 -0
  28. package/commands/experiments/xcompliance.md +182 -0
  29. package/commands/experiments/xconstraints.md +89 -0
  30. package/commands/experiments/xcoverage.md +90 -0
  31. package/commands/experiments/xdb.md +102 -0
  32. package/commands/experiments/xdesign.md +121 -0
  33. package/commands/experiments/xdevcontainer.md +238 -0
  34. package/commands/experiments/xevaluate.md +111 -0
  35. package/commands/experiments/xfootnote.md +12 -0
  36. package/commands/experiments/xgenerate.md +117 -0
  37. package/commands/experiments/xgovernance.md +149 -0
  38. package/commands/experiments/xgreen.md +66 -0
  39. package/commands/experiments/xiac.md +118 -0
  40. package/commands/experiments/xincident.md +137 -0
  41. package/commands/experiments/xinfra.md +115 -0
  42. package/commands/experiments/xknowledge.md +115 -0
  43. package/commands/experiments/xmaturity.md +120 -0
  44. package/commands/experiments/xmetrics.md +118 -0
  45. package/commands/experiments/xmonitoring.md +128 -0
  46. package/commands/experiments/xnew.md +903 -0
  47. package/commands/experiments/xobservable.md +114 -0
  48. package/commands/experiments/xoidc.md +165 -0
  49. package/commands/experiments/xoptimize.md +115 -0
  50. package/commands/experiments/xperformance.md +112 -0
  51. package/commands/experiments/xplanning.md +131 -0
  52. package/commands/experiments/xpolicy.md +115 -0
  53. package/commands/experiments/xproduct.md +98 -0
  54. package/commands/experiments/xreadiness.md +75 -0
  55. package/commands/experiments/xred.md +55 -0
  56. package/commands/experiments/xrisk.md +128 -0
  57. package/commands/experiments/xrules.md +124 -0
  58. package/commands/experiments/xsandbox.md +120 -0
  59. package/commands/experiments/xscan.md +102 -0
  60. package/commands/experiments/xsetup.md +123 -0
  61. package/commands/experiments/xtemplate.md +116 -0
  62. package/commands/experiments/xtrace.md +212 -0
  63. package/commands/experiments/xux.md +171 -0
  64. package/commands/experiments/xvalidate.md +104 -0
  65. package/commands/experiments/xworkflow.md +113 -0
  66. package/hooks/.smellrc.example.json +19 -0
  67. package/hooks/README.md +263 -0
  68. package/hooks/check-commit-signing.py +127 -0
  69. package/hooks/check-complexity.py +38 -0
  70. package/hooks/check-security.py +37 -0
  71. package/hooks/claude-wrapper.sh +29 -0
  72. package/hooks/config.py +110 -0
  73. package/hooks/file-logger.sh +100 -0
  74. package/hooks/lib/argument-parser.sh +427 -0
  75. package/hooks/lib/config-constants.sh +230 -0
  76. package/hooks/lib/context-manager.sh +560 -0
  77. package/hooks/lib/error-handler.sh +423 -0
  78. package/hooks/lib/execution-engine.sh +444 -0
  79. package/hooks/lib/execution-results.sh +113 -0
  80. package/hooks/lib/execution-simulation.sh +114 -0
  81. package/hooks/lib/field-validators.sh +104 -0
  82. package/hooks/lib/file-utils.sh +398 -0
  83. package/hooks/lib/subagent-discovery.sh +468 -0
  84. package/hooks/lib/subagent-validator.sh +407 -0
  85. package/hooks/lib/validation-reporter.sh +134 -0
  86. package/hooks/on-error-debug.sh +226 -0
  87. package/hooks/pre-commit-quality.sh +204 -0
  88. package/hooks/pre-commit-test-runner.sh +132 -0
  89. package/hooks/pre-write-security.sh +115 -0
  90. package/hooks/prevent-credential-exposure.sh +279 -0
  91. package/hooks/security_bandit.py +177 -0
  92. package/hooks/security_checks.py +97 -0
  93. package/hooks/security_secrets.py +81 -0
  94. package/hooks/security_trojan.py +61 -0
  95. package/hooks/settings.example.json +52 -0
  96. package/hooks/smell_checks.py +238 -0
  97. package/hooks/smell_javascript.py +231 -0
  98. package/hooks/smell_python.py +110 -0
  99. package/hooks/smell_ruff.py +70 -0
  100. package/hooks/smell_types.py +72 -0
  101. package/hooks/subagent-trigger-simple.sh +202 -0
  102. package/hooks/subagent-trigger.sh +253 -0
  103. package/hooks/suppression.py +82 -0
  104. package/hooks/tab-color.sh +70 -0
  105. package/hooks/verify-before-edit.sh +135 -0
  106. package/lib/backup-restore-command.js +140 -0
  107. package/lib/base/base-command.js +252 -0
  108. package/lib/base/command-result.js +184 -0
  109. package/lib/config/constants.js +255 -0
  110. package/lib/config.js +48 -6
  111. package/lib/configure-command.js +428 -0
  112. package/lib/dependency-validator.js +64 -5
  113. package/lib/hook-installer-core.js +2 -2
  114. package/lib/installation-instruction-generator.js +213 -495
  115. package/lib/installer.js +134 -56
  116. package/lib/oidc-command.js +740 -0
  117. package/lib/services/backup-list-service.js +226 -0
  118. package/lib/services/backup-service.js +230 -0
  119. package/lib/services/command-installer-service.js +217 -0
  120. package/lib/services/logger-service.js +201 -0
  121. package/lib/services/package-manager-service.js +319 -0
  122. package/lib/services/platform-instruction-service.js +294 -0
  123. package/lib/services/recovery-instruction-service.js +348 -0
  124. package/lib/services/restore-service.js +221 -0
  125. package/lib/setup-command.js +359 -0
  126. package/lib/setup-wizard.js +155 -262
  127. package/lib/uninstall-command.js +100 -0
  128. package/lib/utils/claude-path-config.js +184 -0
  129. package/lib/utils/file-system-utils.js +152 -0
  130. package/lib/utils.js +8 -4
  131. package/lib/verify-command.js +430 -0
  132. package/package.json +7 -3
  133. package/scripts/postinstall.js +172 -157
  134. package/subagents/debug-specialist.md +7 -0
  135. package/templates/README.md +115 -0
  136. package/templates/basic-settings.json +30 -0
  137. package/templates/comprehensive-settings.json +57 -0
  138. package/templates/global-claude.md +344 -0
  139. package/templates/hybrid-hook-config.yaml +132 -0
  140. package/templates/security-focused-settings.json +62 -0
  141. package/templates/subagent-hooks.yaml +188 -0
  142. package/lib/package-manager-service.js +0 -270
  143. package/subagents/debug-context.md +0 -197
@@ -0,0 +1,430 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Verify Command Implementation
5
+ * Replaces verify-setup.sh functionality with npm package equivalent
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const os = require('os');
11
+ const { execSync } = require('child_process');
12
+
13
+ class VerifyCommand {
14
+ constructor() {
15
+ this.homeDir = process.env.TEST_HOME || os.homedir();
16
+ this.claudeDir = path.join(this.homeDir, '.claude');
17
+ this.commandsDir = path.join(this.claudeDir, 'commands');
18
+ this.settingsFile = path.join(this.claudeDir, 'settings.json');
19
+ this.results = {
20
+ overall: 'unknown',
21
+ checks: [],
22
+ issues: [],
23
+ suggestions: []
24
+ };
25
+ }
26
+
27
+ /**
28
+ * Execute verification with options
29
+ */
30
+ async execute(options = {}) {
31
+ const { verbose = false, fix = false } = options;
32
+
33
+ console.log('šŸ” Claude Dev Toolkit Verification\n');
34
+
35
+ try {
36
+ // Run all verification checks
37
+ await this.checkSystemInformation(verbose);
38
+ await this.checkClaudeCodeInstallation(verbose);
39
+ await this.checkDirectoryStructure(verbose);
40
+ await this.checkCommandInstallation(verbose);
41
+ await this.checkConfiguration(verbose);
42
+ await this.checkHooksInstallation(verbose);
43
+
44
+ // Attempt fixes if requested
45
+ if (fix && this.results.issues.length > 0) {
46
+ await this.attemptFixes();
47
+ }
48
+
49
+ // Generate final report
50
+ this.generateHealthReport(verbose);
51
+
52
+ return this.results;
53
+
54
+ } catch (error) {
55
+ console.error(`\nāŒ Verification failed: ${error.message}`);
56
+ this.results.overall = 'error';
57
+ this.results.error = error.message;
58
+ return this.results;
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Check system information
64
+ */
65
+ async checkSystemInformation(verbose) {
66
+ if (verbose) {
67
+ console.log('šŸ–„ļø System Information:');
68
+ }
69
+
70
+ const systemInfo = {
71
+ platform: os.platform(),
72
+ arch: os.arch(),
73
+ nodeVersion: process.version,
74
+ homeDir: this.homeDir
75
+ };
76
+
77
+ if (verbose) {
78
+ console.log(` Platform: ${systemInfo.platform} (${systemInfo.arch})`);
79
+ console.log(` Node.js: ${systemInfo.nodeVersion}`);
80
+ console.log(` Home: ${systemInfo.homeDir}`);
81
+ }
82
+
83
+ // Check npm version
84
+ try {
85
+ const npmVersion = execSync('npm --version', { encoding: 'utf8' }).trim();
86
+ systemInfo.npmVersion = npmVersion;
87
+ if (verbose) {
88
+ console.log(` npm: ${npmVersion}`);
89
+ }
90
+ } catch (error) {
91
+ this.addIssue('npm not found in PATH', 'install Node.js and npm');
92
+ }
93
+
94
+ this.addCheck('System Information', 'pass', systemInfo);
95
+ if (verbose) console.log('');
96
+ }
97
+
98
+ /**
99
+ * Check Claude Code installation
100
+ */
101
+ async checkClaudeCodeInstallation(verbose) {
102
+ if (verbose) {
103
+ console.log('šŸ¤– Claude Code Installation:');
104
+ }
105
+
106
+ try {
107
+ const version = execSync('claude --version', { encoding: 'utf8' }).trim();
108
+ this.addCheck('Claude Code Installation', 'pass', { version, found: true });
109
+ if (verbose) {
110
+ console.log(` āœ… Claude Code detected: ${version}`);
111
+ }
112
+ } catch (error) {
113
+ this.addCheck('Claude Code Installation', 'warning', { found: false });
114
+ this.addIssue('Claude Code not found', 'install with: npm install -g @anthropic-ai/claude-code');
115
+ if (verbose) {
116
+ console.log(' āš ļø Claude Code not detected (optional for toolkit functionality)');
117
+ }
118
+ }
119
+
120
+ if (verbose) console.log('');
121
+ }
122
+
123
+ /**
124
+ * Check directory structure
125
+ */
126
+ async checkDirectoryStructure(verbose) {
127
+ if (verbose) {
128
+ console.log('šŸ“ Directory Structure:');
129
+ }
130
+
131
+ const directories = [
132
+ { path: this.claudeDir, name: '.claude directory', critical: true },
133
+ { path: this.commandsDir, name: 'commands directory', critical: true },
134
+ { path: path.join(this.claudeDir, 'hooks'), name: 'hooks directory', critical: false },
135
+ { path: path.join(this.claudeDir, 'subagents'), name: 'subagents directory', critical: false }
136
+ ];
137
+
138
+ let allCriticalExist = true;
139
+
140
+ directories.forEach(dir => {
141
+ const exists = fs.existsSync(dir.path);
142
+ const status = exists ? 'pass' : (dir.critical ? 'fail' : 'warning');
143
+
144
+ if (verbose) {
145
+ const icon = exists ? 'āœ…' : (dir.critical ? 'āŒ' : 'āš ļø');
146
+ console.log(` ${icon} ${dir.name}: ${exists ? 'exists' : 'missing'}`);
147
+ }
148
+
149
+ this.addCheck(`Directory: ${dir.name}`, status, { path: dir.path, exists });
150
+
151
+ if (!exists && dir.critical) {
152
+ allCriticalExist = false;
153
+ this.addIssue(`Missing ${dir.name}`, 'run: claude-commands setup');
154
+ }
155
+ });
156
+
157
+ if (verbose) console.log('');
158
+ return allCriticalExist;
159
+ }
160
+
161
+ /**
162
+ * Check command installation
163
+ */
164
+ async checkCommandInstallation(verbose) {
165
+ if (verbose) {
166
+ console.log('šŸ“¦ Command Installation:');
167
+ }
168
+
169
+ try {
170
+ if (!fs.existsSync(this.commandsDir)) {
171
+ this.addCheck('Commands Installation', 'fail', { count: 0, error: 'Commands directory missing' });
172
+ this.addIssue('Commands directory missing', 'run: claude-commands setup');
173
+ if (verbose) {
174
+ console.log(' āŒ Commands directory not found');
175
+ }
176
+ return;
177
+ }
178
+
179
+ const commands = fs.readdirSync(this.commandsDir).filter(f => f.endsWith('.md'));
180
+ const commandCount = commands.length;
181
+
182
+ if (commandCount === 0) {
183
+ this.addCheck('Commands Installation', 'fail', { count: 0 });
184
+ this.addIssue('No commands installed', 'run: claude-commands install --active');
185
+ if (verbose) {
186
+ console.log(' āŒ No commands found');
187
+ }
188
+ } else {
189
+ this.addCheck('Commands Installation', 'pass', { count: commandCount, commands: commands.slice(0, 5) });
190
+ if (verbose) {
191
+ console.log(` āœ… ${commandCount} commands installed`);
192
+ if (commandCount <= 10) {
193
+ commands.forEach(cmd => console.log(` • ${cmd.replace('.md', '')}`));
194
+ } else {
195
+ commands.slice(0, 5).forEach(cmd => console.log(` • ${cmd.replace('.md', '')}`));
196
+ console.log(` • ... and ${commandCount - 5} more`);
197
+ }
198
+ }
199
+ }
200
+ } catch (error) {
201
+ this.addCheck('Commands Installation', 'error', { error: error.message });
202
+ this.addIssue('Cannot read commands directory', 'check permissions and re-run setup');
203
+ if (verbose) {
204
+ console.log(` šŸ’„ Error reading commands: ${error.message}`);
205
+ }
206
+ }
207
+
208
+ if (verbose) console.log('');
209
+ }
210
+
211
+ /**
212
+ * Check configuration
213
+ */
214
+ async checkConfiguration(verbose) {
215
+ if (verbose) {
216
+ console.log('āš™ļø Configuration:');
217
+ }
218
+
219
+ if (fs.existsSync(this.settingsFile)) {
220
+ try {
221
+ const config = JSON.parse(fs.readFileSync(this.settingsFile, 'utf8'));
222
+ const keys = Object.keys(config);
223
+
224
+ this.addCheck('Configuration File', 'pass', {
225
+ exists: true,
226
+ keys: keys.length,
227
+ hasHooks: !!config.hooks,
228
+ hasPermissions: !!config.permissions
229
+ });
230
+
231
+ if (verbose) {
232
+ console.log(' āœ… Configuration file found');
233
+ console.log(` šŸ“‹ ${keys.length} configuration keys`);
234
+ if (config.hooks) console.log(' šŸŽ£ Hooks configured');
235
+ if (config.permissions) console.log(' šŸ”’ Permissions configured');
236
+ }
237
+ } catch (error) {
238
+ this.addCheck('Configuration File', 'warning', { exists: true, error: 'Invalid JSON' });
239
+ this.addIssue('Configuration file has invalid JSON', 'run: claude-commands config --reset');
240
+ if (verbose) {
241
+ console.log(' āš ļø Configuration file exists but has invalid JSON');
242
+ }
243
+ }
244
+ } else {
245
+ this.addCheck('Configuration File', 'warning', { exists: false });
246
+ if (verbose) {
247
+ console.log(' āš ļø No configuration file (using defaults)');
248
+ console.log(' šŸ’” Create one with: claude-commands config --template basic');
249
+ }
250
+ }
251
+
252
+ if (verbose) console.log('');
253
+ }
254
+
255
+ /**
256
+ * Check hooks installation
257
+ */
258
+ async checkHooksInstallation(verbose) {
259
+ if (verbose) {
260
+ console.log('šŸŽ£ Hooks Installation:');
261
+ }
262
+
263
+ const hooksDir = path.join(this.claudeDir, 'hooks');
264
+
265
+ if (fs.existsSync(hooksDir)) {
266
+ try {
267
+ const hooks = fs.readdirSync(hooksDir).filter(f => f.endsWith('.sh'));
268
+ this.addCheck('Hooks Installation', 'pass', { count: hooks.length, hooks });
269
+ if (verbose) {
270
+ console.log(` āœ… ${hooks.length} hooks installed`);
271
+ hooks.forEach(hook => console.log(` • ${hook}`));
272
+ }
273
+ } catch (error) {
274
+ this.addCheck('Hooks Installation', 'warning', { error: error.message });
275
+ if (verbose) {
276
+ console.log(' āš ļø Hooks directory exists but cannot read contents');
277
+ }
278
+ }
279
+ } else {
280
+ this.addCheck('Hooks Installation', 'info', { installed: false });
281
+ if (verbose) {
282
+ console.log(' ā„¹ļø No hooks installed (optional)');
283
+ console.log(' šŸ’” Install with: claude-commands setup (without --skip-hooks)');
284
+ }
285
+ }
286
+
287
+ if (verbose) console.log('');
288
+ }
289
+
290
+ /**
291
+ * Attempt automatic fixes
292
+ */
293
+ async attemptFixes() {
294
+ console.log('šŸ”§ Attempting automatic fixes...\n');
295
+
296
+ let fixesApplied = 0;
297
+
298
+ for (const issue of this.results.issues) {
299
+ try {
300
+ if (issue.description.includes('Commands directory missing')) {
301
+ console.log(' šŸ”§ Creating commands directory...');
302
+ fs.mkdirSync(this.commandsDir, { recursive: true });
303
+ console.log(' āœ… Commands directory created');
304
+ fixesApplied++;
305
+ } else if (issue.description.includes('No commands installed')) {
306
+ console.log(' šŸ”§ Installing active commands...');
307
+ const installer = require('./installer');
308
+ await installer.install({ active: true });
309
+ console.log(' āœ… Active commands installed');
310
+ fixesApplied++;
311
+ }
312
+ } catch (error) {
313
+ console.log(` āŒ Fix failed: ${error.message}`);
314
+ }
315
+ }
316
+
317
+ if (fixesApplied > 0) {
318
+ console.log(`\nāœ… Applied ${fixesApplied} automatic fixes`);
319
+ console.log('šŸ’” Re-run verification to check results');
320
+ } else {
321
+ console.log('\nāš ļø No automatic fixes available');
322
+ console.log('šŸ’” See suggestions below for manual resolution');
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Generate health report
328
+ */
329
+ generateHealthReport(verbose) {
330
+ console.log('šŸ„ Health Check Report');
331
+ console.log('=' .repeat(40));
332
+
333
+ const passed = this.results.checks.filter(c => c.status === 'pass').length;
334
+ const failed = this.results.checks.filter(c => c.status === 'fail').length;
335
+ const warnings = this.results.checks.filter(c => c.status === 'warning').length;
336
+
337
+ // Determine overall health
338
+ if (failed === 0 && warnings === 0) {
339
+ this.results.overall = 'healthy';
340
+ console.log('🟢 Overall Status: HEALTHY');
341
+ } else if (failed === 0) {
342
+ this.results.overall = 'warning';
343
+ console.log('🟔 Overall Status: MINOR ISSUES');
344
+ } else {
345
+ this.results.overall = 'critical';
346
+ console.log('šŸ”“ Overall Status: CRITICAL ISSUES');
347
+ }
348
+
349
+ console.log(`šŸ“Š Summary: ${passed} passed, ${warnings} warnings, ${failed} failed`);
350
+
351
+ // Show issues and suggestions
352
+ if (this.results.issues.length > 0) {
353
+ console.log('\nā— Issues Found:');
354
+ this.results.issues.forEach(issue => {
355
+ console.log(` • ${issue.description}`);
356
+ if (issue.suggestion) {
357
+ console.log(` šŸ’” ${issue.suggestion}`);
358
+ }
359
+ });
360
+ }
361
+
362
+ // Overall recommendations
363
+ if (failed > 0) {
364
+ console.log('\n🚨 Critical Issues Detected:');
365
+ console.log(' Run: claude-commands setup --force');
366
+ console.log(' Or: claude-commands verify --fix');
367
+ } else if (warnings > 0) {
368
+ console.log('\nšŸ’” Recommendations:');
369
+ console.log(' Consider running: claude-commands config --template comprehensive');
370
+ } else {
371
+ console.log('\nāœ… Installation is healthy and ready to use!');
372
+ console.log(' Try: /xhelp in Claude Code to see all available commands');
373
+ }
374
+ }
375
+
376
+ /**
377
+ * Add check result
378
+ */
379
+ addCheck(name, status, details) {
380
+ this.results.checks.push({ name, status, details, timestamp: new Date().toISOString() });
381
+ }
382
+
383
+ /**
384
+ * Add issue
385
+ */
386
+ addIssue(description, suggestion) {
387
+ this.results.issues.push({ description, suggestion });
388
+ }
389
+
390
+ /**
391
+ * Get help text for verify command
392
+ */
393
+ getHelpText() {
394
+ return `
395
+ Verify the Claude Dev Toolkit installation status and health.
396
+
397
+ This command replaces the functionality of verify-setup.sh script, providing
398
+ comprehensive installation verification and health checking.
399
+
400
+ Usage:
401
+ claude-commands verify [options]
402
+
403
+ Options:
404
+ --verbose Show detailed verification information
405
+ --fix Attempt to fix detected issues automatically
406
+
407
+ Examples:
408
+ claude-commands verify
409
+ claude-commands verify --verbose
410
+ claude-commands verify --fix
411
+ claude-commands verify --verbose --fix
412
+
413
+ The verify command checks:
414
+ • System requirements and environment
415
+ • Claude Code installation status
416
+ • Directory structure completeness
417
+ • Command installation and count
418
+ • Configuration file validity
419
+ • Hooks installation status
420
+ • Overall health score
421
+
422
+ Exit codes:
423
+ 0 - All checks passed (healthy)
424
+ 1 - Minor issues detected (warnings)
425
+ 2 - Critical issues detected (requires attention)
426
+ `.trim();
427
+ }
428
+ }
429
+
430
+ module.exports = VerifyCommand;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paulduvall/claude-dev-toolkit",
3
- "version": "0.0.1-alpha.2",
3
+ "version": "0.0.1-alpha.21",
4
4
  "description": "Custom commands toolkit for Claude Code - streamline your development workflow",
5
5
  "author": "Paul Duvall",
6
6
  "license": "MIT",
@@ -24,6 +24,7 @@
24
24
  "claude-commands": "bin/claude-commands"
25
25
  },
26
26
  "scripts": {
27
+ "prepublishOnly": "bash ../scripts/sync-to-npm.sh",
27
28
  "postinstall": "node scripts/postinstall.js",
28
29
  "test": "node scripts/run-all-tests.js",
29
30
  "test:report": "node scripts/generate-test-report.js",
@@ -42,12 +43,16 @@
42
43
  "test:subagents": "node tests/test_subagents_command.js",
43
44
  "test:subagents-async": "node tests/test_subagents_async.js",
44
45
  "test:config": "node tests/test_config_command.js",
46
+ "test:ux-quick-start": "node tests/test_ux_quick_start_guide.js",
47
+ "test:npm-completeness": "node tests/test_npm_package_completeness.js",
45
48
  "test:install": "scripts/publishing/test-package-install.sh",
46
49
  "test:manual": "scripts/publishing/manual-test-suite.sh",
47
50
  "publish:local": "scripts/publishing/setup-local-registry.sh",
48
51
  "publish:private": "scripts/publishing/publish-private.sh",
49
52
  "lint": "eslint lib/**/*.js bin/**/*.js",
50
- "validate": "node scripts/validate.js"
53
+ "validate": "node scripts/validate.js",
54
+ "version": "echo 'Remember to update README.md with new version details!'",
55
+ "prepublishOnly": "npm ci && npm test && npm run validate"
51
56
  },
52
57
  "dependencies": {
53
58
  "commander": "^9.0.0",
@@ -56,7 +61,6 @@
56
61
  },
57
62
  "devDependencies": {
58
63
  "eslint": "^8.0.0",
59
- "jest": "^29.0.0",
60
64
  "typescript": "^5.0.0",
61
65
  "@types/node": "^20.0.0"
62
66
  },