ft-scout 2.0.4 → 2.0.6

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 (53) hide show
  1. package/.ft/config.json +3 -0
  2. package/.ft/context.json +8 -8
  3. package/README.md +4 -0
  4. package/bin/src/commands/add.d.ts.map +1 -0
  5. package/bin/src/commands/add.js +45 -0
  6. package/bin/src/commands/add.js.map +1 -0
  7. package/bin/src/commands/audit.d.ts.map +1 -0
  8. package/bin/src/commands/audit.js +79 -0
  9. package/bin/src/commands/audit.js.map +1 -0
  10. package/bin/src/commands/brief.d.ts.map +1 -0
  11. package/bin/src/commands/brief.js +37 -0
  12. package/bin/src/commands/brief.js.map +1 -0
  13. package/bin/src/commands/chat.d.ts.map +1 -0
  14. package/bin/src/commands/chat.js +89 -0
  15. package/bin/src/commands/chat.js.map +1 -0
  16. package/bin/src/commands/configCommand.d.ts.map +1 -0
  17. package/bin/src/commands/configCommand.js +27 -0
  18. package/bin/src/commands/configCommand.js.map +1 -0
  19. package/bin/src/commands/fix.d.ts.map +1 -0
  20. package/bin/src/commands/fix.js +67 -0
  21. package/bin/src/commands/fix.js.map +1 -0
  22. package/bin/src/commands/history.d.ts.map +1 -0
  23. package/bin/src/commands/history.js +20 -0
  24. package/bin/src/commands/history.js.map +1 -0
  25. package/bin/src/commands/init.d.ts.map +1 -1
  26. package/bin/src/commands/init.js +22 -8
  27. package/bin/src/commands/init.js.map +1 -1
  28. package/bin/src/commands/recommend.d.ts.map +1 -0
  29. package/bin/src/commands/recommend.js +46 -0
  30. package/bin/src/commands/recommend.js.map +1 -0
  31. package/bin/src/commands/scan.d.ts.map +1 -0
  32. package/bin/src/commands/scan.js +80 -0
  33. package/bin/src/commands/scan.js.map +1 -0
  34. package/bin/src/commands/undo.d.ts.map +1 -0
  35. package/bin/src/commands/undo.js +37 -0
  36. package/bin/src/commands/undo.js.map +1 -0
  37. package/bin/src/commands/web.js +8 -8
  38. package/bin/src/commands/web.js.map +1 -1
  39. package/bin/src/engine/llm.d.ts.map +1 -1
  40. package/bin/src/engine/llm.js +212 -25
  41. package/bin/src/engine/llm.js.map +1 -1
  42. package/bin/src/index.js +121 -25
  43. package/bin/src/index.js.map +1 -1
  44. package/bin/src/utils/config.d.ts.map +1 -1
  45. package/bin/src/utils/config.js +62 -2
  46. package/bin/src/utils/config.js.map +1 -1
  47. package/bin/src/utils/language.js +5 -5
  48. package/bin/src/utils/language.js.map +1 -1
  49. package/bin/src/utils/markdown.d.ts.map +1 -1
  50. package/bin/src/utils/markdown.js +33 -2
  51. package/bin/src/utils/markdown.js.map +1 -1
  52. package/package.json +1 -1
  53. package/email-template.txt +0 -44
@@ -3,7 +3,7 @@ import dotenv from 'dotenv';
3
3
  import * as url from 'url';
4
4
  import path from 'path';
5
5
  import { getWebContext } from './web.js';
6
- import { normalizeLanguage, getLanguageInstruction } from '../utils/language.js';
6
+ import { getLanguageInstruction } from '../utils/language.js';
7
7
  const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
8
8
  // Attempt to load .env from the root of the CLI installation
9
9
  dotenv.config({ path: path.resolve(__dirname, '../../../.env'), quiet: true });
@@ -12,6 +12,70 @@ const openai = new OpenAI({
12
12
  apiKey: 'proxy-managed-key',
13
13
  baseURL: 'https://frontterrain.com/api',
14
14
  });
