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.
Files changed (45) hide show
  1. package/README.md +76 -19
  2. package/bin/src/commands/chat.d.ts.map +1 -1
  3. package/bin/src/commands/chat.js +113 -11
  4. package/bin/src/commands/chat.js.map +1 -1
  5. package/bin/src/commands/configCommand.d.ts.map +1 -1
  6. package/bin/src/commands/configCommand.js +29 -3
  7. package/bin/src/commands/configCommand.js.map +1 -1
  8. package/bin/src/commands/create.d.ts.map +1 -0
  9. package/bin/src/commands/create.js +163 -0
  10. package/bin/src/commands/create.js.map +1 -0
  11. package/bin/src/commands/fix.d.ts.map +1 -1
  12. package/bin/src/commands/fix.js +158 -31
  13. package/bin/src/commands/fix.js.map +1 -1
  14. package/bin/src/commands/history.js +1 -1
  15. package/bin/src/commands/history.js.map +1 -1
  16. package/bin/src/commands/runCommand.d.ts.map +1 -0
  17. package/bin/src/commands/runCommand.js +106 -0
  18. package/bin/src/commands/runCommand.js.map +1 -0
  19. package/bin/src/commands/scan.d.ts.map +1 -1
  20. package/bin/src/commands/scan.js +4 -1
  21. package/bin/src/commands/scan.js.map +1 -1
  22. package/bin/src/commands/undo.d.ts.map +1 -1
  23. package/bin/src/commands/undo.js +22 -0
  24. package/bin/src/commands/undo.js.map +1 -1
  25. package/bin/src/discovery/config.d.ts.map +1 -0
  26. package/bin/src/discovery/config.js +41 -0
  27. package/bin/src/discovery/config.js.map +1 -0
  28. package/bin/src/discovery/display.d.ts.map +1 -0
  29. package/bin/src/discovery/display.js +57 -0
  30. package/bin/src/discovery/display.js.map +1 -0
  31. package/bin/src/discovery/messages.d.ts.map +1 -0
  32. package/bin/src/discovery/messages.js +7 -0
  33. package/bin/src/discovery/messages.js.map +1 -0
  34. package/bin/src/discovery/signals.d.ts.map +1 -0
  35. package/bin/src/discovery/signals.js +33 -0
  36. package/bin/src/discovery/signals.js.map +1 -0
  37. package/bin/src/engine/llm.d.ts.map +1 -1
  38. package/bin/src/engine/llm.js +194 -28
  39. package/bin/src/engine/llm.js.map +1 -1
  40. package/bin/src/index.js +71 -9
  41. package/bin/src/index.js.map +1 -1
  42. package/bin/src/utils/branding.js +1 -1
  43. package/bin/src/utils/config.d.ts.map +1 -1
  44. package/bin/src/utils/config.js.map +1 -1
  45. package/package.json +1 -1
@@ -1,12 +1,100 @@
1
1
  import chalk from 'chalk';
2
- import { spinner } from '@clack/prompts';
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 s = spinner();
9
- s.start('Preparing automated fix workflow...');
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 report = loadScanReport();
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, 30);
34
- const branchName = `ft/fix-${targetIssue.id}-${cleanTitle}`;
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 --issue ${targetIssue.id}`,
48
- description: `Created branch ${branchName} for issue #${targetIssue.id}: ${targetIssue.title}`,
152
+ command: `ft fix "${finalPrompt}"`,
153
+ description: `Scout auto-fixed ${targetFile}`,
49
154
  branchName,
50
155
  previousBranch: currentBranch,
51
- affectedFiles: [targetIssue.file],
156
+ affectedFiles: [targetFile],
157
+ backups,
52
158
  });
53
- s.stop('Fix branch created and changes staged.');
54
- safeNote(`Fix staged for ${chalk.bold.yellow(`Issue #${targetIssue.id}`)}: ${targetIssue.title}
55
- Target File: ${chalk.cyan(targetIssue.file)}
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
- ${chalk.bold.green('git status:')}
58
- • Branch created: ${chalk.bold.cyan(branchName)}
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
- ${chalk.bold.magenta('Next Steps:')}
63
- 1. Review changes locally on branch ${chalk.cyan(branchName)}
64
- 2. Push & open Draft PR: ${chalk.dim(`git push origin ${branchName}`)}
65
- 3. Revert changes anytime with: ${chalk.cyan('ft undo')}`, '🛠️ FrontTerrain Automated Fix');
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":"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"}
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 FT.')}`, '📜 FrontTerrain Execution History');
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,0DAA0D,CAAC,EAAE,EAChF,mCAAmC,CACpC,CAAC;AACJ,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,kBAgE/B"}
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"}
@@ -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.dim('Run `ft fix --issue <id>` to create a fix branch and stage changes.')}`, '🔍 FrontTerrain Codebase Bug Scan');
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":"AAMA,wBAAsB,UAAU,kBAmC/B"}
1
+ {"version":3,"file":"undo.d.ts","sourceRoot":"","sources":["undo.ts"],"names":[],"mappings":"AAQA,wBAAsB,UAAU,kBAsD/B"}
@@ -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"}