ft-scout 3.0.5 → 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.
- package/README.md +11 -4
- package/bin/ft.js +1 -0
- package/bin/src/commands/agent.d.ts.map +1 -0
- package/bin/src/commands/agent.js +640 -0
- package/bin/src/commands/agent.js.map +1 -0
- package/bin/src/engine/git.d.ts.map +1 -1
- package/bin/src/engine/llm.d.ts.map +1 -1
- package/bin/src/engine/llm.js +138 -47
- package/bin/src/engine/llm.js.map +1 -1
- package/bin/src/index.js +29 -68
- package/bin/src/index.js.map +1 -1
- package/bin/src/utils/branding.js +1 -1
- package/bin/src/utils/config.d.ts.map +1 -1
- package/bin/src/utils/config.js +41 -0
- package/bin/src/utils/config.js.map +1 -1
- package/package.json +1 -48
- package/bin/src/commands/add.d.ts.map +0 -1
- package/bin/src/commands/add.js +0 -45
- package/bin/src/commands/add.js.map +0 -1
- package/bin/src/commands/chat.d.ts.map +0 -1
- package/bin/src/commands/chat.js +0 -191
- package/bin/src/commands/chat.js.map +0 -1
- package/bin/src/commands/create.d.ts.map +0 -1
- package/bin/src/commands/create.js +0 -160
- package/bin/src/commands/create.js.map +0 -1
- package/bin/src/commands/fix.d.ts.map +0 -1
- package/bin/src/commands/fix.js +0 -269
- package/bin/src/commands/fix.js.map +0 -1
- package/bin/src/commands/runCommand.d.ts.map +0 -1
- package/bin/src/commands/runCommand.js +0 -106
- package/bin/src/commands/runCommand.js.map +0 -1
- package/bin/src/commands/scan.d.ts.map +0 -1
- package/bin/src/commands/scan.js +0 -82
- package/bin/src/commands/scan.js.map +0 -1
|
@@ -1,160 +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 { safeNote, renderMarkdown } from '../utils/markdown.js';
|
|
7
|
-
import { recordHistoryAction, loadContext } from '../utils/config.js';
|
|
8
|
-
import { generateCodeFile } from '../engine/llm.js';
|
|
9
|
-
import { createPullRequest } from '../engine/git.js';
|
|
10
|
-
import { handleUndo } from './undo.js';
|
|
11
|
-
import { normalizeLanguage } from '../utils/language.js';
|
|
12
|
-
function getDirectoryFiles(dir, baseDir = dir, maxFiles = 150) {
|
|
13
|
-
let results = [];
|
|
14
|
-
try {
|
|
15
|
-
const list = fs.readdirSync(dir);
|
|
16
|
-
for (const file of list) {
|
|
17
|
-
if (results.length >= maxFiles)
|
|
18
|
-
break;
|
|
19
|
-
if (['node_modules', '.git', '.ft', 'dist', 'build', '.next', 'coverage'].includes(file))
|
|
20
|
-
continue;
|
|
21
|
-
const filePath = path.join(dir, file);
|
|
22
|
-
const stat = fs.statSync(filePath);
|
|
23
|
-
if (stat && stat.isDirectory()) {
|
|
24
|
-
results = results.concat(getDirectoryFiles(filePath, baseDir, maxFiles - results.length));
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
const relativePath = path.relative(baseDir, filePath).replace(/\\/g, '/');
|
|
28
|
-
results.push(relativePath);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
catch { }
|
|
33
|
-
return results;
|
|
34
|
-
}
|
|
35
|
-
export async function handleCreate(filePathInput, options) {
|
|
36
|
-
const existingContext = loadContext();
|
|
37
|
-
const targetLang = normalizeLanguage(options?.lang) || normalizeLanguage(existingContext?.language);
|
|
38
|
-
const cwd = process.cwd();
|
|
39
|
-
const filesList = getDirectoryFiles(cwd);
|
|
40
|
-
const projectName = existingContext?.projectName || path.basename(cwd) || 'Codebase';
|
|
41
|
-
let targetFilePath = filePathInput;
|
|
42
|
-
if (!targetFilePath || !targetFilePath.trim()) {
|
|
43
|
-
const userInputPath = await text({
|
|
44
|
-
message: chalk.bold('Enter relative file path to create (e.g. src/utils/math.ts):'),
|
|
45
|
-
placeholder: 'src/utils/helpers.ts',
|
|
46
|
-
validate: (val) => (!val || !val.trim() ? 'File path is required' : undefined),
|
|
47
|
-
});
|
|
48
|
-
if (isCancel(userInputPath)) {
|
|
49
|
-
safeNote(chalk.yellow('File creation operation cancelled.'), '✨ Scout File Creation');
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
targetFilePath = userInputPath.trim();
|
|
53
|
-
}
|
|
54
|
-
let finalPrompt = options?.prompt;
|
|
55
|
-
if (!finalPrompt || !finalPrompt.trim()) {
|
|
56
|
-
const userPromptInput = await text({
|
|
57
|
-
message: chalk.bold(`What should Scout generate inside ${chalk.cyan(targetFilePath)}?`),
|
|
58
|
-
placeholder: 'e.g. Create a utility module with functions for string formatting and timestamp parsing',
|
|
59
|
-
validate: (val) => (!val || !val.trim() ? 'Please provide a prompt describing the file requirements' : undefined),
|
|
60
|
-
});
|
|
61
|
-
if (isCancel(userPromptInput)) {
|
|
62
|
-
safeNote(chalk.yellow('File creation operation cancelled.'), '✨ Scout File Creation');
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
finalPrompt = userPromptInput.trim();
|
|
66
|
-
}
|
|
67
|
-
const resolvedPath = path.resolve(cwd, targetFilePath);
|
|
68
|
-
const fileExists = fs.existsSync(resolvedPath);
|
|
69
|
-
const originalContent = fileExists ? fs.readFileSync(resolvedPath, 'utf-8') : '__FT_WAS_NEW__';
|
|
70
|
-
const git = simpleGit();
|
|
71
|
-
const isRepo = await git.checkIsRepo();
|
|
72
|
-
let currentBranch = 'main';
|
|
73
|
-
if (isRepo) {
|
|
74
|
-
try {
|
|
75
|
-
const branchSummary = await git.branch();
|
|
76
|
-
currentBranch = branchSummary.current || 'main';
|
|
77
|
-
}
|
|
78
|
-
catch { }
|
|
79
|
-
}
|
|
80
|
-
const s = spinner();
|
|
81
|
-
s.start(`Scout is generating code for ${targetFilePath} with AI...`);
|
|
82
|
-
let genResult;
|
|
83
|
-
try {
|
|
84
|
-
genResult = await generateCodeFile(targetFilePath, finalPrompt, projectName, filesList, targetLang, options?.native);
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
s.stop(chalk.red('Failed to generate code file.'));
|
|
88
|
-
safeNote(chalk.red(`Error: ${err?.message || String(err)}`), '⚠️ Code Generation Error');
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
// Ensure parent directory exists
|
|
92
|
-
const parentDir = path.dirname(resolvedPath);
|
|
93
|
-
if (!fs.existsSync(parentDir)) {
|
|
94
|
-
fs.mkdirSync(parentDir, { recursive: true });
|
|
95
|
-
}
|
|
96
|
-
try {
|
|
97
|
-
fs.writeFileSync(resolvedPath, genResult.code, 'utf-8');
|
|
98
|
-
}
|
|
99
|
-
catch (writeErr) {
|
|
100
|
-
s.stop(chalk.red('Failed to write generated code to disk.'));
|
|
101
|
-
safeNote(chalk.red(`Write error: ${writeErr?.message || String(writeErr)}`), '⚠️ File Write Error');
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
recordHistoryAction({
|
|
105
|
-
command: `ft create "${targetFilePath}" "${finalPrompt}"`,
|
|
106
|
-
description: `Scout created file ${targetFilePath}`,
|
|
107
|
-
previousBranch: currentBranch,
|
|
108
|
-
affectedFiles: [targetFilePath],
|
|
109
|
-
backups: [{ filePath: targetFilePath, originalContent }],
|
|
110
|
-
});
|
|
111
|
-
s.stop(chalk.green(`File ${targetFilePath} created successfully!`));
|
|
112
|
-
const teardownContent = `
|
|
113
|
-
### 📄 Created File
|
|
114
|
-
\`${targetFilePath}\`
|
|
115
|
-
|
|
116
|
-
### 💡 Description & Overview
|
|
117
|
-
${genResult.description}
|
|
118
|
-
|
|
119
|
-
### 💻 Preview
|
|
120
|
-
\`\`\`
|
|
121
|
-
${genResult.code.slice(0, 500)}${genResult.code.length > 500 ? '\n... (truncated)' : ''}
|
|
122
|
-
\`\`\`
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
*File created directly at \`${targetFilePath}\`${isRepo ? ` on active branch \`${currentBranch}\`` : ''}.*
|
|
126
|
-
`.trim();
|
|
127
|
-
safeNote(renderMarkdown(teardownContent), '✨ Scout File Creation Teardown');
|
|
128
|
-
const actionChoice = await select({
|
|
129
|
-
message: chalk.bold('Review Scout\'s generated file. What would you like to do?'),
|
|
130
|
-
options: [
|
|
131
|
-
{ value: 'keep', label: '✅ Keep File', hint: `Retain the newly created file directly on current branch (${currentBranch})` },
|
|
132
|
-
{ value: 'pr', label: '🔀 Create Pull Request', hint: 'Push created file to a new branch & open a Pull Request' },
|
|
133
|
-
{ value: 'revert', label: '↩️ Revert / Delete File', hint: 'Remove the created file immediately' },
|
|
134
|
-
],
|
|
135
|
-
});
|
|
136
|
-
if (isCancel(actionChoice) || actionChoice === 'revert') {
|
|
137
|
-
const revSpinner = spinner();
|
|
138
|
-
revSpinner.start('Reverting Scout\'s file creation...');
|
|
139
|
-
await handleUndo();
|
|
140
|
-
revSpinner.stop('Creation reverted successfully.');
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
if (actionChoice === 'pr') {
|
|
144
|
-
const prSpinner = spinner();
|
|
145
|
-
prSpinner.start('Creating Pull Request...');
|
|
146
|
-
const prRes = await createPullRequest({
|
|
147
|
-
branchPrefix: 'create',
|
|
148
|
-
title: `feat: Add ${targetFilePath}`,
|
|
149
|
-
affectedFiles: [targetFilePath],
|
|
150
|
-
commitMessage: `feat: Create ${targetFilePath}`,
|
|
151
|
-
});
|
|
152
|
-
prSpinner.stop('Pull Request workflow processed.');
|
|
153
|
-
safeNote(`${chalk.green('✓')} ${prRes.message}\n` +
|
|
154
|
-
`💡 ${chalk.dim('You remain on active branch:')} ${chalk.cyan(currentBranch)}`, '🔀 Pull Request Status');
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
safeNote(`${chalk.green('✓')} Saved ${chalk.bold.cyan(targetFilePath)} on branch ${chalk.bold.green(currentBranch)}.\n` +
|
|
158
|
-
`💡 ${chalk.dim('You can revert this creation anytime by running:')} ${chalk.cyan('scout undo')}`, '✅ Creation Confirmed');
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=create.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["fix.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAsBD,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,SAAS,EAAE,MAAM,EAAE,GAClB,MAAM,EAAE,CA0EV;AAED,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,iBAwNnD"}
|
package/bin/src/commands/fix.js
DELETED
|
@@ -1,269 +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 } 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
|
-
function getDirectoryFiles(dir, baseDir = dir, maxFiles = 150) {
|
|
14
|
-
let results = [];
|
|
15
|
-
try {
|
|
16
|
-
const list = fs.readdirSync(dir);
|
|
17
|
-
for (const file of list) {
|
|
18
|
-
if (results.length >= maxFiles)
|
|
19
|
-
break;
|
|
20
|
-
if (['node_modules', '.git', '.ft', 'dist', 'build', '.next', 'coverage'].includes(file))
|
|
21
|
-
continue;
|
|
22
|
-
const filePath = path.join(dir, file);
|
|
23
|
-
const stat = fs.statSync(filePath);
|
|
24
|
-
if (stat && stat.isDirectory()) {
|
|
25
|
-
results = results.concat(getDirectoryFiles(filePath, baseDir, maxFiles - results.length));
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
const relativePath = path.relative(baseDir, filePath).replace(/\\/g, '/');
|
|
29
|
-
results.push(relativePath);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
catch { }
|
|
34
|
-
return results;
|
|
35
|
-
}
|
|
36
|
-
export function findTargetFilesFromPrompt(userPrompt, specifiedFile, filesList) {
|
|
37
|
-
if (specifiedFile && specifiedFile.trim()) {
|
|
38
|
-
const raw = specifiedFile.trim();
|
|
39
|
-
const splitFiles = raw.split(',').map((s) => s.trim()).filter(Boolean);
|
|
40
|
-
const matchedFromFlag = [];
|
|
41
|
-
for (const item of splitFiles) {
|
|
42
|
-
const exact = filesList.find((f) => f.toLowerCase() === item.toLowerCase());
|
|
43
|
-
if (exact) {
|
|
44
|
-
matchedFromFlag.push(exact);
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
const extMatch = item.match(/\.?([a-zA-Z0-9]+)$/);
|
|
48
|
-
if (extMatch && extMatch[1]) {
|
|
49
|
-
const ext = `.${extMatch[1].toLowerCase()}`;
|
|
50
|
-
const extFiles = filesList.filter((f) => f.toLowerCase().endsWith(ext));
|
|
51
|
-
matchedFromFlag.push(...extFiles);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (matchedFromFlag.length > 0) {
|
|
55
|
-
return Array.from(new Set(matchedFromFlag));
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
const lowerPrompt = userPrompt.toLowerCase();
|
|
59
|
-
const extMatches = lowerPrompt.match(/(?:\.|\*\.)([a-zA-Z0-9]+)\b|all\s+([a-zA-Z0-9]+)\s+file/gi);
|
|
60
|
-
const detectedExts = new Set();
|
|
61
|
-
if (extMatches) {
|
|
62
|
-
for (const match of extMatches) {
|
|
63
|
-
const cleaned = match.replace(/^(all\s+|in\s+|\*|\.|\s+)+/gi, '').replace(/\s+file(s)?$/gi, '').trim();
|
|
64
|
-
if (cleaned && cleaned.length <= 10) {
|
|
65
|
-
detectedExts.add(`.${cleaned.toLowerCase()}`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
const knownExtensions = ['html', 'htm', 'css', 'js', 'ts', 'jsx', 'tsx', 'json', 'py', 'dart', 'vue', 'svelte', 'md', 'yaml', 'yml', 'sql'];
|
|
70
|
-
for (const ext of knownExtensions) {
|
|
71
|
-
if (lowerPrompt.includes(`.${ext}`) ||
|
|
72
|
-
lowerPrompt.includes(`${ext} file`) ||
|
|
73
|
-
lowerPrompt.includes(`${ext} files`) ||
|
|
74
|
-
lowerPrompt.includes(`*.${ext}`)) {
|
|
75
|
-
detectedExts.add(`.${ext}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
if (detectedExts.size > 0) {
|
|
79
|
-
const matchedByExt = [];
|
|
80
|
-
for (const ext of detectedExts) {
|
|
81
|
-
const extFiles = filesList.filter((f) => f.toLowerCase().endsWith(ext));
|
|
82
|
-
matchedByExt.push(...extFiles);
|
|
83
|
-
}
|
|
84
|
-
if (matchedByExt.length > 0) {
|
|
85
|
-
return Array.from(new Set(matchedByExt));
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
const matchedByName = [];
|
|
89
|
-
for (const f of filesList) {
|
|
90
|
-
const base = path.basename(f).toLowerCase();
|
|
91
|
-
if (lowerPrompt.includes(f.toLowerCase()) || lowerPrompt.includes(base)) {
|
|
92
|
-
matchedByName.push(f);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (matchedByName.length > 0) {
|
|
96
|
-
return Array.from(new Set(matchedByName));
|
|
97
|
-
}
|
|
98
|
-
return [];
|
|
99
|
-
}
|
|
100
|
-
export async function handleFix(options) {
|
|
101
|
-
const existingContext = loadContext();
|
|
102
|
-
const targetLang = normalizeLanguage(options?.lang) || normalizeLanguage(existingContext?.language);
|
|
103
|
-
const cwd = process.cwd();
|
|
104
|
-
const filesList = getDirectoryFiles(cwd);
|
|
105
|
-
const projectName = existingContext?.projectName || path.basename(cwd) || 'Codebase';
|
|
106
|
-
let finalPrompt = options?.prompt;
|
|
107
|
-
let specifiedTargetFile = options?.file;
|
|
108
|
-
if (!finalPrompt && options?.issue) {
|
|
109
|
-
const report = loadScanReport();
|
|
110
|
-
const issueId = Number(options.issue);
|
|
111
|
-
const targetIssue = report.find((i) => i.id === issueId) || report[0];
|
|
112
|
-
if (targetIssue) {
|
|
113
|
-
finalPrompt = `Fix issue #${targetIssue.id}: ${targetIssue.title} — ${targetIssue.description}`;
|
|
114
|
-
specifiedTargetFile = targetIssue.file;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (!finalPrompt || !finalPrompt.trim()) {
|
|
118
|
-
const userPromptInput = await text({
|
|
119
|
-
message: chalk.bold('What code issue or feature would you like Scout to auto-fix?'),
|
|
120
|
-
placeholder: 'e.g. Fix null check in src/index.ts or remove em dashes from all .html files',
|
|
121
|
-
validate: (val) => (!val || !val.trim() ? 'Please provide a prompt or issue description' : undefined),
|
|
122
|
-
});
|
|
123
|
-
if (isCancel(userPromptInput)) {
|
|
124
|
-
safeNote(chalk.yellow('Auto-fix operation cancelled.'), '🛠️ Scout Auto-Fix');
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
finalPrompt = userPromptInput.trim();
|
|
128
|
-
}
|
|
129
|
-
// Determine target files
|
|
130
|
-
let targetFiles = [];
|
|
131
|
-
if (specifiedTargetFile) {
|
|
132
|
-
targetFiles = findTargetFilesFromPrompt(finalPrompt, specifiedTargetFile, filesList);
|
|
133
|
-
if (targetFiles.length === 0 && fs.existsSync(path.resolve(cwd, specifiedTargetFile))) {
|
|
134
|
-
targetFiles = [specifiedTargetFile];
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
if (targetFiles.length === 0) {
|
|
138
|
-
targetFiles = findTargetFilesFromPrompt(finalPrompt, undefined, filesList);
|
|
139
|
-
}
|
|
140
|
-
if (targetFiles.length === 0) {
|
|
141
|
-
const sIdentify = spinner();
|
|
142
|
-
sIdentify.start('Scout is analyzing codebase files to identify target files...');
|
|
143
|
-
const aiMatched = await identifyTargetFiles(finalPrompt, projectName, filesList, targetLang, options?.native);
|
|
144
|
-
sIdentify.stop('File identification complete.');
|
|
145
|
-
if (aiMatched.length > 0) {
|
|
146
|
-
targetFiles = aiMatched;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
if (targetFiles.length === 0) {
|
|
150
|
-
const possibleNewFile = specifiedTargetFile || finalPrompt.split(' ').find((s) => s.includes('.')) || undefined;
|
|
151
|
-
if (possibleNewFile && !fs.existsSync(path.resolve(cwd, possibleNewFile))) {
|
|
152
|
-
const { handleCreate } = await import('./create.js');
|
|
153
|
-
safeNote(chalk.cyan(`Target file \`${possibleNewFile}\` does not exist yet. Switching to Scout File Creation...`), '✨ Creating New File');
|
|
154
|
-
await handleCreate(possibleNewFile, { prompt: finalPrompt, lang: targetLang, native: options?.native });
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
if (targetFiles.length === 0) {
|
|
159
|
-
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');
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
const targetFilesMap = {};
|
|
163
|
-
const backups = [];
|
|
164
|
-
for (const tf of targetFiles) {
|
|
165
|
-
const fullPath = path.resolve(cwd, tf);
|
|
166
|
-
if (fs.existsSync(fullPath)) {
|
|
167
|
-
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
168
|
-
targetFilesMap[tf] = content;
|
|
169
|
-
backups.push({
|
|
170
|
-
filePath: tf,
|
|
171
|
-
originalContent: content,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
if (Object.keys(targetFilesMap).length === 0) {
|
|
176
|
-
safeNote(chalk.yellow('None of the target files could be read from disk.'), '⚠️ File Read Error');
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
const git = simpleGit();
|
|
180
|
-
const isRepo = await git.checkIsRepo();
|
|
181
|
-
let currentBranch = 'main';
|
|
182
|
-
if (isRepo) {
|
|
183
|
-
try {
|
|
184
|
-
const branchSummary = await git.branch();
|
|
185
|
-
currentBranch = branchSummary.current || 'main';
|
|
186
|
-
}
|
|
187
|
-
catch { }
|
|
188
|
-
}
|
|
189
|
-
const s = spinner();
|
|
190
|
-
s.start(`Scout is analyzing problem & auto-fixing ${targetFiles.length} file${targetFiles.length > 1 ? 's' : ''}...`);
|
|
191
|
-
let fixResult;
|
|
192
|
-
try {
|
|
193
|
-
fixResult = await generateMultiCodeFix(finalPrompt, projectName, filesList, targetFilesMap, targetLang, options?.native);
|
|
194
|
-
}
|
|
195
|
-
catch (err) {
|
|
196
|
-
s.stop(chalk.red('Failed to generate AI code fix.'));
|
|
197
|
-
safeNote(chalk.red(`Error: ${err?.message || String(err)}`), '⚠️ Auto-Fix Error');
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
const modifiedFiles = [];
|
|
201
|
-
for (const item of fixResult.files) {
|
|
202
|
-
if (item.fixedCode !== undefined) {
|
|
203
|
-
const fullPath = path.resolve(cwd, item.targetFile);
|
|
204
|
-
try {
|
|
205
|
-
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
206
|
-
fs.writeFileSync(fullPath, item.fixedCode, 'utf-8');
|
|
207
|
-
modifiedFiles.push(item.targetFile);
|
|
208
|
-
}
|
|
209
|
-
catch (writeErr) {
|
|
210
|
-
console.error(`Failed to write fix to ${item.targetFile}:`, writeErr?.message);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
recordHistoryAction({
|
|
215
|
-
command: `ft fix "${finalPrompt}"`,
|
|
216
|
-
description: `Scout auto-fixed ${modifiedFiles.length} file(s): ${modifiedFiles.join(', ')}`,
|
|
217
|
-
previousBranch: currentBranch,
|
|
218
|
-
affectedFiles: modifiedFiles,
|
|
219
|
-
backups,
|
|
220
|
-
});
|
|
221
|
-
s.stop(chalk.green(`Auto-fix applied to ${modifiedFiles.length} file${modifiedFiles.length > 1 ? 's' : ''} successfully!`));
|
|
222
|
-
const filesListFormatted = modifiedFiles.map((f) => ` • \`${f}\``).join('\n');
|
|
223
|
-
const teardownContent = `
|
|
224
|
-
### 🔍 Target File(s)
|
|
225
|
-
${filesListFormatted}
|
|
226
|
-
|
|
227
|
-
### 🔴 Problem Identified
|
|
228
|
-
${fixResult.problem}
|
|
229
|
-
|
|
230
|
-
### 🛠️ How Scout Fixed It
|
|
231
|
-
${fixResult.howFixed}
|
|
232
|
-
|
|
233
|
-
---
|
|
234
|
-
*Changes applied directly to ${modifiedFiles.length} file(s)${isRepo ? ` on active branch \`${currentBranch}\`` : ''}.*
|
|
235
|
-
`.trim();
|
|
236
|
-
safeNote(renderMarkdown(teardownContent), '🛠️ Scout Auto-Fix Teardown & Explanation');
|
|
237
|
-
const actionChoice = await select({
|
|
238
|
-
message: chalk.bold('Review Scout\'s auto-fix result. What would you like to do?'),
|
|
239
|
-
options: [
|
|
240
|
-
{ value: 'keep', label: '✅ Keep Changes', hint: `Retain auto-fixed code directly on current branch (${currentBranch})` },
|
|
241
|
-
{ value: 'pr', label: '🔀 Create Pull Request', hint: 'Push fix to a new branch & open a Pull Request' },
|
|
242
|
-
{ value: 'revert', label: '↩️ Revert Changes', hint: 'Restore original code immediately' },
|
|
243
|
-
],
|
|
244
|
-
});
|
|
245
|
-
if (isCancel(actionChoice) || actionChoice === 'revert') {
|
|
246
|
-
const revSpinner = spinner();
|
|
247
|
-
revSpinner.start('Reverting Scout\'s changes...');
|
|
248
|
-
await handleUndo();
|
|
249
|
-
revSpinner.stop('Changes reverted successfully.');
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
if (actionChoice === 'pr') {
|
|
253
|
-
const prSpinner = spinner();
|
|
254
|
-
prSpinner.start('Creating Pull Request...');
|
|
255
|
-
const prRes = await createPullRequest({
|
|
256
|
-
branchPrefix: 'fix',
|
|
257
|
-
title: finalPrompt,
|
|
258
|
-
affectedFiles: modifiedFiles,
|
|
259
|
-
commitMessage: `fix: ${finalPrompt}`,
|
|
260
|
-
});
|
|
261
|
-
prSpinner.stop('Pull Request workflow processed.');
|
|
262
|
-
safeNote(`${chalk.green('✓')} ${prRes.message}\n` +
|
|
263
|
-
`💡 ${chalk.dim('You remain on active branch:')} ${chalk.cyan(currentBranch)}`, '🔀 Pull Request Status');
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
|
-
safeNote(`${chalk.green('✓')} Auto-fix retained on ${modifiedFiles.length} file(s) (Branch: ${chalk.bold.green(currentBranch)}).\n` +
|
|
267
|
-
`💡 ${chalk.dim('You can still revert these changes anytime by running:')} ${chalk.cyan('scout undo')}`, '✅ Fix Confirmed');
|
|
268
|
-
}
|
|
269
|
-
//# 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"}
|