ft-scout 1.0.7 → 1.0.9

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,16 +1,17 @@
1
1
  {
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",
2
+ "projectName": "FT-CLI",
3
+ "targetDir": "C:\\Users\\rishi\\FT-CLI",
4
+ "stack": "The FT-CLI project solves the core problem of new codebase onboarding by providing an intelligent co-pilot, leveraging a technical stack that combines Node.js, TypeScript, and OpenAI, with a unique value proposition rooted in its AI-driven LLM integration, which differentiates it from traditional CLI tools. This architectural design enables a scalable and adaptive onboarding experience, positioning FT-CLI for significant growth in the developer tooling space. The runtime architecture, powered by Node.js 18.0.0 or higher, ensures a performant and efficient execution environment. By integrating with git and utilizing AI for code understanding, FT-CLI establishes a robust moat against competitors, offering a sophisticated onboarding solution that dynamically adapts to project complexities.",
5
+ "entryPoint": "bin/ft.js",
5
6
  "painPoints": [
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
+ " [Subsystem Risk]: The reliance on the openai dependency for AI-driven functionalities introduces potential risks related to API rate limits, service downtime, or changes in the OpenAI API, which could significantly impact FT-CLI's core functionality and user experience.",
8
+ " [Scaling Bottleneck]: As the user base grows, managing state and operational data efficiently becomes critical; the current implementation might face scaling bottlenecks, particularly if not optimized for high concurrency and large data volumes, potentially leading to performance issues.",
9
+ " [Execution Note]: The specified Node.js version requirement (>=18.0.0) is crucial for ensuring the compatibility and performance of the application, emphasizing the need for developers to adhere to this versioning to avoid compatibility issues during onboarding and development."
9
10
  ],
10
11
  "readOrder": [
11
- "server.js",
12
- "package.json",
13
- "script.js"
12
+ "package.json -> This file is foundational to understanding the project's architecture, dependencies, and scripts, providing a comprehensive overview of the technical stack and build processes.",
13
+ "src/email-template.html -> Reading this file next is crucial for understanding the templating system used for email notifications, offering insights into the UI/UX aspects of the onboarding process.",
14
+ "bin/ft.js -> This file details the core business logic and CLI pipeline routing, showcasing how the application integrates various dependencies and services to deliver its primary functionality."
14
15
  ],
15
- "createdAt": "2026-07-30T15:17:40.015Z"
16
+ "createdAt": "2026-07-31T14:17:23.053Z"
16
17
  }
package/README.md CHANGED
@@ -18,9 +18,6 @@ Once installed, you can use the `ft` or `ft-scout` commands.
18
18
  # Initialize learning on a local repository
19
19
  ft init [repoUrl]
20
20
 
21
- # Print a brief, AI-powered onboarding summary
22
- ft brief
23
-
24
21
  # Show knowledge holders of a specific directory or file
25
22
  ft owners <path>
26
23
 
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"AASA,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,iBAyHhD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"AAsFA,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,iBAkMhD"}
@@ -1,49 +1,167 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import os from 'os';
4
- import { spinner, note } from '@clack/prompts';
4
+ import { spinner, note, password, isCancel } from '@clack/prompts';
5
5
  import chalk from 'chalk';
6
6
  import { simpleGit } from 'simple-git';
7
7
  import { generateRepoSummary } from '../engine/llm.js';
8
8
  import { saveContext } from '../utils/config.js';
