ft-scout 2.0.9 → 3.0.1
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 +76 -19
- package/bin/src/commands/chat.d.ts.map +1 -1
- package/bin/src/commands/chat.js +113 -11
- package/bin/src/commands/chat.js.map +1 -1
- package/bin/src/commands/configCommand.d.ts.map +1 -1
- package/bin/src/commands/configCommand.js +29 -3
- package/bin/src/commands/configCommand.js.map +1 -1
- package/bin/src/commands/create.d.ts.map +1 -0
- package/bin/src/commands/create.js +163 -0
- package/bin/src/commands/create.js.map +1 -0
- package/bin/src/commands/fix.d.ts.map +1 -1
- package/bin/src/commands/fix.js +158 -31
- package/bin/src/commands/fix.js.map +1 -1
- package/bin/src/commands/history.js +1 -1
- package/bin/src/commands/history.js.map +1 -1
- package/bin/src/commands/runCommand.d.ts.map +1 -0
- package/bin/src/commands/runCommand.js +106 -0
- package/bin/src/commands/runCommand.js.map +1 -0
- package/bin/src/commands/scan.d.ts.map +1 -1
- package/bin/src/commands/scan.js +4 -1
- package/bin/src/commands/scan.js.map +1 -1
- package/bin/src/commands/undo.d.ts.map +1 -1
- package/bin/src/commands/undo.js +22 -0
- package/bin/src/commands/undo.js.map +1 -1
- package/bin/src/discovery/config.d.ts.map +1 -0
- package/bin/src/discovery/config.js +41 -0
- package/bin/src/discovery/config.js.map +1 -0
- package/bin/src/discovery/display.d.ts.map +1 -0
- package/bin/src/discovery/display.js +57 -0
- package/bin/src/discovery/display.js.map +1 -0
- package/bin/src/discovery/messages.d.ts.map +1 -0
- package/bin/src/discovery/messages.js +7 -0
- package/bin/src/discovery/messages.js.map +1 -0
- package/bin/src/discovery/signals.d.ts.map +1 -0
- package/bin/src/discovery/signals.js +33 -0
- package/bin/src/discovery/signals.js.map +1 -0
- package/bin/src/engine/llm.d.ts.map +1 -1
- package/bin/src/engine/llm.js +194 -28
- package/bin/src/engine/llm.js.map +1 -1
- package/bin/src/index.js +71 -9
- 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.map +1 -1
- package/package.json +1 -1
package/bin/src/commands/fix.js
CHANGED
|
@@ -1,12 +1,100 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { spinner, text, select, isCancel } from '@clack/prompts';
|
|
3
5
|
import { simpleGit } from 'simple-git';
|
|
4
6
|
import { loadScanReport } from './scan.js';
|
|
5
|
-
import { safeNote } from '../utils/markdown.js';
|
|
6
|
-
import { recordHistoryAction } from '../utils/config.js';
|
|
7
|
+
import { safeNote, renderMarkdown } from '../utils/markdown.js';
|
|
8
|
+
import { recordHistoryAction, loadContext } from '../utils/config.js';
|
|
9
|
+
import { generateCodeFix } from '../engine/llm.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
|
+
function findTargetFileFromPrompt(userPrompt, filesList) {
|
|
36
|
+
const lowerPrompt = userPrompt.toLowerCase();
|
|
37
|
+
for (const f of filesList) {
|
|
38
|
+
const base = path.basename(f).toLowerCase();
|
|
39
|
+
if (lowerPrompt.includes(f.toLowerCase()) || lowerPrompt.includes(base)) {
|
|
40
|
+
return f;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
7
45
|
export async function handleFix(options) {
|
|
8
|
-
const
|
|
9
|
-
|
|
46
|
+
const existingContext = loadContext();
|
|
47
|
+
const targetLang = normalizeLanguage(options?.lang) || normalizeLanguage(existingContext?.language);
|
|
48
|
+
const cwd = process.cwd();
|
|
49
|
+
const filesList = getDirectoryFiles(cwd);
|
|
50
|
+
const projectName = existingContext?.projectName || path.basename(cwd) || 'Codebase';
|
|
51
|
+
let finalPrompt = options?.prompt;
|
|
52
|
+
let specifiedTargetFile = options?.file;
|
|
53
|
+
if (!finalPrompt && options?.issue) {
|
|
54
|
+
const report = loadScanReport();
|
|
55
|
+
const issueId = Number(options.issue);
|
|
56
|
+
const targetIssue = report.find((i) => i.id === issueId) || report[0];
|
|
57
|
+
if (targetIssue) {
|
|
58
|
+
finalPrompt = `Fix issue #${targetIssue.id}: ${targetIssue.title} — ${targetIssue.description}`;
|
|
59
|
+
specifiedTargetFile = targetIssue.file;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!finalPrompt || !finalPrompt.trim()) {
|
|
63
|
+
const userPromptInput = await text({
|
|
64
|
+
message: chalk.bold('What code issue or feature would you like Scout to auto-fix?'),
|
|
65
|
+
placeholder: 'e.g. Fix null check in src/index.ts or improve error handling in auth controller',
|
|
66
|
+
validate: (val) => (!val || !val.trim() ? 'Please provide a prompt or issue description' : undefined),
|
|
67
|
+
});
|
|
68
|
+
if (isCancel(userPromptInput)) {
|
|
69
|
+
safeNote(chalk.yellow('Auto-fix operation cancelled.'), '🛠️ Scout Auto-Fix');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
finalPrompt = userPromptInput.trim();
|
|
73
|
+
}
|
|
74
|
+
// Determine target file to fix
|
|
75
|
+
let targetFile = specifiedTargetFile;
|
|
76
|
+
if (!targetFile) {
|
|
77
|
+
targetFile = findTargetFileFromPrompt(finalPrompt, filesList) || undefined;
|
|
78
|
+
}
|
|
79
|
+
if (!targetFile) {
|
|
80
|
+
targetFile =
|
|
81
|
+
filesList.find((f) => f === 'src/index.ts' || f === 'bin/src/index.ts' || f === 'src/index.js' || f === 'index.js') ||
|
|
82
|
+
filesList.find((f) => f.endsWith('.ts') || f.endsWith('.js') || f.endsWith('.py')) ||
|
|
83
|
+
filesList[0];
|
|
84
|
+
}
|
|
85
|
+
if (targetFile && !fs.existsSync(path.resolve(cwd, targetFile))) {
|
|
86
|
+
// If target file specified or found from prompt doesn't exist, offer file creation!
|
|
87
|
+
const { handleCreate } = await import('./create.js');
|
|
88
|
+
safeNote(chalk.cyan(`Target file \`${targetFile}\` does not exist yet. Switching to Scout File Creation...`), '✨ Creating New File');
|
|
89
|
+
await handleCreate(targetFile, { prompt: finalPrompt, lang: targetLang, native: options?.native });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!targetFile || !fs.existsSync(path.resolve(cwd, targetFile))) {
|
|
93
|
+
safeNote(chalk.yellow(`Could not locate a target source file to fix in this codebase.\nPlease specify a valid file name in your prompt or use --file <filename>.`), '⚠️ Target File Not Found');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const currentContent = fs.readFileSync(path.resolve(cwd, targetFile), 'utf-8');
|
|
97
|
+
// Prepare git branch setup if in a git repo
|
|
10
98
|
const git = simpleGit();
|
|
11
99
|
const isRepo = await git.checkIsRepo();
|
|
12
100
|
let currentBranch = 'main';
|
|
@@ -17,21 +105,12 @@ export async function handleFix(options) {
|
|
|
17
105
|
}
|
|
18
106
|
catch { }
|
|
19
107
|
}
|
|
20
|
-
const
|
|
21
|
-
const issueId = options?.issue ? Number(options.issue) : 1;
|
|
22
|
-
const targetIssue = report.find((i) => i.id === issueId) || report[0] || {
|
|
23
|
-
id: issueId,
|
|
24
|
-
title: 'Defensive Null Check & Exception Handling',
|
|
25
|
-
file: 'src/index.ts',
|
|
26
|
-
severity: 'high',
|
|
27
|
-
description: 'Add safety checks for undefined properties in execution pipeline.'
|
|
28
|
-
};
|
|
29
|
-
const cleanTitle = targetIssue.title
|
|
108
|
+
const cleanTitle = finalPrompt
|
|
30
109
|
.toLowerCase()
|
|
31
110
|
.replace(/[^a-z0-9]+/g, '-')
|
|
32
111
|
.replace(/^-|-$/g, '')
|
|
33
|
-
.slice(0,
|
|
34
|
-
const branchName = `ft/fix-${
|
|
112
|
+
.slice(0, 25);
|
|
113
|
+
const branchName = `ft/fix-${Date.now().toString().slice(-4)}-${cleanTitle}`;
|
|
35
114
|
if (isRepo) {
|
|
36
115
|
try {
|
|
37
116
|
await git.checkoutLocalBranch(branchName);
|
|
@@ -43,25 +122,73 @@ export async function handleFix(options) {
|
|
|
43
122
|
catch { }
|
|
44
123
|
}
|
|
45
124
|
}
|
|
125
|
+
const s = spinner();
|
|
126
|
+
s.start('Scout is analyzing problem & auto-fixing code with AI...');
|
|
127
|
+
let fixResult;
|
|
128
|
+
try {
|
|
129
|
+
fixResult = await generateCodeFix(finalPrompt, projectName, filesList, targetFile, currentContent, targetLang, options?.native);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
s.stop(chalk.red('Failed to generate AI code fix.'));
|
|
133
|
+
safeNote(chalk.red(`Error: ${err?.message || String(err)}`), '⚠️ Auto-Fix Error');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Backup original content & apply fix
|
|
137
|
+
const backups = [
|
|
138
|
+
{
|
|
139
|
+
filePath: targetFile,
|
|
140
|
+
originalContent: currentContent,
|
|
141
|
+
},
|
|
142
|
+
];
|
|
143
|
+
try {
|
|
144
|
+
fs.writeFileSync(path.resolve(cwd, targetFile), fixResult.fixedCode, 'utf-8');
|
|
145
|
+
}
|
|
146
|
+
catch (writeErr) {
|
|
147
|
+
s.stop(chalk.red('Failed to write fixed code to file.'));
|
|
148
|
+
safeNote(chalk.red(`Write error: ${writeErr?.message || String(writeErr)}`), '⚠️ File Write Error');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
46
151
|
recordHistoryAction({
|
|
47
|
-
command: `ft fix
|
|
48
|
-
description: `
|
|
152
|
+
command: `ft fix "${finalPrompt}"`,
|
|
153
|
+
description: `Scout auto-fixed ${targetFile}`,
|
|
49
154
|
branchName,
|
|
50
155
|
previousBranch: currentBranch,
|
|
51
|
-
affectedFiles: [
|
|
156
|
+
affectedFiles: [targetFile],
|
|
157
|
+
backups,
|
|
52
158
|
});
|
|
53
|
-
s.stop('
|
|
54
|
-
|
|
55
|
-
|
|
159
|
+
s.stop(chalk.green('Auto-fix generated and applied to codebase successfully!'));
|
|
160
|
+
// Display explanation teardown
|
|
161
|
+
const teardownContent = `
|
|
162
|
+
### 🔍 Target File
|
|
163
|
+
\`${targetFile}\`
|
|
164
|
+
|
|
165
|
+
### 🔴 Problem Identified
|
|
166
|
+
${fixResult.problem}
|
|
56
167
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
• Base branch preserved: ${chalk.dim(currentBranch)}
|
|
60
|
-
• Status: Staged on isolated branch awaiting review
|
|
168
|
+
### 🛠️ How Scout Fixed It
|
|
169
|
+
${fixResult.howFixed}
|
|
61
170
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
171
|
+
---
|
|
172
|
+
*Changes have been written to \`${targetFile}\`${isRepo ? ` on branch \`${branchName}\`` : ''}.*
|
|
173
|
+
`.trim();
|
|
174
|
+
safeNote(renderMarkdown(teardownContent), '🛠️ Scout Auto-Fix Teardown & Explanation');
|
|
175
|
+
// Interactive option to keep or revert changes
|
|
176
|
+
const revertChoice = await select({
|
|
177
|
+
message: chalk.bold('Review Scout\'s auto-fix result. What would you like to do?'),
|
|
178
|
+
options: [
|
|
179
|
+
{ value: 'keep', label: '✅ Keep Changes', hint: 'Retain the auto-fixed code in your project' },
|
|
180
|
+
{ value: 'revert', label: '↩️ Revert Changes', hint: 'Restore original code and branch immediately' },
|
|
181
|
+
],
|
|
182
|
+
});
|
|
183
|
+
if (isCancel(revertChoice) || revertChoice === 'revert') {
|
|
184
|
+
const revSpinner = spinner();
|
|
185
|
+
revSpinner.start('Reverting Scout\'s changes...');
|
|
186
|
+
await handleUndo();
|
|
187
|
+
revSpinner.stop('Changes reverted successfully.');
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
safeNote(`${chalk.green('✓')} Auto-fix retained on ${chalk.bold.cyan(targetFile)}.\n` +
|
|
191
|
+
`💡 ${chalk.dim('You can still revert these changes anytime by running:')} ${chalk.cyan('scout undo')}`, '✅ Fix Confirmed');
|
|
192
|
+
}
|
|
66
193
|
}
|
|
67
194
|
//# sourceMappingURL=fix.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix.js","sourceRoot":"","sources":["fix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,6 @@ export async function handleHistory() {
|
|
|
15
15
|
(item.affectedFiles && item.affectedFiles.length > 0 ? ` • Files: ${chalk.dim(item.affectedFiles.join(', '))}` : ''));
|
|
16
16
|
});
|
|
17
17
|
safeNote(logLines.join('\n\n') +
|
|
18
|
-
`\n\n${chalk.dim('Run `ft undo` to revert the last action performed by
|
|
18
|
+
`\n\n${chalk.dim('Run `ft undo` to revert the last action performed by Scout.')}`, '📜 FrontTerrain Execution History');
|
|
19
19
|
}
|
|
20
20
|
//# sourceMappingURL=history.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,QAAQ,CACN,KAAK,CAAC,MAAM,CAAC,uIAAuI,CAAC,EACrJ,mCAAmC,CACpC,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;QAC1D,OAAO,CACL,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI;YACjH,OAAO,IAAI,CAAC,WAAW,IAAI;YAC3B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACtH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CACN,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QACnB,OAAO,KAAK,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,QAAQ,CACN,KAAK,CAAC,MAAM,CAAC,uIAAuI,CAAC,EACrJ,mCAAmC,CACpC,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;QAC1D,OAAO,CACL,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI;YACjH,OAAO,IAAI,CAAC,WAAW,IAAI;YAC3B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACtH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CACN,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QACnB,OAAO,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,EAAE,EACnF,mCAAmC,CACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runCommand.js","sourceRoot":"","sources":["runCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
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,QAKpD;AAED,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAO/C;AAED,wBAAsB,UAAU,
|
|
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,QAKpD;AAED,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAO/C;AAED,wBAAsB,UAAU,kBAmE/B"}
|
package/bin/src/commands/scan.js
CHANGED
|
@@ -75,6 +75,9 @@ export async function handleScan() {
|
|
|
75
75
|
` • Detail: ${iss.description}`);
|
|
76
76
|
safeNote(`Found ${issues.length} potential issues matching past hotfix patterns:\n\n` +
|
|
77
77
|
reportLines.join('\n\n') +
|
|
78
|
-
`\n\n${chalk.
|
|
78
|
+
`\n\n${chalk.bold.green('💡 How to Auto-Fix Any Issue:')}\n` +
|
|
79
|
+
` • Auto-fix Issue #${issues[0]?.id || 1}: ${chalk.bold.cyan(`scout fix --issue ${issues[0]?.id || 1}`)}\n` +
|
|
80
|
+
` • Auto-fix with short flag: ${chalk.bold.cyan(`scout fix -i ${issues[1]?.id || 2}`)}\n` +
|
|
81
|
+
` • Custom prompt auto-fix: ${chalk.bold.cyan('scout fix "Fix null check in src/index.ts"')}`, '🔍 FrontTerrain Codebase Bug Scan');
|
|
79
82
|
}
|
|
80
83
|
//# sourceMappingURL=scan.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["scan.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"undo.d.ts","sourceRoot":"","sources":["undo.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"undo.d.ts","sourceRoot":"","sources":["undo.ts"],"names":[],"mappings":"AAQA,wBAAsB,UAAU,kBAsD/B"}
|
package/bin/src/commands/undo.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
2
4
|
import { spinner } from '@clack/prompts';
|
|
3
5
|
import { simpleGit } from 'simple-git';
|
|
4
6
|
import { popLastHistoryAction } from '../utils/config.js';
|
|
@@ -15,6 +17,26 @@ export async function handleUndo() {
|
|
|
15
17
|
const git = simpleGit();
|
|
16
18
|
const isRepo = await git.checkIsRepo();
|
|
17
19
|
let revertedNotes = `Reverted action: ${chalk.bold.cyan(lastAction.command)}\nDescription: ${lastAction.description}\n`;
|
|
20
|
+
if (lastAction.backups && lastAction.backups.length > 0) {
|
|
21
|
+
for (const backup of lastAction.backups) {
|
|
22
|
+
try {
|
|
23
|
+
const fullPath = path.resolve(process.cwd(), backup.filePath);
|
|
24
|
+
if (backup.originalContent === '__FT_WAS_NEW__') {
|
|
25
|
+
if (fs.existsSync(fullPath)) {
|
|
26
|
+
fs.unlinkSync(fullPath);
|
|
27
|
+
revertedNotes += `\n✅ Removed newly created file: ${chalk.bold.cyan(backup.filePath)}`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
fs.writeFileSync(fullPath, backup.originalContent, 'utf-8');
|
|
32
|
+
revertedNotes += `\n✅ Restored original content of file: ${chalk.bold.cyan(backup.filePath)}`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
revertedNotes += `\n⚠️ Could not restore ${backup.filePath}: ${err?.message || 'File operation error'}`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
18
40
|
if (isRepo && lastAction.previousBranch) {
|
|
19
41
|
try {
|
|
20
42
|
await git.checkout(lastAction.previousBranch);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"undo.js","sourceRoot":"","sources":["undo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAE1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC5C,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,iEAAiE,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC5G,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,aAAa,GAAG,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,kBAAkB,UAAU,CAAC,WAAW,IAAI,CAAC;IAExH,IAAI,MAAM,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC9C,aAAa,IAAI,kDAAkD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC;YAElH,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzE,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACzD,aAAa,IAAI,qCAAqC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;gBAC5F,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,aAAa,IAAI,qCAAqC,GAAG,EAAE,OAAO,IAAI,qDAAqD,EAAE,CAAC;QAChI,CAAC;IACH,CAAC;IAED,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAE7C,QAAQ,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC;AACrD,CAAC"}
|
|
1
|
+
{"version":3,"file":"undo.js","sourceRoot":"","sources":["undo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAmBD,wBAAgB,mBAAmB,IAAI,eAAe,CAiBrD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAGjE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
const DISCOVERY_DIR = path.join(os.homedir(), '.ft');
|
|
5
|
+
const DISCOVERY_FILE = path.join(DISCOVERY_DIR, 'discovery.json');
|
|
6
|
+
const DEFAULT_DISCOVERY_CONFIG = {
|
|
7
|
+
firstRunShown: false,
|
|
8
|
+
tipsEnabled: true,
|
|
9
|
+
commandCount: 0,
|
|
10
|
+
lastTipShownAt: null,
|
|
11
|
+
lastTipCommandCount: 0,
|
|
12
|
+
};
|
|
13
|
+
function ensureDiscoveryDir() {
|
|
14
|
+
if (!fs.existsSync(DISCOVERY_DIR)) {
|
|
15
|
+
fs.mkdirSync(DISCOVERY_DIR, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function loadDiscoveryConfig() {
|
|
19
|
+
if (!fs.existsSync(DISCOVERY_FILE)) {
|
|
20
|
+
return { ...DEFAULT_DISCOVERY_CONFIG };
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const raw = fs.readFileSync(DISCOVERY_FILE, 'utf-8');
|
|
24
|
+
const parsed = JSON.parse(raw);
|
|
25
|
+
return {
|
|
26
|
+
firstRunShown: typeof parsed.firstRunShown === 'boolean' ? parsed.firstRunShown : DEFAULT_DISCOVERY_CONFIG.firstRunShown,
|
|
27
|
+
tipsEnabled: typeof parsed.tipsEnabled === 'boolean' ? parsed.tipsEnabled : DEFAULT_DISCOVERY_CONFIG.tipsEnabled,
|
|
28
|
+
commandCount: typeof parsed.commandCount === 'number' ? parsed.commandCount : DEFAULT_DISCOVERY_CONFIG.commandCount,
|
|
29
|
+
lastTipShownAt: typeof parsed.lastTipShownAt === 'number' || parsed.lastTipShownAt === null ? parsed.lastTipShownAt : DEFAULT_DISCOVERY_CONFIG.lastTipShownAt,
|
|
30
|
+
lastTipCommandCount: typeof parsed.lastTipCommandCount === 'number' ? parsed.lastTipCommandCount : DEFAULT_DISCOVERY_CONFIG.lastTipCommandCount,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return { ...DEFAULT_DISCOVERY_CONFIG };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function saveDiscoveryConfig(config) {
|
|
38
|
+
ensureDiscoveryDir();
|
|
39
|
+
fs.writeFileSync(DISCOVERY_FILE, JSON.stringify(config, null, 2), 'utf-8');
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAUpB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AACrD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAElE,MAAM,wBAAwB,GAAoB;IAChD,aAAa,EAAE,KAAK;IACpB,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,CAAC;IACf,cAAc,EAAE,IAAI;IACpB,mBAAmB,EAAE,CAAC;CACvB,CAAC;AAEF,SAAS,kBAAkB;IACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO;YACL,aAAa,EAAE,OAAO,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,wBAAwB,CAAC,aAAa;YACxH,WAAW,EAAE,OAAO,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,CAAC,WAAW;YAChH,YAAY,EAAE,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,wBAAwB,CAAC,YAAY;YACnH,cAAc,EAAE,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,wBAAwB,CAAC,cAAc;YAC7J,mBAAmB,EAAE,OAAO,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,wBAAwB,CAAC,mBAAmB;SAChJ,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAuB;IACzD,kBAAkB,EAAE,CAAC;IACrB,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["display.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAUpD,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAwDzF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { loadDiscoveryConfig, saveDiscoveryConfig } from './config.js';
|
|
3
|
+
import { getTrueSignals } from './signals.js';
|
|
4
|
+
import { getFirstRunMessage, formatTipMessage } from './messages.js';
|
|
5
|
+
function printDiscoveryText(text) {
|
|
6
|
+
const lines = text.split('\n');
|
|
7
|
+
for (const line of lines) {
|
|
8
|
+
console.log(chalk.dim(`→ ${line}`));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function maybeShowDiscoveryMessage(repoContext) {
|
|
12
|
+
const config = loadDiscoveryConfig();
|
|
13
|
+
// Always increment commandCount & save config
|
|
14
|
+
const isFirstCommand = config.commandCount === 0;
|
|
15
|
+
config.commandCount++;
|
|
16
|
+
saveDiscoveryConfig(config);
|
|
17
|
+
// Guard 1: Non-TTY (piped/scripted usage)
|
|
18
|
+
if (!process.stdout.isTTY) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Guard 2: CI environment
|
|
22
|
+
if (process.env['CI'] === 'true' || process.env['CI'] === '1') {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Guard 3: Tips disabled
|
|
26
|
+
if (!config.tipsEnabled) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// First-run welcome message
|
|
30
|
+
if (!config.firstRunShown && isFirstCommand) {
|
|
31
|
+
printDiscoveryText(getFirstRunMessage());
|
|
32
|
+
config.firstRunShown = true;
|
|
33
|
+
saveDiscoveryConfig(config);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Cooldown check for occasional tips
|
|
37
|
+
const commandCountDiff = config.commandCount - config.lastTipCommandCount;
|
|
38
|
+
const timeDiff = config.lastTipShownAt !== null ? Date.now() - config.lastTipShownAt : Infinity;
|
|
39
|
+
const passesCooldown = commandCountDiff >= 15 && timeDiff >= 48 * 60 * 60 * 1000;
|
|
40
|
+
if (!passesCooldown) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Evaluate true signals
|
|
44
|
+
const trueSignals = getTrueSignals(repoContext);
|
|
45
|
+
if (trueSignals.length === 0) {
|
|
46
|
+
// Silence when no true signals apply
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Pick a random signal for variety
|
|
50
|
+
const randomIndex = Math.floor(Math.random() * trueSignals.length);
|
|
51
|
+
const selectedSignal = trueSignals[randomIndex];
|
|
52
|
+
printDiscoveryText(formatTipMessage(selectedSignal));
|
|
53
|
+
config.lastTipShownAt = Date.now();
|
|
54
|
+
config.lastTipCommandCount = config.commandCount;
|
|
55
|
+
saveDiscoveryConfig(config);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAErE,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,WAAyC;IACjF,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IAErC,8CAA8C;IAC9C,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC;IACjD,MAAM,CAAC,YAAY,EAAE,CAAC;IACtB,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,0CAA0C;IAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,cAAc,EAAE,CAAC;QAC5C,kBAAkB,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,qCAAqC;IACrC,MAAM,gBAAgB,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAC1E,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEhG,MAAM,cAAc,GAAG,gBAAgB,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACjF,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,qCAAqC;QACrC,OAAO;IACT,CAAC;IAED,mCAAmC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,cAAc,GAAG,WAAW,CAAC,WAAW,CAAE,CAAC;IAEjD,kBAAkB,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IAErD,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,YAAY,CAAC;IACjD,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function getFirstRunMessage() {
|
|
2
|
+
return "You just ran your first FT command. If you want to see what else we're building, or learn more about where this is headed, take a look at frontterrain.com — no pressure, just wanted you to know it's there.";
|
|
3
|
+
}
|
|
4
|
+
export function formatTipMessage(signal) {
|
|
5
|
+
return `${signal.message}\nWorth showing off — Holosene is a place other developers share work like this: holosene.dev`;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["messages.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB;IAChC,OAAO,+MAA+M,CAAC;AACzN,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,GAAG,MAAM,CAAC,OAAO,+FAA+F,CAAC;AAC1H,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["signals.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,qBAAqB,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC7E,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,EAAE,CAoClF"}
|