@boshu2/vibe-check 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.agents/plans/2025-12-29-complexity-driver-plan.md +225 -0
  2. package/.agents/plans/2025-12-29-complexity-drivers-plan.md +253 -0
  3. package/.agents/research/2025-12-29-complexity-driver-architecture.md +392 -0
  4. package/.agents/research/2025-12-29-complexity-drivers.md +227 -0
  5. package/.beads/issues.jsonl +12 -0
  6. package/CHANGELOG.md +27 -0
  7. package/README.md +71 -0
  8. package/dist/analyzers/complexity.d.ts +92 -0
  9. package/dist/analyzers/complexity.d.ts.map +1 -0
  10. package/dist/analyzers/complexity.js +79 -0
  11. package/dist/analyzers/complexity.js.map +1 -0
  12. package/dist/analyzers/modularity.d.ts +3 -1
  13. package/dist/analyzers/modularity.d.ts.map +1 -1
  14. package/dist/analyzers/modularity.js +32 -6
  15. package/dist/analyzers/modularity.js.map +1 -1
  16. package/dist/cli.js +2 -1
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/driver.d.ts +18 -0
  19. package/dist/commands/driver.d.ts.map +1 -0
  20. package/dist/commands/driver.js +58 -0
  21. package/dist/commands/driver.js.map +1 -0
  22. package/dist/commands/index.d.ts +1 -0
  23. package/dist/commands/index.d.ts.map +1 -1
  24. package/dist/commands/index.js +1 -0
  25. package/dist/commands/index.js.map +1 -1
  26. package/dist/commands/modularity.d.ts +2 -0
  27. package/dist/commands/modularity.d.ts.map +1 -1
  28. package/dist/commands/modularity.js +86 -7
  29. package/dist/commands/modularity.js.map +1 -1
  30. package/drivers/README.md +327 -0
  31. package/drivers/go.sh +131 -0
  32. package/drivers/java.sh +137 -0
  33. package/drivers/javascript.sh +134 -0
  34. package/drivers/php.sh +132 -0
  35. package/drivers/python.sh +90 -0
  36. package/drivers/rust.sh +132 -0
  37. package/package.json +1 -1
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Driver Command
3
+ *
4
+ * Run complexity drivers directly, outputting JSON to stdout.
5
+ * This is useful for generating complexity data without running modularity analysis.
6
+ *
7
+ * Usage:
8
+ * vibe-check driver python ./src > complexity.json
9
+ * vibe-check driver javascript ./src > complexity.json
10
+ */
11
+ import { Command } from 'commander';
12
+ import chalk from 'chalk';
13
+ import * as path from 'path';
14
+ import * as fs from 'fs';
15
+ import { execFile } from 'child_process';
16
+ import { promisify } from 'util';
17
+ import { fileURLToPath } from 'url';
18
+ const execFileAsync = promisify(execFile);
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = path.dirname(__filename);
21
+ export function createDriverCommand() {
22
+ const cmd = new Command('driver')
23
+ .description('Run complexity driver and output JSON')
24
+ .argument('<language>', 'Driver language (e.g., python, javascript)')
25
+ .argument('[directory]', 'Directory to analyze (default: current directory)', '.')
26
+ .action(async (language, directory) => {
27
+ await runDriver({ language, directory });
28
+ });
29
+ return cmd;
30
+ }
31
+ export async function runDriver(options) {
32
+ const targetDir = path.resolve(options.directory);
33
+ const driverScript = path.join(__dirname, '..', '..', 'drivers', `${options.language}.sh`);
34
+ if (!fs.existsSync(driverScript)) {
35
+ console.error(chalk.red(`Driver not found: ${options.language}.sh`));
36
+ console.error(chalk.gray('Available drivers: python, javascript, go, rust, php, java'));
37
+ process.exit(1);
38
+ }
39
+ if (!fs.existsSync(targetDir)) {
40
+ console.error(chalk.red(`Directory not found: ${targetDir}`));
41
+ process.exit(1);
42
+ }
43
+ try {
44
+ // Use execFile (secure, no shell injection)
45
+ const { stdout } = await execFileAsync(driverScript, [targetDir], {
46
+ maxBuffer: 10 * 1024 * 1024, // 10MB buffer
47
+ });
48
+ // Output JSON to stdout (user can pipe to file)
49
+ console.log(stdout);
50
+ }
51
+ catch (error) {
52
+ if (error instanceof Error) {
53
+ console.error(chalk.red(`Driver failed: ${error.message}`));
54
+ }
55
+ process.exit(1);
56
+ }
57
+ }
58
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/commands/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAO3C,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC9B,WAAW,CAAC,uCAAuC,CAAC;SACpD,QAAQ,CAAC,YAAY,EAAE,4CAA4C,CAAC;SACpE,QAAQ,CAAC,aAAa,EAAE,mDAAmD,EAAE,GAAG,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,SAAiB,EAAE,EAAE;QACpD,MAAM,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA6B;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC;IAE3F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,4CAA4C;QAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE;YAChE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,cAAc;SAC5C,CAAC,CAAC;QAEH,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -13,4 +13,5 @@ export { createSessionsCommand, runSessions, SessionsOptions } from './sessions.
13
13
  export { createForensicsCommand, runForensics, ForensicsOptions, ForensicsResult } from './forensics.js';
