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.
- package/.ft/config.json +3 -0
- package/.ft/context.json +8 -8
- package/README.md +4 -0
- package/bin/src/commands/add.d.ts.map +1 -0
- package/bin/src/commands/add.js +45 -0
- package/bin/src/commands/add.js.map +1 -0
- package/bin/src/commands/audit.d.ts.map +1 -0
- package/bin/src/commands/audit.js +79 -0
- package/bin/src/commands/audit.js.map +1 -0
- package/bin/src/commands/brief.d.ts.map +1 -0
- package/bin/src/commands/brief.js +37 -0
- package/bin/src/commands/brief.js.map +1 -0
- package/bin/src/commands/chat.d.ts.map +1 -0
- package/bin/src/commands/chat.js +89 -0
- package/bin/src/commands/chat.js.map +1 -0
- package/bin/src/commands/configCommand.d.ts.map +1 -0
- package/bin/src/commands/configCommand.js +27 -0
- package/bin/src/commands/configCommand.js.map +1 -0
- package/bin/src/commands/fix.d.ts.map +1 -0
- package/bin/src/commands/fix.js +67 -0
- package/bin/src/commands/fix.js.map +1 -0
- package/bin/src/commands/history.d.ts.map +1 -0
- package/bin/src/commands/history.js +20 -0
- package/bin/src/commands/history.js.map +1 -0
- package/bin/src/commands/init.d.ts.map +1 -1
- package/bin/src/commands/init.js +22 -8
- package/bin/src/commands/init.js.map +1 -1
- package/bin/src/commands/recommend.d.ts.map +1 -0
- package/bin/src/commands/recommend.js +46 -0
- package/bin/src/commands/recommend.js.map +1 -0
- package/bin/src/commands/scan.d.ts.map +1 -0
- package/bin/src/commands/scan.js +80 -0
- package/bin/src/commands/scan.js.map +1 -0
- package/bin/src/commands/undo.d.ts.map +1 -0
- package/bin/src/commands/undo.js +37 -0
- package/bin/src/commands/undo.js.map +1 -0
- package/bin/src/commands/web.js +8 -8
- package/bin/src/commands/web.js.map +1 -1
- package/bin/src/engine/llm.d.ts.map +1 -1
- package/bin/src/engine/llm.js +212 -25
- package/bin/src/engine/llm.js.map +1 -1
- package/bin/src/index.js +121 -25
- package/bin/src/index.js.map +1 -1
- package/bin/src/utils/config.d.ts.map +1 -1
- package/bin/src/utils/config.js +62 -2
- package/bin/src/utils/config.js.map +1 -1
- package/bin/src/utils/language.js +5 -5
- package/bin/src/utils/language.js.map +1 -1
- package/bin/src/utils/markdown.d.ts.map +1 -1
- package/bin/src/utils/markdown.js +33 -2
- package/bin/src/utils/markdown.js.map +1 -1
- package/package.json +1 -1
- package/email-template.txt +0 -44
package/bin/src/engine/llm.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,
|
|
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.
|
|
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.
|
|
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('
|
|
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
|
|
44
|
-
.option('--native', 'Force native 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('
|
|
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
|
package/bin/src/index.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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"}
|
package/bin/src/utils/config.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"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"}
|