gobananas-cli 1.0.8 → 1.0.10

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.
Files changed (44) hide show
  1. package/README.md +41 -14
  2. package/dist/auth/oauth.d.ts +19 -0
  3. package/dist/auth/oauth.d.ts.map +1 -0
  4. package/dist/auth/oauth.js +266 -0
  5. package/dist/auth/oauth.js.map +1 -0
  6. package/dist/commands/auth.d.ts +9 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +72 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/config.d.ts.map +1 -1
  11. package/dist/commands/config.js +17 -12
  12. package/dist/commands/config.js.map +1 -1
  13. package/dist/commands/edit.d.ts.map +1 -1
  14. package/dist/commands/edit.js +1 -1
  15. package/dist/commands/edit.js.map +1 -1
  16. package/dist/commands/index.d.ts +1 -0
  17. package/dist/commands/index.d.ts.map +1 -1
  18. package/dist/commands/index.js +1 -0
  19. package/dist/commands/index.js.map +1 -1
  20. package/dist/commands/mcp.d.ts.map +1 -1
  21. package/dist/commands/mcp.js +1 -1
  22. package/dist/commands/mcp.js.map +1 -1
  23. package/dist/config/config.d.ts +26 -0
  24. package/dist/config/config.d.ts.map +1 -1
  25. package/dist/config/config.js +44 -1
  26. package/dist/config/config.js.map +1 -1
  27. package/dist/index.js +19 -6
  28. package/dist/index.js.map +1 -1
  29. package/dist/mcp/stdio-proxy.d.ts.map +1 -1
  30. package/dist/mcp/stdio-proxy.js +90 -19
  31. package/dist/mcp/stdio-proxy.js.map +1 -1
  32. package/dist/transport/mcp-client.d.ts +1 -1
  33. package/dist/transport/mcp-client.d.ts.map +1 -1
  34. package/dist/transport/mcp-client.js +4 -5
  35. package/dist/transport/mcp-client.js.map +1 -1
  36. package/dist/transport/rest-client.d.ts +1 -1
  37. package/dist/transport/rest-client.d.ts.map +1 -1
  38. package/dist/transport/rest-client.js +4 -3
  39. package/dist/transport/rest-client.js.map +1 -1
  40. package/dist/utils/file-handler.d.ts +24 -0
  41. package/dist/utils/file-handler.d.ts.map +1 -1
  42. package/dist/utils/file-handler.js +93 -10
  43. package/dist/utils/file-handler.js.map +1 -1
  44. package/package.json +1 -1
package/README.md CHANGED
@@ -21,22 +21,47 @@ npx gobananas-cli
21
21
 
22
22
  ## Commands
23
23
 
24
- | Command | Alias | Description |
25
- |---------|-------|-------------|
26
- | `gobananas` | `gb` | Interactive CLI |
27
- | `gobananas-mcp` | — | MCP STDIO proxy for AI editors |
24
+ | Command | Alias | Description |
25
+ | --------------- | ----- | ------------------------------ |
26
+ | `gobananas` | `gb` | Interactive CLI |
27
+ | `gobananas-mcp` | — | MCP STDIO proxy for AI editors |
28
28
 
29
29
  ## MCP Setup
30
30
 