14
14
  export { createAuditCommand } from './audit.js';
15
15
  export { createModularityCommand, runModularity, ModularityCommandOptions } from './modularity.js';
16
+ export { createDriverCommand, runDriver, DriverCommandOptions } from './driver.js';
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -13,4 +13,5 @@ export { createSessionsCommand, runSessions } from './sessions.js';
13
13
  export { createForensicsCommand, runForensics } from './forensics.js';
14
14
  export { createAuditCommand } from './audit.js';
15
15
  export { createModularityCommand, runModularity } from './modularity.js';
16
+ export { createDriverCommand, runDriver } from './driver.js';
16
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAkB,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAmB,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAwB,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAmB,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAqC,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAA4B,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAkB,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAmB,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAwB,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAmB,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAqC,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAA4B,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAwB,MAAM,aAAa,CAAC"}
@@ -21,6 +21,8 @@ export interface ModularityCommandOptions {
21
21
  minLines: number;
22
22
  pattern?: string;
23
23
  top: number;
24
+ withComplexity?: string;
25
+ complexityFile?: string;
24
26
  }
25
27
  export declare function createModularityCommand(): Command;
26
28
  export declare function runModularity(options: ModularityCommandOptions): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"modularity.d.ts","sourceRoot":"","sources":["../../src/commands/modularity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAejD;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BpF"}