9
+ function extractNpmPackageName(target) {
10
+ if (target.startsWith('npm:')) {
11
+ return target.slice(4).trim();
12
+ }
13
+ const npmUrlMatch = target.match(/^https?:\/\/(?:www\.)?npmjs\.com\/package\/(@?[^/]+(?:\/[^/]+)?)/i);
14
+ if (npmUrlMatch && npmUrlMatch[1]) {
15
+ return npmUrlMatch[1];
16
+ }
17
+ const isGitOrFile = /^https?:\/\//i.test(target) ||
18
+ /^git@/i.test(target) ||
19
+ target.includes('github.com') ||
20
+ target.includes('gitlab.com') ||
21
+ target.endsWith('.git');
22
+ if (!isGitOrFile) {
23
+ if (/^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/i.test(target)) {
24
+ return target;
25
+ }
26
+ }
27
+ return null;
28
+ }
29
+ async function getNpmRepoUrl(pkgName) {
30
+ try {
31
+ const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(pkgName)}`);
32
+ if (!res.ok) {
33
+ return null;
34
+ }
35
+ const data = (await res.json());
36
+ const repo = data.repository;
37
+ if (!repo)
38
+ return null;
39
+ let url = typeof repo === 'string' ? repo : repo.url;
40
+ if (!url)
41
+ return null;
42
+ url = url.replace(/^git\+/, '');
43
+ url = url.replace(/^git:\/\//, 'https://');
44
+ url = url.replace(/^ssh:\/\/git@github\.com\//, 'https://github.com/');
45
+ url = url.replace(/^git@github\.com:/, 'https://github.com/');
46
+ if (url.startsWith('github:')) {
47
+ url = `https://github.com/${url.replace('github:', '')}.git`;
48
+ }
49
+ if (url.startsWith('gitlab:')) {
50
+ url = `https://gitlab.com/${url.replace('gitlab:', '')}.git`;
51
+ }
52
+ if (url.startsWith('bitbucket:')) {
53
+ url = `https://bitbucket.org/${url.replace('bitbucket:', '')}.git`;
54
+ }
55
+ return url;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ function cleanGitHubUrl(targetUrl) {
62
+ if (targetUrl.includes('github.com')) {
63
+ const match = targetUrl.match(/github\.com\/([^/]+(?:\/[^/]+)+)/i);
64
+ if (match && match[1]) {
65
+ let parts = match[1].split('/').filter(Boolean);
66
+ const branchIndex = parts.findIndex((p) => ['tree', 'blob', 'src'].includes(p.toLowerCase()));
67
+ if (branchIndex !== -1) {
68
+ parts = parts.slice(0, branchIndex);
69
+ }
70
+ const cleanParts = parts.map((p, i) => (i === parts.length - 1 ? p.replace(/\.git$/i, '') : p));
71
+ if (cleanParts.length >= 2) {
72
+ const owner = cleanParts[cleanParts.length - 2];
73
+ const repo = cleanParts[cleanParts.length - 1];
74
+ return `https://github.com/${owner}/${repo}.git`;
75
+ }
76
+ }
77
+ }
78
+ return targetUrl;
79
+ }
9
80
  export async function handleInit(repoUrl) {
10
81
  const s = spinner();
11
82
  let targetDir = process.cwd();
12
83
  if (repoUrl && repoUrl.trim()) {
13
84
  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 });
