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 +11 -10
- package/README.md +0 -3
- package/bin/src/commands/init.d.ts.map +1 -1
- package/bin/src/commands/init.js +158 -36
- package/bin/src/commands/init.js.map +1 -1
- package/bin/src/commands/owners.d.ts.map +1 -1
- package/bin/src/commands/owners.js +44 -1
- package/bin/src/commands/owners.js.map +1 -1
- package/bin/src/engine/llm.d.ts.map +1 -1
- package/bin/src/engine/llm.js +32 -12
- package/bin/src/engine/llm.js.map +1 -1
- package/bin/src/index.js +4 -11
- package/bin/src/index.js.map +1 -1
- package/email-template.txt +44 -0
- package/package.json +1 -1
- package/bin/src/commands/brief.d.ts.map +0 -1
- package/bin/src/commands/brief.js +0 -28
- package/bin/src/commands/brief.js.map +0 -1
package/.ft/context.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"projectName": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
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
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
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
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
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-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"AAsFA,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,iBAkMhD"}
|
package/bin/src/commands/init.js
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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('
|
|
113
|
-
${
|
|
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('
|
|
116
|
-
${aiInsight.readOrder.map((r, idx) => ` ${idx + 1}. ${r}`).join('\n')}`, '
|
|
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":"
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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"}
|
package/bin/src/engine/llm.js
CHANGED
|
@@ -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
|
|
16
|
-
|
|
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
|
-
|
|
22
|
+
Manifest / Configuration Details:
|
|
21
23
|
${packageJsonContent}
|
|
22
24
|
|
|
23
|
-
|
|
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": "
|
|
26
|
-
"entryPoint": "the primary entry point file
|
|
27
|
-
"readOrder": [
|
|
28
|
-
|
|
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:
|
|
44
|
-
entryPoint: 'src/index.ts',
|
|
45
|
-
readOrder: [
|
|
46
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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!
|
|
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
|
package/bin/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,
|
|
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 +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"}
|