31
- For MCP client integration (Claude Desktop, Cursor, Claude Code), use the dedicated [`gobananas-mcp`](https://www.npmjs.com/package/gobananas-mcp) package.
31
+ Go Bananas supports two MCP auth modes. Pick one per client/scope:
32
32
 
33
- **Claude Code (one-command install):**
33
+ - **Remote HTTP OAuth**: the MCP client connects to `https://gobananasai.com/mcp` and stores
34
+ its own OAuth tokens.
35
+ - **STDIO proxy**: the MCP client launches `gobananas-mcp`; the proxy reads credentials from
36
+ `gobananas-cli auth login` or `GO_BANANAS_API_KEY`.
37
+
38
+ Do not expect `gobananas-cli auth login` to authenticate a direct HTTP MCP entry. It only
39
+ authenticates the STDIO proxy.
40
+
41
+ For Claude Code, claude.ai connectors, Codex, Cursor, VS Code, and other clients that support
42
+ remote HTTP MCP OAuth, use the hosted endpoint:
43
+
44
+ ```bash
45
+ claude mcp add --transport http -s user go-bananas https://gobananasai.com/mcp
46
+ ```
47
+
48
+ Then run `/mcp` in Claude Code and complete the Go Bananas browser login.
49
+
50
+ Codex uses:
51
+
52
+ ```bash
53
+ codex mcp add go-bananas --url https://gobananasai.com/mcp
54
+ codex mcp login go-bananas
55
+ ```
56
+
57
+ Use the local STDIO proxy for MCP clients that cannot connect to remote HTTP servers, or when
58
+ you want one local credential shared across STDIO clients. Run browser login once:
34
59
 
35
60
  ```bash
36
- claude mcp add go-bananas -e GO_BANANAS_API_KEY=sk_live_your_api_key_here -e GO_BANANAS_SERVER_URL=https://gobananasai.com -e GO_BANANAS_MCP_TRANSPORT=streamable-http -- npx -y gobananas-mcp
61
+ npx -y gobananas-cli auth login
37
62
  ```
38
63
 
39
- **Other clients** — add to your MCP config file:
64
+ Then configure the proxy:
40
65
 
41
66
  ```json
42
67
  {
@@ -45,7 +70,6 @@ claude mcp add go-bananas -e GO_BANANAS_API_KEY=sk_live_your_api_key_here -e GO_
45
70
  "command": "npx",
46
71
  "args": ["-y", "gobananas-mcp"],
47
72
  "env": {
48
- "GO_BANANAS_API_KEY": "sk_live_your_api_key_here",
49
73
  "GO_BANANAS_SERVER_URL": "https://gobananasai.com",
50
74
  "GO_BANANAS_MCP_TRANSPORT": "streamable-http"
51
75
  }
@@ -54,15 +78,18 @@ claude mcp add go-bananas -e GO_BANANAS_API_KEY=sk_live_your_api_key_here -e GO_
54
78
  }
55
79
  ```
56
80
 
81
+ For CI/headless environments, add `GO_BANANAS_API_KEY` to the same `env` object instead of
82
+ using browser login.
83
+
57
84
  See the [`gobananas-mcp` README](https://www.npmjs.com/package/gobananas-mcp) for client-specific setup instructions.
58
85
 
59
86
  ## Environment Variables
60
87
 
61
- | Variable | Default | Description |
62
- |----------|---------|-------------|
63
- | `GO_BANANAS_API_KEY` | — | Your API key (required) |
64
- | `GO_BANANAS_SERVER_URL` | `https://gobananasai.com` | Server URL |
65
- | `GO_BANANAS_MCP_TRANSPORT` | `streamable-http` | Transport protocol |
88
+ | Variable | Default | Description |
89
+ | -------------------------- | ------------------------- | -------------------------------------------------------- |
90
+ | `GO_BANANAS_API_KEY` | — | API-key fallback for STDIO proxy and CI/headless clients |
91
+ | `GO_BANANAS_SERVER_URL` | `https://gobananasai.com` | Server URL |
92
+ | `GO_BANANAS_MCP_TRANSPORT` | `streamable-http` | Transport protocol |
66
93
 
67
94
  ## Architecture
68
95
 
@@ -0,0 +1,19 @@
1
+ import { type OAuthConfig } from '../config/config.js';
2
+ export interface LoginOptions {
3
+ serverUrl?: string;
4
+ openBrowser?: boolean;
5
+ timeoutMs?: number;
6
+ scope?: string;
7
+ }
8
+ export interface LoginResult {
9
+ serverUrl: string;
10
+ clientId: string;
11
+ scope: string;
12
+ expiresAt: number;
13
+ }
14
+ export declare function refreshOAuthAccessToken(oauth: OAuthConfig, baseUrl?: string): Promise<OAuthConfig | null>;
15
+ export declare function getOAuthAccessToken(baseUrl?: string): Promise<string | null>;
16
+ export declare function getAuthHeaders(explicitApiKey?: string, baseUrl?: string): Promise<Record<string, string>>;
17
+ export declare function loginWithBrowser(options?: LoginOptions): Promise<LoginResult>;
18
+ export declare function logoutOAuth(): void;
19
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAGA,OAAO,EAA+C,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAkBpG,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAkMD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAoC7B;AAED,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBlF;AAED,wBAAsB,cAAc,CAClC,cAAc,CAAC,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAYjC;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA8DvF;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -0,0 +1,266 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { spawn } from 'node:child_process';
3
+ import http from 'node:http';
4
+ import { clearOAuthConfig, getConfig, setOAuthConfig } from '../config/config.js';
5
+ const OAUTH_REFRESH_SKEW_MS = 60_000;
6
+ const DEFAULT_SCOPES = [
7
+ 'images:generate',
8
+ 'images:edit',
9
+ 'images:read',
10
+ 'images:delete',
11
+ 'characters:manage',
12
+ 'characters:read',
13
+ 'products:manage',
14
+ 'products:read',
15
+ 'styles:manage',
16
+ 'styles:read',
17
+ 'sessions:read',
18
+ 'analytics:read',
19
+ ].join(' ');
20
+ function normalizeBaseUrl(input) {
21
+ const trimmed = input.trim().replace(/\/+$/, '');
22
+ new URL(trimmed);
23
+ return trimmed;
24
+ }
25
+ function base64Url(bytes) {
26
+ return bytes.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
27
+ }
28
+ function createPkcePair() {
29
+ const verifier = base64Url(randomBytes(32));
30
+ const challenge = base64Url(createHash('sha256').update(verifier).digest());
31
+ return { verifier, challenge };
32
+ }
33
+ function buildResource(baseUrl) {
34
+ return `${baseUrl}/mcp`;
35
+ }
36
+ async function fetchScopes(baseUrl) {
37
+ try {
38
+ const response = await fetch(`${baseUrl}/.well-known/oauth-protected-resource`);
39
+ if (!response.ok) {
40
+ return DEFAULT_SCOPES;
41
+ }
42
+ const body = (await response.json());
43
+ if (!Array.isArray(body.scopes_supported)) {
44
+ return DEFAULT_SCOPES;
45
+ }
46
+ const scopes = body.scopes_supported.filter((scope) => typeof scope === 'string');
47
+ return scopes.length ? scopes.join(' ') : DEFAULT_SCOPES;
48
+ }
49
+ catch {
50
+ return DEFAULT_SCOPES;
51
+ }
52
+ }
53
+ async function registerClient(baseUrl, redirectUri, scope) {
54
+ const response = await fetch(`${baseUrl}/oauth/register`, {
55
+ method: 'POST',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify({
58
+ client_name: 'Go Bananas CLI',
59
+ redirect_uris: [redirectUri],
60
+ grant_types: ['authorization_code', 'refresh_token'],
61
+ token_endpoint_auth_method: 'none',
62
+ scope,
63
+ }),
64
+ });
65
+ if (!response.ok) {
66
+ throw new Error(`OAuth client registration failed: ${await response.text()}`);
67
+ }
68
+ return (await response.json());
69
+ }
70
+ function startCallbackServer(timeoutMs) {
71
+ return new Promise((resolve, reject) => {
72
+ let timeout = null;
73
+ const server = http.createServer((req, res) => {
74
+ const requestUrl = new URL(req.url ?? '/', 'http://127.0.0.1');
75
+ const code = requestUrl.searchParams.get('code');
76
+ const state = requestUrl.searchParams.get('state');
77
+ const error = requestUrl.searchParams.get('error');
78
+ if (error) {
79
+ res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
80
+ res.end('<h1>Go Bananas authorization failed</h1><p>You can close this tab.</p>');
81
+ codeResolver.reject(new Error(`OAuth authorization failed: ${error}`));
82
+ return;
83
+ }
84
+ if (!code) {
85
+ res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
86
+ res.end('Not found');
87
+ return;
88
+ }
89
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
90
+ res.end('<h1>Go Bananas authorized</h1><p>You can close this tab and return to your terminal.</p>');
91
+ codeResolver.resolve({ code, state });
92
+ });
93
+ let codeResolver;
94
+ const waitForCode = new Promise((resolveCode, rejectCode) => {
95
+ codeResolver = { resolve: resolveCode, reject: rejectCode };
96
+ });
97
+ server.once('error', (error) => {
98
+ if (timeout) {
99
+ clearTimeout(timeout);
100
+ }
101
+ reject(error);
102
+ });
103
+ server.listen(0, '127.0.0.1', () => {
104
+ const address = server.address();
105
+ if (!address || typeof address === 'string') {
106
+ reject(new Error('Failed to allocate local OAuth callback port'));
107
+ return;
108
+ }
109
+ timeout = setTimeout(() => {
110
+ codeResolver.reject(new Error('Timed out waiting for OAuth authorization'));
111
+ }, timeoutMs);
112
+ resolve({
113
+ redirectUri: `http://127.0.0.1:${address.port}/callback`,
114
+ waitForCode,
115
+ close: () => new Promise((resolveClose) => {
116
+ if (timeout) {
117
+ clearTimeout(timeout);
118
+ }
119
+ server.close(() => resolveClose());
120
+ }),
121
+ });
122
+ });
123
+ });
124
+ }
125
+ function openUrl(url) {
126
+ const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
127
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
128
+ const child = spawn(command, args, { detached: true, stdio: 'ignore' });
129
+ child.unref();
130
+ }
131
+ async function exchangeAuthorizationCode(params) {
132
+ const body = new URLSearchParams({
133
+ grant_type: 'authorization_code',
134
+ client_id: params.clientId,
135
+ code: params.code,
136
+ code_verifier: params.verifier,
137
+ redirect_uri: params.redirectUri,
138
+ resource: params.resource,
139
+ });
140
+ const response = await fetch(`${params.baseUrl}/oauth/token`, {
141
+ method: 'POST',
142
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
143
+ body,
144
+ });
145
+ if (!response.ok) {
146
+ throw new Error(`OAuth token exchange failed: ${await response.text()}`);
147
+ }
148
+ return (await response.json());
149
+ }
150
+ export async function refreshOAuthAccessToken(oauth, baseUrl) {
151
+ if (!oauth.clientId || !oauth.refreshToken) {
152
+ return null;
153
+ }
154
+ const serverUrl = normalizeBaseUrl(baseUrl ?? getConfig().serverUrl);
155
+ const resource = oauth.resource ?? buildResource(serverUrl);
156
+ const body = new URLSearchParams({
157
+ grant_type: 'refresh_token',
158
+ client_id: oauth.clientId,
159
+ refresh_token: oauth.refreshToken,
160
+ resource,
161
+ });
162
+ const response = await fetch(`${serverUrl}/oauth/token`, {
163
+ method: 'POST',
164
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
165
+ body,
166
+ });
167
+ if (!response.ok) {
168
+ return null;
169
+ }
170
+ const tokens = (await response.json());
171
+ const refreshed = {
172
+ clientId: oauth.clientId,
173
+ accessToken: tokens.access_token,
174
+ refreshToken: tokens.refresh_token ?? oauth.refreshToken,
175
+ expiresAt: Date.now() + tokens.expires_in * 1000,
176
+ scope: tokens.scope ?? oauth.scope,
177
+ resource,
178
+ tokenType: tokens.token_type,
179
+ };
180
+ setOAuthConfig(refreshed);
181
+ return refreshed;
182
+ }
183
+ export async function getOAuthAccessToken(baseUrl) {
184
+ const oauth = getConfig().oauth;
185
+ if (!oauth.accessToken && !oauth.refreshToken) {
186
+ return null;
187
+ }
188
+ if (oauth.accessToken &&
189
+ oauth.expiresAt &&
190
+ oauth.expiresAt - OAUTH_REFRESH_SKEW_MS > Date.now()) {
191
+ return oauth.accessToken;
192
+ }
193
+ const refreshed = await refreshOAuthAccessToken(oauth, baseUrl);
194
+ return refreshed?.accessToken ?? null;
195
+ }
196
+ export async function getAuthHeaders(explicitApiKey, baseUrl) {
197
+ if (explicitApiKey) {
198
+ return { 'X-API-Key': explicitApiKey };
199
+ }
200
+ const accessToken = await getOAuthAccessToken(baseUrl);
201
+ if (accessToken) {
202
+ return { Authorization: `Bearer ${accessToken}` };
203
+ }
204
+ const apiKey = getConfig().apiKey;
205
+ return apiKey ? { 'X-API-Key': apiKey } : {};
206
+ }
207
+ export async function loginWithBrowser(options = {}) {
208
+ const config = getConfig();
209
+ const baseUrl = normalizeBaseUrl(options.serverUrl ?? config.serverUrl);
210
+ const scope = options.scope ?? (await fetchScopes(baseUrl));
211
+ const resource = buildResource(baseUrl);
212
+ const callback = await startCallbackServer(options.timeoutMs ?? 10 * 60_000);
213
+ const state = base64Url(randomBytes(16));
214
+ const pkce = createPkcePair();
215
+ try {
216
+ const client = await registerClient(baseUrl, callback.redirectUri, scope);
217
+ const authorizeUrl = new URL(`${baseUrl}/oauth/authorize`);
218
+ authorizeUrl.searchParams.set('response_type', 'code');
219
+ authorizeUrl.searchParams.set('client_id', client.client_id);
220
+ authorizeUrl.searchParams.set('redirect_uri', callback.redirectUri);
221
+ authorizeUrl.searchParams.set('scope', client.scope ?? scope);
222
+ authorizeUrl.searchParams.set('state', state);
223
+ authorizeUrl.searchParams.set('code_challenge', pkce.challenge);
224
+ authorizeUrl.searchParams.set('code_challenge_method', 'S256');
225
+ authorizeUrl.searchParams.set('resource', resource);
226
+ if (options.openBrowser !== false) {
227
+ openUrl(authorizeUrl.toString());
228
+ }
229
+ process.stdout.write(`Open this URL to authorize Go Bananas:\n${authorizeUrl.toString()}\n\n`);
230
+ const result = await callback.waitForCode;
231
+ if (result.state !== state) {
232
+ throw new Error('OAuth state mismatch; authorization was not saved');
233
+ }
234
+ const tokens = await exchangeAuthorizationCode({
235
+ baseUrl,
236
+ clientId: client.client_id,
237
+ code: result.code,
238
+ verifier: pkce.verifier,
239
+ redirectUri: callback.redirectUri,
240
+ resource,
241
+ });
242
+ const oauth = {
243
+ clientId: client.client_id,
244
+ accessToken: tokens.access_token,
245
+ refreshToken: tokens.refresh_token,
246
+ expiresAt: Date.now() + tokens.expires_in * 1000,
247
+ scope: tokens.scope ?? client.scope ?? scope,
248
+ resource,
249
+ tokenType: tokens.token_type,
250
+ };
251
+ setOAuthConfig(oauth);
252
+ return {
253
+ serverUrl: baseUrl,
254
+ clientId: client.client_id,
255
+ scope: oauth.scope ?? scope,
256
+ expiresAt: oauth.expiresAt ?? Date.now(),
257
+ };
258
+ }
259
+ finally {
260
+ await callback.close();
261
+ }
262
+ }
263
+ export function logoutOAuth() {
264
+ clearOAuthConfig();
265
+ }
266
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Auth Commands
3
+ *
4
+ * Browser-based OAuth login for MCP clients that cannot run native remote
5
+ * HTTP OAuth themselves.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function createAuthCommand(): Command;
9
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,iBAAiB,IAAI,OAAO,CA8D3C"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Auth Commands
3
+ *
4
+ * Browser-based OAuth login for MCP clients that cannot run native remote
5
+ * HTTP OAuth themselves.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { getConfig, hasApiKey, hasOAuthTokens } from '../config/config.js';
9
+ import { loginWithBrowser, logoutOAuth } from '../auth/oauth.js';
10
+ import * as output from '../utils/output.js';
11
+ function formatExpiry(expiresAt) {
12
+ if (!expiresAt) {
13
+ return '(unknown)';
14
+ }
15
+ return new Date(expiresAt).toLocaleString();
16
+ }
17
+ export function createAuthCommand() {
18
+ const cmd = new Command('auth').description('Manage browser-login authorization');
19
+ cmd
20
+ .command('login')
21
+ .description('Authorize Go Bananas in your browser and save OAuth tokens locally')
22
+ .option('--server <url>', 'Go Bananas server URL')
23
+ .option('--no-open', 'Print the authorization URL without opening a browser')
24
+ .option('--scope <scope>', 'Space-separated OAuth scopes to request')
25
+ .option('--timeout <seconds>', 'Seconds to wait for browser authorization', '600')
26
+ .action(async (options) => {
27
+ const timeoutSeconds = Number.parseInt(options.timeout, 10);
28
+ if (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0) {
29
+ output.error('--timeout must be a positive number of seconds');
30
+ process.exit(1);
31
+ }
32
+ output.header('Go Bananas Browser Login');
33
+ output.info('Starting a local callback server for OAuth authorization.');
34
+ try {
35
+ const result = await loginWithBrowser({
36
+ serverUrl: options.server,
37
+ openBrowser: options.open,
38
+ scope: options.scope,
39
+ timeoutMs: timeoutSeconds * 1000,
40
+ });
41
+ output.success('Authorization saved.');
42
+ output.keyValue('Server', result.serverUrl);
43
+ output.keyValue('Client ID', result.clientId);
44
+ output.keyValue('Token expires', formatExpiry(result.expiresAt));
45
+ }
46
+ catch (error) {
47
+ output.error(error instanceof Error ? error.message : String(error));
48
+ process.exit(1);
49
+ }
50
+ });
51
+ cmd
52
+ .command('status')
53
+ .description('Show current authorization status')
54
+ .action(() => {
55
+ const config = getConfig();
56
+ output.header('Go Bananas Authorization');
57
+ output.keyValue('Server URL', config.serverUrl);
58
+ output.keyValue('OAuth login', hasOAuthTokens() ? 'Configured' : 'Not configured');
59
+ output.keyValue('OAuth client', config.oauth.clientId ?? '(none)');
60
+ output.keyValue('OAuth token expires', formatExpiry(config.oauth.expiresAt));
61
+ output.keyValue('API key fallback', hasApiKey() ? 'Configured' : 'Not configured');
62
+ });
63
+ cmd
64
+ .command('logout')
65
+ .description('Clear saved OAuth tokens')
66
+ .action(() => {
67
+ logoutOAuth();
68
+ output.success('OAuth authorization cleared.');
69
+ });
70
+ return cmd;
71
+ }
72
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,mBAAmB,IAAI,OAAO,CA2L7C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,mBAAmB,IAAI,OAAO,CAyM7C"}
@@ -4,13 +4,11 @@
4
4
  * Commands for managing CLI configuration.
5
5
  */
6
6
  import { Command } from 'commander';
7
- import { getConfig, setConfig, hasApiKey, getConfigPath, clearConfig, } from '../config/config.js';
7
+ import { getConfig, setConfig, hasAuthCredential, hasOAuthTokens, getConfigPath, clearConfig, } from '../config/config.js';
8
8
  import { RestClient } from '../transport/rest-client.js';
9
9
  import * as output from '../utils/output.js';
10
10
  export function createConfigCommand() {
11
- const cmd = new Command('config')
12
- .alias('cfg')
13
- .description('Manage CLI configuration');
11
+ const cmd = new Command('config').alias('cfg').description('Manage CLI configuration');
14
12
  // Generic setter (matches README usage: `gb config set apiKey ...`)
15
13
  cmd
16
14
  .command('set <key> <value>')
@@ -34,7 +32,9 @@ export function createConfigCommand() {
34
32
  setOutputDir(value);
35
33
  return;
36
34
  }
37
- if (normalized === 'defaultAspectRatio' || normalized === 'aspect' || normalized === 'ratio') {
35
+ if (normalized === 'defaultAspectRatio' ||
36
+ normalized === 'aspect' ||
37
+ normalized === 'ratio') {
38
38
  setAspectRatio(value);
39
39
  return;
40
40
  }
@@ -59,6 +59,9 @@ export function createConfigCommand() {
59
59
  output.newline();
60
60
  output.keyValue('Server URL', config.serverUrl);
61
61
  output.keyValue('API Key', config.apiKey ? maskApiKey(config.apiKey) : '(not set)');
62
+ output.keyValue('OAuth Login', hasOAuthTokens() ? 'Configured' : '(not set)');
63
+ output.keyValue('OAuth Client', config.oauth.clientId || '(none)');
64
+ output.keyValue('OAuth Expires', config.oauth.expiresAt ? new Date(config.oauth.expiresAt).toLocaleString() : '(unknown)');
62
65
  output.keyValue('Transport', config.transport);
63
66
  output.keyValue('Output Dir', config.outputDir);
64
67
  output.keyValue('Default Aspect', config.defaultAspectRatio);
@@ -112,18 +115,20 @@ export function createConfigCommand() {
112
115
  const config = getConfig();
113
116
  output.info('Current settings:');
114
117
  output.keyValue(' Server URL', config.serverUrl);
118
+ output.keyValue(' OAuth Login', hasOAuthTokens() ? 'Set' : 'Not set');
115
119
  output.keyValue(' API Key', config.apiKey ? 'Set' : 'Not set');
116
120
  output.keyValue(' Transport', config.transport);
117
121
  output.newline();
118
122
  output.info('To configure, use these commands:');
123
+ console.log(' gb auth login - Authorize in your browser');
119
124
  console.log(' gb config server <url> - Set server URL');
120
125
  console.log(' gb config key <api-key> - Set API key');
121
126
  console.log(' gb config transport <mode> - Set transport (auto/mcp/rest)');
122
127
  console.log(' gb config output-dir <dir> - Set download directory');
123
128
  output.newline();
124
- if (!hasApiKey()) {
125
- output.warn('API key not set. You must set an API key to use Go Bananas.');
126
- output.tip('Get your API key from your Go Bananas console.');
129
+ if (!hasAuthCredential()) {
130
+ output.warn('Authorization not set. You must authorize to use Go Bananas.');
131
+ output.tip('Run "gb auth login" for browser login, or get an API key from your Go Bananas console.');
127
132
  }
128
133
  });
129
134
  // Reset config
@@ -145,8 +150,8 @@ export function createConfigCommand() {
145
150
  .command('test')
146
151
  .description('Test connection to Go Bananas server')
147
152
  .action(async () => {
148
- if (!hasApiKey()) {
149
- output.error('API key not set. Use "gb config key <api-key>" first.');
153
+ if (!hasAuthCredential()) {
154
+ output.error('Authorization not set. Use "gb auth login" or "gb config key <api-key>" first.');
150
155
  process.exit(1);
151
156
  }
152
157
  const config = getConfig();
@@ -160,7 +165,7 @@ export function createConfigCommand() {
160
165
  output.keyValue('Transport', config.transport);
161
166
  }
162
167
  else {
163
- output.error('Connection failed. Check your server URL and API key.');
168
+ output.error('Connection failed. Check your server URL and authorization.');
164
169
  process.exit(1);
165
170
  }
166
171
  });
@@ -205,7 +210,7 @@ async function setApiKey(apiKey) {
205
210
  output.success('Connection successful!');
206
211
  }
207
212
  else {
208
- output.warn('Could not verify connection. Check your server URL and API key.');
213
+ output.warn('Could not verify connection. Check your server URL and authorization.');
209
214
  }
210
215
  }
211
216
  function setTransport(mode) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CA8E3C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA6E/C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CA6G7C"}
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAgF3C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA+E/C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CA6G7C"}
@@ -230,7 +230,7 @@ export function createUploadCommand() {
230
230
  // Local file upload MUST use REST (MCP blocks base64 due to token limits)
231
231
  if (!transport.rest) {
232
232
  throw new Error('Local file upload requires REST transport. ' +
233
- 'Configure your API key to enable REST API access.');
233
+ 'Run "gb auth login" or configure an API key to enable REST API access.');
234
234
  }
235
235
  const restResult = await transport.rest.uploadImageFromFile({
236
236
  imageData: localImage.base64Data,