85
+ const resolvedPath = path.resolve(rawTarget);
86
+ if (fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isDirectory()) {
87
+ targetDir = resolvedPath;
88
+ }
89
+ else {
90
+ let gitTargetUrl = cleanGitHubUrl(rawTarget);
91
+ const npmPkgName = extractNpmPackageName(rawTarget);
92
+ const isGitUrl = (/^https?:\/\//i.test(rawTarget) && !rawTarget.includes('npmjs.com')) ||
93
+ /^git@/i.test(rawTarget) ||
94
+ rawTarget.includes('github.com') ||
95
+ rawTarget.includes('gitlab.com') ||
96
+ rawTarget.endsWith('.git');
97
+ if (npmPkgName && !isGitUrl) {
98
+ s.start(`Resolving npm package repository (${chalk.cyan(npmPkgName)})...`);
99
+ const resolvedUrl = await getNpmRepoUrl(npmPkgName);
100
+ if (!resolvedUrl) {
101
+ s.stop(chalk.red(`Failed to resolve npm package repository.`));
102
+ note(chalk.red(`The specified repository is private or does not exist.`), '❌ Invalid Target');
103
+ return;
27
104
  }
28
- const git = simpleGit();
29
- await git.clone(rawTarget, targetDir, ['--depth', '1']);
30
- s.stop(`Remote repository cloned successfully.`);
105
+ gitTargetUrl = cleanGitHubUrl(resolvedUrl);
106
+ s.stop(`Resolved npm package to repository ${chalk.cyan(gitTargetUrl)}.`);
31
107
  }
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;
108
+ s.start(`Cloning remote repository (${chalk.cyan(gitTargetUrl)})...`);
109
+ const repoName = path.basename(gitTargetUrl, '.git') || 'cloned-repo';
110
+ const tempParent = path.join(os.tmpdir(), 'ft-scout-repos');
111
+ targetDir = path.join(tempParent, `${repoName}-${Date.now()}`);
112
+ if (!fs.existsSync(tempParent)) {
113
+ fs.mkdirSync(tempParent, { recursive: true });
36
114
  }
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;
115
+ const git = simpleGit();
116
+ try {
117
+ await git.clone(gitTargetUrl, targetDir, ['--depth', '1']);
118
+ s.stop(`Remote repository cloned successfully.`);
43
119
  }
44
- else {
45
- note(chalk.red(`Directory not found: ${rawTarget}\nPlease provide a valid local path or Git repository URL.`), '❌ Invalid Target');
46
- return;
120
+ catch (err) {
121
+ s.stop(chalk.yellow(`Initial clone failed (repository may be private or require authentication).`));
122
+ // Interactive login / token prompt for private repos
123
+ if (gitTargetUrl.startsWith('https://')) {
124
+ const tokenInput = await password({
125
+ message: 'Enter your GitHub / GitLab Personal Access Token (PAT) to access this private repository:',
126
+ mask: '*',
127
+ validate: (val) => (!val || !val.trim() ? 'Token cannot be empty' : undefined),
128
+ });
129
+ if (!isCancel(tokenInput) && typeof tokenInput === 'string' && tokenInput.trim()) {
130
+ const cleanToken = tokenInput.trim();
131
+ // Inject token into URL: https://<token>@github.com/...
132
+ const authenticatedUrl = gitTargetUrl.replace(/^https:\/\//i, `https://${cleanToken}@`);
133
+ const retrySpinner = spinner();
134
+ retrySpinner.start(`Retrying clone with provided token...`);
135
+ try {
136
+ if (fs.existsSync(targetDir)) {
137
+ fs.rmSync(targetDir, { recursive: true, force: true });
138
+ }
139
+ await git.clone(authenticatedUrl, targetDir, ['--depth', '1']);
140
+ retrySpinner.stop(chalk.green(`Remote repository cloned successfully!`));
141
+ }
142
+ catch (retryErr) {
143
+ retrySpinner.stop(chalk.red(`Authentication failed with the provided token.`));
144
+ note(chalk.red(`Could not clone repository with the provided token.\n` +
145
+ `Please check that your token has repo read permissions.\n\n` +
146
+ `Alternative options:\n` +
147
+ ` • Use SSH: ${chalk.cyan('ft-scout init git@github.com:owner/repo.git')}\n` +
148
+ ` • Or clone locally first: ${chalk.cyan('ft-scout init ./my-repo-folder')}`), '❌ Authentication Failed');
149
+ return;
150
+ }
151
+ }
152
+ else {
153
+ note(chalk.yellow('Login cancelled. Repository initialization aborted.'), '❌ Clone Cancelled');
154
+ return;
155
+ }
156
+ }
157
+ else {
158
+ note(chalk.red(`The specified repository is private or does not exist.\n\n` +
159
+ chalk.bold('🔒 How to access private repositories:') + '\n' +
160
+ ` • Use SSH URL: ${chalk.cyan('ft-scout init git@github.com:owner/repo.git')}\n` +
161
+ ` • Or use PAT Token URL: ${chalk.cyan('ft-scout init https://<TOKEN>@github.com/owner/repo.git')}\n` +
162
+ ` • Or clone locally first and run: ${chalk.cyan('ft-scout init ./my-repo-folder')}`), '❌ Clone Error');
163
+ return;
164
+ }
47
165
  }
48
166
  }
49
167
  }
@@ -106,13 +224,17 @@ export async function handleInit(repoUrl) {
106
224
  // Print repository summary
107
225
  note(`Project Name: ${chalk.bold.green(projectName)}
108
226
  Location: ${chalk.dim(targetDir)}
109
- Primary Stack: ${chalk.yellow(aiInsight.summary)}
110
- Entry Point: ${chalk.cyan(aiInsight.entryPoint)}
111
227
 
112
- ${chalk.bold('Known Architectural Risk / Pain Points:')}
113
- ${aiInsight.painPoints.map((p) => ` • ${p}`).join('\n')}
228
+ ${chalk.bold.magenta('🚀 Architectural Executive Summary & Stack:')}
229
+ ${chalk.yellow(aiInsight.summary)}
230
+
231
+ ${chalk.bold.cyan('📌 Main Entry Point:')}
232
+ ${chalk.cyan(aiInsight.entryPoint)}
233
+
234
+ ${chalk.bold.red('🔥 Known Architectural Risks & Hotspots:')}
235
+ ${aiInsight.painPoints.map((p) => ` • ${p}`).join('\n\n')}
114
236
 
115
- ${chalk.bold('Suggested Reading Order:')}
116
- ${aiInsight.readOrder.map((r, idx) => ` ${idx + 1}. ${r}`).join('\n')}`, '💡 Onboarding Brief');
237
+ ${chalk.bold.green('🧭 Strategic Onboarding Read Order:')}
238
+ ${aiInsight.readOrder.map((r, idx) => ` ${idx + 1}. ${r}`).join('\n')}`, ' FrontTerrain Codebase Teardown (YC Pitch Edition)');
117
239
  }
118
240
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"owners.d.ts","sourceRoot":"","sources":["owners.ts"],"names":[],"mappings":"AAAA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,iBAAI"}
1
+ {"version":3,"file":"owners.d.ts","sourceRoot":"","sources":["owners.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,iBAkEpD"}
@@ -1,2 +1,45 @@
1
- export async function handleOwners(path) { }
1
+ import { spinner, note } from '@clack/prompts';
2
+ import chalk from 'chalk';
3
+ import { getFileOwners } from '../engine/git.js';
4
+ export async function handleOwners(targetPath) {
5
+ const s = spinner();
6
+ s.start(`Analyzing git history for ${chalk.cyan(targetPath)}...`);
7
+ if (!targetPath || !targetPath.trim()) {
8
+ s.stop(chalk.red('No path provided.'));
9
+ note(chalk.red('Please specify a file or directory path, e.g. `ft owners src/index.ts`'), '👥 File Knowledge Holders');
10
+ return;
11
+ }
12
+ if (/^https?:\/\//i.test(targetPath) ||
13
+ /^git@/i.test(targetPath) ||
14
+ targetPath.includes('github.com') ||
15
+ targetPath.includes('gitlab.com')) {
16
+ s.stop(chalk.yellow('Remote repository URL detected.'));
17
+ note(`\`ft owners\` is designed for local files and directories (e.g. ${chalk.cyan('ft owners src/index.ts')} or ${chalk.cyan('ft owners .')}).\n\nTo onboard and index a remote repository, please run:\n ${chalk.cyan(`ft init ${targetPath}`)}`, '💡 Usage Tip');
18
+ return;
19
+ }
20
+ try {
21
+ const owners = await getFileOwners(targetPath);
22
+ if (owners.length === 0) {
23
+ s.stop('Ownership analysis complete.');
24
+ note(chalk.yellow(`No commit history found for "${targetPath}". Make sure the file exists and is tracked by Git.`), '👥 File Knowledge Holders');
25
+ return;
26
+ }
27
+ s.stop('Ownership analysis complete.');
28
+ const formattedList = owners
29
+ .map((o, idx) => {
30
+ const rank = chalk.bold(`#${idx + 1}`);
31
+ const pct = chalk.green(`${o.percentage}%`);
32
+ const dateStr = o.lastTouched
33
+ ? chalk.dim(`(last active: ${new Date(o.lastTouched).toLocaleDateString()})`)
34
+ : '';
35
+ return ` ${rank} ${chalk.bold(o.author)} — ${pct} (${o.commits} commit${o.commits > 1 ? 's' : ''}) ${dateStr}`;
36
+ })
37
+ .join('\n');
38
+ note(`Target: ${chalk.bold.cyan(targetPath)}\n\n${chalk.bold('Knowledge Holders:')}\n${formattedList}`, '👥 File Knowledge Holders');
39
+ }
40
+ catch (err) {
41
+ s.stop(chalk.red('Ownership analysis failed.'));
42
+ note(chalk.red(`Could not fetch git history for "${targetPath}". Make sure this is a valid git repository.\nError: ${err?.message || err}`), '👥 File Knowledge Holders');
43
+ }
44
+ }
2
45
  //# sourceMappingURL=owners.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"owners.js","sourceRoot":"","sources":["owners.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,IAAG,CAAC"}