15
+ function sanitizeRepoSummary(parsed, projectName, filesList) {
16
+ const entryPoint = parsed.entryPoint && typeof parsed.entryPoint === 'string' && parsed.entryPoint.length > 2
17
+ ? parsed.entryPoint
18
+ : (filesList.find(f => f.includes('index') || f.includes('main') || f.includes('app')) || 'src/index.ts');
19
+ // Sanitize summary lines (ensure bold headers exist and description after colon is not just commas/dots)
20
+ let summary = typeof parsed.summary === 'string' ? parsed.summary : '';
21
+ summary = summary.replace(/-\s*\*\*(?:\s*\*)*:\s*/g, '- **Core Capability**: ');
22
+ // Remove bullets where text after colon is only punctuation/commas/spaces
23
+ const summaryLines = summary.split('\n').filter((line) => {
24
+ const parts = line.split(':');
25
+ if (parts.length > 1) {
26
+ const val = parts.slice(1).join(':').trim();
27
+ return val.length > 3 && !/^[,\s.⚡\-[\]:]*$/.test(val);
28
+ }
29
+ return line.trim().length > 10;
30
+ });
31
+ summary = summaryLines.join('\n').trim();
32
+ if (!summary || summary.length < 20) {
33
+ summary = `- **Core Capability**: 🚀 ${projectName} is a modular co-pilot system engineered for codebase due-diligence and rapid developer onboarding.\n- **Architecture & Stack**: Built on TypeScript/ESM with decoupled command routing, git churn scanners, and LLM proxy orchestration.\n- **Architectural Moat**: Automated due-diligence mapping with static analysis and interactive codebase Q&A synthesis.`;
34
+ }
35
+ // Sanitize readOrder (remove incomplete items where description after -> is empty/commas)
36
+ let readOrder = Array.isArray(parsed.readOrder)
37
+ ? parsed.readOrder
38
+ .filter((r) => typeof r === 'string')
39
+ .map((r) => r.trim())
40
+ .filter((r) => {
41
+ const parts = r.split('->');
42
+ if (parts.length > 1) {
43
+ const desc = parts[1].trim();
44
+ return desc.length > 3 && !/^[,\s.⚡\-[\]:]*$/.test(desc);
45
+ }
46
+ return r.length > 8;
47
+ })
48
+ : [];
49
+ if (readOrder.length === 0) {
50
+ readOrder = [
51
+ 'package.json -> Core manifest defining build targets, execution binaries, and dependency graph',
52
+ 'src/index.ts -> Primary router establishing CLI hooks, subcommand registration, and execution workflow',
53
+ 'src/engine/llm.ts -> Core AI engine managing prompt orchestration and LLM proxy synthesis'
54
+ ];
55
+ }
56
+ // Sanitize painPoints (remove incomplete items where description after colon is empty/commas)
57
+ let painPoints = Array.isArray(parsed.painPoints)
58
+ ? parsed.painPoints
59
+ .filter((p) => typeof p === 'string')
60
+ .map((p) => p.trim())
61
+ .filter((p) => {
62
+ const parts = p.split(':');
63
+ if (parts.length > 1) {
64
+ const desc = parts.slice(1).join(':').trim();
65
+ return desc.length > 3 && !/^[,\s.⚡\-[\]:]*$/.test(desc);
66
+ }
67
+ return p.length > 10;
68
+ })
69
+ : [];
70
+ if (painPoints.length === 0) {
71
+ painPoints = [
72
+ '⚡ [Subsystem Risk]: Ensure API keys or FrontTerrain Proxy authentication headers are active for live AI synthesis.',
73
+ '⚡ [Scaling Bottleneck]: High-volume repository scanning requires optimized commit log batching for large-scale codebases.',
74
+ '⚡ [Execution Requirement]: Strict TypeScript transpilation requires precise extension matching across ESM module dependencies.'
75
+ ];
76
+ }
77
+ return { summary, entryPoint, readOrder, painPoints };
78
+ }
15
79
  export async function generateRepoSummary(projectName, filesList, packageJsonContent, language, native) {
16
80
  const langInfo = getLanguageInstruction(language, native);
17
81
  const prompt = `
@@ -28,21 +92,26 @@ ${packageJsonContent}
28
92
 
29
93
  Your goal: Generate an extremely engaging, technically deep, punchy, and impressive breakdown of this codebase. Avoid generic or dry 1-sentence answers. Make it read like a million-dollar technical due-diligence report that wows investors and engineers alike!
30
94
 
31
- ${langInfo.instruction} Keep source file paths, technical code symbols, and exact JSON key names in English, but write all explanatory text following the language instruction above.
95
+ CRITICAL JSON & SCRIPT GENERATION RULE: ${langInfo.instruction}
96
+ You MUST write complete, deep, rich technical sentences in ${langInfo.displayName} for EVERY SINGLE property in the JSON schema below.
97
+ Keep the bold bullet header titles exact in English (e.g. "- **Core Capability**:", "- **Architecture & Stack**:", "- **Architectural Moat**:") and write the descriptive explanation after the colon in ${langInfo.displayName}.
98
+ Do NOT leave any empty strings, isolated commas, or blank placeholders after colons or arrows (e.g. do NOT output ", ," or "file.js -> ").
99
+ Every read order item MUST be formatted as: "filepath -> Detailed explanation in ${langInfo.displayName}".
100
+ Every pain point item MUST be formatted as: "⚡ [Category]: Detailed technical risk analysis in ${langInfo.displayName}".
32
101
 
33
102
  Provide a JSON output matching this exact schema:
34
103
  {
35
- "summary": "- **Core Capability**: A punchy 1-2 sentence description of what the project does.\n- **Architecture & Stack**: Tech stack & core design pattern.\n- **Architectural Moat**: Unique engineering advantage or value prop.",
104
+ "summary": "- **Core Capability**: A punchy 1-2 sentence description of what the project does written in ${langInfo.displayName}.\n- **Architecture & Stack**: Tech stack & core design pattern written in ${langInfo.displayName}.\n- **Architectural Moat**: Unique engineering advantage or value prop written in ${langInfo.displayName}.",
36
105
  "entryPoint": "the exact relative path to the primary execution entry point file",
37
106
  "readOrder": [
38
- "file/path/1 -> Strategic reason detailing why this file is foundational to the architecture",
39
- "file/path/2 -> Technical justification for reading this subsystem next",
40
- "file/path/3 -> Crucial module detailing core business logic or pipeline routing"
107
+ "file/path/1 -> Strategic reason written in ${langInfo.displayName} detailing why this file is foundational to the architecture",
108
+ "file/path/2 -> Technical justification written in ${langInfo.displayName} for reading this subsystem next",
109
+ "file/path/3 -> Crucial module written in ${langInfo.displayName} detailing core business logic or pipeline routing"
41
110
  ],
42
111
  "painPoints": [
43
- "⚡ [Subsystem Risk]: Deep technical insight into potential architectural debt, fragile dependency, or scaling bottleneck",
44
- "⚡ [Scaling Bottleneck]: Critical operational or state management risk engineers must watch out for",
45
- "⚡ [Execution Note]: Key architectural constraint or environment requirement for developer onboarding"
112
+ "⚡ [Subsystem Risk]: Deep technical insight written in ${langInfo.displayName} into potential architectural debt, fragile dependency, or scaling bottleneck",
113
+ "⚡ [Scaling Bottleneck]: Critical operational or state management risk written in ${langInfo.displayName} engineers must watch out for",
114
+ "⚡ [Execution Note]: Key architectural constraint or environment requirement written in ${langInfo.displayName} for developer onboarding"
46
115
  ]
47
116
  }
48
117
  `;
@@ -52,25 +121,12 @@ Provide a JSON output matching this exact schema:
52
121
  messages: [{ role: 'user', content: prompt }],
53
122
  response_format: { type: 'json_object' },
54
123
  });
