@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.
- package/LICENSE +21 -0
- package/README.md +88 -37
- package/bin/claude-commands +307 -65
- package/commands/active/xarchitecture.md +393 -0
- package/commands/active/xconfig.md +127 -0
- package/commands/active/xcontinue.md +92 -0
- package/commands/active/xdebug.md +130 -0
- package/commands/active/xdocs.md +178 -0
- package/commands/active/xexplore.md +94 -0
- package/commands/active/xgit.md +149 -0
- package/commands/active/xpipeline.md +152 -0
- package/commands/active/xquality.md +96 -0
- package/commands/active/xrefactor.md +198 -0
- package/commands/active/xrelease.md +142 -0
- package/commands/active/xsecurity.md +92 -0
- package/commands/active/xspec.md +174 -0
- package/commands/active/xtdd.md +151 -0
- package/commands/active/xtest.md +89 -0
- package/commands/active/xverify.md +80 -0
- package/commands/experiments/xact.md +742 -0
- package/commands/experiments/xanalytics.md +113 -0
- package/commands/experiments/xanalyze.md +70 -0
- package/commands/experiments/xapi.md +161 -0
- package/commands/experiments/xatomic.md +112 -0
- package/commands/experiments/xaws.md +85 -0
- package/commands/experiments/xcicd.md +337 -0
- package/commands/experiments/xcommit.md +122 -0
- package/commands/experiments/xcompliance.md +182 -0
- package/commands/experiments/xconstraints.md +89 -0
- package/commands/experiments/xcoverage.md +90 -0
- package/commands/experiments/xdb.md +102 -0
- package/commands/experiments/xdesign.md +121 -0
- package/commands/experiments/xdevcontainer.md +238 -0
- package/commands/experiments/xevaluate.md +111 -0
- package/commands/experiments/xfootnote.md +12 -0
- package/commands/experiments/xgenerate.md +117 -0
- package/commands/experiments/xgovernance.md +149 -0
- package/commands/experiments/xgreen.md +66 -0
- package/commands/experiments/xiac.md +118 -0
- package/commands/experiments/xincident.md +137 -0
- package/commands/experiments/xinfra.md +115 -0
- package/commands/experiments/xknowledge.md +115 -0
- package/commands/experiments/xmaturity.md +120 -0
- package/commands/experiments/xmetrics.md +118 -0
- package/commands/experiments/xmonitoring.md +128 -0
- package/commands/experiments/xnew.md +903 -0
- package/commands/experiments/xobservable.md +114 -0
- package/commands/experiments/xoidc.md +165 -0
- package/commands/experiments/xoptimize.md +115 -0
- package/commands/experiments/xperformance.md +112 -0
- package/commands/experiments/xplanning.md +131 -0
- package/commands/experiments/xpolicy.md +115 -0
- package/commands/experiments/xproduct.md +98 -0
- package/commands/experiments/xreadiness.md +75 -0
- package/commands/experiments/xred.md +55 -0
- package/commands/experiments/xrisk.md +128 -0
- package/commands/experiments/xrules.md +124 -0
- package/commands/experiments/xsandbox.md +120 -0
- package/commands/experiments/xscan.md +102 -0
- package/commands/experiments/xsetup.md +123 -0
- package/commands/experiments/xtemplate.md +116 -0
- package/commands/experiments/xtrace.md +212 -0
- package/commands/experiments/xux.md +171 -0
- package/commands/experiments/xvalidate.md +104 -0
- package/commands/experiments/xworkflow.md +113 -0
- package/hooks/.smellrc.example.json +19 -0
- package/hooks/README.md +263 -0
- package/hooks/check-commit-signing.py +127 -0
- package/hooks/check-complexity.py +38 -0
- package/hooks/check-security.py +37 -0
- package/hooks/claude-wrapper.sh +29 -0
- package/hooks/config.py +110 -0
- package/hooks/file-logger.sh +100 -0
- package/hooks/lib/argument-parser.sh +427 -0
- package/hooks/lib/config-constants.sh +230 -0
- package/hooks/lib/context-manager.sh +560 -0
- package/hooks/lib/error-handler.sh +423 -0
- package/hooks/lib/execution-engine.sh +444 -0
- package/hooks/lib/execution-results.sh +113 -0
- package/hooks/lib/execution-simulation.sh +114 -0
- package/hooks/lib/field-validators.sh +104 -0
- package/hooks/lib/file-utils.sh +398 -0
- package/hooks/lib/subagent-discovery.sh +468 -0
- package/hooks/lib/subagent-validator.sh +407 -0
- package/hooks/lib/validation-reporter.sh +134 -0
- package/hooks/on-error-debug.sh +226 -0
- package/hooks/pre-commit-quality.sh +204 -0
- package/hooks/pre-commit-test-runner.sh +132 -0
- package/hooks/pre-write-security.sh +115 -0
- package/hooks/prevent-credential-exposure.sh +279 -0
- package/hooks/security_bandit.py +177 -0
- package/hooks/security_checks.py +97 -0
- package/hooks/security_secrets.py +81 -0
- package/hooks/security_trojan.py +61 -0
- package/hooks/settings.example.json +52 -0
- package/hooks/smell_checks.py +238 -0
- package/hooks/smell_javascript.py +231 -0
- package/hooks/smell_python.py +110 -0
- package/hooks/smell_ruff.py +70 -0
- package/hooks/smell_types.py +72 -0
- package/hooks/subagent-trigger-simple.sh +202 -0
- package/hooks/subagent-trigger.sh +253 -0
- package/hooks/suppression.py +82 -0
- package/hooks/tab-color.sh +70 -0
- package/hooks/verify-before-edit.sh +135 -0
- package/lib/backup-restore-command.js +140 -0
- package/lib/base/base-command.js +252 -0
- package/lib/base/command-result.js +184 -0
- package/lib/config/constants.js +255 -0
- package/lib/config.js +48 -6
- package/lib/configure-command.js +428 -0
- package/lib/dependency-validator.js +64 -5
- package/lib/hook-installer-core.js +2 -2
- package/lib/installation-instruction-generator.js +213 -495
- package/lib/installer.js +134 -56
- package/lib/oidc-command.js +740 -0
- package/lib/services/backup-list-service.js +226 -0
- package/lib/services/backup-service.js +230 -0
- package/lib/services/command-installer-service.js +217 -0
- package/lib/services/logger-service.js +201 -0
- package/lib/services/package-manager-service.js +319 -0
- package/lib/services/platform-instruction-service.js +294 -0
- package/lib/services/recovery-instruction-service.js +348 -0
- package/lib/services/restore-service.js +221 -0
- package/lib/setup-command.js +359 -0
- package/lib/setup-wizard.js +155 -262
- package/lib/uninstall-command.js +100 -0
- package/lib/utils/claude-path-config.js +184 -0
- package/lib/utils/file-system-utils.js +152 -0
- package/lib/utils.js +8 -4
- package/lib/verify-command.js +430 -0
- package/package.json +7 -3
- package/scripts/postinstall.js +172 -157
- package/subagents/debug-specialist.md +7 -0
- package/templates/README.md +115 -0
- package/templates/basic-settings.json +30 -0
- package/templates/comprehensive-settings.json +57 -0
- package/templates/global-claude.md +344 -0
- package/templates/hybrid-hook-config.yaml +132 -0
- package/templates/security-focused-settings.json +62 -0
- package/templates/subagent-hooks.yaml +188 -0
- package/lib/package-manager-service.js +0 -270
- 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.
|
|
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
|
},
|