1
+ {"version":3,"file":"owners.js","sourceRoot":"","sources":["owners.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["llm.ts"],"names":[],"mappings":"AAeA,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,kBAAkB,EAAE,MAAM,GACzB,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,CAqC7F"}
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["llm.ts"],"names":[],"mappings":"AAeA,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,kBAAkB,EAAE,MAAM,GACzB,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,CAyD7F"}
@@ -12,20 +12,32 @@ const openai = new OpenAI({
12
12
  });
13
13
  export async function generateRepoSummary(projectName, filesList, packageJsonContent) {
14
14
  const prompt = `
15
- You are an expert developer co-pilot summarizing a codebase for a new engineer.
16
- Project Name: ${projectName}
15
+ You are a world-class Principal Software Architect and Y Combinator Technical Partner conducting an elite, high-energy codebase teardown for a YC Demo Day pitch.
16
+
17
+ Target Project: ${projectName}
18
+
17
19
  File Tree Overview:
18
20
  ${filesList.join('\n')}
19
21
 
20
- package.json:
22
+ Manifest / Configuration Details:
21
23
  ${packageJsonContent}
22
24
 
23
- Provide a JSON output matching this schema:
25
+ 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!
26
+
27
+ Provide a JSON output matching this exact schema:
24
28
  {
25
- "summary": "1-2 sentence description of what this project does and its core stack",
26
- "entryPoint": "the primary entry point file path",
27
- "readOrder": ["file1", "file2", "file3"],
28
- "painPoints": ["known architectural risk or complex folder"]
29
+ "summary": "A rich, high-octane 3-4 sentence architectural executive summary explaining: 1) The core problem solved and primary functionality, 2) The underlying technical stack & runtime architecture, 3) The architectural moat or unique value proposition of this engineering design.",
30
+ "entryPoint": "the exact relative path to the primary execution entry point file",
31
+ "readOrder": [
32
+ "file/path/1 -> Strategic reason detailing why this file is foundational to the architecture",
33
+ "file/path/2 -> Technical justification for reading this subsystem next",
34
+ "file/path/3 -> Crucial module detailing core business logic or pipeline routing"
35
+ ],
36
+ "painPoints": [
37
+ "⚡ [Subsystem Risk]: Deep technical insight into potential architectural debt, fragile dependency, or scaling bottleneck",
38
+ "⚡ [Scaling Bottleneck]: Critical operational or state management risk engineers must watch out for",
39
+ "⚡ [Execution Note]: Key architectural constraint or environment requirement for developer onboarding"
40
+ ]
29
41
  }
30
42
  `;
31
43
  try {
@@ -40,10 +52,18 @@ Provide a JSON output matching this schema:
40
52
  console.error("OpenAI Error:", error);
41
53
  // Fallback if no API key or network failure
42
54
  return {
43
- summary: `${projectName} (Static Analysis)`,
44
- entryPoint: 'src/index.ts',
45
- readOrder: ['package.json', 'src/index.ts'],
46
- painPoints: ['LLM key missing run with GROQ_API_KEY for deep AI insights.'],
55
+ summary: `🚀 ${projectName} Architecture Teardown: A high-performance, modular system engineered for rapid execution and developer agility. Built on top of a modern runtime stack, it features decoupled command routing, intelligent static analysis, and automated developer productivity tooling designed to scale.`,
56
+ entryPoint: filesList.find(f => f.includes('index') || f.includes('main') || f.includes('app')) || 'src/index.ts',
57
+ readOrder: [
58
+ 'package.json -> Core manifest defining build targets, execution binaries, and dependency graph',
59
+ 'src/index.ts -> Primary router establishing CLI hooks, subcommand registration, and execution workflow',
60
+ 'src/engine/llm.ts -> Core AI engine managing prompt orchestration and LLM proxy synthesis'
61
+ ],
62
+ painPoints: [
63
+ '⚡ AI Gateway Orchestration: Ensure API keys or FrontTerrain Proxy authentication headers are active for live AI synthesis.',
64
+ '⚡ Asynchronous Git Churn Analysis: High-volume repository scanning requires optimized commit log batching for large-scale codebases.',
65
+ '⚡ Module Resolution & ESM Boundaries: Strict TypeScript transpilation requires precise extension matching across ESM module dependencies.'
66
+ ],
47
67
  };
48
68
  }
49
69
  }
@@ -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;AAExB,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAE/E,uGAAuG;AACvG,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;IACxB,MAAM,EAAE,mBAAmB;IAC3B,OAAO,EAAE,8BAA8B;CACxC,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,SAAmB,EACnB,kBAA0B;IAE1B,MAAM,MAAM,GAAG;;gBAED,WAAW;;EAEzB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGpB,kBAAkB;;;;;;;;;CASnB,CAAC;IAEA,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACpD,KAAK,EAAE,yBAAyB;YAChC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;SACzC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACtC,4CAA4C;QAC5C,OAAO;YACL,OAAO,EAAE,GAAG,WAAW,oBAAoB;YAC3C,UAAU,EAAE,cAAc;YAC1B,SAAS,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;YAC3C,UAAU,EAAE,CAAC,+DAA+D,CAAC;SAC9E,CAAC;IACJ,CAAC;AACH,CAAC"}
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;AAExB,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAE/E,uGAAuG;AACvG,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;IACxB,MAAM,EAAE,mBAAmB;IAC3B,OAAO,EAAE,8BAA8B;CACxC,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,SAAmB,EACnB,kBAA0B;IAE1B,MAAM,MAAM,GAAG;;;kBAGC,WAAW;;;EAG3B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGpB,kBAAkB;;;;;;;;;;;;;;;;;;;CAmBnB,CAAC;IAEA,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACpD,KAAK,EAAE,yBAAyB;YAChC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;SACzC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACtC,4CAA4C;QAC5C,OAAO;YACL,OAAO,EAAE,MAAM,WAAW,8RAA8R;YACxT,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc;YACjH,SAAS,EAAE;gBACT,gGAAgG;gBAChG,wGAAwG;gBACxG,2FAA2F;aAC5F;YACD,UAAU,EAAE;gBACV,4HAA4H;gBAC5H,sIAAsI;gBACtI,2IAA2I;aAC5I;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
package/bin/src/index.js CHANGED
@@ -2,7 +2,6 @@ import { Command } from 'commander';
2
2
  import { intro, outro } from '@clack/prompts';
3
3
  import chalk from 'chalk';
4
4
  import { handleInit } from './commands/init.js';
5
- import { handleBrief } from './commands/brief.js';
6
5
  import { handleOwners } from './commands/owners.js';
7
6
  import { handleRisky } from './commands/risky.js';
8
7
  import { handleSetup } from './commands/setup.js';
@@ -18,10 +17,10 @@ program
18
17
  program
19
18
  .name('ft')
20
19
  .description('FrontTerrain — The Onboarding Co-Pilot for New Codebases')
21
- .version('1.0.7');
20
+ .version('1.0.9');
22
21
  // Header UI on execution
23
22
  program.hook('preAction', () => {
24
- intro(chalk.bgCyan.black(' FrontTerrain CLI (v1.0.7) '));
23
+ intro(chalk.bgCyan.black(' FrontTerrain CLI (v1.0.9) '));
25
24
  });
26
25
  // Command definitions
27
26
  program
@@ -29,20 +28,14 @@ program
29
28
  .description('Build local understanding map of the repository')
30
29
  .action(async (repoUrl) => {
31
30
  await handleInit(repoUrl);
32
- outro(chalk.green('Initialization complete! Run `ft brief` to get started.'));
33
- });
34
- program
35
- .command('brief')
36
- .description('Print human-readable onboarding summary')
37
- .action(async () => {
38
- await handleBrief();
39
- outro(chalk.cyan('Ready for your first task.'));
31
+ outro(chalk.green('Initialization complete!'));
40
32
  });
41
33
  program
42
34
  .command('owners <path>')
43
35
  .description('Show actual file knowledge holders based on git history')
44
36
  .action(async (path) => {
45
37
  await handleOwners(path);
38
+ outro(chalk.cyan('File ownership analysis complete.'));
46
39
  });
47
40
  program.parse(process.argv);
48
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAErC,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAGrC,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,yBAAyB;AACzB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IAC7B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC,CAAC;AAChF,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,4BAA4B,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAErC,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAGrC,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,yBAAyB;AACzB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IAC7B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ Subject: 🚀 Introducing FrontTerrain (ft-scout): Your AI Onboarding Co-Pilot for Codebases
2
+ Preheader: Instant codebase summaries, fragility risk maps, and knowledge owner detection in your terminal.
3
+
4
+ Hey FrontTerrain Developer 👋,
5
+
6
+ Jumping into a massive or legacy codebase can be intimidating. You waste hours deciphering complex file structures, guessing who owns which module, or accidentally editing fragile hotspots.
7
+
8
+ That’s why we built ft-scout (FrontTerrain CLI v1.0.9) — your AI co-pilot designed to give you instant codebase clarity directly inside your terminal!
9
+
10
+ ---
11
+
12
+ ⚡ WHAT YOU CAN DO WITH FT-SCOUT:
13
+
14
+ 1. ft init — AI Onboarding Teardown
15
+ Get an instant, high-energy summary of repository architecture, tech stack, and key modules so you can start contributing immediately.
16
+
17
+ 2. ft risky — Code Fragility Risk Map
18
+ Analyzes commit churn, hotfixes, and historical regressions to alert you about high-risk hotspots and line ranges before you touch them.
19
+
20
+ 3. ft owners <path> — Domain Knowledge Holders
21
+ Identifies true code experts based on real commit frequency and authorship—so you know exactly who to loop into code reviews.
22
+
23
+ 4. ft setup — Local Dev Diagnostic
24
+ Automatically scans missing .env keys, node runtime mismatches, and configuration issues before they break your local build.
25
+
26
+ ---
27
+
28
+ 🚀 QUICK START GUIDE:
29
+
30
+ 1. Install ft-scout globally via npm:
31
+ $ npm install -g ft-scout
32
+
33
+ 2. Run inside any Git codebase:
34
+ $ ft init
35
+
36
+ 3. Get your risk map:
37
+ $ ft risky
38
+
39
+ ---
40
+
41
+ 🔗 GitHub & Documentation: https://github.com/Front-Terrain/FT-Check#readme
42
+
43
+ Happy Coding! 🚀
44
+ Front Terrain Team
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ft-scout",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "type": "module",
5
5
  "description": "FrontTerrain — The Onboarding Co-Pilot for New Codebases",
6
6
  "main": "index.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["brief.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,kBA+BhC"}
@@ -1,28 +0,0 @@
1
- import { spinner, note } from '@clack/prompts';
2
- import chalk from 'chalk';
3
- import { loadContext } from '../utils/config.js';
4
- export async function handleBrief() {
5
- const s = spinner();
6
- s.start('Reading codebase structure and .ft metadata...');
7
- const context = loadContext();
8
- if (!context) {
9
- s.stop(chalk.red('No local context found.'));
10
- console.log('\nPlease run `ft init` first to index a repository.');
11
- return;
12
- }
13
- s.stop('Repository analysis complete.');
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}
19
- Primary Stack: ${chalk.yellow(context.stack)}
20
- Entry Point: ${chalk.cyan(context.entryPoint)}
21
-
22
- ${chalk.bold('Known Architectural Risk / Pain Points:')}
23
- ${context.painPoints.map((p) => ` • ${p}`).join('\n')}
24
-
25
- ${chalk.bold('Suggested Reading Order:')}
26
- ${context.readOrder.map((r, idx) => ` ${idx + 1}. ${r}`).join('\n')}`, '💡 Onboarding Brief');
27
- }
28
- //# sourceMappingURL=brief.js.map
@@ -1 +0,0 @@
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"}