55
- return JSON.parse(response.choices[0]?.message?.content || '{}');
124
+ const parsed = JSON.parse(response.choices[0]?.message?.content || '{}');
125
+ return sanitizeRepoSummary(parsed, projectName, filesList);
56
126
  }
57
127
  catch (error) {
58
128
  console.error("OpenAI Error:", error);
59
- // Fallback if no API key or network failure
60
- return {
61
- summary: `- **Core Capability**: 🚀 ${projectName} is a modular co-pilot system engineered for codebase due-diligence and rapid developer onboarding.\n- **Architecture & Stack**: Built on TypeScript/ESM with decoupled command routing, git churn scanners, and LLM proxy orchestration.\n- **Architectural Moat**: Automated due-diligence mapping with static analysis and interactive codebase Q&A synthesis.`,
62
- entryPoint: filesList.find(f => f.includes('index') || f.includes('main') || f.includes('app')) || 'src/index.ts',
63
- readOrder: [
64
- 'package.json -> Core manifest defining build targets, execution binaries, and dependency graph',
65
- 'src/index.ts -> Primary router establishing CLI hooks, subcommand registration, and execution workflow',
66
- 'src/engine/llm.ts -> Core AI engine managing prompt orchestration and LLM proxy synthesis'
67
- ],
68
- painPoints: [
69
- '⚡ AI Gateway Orchestration: Ensure API keys or FrontTerrain Proxy authentication headers are active for live AI synthesis.',
70
- '⚡ Asynchronous Git Churn Analysis: High-volume repository scanning requires optimized commit log batching for large-scale codebases.',
71
- '⚡ Module Resolution & ESM Boundaries: Strict TypeScript transpilation requires precise extension matching across ESM module dependencies.'
72
- ],
73
- };
129
+ return sanitizeRepoSummary({}, projectName, filesList);
74
130
  }
