driftdetect 0.8.2 → 0.8.3

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,446 @@
1
+ /**
2
+ * Troubleshoot Command - drift troubleshoot
3
+ *
4
+ * Diagnoses common issues and provides targeted fixes.
5
+ * Helps users resolve problems without searching documentation.
6
+ */
7
+ import { Command } from 'commander';
8
+ import * as fs from 'node:fs/promises';
9
+ import * as path from 'node:path';
10
+ import chalk from 'chalk';
11
+ import { createSpinner } from '../ui/spinner.js';
12
+ const DRIFT_DIR = '.drift';
13
+ /**
14
+ * Check if drift is initialized
15
+ */
16
+ async function checkInitialized(rootDir) {
17
+ try {
18
+ await fs.access(path.join(rootDir, DRIFT_DIR));
19
+ return null;
20
+ }
21
+ catch {
22
+ return {
23
+ id: 'not-initialized',
24
+ severity: 'error',
25
+ title: 'Drift not initialized',
26
+ description: 'The .drift/ directory does not exist. Drift needs to be initialized before use.',
27
+ fix: 'Run `drift init` to initialize Drift in this project.',
28
+ autoFixable: true,
29
+ fixCommand: 'drift init -y',
30
+ };
31
+ }
32
+ }
33
+ /**
34
+ * Check if config is valid
35
+ */
36
+ async function checkConfig(rootDir) {
37
+ const configPath = path.join(rootDir, DRIFT_DIR, 'config.json');
38
+ try {
39
+ const content = await fs.readFile(configPath, 'utf-8');
40
+ JSON.parse(content);
41
+ return null;
42
+ }
43
+ catch (error) {
44
+ if (error.code === 'ENOENT') {
45
+ return {
46
+ id: 'missing-config',
47
+ severity: 'error',
48
+ title: 'Missing config.json',
49
+ description: 'The .drift/config.json file is missing.',
50
+ fix: 'Run `drift init` to recreate the configuration.',
51
+ autoFixable: true,
52
+ fixCommand: 'drift init -y',
53
+ };
54
+ }
55
+ return {
56
+ id: 'invalid-config',
57
+ severity: 'error',
58
+ title: 'Invalid config.json',
59
+ description: `The .drift/config.json file contains invalid JSON: ${error.message}`,
60
+ fix: 'Check the config file for syntax errors or run `drift init` to recreate it.',
61
+ autoFixable: false,
62
+ };
63
+ }
64
+ }
65
+ /**
66
+ * Check if patterns exist
67
+ */
68
+ async function checkPatterns(rootDir) {
69
+ const patternsDir = path.join(rootDir, DRIFT_DIR, 'patterns');
70
+ const lakeDir = path.join(rootDir, DRIFT_DIR, 'lake', 'patterns');
71
+ let hasPatterns = false;
72
+ try {
73
+ const discoveredDir = path.join(patternsDir, 'discovered');
74
+ const files = await fs.readdir(discoveredDir);
75
+ hasPatterns = files.some(f => f.endsWith('.json'));
76
+ }
77
+ catch { /* */ }
78
+ if (!hasPatterns) {
79
+ try {
80
+ const files = await fs.readdir(lakeDir);
81
+ hasPatterns = files.some(f => f.endsWith('.json'));
82
+ }
83
+ catch { /* */ }
84
+ }
85
+ if (!hasPatterns) {
86
+ return {
87
+ id: 'no-patterns',
88
+ severity: 'warning',
89
+ title: 'No patterns found',
90
+ description: 'No patterns have been discovered yet. The codebase needs to be scanned.',
91
+ fix: 'Run `drift scan` to discover patterns in your codebase.',
92
+ autoFixable: true,
93
+ fixCommand: 'drift scan',
94
+ };
95
+ }
96
+ return null;
97
+ }
98
+ /**
99
+ * Check .driftignore for common issues
100
+ */
101
+ async function checkDriftignore(rootDir) {
102
+ const issues = [];
103
+ const driftignorePath = path.join(rootDir, '.driftignore');
104
+ try {
105
+ await fs.access(driftignorePath);
106
+ }
107
+ catch {
108
+ issues.push({
109
+ id: 'missing-driftignore',
110
+ severity: 'info',
111
+ title: 'No .driftignore file',
112
+ description: 'Consider adding a .driftignore file to exclude files from scanning.',
113
+ fix: 'Create a .driftignore file with patterns like node_modules/, dist/, etc.',
114
+ autoFixable: false,
115
+ });
116
+ return issues;
117
+ }
118
+ // Check for common missing patterns
119
+ const content = await fs.readFile(driftignorePath, 'utf-8');
120
+ const lines = content.split('\n').map(l => l.trim());
121
+ const recommendedPatterns = [
122
+ { pattern: 'node_modules', check: () => fs.access(path.join(rootDir, 'node_modules')).then(() => true).catch(() => false) },
123
+ { pattern: 'dist', check: () => fs.access(path.join(rootDir, 'dist')).then(() => true).catch(() => false) },
124
+ { pattern: 'build', check: () => fs.access(path.join(rootDir, 'build')).then(() => true).catch(() => false) },
125
+ { pattern: '.git', check: () => fs.access(path.join(rootDir, '.git')).then(() => true).catch(() => false) },
126
+ { pattern: 'vendor', check: () => fs.access(path.join(rootDir, 'vendor')).then(() => true).catch(() => false) },
127
+ { pattern: '__pycache__', check: () => fs.access(path.join(rootDir, '__pycache__')).then(() => true).catch(() => false) },
128
+ ];
129
+ for (const { pattern, check } of recommendedPatterns) {
130
+ const exists = await check();
131
+ const isIgnored = lines.some(l => l.includes(pattern));
132
+ if (exists && !isIgnored) {
133
+ issues.push({
134
+ id: `missing-ignore-${pattern}`,
135
+ severity: 'warning',
136
+ title: `${pattern}/ not in .driftignore`,
137
+ description: `The ${pattern}/ directory exists but is not ignored. This may slow down scans.`,
138
+ fix: `Add "${pattern}/" to your .driftignore file.`,
139
+ autoFixable: false,
140
+ });
141
+ }
142
+ }
143
+ return issues;
144
+ }
145
+ /**
146
+ * Check for large directories that might slow scans
147
+ */
148
+ async function checkLargeDirectories(rootDir) {
149
+ const issues = [];
150
+ // Check if node_modules is being scanned
151
+ const driftignorePath = path.join(rootDir, '.driftignore');
152
+ let driftignoreContent = '';
153
+ try {
154
+ driftignoreContent = await fs.readFile(driftignorePath, 'utf-8');
155
+ }
156
+ catch { /* */ }
157
+ const largeDirs = ['node_modules', '.git', 'vendor', '__pycache__', '.venv', 'target'];
158
+ for (const dir of largeDirs) {
159
+ try {
160
+ await fs.access(path.join(rootDir, dir));
161
+ if (!driftignoreContent.includes(dir)) {
162
+ issues.push({
163
+ id: `large-dir-${dir}`,
164
+ severity: 'warning',
165
+ title: `Large directory not ignored: ${dir}/`,
166
+ description: `The ${dir}/ directory is not in .driftignore and may significantly slow down scans.`,
167
+ fix: `Add "${dir}/" to your .driftignore file.`,
168
+ autoFixable: false,
169
+ });
170
+ }
171
+ }
172
+ catch { /* */ }
173
+ }
174
+ return issues;
175
+ }
176
+ /**
177
+ * Check for stale cache
178
+ */
179
+ async function checkCache(rootDir) {
180
+ const cacheDir = path.join(rootDir, DRIFT_DIR, 'cache');
181
+ try {
182
+ const files = await fs.readdir(cacheDir);
183
+ // Check for very old cache files
184
+ for (const file of files) {
185
+ const filePath = path.join(cacheDir, file);
186
+ const stats = await fs.stat(filePath);
187
+ const ageInDays = (Date.now() - stats.mtime.getTime()) / (1000 * 60 * 60 * 24);
188
+ if (ageInDays > 30) {
189
+ return {
190
+ id: 'stale-cache',
191
+ severity: 'info',
192
+ title: 'Stale cache detected',
193
+ description: `Cache files are over 30 days old. Consider clearing the cache for fresh analysis.`,
194
+ fix: 'Delete the .drift/cache/ directory and run `drift scan` again.',
195
+ autoFixable: true,
196
+ fixCommand: 'rm -rf .drift/cache && drift scan',
197
+ };
198
+ }
199
+ }
200
+ }
201
+ catch { /* */ }
202
+ return null;
203
+ }
204
+ /**
205
+ * Check Node.js version
206
+ */
207
+ function checkNodeVersion() {
208
+ const version = process.version;
209
+ const major = parseInt(version.slice(1).split('.')[0] ?? '0', 10);
210
+ if (major < 18) {
211
+ return {
212
+ id: 'old-node',
213
+ severity: 'error',
214
+ title: 'Node.js version too old',
215
+ description: `Drift requires Node.js 18 or higher. You have ${version}.`,
216
+ fix: 'Upgrade Node.js to version 18 or higher.',
217
+ autoFixable: false,
218
+ };
219
+ }
220
+ if (major >= 25) {
221
+ return {
222
+ id: 'new-node',
223
+ severity: 'warning',
224
+ title: 'Node.js version not officially supported',
225
+ description: `You're using Node.js ${version}. Drift is tested on Node.js 18-24.`,
226
+ fix: 'Consider using Node.js 18-24 if you encounter issues.',
227
+ autoFixable: false,
228
+ };
229
+ }
230
+ return null;
231
+ }
232
+ /**
233
+ * Check for common MCP issues
234
+ */
235
+ async function checkMcpSetup(rootDir) {
236
+ const issues = [];
237
+ // Check if MCP config exists in common locations
238
+ const mcpConfigPaths = [
239
+ path.join(rootDir, '.cursor', 'mcp.json'),
240
+ path.join(rootDir, '.kiro', 'settings', 'mcp.json'),
241
+ ];
242
+ for (const configPath of mcpConfigPaths) {
243
+ try {
244
+ await fs.access(configPath);
245
+ // Check if drift is configured
246
+ const content = await fs.readFile(configPath, 'utf-8');
247
+ const config = JSON.parse(content);
248
+ if (!config.mcpServers?.drift) {
249
+ issues.push({
250
+ id: 'mcp-drift-not-configured',
251
+ severity: 'info',
252
+ title: 'Drift not in MCP config',
253
+ description: `Found MCP config at ${path.relative(rootDir, configPath)} but Drift is not configured.`,
254
+ fix: 'Add Drift to your MCP configuration. See: drift wiki MCP-Setup',
255
+ autoFixable: false,
256
+ });
257
+ }
258
+ }
259
+ catch { /* */ }
260
+ }
261
+ return issues;
262
+ }
263
+ /**
264
+ * Run all diagnostics
265
+ */
266
+ async function runDiagnostics(rootDir) {
267
+ const issues = [];
268
+ const suggestions = [];
269
+ // System info
270
+ const systemInfo = {
271
+ nodeVersion: process.version,
272
+ platform: process.platform,
273
+ cwd: rootDir,
274
+ driftVersion: undefined,
275
+ };
276
+ // Try to get drift version
277
+ try {
278
+ const pkgPath = path.join(rootDir, 'node_modules', 'driftdetect', 'package.json');
279
+ const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));
280
+ systemInfo.driftVersion = pkg.version;
281
+ }
282
+ catch { /* */ }
283
+ // Run checks
284
+ const nodeIssue = checkNodeVersion();
285
+ if (nodeIssue)
286
+ issues.push(nodeIssue);
287
+ const initIssue = await checkInitialized(rootDir);
288
+ if (initIssue) {
289
+ issues.push(initIssue);
290
+ // If not initialized, skip other checks
291
+ return {
292
+ healthy: false,
293
+ issues,
294
+ suggestions: ['Run `drift init` to get started.'],
295
+ systemInfo,
296
+ };
297
+ }
298
+ const configIssue = await checkConfig(rootDir);
299
+ if (configIssue)
300
+ issues.push(configIssue);
301
+ const patternsIssue = await checkPatterns(rootDir);
302
+ if (patternsIssue)
303
+ issues.push(patternsIssue);
304
+ const driftignoreIssues = await checkDriftignore(rootDir);
305
+ issues.push(...driftignoreIssues);
306
+ const largeDirIssues = await checkLargeDirectories(rootDir);
307
+ issues.push(...largeDirIssues);
308
+ const cacheIssue = await checkCache(rootDir);
309
+ if (cacheIssue)
310
+ issues.push(cacheIssue);
311
+ const mcpIssues = await checkMcpSetup(rootDir);
312
+ issues.push(...mcpIssues);
313
+ // Generate suggestions
314
+ if (issues.length === 0) {
315
+ suggestions.push('Everything looks good! Run `drift next-steps` for recommendations.');
316
+ }
317
+ else {
318
+ const errorCount = issues.filter(i => i.severity === 'error').length;
319
+ const warningCount = issues.filter(i => i.severity === 'warning').length;
320
+ if (errorCount > 0) {
321
+ suggestions.push(`Fix ${errorCount} error(s) first before using Drift.`);
322
+ }
323
+ if (warningCount > 0) {
324
+ suggestions.push(`Address ${warningCount} warning(s) to improve performance.`);
325
+ }
326
+ }
327
+ return {
328
+ healthy: issues.filter(i => i.severity === 'error').length === 0,
329
+ issues,
330
+ suggestions,
331
+ systemInfo,
332
+ };
333
+ }
334
+ /**
335
+ * Troubleshoot command action
336
+ */
337
+ async function troubleshootAction(options) {
338
+ const rootDir = process.cwd();
339
+ const format = options.format ?? 'text';
340
+ const spinner = format === 'text' ? createSpinner('Running diagnostics...') : null;
341
+ spinner?.start();
342
+ const result = await runDiagnostics(rootDir);
343
+ spinner?.stop();
344
+ // JSON output
345
+ if (format === 'json') {
346
+ console.log(JSON.stringify(result, null, 2));
347
+ return;
348
+ }
349
+ // Text output
350
+ console.log();
351
+ console.log(chalk.bold('🔧 Drift - Troubleshoot'));
352
+ console.log(chalk.gray('═'.repeat(60)));
353
+ console.log();
354
+ // System info
355
+ console.log(chalk.bold('System Information'));
356
+ console.log(chalk.gray('─'.repeat(40)));
357
+ console.log(` Node.js: ${chalk.cyan(result.systemInfo.nodeVersion)}`);
358
+ console.log(` Platform: ${chalk.cyan(result.systemInfo.platform)}`);
359
+ console.log(` CWD: ${chalk.cyan(result.systemInfo.cwd)}`);
360
+ if (result.systemInfo.driftVersion) {
361
+ console.log(` Drift: ${chalk.cyan(result.systemInfo.driftVersion)}`);
362
+ }
363
+ console.log();
364
+ // Health status
365
+ const healthIcon = result.healthy ? chalk.green('✓') : chalk.red('✗');
366
+ const healthText = result.healthy ? chalk.green('Healthy') : chalk.red('Issues Found');
367
+ console.log(chalk.bold('Health Status'));
368
+ console.log(chalk.gray('─'.repeat(40)));
369
+ console.log(` ${healthIcon} ${healthText}`);
370
+ console.log();
371
+ // Issues
372
+ if (result.issues.length > 0) {
373
+ console.log(chalk.bold('Issues'));
374
+ console.log(chalk.gray('─'.repeat(40)));
375
+ console.log();
376
+ const errors = result.issues.filter(i => i.severity === 'error');
377
+ const warnings = result.issues.filter(i => i.severity === 'warning');
378
+ const infos = result.issues.filter(i => i.severity === 'info');
379
+ if (errors.length > 0) {
380
+ console.log(chalk.red.bold(' 🔴 Errors'));
381
+ for (const issue of errors) {
382
+ console.log();
383
+ console.log(` ${chalk.red(issue.title)}`);
384
+ console.log(chalk.gray(` ${issue.description}`));
385
+ if (issue.fix) {
386
+ console.log(chalk.cyan(` Fix: ${issue.fix}`));
387
+ }
388
+ if (issue.fixCommand && options.verbose) {
389
+ console.log(chalk.gray(` Command: ${issue.fixCommand}`));
390
+ }
391
+ }
392
+ console.log();
393
+ }
394
+ if (warnings.length > 0) {
395
+ console.log(chalk.yellow.bold(' 🟡 Warnings'));
396
+ for (const issue of warnings) {
397
+ console.log();
398
+ console.log(` ${chalk.yellow(issue.title)}`);
399
+ console.log(chalk.gray(` ${issue.description}`));
400
+ if (issue.fix) {
401
+ console.log(chalk.cyan(` Fix: ${issue.fix}`));
402
+ }
403
+ }
404
+ console.log();
405
+ }
406
+ if (infos.length > 0 && options.verbose) {
407
+ console.log(chalk.blue.bold(' 🔵 Info'));
408
+ for (const issue of infos) {
409
+ console.log();
410
+ console.log(` ${chalk.blue(issue.title)}`);
411
+ console.log(chalk.gray(` ${issue.description}`));
412
+ if (issue.fix) {
413
+ console.log(chalk.cyan(` Fix: ${issue.fix}`));
414
+ }
415
+ }
416
+ console.log();
417
+ }
418
+ }
419
+ else {
420
+ console.log(chalk.green(' ✓ No issues found!'));
421
+ console.log();
422
+ }
423
+ // Suggestions
424
+ if (result.suggestions.length > 0) {
425
+ console.log(chalk.bold('Suggestions'));
426
+ console.log(chalk.gray('─'.repeat(40)));
427
+ for (const suggestion of result.suggestions) {
428
+ console.log(` → ${suggestion}`);
429
+ }
430
+ console.log();
431
+ }
432
+ // Quick links
433
+ console.log(chalk.gray('─'.repeat(60)));
434
+ console.log(chalk.gray('Need more help?'));
435
+ console.log(chalk.gray(' • Wiki: https://github.com/dadbodgeoff/drift/wiki'));
436
+ console.log(chalk.gray(' • FAQ: https://github.com/dadbodgeoff/drift/wiki/FAQ'));
437
+ console.log(chalk.gray(' • Issues: https://github.com/dadbodgeoff/drift/issues'));
438
+ console.log();
439
+ }
440
+ export const troubleshootCommand = new Command('troubleshoot')
441
+ .description('Diagnose common issues and get targeted fixes')
442
+ .option('-f, --format <format>', 'Output format (text, json)', 'text')
443
+ .option('-v, --verbose', 'Show all issues including info-level')
444
+ .option('--fix', 'Attempt to auto-fix issues where possible')
445
+ .action(troubleshootAction);
446
+ //# sourceMappingURL=troubleshoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"troubleshoot.js","sourceRoot":"","sources":["../../src/commands/troubleshoot.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "driftdetect",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "description": "Codebase pattern detection for AI agents - scans your code, learns conventions, feeds context to Claude/Cursor/Copilot via MCP. Static analysis for TypeScript, Python, C#, Java, PHP.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Geoffrey Fernald",
@@ -56,7 +56,7 @@
56
56
  "cli-table3": "^0.6.5",
57
57
  "commander": "^12.1.0",
58
58
  "driftdetect-core": "^0.8.2",
59
- "driftdetect-dashboard": "^0.8.1",
59
+ "driftdetect-dashboard": "^0.8.2",
60
60
  "driftdetect-detectors": "^0.8.2",
61
61
  "ora": "^8.1.0",
62
62
  "piscina": "^5.1.4"