1
+ {"version":3,"file":"modularity.d.ts","sourceRoot":"","sources":["../../src/commands/modularity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAiBjD;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CpF"}
@@ -15,7 +15,15 @@
15
15
  import { Command } from 'commander';
16
16
  import chalk from 'chalk';
17
17
  import * as path from 'path';
18
+ import * as fs from 'fs';
19
+ import { execFile } from 'child_process';
20
+ import { promisify } from 'util';
21
+ import { fileURLToPath } from 'url';
18
22
  import { analyzeModularity, } from '../analyzers/modularity.js';
23
+ import { loadComplexityData } from '../analyzers/complexity.js';
24
+ const execFileAsync = promisify(execFile);
25
+ const __filename = fileURLToPath(import.meta.url);
26
+ const __dirname = path.dirname(__filename);
19
27
  export function createModularityCommand() {
20
28
  const cmd = new Command('modularity')
21
29
  .description('Analyze code modularity with pattern-aware scoring')
@@ -26,6 +34,8 @@ export function createModularityCommand() {
26
34
  .option('-m, --min-lines <n>', 'Minimum lines to analyze', '100')
27
35
  .option('-p, --pattern <type>', 'Filter by pattern: controller, store, routes, types, etc.')
28
36
  .option('-t, --top <n>', 'Show top N files (default: 10)', '10')
37
+ .option('--with-complexity <lang>', 'Run complexity driver before analysis (e.g., python, javascript)')
38
+ .option('--complexity-file <path>', 'Use existing complexity.json file')
29
39
  .action(async (options) => {
30
40
  await runModularity(options);
31
41
  });
@@ -35,19 +45,35 @@ export async function runModularity(options) {
35
45
  const rootDir = path.resolve(options.repo);
36
46
  const minLines = parseInt(options.minLines, 10) || 100;
37
47
  const top = parseInt(options.top, 10) || 10;
38
- const analysisOptions = {
39
- minLines,
40
- includeAll: options.all,
41
- patterns: options.pattern ? [options.pattern] : undefined,
42
- };
43
48
  try {
49
+ // Load or generate complexity data if requested
50
+ let complexityData;
51
+ if (options.withComplexity) {
52
+ // Run driver and save to .vibe-check/complexity.json
53
+ complexityData = await runComplexityDriver(rootDir, options.withComplexity);
54
+ }
55
+ else if (options.complexityFile) {
56
+ // Load from specified file
57
+ const complexityPath = path.resolve(options.complexityFile);
58
+ complexityData = loadComplexityFromFile(complexityPath);
59
+ }
60
+ else {
61
+ // Try loading from default location
62
+ complexityData = loadComplexityData(rootDir) || undefined;
63
+ }
64
+ const analysisOptions = {
65
+ minLines,
66
+ includeAll: options.all,
67
+ patterns: options.pattern ? [options.pattern] : undefined,
68
+ complexityData,
69
+ };
44
70
  const result = analyzeModularity(rootDir, analysisOptions);
45
71
  if (options.format === 'json') {
46
72
  console.log(JSON.stringify(result, null, 2));
47
73
  return;
48
74
  }
49
75
  // Terminal output
50
- printTerminalOutput(result, rootDir, options.verbose, top);
76
+ printTerminalOutput(result, rootDir, options.verbose, top, complexityData !== undefined);
51
77
  }
52
78
  catch (error) {
53
79
  if (error instanceof Error) {
@@ -56,7 +82,54 @@ export async function runModularity(options) {
56
82
  process.exit(1);
57
83
  }
58
84
  }
59
- function printTerminalOutput(result, rootDir, verbose, top) {
85
+ /**
86
+ * Run complexity driver and save output to .vibe-check/complexity.json
87
+ */
88
+ async function runComplexityDriver(rootDir, language) {
89
+ const driverScript = path.join(__dirname, '..', '..', 'drivers', `${language}.sh`);
90
+ if (!fs.existsSync(driverScript)) {
91
+ throw new Error(`Driver not found: ${language}.sh\nAvailable drivers: python, javascript, go, rust, php, java`);
92
+ }
93
+ console.error(chalk.gray(`Running ${language} complexity driver...`));
94
+ try {
95
+ // Use execFile (secure, no shell injection) instead of exec
96
+ const { stdout } = await execFileAsync(driverScript, [rootDir], {
97
+ maxBuffer: 10 * 1024 * 1024, // 10MB buffer
98
+ });
99
+ const data = JSON.parse(stdout);
100
+ // Save to .vibe-check/complexity.json
101
+ const vibeCheckDir = path.join(rootDir, '.vibe-check');
102
+ if (!fs.existsSync(vibeCheckDir)) {
103
+ fs.mkdirSync(vibeCheckDir, { recursive: true });
104
+ }
105
+ const complexityFile = path.join(vibeCheckDir, 'complexity.json');
106
+ fs.writeFileSync(complexityFile, JSON.stringify(data, null, 2));
107
+ console.error(chalk.gray(`Saved complexity data to ${path.relative(rootDir, complexityFile)}`));
108
+ return data;
109
+ }
110
+ catch (error) {
111
+ if (error instanceof Error) {
112
+ throw new Error(`Complexity driver failed: ${error.message}`);
113
+ }
114
+ throw error;
115
+ }
116
+ }
117
+ /**
118
+ * Load complexity data from a specific file path
119
+ */
120
+ function loadComplexityFromFile(filePath) {
121
+ if (!fs.existsSync(filePath)) {
122
+ throw new Error(`Complexity file not found: ${filePath}`);
123
+ }
124
+ try {
125
+ const content = fs.readFileSync(filePath, 'utf-8');
126
+ return JSON.parse(content);
127
+ }
128
+ catch (error) {
129
+ throw new Error(`Failed to parse complexity file: ${filePath}`);
130
+ }
131
+ }
132
+ function printTerminalOutput(result, rootDir, verbose, top, hasComplexityData) {
60
133
  console.log('');
61
134
  console.log(chalk.bold.cyan('📐 Modularity Analysis'));
62
135
  console.log(chalk.gray('─'.repeat(60)));
@@ -66,6 +139,9 @@ function printTerminalOutput(result, rootDir, verbose, top) {
66
139
  console.log(`Analyzed ${chalk.white(summary.totalFiles)} files ` +
67
140
  `(${chalk.white(summary.totalLines.toLocaleString())} lines)`);
68
141
  console.log(`Average modularity score: ${formatScore(summary.avgScore)}`);
142
+ if (hasComplexityData) {
143
+ console.log(chalk.green('✓ Complexity data integrated'));
144
+ }
69
145
  console.log('');
70
146
  // Distribution
71
147
  console.log(chalk.bold('Score Distribution:'));
@@ -144,6 +220,9 @@ function formatFlag(flag) {
144
220
  'missing-tests': '⚠ missing tests',
145
221
  'god-class': '⚠ god class',
146
222
  'utility-grab-bag': '⚠ utility grab-bag',
223
+ 'moderate-complexity': '⚠ moderate complexity (C)',
224
+ 'high-complexity': '⚠ high complexity (D/E)',
225
+ 'extreme-complexity': '⚠ extreme complexity (F)',
147
226
  };
148
227
  return labels[flag] || flag;
149
228
  }
@@ -1 +1 @@
1
- {"version":3,"file":"modularity.js","sourceRoot":"","sources":["../../src/commands/modularity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"modularity.js","sourceRoot":"","sources":["../../src/commands/modularity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,327 @@
1
+ # Complexity Drivers
2
+
3
+ Drivers wrap language-specific complexity tools to produce standard JSON output conforming to vibe-check's `ComplexityReport` schema.
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ vibe-check (kernel) ← reads .vibe-check/complexity.json
9
+
10
+ │ Standard JSON schema
11
+
12
+ Drivers (python.sh, javascript.sh, etc.)
13
+
14
+ │ Tool-specific format
15
+
16
+ Language tools (radon, complexity-report, gocyclo, etc.)
17
+ ```
18
+
19
+ ## Standard Schema
20
+
21
+ All drivers must output JSON matching this schema:
22
+
23
+ ```typescript
24
+ {
25
+ tool: string; // "radon", "complexity-report", etc.
26
+ language: string; // "python", "javascript", etc.
27
+ generatedAt: string; // ISO timestamp
28
+ files: {
29
+ [filepath: string]: {
30
+ functions: Array<{
31
+ name: string;
32
+ complexity: number;
33
+ grade: 'A' | 'B' | 'C' | 'D' | 'E' | 'F';
34
+ line: number;
35
+ endLine?: number;
36
+ }>;
37
+ avgComplexity: number;
38
+ maxComplexity: number;
39
+ grade: 'A' | 'B' | 'C' | 'D' | 'E' | 'F';
40
+ };
41
+ };
42
+ summary: {
43
+ totalFiles: number;
44
+ totalFunctions: number;
45
+ avgComplexity: number;
46
+ gradeDistribution: Record<'A'|'B'|'C'|'D'|'E'|'F', number>;
47
+ };
48
+ }
49
+ ```
50
+
51
+ ## Grade Thresholds
52
+
53
+ All drivers normalize complexity scores to these grades:
54
+
55
+ | Grade | Complexity | Meaning |
56
+ |-------|------------|---------|
57
+ | A | 1-5 | Simple, low risk |
58
+ | B | 6-10 | Slightly complex, acceptable |
59
+ | C | 11-20 | Complex, consider refactoring |
60
+ | D | 21-30 | Very complex, refactor |
61
+ | E | 31-40 | Extremely complex, high risk |
62
+ | F | 41+ | Unmaintainable, must refactor |
63
+
64
+ ## Available Drivers
65
+
66
+ ### Python (`python.sh`)
67
+
68
+ Wraps [radon](https://radon.readthedocs.io/) for Python cyclomatic complexity.
69
+
70
+ **Requirements:**
71
+ ```bash
72
+ pip install radon
73
+ ```
74
+
75
+ **Usage:**
76
+ ```bash
77
+ ./drivers/python.sh ./src
78
+ ./drivers/python.sh ./src > .vibe-check/complexity.json
79
+ ```
80
+
81
+ **Example Output:**
82
+ ```json
83
+ {
84
+ "tool": "radon",
85
+ "language": "python",
86
+ "files": {
87
+ "src/main.py": {
88
+ "functions": [
89
+ {"name": "process", "complexity": 7, "grade": "B", "line": 10, "endLine": 25}
90
+ ],
91
+ "avgComplexity": 7,
92
+ "maxComplexity": 7,
93
+ "grade": "B"
94
+ }
95
+ }
96
+ }
97
+ ```
98
+
99
+ ### JavaScript/TypeScript (`javascript.sh`)
100
+
101
+ Wraps [cyclomatic-complexity](https://github.com/pilotpirxie/cyclomatic-complexity) for JavaScript and TypeScript.
102
+
103
+ **Requirements:**
104
+ ```bash
105
+ # npx automatically installs on first run
106
+ # No manual installation needed
107
+ ```
108
+
109
+ **Usage:**
110
+ ```bash
111
+ ./drivers/javascript.sh ./src
112
+ ./drivers/javascript.sh ./src > .vibe-check/complexity.json
113
+ ```
114
+
115
+ **Example Output:**
116
+ ```json
117
+ {
118
+ "tool": "cyclomatic-complexity",
119
+ "language": "javascript",
120
+ "files": {
121
+ "src/app.ts": {
122
+ "functions": [
123
+ {"name": "handleRequest", "complexity": 12, "grade": "C", "line": 15, "endLine": null}
124
+ ],
125
+ "avgComplexity": 12,
126
+ "maxComplexity": 12,
127
+ "grade": "C"
128
+ }
129
+ }
130
+ }
131
+ ```
132
+
133
+ ### Go (`go.sh`)
134
+
135
+ Wraps [gocyclo](https://github.com/fzipp/gocyclo) for Go cyclomatic complexity.
136
+
137
+ **Requirements:**
138
+ ```bash
139
+ go install github.com/fzipp/gocyclo/cmd/gocyclo@latest
140
+ ```
141
+
142
+ **Usage:**
143
+ ```bash
144
+ ./drivers/go.sh ./src
145
+ ./drivers/go.sh ./cmd > .vibe-check/complexity.json
146
+ ```
147
+
148
+ **Example Output:**
149
+ ```json
150
+ {
151
+ "tool": "gocyclo",
152
+ "language": "go",
153
+ "files": {
154
+ "cmd/main.go": {
155
+ "functions": [
156
+ {"name": "handleRequest", "complexity": 8, "grade": "B", "line": 25, "endLine": null}
157
+ ],
158
+ "avgComplexity": 8,
159
+ "maxComplexity": 8,
160
+ "grade": "B"
161
+ }
162
+ }
163
+ }
164
+ ```
165
+
166
+ ### Rust (`rust.sh`)
167
+
168
+ Wraps [rust-code-analysis](https://mozilla.github.io/rust-code-analysis/) for Rust cyclomatic complexity.
169
+
170
+ **Requirements:**
171
+ ```bash
172
+ cargo install rust-code-analysis-cli
173
+ ```
174
+
175
+ **Usage:**
176
+ ```bash
177
+ ./drivers/rust.sh ./src
178
+ ./drivers/rust.sh ./src > .vibe-check/complexity.json
179
+ ```
180
+
181
+ **Example Output:**
182
+ ```json
183
+ {
184
+ "tool": "rust-code-analysis",
185
+ "language": "rust",
186
+ "files": {
187
+ "src/main.rs": {
188
+ "functions": [
189
+ {"name": "process_data", "complexity": 6, "grade": "B", "line": 12, "endLine": 45}
190
+ ],
191
+ "avgComplexity": 6,
192
+ "maxComplexity": 6,
193
+ "grade": "B"
194
+ }
195
+ }
196
+ }
197
+ ```
198
+
199
+ ### PHP (`php.sh`)
200
+
201
+ Wraps [PHPMD](https://phpmd.org/) (PHP Mess Detector) for PHP cyclomatic complexity.
202
+
203
+ **Requirements:**
204
+ ```bash
205
+ composer global require phpmd/phpmd
206
+ ```
207
+
208
+ **Usage:**
209
+ ```bash
210
+ ./drivers/php.sh ./src
211
+ ./drivers/php.sh ./src > .vibe-check/complexity.json
212
+ ```
213
+
214
+ **Example Output:**
215
+ ```json
216
+ {
217
+ "tool": "phpmd",
218
+ "language": "php",
219
+ "files": {
220
+ "src/Controller.php": {
221
+ "functions": [
222
+ {"name": "handleRequest", "complexity": 15, "grade": "C", "line": 23, "endLine": 67}
223
+ ],
224
+ "avgComplexity": 15,
225
+ "maxComplexity": 15,
226
+ "grade": "C"
227
+ }
228
+ }
229
+ }
230
+ ```
231
+
232
+ ### Java (`java.sh`)
233
+
234
+ Wraps [PMD](https://pmd.github.io/) for Java cyclomatic complexity.
235
+
236
+ **Requirements:**
237
+ ```bash
238
+ # Download PMD from https://pmd.github.io/
239
+ # Requires JRE (Java Runtime Environment)
240
+ ```
241
+
242
+ **Usage:**
243
+ ```bash
244
+ ./drivers/java.sh ./src
245
+ ./drivers/java.sh ./src > .vibe-check/complexity.json
246
+ ```
247
+
248
+ **Example Output:**
249
+ ```json
250
+ {
251
+ "tool": "pmd",
252
+ "language": "java",
253
+ "files": {
254
+ "src/main/java/Service.java": {
255
+ "functions": [
256
+ {"name": "processRequest", "complexity": 18, "grade": "C", "line": 42, "endLine": 89}
257
+ ],
258
+ "avgComplexity": 18,
259
+ "maxComplexity": 18,
260
+ "grade": "C"
261
+ }
262
+ }
263
+ }
264
+ ```
265
+
266
+ ## Driver Contract
267
+
268
+ Each driver script must:
269
+
270
+ 1. **Accept directory path** as first argument (default: current directory)
271
+ 2. **Check tool availability** and exit 1 with JSON error if missing
272
+ 3. **Output valid JSON** to stdout conforming to schema
273
+ 4. **Exit 0 on success**, non-zero on failure
274
+ 5. **Handle empty directories** gracefully (empty `files` object)
275
+
276
+ ## Error Format
277
+
278
+ On error, write JSON to stderr and exit non-zero:
279
+
280
+ ```json
281
+ {"error": "radon not installed. Run: pip install radon"}
282
+ ```
283
+
284
+ ## Writing a New Driver
285
+
286
+ Example template:
287
+
288
+ ```bash
289
+ #!/bin/bash
290
+ set -euo pipefail
291
+
292
+ TARGET_DIR="${1:-.}"
293
+
294
+ # Check tool is installed
295
+ if ! command -v your-tool &> /dev/null; then
296
+ echo '{"error": "your-tool not installed"}' >&2
297
+ exit 1
298
+ fi
299
+
300
+ # Run tool and transform to standard schema
301
+ your-tool "$TARGET_DIR" --json | jq '{
302
+ tool: "your-tool",
303
+ language: "your-language",
304
+ generatedAt: (now | todate),
305
+ files: ...,
306
+ summary: ...
307
+ }'
308
+ ```
309
+
310
+ See `python.sh` for a complete example with jq transformation.
311
+
312
+ ## Integration with vibe-check
313
+
314
+ Drivers are used via CLI:
315
+
316
+ ```bash
317
+ # Run driver before analysis
318
+ vibe-check --with-complexity python
319
+
320
+ # Use existing complexity data
321
+ vibe-check --complexity-file .vibe-check/complexity.json
322
+
323
+ # Driver-only mode (outputs to stdout)
324
+ vibe-check driver python ./src > complexity.json
325
+ ```
326
+
327
+ See main README for usage details.