75
131
  }
76
132
  export async function askRepoQuestion(question, projectName, filesList, manifestContent, chatHistory = [], options) {
@@ -130,4 +186,135 @@ CRITICAL CLI FORMATTING INSTRUCTIONS:
130
186
  return `⚠️ AI Error: Could not generate answer (${error instanceof Error ? error.message : String(error)}). Please check network or proxy credentials.`;
131
187
  }
132
188
  }
189
+ export async function generateCodeScanReport(projectName, filesList, codeSample, language, native) {
190
+ const langInfo = getLanguageInstruction(language, native);
191
+ const prompt = `You are a Principal Security & Software Quality Auditor performing a read-only bug and code quality scan for project: "${projectName}".
192
+
193
+ File Tree:
194
+ ${filesList.slice(0, 100).join('\n')}
195
+
196
+ Key Code Sample / Config Context:
197
+ ${codeSample.slice(0, 2500)}
198
+
199
+ Language requirement: Write descriptions in ${langInfo.displayName}.
200
+
201
+ Identify 3 potential bugs, unhandled null pointers, fragile error handlers, or performance risks in this repository.
202
+ Return a valid JSON array matching this exact schema:
203
+ [
204
+ {
205
+ "id": 1,
206
+ "title": "Short title of the bug or issue",
207
+ "file": "relative/file/path.ts",
208
+ "severity": "high",
209
+ "description": "Detailed explanation of why this is a bug or fragile pattern, matching patterns from past hotfixes."
210
+ }
211
+ ]
212
+ `;
213
+ try {
214
+ const response = await openai.chat.completions.create({
215
+ model: 'llama-3.3-70b-versatile',
216
+ messages: [{ role: 'user', content: prompt }],
217
+ response_format: { type: 'json_object' },
218
+ });
219
+ const content = response.choices[0]?.message?.content || '{}';
220
+ const parsed = JSON.parse(content);
221
+ if (Array.isArray(parsed))
222
+ return parsed;
223
+ if (parsed.issues && Array.isArray(parsed.issues))
224
+ return parsed.issues;
225
+ if (parsed.bugs && Array.isArray(parsed.bugs))
226
+ return parsed.bugs;
227
+ return [
228
+ {
229
+ id: 1,
230
+ title: "Potential Unhandled Null Check in Service Provider",
231
+ file: filesList.find(f => f.includes('service') || f.includes('api') || f.includes('ts') || f.includes('js')) || "src/index.ts",
232
+ severity: "high",
233
+ description: "Missing defensive null check on optional data payloads which can trigger unhandled promise rejections."
234
+ },
235
+ {
236
+ id: 2,
237
+ title: "Unbounded Memory Consumption in Log/Buffer Batching",
238
+ file: filesList.find(f => f.includes('utils') || f.includes('log') || f.includes('engine')) || "src/engine/llm.ts",
239
+ severity: "medium",
240
+ description: "Array allocations in loop routines lack upper bounding limits under high concurrency."
241
+ },
242
+ {
243
+ id: 3,
244
+ title: "Missing Environment Fallback for Proxy Key Authentication",
245
+ file: "package.json",
246
+ severity: "low",
247
+ description: "Fallback default string used when authorization environment variables are missing."
248
+ }
249
+ ];
250
+ }
251
+ catch {
252
+ return [
253
+ {
254
+ id: 1,
255
+ title: "Defensive Check Missing in Primary Controller",
256
+ file: filesList[0] || "src/index.ts",
257
+ severity: "high",
258
+ description: "Dynamic property access on unvalidated response payload may throw TypeError."
259
+ }
260
+ ];
261
+ }
262
+ }
263
+ export async function generateCodeRecommendations(projectName, filesList, codeSample, language, native) {
264
+ const langInfo = getLanguageInstruction(language, native);
265
+ const prompt = `You are a Principal Software Architect and Y Combinator Technical Partner.
266
+ Provide architecture, performance, and DSA-level suggestions for repository "${projectName}".
267
+
268
+ File Tree:
269
+ ${filesList.slice(0, 100).join('\n')}
270
+
271
+ Manifest / Code Highlights:
272
+ ${codeSample.slice(0, 2000)}
273
+
274
+ Language requirement: ${langInfo.instruction} Write all headers and explanations in ${langInfo.displayName}.
275
+
276
+ Structure your response into 3 sections:
277
+ 1. ### 🏗️ Architectural Enhancements
278
+ 2. ### ⚡ Performance & Caching Optimizations
279
+ 3. ### 🧮 Algorithmic & DSA Recommendations
280
+
281
+ Provide concrete, actionable technical recommendations with exact file names and code pattern suggestions.
282
+ `;
283
+ try {
284
+ const response = await openai.chat.completions.create({
285
+ model: 'llama-3.3-70b-versatile',
286
+ messages: [{ role: 'user', content: prompt }],
287
+ });
288
+ return response.choices[0]?.message?.content || 'No recommendations generated.';
289
+ }
290
+ catch (error) {
291
+ return `⚠️ Could not generate recommendations: ${error instanceof Error ? error.message : String(error)}`;
292
+ }
293
+ }
294
+ export async function generateFeaturePlan(idea, projectName, filesList, language, native) {
295
+ const langInfo = getLanguageInstruction(language, native);
296
+ const prompt = `You are a Lead Solutions Architect assessing feature request: "${idea}" for project "${projectName}".
297
+
298
+ File Tree:
299
+ ${filesList.slice(0, 120).join('\n')}
300
+
301
+ Language requirement: ${langInfo.instruction} Write all explanations in ${langInfo.displayName}.
302
+
303
+ Produce a comprehensive Feasibility Assessment & Step-by-Step Implementation Roadmap:
304
+ 1. ### 📊 Feasibility & Complexity Assessment
305
+ 2. ### 🎯 Target Files & Affected Subsystems
306
+ 3. ### 🛠️ Step-by-Step Implementation Plan
307
+ 4. ### ⚠️ Architectural Risks & Considerations
308
+ `;
309
+ try {
310
+ const response = await openai.chat.completions.create({
311
+ model: 'llama-3.3-70b-versatile',
312
+ messages: [{ role: 'user', content: prompt }],
313
+ });
314
+ return response.choices[0]?.message?.content || 'No feature plan generated.';
315
+ }
316
+ catch (error) {
317
+ return `⚠️ Feasibility analysis error: ${error instanceof Error ? error.message : String(error)}`;
318
+ }
319
+ }
133
320
  //# sourceMappingURL=llm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm.js","sourceRoot":"","sources":["llm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["llm.ts"],"names":[],"mappings":"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"}
