ft-scout 5.0.1 → 5.0.2

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/bin/src/index.js CHANGED
@@ -30,13 +30,13 @@ program
30
30
  .name('scout')
31
31
  .alias('ft')
32
32
  .description('FrontTerrain — The Onboarding Co-Pilot for New Codebases')
33
- .version('5.0.1');
33
+ .version('5.0.2');
34
34
  // Header UI on execution with FrontTerrain proprietary logo & version auto-checker
35
35
  program.hook('preAction', async (_thisCommand, actionCommand) => {
36
- intro(renderBranding('5.0.1'));
36
+ intro(renderBranding('5.0.2'));
37
37
  const cmdName = actionCommand ? actionCommand.name() : '';
38
38
  if (cmdName !== 'upgrade') {
39
- await checkForUpdates('5.0.1');
39
+ await checkForUpdates('5.0.2');
40
40
  }
41
41
  // Auth Guard: enforce authentication for all commands except login, signup, upgrade, help, dashboard, auth, status
42
42
  const EXEMPT_COMMANDS = ['login', 'signin', 'signup', 'register', 'upgrade', 'help', 'dashboard', 'web-ui', 'gui', 'auth', 'status'];
@@ -221,7 +221,7 @@ program
221
221
  .command('upgrade')
222
222
  .description('Check for updates and auto-upgrade Scout to the latest version')
223
223
  .action(async () => {
224
- await checkForUpdates('5.0.1', true);
224
+ await checkForUpdates('5.0.2', true);
225
225
  outro(chalk.cyan('Upgrade check complete.'));
226
226
  });
227
227
  program
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAsDxB,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAqB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAyK/G"}
@@ -0,0 +1,207 @@
1
+ import http from 'http';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { exec } from 'child_process';
5
+ import { fileURLToPath } from 'url';
6
+ import { loadAuthConfig, saveAuthConfig, clearAuthConfig, isLoggedIn } from '../utils/auth.js';
7
+ const DEFAULT_PORT = 9120;
8
+ function getPackageRoot() {
9
+ let currentDir = path.dirname(fileURLToPath(import.meta.url));
10
+ while (currentDir !== path.dirname(currentDir)) {
11
+ if (fs.existsSync(path.join(currentDir, 'package.json')) && fs.existsSync(path.join(currentDir, 'web', 'index.html'))) {
12
+ return currentDir;
13
+ }
14
+ currentDir = path.dirname(currentDir);
15
+ }
16
+ return process.cwd();
17
+ }
18
+ function getWebDir() {
19
+ const pkgRoot = getPackageRoot();
20
+ const possiblePaths = [
21
+ path.join(pkgRoot, 'web'),
22
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../web'),
23
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../web'),
24
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../web'),
25
+ path.join(process.cwd(), 'web'),
26
+ ];
27
+ for (const p of possiblePaths) {
28
+ if (fs.existsSync(p) && fs.existsSync(path.join(p, 'index.html'))) {
29
+ return p;
30
+ }
31
+ }
32
+ return path.join(pkgRoot, 'web');
33
+ }
34
+ function getMimeType(filePath) {
35
+ const ext = path.extname(filePath).toLowerCase();
36
+ switch (ext) {
37
+ case '.html': return 'text/html; charset=utf-8';
38
+ case '.css': return 'text/css; charset=utf-8';
39
+ case '.js': return 'application/javascript; charset=utf-8';
40
+ case '.json': return 'application/json; charset=utf-8';
41
+ case '.png': return 'image/png';
42
+ case '.jpg':
43
+ case '.jpeg': return 'image/jpeg';
44
+ case '.svg': return 'image/svg+xml';
45
+ case '.ico': return 'image/x-icon';
46
+ default: return 'text/plain; charset=utf-8';
47
+ }
48
+ }
49
+ export function startDashboardServer(port = DEFAULT_PORT) {
50
+ return new Promise((resolve, reject) => {
51
+ const webDir = getWebDir();
52
+ const server = http.createServer(async (req, res) => {
53
+ // Enable CORS for cross-origin local dashboard sync
54
+ res.setHeader('Access-Control-Allow-Origin', '*');
55
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
56
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
57
+ if (req.method === 'OPTIONS') {
58
+ res.writeHead(204);
59
+ res.end();
60
+ return;
61
+ }
62
+ const reqUrl = req.url || '/';
63
+ const parsedUrl = new URL(reqUrl, `http://localhost:${port}`);
64
+ const pathname = parsedUrl.pathname;
65
+ // API Endpoints
66
+ if (pathname.startsWith('/api/')) {
67
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
68
+ // GET /api/status - Live CLI & Auth state
69
+ if (pathname === '/api/status' && req.method === 'GET') {
70
+ const authConfig = loadAuthConfig();
71
+ const scanReportPath = path.join(process.cwd(), '.ft', 'scan-report.json');
72
+ let scanReport = null;
73
+ if (fs.existsSync(scanReportPath)) {
74
+ try {
75
+ scanReport = JSON.parse(fs.readFileSync(scanReportPath, 'utf-8'));
76
+ }
77
+ catch { }
78
+ }
79
+ res.writeHead(200);
80
+ res.end(JSON.stringify({
81
+ status: 'ok',
82
+ serverConnected: true,
83
+ isLoggedIn: isLoggedIn(),
84
+ auth: authConfig,
85
+ repoPath: process.cwd(),
86
+ repoName: path.basename(process.cwd()),
87
+ scanReport,
88
+ }));
89
+ return;
90
+ }
91
+ // POST /api/save-auth - Save authentication state to ~/.ft/auth.json
92
+ if (pathname === '/api/save-auth' && req.method === 'POST') {
93
+ let body = '';
94
+ req.on('data', chunk => body += chunk);
95
+ req.on('end', () => {
96
+ try {
97
+ const data = JSON.parse(body);
98
+ const existing = loadAuthConfig();
99
+ const updated = {
100
+ token: data.token || existing.token,
101
+ refreshToken: data.refreshToken || existing.refreshToken,
102
+ user: data.user || existing.user,
103
+ tenantId: data.tenantId || existing.tenantId || 'ft-scout-auth-gc2v5',
104
+ provider: data.provider || existing.provider || 'firebase',
105
+ loggedInAt: new Date().toISOString(),
106
+ creditsUsed: typeof data.creditsUsed === 'number' ? data.creditsUsed : (existing.creditsUsed ?? 0),
107
+ creditsTotal: typeof data.creditsTotal === 'number' ? data.creditsTotal : (existing.creditsTotal ?? 100),
108
+ currentTier: data.currentTier || existing.currentTier || 'free',
109
+ renewAt: data.renewAt || existing.renewAt,
110
+ byokEnabled: typeof data.byokEnabled === 'boolean' ? data.byokEnabled : existing.byokEnabled,
111
+ customLlmProvider: data.customLlmProvider || existing.customLlmProvider || 'gemini',
112
+ customApiKey: data.customApiKey !== undefined ? data.customApiKey : existing.customApiKey,
113
+ customBaseUrl: data.customBaseUrl !== undefined ? data.customBaseUrl : existing.customBaseUrl,
114
+ };
115
+ saveAuthConfig(updated);
116
+ res.writeHead(200);
117
+ res.end(JSON.stringify({ success: true, auth: updated }));
118
+ }
119
+ catch (err) {
120
+ res.writeHead(400);
121
+ res.end(JSON.stringify({ success: false, error: err.message || 'Invalid JSON' }));
122
+ }
123
+ });
124
+ return;
125
+ }
126
+ // POST /api/logout - Clear CLI session
127
+ if (pathname === '/api/logout' && req.method === 'POST') {
128
+ clearAuthConfig();
129
+ res.writeHead(200);
130
+ res.end(JSON.stringify({ success: true }));
131
+ return;
132
+ }
133
+ // POST /api/cli/exec - Execute real CLI command locally
134
+ if (pathname === '/api/cli/exec' && req.method === 'POST') {
135
+ let body = '';
136
+ req.on('data', chunk => body += chunk);
137
+ req.on('end', () => {
138
+ try {
139
+ const data = JSON.parse(body);
140
+ let command = data.command || '';
141
+ command = command.trim().replace(/^(scout|ft)\s*/i, '');
142
+ if (!command) {
143
+ res.writeHead(400);
144
+ res.end(JSON.stringify({ error: 'Command string required' }));
145
+ return;
146
+ }
147
+ const pkgRoot = getPackageRoot();
148
+ const binScript = path.join(pkgRoot, 'bin', 'ft.js');
149
+ const indexScript = path.join(pkgRoot, 'bin', 'src', 'index.ts');
150
+ let execCmd;
151
+ if (fs.existsSync(binScript)) {
152
+ execCmd = `node "${binScript}" ${command}`;
153
+ }
154
+ else if (fs.existsSync(indexScript)) {
155
+ execCmd = `npx tsx "${indexScript}" ${command}`;
156
+ }
157
+ else {
158
+ execCmd = `ft ${command}`;
159
+ }
160
+ exec(execCmd, { cwd: process.cwd() }, (err, stdout, stderr) => {
161
+ const output = (stdout || '') + (stderr || '');
162
+ res.writeHead(200);
163
+ res.end(JSON.stringify({ success: !err, output: output || 'Command executed successfully.' }));
164
+ });
165
+ }
166
+ catch (err) {
167
+ res.writeHead(400);
168
+ res.end(JSON.stringify({ error: err.message || 'Invalid payload' }));
169
+ }
170
+ });
171
+ return;
172
+ }
173
+ res.writeHead(404);
174
+ res.end(JSON.stringify({ error: 'API route not found' }));
175
+ return;
176
+ }
177
+ // Static File Server
178
+ let targetFile = pathname === '/' ? 'index.html' : pathname.replace(/^\//, '');
179
+ let filePath = path.join(webDir, targetFile);
180
+ if (!fs.existsSync(filePath) || fs.statSync(filePath).isDirectory()) {
181
+ filePath = path.join(webDir, 'index.html');
182
+ }
183
+ try {
184
+ const content = fs.readFileSync(filePath);
185
+ res.writeHead(200, { 'Content-Type': getMimeType(filePath) });
186
+ res.end(content);
187
+ }
188
+ catch (err) {
189
+ res.writeHead(500);
190
+ res.end('Error loading dashboard files');
191
+ }
192
+ });
193
+ server.on('error', (err) => {
194
+ if (err.code === 'EADDRINUSE') {
195
+ startDashboardServer(port + 1).then(resolve).catch(reject);
196
+ }
197
+ else {
198
+ reject(err);
199
+ }
200
+ });
201
+ server.listen(port, () => {
202
+ const url = `http://localhost:${port}`;
203
+ resolve({ server, url });
204
+ });
205
+ });
206
+ }
207
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/D,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAoBD,wBAAgB,cAAc,IAAI,UAAU,CAkB3C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAGvD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAG5C;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAGnD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/D,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AA4BD,wBAAgB,cAAc,IAAI,UAAU,CA0B3C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAGvD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAG5C;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAGnD;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAU,GAAG,mBAAmB,CA0CrE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAkB3G"}
@@ -10,6 +10,14 @@ const DEFAULT_AUTH_CONFIG = {
10
10
  provider: null,
11
11
  user: null,
12
12
  loggedInAt: null,
13
+ creditsUsed: 0,
14
+ creditsTotal: 100,
15
+ currentTier: 'free',
16
+ renewAt: null,
17
+ byokEnabled: false,
18
+ customLlmProvider: 'gemini',
19
+ customApiKey: undefined,
20
+ customBaseUrl: undefined,
13
21
  };
14
22
  function ensureAuthDir() {
15
23
  if (!fs.existsSync(AUTH_DIR)) {
@@ -30,6 +38,14 @@ export function loadAuthConfig() {
30
38
  provider: typeof parsed.provider === 'string' ? parsed.provider : 'firebase',
31
39
  user: parsed.user && typeof parsed.user === 'object' ? parsed.user : null,
32
40
  loggedInAt: typeof parsed.loggedInAt === 'string' ? parsed.loggedInAt : null,
41
+ creditsUsed: typeof parsed.creditsUsed === 'number' ? parsed.creditsUsed : 0,
42
+ creditsTotal: typeof parsed.creditsTotal === 'number' ? parsed.creditsTotal : 100,
43
+ currentTier: typeof parsed.currentTier === 'string' ? parsed.currentTier : 'free',
44
+ renewAt: typeof parsed.renewAt === 'string' ? parsed.renewAt : null,
45
+ byokEnabled: typeof parsed.byokEnabled === 'boolean' ? parsed.byokEnabled : false,
46
+ customLlmProvider: typeof parsed.customLlmProvider === 'string' ? parsed.customLlmProvider : 'gemini',
47
+ customApiKey: typeof parsed.customApiKey === 'string' ? parsed.customApiKey : undefined,
48
+ customBaseUrl: typeof parsed.customBaseUrl === 'string' ? parsed.customBaseUrl : undefined,
33
49
  };
34
50
  }
35
51
  catch {
@@ -56,4 +72,56 @@ export function getCurrentUser() {
56
72
  const config = loadAuthConfig();
57
73
  return config.user;
58
74
  }
75
+ export function consumeCredit(amount = 1) {
76
+ const config = loadAuthConfig();
77
+ if (config.byokEnabled) {
78
+ return {
79
+ success: true,
80
+ isByok: true,
81
+ remaining: Infinity,
82
+ isLowCredit: false,
83
+ reason: 'BYOK Mode Active (Custom API / Proxy Endpoint used)',
84
+ };
85
+ }
86
+ const used = config.creditsUsed ?? 0;
87
+ const total = config.creditsTotal ?? 100;
88
+ const remaining = total - used;
89
+ if (remaining < amount) {
90
+ return {
91
+ success: false,
92
+ isByok: false,
93
+ remaining: Math.max(0, remaining),
94
+ isLowCredit: true,
95
+ reason: `Credit limit reached for ${config.currentTier || 'Free'} plan (${used}/${total} credits consumed).`,
96
+ };
97
+ }
98
+ const remainingAfter = total - (used + amount);
99
+ const isLowCredit = remainingAfter <= Math.ceil(total * 0.15);
100
+ const updatedConfig = {
101
+ ...config,
102
+ creditsUsed: used + amount,
103
+ };
104
+ saveAuthConfig(updatedConfig);
105
+ return {
106
+ success: true,
107
+ isByok: false,
108
+ remaining: remainingAfter,
109
+ isLowCredit,
110
+ };
111
+ }
112
+ export function checkTierAccess(feature) {
113
+ const config = loadAuthConfig();
114
+ if (config.byokEnabled) {
115
+ return { allowed: true };
116
+ }
117
+ const used = config.creditsUsed ?? 0;
118
+ const total = config.creditsTotal ?? 100;
119
+ if (used >= total) {
120
+ return {
121
+ allowed: false,
122
+ reason: `Credit quota exhausted (${used}/${total} credits used). Upgrade your plan or enable BYOK mode in dashboard.`,
123
+ };
124
+ }
125
+ return { allowed: true };
126
+ }
59
127
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import chalk from 'chalk';
2
- export function renderBranding(version = '5.0.1') {
2
+ export function renderBranding(version = '5.0.2') {
3
3
  const logo = chalk.cyan.bold(' ███████╗████████╗') + ' ' + chalk.white.bold('███████╗██████╗ ██████╗ ██╗ ██╗████████╗') + '\n' +
4
4
  chalk.cyan.bold(' ██╔════╝╚══██╔══╝') + ' ' + chalk.white.bold('██╔════╝██╔════╝██╔═══██╗██║ ██║╚══██╔══╝') + '\n' +
5
5
  chalk.cyan.bold(' █████╗ ██║ ') + ' ' + chalk.white.bold('███████╗██║ ██║ ██║██║ ██║ ██║ ') + '\n' +
@@ -0,0 +1,31 @@
1
+ [debug] [2026-08-08T14:20:30.561Z] ----------------------------------------------------------------------
2
+ [debug] [2026-08-08T14:20:30.565Z] Command: C:\Program Files\nodejs\node.exe C:\Users\rishi\AppData\Roaming\npm\node_modules\firebase-tools\lib\bin\firebase.js deploy --only hosting
3
+ [debug] [2026-08-08T14:20:30.565Z] CLI Version: 15.24.0
4
+ [debug] [2026-08-08T14:20:30.566Z] Platform: win32
5
+ [debug] [2026-08-08T14:20:30.566Z] Node Version: v22.20.0
6
+ [debug] [2026-08-08T14:20:30.566Z] Detected Agent: unknown
7
+ [debug] [2026-08-08T14:20:30.566Z] Time: Sat Aug 08 2026 19:50:30 GMT+0530 (India Standard Time)
8
+ [debug] [2026-08-08T14:20:30.567Z] ----------------------------------------------------------------------
9
+ [debug]
10
+ [debug] [2026-08-08T14:20:33.083Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
11
+ [debug] [2026-08-08T14:20:33.084Z] > authorizing via signed-in user (rishishandilya40@gmail.com)
12
+ [debug] [2026-08-08T14:20:33.084Z] [iam] checking project frontterrain for permissions ["firebase.projects.get","firebasehosting.sites.update"]
13
+ [debug] [2026-08-08T14:20:33.098Z] Checked if tokens are valid: true, expires at: 1786200042441
14
+ [debug] [2026-08-08T14:20:33.098Z] Checked if tokens are valid: true, expires at: 1786200042441
15
+ [debug] [2026-08-08T14:20:33.100Z] >>> [apiv2][query] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions [none]
16
+ [debug] [2026-08-08T14:20:33.100Z] >>> [apiv2][(partial)header] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions x-goog-user-project=frontterrain
17
+ [debug] [2026-08-08T14:20:33.100Z] >>> [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions {"permissions":["firebase.projects.get","firebasehosting.sites.update"]}
18
+ [debug] [2026-08-08T14:20:34.674Z] <<< [apiv2][status] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions 200
19
+ [debug] [2026-08-08T14:20:34.675Z] <<< [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions {"permissions":["firebase.projects.get","firebasehosting.sites.update"]}
20
+ [debug] [2026-08-08T14:20:34.677Z] Checked if tokens are valid: true, expires at: 1786200042441
21
+ [debug] [2026-08-08T14:20:34.677Z] Checked if tokens are valid: true, expires at: 1786200042441
22
+ [debug] [2026-08-08T14:20:34.677Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/frontterrain [none]
23
+ [debug] [2026-08-08T14:20:35.561Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/frontterrain 200
24
+ [debug] [2026-08-08T14:20:35.562Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/frontterrain {"projectId":"frontterrain","projectNumber":"443977559241","displayName":"frontterrain","name":"projects/frontterrain","resources":{"hostingSite":"frontterrain","realtimeDatabaseInstance":"frontterrain-default-rtdb"},"state":"ACTIVE","labels":{"firebase":"enabled","firebase/storage-default-bucket":"created","firebaseworkflows/environment":"production"},"etag":"1_78a6722f-2aff-4818-b8b5-030f66204476"}
25
+ [info]
26
+ [info] === Deploying to 'frontterrain'...
27
+ [info]
28
+ [info] i deploying hosting
29
+ [debug] [2026-08-08T14:20:35.569Z] Checked if tokens are valid: true, expires at: 1786200042441
30
+ [debug] [2026-08-08T14:20:35.569Z] Checked if tokens are valid: true, expires at: 1786200042441
31
+ [debug] [2026-08-08T14:20:35.569Z] >>> [apiv2][query] GET https://firebasehosting.googleapis.com/v1beta1/projects/frontterrain/sites/tryscout [none]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ft-scout",
3
- "version": "5.0.1",
3
+ "version": "5.0.2",
4
4
  "type": "module",
5
5
  "description": "FrontTerrain — The Onboarding Co-Pilot for New Codebases",
6
6
  "main": "index.js",
@@ -36,7 +36,7 @@
36
36
  "@clack/prompts": "^1.7.0",
37
37
  "@types/nodemailer": "^8.0.1",
38
38
  "chalk": "^6.0.0",
39
- "commander": "^15.0.1",
39
+ "commander": "^15.0.2",
40
40
  "dotenv": "^17.4.2",
41
41
  "nodemailer": "^9.0.4",
42
42
  "openai": "^7.1.0",
Binary file