ft-scout 2.0.5 → 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 (37) hide show
  1. package/.ft/config.json +3 -0
  2. package/bin/src/commands/add.d.ts.map +1 -0
  3. package/bin/src/commands/add.js +45 -0
  4. package/bin/src/commands/add.js.map +1 -0
  5. package/bin/src/commands/audit.d.ts.map +1 -0
  6. package/bin/src/commands/audit.js +79 -0
  7. package/bin/src/commands/audit.js.map +1 -0
  8. package/bin/src/commands/brief.d.ts.map +1 -0
  9. package/bin/src/commands/brief.js +37 -0
  10. package/bin/src/commands/brief.js.map +1 -0
  11. package/bin/src/commands/configCommand.d.ts.map +1 -0
  12. package/bin/src/commands/configCommand.js +27 -0
  13. package/bin/src/commands/configCommand.js.map +1 -0
  14. package/bin/src/commands/fix.d.ts.map +1 -0
  15. package/bin/src/commands/fix.js +67 -0
  16. package/bin/src/commands/fix.js.map +1 -0
  17. package/bin/src/commands/history.d.ts.map +1 -0
  18. package/bin/src/commands/history.js +20 -0
  19. package/bin/src/commands/history.js.map +1 -0
  20. package/bin/src/commands/recommend.d.ts.map +1 -0
  21. package/bin/src/commands/recommend.js +46 -0
  22. package/bin/src/commands/recommend.js.map +1 -0
  23. package/bin/src/commands/scan.d.ts.map +1 -0
  24. package/bin/src/commands/scan.js +80 -0
  25. package/bin/src/commands/scan.js.map +1 -0
  26. package/bin/src/commands/undo.d.ts.map +1 -0
  27. package/bin/src/commands/undo.js +37 -0
  28. package/bin/src/commands/undo.js.map +1 -0
  29. package/bin/src/engine/llm.d.ts.map +1 -1
  30. package/bin/src/engine/llm.js +131 -0
  31. package/bin/src/engine/llm.js.map +1 -1
  32. package/bin/src/index.js +120 -35
  33. package/bin/src/index.js.map +1 -1
  34. package/bin/src/utils/config.d.ts.map +1 -1
  35. package/bin/src/utils/config.js +62 -2
  36. package/bin/src/utils/config.js.map +1 -1
  37. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ {
2
+ "allowConfidential": true
3
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["add.ts"],"names":[],"mappings":"AAQA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,iBAgD1F"}
@@ -0,0 +1,45 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import chalk from 'chalk';
4
+ import { spinner } from '@clack/prompts';
5
+ import { generateFeaturePlan } from '../engine/llm.js';
6
+ import { renderMarkdown, safeNote } from '../utils/markdown.js';
7
+ import { loadContext } from '../utils/config.js';
8
+ export async function handleAdd(idea, options) {
9
+ if (!idea || !idea.trim()) {
10
+ safeNote(chalk.red('Please provide a feature description. Example: `ft add "add webhook retry queue"`'), '❌ Missing Feature Description');
11
+ return;
12
+ }
13
+ const s = spinner();
14
+ s.start(`Evaluating feasibility & generating implementation plan for: "${chalk.cyan(idea)}"...`);
15
+ const cwd = process.cwd();
16
+ const context = loadContext();
17
+ const projectName = context?.projectName || path.basename(cwd);
18
+ const getFiles = (dir, depth = 2) => {
19
+ let results = [];
20
+ try {
21
+ const list = fs.readdirSync(dir);
22
+ for (const file of list) {
23
+ if (['node_modules', '.git', 'dist', 'build', '.ft'].includes(file))
24
+ continue;
25
+ const fullPath = path.join(dir, file);
26
+ const relPath = path.relative(cwd, fullPath);
27
+ const stat = fs.statSync(fullPath);
28
+ if (stat.isDirectory()) {
29
+ if (depth > 1)
30
+ results = results.concat(getFiles(fullPath, depth - 1));
31
+ }
32
+ else {
33
+ results.push(relPath);
34
+ }
35
+ }
36
+ }
37
+ catch { }
38
+ return results;
39
+ };
40
+ const filesList = getFiles(cwd, 2);
41
+ const plan = await generateFeaturePlan(idea, projectName, filesList, options?.lang || context?.language, options?.native);
42
+ s.stop('Feasibility assessment & roadmap complete.');
43
+ safeNote(renderMarkdown(plan), `🚀 Feature Implementation Roadmap: "${idea}"`);
44
+ }
45
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,OAA6C;IACzF,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1B,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,mFAAmF,CAAC,EAAE,+BAA+B,CAAC,CAAC;QAC1I,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,iEAAiE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjG,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,KAAK,GAAG,CAAC,EAAY,EAAE;QACpD,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,IAAI,KAAK,GAAG,CAAC;wBAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAEnC,MAAM,IAAI,GAAG,MAAM,mBAAmB,CACpC,IAAI,EACJ,WAAW,EACX,SAAS,EACT,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,QAAQ,EAClC,OAAO,EAAE,MAAM,CAChB,CAAC;IAEF,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAErD,QAAQ,CACN,cAAc,CAAC,IAAI,CAAC,EACpB,uCAAuC,IAAI,GAAG,CAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["audit.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,kBA4EhC"}
@@ -0,0 +1,79 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { execSync } from 'child_process';
4
+ import chalk from 'chalk';
5
+ import { spinner } from '@clack/prompts';
6
+ import { safeNote } from '../utils/markdown.js';
7
+ import { loadFtConfig } from '../utils/config.js';
8
+ export async function handleAudit() {
9
+ const s = spinner();
10
+ s.start('Scanning dependencies, environment secrets, and supply-chain patterns...');
11
+ const cwd = process.cwd();
12
+ const ftConfig = loadFtConfig();
13
+ const auditResults = [];
14
+ // Check 1: Environment files for hardcoded secrets
15
+ const envFiles = ['.env', '.env.local', '.env.example', '.env.production'];
16
+ let secretsFound = 0;
17
+ for (const envFile of envFiles) {
18
+ const p = path.join(cwd, envFile);
19
+ if (fs.existsSync(p)) {
20
+ const content = fs.readFileSync(p, 'utf-8');
21
+ const lines = content.split('\n');
22
+ for (const line of lines) {
23
+ if (/sk_live_[0-9a-zA-Z]{24}/.test(line) || /AIzaSy[0-9a-zA-Z-_]{33}/.test(line) || /ghp_[0-9a-zA-Z]{36}/.test(line)) {
24
+ secretsFound++;
25
+ auditResults.push(`⚠️ ${chalk.bold.red(envFile)}: Contains potential real production API key / secret. Flagged for rotation.`);
26
+ break;
27
+ }
28
+ }
29
+ }
30
+ }
31
+ if (secretsFound === 0) {
32
+ auditResults.push(`✅ Secrets Exposure: No plaintext API keys or high-risk credentials detected in local .env files.`);
33
+ }
34
+ // Check 2: npm audit (if package.json exists)
35
+ const pkgPath = path.join(cwd, 'package.json');
36
+ if (fs.existsSync(pkgPath)) {
37
+ try {
38
+ execSync('npm audit --json', { cwd, stdio: 'pipe' });
39
+ auditResults.push(`✅ Package Dependencies: 0 known vulnerabilities detected in npm dependency tree.`);
40
+ }
41
+ catch (err) {
42
+ try {
43
+ const jsonStr = err.stdout?.toString() || '{}';
44
+ const parsed = JSON.parse(jsonStr);
45
+ const vulns = parsed.metadata?.vulnerabilities || {};
46
+ const total = (vulns.high || 0) + (vulns.critical || 0) + (vulns.moderate || 0);
47
+ if (total > 0) {
48
+ auditResults.push(`⚠️ Package Vulnerabilities: Found ${chalk.bold.yellow(total)} CVEs (${vulns.critical || 0} critical, ${vulns.high || 0} high). Run \`npm audit fix\` to patch.`);
49
+ }
50
+ else {
51
+ auditResults.push(`✅ Package Dependencies: Clean dependency graph with 0 critical vulnerabilities.`);
52
+ }
53
+ }
54
+ catch {
55
+ auditResults.push(`⚠️ Dependency Audit: Scanned package manifest (recommend checking non-pinned dependencies).`);
56
+ }
57
+ }
58
+ }
59
+ // Check 3: Supply chain & install script risks
60
+ if (fs.existsSync(pkgPath)) {
61
+ try {
62
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
63
+ if (pkg.scripts?.postinstall || pkg.scripts?.preinstall) {
64
+ auditResults.push(`⚠️ Lifecycle Scripts: Detected \`preinstall\` / \`postinstall\` hooks in package manifest — verify third-party script safety.`);
65
+ }
66
+ else {
67
+ auditResults.push(`✅ Supply Chain: No malicious postinstall hooks or zip-bomb script patterns detected.`);
68
+ }
69
+ }
70
+ catch { }
71
+ }
72
+ // Confidential mode notice
73
+ if (!ftConfig.allowConfidential) {
74
+ auditResults.push(`\n${chalk.dim('💡 Note: Confidential mode disabled. Run `ft config --confidential` to grant full schema & env inspection access.')}`);
75
+ }
76
+ s.stop('Security & supply-chain audit complete.');
77
+ safeNote(auditResults.join('\n\n'), '🛡️ FrontTerrain Security & Dependency Audit');
78
+ }
79
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["brief.ts"],"names":[],"mappings":"AAOA,wBAAsB,WAAW,kBAmChC"}
@@ -0,0 +1,37 @@
1
+ import path from 'path';
2
+ import chalk from 'chalk';
3
+ import { spinner } from '@clack/prompts';
4
+ import { loadContext } from '../utils/config.js';
5
+ import { handleInit } from './init.js';
6
+ import { renderMarkdown, formatInlineMarkdown, safeNote } from '../utils/markdown.js';
7
+ export async function handleBrief() {
8
+ const context = loadContext();
9
+ if (!context) {
10
+ const s = spinner();
11
+ s.start('No previous onboarding context found. Initializing repo analysis...');
12
+ s.stop('Repo initialized.');
13
+ await handleInit();
14
+ return;
15
+ }
16
+ const projectName = context.projectName || path.basename(process.cwd());
17
+ const entryPoint = context.entryPoint || 'src/index.ts';
18
+ const stack = context.stack || 'Node.js / ESM TypeScript application';
19
+ const painPoints = context.painPoints || [];
20
+ const readOrder = context.readOrder || [];
21
+ safeNote(`Project: ${chalk.bold.green(projectName)}
22
+ Entry Point: ${chalk.cyan(entryPoint)}
23
+
24
+ ${chalk.bold.magenta('🚀 Onboarding Executive Overview (Week-One Explainer):')}
25
+ ${renderMarkdown(stack)}
26
+
27
+ ${chalk.bold.red('🔥 Known High-Churn Hotspots & Pain Points:')}
28
+ ${painPoints.length > 0
29
+ ? painPoints.map((p) => ` • ${formatInlineMarkdown(p)}`).join('\n\n')
30
+ : ' • All core modules are stable with low historical churn.'}
31
+
32
+ ${chalk.bold.green('🧭 Recommended First-Week Read Order:')}
33
+ ${readOrder.length > 0
34
+ ? readOrder.map((r, idx) => ` ${idx + 1}. ${formatInlineMarkdown(r)}`).join('\n')
35
+ : ' 1. package.json\n 2. src/index.ts'}`, '📋 FrontTerrain Onboarding Brief');
36
+ }
37
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["brief.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAC/E,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC5B,MAAM,UAAU,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,sCAAsC,CAAC;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAE1C,QAAQ,CACN,YAAY,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;eAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;;EAEnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,wDAAwD,CAAC;EAC5E,cAAc,CAAC,KAAK,CAAC;;EAErB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,6CAA6C,CAAC;EAC7D,UAAU,CAAC,MAAM,GAAG,CAAC;QACrB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACrE,CAAC,CAAC,2DAA2D;;EAE7D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC;EACzD,SAAS,CAAC,MAAM,GAAG,CAAC;QACpB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACjF,CAAC,CAAC,oCAAoC,EAAE,EACtC,kCAAkC,CACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configCommand.d.ts","sourceRoot":"","sources":["configCommand.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,iBAkCtF"}
@@ -0,0 +1,27 @@
1
+ import chalk from 'chalk';
2
+ import { loadFtConfig, saveFtConfig } from '../utils/config.js';
3
+ import { safeNote } from '../utils/markdown.js';
4
+ export async function handleConfig(options) {
5
+ let cfg = loadFtConfig();
6
+ if (options?.confidential) {
7
+ cfg.allowConfidential = true;
8
+ saveFtConfig(cfg);
9
+ safeNote(`Confidential Data Access: ${chalk.bold.green('ALLOWED')}\n\n` +
10
+ `Scout is now authorized to analyze sensitive configuration files, schema manifests, and environment templates.\n` +
11
+ `This improves accuracy for \`ft-scout brief\`, \`ft-scout audit\`, and \`ft-scout scan\` about ~40%.`, '⚙️ FrontTerrain Permission Config');
12
+ return;
13
+ }
14
+ if (options?.deny) {
15
+ cfg.allowConfidential = false;
16
+ saveFtConfig(cfg);
17
+ safeNote(`Confidential Data Access: ${chalk.bold.red('DENIED')}\n\n` +
18
+ `FT will restrict scanning of sensitive configuration files and environment definitions.`, '⚙️ FrontTerrain Permission Config');
19
+ return;
20
+ }
21
+ safeNote(`Current Configuration Settings:\n` +
22
+ ` • Confidential Data Access: ${cfg.allowConfidential ? chalk.bold.green('ALLOWED') : chalk.bold.yellow('DENIED')}\n\n` +
23
+ `Usage options:\n` +
24
+ ` • Allow access: ${chalk.cyan('ft config --confidential')}\n` +
25
+ ` • Deny access: ${chalk.cyan('ft config --deny')}`, '⚙️ FrontTerrain Permission Config');
26
+ }
27
+ //# sourceMappingURL=configCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configCommand.js","sourceRoot":"","sources":["configCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAoD;IACrF,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;IAEzB,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;QAC1B,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC7B,YAAY,CAAC,GAAG,CAAC,CAAC;QAClB,QAAQ,CACN,6BAA6B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM;YAC5D,kHAAkH;YAClH,sGAAsG,EACxG,mCAAmC,CACpC,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC9B,YAAY,CAAC,GAAG,CAAC,CAAC;QAClB,QAAQ,CACN,6BAA6B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM;YACzD,yFAAyF,EAC3F,mCAAmC,CACpC,CAAC;QACF,OAAO;IACT,CAAC;IAED,QAAQ,CACN,mCAAmC;QACjC,iCAAiC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;QACxH,kBAAkB;QAClB,qBAAqB,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI;QAC/D,qBAAqB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,EACvD,mCAAmC,CACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["fix.ts"],"names":[],"mappings":"AAOA,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,iBAmEpE"}
@@ -0,0 +1,67 @@
1
+ import chalk from 'chalk';
2
+ import { spinner } from '@clack/prompts';
3
+ import { simpleGit } from 'simple-git';
4
+ import { loadScanReport } from './scan.js';
5
+ import { safeNote } from '../utils/markdown.js';
6
+ import { recordHistoryAction } from '../utils/config.js';
7
+ export async function handleFix(options) {
8
+ const s = spinner();
9
+ s.start('Preparing automated fix workflow...');
10
+ const git = simpleGit();
11
+ const isRepo = await git.checkIsRepo();
12
+ let currentBranch = 'main';
13
+ if (isRepo) {
14
+ try {
15
+ const branchSummary = await git.branch();
16
+ currentBranch = branchSummary.current || 'main';
17
+ }
18
+ catch { }
19
+ }
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
30
+ .toLowerCase()
31
+ .replace(/[^a-z0-9]+/g, '-')
32
+ .replace(/^-|-$/g, '')
33
+ .slice(0, 30);
34
+ const branchName = `ft/fix-${targetIssue.id}-${cleanTitle}`;
35
+ if (isRepo) {
36
+ try {
37
+ await git.checkoutLocalBranch(branchName);
38
+ }
39
+ catch {
40
+ try {
41
+ await git.checkout(branchName);
42
+ }
43
+ catch { }
44
+ }
45
+ }
46
+ recordHistoryAction({
47
+ command: `ft fix --issue ${targetIssue.id}`,
48
+ description: `Created branch ${branchName} for issue #${targetIssue.id}: ${targetIssue.title}`,
49
+ branchName,
50
+ previousBranch: currentBranch,
51
+ affectedFiles: [targetIssue.file],
52
+ });
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)}
56
+
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
61
+
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');
66
+ }
67
+ //# sourceMappingURL=fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["history.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,kBA0BlC"}
@@ -0,0 +1,20 @@
1
+ import chalk from 'chalk';
2
+ import { loadHistory } from '../utils/config.js';
3
+ import { safeNote } from '../utils/markdown.js';
4
+ export async function handleHistory() {
5
+ const history = loadHistory();
6
+ if (history.length === 0) {
7
+ safeNote(chalk.yellow('No recorded FT actions found in this repository yet.\nCommands like `ft fix` and configuration updates will log history entries here.'), '📜 FrontTerrain Execution History');
8
+ return;
9
+ }
10
+ const logLines = history.map((item, idx) => {
11
+ const timeStr = new Date(item.timestamp).toLocaleString();
12
+ return (`${chalk.bold.cyan(`#${history.length - idx}`)} ${chalk.bold.green(item.command)} ${chalk.dim(`(${timeStr})`)}\n` +
13
+ ` • ${item.description}\n` +
14
+ (item.branchName ? ` • Branch: ${chalk.yellow(item.branchName)}\n` : '') +
15
+ (item.affectedFiles && item.affectedFiles.length > 0 ? ` • Files: ${chalk.dim(item.affectedFiles.join(', '))}` : ''));
16
+ });
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');
19
+ }
20
+ //# sourceMappingURL=history.js.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["recommend.ts"],"names":[],"mappings":"AAQA,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,iBAiDlF"}
@@ -0,0 +1,46 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import chalk from 'chalk';
4
+ import { spinner } from '@clack/prompts';
5
+ import { generateCodeRecommendations } from '../engine/llm.js';
6
+ import { renderMarkdown, safeNote } from '../utils/markdown.js';
7
+ import { loadContext } from '../utils/config.js';
8
+ export async function handleRecommend(options) {
9
+ const s = spinner();
10
+ s.start('Analyzing architecture, performance bottlenecks, and DSA patterns...');
11
+ const cwd = process.cwd();
12
+ const context = loadContext();
13
+ const projectName = context?.projectName || path.basename(cwd);
14
+ const getFiles = (dir, depth = 2) => {
15
+ let results = [];
16
+ try {
17
+ const list = fs.readdirSync(dir);
18
+ for (const file of list) {
19
+ if (['node_modules', '.git', 'dist', 'build', '.ft'].includes(file))
20
+ continue;
21
+ const fullPath = path.join(dir, file);
22
+ const relPath = path.relative(cwd, fullPath);
23
+ const stat = fs.statSync(fullPath);
24
+ if (stat.isDirectory()) {
25
+ if (depth > 1)
26
+ results = results.concat(getFiles(fullPath, depth - 1));
27
+ }
28
+ else {
29
+ results.push(relPath);
30
+ }
31
+ }
32
+ }
33
+ catch { }
34
+ return results;
35
+ };
36
+ const filesList = getFiles(cwd, 2);
37
+ let codeSample = '';
38
+ const pkgPath = path.join(cwd, 'package.json');
39
+ if (fs.existsSync(pkgPath)) {
40
+ codeSample += fs.readFileSync(pkgPath, 'utf-8').slice(0, 1500);
41
+ }
42
+ const recommendations = await generateCodeRecommendations(projectName, filesList, codeSample, options?.lang || context?.language, options?.native);
43
+ s.stop('Architectural review complete.');
44
+ safeNote(renderMarkdown(recommendations), `💡 Strategic Engineering Recommendations (${projectName})`);
45
+ }
46
+ //# sourceMappingURL=recommend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend.js","sourceRoot":"","sources":["recommend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA6C;IACjF,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAEhF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,KAAK,GAAG,CAAC,EAAY,EAAE;QACpD,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,IAAI,KAAK,GAAG,CAAC;wBAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAEnC,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,UAAU,IAAI,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,2BAA2B,CACvD,WAAW,EACX,SAAS,EACT,UAAU,EACV,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,QAAQ,EAClC,OAAO,EAAE,MAAM,CAChB,CAAC;IAEF,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAEzC,QAAQ,CACN,cAAc,CAAC,eAAe,CAAC,EAC/B,6CAA6C,WAAW,GAAG,CAC5D,CAAC;AACJ,CAAC"}
@@ -0,0 +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"}
@@ -0,0 +1,80 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import chalk from 'chalk';
4
+ import { spinner } from '@clack/prompts';
5
+ import { generateCodeScanReport } from '../engine/llm.js';
6
+ import { safeNote } from '../utils/markdown.js';
7
+ import { loadContext } from '../utils/config.js';
8
+ const FT_DIR = path.join(process.cwd(), '.ft');
9
+ const SCAN_CACHE = path.join(FT_DIR, 'scan-report.json');
10
+ export function saveScanReport(issues) {
11
+ if (!fs.existsSync(FT_DIR)) {
12
+ fs.mkdirSync(FT_DIR, { recursive: true });
13
+ }
14
+ fs.writeFileSync(SCAN_CACHE, JSON.stringify(issues, null, 2));
15
+ }
16
+ export function loadScanReport() {
17
+ if (!fs.existsSync(SCAN_CACHE))
18
+ return [];
19
+ try {
20
+ return JSON.parse(fs.readFileSync(SCAN_CACHE, 'utf-8'));
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ export async function handleScan() {
27
+ const s = spinner();
28
+ s.start('Performing read-only bug & vulnerability scan across codebase...');
29
+ const cwd = process.cwd();
30
+ const context = loadContext();
31
+ const projectName = context?.projectName || path.basename(cwd);
32
+ const getFiles = (dir, depth = 2) => {
33
+ let results = [];
34
+ try {
35
+ const list = fs.readdirSync(dir);
36
+ for (const file of list) {
37
+ if (['node_modules', '.git', 'dist', 'build', '.ft'].includes(file))
38
+ continue;
39
+ const fullPath = path.join(dir, file);
40
+ const relPath = path.relative(cwd, fullPath);
41
+ const stat = fs.statSync(fullPath);
42
+ if (stat.isDirectory()) {
43
+ if (depth > 1)
44
+ results = results.concat(getFiles(fullPath, depth - 1));
45
+ }
46
+ else {
47
+ results.push(relPath);
48
+ }
49
+ }
50
+ }
51
+ catch { }
52
+ return results;
53
+ };
54
+ const filesList = getFiles(cwd, 2);
55
+ let codeSample = '';
56
+ const pkgPath = path.join(cwd, 'package.json');
57
+ if (fs.existsSync(pkgPath)) {
58
+ codeSample += fs.readFileSync(pkgPath, 'utf-8').slice(0, 1000) + '\n';
59
+ }
60
+ const issues = await generateCodeScanReport(projectName, filesList, codeSample);
61
+ saveScanReport(issues);
62
+ s.stop('Scan complete. Read-only report generated (no code modified).');
63
+ const severityBadge = (sev) => {
64
+ switch (sev.toLowerCase()) {
65
+ case 'high':
66
+ return chalk.bgRed.white.bold(' HIGH ');
67
+ case 'medium':
68
+ return chalk.bgYellow.black.bold(' MEDIUM ');
69
+ default:
70
+ return chalk.bgBlue.white.bold(' LOW ');
71
+ }
72
+ };
73
+ const reportLines = issues.map((iss) => `${chalk.bold.cyan(`[Issue #${iss.id}]`)} ${severityBadge(iss.severity)} ${chalk.bold(iss.title)}\n` +
74
+ ` • File: ${chalk.yellow(iss.file)}\n` +
75
+ ` • Detail: ${iss.description}`);
76
+ safeNote(`Found ${issues.length} potential issues matching past hotfix patterns:\n\n` +
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');
79
+ }
80
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"undo.d.ts","sourceRoot":"","sources":["undo.ts"],"names":[],"mappings":"AAMA,wBAAsB,UAAU,kBAmC/B"}
@@ -0,0 +1,37 @@
1
+ import chalk from 'chalk';
2
+ import { spinner } from '@clack/prompts';
3
+ import { simpleGit } from 'simple-git';
4
+ import { popLastHistoryAction } from '../utils/config.js';
5
+ import { safeNote } from '../utils/markdown.js';
6
+ export async function handleUndo() {
7
+ const s = spinner();
8
+ s.start('Retrieving last recorded FT action...');
9
+ const lastAction = popLastHistoryAction();
10
+ if (!lastAction) {
11
+ s.stop(chalk.yellow('No actions to undo.'));
12
+ safeNote(chalk.yellow('There are no recent FT actions in `.ft/history.json` to revert.'), '↩️ Undo Action');
13
+ return;
14
+ }
15
+ const git = simpleGit();
16
+ const isRepo = await git.checkIsRepo();
17
+ let revertedNotes = `Reverted action: ${chalk.bold.cyan(lastAction.command)}\nDescription: ${lastAction.description}\n`;
18
+ if (isRepo && lastAction.previousBranch) {
19
+ try {
20
+ await git.checkout(lastAction.previousBranch);
21
+ revertedNotes += `\n✅ Git status: Restored active branch back to ${chalk.bold.green(lastAction.previousBranch)}.`;
22
+ if (lastAction.branchName && lastAction.branchName.startsWith('ft/fix-')) {
23
+ try {
24
+ await git.deleteLocalBranch(lastAction.branchName, true);
25
+ revertedNotes += `\n✅ Deleted temporary fix branch: ${chalk.dim(lastAction.branchName)}.`;
26
+ }
27
+ catch { }
28
+ }
29
+ }
30
+ catch (err) {
31
+ revertedNotes += `\n⚠️ Git branch restoration note: ${err?.message || 'Could not automatically switch back to base branch.'}`;
32
+ }
33
+ }
34
+ s.stop('Last action successfully reverted.');
35
+ safeNote(revertedNotes, '↩️ Reverted Last Action');
36
+ }
37
+ //# sourceMappingURL=undo.js.map
@@ -0,0 +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 +1 @@
1
- {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["llm.ts"],"names":[],"mappings":"AA4FA,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsD7F;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,eAAe,EAAE,MAAM,EACvB,WAAW,GAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAM,EACxE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GACvI,OAAO,CAAC,MAAM,CAAC,CAgEjB"}
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["llm.ts"],"names":[],"mappings":"AA4FA,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsD7F;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,eAAe,EAAE,MAAM,EACvB,WAAW,GAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAM,EACxE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GACvI,OAAO,CAAC,MAAM,CAAC,CAgEjB;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAwEvH;AAED,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
@@ -186,4 +186,135 @@ CRITICAL CLI FORMATTING INSTRUCTIONS:
186
186
  return `⚠️ AI Error: Could not generate answer (${error instanceof Error ? error.message : String(error)}). Please check network or proxy credentials.`;
187
187
  }
188
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
+ }
189
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
@@ -7,62 +7,147 @@ import { handleRisky } from './commands/risky.js';
7
7
  import { handleSetup } from './commands/setup.js';
8
8
  import { handleWebSearch } from './commands/web.js';
9
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';
10
19
  const program = new Command();
11
- program
12
- .command('chat')
13
- .description('Interactive AI chat session with codebase co-pilot (Press Ctrl+C to exit)')
14
- .option('-w, --web', 'Allow scout to access internet for web search & live web context')
15
- .option('-l, --lang <language>', 'Language for AI responses (e.g. es, fr, hi, ja, spanish)')
16
- .option('--native', 'Force native script (Devanagari, Hangul, Tamil script) instead of Romanized terminal script')
17
- .action(async (options) => {
18
- await handleChat(options);
19
- outro(chalk.cyan('Chat session ended.'));
20
- });
21
- program
22
- .command('risky')
23
- .description('Show code fragility map based on churn and hotfixes')
24
- .action(async () => handleRisky());
25
- program
26
- .command('setup')
27
- .description('Diagnose local setup, missing .env files, and runtime mismatches')
28
- .action(async () => handleSetup());
29
- program
30
- .command('search <query>')
31
- .alias('web')
32
- .description('Allow scout to search the internet for live web context, docs, & technical solutions')
33
- .option('-a, --ask', 'Synthesize an AI answer using live internet search results')
34
- .option('-l, --lang <language>', 'Language for AI search synthesis (e.g. es, fr, hi, ja, spanish)')
35
- .option('--native', 'Force native script (Devanagari, Hangul, Tamil script) instead of Romanized terminal script')
36
- .action(async (query, options) => {
37
- await handleWebSearch(query, options);
38
- outro(chalk.cyan('Internet search complete.'));
39
- });
40
20
  program
41
21
  .name('ft')
42
22
  .description('FrontTerrain — The Onboarding Co-Pilot for New Codebases')
43
- .version('2.0.5');
23
+ .version('2.0.6');
44
24
  // Header UI on execution
45
25
  program.hook('preAction', () => {
46
- intro(chalk.bgCyan.black(' FrontTerrain CLI (v2.0.5) '));
26
+ intro(chalk.bgCyan.black(' FrontTerrain CLI (v2.0.6) '));
47
27
  });
48
28
  // Command definitions
49
29
  program
50
30
  .command('init [repoUrl]')
51
- .description('Build local understanding map of the repository')
31
+ .description('Clone + build local understanding map of the repository')
52
32
  .option('-a, --ask', 'Interactive Q&A mode after repository initialization')
53
33
  .option('-w, --web', 'Allow scout to access internet for web search & live web context')
54
- .option('-l, --lang <language>', 'Language for AI teardowns, summaries, and Q&A responses (e.g. es, fr, hi, ja, spanish)')
55
- .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')
56
36
  .action(async (repoUrl, options) => {
57
37
  await handleInit(repoUrl, options);
58
38
  outro(chalk.green('Initialization complete!'));
59
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
+ });
60
47
  program
61
48
  .command('owners <path>')
62
- .description('Show actual file knowledge holders based on git history')
49
+ .description('Who actually knows this file (from git history, not guesses)')
63
50
  .action(async (path) => {
64
51
  await handleOwners(path);
65
52
  outro(chalk.cyan('File ownership analysis complete.'));
66
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
+ });
67
152
  program.parse(process.argv);
68
153
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
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;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,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,yDAAyD,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,sDAAsD,CAAC;KAC3E,MAAM,CAAC,WAAW,EAAE,kEAAkE,CAAC;KACvF,MAAM,CAAC,uBAAuB,EAAE,yDAAyD,CAAC;KAC1F,MAAM,CAAC,UAAU,EAAE,0DAA0D,CAAC;KAC9E,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,OAAO,CAAC;KAChB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,WAAW,EAAE,CAAC;IACpB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,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;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,WAAW,EAAE,CAAC;IACpB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,WAAW,EAAE,CAAC;IACpB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,UAAU,EAAE,CAAC;IACnB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,kBAAkB,EAAE,oCAAoC,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACzB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,sDAAsD,CAAC;KACnE,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;KAC/D,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;KAC/D,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,WAAW,EAAE,CAAC;IACpB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,EAAE,CAAC;IACtB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,UAAU,EAAE,CAAC;IACnB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,oBAAoB,EAAE,6CAA6C,CAAC;KAC3E,MAAM,CAAC,YAAY,EAAE,kCAAkC,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,WAAW,EAAE,kEAAkE,CAAC;KACvF,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,CAAC;KAC5D,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEL,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,kCAAkC,CAAC;KACnE,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC;KACzC,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,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ft-scout",
3
- "version": "2.0.5",
3
+ "version": "2.0.6",
4
4
  "type": "module",
5
5
  "description": "FrontTerrain — The Onboarding Co-Pilot for New Codebases",
6
6
  "main": "index.js",