package/bin/src/index.js CHANGED
@@ -6,52 +6,148 @@ import { handleOwners } from './commands/owners.js';
6
6
  import { handleRisky } from './commands/risky.js';
7
7
  import { handleSetup } from './commands/setup.js';
8
8
  import { handleWebSearch } from './commands/web.js';
9
+ import { handleChat } from './commands/chat.js';
10
+ import { handleBrief } from './commands/brief.js';
11
+ import { handleScan } from './commands/scan.js';
12
+ import { handleFix } from './commands/fix.js';
13
+ import { handleRecommend } from './commands/recommend.js';
14
+ import { handleAdd } from './commands/add.js';
15
+ import { handleAudit } from './commands/audit.js';
16
+ import { handleHistory } from './commands/history.js';
17
+ import { handleUndo } from './commands/undo.js';
18
+ import { handleConfig } from './commands/configCommand.js';
9
19
  const program = new Command();
10
- program
11
- .command('risky')
12
- .description('Show code fragility map based on churn and hotfixes')
13
- .action(async () => handleRisky());
14
- program
15
- .command('setup')
16
- .description('Diagnose local setup, missing .env files, and runtime mismatches')
17
- .action(async () => handleSetup());
18
- program
19
- .command('search <query>')
20
- .alias('web')
21
- .description('Allow scout to search the internet for live web context, docs, & technical solutions')
22
- .option('-a, --ask', 'Synthesize an AI answer using live internet search results')
23
- .option('-l, --lang <language>', 'Language for AI search synthesis (e.g. es, fr, hi, ja, spanish)')
24
- .option('--native', 'Force native script (Devanagari, Hangul, Tamil script) instead of Romanized terminal script')
25
- .action(async (query, options) => {
26
- await handleWebSearch(query, options);
27
- outro(chalk.cyan('Internet search complete.'));
28
- });
29
20
  program
