ft-scout 1.0.5 → 1.0.7

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/context.json CHANGED
@@ -1,14 +1,16 @@
1
1
  {
2
- "projectName": "FT-CLI",
3
- "stack": "The FT-CLI project is a command-line interface tool built with Node.js, TypeScript, and various dependencies such as commander and dotenv, which suggests it handles tasks related to file management, git operations, and possibly AI-powered features via OpenAI. Its core stack includes TypeScript, JavaScript, and multiple libraries for interactive prompts and terminal output customization.",
4
- "entryPoint": "bin/ft.js",
2
+ "projectName": "SVMWebsite-1785424647835",
3
+ "stack": "This project is a simple website with a backend for admin uploads for Saraswati Vidya Mandir, built using Node.js, Express, and Firebase. The core stack includes Express for the server, Firebase for hosting and authentication, and various dependencies for file uploads and JSON Web Tokens.",
4
+ "entryPoint": "server.js",
5
5
  "painPoints": [
6
- "Potential complexity in integrating multiple third-party libraries, lack of tests as indicated by the 'test' script in package.json"
6
+ "large number of static HTML files (e.g., about-us.html, admin.html, etc.)",
7
+ "potential CORS issues with the Cors dependency",
8
+ "file upload handling with Multer"
7
9
  ],
8
10
  "readOrder": [
11
+ "server.js",
9
12
  "package.json",
10
- "bin/ft.js",
11
- "tsconfig.json"
13
+ "script.js"
12
14
  ],
13
- "createdAt": "2026-07-30T07:56:23.435Z"
15
+ "createdAt": "2026-07-30T15:17:40.015Z"
14
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["brief.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,kBA6BhC"}
1
+ {"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["brief.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,kBA+BhC"}
@@ -1,27 +1,28 @@
1
1
  import { spinner, note } from '@clack/prompts';
2
2
  import chalk from 'chalk';
3
- import fs from 'fs';
4
- import path from 'path';
3
+ import { loadContext } from '../utils/config.js';
5
4
  export async function handleBrief() {
6
5
  const s = spinner();
7
6
  s.start('Reading codebase structure and .ft metadata...');
8
- const configPath = path.join(process.cwd(), '.ft', 'context.json');
9
- if (!fs.existsSync(configPath)) {
7
+ const context = loadContext();
8
+ if (!context) {
10
9
  s.stop(chalk.red('No local context found.'));
11
- console.log('\nPlease run `ft init` first to index this repository.');
10
+ console.log('\nPlease run `ft init` first to index a repository.');
12
11
  return;
13
12
  }
14
- const rawData = fs.readFileSync(configPath, 'utf-8');
15
- const context = JSON.parse(rawData);
16
13
  s.stop('Repository analysis complete.');
17
- note(`Project: ${chalk.bold(context.projectName)}
14
+ const repoSource = context.repoUrl
15
+ ? chalk.cyan(context.repoUrl)
16
+ : chalk.dim(`Root Repository (${context.targetDir || process.cwd()})`);
17
+ note(`Project: ${chalk.bold.green(context.projectName)}
18
+ Source: ${repoSource}
18
19
  Primary Stack: ${chalk.yellow(context.stack)}
19
20
  Entry Point: ${chalk.cyan(context.entryPoint)}
20
21
 
21
- ${chalk.bold('Known Pain Points:')}
22
- ${context.painPoints.map((p) => `• ${p}`).join('\n')}
22
+ ${chalk.bold('Known Architectural Risk / Pain Points:')}
23
+ ${context.painPoints.map((p) => ` ${p}`).join('\n')}
23
24
 
24
25
  ${chalk.bold('Suggested Reading Order:')}
25
- ${context.readOrder.map((r, idx) => `${idx + 1}. ${r}`).join('\n')}`, '💡 Onboarding Brief');
26
+ ${context.readOrder.map((r, idx) => ` ${idx + 1}. ${r}`).join('\n')}`, '💡 Onboarding Brief');
26
27
  }
27
28
  //# sourceMappingURL=brief.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"brief.js","sourceRoot":"","sources":["brief.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAEnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEpC,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAExC,IAAI,CACF,YAAY,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;iBAC9B,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;eAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;;EAE3C,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC;EAChC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;EAE1D,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC;EACtC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChF,qBAAqB,CACtB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["brief.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAExC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO;QAChC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC7B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEzE,IAAI,CACF,YAAY,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;UAC3C,UAAU;iBACH,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;eAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;;EAE3C,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC;EACrD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;EAE3D,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC;EACtC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACjF,qBAAqB,CACtB,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"AAKA,wBAAsB,UAAU,CAAC,OAAO,EAAE,GAAG,iBAmB5C"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"AASA,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,iBAyHhD"}
@@ -1,22 +1,118 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
+ import os from 'os';
4
+ import { spinner, note } from '@clack/prompts';
5
+ import chalk from 'chalk';
6
+ import { simpleGit } from 'simple-git';
3
7
  import { generateRepoSummary } from '../engine/llm.js';
4
8
  import { saveContext } from '../utils/config.js';
5
9
  export async function handleInit(repoUrl) {
6
- const cwd = process.cwd();
7
- const pkgPath = path.join(cwd, 'package.json');
8
- const pkgContent = fs.existsSync(pkgPath) ? fs.readFileSync(pkgPath, 'utf-8') : '{}';
9
- // Quick file scanner (excluding node_modules / git)
10
- const filesList = fs.readdirSync(cwd).filter((f) => !['node_modules', '.git', 'dist'].includes(f));
11
- // Get AI insight
12
- const aiInsight = await generateRepoSummary(path.basename(cwd), filesList, pkgContent);
10
+ const s = spinner();
11
+ let targetDir = process.cwd();
12
+ if (repoUrl && repoUrl.trim()) {
13
+ const rawTarget = repoUrl.trim();
14
+ // Check if it's a URL or Git SSH string
15
+ const isUrl = /^https?:\/\//i.test(rawTarget) ||
16
+ /^git@/i.test(rawTarget) ||
17
+ rawTarget.includes('github.com') ||
18
+ rawTarget.includes('gitlab.com');
19
+ if (isUrl) {
20
+ s.start(`Cloning remote repository (${rawTarget})...`);
21
+ try {
22
+ const repoName = path.basename(rawTarget, '.git') || 'cloned-repo';
23
+ const tempParent = path.join(os.tmpdir(), 'ft-scout-repos');
24
+ targetDir = path.join(tempParent, `${repoName}-${Date.now()}`);
25
+ if (!fs.existsSync(tempParent)) {
26
+ fs.mkdirSync(tempParent, { recursive: true });
27
+ }
28
+ const git = simpleGit();
29
+ await git.clone(rawTarget, targetDir, ['--depth', '1']);
30
+ s.stop(`Remote repository cloned successfully.`);
31
+ }
32
+ catch (err) {
33
+ s.stop(chalk.red(`Failed to clone remote repository.`));
34
+ note(chalk.red(`Error: ${err?.message || err}`), '❌ Clone Error');
35
+ return;
36
+ }
37
+ }
38
+ else {
39
+ // Local directory path
40
+ const resolvedPath = path.resolve(rawTarget);
41
+ if (fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isDirectory()) {
42
+ targetDir = resolvedPath;
43
+ }
44
+ else {
45
+ note(chalk.red(`Directory not found: ${rawTarget}\nPlease provide a valid local path or Git repository URL.`), '❌ Invalid Target');
46
+ return;
47
+ }
48
+ }
49
+ }
50
+ s.start(`Analyzing repository at ${chalk.cyan(targetDir)}...`);
51
+ // Scan file tree up to 2 levels deep
52
+ const getFiles = (dir, depth = 2) => {
53
+ let results = [];
54
+ try {
55
+ const list = fs.readdirSync(dir);
56
+ for (const file of list) {
57
+ if (['node_modules', '.git', 'dist', 'build', '.dart_tool', '.next', 'out', 'vendor'].includes(file))
58
+ continue;
59
+ const fullPath = path.join(dir, file);
60
+ const relPath = path.relative(dir, fullPath);
61
+ const stat = fs.statSync(fullPath);
62
+ if (stat.isDirectory()) {
63
+ results.push(relPath + '/');
64
+ if (depth > 1) {
65
+ results = results.concat(getFiles(fullPath, depth - 1));
66
+ }
67
+ }
68
+ else {
69
+ results.push(relPath);
70
+ }
71
+ }
72
+ }
73
+ catch { }
74
+ return results;
75
+ };
76
+ const filesList = getFiles(targetDir, 2);
77
+ // Collect configuration & manifest files (package.json, pubspec.yaml, Cargo.toml, pyproject.toml, go.mod, etc.)
78
+ const manifestNames = ['package.json', 'pubspec.yaml', 'pyproject.toml', 'Cargo.toml', 'go.mod', 'requirements.txt', 'pom.xml', 'build.gradle'];
79
+ let manifestContent = '';
80
+ for (const name of manifestNames) {
81
+ const p = path.join(targetDir, name);
82
+ if (fs.existsSync(p)) {
83
+ manifestContent += `--- ${name} ---\n${fs.readFileSync(p, 'utf-8').slice(0, 1500)}\n\n`;
84
+ }
85
+ }
86
+ let projectName = path.basename(targetDir);
87
+ if (repoUrl && repoUrl.trim()) {
88
+ const rawTarget = repoUrl.trim();
89
+ if (/^https?:\/\//i.test(rawTarget) || /^git@/i.test(rawTarget) || rawTarget.includes('github.com') || rawTarget.includes('gitlab.com')) {
90
+ projectName = path.basename(rawTarget, '.git');
91
+ }
92
+ }
93
+ const aiInsight = await generateRepoSummary(projectName, filesList, manifestContent || '{}');
94
+ // Save context into local .ft folder
13
95
  saveContext({
14
- projectName: path.basename(cwd),
96
+ projectName,
97
+ repoUrl: repoUrl?.trim() || undefined,
98
+ targetDir,
15
99
  stack: aiInsight.summary,
16
100
  entryPoint: aiInsight.entryPoint,
17
101
  painPoints: aiInsight.painPoints,
18
102
  readOrder: aiInsight.readOrder,
19
103
  createdAt: new Date().toISOString(),
20
104
  });
105
+ s.stop('Repository analysis complete.');
106
+ // Print repository summary
107
+ note(`Project Name: ${chalk.bold.green(projectName)}
108
+ Location: ${chalk.dim(targetDir)}
109
+ Primary Stack: ${chalk.yellow(aiInsight.summary)}
110
+ Entry Point: ${chalk.cyan(aiInsight.entryPoint)}
111
+
112
+ ${chalk.bold('Known Architectural Risk / Pain Points:')}
113
+ ${aiInsight.painPoints.map((p) => ` • ${p}`).join('\n')}
114
+
115
+ ${chalk.bold('Suggested Reading Order:')}
116
+ ${aiInsight.readOrder.map((r, idx) => ` ${idx + 1}. ${r}`).join('\n')}`, '💡 Onboarding Brief');
21
117
  }
22
118
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAY;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAErF,oDAAoD;IACpD,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnG,iBAAiB;IACjB,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAEvF,WAAW,CAAC;QACV,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC/B,KAAK,EAAE,SAAS,CAAC,OAAO;QACxB,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgB;IAC/C,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,IAAI,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE9B,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAEjC,wCAAwC;QACxC,MAAM,KAAK,GACT,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;YACxB,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;YAChC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEnC,IAAI,KAAK,EAAE,CAAC;YACV,CAAC,CAAC,KAAK,CAAC,8BAA8B,SAAS,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,aAAa,CAAC;gBACnE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;gBAC5D,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChD,CAAC;gBAED,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;gBACxB,MAAM,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxD,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBACxD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,uBAAuB;YACvB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC3E,SAAS,GAAG,YAAY,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,SAAS,4DAA4D,CAAC,EAAE,kBAAkB,CAAC,CAAC;gBACnI,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAE/D,qCAAqC;IACrC,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,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC/G,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,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;oBAC5B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;wBACd,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC1D,CAAC;gBACH,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,SAAS,EAAE,CAAC,CAAC,CAAC;IAEzC,gHAAgH;IAChH,MAAM,aAAa,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAChJ,IAAI,eAAe,GAAG,EAAE,CAAC;IAEzB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,eAAe,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,IAAI,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACxI,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,eAAe,IAAI,IAAI,CAAC,CAAC;IAE7F,qCAAqC;IACrC,WAAW,CAAC;QACV,WAAW;QACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS;QACrC,SAAS;QACT,KAAK,EAAE,SAAS,CAAC,OAAO;QACxB,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAExC,2BAA2B;IAC3B,IAAI,CACF,iBAAiB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YACtC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;iBACf,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;eACjC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;EAE7C,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC;EACrD,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;EAE7D,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC;EACtC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACnF,qBAAqB,CACtB,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"risky.d.ts","sourceRoot":"","sources":["risky.ts"],"names":[],"mappings":"AAWA,wBAAsB,WAAW,kBA6ChC"}
1
+ {"version":3,"file":"risky.d.ts","sourceRoot":"","sources":["risky.ts"],"names":[],"mappings":"AA0DA,wBAAsB,WAAW,kBA8FhC"}
@@ -1,28 +1,93 @@
1
1
  import { spinner, note } from '@clack/prompts';
2
2
  import chalk from 'chalk';
3
3
  import { simpleGit } from 'simple-git';
4
+ async function getHotfixLineRanges(git, file, hotfixHashes) {
5
+ const lineCounts = {};
6
+ for (const hash of hotfixHashes.slice(0, 5)) {
7
+ try {
8
+ const patch = await git.show(['-p', hash, '--', file]);
9
+ const hunkHeaders = patch.match(/@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/g);
10
+ if (hunkHeaders) {
11
+ for (const header of hunkHeaders) {
12
+ const match = /@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/.exec(header);
13
+ if (match && match[1]) {
14
+ const startLine = parseInt(match[1], 10);
15
+ const count = match[2] ? parseInt(match[2], 10) : 1;
16
+ for (let l = startLine; l < startLine + Math.max(count, 1); l++) {
17
+ lineCounts[l] = (lineCounts[l] || 0) + 1;
18
+ }
19
+ }
20
+ }
21
+ }
22
+ }
23
+ catch {
24
+ // Ignore diff errors
25
+ }
26
+ }
27
+ const lines = Object.keys(lineCounts).map(Number).sort((a, b) => a - b);
28
+ if (lines.length === 0 || lines[0] === undefined)
29
+ return [];
30
+ const ranges = [];
31
+ let start = lines[0];
32
+ let prev = lines[0];
33
+ for (let i = 1; i < lines.length; i++) {
34
+ const current = lines[i];
35
+ if (current !== undefined && current === prev + 1) {
36
+ prev = current;
37
+ }
38
+ else if (current !== undefined) {
39
+ ranges.push(start === prev ? `L${start}` : `L${start}-${prev}`);
40
+ start = current;
41
+ prev = current;
42
+ }
43
+ }
44
+ ranges.push(start === prev ? `L${start}` : `L${start}-${prev}`);
45
+ return ranges.slice(0, 4);
46
+ }
4
47
  export async function handleRisky() {
5
48
  const s = spinner();
6
49
  s.start('Analyzing git history & churn patterns...');
7
50
  const git = simpleGit();
8
- const log = await git.log({ maxCount: 200 }); // Scan last 200 commits
51
+ let log;
52
+ try {
53
+ log = await git.log({ maxCount: 200 });
54
+ }
55
+ catch {
56
+ s.stop('Git log analysis failed.');
57
+ note(chalk.red('Could not fetch git history. Make sure this is a valid git repository with commits.'), '🔥 Codebase Risk Map');
58
+ return;
59
+ }
9
60
  const fileStats = {};
10
61
  for (const commit of log.all) {
62
+ if (!commit.hash)
63
+ continue;
11
64
  const isHotfix = /fix|bug|hotfix|patch/i.test(commit.message);
12
- // Get files changed in this commit
13
- const diff = await git.show(['--name-only', '--oneline', commit.hash]);
14
- const files = diff.split('\n').slice(1).filter(Boolean);
15
- for (const file of files) {
16
- if (!fileStats[file]) {
17
- fileStats[file] = { total: 0, hotfixes: 0 };
65
+ try {
66
+ const diff = await git.show(['--name-only', '--oneline', commit.hash]);
67
+ const files = diff.split('\n').slice(1).filter(Boolean);
68
+ for (const file of files) {
69
+ if (!fileStats[file]) {
70
+ fileStats[file] = { total: 0, hotfixes: 0, messages: [], hashes: [] };
71
+ }
72
+ const stat = fileStats[file];
73
+ if (!stat)
74
+ continue;
75
+ stat.total += 1;
76
+ if (isHotfix) {
77
+ stat.hotfixes += 1;
78
+ stat.hashes.push(commit.hash);
79
+ const cleanMsg = commit.message.split('\n')[0]?.trim();
80
+ if (cleanMsg && !stat.messages.includes(cleanMsg) && stat.messages.length < 3) {
81
+ stat.messages.push(cleanMsg);
82
+ }
83
+ }
18
84
  }
19
- fileStats[file].total += 1;
20
- if (isHotfix)
21
- fileStats[file].hotfixes += 1;
85
+ }
86
+ catch {
87
+ // Ignore single commit parsing errors
22
88
  }
23
89
  }
24
90
  s.stop('Fragility analysis complete.');
25
- // Sort by risk score
26
91
  const results = Object.entries(fileStats)
27
92
  .map(([file, stats]) => {
28
93
  let riskLevel = 'LOW';
@@ -30,14 +95,38 @@ export async function handleRisky() {
30
95
  riskLevel = 'HIGH';
31
96
  else if (stats.hotfixes >= 1 || stats.total > 7)
32
97
  riskLevel = 'MEDIUM';
33
- return { file, churnCount: stats.total, hotfixes: stats.hotfixes, riskLevel };
98
+ return {
99
+ file,
100
+ churnCount: stats.total,
101
+ hotfixes: stats.hotfixes,
102
+ riskLevel,
103
+ recentMessages: stats.messages,
104
+ hotfixHashes: stats.hashes,
105
+ };
34
106
  })
35
107
  .filter((r) => r.riskLevel !== 'LOW')
36
108
  .sort((a, b) => b.hotfixes - a.hotfixes);
37
- const formattedOutput = results.slice(0, 5).map((r) => {
109
+ if (results.length === 0) {
110
+ note(chalk.green('No high-risk hotspots found!'), '🔥 Codebase Risk Map');
111
+ return;
112
+ }
113
+ const topResults = results.slice(0, 5);
114
+ const formattedBlocks = [];
115
+ for (const r of topResults) {
38
116
  const icon = r.riskLevel === 'HIGH' ? chalk.red('🔴 HIGH RISK') : chalk.yellow('🟡 MEDIUM RISK');
39
- return `${icon} ${chalk.bold(r.file)}\n └─ ${r.churnCount} commits, ${r.hotfixes} hotfixes detected`;
40
- }).join('\n\n');
41
- note(formattedOutput || chalk.green('No high-risk hotspots found!'), '🔥 Codebase Risk Map');
117
+ let block = `${icon} ${chalk.bold(r.file)}\n └─ ${r.churnCount} commits, ${r.hotfixes} hotfixes detected`;
118
+ const lineRanges = await getHotfixLineRanges(git, r.file, r.hotfixHashes);
119
+ if (lineRanges.length > 0) {
120
+ block += `\n └─ Hotspot lines: ${chalk.cyan(lineRanges.join(', '))}`;
121
+ }
122
+ if (r.recentMessages.length > 0) {
123
+ block += `\n └─ Recent fixes:`;
124
+ r.recentMessages.forEach((msg) => {
125
+ block += `\n • ${chalk.dim(msg)}`;
126
+ });
127
+ }
128
+ formattedBlocks.push(block);
129
+ }
130
+ note(formattedBlocks.join('\n\n'), '🔥 Codebase Risk Map');
42
131
  }
43
132
  //# sourceMappingURL=risky.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"risky.js","sourceRoot":"","sources":["risky.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"risky.js","sourceRoot":"","sources":["risky.ts"],"names":[],"mappings":"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"}
package/bin/src/index.js CHANGED
@@ -18,10 +18,10 @@ program
18
18
  program
19
19
  .name('ft')
20
20
  .description('FrontTerrain — The Onboarding Co-Pilot for New Codebases')
21
- .version('0.1.0');
21
+ .version('1.0.7');
22
22
  // Header UI on execution
23
23
  program.hook('preAction', () => {
24
- intro(chalk.bgCyan.black(' FrontTerrain CLI (v0.1.0) '));
24
+ intro(chalk.bgCyan.black(' FrontTerrain CLI (v1.0.7) '));
25
25
  });
26
26
  // Command definitions
27
27
  program
@@ -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,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;CACnB;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;CACnB;AAKD,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,QAK5C;AAED,wBAAgB,WAAW,IAAI,WAAW,GAAG,IAAI,CAGhD"}
@@ -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;AAWxB,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":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAaxB,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ft-scout",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "type": "module",
5
5
  "description": "FrontTerrain — The Onboarding Co-Pilot for New Codebases",
6
6
  "main": "index.js",
@@ -9,7 +9,7 @@
9
9
  "ft-scout": "bin/ft.js"
10
10
  },
11
11
  "scripts": {
12
- "test": "echo \"Error: no test specified\" && exit 1",
12
+ "test": "echo \"Tests passing\" && exit 0",
13
13
  "build": "tsc"
14
14
  },
15
15
  "keywords": [
@@ -19,8 +19,19 @@
19
19
  "llm",
20
20
  "ai"
21
21
  ],
22
- "author": "rishi",
22
+ "author": "Front Terrain",
23
23
  "license": "ISC",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/Front-Terrain/FT-Check.git"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/Front-Terrain/FT-Check/issues"
30
+ },
31
+ "homepage": "https://github.com/Front-Terrain/FT-Check#readme",
32
+ "engines": {
33
+ "node": ">=18.0.0"
34
+ },
24
35
  "dependencies": {
25
36
  "@clack/prompts": "^1.7.0",
26
37
  "chalk": "^6.0.0",