@myapihq/cli 1.0.1 → 1.0.4
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/dist/commands/setup.d.ts +1 -0
- package/dist/commands/setup.js +165 -0
- package/dist/index.js +23 -11
- package/package.json +1 -1
- package/src/commands/setup.ts +145 -0
- package/src/index.ts +19 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function setup(): Promise<void>;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.setup = setup;
|
|
37
|
+
const sdk_1 = require("@myapihq/sdk");
|
|
38
|
+
const config_js_1 = require("../config.js");
|
|
39
|
+
const output_js_1 = require("../output.js");
|
|
40
|
+
const readline = __importStar(require("readline"));
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
function ask(rl, q) {
|
|
46
|
+
return new Promise(resolve => rl.question(q, resolve));
|
|
47
|
+
}
|
|
48
|
+
function yn(answer, defaultYes = true) {
|
|
49
|
+
const t = answer.trim().toLowerCase();
|
|
50
|
+
if (t === '')
|
|
51
|
+
return defaultYes;
|
|
52
|
+
return t === 'y' || t === 'yes';
|
|
53
|
+
}
|
|
54
|
+
async function getOrCreateKey(rl) {
|
|
55
|
+
const choice = await ask(rl, '\n(1) Auto-create a new account (2) Paste an existing API key [1/2]: ');
|
|
56
|
+
if (choice.trim() === '2') {
|
|
57
|
+
const key = await ask(rl, 'Paste your API key: ');
|
|
58
|
+
(0, config_js_1.saveConfig)({ api_key: key.trim(), account_id: '', pin: '' });
|
|
59
|
+
(0, output_js_1.success)('API key saved to ~/.myapi/config.json');
|
|
60
|
+
return key.trim();
|
|
61
|
+
}
|
|
62
|
+
(0, output_js_1.info)('Creating account...');
|
|
63
|
+
const agent = await sdk_1.hq.createAgentAccount();
|
|
64
|
+
const keyInfo = await sdk_1.hq.createApiKey(agent.token, 'default');
|
|
65
|
+
(0, config_js_1.saveConfig)({ api_key: keyInfo.api_key, account_id: agent.account_id, pin: agent.pin });
|
|
66
|
+
(0, output_js_1.success)(`Account created!\n\nAPI Key: ${keyInfo.api_key}\nPIN: ${agent.pin}\n\nSave your PIN — it's the only way to recover your account.`);
|
|
67
|
+
return keyInfo.api_key;
|
|
68
|
+
}
|
|
69
|
+
function registerClaudeMcp() {
|
|
70
|
+
try {
|
|
71
|
+
(0, child_process_1.execSync)('claude mcp add myapi -- npx -y @myapihq/mcp', { stdio: 'inherit' });
|
|
72
|
+
(0, output_js_1.success)('Claude Code MCP registered');
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
(0, output_js_1.info)('Could not auto-register. Run manually:\n claude mcp add myapi -- npx -y @myapihq/mcp');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function registerGeminiMcp() {
|
|
79
|
+
const configPath = path.join(os.homedir(), '.gemini', 'settings.json');
|
|
80
|
+
try {
|
|
81
|
+
let settings = {};
|
|
82
|
+
if (fs.existsSync(configPath)) {
|
|
83
|
+
settings = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
84
|
+
}
|
|
85
|
+
settings.mcpServers = settings.mcpServers ?? {};
|
|
86
|
+
settings.mcpServers.myapi = { command: 'npx', args: ['-y', '@myapihq/mcp'] };
|
|
87
|
+
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
88
|
+
fs.writeFileSync(configPath, JSON.stringify(settings, null, 2));
|
|
89
|
+
(0, output_js_1.success)('Gemini CLI MCP registered (~/.gemini/settings.json)');
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
(0, output_js_1.info)('Could not auto-configure Gemini CLI. Add manually to ~/.gemini/settings.json:');
|
|
93
|
+
(0, output_js_1.info)(' { "mcpServers": { "myapi": { "command": "npx", "args": ["-y", "@myapihq/mcp"] } } }');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function setup() {
|
|
97
|
+
(0, output_js_1.info)('MyAPI Setup\n');
|
|
98
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
99
|
+
// Step 1: credentials
|
|
100
|
+
const existing = (0, config_js_1.loadConfig)();
|
|
101
|
+
if (existing?.api_key) {
|
|
102
|
+
const reuse = await ask(rl, `Found existing account (${existing.account_id || existing.api_key.slice(0, 20) + '...'}). Use it? [Y/n]: `);
|
|
103
|
+
if (!yn(reuse, true)) {
|
|
104
|
+
await getOrCreateKey(rl);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
(0, output_js_1.info)('Using existing credentials.');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
await getOrCreateKey(rl);
|
|
112
|
+
}
|
|
113
|
+
// Step 2: which agents
|
|
114
|
+
(0, output_js_1.info)('\nWhich AI agents do you use?');
|
|
115
|
+
const useClaude = yn(await ask(rl, ' Claude Code? [Y/n]: '), true);
|
|
116
|
+
const useGemini = yn(await ask(rl, ' Gemini CLI? [Y/n]: '), true);
|
|
117
|
+
const useCursor = yn(await ask(rl, ' Cursor? [y/N]: '), false);
|
|
118
|
+
const useWindsurf = yn(await ask(rl, ' Windsurf? [y/N]: '), false);
|
|
119
|
+
const useKiro = yn(await ask(rl, ' Kiro? [y/N]: '), false);
|
|
120
|
+
const useCopilot = yn(await ask(rl, ' GitHub Copilot? [y/N]: '), false);
|
|
121
|
+
const useOther = yn(await ask(rl, ' Other / Codex? [y/N]: '), false);
|
|
122
|
+
// Step 3: Claude — MCP or Skills or both
|
|
123
|
+
let claudeMcp = false;
|
|
124
|
+
let claudeSkills = false;
|
|
125
|
+
if (useClaude) {
|
|
126
|
+
(0, output_js_1.info)('\nFor Claude Code, how do you want to connect?');
|
|
127
|
+
claudeMcp = yn(await ask(rl, ' MCP server — live API calls via tool use? [Y/n]: '), true);
|
|
128
|
+
claudeSkills = yn(await ask(rl, ' Skills plugin — inline docs + prompts? [y/N]: '), false);
|
|
129
|
+
}
|
|
130
|
+
rl.close();
|
|
131
|
+
// Step 4: apply
|
|
132
|
+
(0, output_js_1.info)('\nApplying configuration...\n');
|
|
133
|
+
if (claudeMcp)
|
|
134
|
+
registerClaudeMcp();
|
|
135
|
+
if (useGemini)
|
|
136
|
+
registerGeminiMcp();
|
|
137
|
+
if (claudeSkills) {
|
|
138
|
+
(0, output_js_1.info)('To install the MyAPI skill inside Claude Code, run:');
|
|
139
|
+
(0, output_js_1.info)(' /plugin marketplace add myapihq/claude-skills');
|
|
140
|
+
(0, output_js_1.info)(' /plugin install my-api-hq@myapi-skills');
|
|
141
|
+
}
|
|
142
|
+
const skillsUrl = 'https://github.com/myapihq/agent-skills/blob/main/skills/my-api-hq/SKILL.md';
|
|
143
|
+
if (useCursor) {
|
|
144
|
+
(0, output_js_1.info)('\nCursor — copy the skill into .cursor/rules/:');
|
|
145
|
+
(0, output_js_1.info)(` ${skillsUrl}`);
|
|
146
|
+
}
|
|
147
|
+
if (useWindsurf) {
|
|
148
|
+
(0, output_js_1.info)('\nWindsurf — add the skill to your rules configuration:');
|
|
149
|
+
(0, output_js_1.info)(` ${skillsUrl}`);
|
|
150
|
+
}
|
|
151
|
+
if (useKiro) {
|
|
152
|
+
(0, output_js_1.info)('\nKiro — copy the skill into .kiro/skills/:');
|
|
153
|
+
(0, output_js_1.info)(` ${skillsUrl}`);
|
|
154
|
+
}
|
|
155
|
+
if (useCopilot) {
|
|
156
|
+
(0, output_js_1.info)('\nGitHub Copilot — paste the skill into .github/copilot-instructions.md:');
|
|
157
|
+
(0, output_js_1.info)(` ${skillsUrl}`);
|
|
158
|
+
}
|
|
159
|
+
if (useOther) {
|
|
160
|
+
(0, output_js_1.info)('\nOther agents — copy the skill markdown as a system prompt or instruction file:');
|
|
161
|
+
(0, output_js_1.info)(` ${skillsUrl}`);
|
|
162
|
+
}
|
|
163
|
+
(0, output_js_1.info)('');
|
|
164
|
+
(0, output_js_1.success)('Setup complete! Try: myapi billing balance');
|
|
165
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -34,11 +34,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
};
|
|
35
35
|
})();
|
|
36
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
// AUTO-GENERATED by scripts/generate-indexes.js — do not edit manually
|
|
37
38
|
const utils_js_1 = require("./utils.js");
|
|
38
39
|
const output_js_1 = require("./output.js");
|
|
39
40
|
const sdk_1 = require("@myapihq/sdk");
|
|
40
41
|
const accountCmd = __importStar(require("./commands/account.js"));
|
|
41
42
|
const billingCmd = __importStar(require("./commands/billing.js"));
|
|
43
|
+
const orgCmd = __importStar(require("./commands/org.js"));
|
|
44
|
+
const setupCmd = __importStar(require("./commands/setup.js"));
|
|
42
45
|
async function main() {
|
|
43
46
|
const { args, flags } = (0, utils_js_1.parseArgs)(process.argv.slice(2));
|
|
44
47
|
if (args.length === 0) {
|
|
@@ -48,6 +51,9 @@ async function main() {
|
|
|
48
51
|
const [command, subcommand, ...restArgs] = args;
|
|
49
52
|
try {
|
|
50
53
|
switch (command) {
|
|
54
|
+
case 'setup':
|
|
55
|
+
await setupCmd.setup();
|
|
56
|
+
break;
|
|
51
57
|
case 'account':
|
|
52
58
|
if (subcommand === 'create')
|
|
53
59
|
await accountCmd.create();
|
|
@@ -60,6 +66,14 @@ async function main() {
|
|
|
60
66
|
else
|
|
61
67
|
printHelp();
|
|
62
68
|
break;
|
|
69
|
+
case 'org':
|
|
70
|
+
if (subcommand === 'list')
|
|
71
|
+
await orgCmd.list(flags);
|
|
72
|
+
else if (subcommand === 'create')
|
|
73
|
+
await orgCmd.create(flags);
|
|
74
|
+
else
|
|
75
|
+
printHelp();
|
|
76
|
+
break;
|
|
63
77
|
case 'billing':
|
|
64
78
|
if (subcommand === 'balance')
|
|
65
79
|
await billingCmd.balance(flags);
|
|
@@ -79,12 +93,10 @@ async function main() {
|
|
|
79
93
|
}
|
|
80
94
|
catch (err) {
|
|
81
95
|
if (err instanceof sdk_1.MyApiError) {
|
|
82
|
-
if (err.status === 402)
|
|
83
|
-
(0, output_js_1.error)(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
(0, output_js_1.error)("Invalid API key. Run: myapi account create");
|
|
87
|
-
}
|
|
96
|
+
if (err.status === 402)
|
|
97
|
+
(0, output_js_1.error)('Insufficient balance. Run: myapi billing topup <amount>');
|
|
98
|
+
else if (err.status === 401)
|
|
99
|
+
(0, output_js_1.error)('Invalid API key. Run: myapi setup');
|
|
88
100
|
}
|
|
89
101
|
(0, output_js_1.error)(err.message || String(err));
|
|
90
102
|
}
|
|
@@ -95,11 +107,11 @@ function printHelp() {
|
|
|
95
107
|
Usage: myapi <command> [subcommand] [args]
|
|
96
108
|
|
|
97
109
|
Commands:
|
|
98
|
-
account
|
|
99
|
-
billing
|
|
110
|
+
account
|
|
111
|
+
billing
|
|
112
|
+
org
|
|
113
|
+
setup
|
|
100
114
|
|
|
101
115
|
Run "myapi <command>" for subcommand help.`);
|
|
102
116
|
}
|
|
103
|
-
main().catch(err => {
|
|
104
|
-
(0, output_js_1.error)(err.message || String(err));
|
|
105
|
-
});
|
|
117
|
+
main().catch(err => { (0, output_js_1.error)(err.message || String(err)); });
|
package/package.json
CHANGED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { hq } from '@myapihq/sdk';
|
|
2
|
+
import { loadConfig, saveConfig } from '../config.js';
|
|
3
|
+
import { success, info } from '../output.js';
|
|
4
|
+
import * as readline from 'readline';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
|
|
10
|
+
function ask(rl: readline.Interface, q: string): Promise<string> {
|
|
11
|
+
return new Promise(resolve => rl.question(q, resolve));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function yn(answer: string, defaultYes = true): boolean {
|
|
15
|
+
const t = answer.trim().toLowerCase();
|
|
16
|
+
if (t === '') return defaultYes;
|
|
17
|
+
return t === 'y' || t === 'yes';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async function getOrCreateKey(rl: readline.Interface): Promise<string> {
|
|
21
|
+
const choice = await ask(rl, '\n(1) Auto-create a new account (2) Paste an existing API key [1/2]: ');
|
|
22
|
+
|
|
23
|
+
if (choice.trim() === '2') {
|
|
24
|
+
const key = await ask(rl, 'Paste your API key: ');
|
|
25
|
+
saveConfig({ api_key: key.trim(), account_id: '', pin: '' });
|
|
26
|
+
success('API key saved to ~/.myapi/config.json');
|
|
27
|
+
return key.trim();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
info('Creating account...');
|
|
31
|
+
const agent = await hq.createAgentAccount();
|
|
32
|
+
const keyInfo = await hq.createApiKey(agent.token, 'default');
|
|
33
|
+
saveConfig({ api_key: keyInfo.api_key, account_id: agent.account_id, pin: agent.pin });
|
|
34
|
+
success(`Account created!\n\nAPI Key: ${keyInfo.api_key}\nPIN: ${agent.pin}\n\nSave your PIN — it's the only way to recover your account.`);
|
|
35
|
+
return keyInfo.api_key;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function registerClaudeMcp() {
|
|
39
|
+
try {
|
|
40
|
+
execSync('claude mcp add myapi -- npx -y @myapihq/mcp', { stdio: 'inherit' });
|
|
41
|
+
success('Claude Code MCP registered');
|
|
42
|
+
} catch {
|
|
43
|
+
info('Could not auto-register. Run manually:\n claude mcp add myapi -- npx -y @myapihq/mcp');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function registerGeminiMcp() {
|
|
48
|
+
const configPath = path.join(os.homedir(), '.gemini', 'settings.json');
|
|
49
|
+
try {
|
|
50
|
+
let settings: Record<string, any> = {};
|
|
51
|
+
if (fs.existsSync(configPath)) {
|
|
52
|
+
settings = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
53
|
+
}
|
|
54
|
+
settings.mcpServers = settings.mcpServers ?? {};
|
|
55
|
+
settings.mcpServers.myapi = { command: 'npx', args: ['-y', '@myapihq/mcp'] };
|
|
56
|
+
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
57
|
+
fs.writeFileSync(configPath, JSON.stringify(settings, null, 2));
|
|
58
|
+
success('Gemini CLI MCP registered (~/.gemini/settings.json)');
|
|
59
|
+
} catch {
|
|
60
|
+
info('Could not auto-configure Gemini CLI. Add manually to ~/.gemini/settings.json:');
|
|
61
|
+
info(' { "mcpServers": { "myapi": { "command": "npx", "args": ["-y", "@myapihq/mcp"] } } }');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function setup() {
|
|
66
|
+
info('MyAPI Setup\n');
|
|
67
|
+
|
|
68
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
69
|
+
|
|
70
|
+
// Step 1: credentials
|
|
71
|
+
const existing = loadConfig();
|
|
72
|
+
if (existing?.api_key) {
|
|
73
|
+
const reuse = await ask(rl, `Found existing account (${existing.account_id || existing.api_key.slice(0, 20) + '...'}). Use it? [Y/n]: `);
|
|
74
|
+
if (!yn(reuse, true)) {
|
|
75
|
+
await getOrCreateKey(rl);
|
|
76
|
+
} else {
|
|
77
|
+
info('Using existing credentials.');
|
|
78
|
+
}
|
|
79
|
+
} else {
|
|
80
|
+
await getOrCreateKey(rl);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Step 2: which agents
|
|
84
|
+
info('\nWhich AI agents do you use?');
|
|
85
|
+
const useClaude = yn(await ask(rl, ' Claude Code? [Y/n]: '), true);
|
|
86
|
+
const useGemini = yn(await ask(rl, ' Gemini CLI? [Y/n]: '), true);
|
|
87
|
+
const useCursor = yn(await ask(rl, ' Cursor? [y/N]: '), false);
|
|
88
|
+
const useWindsurf = yn(await ask(rl, ' Windsurf? [y/N]: '), false);
|
|
89
|
+
const useKiro = yn(await ask(rl, ' Kiro? [y/N]: '), false);
|
|
90
|
+
const useCopilot = yn(await ask(rl, ' GitHub Copilot? [y/N]: '), false);
|
|
91
|
+
const useOther = yn(await ask(rl, ' Other / Codex? [y/N]: '), false);
|
|
92
|
+
|
|
93
|
+
// Step 3: Claude — MCP or Skills or both
|
|
94
|
+
let claudeMcp = false;
|
|
95
|
+
let claudeSkills = false;
|
|
96
|
+
if (useClaude) {
|
|
97
|
+
info('\nFor Claude Code, how do you want to connect?');
|
|
98
|
+
claudeMcp = yn(await ask(rl, ' MCP server — live API calls via tool use? [Y/n]: '), true);
|
|
99
|
+
claudeSkills = yn(await ask(rl, ' Skills plugin — inline docs + prompts? [y/N]: '), false);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
rl.close();
|
|
103
|
+
|
|
104
|
+
// Step 4: apply
|
|
105
|
+
info('\nApplying configuration...\n');
|
|
106
|
+
|
|
107
|
+
if (claudeMcp) registerClaudeMcp();
|
|
108
|
+
if (useGemini) registerGeminiMcp();
|
|
109
|
+
|
|
110
|
+
if (claudeSkills) {
|
|
111
|
+
info('To install the MyAPI skill inside Claude Code, run:');
|
|
112
|
+
info(' /plugin marketplace add myapihq/claude-skills');
|
|
113
|
+
info(' /plugin install my-api-hq@myapi-skills');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const skillsUrl = 'https://github.com/myapihq/agent-skills/blob/main/skills/my-api-hq/SKILL.md';
|
|
117
|
+
|
|
118
|
+
if (useCursor) {
|
|
119
|
+
info('\nCursor — copy the skill into .cursor/rules/:');
|
|
120
|
+
info(` ${skillsUrl}`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (useWindsurf) {
|
|
124
|
+
info('\nWindsurf — add the skill to your rules configuration:');
|
|
125
|
+
info(` ${skillsUrl}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (useKiro) {
|
|
129
|
+
info('\nKiro — copy the skill into .kiro/skills/:');
|
|
130
|
+
info(` ${skillsUrl}`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (useCopilot) {
|
|
134
|
+
info('\nGitHub Copilot — paste the skill into .github/copilot-instructions.md:');
|
|
135
|
+
info(` ${skillsUrl}`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (useOther) {
|
|
139
|
+
info('\nOther agents — copy the skill markdown as a system prompt or instruction file:');
|
|
140
|
+
info(` ${skillsUrl}`);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
info('');
|
|
144
|
+
success('Setup complete! Try: myapi billing balance');
|
|
145
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
// AUTO-GENERATED by scripts/generate-indexes.js — do not edit manually
|
|
3
3
|
import { parseArgs } from './utils.js';
|
|
4
4
|
import { error, info } from './output.js';
|
|
5
5
|
import { MyApiError } from '@myapihq/sdk';
|
|
6
|
-
|
|
7
6
|
import * as accountCmd from './commands/account.js';
|
|
8
7
|
import * as billingCmd from './commands/billing.js';
|
|
8
|
+
import * as orgCmd from './commands/org.js';
|
|
9
|
+
import * as setupCmd from './commands/setup.js';
|
|
9
10
|
|
|
10
11
|
async function main() {
|
|
11
12
|
const { args, flags } = parseArgs(process.argv.slice(2));
|
|
12
|
-
|
|
13
|
-
if (args.length === 0) {
|
|
14
|
-
printHelp();
|
|
15
|
-
process.exit(0);
|
|
16
|
-
}
|
|
17
|
-
|
|
13
|
+
if (args.length === 0) { printHelp(); process.exit(0); }
|
|
18
14
|
const [command, subcommand, ...restArgs] = args;
|
|
19
|
-
|
|
20
15
|
try {
|
|
21
16
|
switch (command) {
|
|
17
|
+
case 'setup':
|
|
18
|
+
await setupCmd.setup();
|
|
19
|
+
break;
|
|
22
20
|
case 'account':
|
|
23
21
|
if (subcommand === 'create') await accountCmd.create();
|
|
24
22
|
else if (subcommand === 'token') await accountCmd.token(flags);
|
|
@@ -26,7 +24,11 @@ async function main() {
|
|
|
26
24
|
else if (subcommand === 'revoke') await accountCmd.revokeKey(restArgs[0], flags);
|
|
27
25
|
else printHelp();
|
|
28
26
|
break;
|
|
29
|
-
|
|
27
|
+
case 'org':
|
|
28
|
+
if (subcommand === 'list') await orgCmd.list(flags);
|
|
29
|
+
else if (subcommand === 'create') await orgCmd.create(flags);
|
|
30
|
+
else printHelp();
|
|
31
|
+
break;
|
|
30
32
|
case 'billing':
|
|
31
33
|
if (subcommand === 'balance') await billingCmd.balance(flags);
|
|
32
34
|
else if (subcommand === 'history') await billingCmd.history(flags);
|
|
@@ -34,18 +36,14 @@ async function main() {
|
|
|
34
36
|
else if (subcommand === 'setup') await billingCmd.setup(flags);
|
|
35
37
|
else printHelp();
|
|
36
38
|
break;
|
|
37
|
-
|
|
38
39
|
default:
|
|
39
40
|
printHelp();
|
|
40
41
|
process.exit(0);
|
|
41
42
|
}
|
|
42
43
|
} catch (err: any) {
|
|
43
44
|
if (err instanceof MyApiError) {
|
|
44
|
-
if (err.status === 402)
|
|
45
|
-
|
|
46
|
-
} else if (err.status === 401) {
|
|
47
|
-
error("Invalid API key. Run: myapi account create");
|
|
48
|
-
}
|
|
45
|
+
if (err.status === 402) error('Insufficient balance. Run: myapi billing topup <amount>');
|
|
46
|
+
else if (err.status === 401) error('Invalid API key. Run: myapi setup');
|
|
49
47
|
}
|
|
50
48
|
error(err.message || String(err));
|
|
51
49
|
}
|
|
@@ -57,12 +55,12 @@ function printHelp() {
|
|
|
57
55
|
Usage: myapi <command> [subcommand] [args]
|
|
58
56
|
|
|
59
57
|
Commands:
|
|
60
|
-
account
|
|
61
|
-
billing
|
|
58
|
+
account
|
|
59
|
+
billing
|
|
60
|
+
org
|
|
61
|
+
setup
|
|
62
62
|
|
|
63
63
|
Run "myapi <command>" for subcommand help.`);
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
main().catch(err => {
|
|
67
|
-
error(err.message || String(err));
|
|
68
|
-
});
|
|
66
|
+
main().catch(err => { error(err.message || String(err)); });
|