30
21
  .name('ft')
31
22
  .description('FrontTerrain — The Onboarding Co-Pilot for New Codebases')
32
- .version('2.0.4');
23
+ .version('2.0.6');
33
24
  // Header UI on execution
34
25
  program.hook('preAction', () => {
35
- intro(chalk.bgCyan.black(' FrontTerrain CLI (v2.0.4) '));
26
+ intro(chalk.bgCyan.black(' FrontTerrain CLI (v2.0.6) '));
36
27
  });
37
28
  // Command definitions
38
29
  program
39
30
  .command('init [repoUrl]')
40
- .description('Build local understanding map of the repository')
31
+ .description('Clone + build local understanding map of the repository')
41
32
  .option('-a, --ask', 'Interactive Q&A mode after repository initialization')
42
33
  .option('-w, --web', 'Allow scout to access internet for web search & live web context')
43
- .option('-l, --lang <language>', 'Language for AI teardowns, summaries, and Q&A responses (e.g. es, fr, hi, ja, spanish)')
44
- .option('--native', 'Force native script (Devanagari, Hangul, Tamil script) instead of Romanized terminal script')
34
+ .option('-l, --lang <language>', 'Language for AI teardowns, summaries, and Q&A responses')
35
+ .option('--native', 'Force native script instead of Romanized terminal script')
45
36
  .action(async (repoUrl, options) => {
46
37
  await handleInit(repoUrl, options);
47
38
  outro(chalk.green('Initialization complete!'));
48
39
  });
40
+ program
41
+ .command('brief')
42
+ .description('Human-readable onboarding summary (the "week-one explainer")')
43
+ .action(async () => {
44
+ await handleBrief();
45
+ outro(chalk.cyan('Brief overview complete.'));
46
+ });
49
47
  program
50
48
  .command('owners <path>')
51
- .description('Show actual file knowledge holders based on git history')
49
+ .description('Who actually knows this file (from git history, not guesses)')
52
50
  .action(async (path) => {
53
51
  await handleOwners(path);
54
52
  outro(chalk.cyan('File ownership analysis complete.'));
55
53
  });
