ft-scout 3.0.6 → 3.0.7

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.
@@ -1,306 +0,0 @@
1
- import chalk from 'chalk';
2
- import fs from 'fs';
3
- import path from 'path';
4
- import { spinner, text, select, isCancel } from '@clack/prompts';
5
- import { simpleGit } from 'simple-git';
6
- import { loadScanReport } from './scan.js';
7
- import { safeNote, renderMarkdown } from '../utils/markdown.js';
8
- import { recordHistoryAction, loadContext, getDirectoryFiles } from '../utils/config.js';
9
- import { generateMultiCodeFix, identifyTargetFiles } from '../engine/llm.js';
10
- import { createPullRequest } from '../engine/git.js';
11
- import { handleUndo } from './undo.js';
12
- import { normalizeLanguage } from '../utils/language.js';
13
- export function findTargetFilesFromPrompt(userPrompt, specifiedFile, filesList) {
14
- const norm = (p) => p.replace(/\\/g, '/').toLowerCase().trim();
15
- if (specifiedFile && specifiedFile.trim()) {
16
- const raw = specifiedFile.trim();
17
- const splitItems = raw.split(',').map((s) => s.trim()).filter(Boolean);
18
- const matchedFromFlag = [];
19
- for (const item of splitItems) {
20
- const normItem = norm(item);
21
- // Explicit extension-only pattern (e.g. *.ts, .ts, *.html, .html, or extension keyword like 'html' when no file matches)
22
- const isExplicitExtPattern = item.startsWith('*') ||
23
- item.startsWith('.') ||
24
- (item.length <= 10 && !item.includes('/') && !item.includes('\\') && !filesList.some((f) => norm(f) === normItem || path.basename(norm(f)) === normItem));
25
- if (isExplicitExtPattern) {
26
- const cleanExt = normItem.replace(/^(\*|\.)+/, '');
27
- if (cleanExt) {
28
- const extFiles = filesList.filter((f) => norm(f).endsWith(`.${cleanExt}`));
29
- matchedFromFlag.push(...extFiles);
30
- }
31
- continue;
32
- }
33
- // Exact relative path match
34
- const exact = filesList.find((f) => norm(f) === normItem);
35
- if (exact) {
36
- matchedFromFlag.push(exact);
37
- continue;
38
- }
39
- // Path suffix match (e.g. 'engine/llm.ts' matching 'bin/src/engine/llm.ts')
40
- const suffixMatches = filesList.filter((f) => norm(f).endsWith('/' + normItem));
41
- if (suffixMatches.length > 0) {
42
- matchedFromFlag.push(...suffixMatches);
43
- continue;
44
- }
45
- // Basename match (e.g. 'llm.ts' matching 'bin/src/engine/llm.ts')
46
- const baseMatches = filesList.filter((f) => path.basename(norm(f)) === path.basename(normItem));
47
- if (baseMatches.length > 0) {
48
- matchedFromFlag.push(...baseMatches);
49
- continue;
50
- }
51
- // Specified file is a specific filepath that doesn't exist in filesList yet
52
- matchedFromFlag.push(item);
53
- }
54
- if (matchedFromFlag.length > 0) {
55
- return Array.from(new Set(matchedFromFlag));
56
- }
57
- }
58
- const rawWords = userPrompt.split(/\s+/).map((w) => w.replace(/["'(),;:!]/g, '').trim());
59
- const cleanPromptWords = rawWords.map((w) => w.toLowerCase());
60
- const lowerPrompt = userPrompt.toLowerCase();
61
- // 1. Direct filename / path match in prompt (Takes precedence over extension matching)
62
- const matchedByName = [];
63
- // Direct disk existence check for any file path mentioned in user prompt
64
- for (const word of rawWords) {
65
- if (word && word.includes('.')) {
66
- const fullP = path.resolve(process.cwd(), word);
67
- if (fs.existsSync(fullP) && fs.statSync(fullP).isFile()) {
68
- const relP = path.relative(process.cwd(), fullP).replace(/\\/g, '/');
69
- matchedByName.push(relP);
70
- }
71
- }
72
- }
73
- for (const f of filesList) {
74
- const normF = norm(f);
75
- const base = path.basename(normF);
76
- if (lowerPrompt.includes(normF) ||
77
- cleanPromptWords.includes(normF) ||
78
- (base.includes('.') && (lowerPrompt.includes(base) || cleanPromptWords.includes(base)))) {
79
- matchedByName.push(f);
80
- }
81
- }
82
- if (matchedByName.length > 0) {
83
- return Array.from(new Set(matchedByName));
84
- }
85
- // 2. Extension matching if prompt requests bulk/extension operation (e.g. ".html files", "html files", "*.ts", "in all .css files", "from .html files")
86
- const bulkExtMatch = lowerPrompt.match(/(?:all|\*|in|from|for|across|every)?\s*(?:\*|\.)?([a-zA-Z0-9]{1,10})\s+files?\b|\*\.([a-zA-Z0-9]{1,10})/i);
87
- if (bulkExtMatch) {
88
- const ext = (bulkExtMatch[1] || bulkExtMatch[2])?.toLowerCase();
89
- if (ext) {
90
- const extFiles = filesList.filter((f) => norm(f).endsWith(`.${ext}`));
91
- if (extFiles.length > 0) {
92
- return Array.from(new Set(extFiles));
93
- }
94
- }
95
- }
96
- return [];
97
- }
98
- export async function handleFix(options) {
99
- const existingContext = loadContext();
100
- const targetLang = normalizeLanguage(options?.lang) || normalizeLanguage(existingContext?.language);
101
- const cwd = process.cwd();
102
- const filesList = getDirectoryFiles(cwd);
103
- const projectName = existingContext?.projectName || path.basename(cwd) || 'Codebase';
104
- let finalPrompt = options?.prompt;
105
- let specifiedTargetFile = options?.file;
106
- if (!finalPrompt && options?.issue) {
107
- const report = loadScanReport();
108
- const issueId = Number(options.issue);
109
- const targetIssue = report.find((i) => i.id === issueId) || report[0];
110
- if (targetIssue) {
111
- finalPrompt = `Fix issue #${targetIssue.id}: ${targetIssue.title} — ${targetIssue.description}`;
112
- specifiedTargetFile = targetIssue.file;
113
- }
114
- }
115
- if (!finalPrompt || !finalPrompt.trim()) {
116
- const userPromptInput = await text({
117
- message: chalk.bold('What code issue or feature would you like Scout to auto-fix?'),
118
- placeholder: 'e.g. Fix null check in src/index.ts or remove em dashes from all .html files',
119
- validate: (val) => (!val || !val.trim() ? 'Please provide a prompt or issue description' : undefined),
120
- });
121
- if (isCancel(userPromptInput)) {
122
- safeNote(chalk.yellow('Auto-fix operation cancelled.'), '🛠️ Scout Auto-Fix');
123
- return;
124
- }
125
- finalPrompt = userPromptInput.trim();
126
- }
127
- // Determine target files
128
- let targetFiles = [];
129
- if (specifiedTargetFile) {
130
- targetFiles = findTargetFilesFromPrompt(finalPrompt, specifiedTargetFile, filesList);
131
- if (targetFiles.length === 0 && fs.existsSync(path.resolve(cwd, specifiedTargetFile))) {
132
- targetFiles = [specifiedTargetFile];
133
- }
134
- }
135
- if (targetFiles.length === 0) {
136
- targetFiles = findTargetFilesFromPrompt(finalPrompt, undefined, filesList);
137
- }
138
- if (targetFiles.length === 0) {
139
- const sIdentify = spinner();
140
- sIdentify.start('Scout is analyzing codebase files to identify target files...');
141
- const aiMatched = await identifyTargetFiles(finalPrompt, projectName, filesList, targetLang, options?.native);
142
- sIdentify.stop('File identification complete.');
143
- if (aiMatched.length > 0) {
144
- targetFiles = aiMatched;
145
- }
146
- }
147
- if (targetFiles.length === 0) {
148
- let possibleNewFile = undefined;
149
- if (specifiedTargetFile && specifiedTargetFile.trim()) {
150
- const clean = specifiedTargetFile.trim();
151
- if (!clean.startsWith('.') && !clean.startsWith('*') && clean.includes('.')) {
152
- possibleNewFile = clean;
153
- }
154
- }
155
- else {
156
- const words = finalPrompt.split(/\s+/);
157
- const fileCandidate = words.find((w) => {
158
- const clean = w.replace(/["'(),;:]/g, '');
159
- // Must contain a dot, must NOT start with dot or asterisk (e.g. not .html or *.ts),
160
- // must have a valid filename before the extension (e.g. "index.html"),
161
- // and must have a valid extension length (1-6 chars)
162
- const match = clean.match(/^([a-zA-Z0-9_\-\/\\]+)\.([a-zA-Z0-9]{1,6})$/);
163
- return match && match[1] && match[1].length > 0 && match[2] !== undefined;
164
- });
165
- if (fileCandidate) {
166
- possibleNewFile = fileCandidate.replace(/["'(),;:]/g, '');
167
- }
168
- }
169
- if (possibleNewFile && !fs.existsSync(path.resolve(cwd, possibleNewFile))) {
170
- const { handleCreate } = await import('./create.js');
171
- safeNote(chalk.cyan(`Target file \`${possibleNewFile}\` does not exist yet. Switching to Scout File Creation...`), '✨ Creating New File');
172
- await handleCreate(possibleNewFile, { prompt: finalPrompt, lang: targetLang, native: options?.native });
173
- return;
174
- }
175
- }
176
- if (targetFiles.length === 0) {
177
- safeNote(chalk.yellow(`Could not locate target files matching your prompt in this codebase.\nPlease specify file names or an extension (e.g. \`scout fix "remove em dashes from all .html files"\` or use \`--file <filename>\`).`), '⚠️ Target Files Not Found');
178
- return;
179
- }
180
- const targetFilesMap = {};
181
- const backups = [];
182
- const normKey = (p) => p.replace(/\\/g, '/').replace(/^\.\//, '').trim();
183
- for (const tf of targetFiles) {
184
- const fullPath = path.resolve(cwd, tf);
185
- if (fs.existsSync(fullPath)) {
186
- const content = fs.readFileSync(fullPath, 'utf-8');
187
- targetFilesMap[normKey(tf)] = content;
188
- backups.push({
189
- filePath: normKey(tf),
190
- originalContent: content,
191
- });
192
- }
193
- }
194
- if (Object.keys(targetFilesMap).length === 0) {
195
- safeNote(chalk.yellow('None of the target files could be read from disk.'), '⚠️ File Read Error');
196
- return;
197
- }
198
- const git = simpleGit();
199
- const isRepo = await git.checkIsRepo();
200
- let currentBranch = 'main';
201
- if (isRepo) {
202
- try {
203
- const branchSummary = await git.branch();
204
- currentBranch = branchSummary.current || 'main';
205
- }
206
- catch { }
207
- }
208
- const s = spinner();
209
- s.start(`Scout is analyzing problem & auto-fixing ${targetFiles.length} file${targetFiles.length > 1 ? 's' : ''}...`);
210
- let fixResult;
211
- try {
212
- fixResult = await generateMultiCodeFix(finalPrompt, projectName, filesList, targetFilesMap, targetLang, options?.native, (completed, total, currentFile) => {
213
- s.message(`Scout auto-fixing files (${completed}/${total}): ${currentFile}...`);
214
- });
215
- }
216
- catch (err) {
217
- s.stop(chalk.red('Failed to generate AI code fix.'));
218
- safeNote(chalk.red(`Error: ${err?.message || String(err)}`), '⚠️ Auto-Fix Error');
219
- return;
220
- }
221
- const modifiedFiles = [];
222
- for (const item of fixResult.files) {
223
- if (item.fixedCode !== undefined) {
224
- const k = normKey(item.targetFile);
225
- const fullPath = path.resolve(cwd, k);
226
- const originalContent = targetFilesMap[k] ?? '';
227
- const normalizedFixed = item.fixedCode.replace(/\r\n/g, '\n').trim();
228
- const normalizedOrig = originalContent.replace(/\r\n/g, '\n').trim();
229
- if (normalizedFixed !== normalizedOrig) {
230
- try {
231
- fs.mkdirSync(path.dirname(fullPath), { recursive: true });
232
- fs.writeFileSync(fullPath, item.fixedCode, 'utf-8');
233
- modifiedFiles.push(k);
234
- }
235
- catch (writeErr) {
236
- console.error(`Failed to write fix to ${k}:`, writeErr?.message);
237
- }
238
- }
239
- }
240
- }
241
- if (modifiedFiles.length === 0) {
242
- s.stop(chalk.yellow('No code modifications were required.'));
243
- safeNote(chalk.yellow(`Scout analyzed ${targetFiles.length} file(s), but no code changes were needed for prompt: "${finalPrompt}".\n(The target issue or pattern was not present in the analyzed files).`), 'ℹ️ No Code Changes Made');
244
- return;
245
- }
246
- recordHistoryAction({
247
- command: `ft fix "${finalPrompt}"`,
248
- description: `Scout auto-fixed ${modifiedFiles.length} file(s): ${modifiedFiles.join(', ')}`,
249
- previousBranch: currentBranch,
250
- affectedFiles: modifiedFiles,
251
- backups,
252
- });
253
- s.stop(chalk.green(`Auto-fix applied to ${modifiedFiles.length} file${modifiedFiles.length > 1 ? 's' : ''} successfully!`));
254
- const filesListFormatted = modifiedFiles.map((f) => ` • \`${f}\``).join('\n');
255
- const teardownContent = `
256
- ### 🔍 Target File(s)
257
- ${filesListFormatted}
258
-
259
- ### 🔴 Problem Identified
260
- ${fixResult.problem}
261
-
262
- ### 🛠️ How Scout Fixed It
263
- ${fixResult.howFixed}
264
-
265
- ---
266
- *Changes applied directly to ${modifiedFiles.length} file(s)${isRepo ? ` on active branch \`${currentBranch}\`` : ''}.*
267
- `.trim();
268
- safeNote(renderMarkdown(teardownContent), '🛠️ Scout Auto-Fix Teardown & Explanation');
269
- const actionChoice = await select({
270
- message: chalk.bold('Review Scout\'s auto-fix result. What would you like to do?'),
271
- options: [
272
- { value: 'keep', label: '✅ Keep Changes', hint: `Retain auto-fixed code directly on current branch (${currentBranch})` },
273
- { value: 'pr', label: '🔀 Create Pull Request', hint: 'Push fix to a new branch & open a Pull Request' },
274
- { value: 'revert', label: '↩️ Revert Changes', hint: 'Restore original code immediately' },
275
- ],
276
- });
277
- if (actionChoice === 'revert') {
278
- const revSpinner = spinner();
279
- revSpinner.start('Reverting Scout\'s changes...');
280
- await handleUndo();
281
- revSpinner.stop('Changes reverted successfully.');
282
- return;
283
- }
284
- if (isCancel(actionChoice)) {
285
- safeNote(`${chalk.green('✓')} Auto-fix retained on ${modifiedFiles.length} file(s) (Branch: ${chalk.bold.green(currentBranch)}).\n` +
286
- `💡 ${chalk.dim('You can revert these changes anytime by running:')} ${chalk.cyan('scout undo')}`, '✅ Fix Retained');
287
- return;
288
- }
289
- if (actionChoice === 'pr') {
290
- const prSpinner = spinner();
291
- prSpinner.start('Creating Pull Request...');
292
- const prRes = await createPullRequest({
293
- branchPrefix: 'fix',
294
- title: finalPrompt,
295
- affectedFiles: modifiedFiles,
296
- commitMessage: `fix: ${finalPrompt}`,
297
- });
298
- prSpinner.stop('Pull Request workflow processed.');
299
- safeNote(`${chalk.green('✓')} ${prRes.message}\n` +
300
- `💡 ${chalk.dim('You remain on active branch:')} ${chalk.cyan(currentBranch)}`, '🔀 Pull Request Status');
301
- return;
302
- }
303
- safeNote(`${chalk.green('✓')} Auto-fix retained on ${modifiedFiles.length} file(s) (Branch: ${chalk.bold.green(currentBranch)}).\n` +
304
- `💡 ${chalk.dim('You can still revert these changes anytime by running:')} ${chalk.cyan('scout undo')}`, '✅ Fix Confirmed');
305
- }
306
- //# sourceMappingURL=fix.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fix.js","sourceRoot":"","sources":["fix.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runCommand.d.ts","sourceRoot":"","sources":["runCommand.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAsBD,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,iBA6GlG"}
@@ -1,106 +0,0 @@
1
- import chalk from 'chalk';
2
- import fs from 'fs';
3
- import path from 'path';
4
- import { exec } from 'child_process';
5
- import { spinner, confirm, isCancel } from '@clack/prompts';
6
- import { safeNote, renderMarkdown } from '../utils/markdown.js';
7
- import { loadContext } from '../utils/config.js';
8
- import { analyzeCommandError } from '../engine/llm.js';
9
- import { handleFix } from './fix.js';
10
- import { normalizeLanguage } from '../utils/language.js';
11
- function getDirectoryFiles(dir, baseDir = dir, maxFiles = 150) {
12
- let results = [];
13
- try {
14
- const list = fs.readdirSync(dir);
15
- for (const file of list) {
16
- if (results.length >= maxFiles)
17
- break;
18
- if (['node_modules', '.git', '.ft', 'dist', 'build', '.next', 'coverage'].includes(file))
19
- continue;
20
- const filePath = path.join(dir, file);
21
- const stat = fs.statSync(filePath);
22
- if (stat && stat.isDirectory()) {
23
- results = results.concat(getDirectoryFiles(filePath, baseDir, maxFiles - results.length));
24
- }
25
- else {
26
- const relativePath = path.relative(baseDir, filePath).replace(/\\/g, '/');
27
- results.push(relativePath);
28
- }
29
- }
30
- }
31
- catch { }
32
- return results;
33
- }
34
- export async function handleRunCommand(commandInput, options) {
35
- const existingContext = loadContext();
36
- const targetLang = normalizeLanguage(options?.lang) || normalizeLanguage(existingContext?.language);
37
- const cwd = process.cwd();
38
- const filesList = getDirectoryFiles(cwd);
39
- const projectName = existingContext?.projectName || path.basename(cwd) || 'Codebase';
40
- const fullCommand = Array.isArray(commandInput) ? commandInput.join(' ') : commandInput;
41
- if (!fullCommand || !fullCommand.trim()) {
42
- safeNote(chalk.yellow('Please specify a command for Scout to execute.\nUsage: scout run <command...>\nExample: scout run npm test'), '⚠️ Missing Command');
43
- return;
44
- }
45
- safeNote(`Running command: ${chalk.bold.cyan(fullCommand)}\n${chalk.dim('Working directory: ' + cwd)}`, '⚡ Scout Shell Execution');
46
- const runSpinner = spinner();
47
- runSpinner.start(`Executing \`${fullCommand}\`...`);
48
- const outputBuffers = [];
49
- const exitCode = await new Promise((resolve) => {
50
- const proc = exec(fullCommand, { cwd });
51
- proc.stdout?.on('data', (data) => {
52
- const str = data.toString();
53
- outputBuffers.push(str);
54
- process.stdout.write(str);
55
- });
56
- proc.stderr?.on('data', (data) => {
57
- const str = data.toString();
58
- outputBuffers.push(str);
59
- process.stderr.write(str);
60
- });
61
- proc.on('close', (code) => {
62
- resolve(code ?? 0);
63
- });
64
- proc.on('error', (err) => {
65
- outputBuffers.push(`Process Error: ${err.message}`);
66
- resolve(1);
67
- });
68
- });
69
- const fullOutput = outputBuffers.join('');
70
- if (exitCode === 0) {
71
- runSpinner.stop(chalk.green(`Command \`${fullCommand}\` executed successfully (Exit Code 0).`));
72
- safeNote(`${chalk.green('✓')} Process completed with exit code 0.`, '✅ Execution Successful');
73
- return;
74
- }
75
- runSpinner.stop(chalk.red(`Command \`${fullCommand}\` failed with exit code ${exitCode}.`));
76
- const diagSpinner = spinner();
77
- diagSpinner.start('Scout AI is analyzing process failure output...');
78
- const analysis = await analyzeCommandError(fullCommand, exitCode, fullOutput, projectName, filesList, targetLang, options?.native);
79
- diagSpinner.stop(chalk.yellow('Failure diagnosis complete.'));
80
- const diagMarkdown = `
81
- ### 🔴 Process Failure Diagnosis
82
- Command: \`${fullCommand}\` (Exit Code ${exitCode})
83
-
84
- ### 🔍 Root Cause Analysis
85
- ${analysis.rootCause}
86
-
87
- ### 💡 Suggested Fix
88
- ${analysis.suggestedFix}
89
- ${analysis.targetFileToFix ? `\n### 🎯 Suspected File\n\`${analysis.targetFileToFix}\`` : ''}
90
- `.trim();
91
- safeNote(renderMarkdown(diagMarkdown), '⚠️ Scout AI Failure Diagnosis');
92
- const shouldFix = await confirm({
93
- message: chalk.bold('Would you like Scout to auto-fix the failing code automatically?'),
94
- initialValue: true,
95
- });
96
- if (!isCancel(shouldFix) && shouldFix) {
97
- const fixPrompt = `Fix runtime/build error from command \`${fullCommand}\`. Cause: ${analysis.rootCause}`;
98
- await handleFix({
99
- prompt: fixPrompt,
100
- issue: analysis.targetFileToFix,
101
- lang: targetLang,
102
- native: options?.native,
103
- });
104
- }
105
- }
106
- //# sourceMappingURL=runCommand.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runCommand.js","sourceRoot":"","sources":["runCommand.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["scan.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,QAIpD;AAED,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAO/C;AAED,wBAAsB,UAAU,kBAmE/B"}
@@ -1,82 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import chalk from 'chalk';
4
- import { spinner } from '@clack/prompts';
5
- import { generateCodeScanReport } from '../engine/llm.js';
6
- import { safeNote } from '../utils/markdown.js';
7
- import { loadContext } from '../utils/config.js';
8
- const FT_DIR = path.join(process.cwd(), '.ft');
9
- const SCAN_CACHE = path.join(FT_DIR, 'scan-report.json');
10
- export function saveScanReport(issues) {
11
- if (fs.existsSync(FT_DIR)) {
12
- fs.writeFileSync(SCAN_CACHE, JSON.stringify(issues, null, 2));
13
- }
14
- }
15
- export function loadScanReport() {
16
- if (!fs.existsSync(SCAN_CACHE))
17
- return [];
18
- try {
19
- return JSON.parse(fs.readFileSync(SCAN_CACHE, 'utf-8'));
20
- }
21
- catch {
22
- return [];
23
- }
24
- }
25
- export async function handleScan() {
26
- const s = spinner();
27
- s.start('Performing read-only bug & vulnerability scan across codebase...');
28
- const cwd = process.cwd();
29
- const context = loadContext();
30
- const projectName = context?.projectName || path.basename(cwd);
31
- const getFiles = (dir, depth = 2) => {
32
- let results = [];
33
- try {
34
- const list = fs.readdirSync(dir);
35
- for (const file of list) {
36
- if (['node_modules', '.git', 'dist', 'build', '.ft'].includes(file))
37
- continue;
38
- const fullPath = path.join(dir, file);
39
- const relPath = path.relative(cwd, fullPath);
40
- const stat = fs.statSync(fullPath);
41
- if (stat.isDirectory()) {
42
- if (depth > 1)
43
- results = results.concat(getFiles(fullPath, depth - 1));
44
- }
45
- else {
46
- results.push(relPath);
47
- }
48
- }
49
- }
50
- catch { }
51
- return results;
52
- };
53
- const filesList = getFiles(cwd, 2);
54
- let codeSample = '';
55
- const pkgPath = path.join(cwd, 'package.json');
56
- if (fs.existsSync(pkgPath)) {
57
- codeSample += fs.readFileSync(pkgPath, 'utf-8').slice(0, 1000) + '\n';
58
- }
59
- const issues = await generateCodeScanReport(projectName, filesList, codeSample);
60
- saveScanReport(issues);
61
- s.stop('Scan complete. Read-only report generated (no code modified).');
62
- const severityBadge = (sev) => {
63
- switch (sev.toLowerCase()) {
64
- case 'high':
65
- return chalk.bgRed.white.bold(' HIGH ');
66
- case 'medium':
67
- return chalk.bgYellow.black.bold(' MEDIUM ');
68
- default:
69
- return chalk.bgBlue.white.bold(' LOW ');
70
- }
71
- };
72
- const reportLines = issues.map((iss) => `${chalk.bold.cyan(`[Issue #${iss.id}]`)} ${severityBadge(iss.severity)} ${chalk.bold(iss.title)}\n` +
73
- ` • File: ${chalk.yellow(iss.file)}\n` +
74
- ` • Detail: ${iss.description}`);
75
- safeNote(`Found ${issues.length} potential issues matching past hotfix patterns:\n\n` +
76
- reportLines.join('\n\n') +
77
- `\n\n${chalk.bold.green('💡 How to Auto-Fix Any Issue:')}\n` +
78
- ` • Auto-fix Issue #${issues[0]?.id || 1}: ${chalk.bold.cyan(`scout fix --issue ${issues[0]?.id || 1}`)}\n` +
79
- ` • Auto-fix with short flag: ${chalk.bold.cyan(`scout fix -i ${issues[1]?.id || 2}`)}\n` +
80
- ` • Custom prompt auto-fix: ${chalk.bold.cyan('scout fix "Fix null check in src/index.ts"')}`, '🔍 FrontTerrain Codebase Bug Scan');
81
- }
82
- //# sourceMappingURL=scan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["scan.ts"],"names":[],"mappings":"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"}