Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import chalk from 'chalk';
import { existsSync, readFileSync } from 'fs';
import { join } from 'path';
import prompts from 'prompts';
/**
* Interactive setup: detect common frameworks and suggest excludes & focus areas
*/
export async function runInteractiveSetup(
directory: string,
current: any
): Promise<any> {
console.log(chalk.yellow("🧠Interactive mode: let's tailor the analysis."));
const pkgPath = join(directory, 'package.json');
let deps: Record<string, string> = {};
if (existsSync(pkgPath)) {
try {
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
deps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
} catch (e) {
void e;
// Ignore parse errors, use empty deps
}
}
const hasNextJs = existsSync(join(directory, '.next')) || !!deps['next'];
const hasCDK =
existsSync(join(directory, 'cdk.out')) ||
!!deps['aws-cdk-lib'] ||
Object.keys(deps).some((d) => d.startsWith('@aws-cdk/'));
const recommendedExcludes = new Set<string>(current.exclude || []);
if (
hasNextJs &&
!Array.from(recommendedExcludes).some((p) => p.includes('.next'))
) {
recommendedExcludes.add('**/.next/**');
}
if (
hasCDK &&
!Array.from(recommendedExcludes).some((p) => p.includes('cdk.out'))
) {
recommendedExcludes.add('**/cdk.out/**');
}
const { applyExcludes } = await prompts({
type: 'toggle',
name: 'applyExcludes',
message: `Detected ${hasNextJs ? 'Next.js ' : ''}${hasCDK ? 'AWS CDK ' : ''}frameworks. Apply recommended excludes?`,
initial: true,
active: 'yes',
inactive: 'no',
});
const nextOptions = { ...current };
if (applyExcludes) {
nextOptions.exclude = Array.from(recommendedExcludes);
}
const { focusArea } = await prompts({
type: 'select',
name: 'focusArea',
message: 'Which areas to focus?',
choices: [
{ title: 'Frontend (web app)', value: 'frontend' },
{ title: 'Backend (API/infra)', value: 'backend' },
{ title: 'Both', value: 'both' },
],
initial: 2,
});
if (focusArea === 'frontend') {
nextOptions.include = ['**/*.{ts,tsx,js,jsx}'];
nextOptions.exclude = Array.from(
new Set([
...(nextOptions.exclude || []),
'**/cdk.out/**',
'**/infra/**',
'**/server/**',
'**/backend/**',
])
);
} else if (focusArea === 'backend') {
nextOptions.include = [
'**/api/**',
'**/server/**',
'**/backend/**',
'**/infra/**',
'**/*.{ts,js,py,java}',
];
}
console.log(chalk.green('✓ Interactive configuration applied.'));
return nextOptions;
}
|