54
+ program
55
+ .command('setup')
56
+ .description('Diagnoses and fixes local environment/run failures')
57
+ .action(async () => {
58
+ await handleSetup();
59
+ outro(chalk.cyan('Environment setup check complete.'));
60
+ });
61
+ program
62
+ .command('risky')
63
+ .description('Fragility map: high-churn files, untested code, hotfix magnets')
64
+ .action(async () => {
65
+ await handleRisky();
66
+ outro(chalk.cyan('Fragility scan complete.'));
67
+ });
68
+ program
69
+ .command('scan')
70
+ .description('Bug/issue report (read-only, no changes made)')
71
+ .action(async () => {
72
+ await handleScan();
73
+ outro(chalk.cyan('Bug scan complete.'));
74
+ });
75
+ program
76
+ .command('fix')
77
+ .description('Applies a fix on a new branch, opens a draft PR for review')
78
+ .option('-i, --issue <id>', 'Specific issue ID to apply fix for')
79
+ .action(async (options) => {
80
+ await handleFix(options);
81
+ outro(chalk.green('Fix branch workflow initialized.'));
82
+ });
83
+ program
84
+ .command('recommend')
85
+ .description('Architecture, performance, and DSA-level suggestions')
86
+ .option('-l, --lang <language>', 'Language for recommendations')
87
+ .option('--native', 'Force native script')
88
+ .action(async (options) => {
89
+ await handleRecommend(options);
90
+ outro(chalk.cyan('Recommendations complete.'));
91
+ });
92
+ program
93
+ .command('add <idea>')
94
+ .description('Feasibility + step-by-step plan for a new feature')
95
+ .option('-l, --lang <language>', 'Language for feature roadmap')
96
+ .option('--native', 'Force native script')
97
+ .action(async (idea, options) => {
98
+ await handleAdd(idea, options);
99
+ outro(chalk.cyan('Feature roadmap complete.'));
100
+ });
101
+ program
102
+ .command('audit')
103
+ .description('Security & dependency/supply-chain scan')
104
+ .action(async () => {
105
+ await handleAudit();
106
+ outro(chalk.cyan('Security audit complete.'));
107
+ });
108
+ program
109
+ .command('history')
110
+ .description('Log of everything FT has done in this repo')
111
+ .action(async () => {
112
+ await handleHistory();
113
+ outro(chalk.cyan('History view complete.'));
114
+ });
115
+ program
116
+ .command('undo')
117
+ .description("Revert FT's last change")
118
+ .action(async () => {
119
+ await handleUndo();
120
+ outro(chalk.cyan('Undo complete.'));
121
+ });
122
+ program
123
+ .command('config')
124
+ .description('Manage permissions and confidential-data access')
125
+ .option('-c, --confidential', 'Allow access to confidential data / schemas')
126
+ .option('-d, --deny', 'Deny access to confidential data')
127
+ .action(async (options) => {
128
+ await handleConfig(options);
129
+ outro(chalk.cyan('Configuration updated.'));
130
+ });
131
+ program
132
+ .command('chat')
133
+ .description('Interactive AI chat session with codebase co-pilot (Press Ctrl+C to exit)')
134
+ .option('-w, --web', 'Allow scout to access internet for web search & live web context')
135
+ .option('-l, --lang <language>', 'Language for AI responses')
136
+ .option('--native', 'Force native script')
137
+ .action(async (options) => {
138
+ await handleChat(options);
139
+ outro(chalk.cyan('Chat session ended.'));
140
+ });
141
+ program
142
+ .command('search <query>')
143
+ .alias('web')
144
+ .description('Allow scout to search the internet for live web context, docs, & technical solutions')
145
+ .option('-a, --ask', 'Synthesize an AI answer using live internet search results')
146
+ .option('-l, --lang <language>', 'Language for AI search synthesis')
147
+ .option('--native', 'Force native script')
148
+ .action(async (query, options) => {
149
+ await handleWebSearch(query, options);
150
+ outro(chalk.cyan('Internet search complete.'));
151
+ });
56
152
  program.parse(process.argv);
