@getverbal/cli 0.1.0 → 0.4.0
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/LICENSE +1 -1
- package/README.md +34 -18
- package/dist/cli.js +19246 -56
- package/package.json +15 -8
- package/dist/auth/browser-auth.d.ts +0 -6
- package/dist/auth/browser-auth.d.ts.map +0 -1
- package/dist/auth/browser-auth.js +0 -202
- package/dist/auth/browser-auth.js.map +0 -1
- package/dist/auth/credentials.d.ts +0 -6
- package/dist/auth/credentials.d.ts.map +0 -1
- package/dist/auth/credentials.js +0 -78
- package/dist/auth/credentials.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -188
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/logout.d.ts +0 -2
- package/dist/commands/logout.d.ts.map +0 -1
- package/dist/commands/logout.js +0 -17
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/status.d.ts +0 -2
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -43
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -2
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js +0 -43
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/configure/claude-code.d.ts +0 -7
- package/dist/configure/claude-code.d.ts.map +0 -1
- package/dist/configure/claude-code.js +0 -11
- package/dist/configure/claude-code.js.map +0 -1
- package/dist/configure/claude-desktop.d.ts +0 -8
- package/dist/configure/claude-desktop.d.ts.map +0 -1
- package/dist/configure/claude-desktop.js +0 -28
- package/dist/configure/claude-desktop.js.map +0 -1
- package/dist/configure/codex.d.ts +0 -7
- package/dist/configure/codex.d.ts.map +0 -1
- package/dist/configure/codex.js +0 -12
- package/dist/configure/codex.js.map +0 -1
- package/dist/configure/cursor.d.ts +0 -7
- package/dist/configure/cursor.d.ts.map +0 -1
- package/dist/configure/cursor.js +0 -12
- package/dist/configure/cursor.js.map +0 -1
- package/dist/configure/index.d.ts +0 -30
- package/dist/configure/index.d.ts.map +0 -1
- package/dist/configure/index.js +0 -149
- package/dist/configure/index.js.map +0 -1
- package/dist/detect/claude-code.d.ts +0 -3
- package/dist/detect/claude-code.d.ts.map +0 -1
- package/dist/detect/claude-code.js +0 -82
- package/dist/detect/claude-code.js.map +0 -1
- package/dist/detect/claude-desktop.d.ts +0 -3
- package/dist/detect/claude-desktop.d.ts.map +0 -1
- package/dist/detect/claude-desktop.js +0 -89
- package/dist/detect/claude-desktop.js.map +0 -1
- package/dist/detect/codex.d.ts +0 -3
- package/dist/detect/codex.d.ts.map +0 -1
- package/dist/detect/codex.js +0 -64
- package/dist/detect/codex.js.map +0 -1
- package/dist/detect/cursor.d.ts +0 -3
- package/dist/detect/cursor.d.ts.map +0 -1
- package/dist/detect/cursor.js +0 -81
- package/dist/detect/cursor.js.map +0 -1
- package/dist/detect/index.d.ts +0 -3
- package/dist/detect/index.d.ts.map +0 -1
- package/dist/detect/index.js +0 -28
- package/dist/detect/index.js.map +0 -1
- package/dist/types.d.ts +0 -18
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/verify.d.ts +0 -7
- package/dist/verify.d.ts.map +0 -1
- package/dist/verify.js +0 -40
- package/dist/verify.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getverbal/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Set up Verbal AI spend tracking in one command",
|
|
5
5
|
"bin": {
|
|
6
6
|
"getverbal": "dist/cli.js"
|
|
@@ -9,28 +9,35 @@
|
|
|
9
9
|
"main": "./dist/cli.js",
|
|
10
10
|
"files": ["dist", "README.md", "LICENSE"],
|
|
11
11
|
"scripts": {
|
|
12
|
-
"build": "
|
|
12
|
+
"build": "bun build src/cli.ts --target=node --outdir=dist --format=esm",
|
|
13
|
+
"build:tsc": "tsc -p tsconfig.json",
|
|
13
14
|
"dev": "tsc -p tsconfig.json --watch",
|
|
14
|
-
"
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"prepublishOnly": "npm run typecheck && npm run build"
|
|
15
18
|
},
|
|
16
19
|
"dependencies": {
|
|
17
|
-
"picocolors": "^1.1.0"
|
|
20
|
+
"picocolors": "^1.1.0",
|
|
21
|
+
"open": "^10.0.0",
|
|
22
|
+
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
23
|
+
"zod": "^3.25.0"
|
|
18
24
|
},
|
|
19
25
|
"devDependencies": {
|
|
20
26
|
"typescript": "^5.5.0",
|
|
21
|
-
"@types/node": "^20.0.0"
|
|
27
|
+
"@types/node": "^20.0.0",
|
|
28
|
+
"vitest": "^3.0.0"
|
|
22
29
|
},
|
|
23
30
|
"engines": {
|
|
24
31
|
"node": ">=18.0.0"
|
|
25
32
|
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
26
36
|
"license": "MIT",
|
|
27
37
|
"repository": {
|
|
28
38
|
"type": "git",
|
|
29
39
|
"url": "git+https://github.com/getverbal/verbal.git"
|
|
30
40
|
},
|
|
31
|
-
"publishConfig": {
|
|
32
|
-
"access": "public"
|
|
33
|
-
},
|
|
34
41
|
"keywords": [
|
|
35
42
|
"ai",
|
|
36
43
|
"spend",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser-auth.d.ts","sourceRoot":"","sources":["../../src/auth/browser-auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AA4HD,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CA2GnF"}
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import { createServer } from 'node:http';
|
|
2
|
-
import { randomBytes } from 'node:crypto';
|
|
3
|
-
const PORT_START = 9876;
|
|
4
|
-
const PORT_END = 9900;
|
|
5
|
-
const TIMEOUT_MS = 120_000;
|
|
6
|
-
async function openBrowser(url) {
|
|
7
|
-
const { exec } = await import('node:child_process');
|
|
8
|
-
const platform = process.platform;
|
|
9
|
-
const cmd = platform === 'darwin' ? 'open' : platform === 'win32' ? 'start' : 'xdg-open';
|
|
10
|
-
exec(`${cmd} "${url}"`);
|
|
11
|
-
}
|
|
12
|
-
async function findAvailablePort() {
|
|
13
|
-
for (let port = PORT_START; port <= PORT_END; port++) {
|
|
14
|
-
const available = await new Promise((resolve) => {
|
|
15
|
-
const probe = createServer();
|
|
16
|
-
probe.once('error', (err) => {
|
|
17
|
-
if (err.code === 'EADDRINUSE') {
|
|
18
|
-
resolve(false);
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
resolve(false);
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
probe.once('listening', () => {
|
|
25
|
-
probe.close(() => resolve(true));
|
|
26
|
-
});
|
|
27
|
-
probe.listen(port, '127.0.0.1');
|
|
28
|
-
});
|
|
29
|
-
if (available)
|
|
30
|
-
return port;
|
|
31
|
-
}
|
|
32
|
-
throw new Error(`No available port found in range ${PORT_START}-${PORT_END}. Please free up a port and try again.`);
|
|
33
|
-
}
|
|
34
|
-
async function exchangeCode(apiUrl, code) {
|
|
35
|
-
const res = await fetch(`${apiUrl}/api/v1/cli/exchange`, {
|
|
36
|
-
method: 'POST',
|
|
37
|
-
headers: { 'Content-Type': 'application/json' },
|
|
38
|
-
body: JSON.stringify({ code }),
|
|
39
|
-
});
|
|
40
|
-
if (!res.ok) {
|
|
41
|
-
const body = await res.json().catch(() => ({}));
|
|
42
|
-
throw new Error(body.error ?? `Exchange failed: HTTP ${res.status}`);
|
|
43
|
-
}
|
|
44
|
-
const data = await res.json();
|
|
45
|
-
return {
|
|
46
|
-
api_key: data.api_key,
|
|
47
|
-
org_id: data.org_id,
|
|
48
|
-
user_email: data.user_email,
|
|
49
|
-
api_url: data.api_url,
|
|
50
|
-
ingest_url: data.ingest_url,
|
|
51
|
-
created_at: new Date().toISOString(),
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
const WAITING_HTML = `<!DOCTYPE html>
|
|
55
|
-
<html lang="en">
|
|
56
|
-
<head>
|
|
57
|
-
<meta charset="UTF-8">
|
|
58
|
-
<title>Verbal CLI Authentication</title>
|
|
59
|
-
<style>
|
|
60
|
-
body { font-family: system-ui, sans-serif; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; background: #f5f5f5; }
|
|
61
|
-
.card { background: white; padding: 2rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); text-align: center; max-width: 400px; }
|
|
62
|
-
h1 { font-size: 1.25rem; color: #333; margin-bottom: 0.5rem; }
|
|
63
|
-
p { color: #666; font-size: 0.95rem; }
|
|
64
|
-
</style>
|
|
65
|
-
</head>
|
|
66
|
-
<body>
|
|
67
|
-
<div class="card">
|
|
68
|
-
<h1>Waiting for authentication...</h1>
|
|
69
|
-
<p>Please complete the sign-in in the browser window that was opened.</p>
|
|
70
|
-
</div>
|
|
71
|
-
</body>
|
|
72
|
-
</html>`;
|
|
73
|
-
const SUCCESS_HTML = `<!DOCTYPE html>
|
|
74
|
-
<html lang="en">
|
|
75
|
-
<head>
|
|
76
|
-
<meta charset="UTF-8">
|
|
77
|
-
<title>Verbal CLI — Authenticated</title>
|
|
78
|
-
<style>
|
|
79
|
-
body { font-family: system-ui, sans-serif; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; background: #f5f5f5; }
|
|
80
|
-
.card { background: white; padding: 2rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); text-align: center; max-width: 400px; }
|
|
81
|
-
h1 { font-size: 1.25rem; color: #22c55e; margin-bottom: 0.5rem; }
|
|
82
|
-
p { color: #666; font-size: 0.95rem; }
|
|
83
|
-
</style>
|
|
84
|
-
</head>
|
|
85
|
-
<body>
|
|
86
|
-
<div class="card">
|
|
87
|
-
<h1>Authentication complete!</h1>
|
|
88
|
-
<p>You can close this tab and return to your terminal.</p>
|
|
89
|
-
</div>
|
|
90
|
-
</body>
|
|
91
|
-
</html>`;
|
|
92
|
-
const FAILURE_HTML = `<!DOCTYPE html>
|
|
93
|
-
<html lang="en">
|
|
94
|
-
<head>
|
|
95
|
-
<meta charset="UTF-8">
|
|
96
|
-
<title>Verbal CLI — Authentication Failed</title>
|
|
97
|
-
<style>
|
|
98
|
-
body { font-family: system-ui, sans-serif; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; background: #f5f5f5; }
|
|
99
|
-
.card { background: white; padding: 2rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); text-align: center; max-width: 400px; }
|
|
100
|
-
h1 { font-size: 1.25rem; color: #ef4444; margin-bottom: 0.5rem; }
|
|
101
|
-
p { color: #666; font-size: 0.95rem; }
|
|
102
|
-
</style>
|
|
103
|
-
</head>
|
|
104
|
-
<body>
|
|
105
|
-
<div class="card">
|
|
106
|
-
<h1>Authentication failed.</h1>
|
|
107
|
-
<p>Please run <code>npx getverbal init</code> again.</p>
|
|
108
|
-
</div>
|
|
109
|
-
</body>
|
|
110
|
-
</html>`;
|
|
111
|
-
export async function browserAuth(options) {
|
|
112
|
-
const { apiUrl } = options;
|
|
113
|
-
// Step 1: Generate a 256-bit random state parameter for CSRF protection
|
|
114
|
-
const state = randomBytes(32).toString('hex');
|
|
115
|
-
// Step 2: Find an available port
|
|
116
|
-
const port = await findAvailablePort();
|
|
117
|
-
// Step 3 & 5-9: Start HTTP server and wait for callback
|
|
118
|
-
return new Promise((resolve, reject) => {
|
|
119
|
-
let settled = false;
|
|
120
|
-
let timeoutId;
|
|
121
|
-
const server = createServer((req, res) => {
|
|
122
|
-
const url = new URL(req.url ?? '/', `http://127.0.0.1:${port}`);
|
|
123
|
-
if (req.method !== 'GET') {
|
|
124
|
-
res.writeHead(405, { 'Content-Type': 'text/plain' });
|
|
125
|
-
res.end('Method Not Allowed');
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
if (url.pathname === '/') {
|
|
129
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
130
|
-
res.end(WAITING_HTML);
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
if (url.pathname === '/callback') {
|
|
134
|
-
const code = url.searchParams.get('code');
|
|
135
|
-
const receivedState = url.searchParams.get('state');
|
|
136
|
-
// Step 6: Validate state (CSRF protection)
|
|
137
|
-
if (!code || receivedState !== state) {
|
|
138
|
-
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
139
|
-
res.end(FAILURE_HTML);
|
|
140
|
-
if (!settled) {
|
|
141
|
-
settled = true;
|
|
142
|
-
if (timeoutId !== undefined)
|
|
143
|
-
clearTimeout(timeoutId);
|
|
144
|
-
server.close(() => {
|
|
145
|
-
reject(new Error('Authentication failed: invalid state or missing code.'));
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
// State is valid — send success response immediately so the browser gets feedback
|
|
151
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
152
|
-
res.end(SUCCESS_HTML);
|
|
153
|
-
if (!settled) {
|
|
154
|
-
settled = true;
|
|
155
|
-
if (timeoutId !== undefined)
|
|
156
|
-
clearTimeout(timeoutId);
|
|
157
|
-
// Step 7: Exchange code for credentials, then close server
|
|
158
|
-
exchangeCode(apiUrl, code)
|
|
159
|
-
.then((credentials) => {
|
|
160
|
-
server.close(() => resolve(credentials));
|
|
161
|
-
})
|
|
162
|
-
.catch((err) => {
|
|
163
|
-
server.close(() => {
|
|
164
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
165
|
-
reject(new Error(`Code exchange failed: ${message}`));
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
// All other routes — 404
|
|
172
|
-
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
173
|
-
res.end('Not Found');
|
|
174
|
-
});
|
|
175
|
-
server.on('error', (err) => {
|
|
176
|
-
if (!settled) {
|
|
177
|
-
settled = true;
|
|
178
|
-
if (timeoutId !== undefined)
|
|
179
|
-
clearTimeout(timeoutId);
|
|
180
|
-
reject(new Error(`Server error: ${err.message}`));
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
// Step 3: Start server on 127.0.0.1 only
|
|
184
|
-
server.listen(port, '127.0.0.1', () => {
|
|
185
|
-
// Step 8 (timeout): Close server if no callback within 120 seconds
|
|
186
|
-
timeoutId = setTimeout(() => {
|
|
187
|
-
if (!settled) {
|
|
188
|
-
settled = true;
|
|
189
|
-
server.close(() => {
|
|
190
|
-
reject(new Error('Authentication timed out after 120 seconds. Please run `npx getverbal init` again.'));
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
}, TIMEOUT_MS);
|
|
194
|
-
// Step 4: Open browser
|
|
195
|
-
const authUrl = `${apiUrl}/cli/auth?state=${state}&port=${port}`;
|
|
196
|
-
openBrowser(authUrl).catch(() => {
|
|
197
|
-
// Non-fatal: user may open browser manually
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
//# sourceMappingURL=browser-auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/auth/browser-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { Credentials } from '../types.js';
|
|
2
|
-
export declare function getCredentialsDir(): string;
|
|
3
|
-
export declare function readCredentials(): Promise<Credentials | null>;
|
|
4
|
-
export declare function writeCredentials(credentials: Credentials): Promise<void>;
|
|
5
|
-
export declare function clearCredentials(): Promise<void>;
|
|
6
|
-
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAMD,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAkBnE;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B9E;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAYtD"}
|
package/dist/auth/credentials.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, rmSync, mkdirSync, chmodSync, renameSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { randomBytes } from 'node:crypto';
|
|
5
|
-
const APP_DIR = 'getverbal';
|
|
6
|
-
const CREDENTIALS_FILE = 'credentials.json';
|
|
7
|
-
export function getCredentialsDir() {
|
|
8
|
-
const xdgConfigHome = process.env['XDG_CONFIG_HOME'];
|
|
9
|
-
if (xdgConfigHome && xdgConfigHome.trim() !== '') {
|
|
10
|
-
return join(xdgConfigHome, APP_DIR);
|
|
11
|
-
}
|
|
12
|
-
return join(homedir(), '.config', APP_DIR);
|
|
13
|
-
}
|
|
14
|
-
function getCredentialsPath() {
|
|
15
|
-
return join(getCredentialsDir(), CREDENTIALS_FILE);
|
|
16
|
-
}
|
|
17
|
-
export async function readCredentials() {
|
|
18
|
-
const credPath = getCredentialsPath();
|
|
19
|
-
try {
|
|
20
|
-
const content = readFileSync(credPath, 'utf-8');
|
|
21
|
-
const parsed = JSON.parse(content);
|
|
22
|
-
return parsed;
|
|
23
|
-
}
|
|
24
|
-
catch (err) {
|
|
25
|
-
const nodeErr = err;
|
|
26
|
-
// File doesn't exist — not an error condition
|
|
27
|
-
if (nodeErr.code === 'ENOENT') {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
// Malformed JSON or other read error — treat as missing to avoid crashing CLI
|
|
31
|
-
if (err instanceof SyntaxError) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
throw err;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
export async function writeCredentials(credentials) {
|
|
38
|
-
const dir = getCredentialsDir();
|
|
39
|
-
const credPath = getCredentialsPath();
|
|
40
|
-
// Create directory (and parents) if needed
|
|
41
|
-
mkdirSync(dir, { recursive: true });
|
|
42
|
-
const content = JSON.stringify(credentials, null, 2);
|
|
43
|
-
// Atomic write: write to temp file then rename
|
|
44
|
-
const tmpPath = join(dir, `.credentials-${randomBytes(8).toString('hex')}.tmp`);
|
|
45
|
-
try {
|
|
46
|
-
writeFileSync(tmpPath, content, { encoding: 'utf-8', mode: 0o600 });
|
|
47
|
-
// Ensure permissions are set correctly (in case umask altered them)
|
|
48
|
-
chmodSync(tmpPath, 0o600);
|
|
49
|
-
renameSync(tmpPath, credPath);
|
|
50
|
-
}
|
|
51
|
-
catch (err) {
|
|
52
|
-
// Clean up temp file if rename failed
|
|
53
|
-
try {
|
|
54
|
-
rmSync(tmpPath, { force: true });
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
// Ignore cleanup error
|
|
58
|
-
}
|
|
59
|
-
throw err;
|
|
60
|
-
}
|
|
61
|
-
// Ensure final file has correct permissions
|
|
62
|
-
chmodSync(credPath, 0o600);
|
|
63
|
-
}
|
|
64
|
-
export async function clearCredentials() {
|
|
65
|
-
const credPath = getCredentialsPath();
|
|
66
|
-
try {
|
|
67
|
-
rmSync(credPath, { force: true });
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
const nodeErr = err;
|
|
71
|
-
if (nodeErr.code === 'ENOENT') {
|
|
72
|
-
// File already gone — not an error
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
throw err;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=credentials.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
DELETED
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,IAAI,GAAG;EACX,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;;EAEpB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;;;EAGjB,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;;EAMpB,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;;;;EAInB,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;;;;CAIrB,CAAC,IAAI,EAAE,CAAC;AAET,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM;gBACT,MAAM,OAAO,EAAE,CAAC;gBAChB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,SAAS,EAAE,CAAC;gBAClB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,SAAS,EAAE,CAAC;gBAClB,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,YAAY,EAAE,CAAC;gBACrB,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,CAAC;gBAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/commands/init.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAgEA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAqK7C"}
|
package/dist/commands/init.js
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import pc from 'picocolors';
|
|
2
|
-
import { createInterface } from 'node:readline/promises';
|
|
3
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { browserAuth } from '../auth/browser-auth.js';
|
|
6
|
-
import { readCredentials, writeCredentials } from '../auth/credentials.js';
|
|
7
|
-
import { detectAll } from '../detect/index.js';
|
|
8
|
-
import { configureAll } from '../configure/index.js';
|
|
9
|
-
import { verifyConnection } from '../verify.js';
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// Helpers
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
async function confirm(rl, message, defaultYes) {
|
|
14
|
-
const hint = defaultYes ? '(Y/n)' : '(y/N)';
|
|
15
|
-
const answer = await rl.question(`${message} ${hint} `);
|
|
16
|
-
const trimmed = answer.trim().toLowerCase();
|
|
17
|
-
if (trimmed === '')
|
|
18
|
-
return defaultYes;
|
|
19
|
-
return trimmed === 'y' || trimmed === 'yes';
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Best-effort check — only matches exact lines, not glob patterns like *.json
|
|
23
|
-
* or **\/.mcp.json. A false negative (missing the pattern) just means we skip
|
|
24
|
-
* the "already gitignored" hint, which is acceptable.
|
|
25
|
-
*/
|
|
26
|
-
function isInGitignore(filename) {
|
|
27
|
-
const gitignorePath = join(process.cwd(), '.gitignore');
|
|
28
|
-
if (!existsSync(gitignorePath))
|
|
29
|
-
return false;
|
|
30
|
-
try {
|
|
31
|
-
const content = readFileSync(gitignorePath, 'utf-8');
|
|
32
|
-
return content.split('\n').some((line) => line.trim() === filename);
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
function toolDisplayName(tool) {
|
|
39
|
-
switch (tool) {
|
|
40
|
-
case 'claude-code':
|
|
41
|
-
return 'Claude Code';
|
|
42
|
-
case 'claude-desktop':
|
|
43
|
-
return 'Claude Desktop';
|
|
44
|
-
case 'cursor':
|
|
45
|
-
return 'Cursor';
|
|
46
|
-
case 'codex':
|
|
47
|
-
return 'Codex';
|
|
48
|
-
default: {
|
|
49
|
-
const _exhaustive = tool;
|
|
50
|
-
return String(_exhaustive);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// ---------------------------------------------------------------------------
|
|
55
|
-
// Main command
|
|
56
|
-
// ---------------------------------------------------------------------------
|
|
57
|
-
export async function runInit() {
|
|
58
|
-
// ── 1. Banner ─────────────────────────────────────────────────────────────
|
|
59
|
-
console.log();
|
|
60
|
-
console.log(pc.bold('Verbal — AI Spend Tracker'));
|
|
61
|
-
console.log();
|
|
62
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
63
|
-
let credentials = null;
|
|
64
|
-
try {
|
|
65
|
-
// ── 2. Check for existing credentials ──────────────────────────────────
|
|
66
|
-
const existing = await readCredentials();
|
|
67
|
-
if (existing !== null) {
|
|
68
|
-
console.log(pc.dim(`Already authenticated as ${pc.bold(existing.user_email)}.`));
|
|
69
|
-
const reauth = await confirm(rl, 'Re-authenticate?', false);
|
|
70
|
-
if (!reauth) {
|
|
71
|
-
credentials = existing;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// ── 3. Browser auth (if not reusing existing) ──────────────────────────
|
|
75
|
-
if (credentials === null) {
|
|
76
|
-
console.log(pc.cyan('Opening browser to sign up or log in...'));
|
|
77
|
-
console.log(pc.dim('If your browser does not open, visit:'), pc.underline('https://www.getverbal.ai/cli/auth'));
|
|
78
|
-
console.log();
|
|
79
|
-
try {
|
|
80
|
-
const creds = await browserAuth({ apiUrl: 'https://www.getverbal.ai' });
|
|
81
|
-
await writeCredentials(creds);
|
|
82
|
-
console.log(pc.green(`✓ Authenticated as ${pc.bold(creds.user_email)}`));
|
|
83
|
-
console.log();
|
|
84
|
-
credentials = creds;
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
88
|
-
console.error(pc.red(`✗ Authentication failed: ${message}`));
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// ── 4. Detect tools ────────────────────────────────────────────────────
|
|
93
|
-
console.log(pc.bold('Detecting AI tools...'));
|
|
94
|
-
const detections = await detectAll();
|
|
95
|
-
for (const d of detections) {
|
|
96
|
-
const name = toolDisplayName(d.tool);
|
|
97
|
-
if (d.detected) {
|
|
98
|
-
console.log(pc.green(` ✓ ${name}`) + pc.dim(` (${d.details})`));
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
console.log(pc.dim(` ✗ ${name} (not found)`));
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
console.log();
|
|
105
|
-
const detected = detections.filter((d) => d.detected);
|
|
106
|
-
if (detected.length === 0) {
|
|
107
|
-
console.log(pc.yellow('⚠ No supported AI tools detected. Skipping configuration.'));
|
|
108
|
-
console.log();
|
|
109
|
-
}
|
|
110
|
-
// ── 5. Per-tool confirmation ────────────────────────────────────────────
|
|
111
|
-
const confirmed = [];
|
|
112
|
-
for (const d of detected) {
|
|
113
|
-
const name = toolDisplayName(d.tool);
|
|
114
|
-
if (d.existingConfig) {
|
|
115
|
-
console.log(pc.dim(` ${name} is already configured.`));
|
|
116
|
-
const overwrite = await confirm(rl, ` Overwrite ${name} config?`, false);
|
|
117
|
-
if (overwrite) {
|
|
118
|
-
confirmed.push(d);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
console.log(pc.dim(` Skipping ${name}.`));
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
const configure = await confirm(rl, ` Configure ${name}?`, true);
|
|
126
|
-
if (configure) {
|
|
127
|
-
confirmed.push(d);
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
console.log(pc.dim(` Skipping ${name}.`));
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
if (confirmed.length > 0) {
|
|
135
|
-
console.log();
|
|
136
|
-
}
|
|
137
|
-
// ── 6. Configure confirmed tools ───────────────────────────────────────
|
|
138
|
-
if (confirmed.length > 0) {
|
|
139
|
-
console.log(pc.bold('Configuring tools...'));
|
|
140
|
-
const results = await configureAll(confirmed, credentials);
|
|
141
|
-
for (const r of results) {
|
|
142
|
-
const d = confirmed.find((det) => det.tool === r.tool);
|
|
143
|
-
const name = toolDisplayName(r.tool);
|
|
144
|
-
const configPath = d?.configPath ?? '';
|
|
145
|
-
if (r.success) {
|
|
146
|
-
console.log(pc.green(` ✓ ${name}`) + (configPath ? pc.dim(` ${configPath}`) : ''));
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
console.log(pc.red(` ✗ ${name}: ${r.error ?? 'unknown error'}`));
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
console.log();
|
|
153
|
-
}
|
|
154
|
-
// ── 7. Verify connection ───────────────────────────────────────────────
|
|
155
|
-
process.stdout.write(pc.dim('Verifying connection...'));
|
|
156
|
-
try {
|
|
157
|
-
await verifyConnection(credentials);
|
|
158
|
-
console.log(' ' + pc.green('✓ test event received'));
|
|
159
|
-
}
|
|
160
|
-
catch (err) {
|
|
161
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
162
|
-
console.log();
|
|
163
|
-
console.log(pc.yellow(`⚠ Verification warning: ${message}`));
|
|
164
|
-
}
|
|
165
|
-
console.log();
|
|
166
|
-
// ── 8. Post-install warnings ───────────────────────────────────────────
|
|
167
|
-
const mcpJsonPath = join(process.cwd(), '.mcp.json');
|
|
168
|
-
if (existsSync(mcpJsonPath) && !isInGitignore('.mcp.json')) {
|
|
169
|
-
console.log(pc.yellow('⚠ .mcp.json contains your API key. Add it to .gitignore to avoid leaking credentials:'));
|
|
170
|
-
console.log(pc.dim(' echo ".mcp.json" >> .gitignore'));
|
|
171
|
-
console.log();
|
|
172
|
-
}
|
|
173
|
-
const needsRestart = confirmed.some((d) => d.tool === 'claude-desktop' || d.tool === 'cursor');
|
|
174
|
-
if (needsRestart) {
|
|
175
|
-
console.log(pc.yellow('⚠ Restart Claude Desktop and Cursor to activate Verbal.'));
|
|
176
|
-
console.log();
|
|
177
|
-
}
|
|
178
|
-
// ── 9. Done ────────────────────────────────────────────────────────────
|
|
179
|
-
console.log(pc.bold('Done!') +
|
|
180
|
-
pc.dim(' Dashboard → ') +
|
|
181
|
-
pc.cyan('https://www.getverbal.ai/dashboard'));
|
|
182
|
-
console.log();
|
|
183
|
-
}
|
|
184
|
-
finally {
|
|
185
|
-
rl.close();
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
//# sourceMappingURL=init.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAe/C"}
|
package/dist/commands/logout.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import pc from 'picocolors';
|
|
2
|
-
import { readCredentials, clearCredentials } from '../auth/credentials.js';
|
|
3
|
-
export async function runLogout() {
|
|
4
|
-
// 1. Check if logged in
|
|
5
|
-
const credentials = await readCredentials();
|
|
6
|
-
if (!credentials) {
|
|
7
|
-
console.log(pc.dim('Not currently logged in.'));
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
// 2. Log out
|
|
11
|
-
console.log(`Logging out ${pc.bold(credentials.user_email)}...`);
|
|
12
|
-
await clearCredentials();
|
|
13
|
-
// 3. Confirmation
|
|
14
|
-
console.log(pc.green('✓') + ' Credentials removed. Your AI tool configurations are still in place.');
|
|
15
|
-
console.log(pc.dim('Run `getverbal uninstall` to also remove tool configurations.'));
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=logout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,wBAAwB;IACxB,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,gBAAgB,EAAE,CAAC;IAEzB,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,uEAAuE,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;AACvF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAwC/C"}
|