gobananas-cli 1.0.1
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/gobananas-mcp.js +10 -0
- package/bin/gobananas.js +8 -0
- package/dist/commands/account.d.ts +8 -0
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +200 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/character.d.ts +8 -0
- package/dist/commands/character.d.ts.map +1 -0
- package/dist/commands/character.js +493 -0
- package/dist/commands/character.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +232 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/edit.d.ts +19 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +279 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/generate.d.ts +8 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +177 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/image.d.ts +8 -0
- package/dist/commands/image.d.ts.map +1 -0
- package/dist/commands/image.js +212 -0
- package/dist/commands/image.js.map +1 -0
- package/dist/commands/index.d.ts +19 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +19 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/mcp-help.d.ts +8 -0
- package/dist/commands/mcp-help.d.ts.map +1 -0
- package/dist/commands/mcp-help.js +264 -0
- package/dist/commands/mcp-help.js.map +1 -0
- package/dist/commands/mcp.d.ts +9 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +25 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/product.d.ts +8 -0
- package/dist/commands/product.d.ts.map +1 -0
- package/dist/commands/product.js +316 -0
- package/dist/commands/product.js.map +1 -0
- package/dist/commands/scene.d.ts +8 -0
- package/dist/commands/scene.d.ts.map +1 -0
- package/dist/commands/scene.js +448 -0
- package/dist/commands/scene.js.map +1 -0
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +123 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/session.d.ts +8 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +167 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/style.d.ts +8 -0
- package/dist/commands/style.d.ts.map +1 -0
- package/dist/commands/style.js +297 -0
- package/dist/commands/style.js.map +1 -0
- package/dist/commands/usage.d.ts +8 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +144 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/config/config.d.ts +65 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +156 -0
- package/dist/config/config.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +130 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/stdio-proxy.d.ts +8 -0
- package/dist/mcp/stdio-proxy.d.ts.map +1 -0
- package/dist/mcp/stdio-proxy.js +297 -0
- package/dist/mcp/stdio-proxy.js.map +1 -0
- package/dist/mcp-stdio.d.ts +3 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +8 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/transport/index.d.ts +29 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +72 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/mcp-client.d.ts +342 -0
- package/dist/transport/mcp-client.d.ts.map +1 -0
- package/dist/transport/mcp-client.js +478 -0
- package/dist/transport/mcp-client.js.map +1 -0
- package/dist/transport/rest-client.d.ts +297 -0
- package/dist/transport/rest-client.d.ts.map +1 -0
- package/dist/transport/rest-client.js +461 -0
- package/dist/transport/rest-client.js.map +1 -0
- package/dist/types/responses.d.ts +230 -0
- package/dist/types/responses.d.ts.map +1 -0
- package/dist/types/responses.js +46 -0
- package/dist/types/responses.js.map +1 -0
- package/dist/utils/file-handler.d.ts +51 -0
- package/dist/utils/file-handler.d.ts.map +1 -0
- package/dist/utils/file-handler.js +189 -0
- package/dist/utils/file-handler.js.map +1 -0
- package/dist/utils/output.d.ts +111 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +240 -0
- package/dist/utils/output.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Commands
|
|
3
|
+
*
|
|
4
|
+
* Commands for viewing usage statistics and account summary.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { createTransport } from '../transport/index.js';
|
|
8
|
+
import * as output from '../utils/output.js';
|
|
9
|
+
export function createUsageCommand() {
|
|
10
|
+
const cmd = new Command('usage')
|
|
11
|
+
.description('View usage statistics and account summary');
|
|
12
|
+
// Get usage stats
|
|
13
|
+
cmd
|
|
14
|
+
.command('stats')
|
|
15
|
+
.alias('s')
|
|
16
|
+
.description('View usage statistics')
|
|
17
|
+
.option('--days <number>', 'Lookback period in days', '30')
|
|
18
|
+
.option('--granularity <type>', 'Bucket size: hour, day, week', 'day')
|
|
19
|
+
.option('--operation <name>', 'Filter by operation type')
|
|
20
|
+
.option('-l, --limit <number>', 'Maximum buckets to return', '100')
|
|
21
|
+
.option('--json', 'Output raw JSON response')
|
|
22
|
+
.action(async (options) => {
|
|
23
|
+
const spin = output.spinner('Loading usage stats...');
|
|
24
|
+
try {
|
|
25
|
+
const transport = await createTransport();
|
|
26
|
+
let result;
|
|
27
|
+
if (transport.type === 'mcp' && transport.mcp) {
|
|
28
|
+
const mcpResult = await transport.mcp.getUsageStats({
|
|
29
|
+
lookbackDays: parseInt(options.days, 10),
|
|
30
|
+
granularity: options.granularity,
|
|
31
|
+
operation: options.operation,
|
|
32
|
+
limit: parseInt(options.limit, 10),
|
|
33
|
+
});
|
|
34
|
+
result = { raw: mcpResult.content?.[0]?.text };
|
|
35
|
+
}
|
|
36
|
+
else if (transport.rest) {
|
|
37
|
+
const restResult = await transport.rest.getUsage({
|
|
38
|
+
limit: parseInt(options.days, 10),
|
|
39
|
+
});
|
|
40
|
+
result = restResult;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
throw new Error('No transport available');
|
|
44
|
+
}
|
|
45
|
+
spin.stop();
|
|
46
|
+
if (options.json) {
|
|
47
|
+
output.json(result);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const r = result;
|
|
51
|
+
if (r.raw) {
|
|
52
|
+
console.log(r.raw);
|
|
53
|
+
}
|
|
54
|
+
else if (r.data) {
|
|
55
|
+
const data = r.data;
|
|
56
|
+
output.header('Usage Statistics');
|
|
57
|
+
if (data.summary) {
|
|
58
|
+
const summary = data.summary;
|
|
59
|
+
output.keyValue('Total Operations', summary.total_operations || summary.totalOperations || 0);
|
|
60
|
+
output.keyValue('Total Images', summary.total_images || summary.totalImages || 0);
|
|
61
|
+
output.keyValue('Total Size', output.formatBytes(summary.total_size_bytes || summary.totalSizeBytes || 0));
|
|
62
|
+
if (summary.average_duration_ms || summary.averageDurationMs) {
|
|
63
|
+
output.keyValue('Avg Duration', output.formatDuration(summary.average_duration_ms || summary.averageDurationMs || 0));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (data.buckets && Array.isArray(data.buckets)) {
|
|
67
|
+
output.newline();
|
|
68
|
+
output.info(`${data.buckets.length} time buckets`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
spin.stop();
|
|
75
|
+
output.error(err instanceof Error ? err.message : 'Failed to load usage stats');
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// Get account summary
|
|
80
|
+
cmd
|
|
81
|
+
.command('summary')
|
|
82
|
+
.alias('sum')
|
|
83
|
+
.description('Get comprehensive account overview')
|
|
84
|
+
.option('--json', 'Output raw JSON response')
|
|
85
|
+
.action(async (options) => {
|
|
86
|
+
const spin = output.spinner('Loading account summary...');
|
|
87
|
+
try {
|
|
88
|
+
const transport = await createTransport();
|
|
89
|
+
let result;
|
|
90
|
+
if (transport.type === 'mcp' && transport.mcp) {
|
|
91
|
+
const mcpResult = await transport.mcp.getAccountSummary();
|
|
92
|
+
result = { raw: mcpResult.content?.[0]?.text };
|
|
93
|
+
}
|
|
94
|
+
else if (transport.rest) {
|
|
95
|
+
const restResult = await transport.rest.getProfile();
|
|
96
|
+
result = restResult;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
throw new Error('No transport available');
|
|
100
|
+
}
|
|
101
|
+
spin.stop();
|
|
102
|
+
if (options.json) {
|
|
103
|
+
output.json(result);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const r = result;
|
|
107
|
+
if (r.raw) {
|
|
108
|
+
console.log(r.raw);
|
|
109
|
+
}
|
|
110
|
+
else if (r.data) {
|
|
111
|
+
const data = r.data;
|
|
112
|
+
output.header('Account Summary');
|
|
113
|
+
// Tenant info
|
|
114
|
+
if (data.tenantName)
|
|
115
|
+
output.keyValue('Account', data.tenantName);
|
|
116
|
+
if (data.tenantId)
|
|
117
|
+
output.keyValue('Tenant ID', data.tenantId);
|
|
118
|
+
if (data.isActive !== undefined) {
|
|
119
|
+
output.keyValue('Status', data.isActive ? 'Active' : 'Inactive');
|
|
120
|
+
}
|
|
121
|
+
// Quotas
|
|
122
|
+
if (data.monthlyQuotaMb !== undefined) {
|
|
123
|
+
output.newline();
|
|
124
|
+
output.info('Quotas:');
|
|
125
|
+
output.keyValue(' Monthly Quota', `${data.monthlyQuotaMb} MB`);
|
|
126
|
+
if (data.storageUsedMb !== undefined) {
|
|
127
|
+
const used = data.storageUsedMb;
|
|
128
|
+
const quota = data.monthlyQuotaMb;
|
|
129
|
+
const percent = quota > 0 ? ((used / quota) * 100).toFixed(1) : '0';
|
|
130
|
+
output.keyValue(' Used', `${used.toFixed(2)} MB (${percent}%)`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
spin.stop();
|
|
138
|
+
output.error(err instanceof Error ? err.message : 'Failed to load account summary');
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return cmd;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAoB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAE7C,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;SAC7B,WAAW,CAAC,2CAA2C,CAAC,CAAC;IAE5D,kBAAkB;IAClB,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,KAAK,CAAC,GAAG,CAAC;SACV,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,IAAI,CAAC;SAC1D,MAAM,CAAC,sBAAsB,EAAE,8BAA8B,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;SACxD,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,EAAE,KAAK,CAAC;SAClE,MAAM,CAAC,QAAQ,EAAE,0BAA0B,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;YAE1C,IAAI,MAAe,CAAC;YACpB,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC;oBAClD,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBACxC,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;iBACnC,CAAC,CAAC;gBACH,MAAM,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACjD,CAAC;iBAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAC/C,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;iBAClC,CAAC,CAAC;gBACH,MAAM,GAAG,UAAU,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,MAAiC,CAAC;gBAC5C,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;oBAClB,MAAM,IAAI,GAAG,CAAC,CAAC,IAA+B,CAAC;oBAC/C,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;oBAElC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiC,CAAC;wBACvD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;wBAC9F,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;wBAClF,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC3G,IAAI,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;4BAC7D,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC,CAAC;wBACxH,CAAC;oBACH,CAAC;oBAED,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBAChD,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,MAAM,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,OAAqB,CAAC,MAAM,eAAe,CAAC,CAAC;oBACpE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,sBAAsB;IACtB,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,KAAK,CAAC,KAAK,CAAC;SACZ,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,QAAQ,EAAE,0BAA0B,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAE1D,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;YAE1C,IAAI,MAAe,CAAC;YACpB,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;gBAC1D,MAAM,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACjD,CAAC;iBAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrD,MAAM,GAAG,UAAU,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,MAAiC,CAAC;gBAC5C,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;oBAClB,MAAM,IAAI,GAAG,CAAC,CAAC,IAA+B,CAAC;oBAC/C,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;oBAEjC,cAAc;oBACd,IAAI,IAAI,CAAC,UAAU;wBAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,UAAoB,CAAC,CAAC;oBAC3E,IAAI,IAAI,CAAC,QAAQ;wBAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAkB,CAAC,CAAC;oBACzE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBAChC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAG,IAAI,CAAC,QAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;oBAChF,CAAC;oBAED,SAAS;oBACT,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;wBACtC,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBACvB,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,cAAc,KAAK,CAAC,CAAC;wBAChE,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;4BACrC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAuB,CAAC;4BAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,cAAwB,CAAC;4BAC5C,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;4BACpE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO,IAAI,CAAC,CAAC;wBACnE,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for Go Bananas CLI
|
|
3
|
+
*
|
|
4
|
+
* Handles persistent storage of API keys, server URL, and preferences.
|
|
5
|
+
* Uses the `conf` package for cross-platform config storage.
|
|
6
|
+
*/
|
|
7
|
+
import Conf from 'conf';
|
|
8
|
+
export interface CliConfig {
|
|
9
|
+
serverUrl: string;
|
|
10
|
+
apiKey: string;
|
|
11
|
+
transport: 'mcp' | 'rest' | 'auto';
|
|
12
|
+
outputDir: string;
|
|
13
|
+
defaultAspectRatio: string;
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const config: Conf<CliConfig>;
|
|
17
|
+
/**
|
|
18
|
+
* Get current configuration
|
|
19
|
+
*/
|
|
20
|
+
export declare function getConfig(): CliConfig;
|
|
21
|
+
/**
|
|
22
|
+
* Set a configuration value
|
|
23
|
+
*/
|
|
24
|
+
export declare function setConfig<K extends keyof CliConfig>(key: K, value: CliConfig[K]): void;
|
|
25
|
+
/**
|
|
26
|
+
* Validate API key format
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateApiKey(key: string): {
|
|
29
|
+
valid: boolean;
|
|
30
|
+
error?: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Check if API key is configured
|
|
34
|
+
*/
|
|
35
|
+
export declare function hasApiKey(): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Check if using a production API key
|
|
38
|
+
*/
|
|
39
|
+
export declare function isProductionKey(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Check if server URL is using HTTPS
|
|
42
|
+
*/
|
|
43
|
+
export declare function isSecureConnection(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Warn if using production key over insecure connection
|
|
46
|
+
*/
|
|
47
|
+
export declare function getSecurityWarning(): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Get or create a session ID for this CLI instance
|
|
50
|
+
* Session ID is persisted and reused until explicitly reset
|
|
51
|
+
*/
|
|
52
|
+
export declare function getOrCreateSessionId(): string;
|
|
53
|
+
/**
|
|
54
|
+
* Reset session ID (start fresh session)
|
|
55
|
+
*/
|
|
56
|
+
export declare function resetSession(): string;
|
|
57
|
+
/**
|
|
58
|
+
* Get the config file path (for debugging)
|
|
59
|
+
*/
|
|
60
|
+
export declare function getConfigPath(): string;
|
|
61
|
+
/**
|
|
62
|
+
* Clear all configuration
|
|
63
|
+
*/
|
|
64
|
+
export declare function clearConfig(): void;
|
|
65
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8BD,eAAO,MAAM,MAAM,iBAGjB,CAAC;AAcH;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAYrC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAEtF;AAOD;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ9E;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAGnC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAG5C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAKlD;AAUD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAO7C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for Go Bananas CLI
|
|
3
|
+
*
|
|
4
|
+
* Handles persistent storage of API keys, server URL, and preferences.
|
|
5
|
+
* Uses the `conf` package for cross-platform config storage.
|
|
6
|
+
*/
|
|
7
|
+
import Conf from 'conf';
|
|
8
|
+
import { randomBytes } from 'crypto';
|
|
9
|
+
const schema = {
|
|
10
|
+
serverUrl: {
|
|
11
|
+
type: 'string',
|
|
12
|
+
default: 'https://gobananasai.com',
|
|
13
|
+
},
|
|
14
|
+
apiKey: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
default: '',
|
|
17
|
+
},
|
|
18
|
+
transport: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
enum: ['mcp', 'rest', 'auto'],
|
|
21
|
+
default: 'auto',
|
|
22
|
+
},
|
|
23
|
+
outputDir: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
default: './generated',
|
|
26
|
+
},
|
|
27
|
+
defaultAspectRatio: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
default: 'square',
|
|
30
|
+
},
|
|
31
|
+
sessionId: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
default: undefined,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
export const config = new Conf({
|
|
37
|
+
projectName: 'gobananas-cli',
|
|
38
|
+
schema,
|
|
39
|
+
});
|
|
40
|
+
function getEnvServerUrl() {
|
|
41
|
+
const raw = process.env.GO_BANANAS_SERVER_URL;
|
|
42
|
+
if (!raw) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
return raw.replace(/\/+$/, '');
|
|
46
|
+
}
|
|
47
|
+
function getEnvApiKey() {
|
|
48
|
+
return process.env.GO_BANANAS_API_KEY || process.env.MCP_API_KEY;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get current configuration
|
|
52
|
+
*/
|
|
53
|
+
export function getConfig() {
|
|
54
|
+
const envServerUrl = getEnvServerUrl();
|
|
55
|
+
const envApiKey = getEnvApiKey();
|
|
56
|
+
return {
|
|
57
|
+
serverUrl: envServerUrl ?? config.get('serverUrl'),
|
|
58
|
+
apiKey: envApiKey ?? config.get('apiKey'),
|
|
59
|
+
transport: config.get('transport'),
|
|
60
|
+
outputDir: config.get('outputDir'),
|
|
61
|
+
defaultAspectRatio: config.get('defaultAspectRatio'),
|
|
62
|
+
sessionId: config.get('sessionId'),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Set a configuration value
|
|
67
|
+
*/
|
|
68
|
+
export function setConfig(key, value) {
|
|
69
|
+
config.set(key, value);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* API key format regex - must start with sk_live_ or sk_test_ followed by 20+ chars
|
|
73
|
+
*/
|
|
74
|
+
const API_KEY_REGEX = /^sk_(live|test)_[a-zA-Z0-9_]{20,}$/;
|
|
75
|
+
/**
|
|
76
|
+
* Validate API key format
|
|
77
|
+
*/
|
|
78
|
+
export function validateApiKey(key) {
|
|
79
|
+
if (!key || key.length === 0) {
|
|
80
|
+
return { valid: false, error: 'API key is required' };
|
|
81
|
+
}
|
|
82
|
+
if (!API_KEY_REGEX.test(key)) {
|
|
83
|
+
return { valid: false, error: 'Invalid API key format. Must start with sk_live_ or sk_test_ followed by at least 20 characters' };
|
|
84
|
+
}
|
|
85
|
+
return { valid: true };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if API key is configured
|
|
89
|
+
*/
|
|
90
|
+
export function hasApiKey() {
|
|
91
|
+
const apiKey = getEnvApiKey() ?? config.get('apiKey');
|
|
92
|
+
return Boolean(apiKey && apiKey.length > 0);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if using a production API key
|
|
96
|
+
*/
|
|
97
|
+
export function isProductionKey() {
|
|
98
|
+
const apiKey = getEnvApiKey() ?? config.get('apiKey');
|
|
99
|
+
return apiKey?.startsWith('sk_live_') ?? false;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Check if server URL is using HTTPS
|
|
103
|
+
*/
|
|
104
|
+
export function isSecureConnection() {
|
|
105
|
+
const serverUrl = getEnvServerUrl() ?? config.get('serverUrl');
|
|
106
|
+
return serverUrl?.startsWith('https://') ?? false;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Warn if using production key over insecure connection
|
|
110
|
+
*/
|
|
111
|
+
export function getSecurityWarning() {
|
|
112
|
+
if (isProductionKey() && !isSecureConnection()) {
|
|
113
|
+
return 'WARNING: Using production API key (sk_live_) over insecure HTTP connection. Consider using HTTPS.';
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate a cryptographically secure session ID
|
|
119
|
+
*/
|
|
120
|
+
function generateSecureSessionId() {
|
|
121
|
+
const randomPart = randomBytes(12).toString('hex');
|
|
122
|
+
return `cli-${Date.now()}-${randomPart}`;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get or create a session ID for this CLI instance
|
|
126
|
+
* Session ID is persisted and reused until explicitly reset
|
|
127
|
+
*/
|
|
128
|
+
export function getOrCreateSessionId() {
|
|
129
|
+
let sessionId = config.get('sessionId');
|
|
130
|
+
if (!sessionId) {
|
|
131
|
+
sessionId = generateSecureSessionId();
|
|
132
|
+
config.set('sessionId', sessionId);
|
|
133
|
+
}
|
|
134
|
+
return sessionId;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Reset session ID (start fresh session)
|
|
138
|
+
*/
|
|
139
|
+
export function resetSession() {
|
|
140
|
+
const sessionId = generateSecureSessionId();
|
|
141
|
+
config.set('sessionId', sessionId);
|
|
142
|
+
return sessionId;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get the config file path (for debugging)
|
|
146
|
+
*/
|
|
147
|
+
export function getConfigPath() {
|
|
148
|
+
return config.path;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Clear all configuration
|
|
152
|
+
*/
|
|
153
|
+
export function clearConfig() {
|
|
154
|
+
config.clear();
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Go Bananas CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for Go Bananas! AI Image Generation
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* gb generate "a sunset over mountains"
|
|
9
|
+
* gb edit 42 "add clouds"
|
|
10
|
+
* gb continue "make it brighter"
|
|
11
|
+
* gb char create "Hero" --prompt "..."
|
|
12
|
+
* gb char use "Hero" "flying over city"
|
|
13
|
+
* gb prod create "Widget" --url "..."
|
|
14
|
+
* gb prod use "Widget" "on a desk"
|
|
15
|
+
* gb scene create "Neon Alley" --prompt "..." --ref-urls "https://..."
|
|
16
|
+
* gb scene use "Neon Alley" "a futuristic motorcycle"
|
|
17
|
+
* gb style create "Watercolor" --instruction "..."
|
|
18
|
+
* gb usage stats
|
|
19
|
+
* gb config key "sk_live_xxx"
|
|
20
|
+
*/
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Go Bananas CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for Go Bananas! AI Image Generation
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* gb generate "a sunset over mountains"
|
|
9
|
+
* gb edit 42 "add clouds"
|
|
10
|
+
* gb continue "make it brighter"
|
|
11
|
+
* gb char create "Hero" --prompt "..."
|
|
12
|
+
* gb char use "Hero" "flying over city"
|
|
13
|
+
* gb prod create "Widget" --url "..."
|
|
14
|
+
* gb prod use "Widget" "on a desk"
|
|
15
|
+
* gb scene create "Neon Alley" --prompt "..." --ref-urls "https://..."
|
|
16
|
+
* gb scene use "Neon Alley" "a futuristic motorcycle"
|
|
17
|
+
* gb style create "Watercolor" --instruction "..."
|
|
18
|
+
* gb usage stats
|
|
19
|
+
* gb config key "sk_live_xxx"
|
|
20
|
+
*/
|
|
21
|
+
import { Command } from 'commander';
|
|
22
|
+
import chalk from 'chalk';
|
|
23
|
+
import { hasApiKey, getConfig } from './config/config.js';
|
|
24
|
+
import { createGenerateCommand } from './commands/generate.js';
|
|
25
|
+
import { createEditCommand, createContinueCommand, createUploadCommand } from './commands/edit.js';
|
|
26
|
+
import { createCharacterCommand } from './commands/character.js';
|
|
27
|
+
import { createProductCommand } from './commands/product.js';
|
|
28
|
+
import { createSceneCommand } from './commands/scene.js';
|
|
29
|
+
import { createStyleCommand } from './commands/style.js';
|
|
30
|
+
import { createSessionCommand } from './commands/session.js';
|
|
31
|
+
import { createUsageCommand } from './commands/usage.js';
|
|
32
|
+
import { createConfigCommand } from './commands/config.js';
|
|
33
|
+
import { createSearchCommand } from './commands/search.js';
|
|
34
|
+
import { createImageCommand } from './commands/image.js';
|
|
35
|
+
import { createAccountCommand } from './commands/account.js';
|
|
36
|
+
import { createMcpHelpCommand } from './commands/mcp-help.js';
|
|
37
|
+
import { createMcpProxyCommand } from './commands/mcp.js';
|
|
38
|
+
import * as output from './utils/output.js';
|
|
39
|
+
// Package version
|
|
40
|
+
const VERSION = '1.0.0';
|
|
41
|
+
// ASCII art banner
|
|
42
|
+
const BANNER = `
|
|
43
|
+
██████╗ ██████╗ ██████╗ █████╗ ███╗ ██╗ █████╗ ███╗ ██╗ █████╗ ███████╗
|
|
44
|
+
██╔════╝ ██╔═══██╗ ██╔══██╗██╔══██╗████╗ ██║██╔══██╗████╗ ██║██╔══██╗██╔════╝
|
|
45
|
+
██║ ███╗██║ ██║ ██████╔╝███████║██╔██╗ ██║███████║██╔██╗ ██║███████║███████╗
|
|
46
|
+
██║ ██║██║ ██║ ██╔══██╗██╔══██║██║╚██╗██║██╔══██║██║╚██╗██║██╔══██║╚════██║
|
|
47
|
+
╚██████╔╝╚██████╔╝ ██████╔╝██║ ██║██║ ╚████║██║ ██║██║ ╚████║██║ ██║███████║
|
|
48
|
+
╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚══════╝
|
|
49
|
+
`;
|
|
50
|
+
// Create the main program
|
|
51
|
+
const program = new Command();
|
|
52
|
+
program
|
|
53
|
+
.name('gobananas')
|
|
54
|
+
.alias('gb')
|
|
55
|
+
.version(VERSION)
|
|
56
|
+
.description('Go Bananas! CLI - AI Image Generation')
|
|
57
|
+
.option('-v, --verbose', 'Enable verbose output')
|
|
58
|
+
.hook('preAction', (thisCommand) => {
|
|
59
|
+
// Check for API key before running most commands
|
|
60
|
+
const commandName = thisCommand.args[0];
|
|
61
|
+
const configCommands = ['config', 'cfg', 'help', 'mcp', '--help', '-h', '--version', '-V'];
|
|
62
|
+
if (!configCommands.includes(commandName) && !hasApiKey()) {
|
|
63
|
+
output.error('API key not configured.');
|
|
64
|
+
output.info('Run "gb config key <your-api-key>" to set your API key.');
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
// Add all commands
|
|
69
|
+
program.addCommand(createGenerateCommand());
|
|
70
|
+
program.addCommand(createEditCommand());
|
|
71
|
+
program.addCommand(createContinueCommand());
|
|
72
|
+
program.addCommand(createUploadCommand());
|
|
73
|
+
program.addCommand(createCharacterCommand());
|
|
74
|
+
program.addCommand(createProductCommand());
|
|
75
|
+
program.addCommand(createSceneCommand());
|
|
76
|
+
program.addCommand(createStyleCommand());
|
|
77
|
+
program.addCommand(createSessionCommand());
|
|
78
|
+
program.addCommand(createUsageCommand());
|
|
79
|
+
program.addCommand(createConfigCommand());
|
|
80
|
+
program.addCommand(createSearchCommand());
|
|
81
|
+
program.addCommand(createImageCommand());
|
|
82
|
+
program.addCommand(createAccountCommand());
|
|
83
|
+
program.addCommand(createMcpHelpCommand());
|
|
84
|
+
program.addCommand(createMcpProxyCommand());
|
|
85
|
+
// Add info command
|
|
86
|
+
program
|
|
87
|
+
.command('info')
|
|
88
|
+
.description('Show CLI information and status')
|
|
89
|
+
.action(() => {
|
|
90
|
+
console.log(chalk.yellow(BANNER));
|
|
91
|
+
console.log(chalk.bold('Go Bananas! CLI') + ` v${VERSION}`);
|
|
92
|
+
console.log(chalk.gray('AI Image Generation powered by Google Gemini'));
|
|
93
|
+
console.log();
|
|
94
|
+
const config = getConfig();
|
|
95
|
+
output.keyValue('Server', config.serverUrl);
|
|
96
|
+
output.keyValue('Transport', config.transport);
|
|
97
|
+
output.keyValue('API Key', hasApiKey() ? chalk.green('Configured') : chalk.red('Not set'));
|
|
98
|
+
output.keyValue('Output Dir', config.outputDir);
|
|
99
|
+
console.log();
|
|
100
|
+
output.info('Quick Start:');
|
|
101
|
+
console.log(' gb generate "a sunset over mountains" Generate an image');
|
|
102
|
+
console.log(' gb continue "add clouds" Edit the last image');
|
|
103
|
+
console.log(' gb char create "Hero" -p "..." Save a character');
|
|
104
|
+
console.log(' gb char use "Hero" "flying" Use saved character');
|
|
105
|
+
console.log(' gb scene create "Neon Alley" -p "..." Save a scene preset');
|
|
106
|
+
console.log(' gb scene use "Neon Alley" "subject" Use saved scene preset');
|
|
107
|
+
console.log(' gb help Show all commands');
|
|
108
|
+
});
|
|
109
|
+
// Add help examples
|
|
110
|
+
program.on('--help', () => {
|
|
111
|
+
console.log('');
|
|
112
|
+
console.log('Examples:');
|
|
113
|
+
console.log(' $ gb generate "a photorealistic sunset over mountains"');
|
|
114
|
+
console.log(' $ gb generate "logo design" --aspect 1:1 --style "minimalist"');
|
|
115
|
+
console.log(' $ gb edit 42 "add storm clouds"');
|
|
116
|
+
console.log(' $ gb continue "make the colors more vibrant"');
|
|
117
|
+
console.log(' $ gb char create "Hero Henry" --prompt "10-year-old boy with red cape"');
|
|
118
|
+
console.log(' $ gb char use "Hero Henry" "flying over the city at sunset"');
|
|
119
|
+
console.log(' $ gb prod create "Smartwatch" --url "https://example.com/watch.png"');
|
|
120
|
+
console.log(' $ gb prod use "Smartwatch" "on a wooden desk with laptop"');
|
|
121
|
+
console.log(' $ gb scene create "Neon Alley" --prompt "rainy night, neon lights"');
|
|
122
|
+
console.log(' $ gb scene use "Neon Alley" "a courier on a motorbike"');
|
|
123
|
+
console.log(' $ gb config key sk_live_your_api_key');
|
|
124
|
+
console.log('');
|
|
125
|
+
console.log('For more help on a command, run:');
|
|
126
|
+
console.log(' $ gb <command> --help');
|
|
127
|
+
});
|
|
128
|
+
// Parse arguments
|
|
129
|
+
program.parse();
|
|
130
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type UpstreamTransportMode = 'auto' | 'streamable-http' | 'sse';
|
|
2
|
+
export interface McpStdioProxyOptions {
|
|
3
|
+
serverUrl?: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
transport?: UpstreamTransportMode;
|
|
6
|
+
}
|
|
7
|
+
export declare function runGoBananasMcpStdioProxy(options?: McpStdioProxyOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=stdio-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-proxy.d.ts","sourceRoot":"","sources":["../../src/mcp/stdio-proxy.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAEvE,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACnC;AAqQD,wBAAsB,yBAAyB,CAAC,OAAO,GAAE,oBAAyB,iBAyFjF"}
|