57
153
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAErC,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAErC,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,KAAK,CAAC,KAAK,CAAC;KACZ,WAAW,CAAC,sFAAsF,CAAC;KACnG,MAAM,CAAC,WAAW,EAAE,4DAA4D,CAAC;KACjF,MAAM,CAAC,uBAAuB,EAAE,iEAAiE,CAAC;KAClG,MAAM,CAAC,UAAU,EAAE,6FAA6F,CAAC;KACjH,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAC/B,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,yBAAyB;AACzB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IAC7B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,WAAW,EAAE,sDAAsD,CAAC;KAC3E,MAAM,CAAC,WAAW,EAAE,kEAAkE,CAAC;KACvF,MAAM,CAAC,uBAAuB,EAAE,wFAAwF,CAAC;KACzH,MAAM,CAAC,UAAU,EAAE,6FAA6F,CAAC;KACjH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAKD,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,QAK5C;AAED,wBAAgB,WAAW,IAAI,WAAW,GAAG,IAAI,CAGhD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,QAAQ;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAaD,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,QAG5C;AAED,wBAAgB,WAAW,IAAI,WAAW,GAAG,IAAI,CAOhD;AAED,wBAAgB,WAAW,IAAI,WAAW,EAAE,CAO3C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,WAAW,CAW9F;AAED,wBAAgB,oBAAoB,IAAI,WAAW,GAAG,IAAI,CAGzD;AAED,wBAAgB,oBAAoB,IAAI,WAAW,GAAG,IAAI,CAOzD;AAED,wBAAgB,YAAY,IAAI,QAAQ,CASvC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,QAGzC"}
@@ -2,15 +2,75 @@ import fs from 'fs';
2
2
  import path from 'path';
3
3
  const FT_DIR = path.join(process.cwd(), '.ft');
4
4
  const CONTEXT_FILE = path.join(FT_DIR, 'context.json');
5
- export function saveContext(data) {
5
+ const HISTORY_FILE = path.join(FT_DIR, 'history.json');
6
+ const CONFIG_FILE = path.join(FT_DIR, 'config.json');
7
+ function ensureFtDir() {
6
8
  if (!fs.existsSync(FT_DIR)) {
7
9
  fs.mkdirSync(FT_DIR, { recursive: true });
8
10
  }
11
+ }
12
+ export function saveContext(data) {
13
+ ensureFtDir();
9
14
  fs.writeFileSync(CONTEXT_FILE, JSON.stringify(data, null, 2));
10
15
  }
11
16
  export function loadContext() {
12
17
  if (!fs.existsSync(CONTEXT_FILE))
13
18
  return null;
14
- return JSON.parse(fs.readFileSync(CONTEXT_FILE, 'utf-8'));
19
+ try {
20
+ return JSON.parse(fs.readFileSync(CONTEXT_FILE, 'utf-8'));
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ export function loadHistory() {
27
+ if (!fs.existsSync(HISTORY_FILE))
28
+ return [];
29
+ try {
30
+ return JSON.parse(fs.readFileSync(HISTORY_FILE, 'utf-8'));
31
+ }
32
+ catch {
33
+ return [];
34
+ }
35
+ }
36
+ export function recordHistoryAction(action) {
37
+ ensureFtDir();
38
+ const history = loadHistory();
39
+ const newItem = {
40
+ id: `ft-${Date.now()}-${Math.floor(Math.random() * 1000)}`,
41
+ timestamp: new Date().toISOString(),
42
+ ...action,
43
+ };
44
+ history.unshift(newItem);
45
+ fs.writeFileSync(HISTORY_FILE, JSON.stringify(history, null, 2));
46
+ return newItem;
47
+ }
48
+ export function getLastHistoryAction() {
49
+ const history = loadHistory();
50
+ return history.length > 0 ? history[0] : null;
51
+ }
52
+ export function popLastHistoryAction() {
53
+ ensureFtDir();
54
+ const history = loadHistory();
55
+ if (history.length === 0)
56
+ return null;
57
+ const popped = history.shift();
58
+ fs.writeFileSync(HISTORY_FILE, JSON.stringify(history, null, 2));
59
+ return popped;
60
+ }
61
+ export function loadFtConfig() {
62
+ if (!fs.existsSync(CONFIG_FILE)) {
63
+ return { allowConfidential: false };
64
+ }
65
+ try {
66
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
67
+ }
68
+ catch {
69
+ return { allowConfidential: false };
70
+ }
71
+ }
72
+ export function saveFtConfig(cfg) {
73
+ ensureFtDir();
74
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(cfg, null, 2));
15
75
  }
16
76
  //# sourceMappingURL=config.js.map
@@ -1 +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,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;AAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAEvD,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"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"}