@leaperone/cli 0.1.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/bin/leaperone.js +2 -0
- package/dist/commands/apikey.d.ts +2 -0
- package/dist/commands/apikey.js +92 -0
- package/dist/commands/apikey.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +267 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +54 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/credit.d.ts +2 -0
- package/dist/commands/credit.js +68 -0
- package/dist/commands/credit.js.map +1 -0
- package/dist/commands/docs.d.ts +2 -0
- package/dist/commands/docs.js +74 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +5 -0
- package/dist/lib/api.js +40 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +15 -0
- package/dist/lib/config.js +63 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +6 -0
- package/dist/lib/output.js +29 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +26 -0
package/bin/leaperone.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { request } from "../lib/api.js";
|
|
2
|
+
import { jsonOutput, table, success, error, warn } from "../lib/output.js";
|
|
3
|
+
export function registerApiKeyCommand(program) {
|
|
4
|
+
const apikey = program.command("apikey").description("Manage API keys");
|
|
5
|
+
apikey
|
|
6
|
+
.command("list")
|
|
7
|
+
.description("List all API keys")
|
|
8
|
+
.action(async () => {
|
|
9
|
+
const json = program.opts().json;
|
|
10
|
+
try {
|
|
11
|
+
const keys = await request("/apikeys");
|
|
12
|
+
if (json) {
|
|
13
|
+
jsonOutput(keys);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (keys.length === 0) {
|
|
17
|
+
console.log("No API keys found. Create one with `leaperone apikey create`");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
table(["Name", "Key", "Created", "Last Used", "Status"], keys.map((k) => [
|
|
21
|
+
k.name,
|
|
22
|
+
k.keyPreview,
|
|
23
|
+
new Date(k.createdAt).toLocaleDateString(),
|
|
24
|
+
k.lastUsedAt ? new Date(k.lastUsedAt).toLocaleDateString() : "Never",
|
|
25
|
+
k.revokedAt ? "Revoked" : "Active",
|
|
26
|
+
]));
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
if (json)
|
|
30
|
+
jsonOutput({ error: err.message });
|
|
31
|
+
else
|
|
32
|
+
error(err.message);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
apikey
|
|
37
|
+
.command("create")
|
|
38
|
+
.description("Create a new API key")
|
|
39
|
+
.requiredOption("-n, --name <name>", "Name for the API key")
|
|
40
|
+
.action(async (opts) => {
|
|
41
|
+
const json = program.opts().json;
|
|
42
|
+
try {
|
|
43
|
+
const result = await request("/apikeys", {
|
|
44
|
+
method: "POST",
|
|
45
|
+
body: { name: opts.name },
|
|
46
|
+
});
|
|
47
|
+
if (json) {
|
|
48
|
+
jsonOutput(result);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
success(`API key created: ${result.name}`);
|
|
52
|
+
console.log();
|
|
53
|
+
console.log(` ${result.key}`);
|
|
54
|
+
console.log();
|
|
55
|
+
warn("Save this key now. You won't be able to see it again.");
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (json)
|
|
59
|
+
jsonOutput({ error: err.message });
|
|
60
|
+
else
|
|
61
|
+
error(err.message);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
apikey
|
|
66
|
+
.command("revoke")
|
|
67
|
+
.description("Revoke an API key")
|
|
68
|
+
.requiredOption("-n, --name <name>", "Name of the API key to revoke")
|
|
69
|
+
.action(async (opts) => {
|
|
70
|
+
const json = program.opts().json;
|
|
71
|
+
try {
|
|
72
|
+
const result = await request(`/apikeys/revoke`, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
body: { name: opts.name },
|
|
75
|
+
});
|
|
76
|
+
if (json) {
|
|
77
|
+
jsonOutput(result);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
success(`API key "${opts.name}" has been revoked.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
if (json)
|
|
85
|
+
jsonOutput({ error: err.message });
|
|
86
|
+
else
|
|
87
|
+
error(err.message);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=apikey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apikey.js","sourceRoot":"","sources":["../../src/commands/apikey.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import { exec } from "node:child_process";
|
|
3
|
+
import { loadConfig, saveConfig, clearAuth, getCredential, getBaseUrl, CONFIG_FILE } from "../lib/config.js";
|
|
4
|
+
import { jsonOutput, keyValue, success, error } from "../lib/output.js";
|
|
5
|
+
function openBrowser(url) {
|
|
6
|
+
const cmd = process.platform === "darwin" ? "open" :
|
|
7
|
+
process.platform === "win32" ? "start" : "xdg-open";
|
|
8
|
+
exec(`${cmd} "${url}"`);
|
|
9
|
+
}
|
|
10
|
+
// ── Browser-based login (localhost callback) ──────────────────────────────
|
|
11
|
+
function browserLogin(baseUrl) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const server = http.createServer((req, res) => {
|
|
14
|
+
const url = new URL(req.url, `http://localhost`);
|
|
15
|
+
if (url.pathname === "/callback") {
|
|
16
|
+
const code = url.searchParams.get("code");
|
|
17
|
+
if (!code) {
|
|
18
|
+
res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
|
|
19
|
+
res.end("<html><body><h2>Missing authorization code.</h2></body></html>");
|
|
20
|
+
server.close();
|
|
21
|
+
reject(new Error("No authorization code received"));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
25
|
+
res.end(`<html><body style="display:flex;justify-content:center;align-items:center;height:100vh;font-family:system-ui">
|
|
26
|
+
<div style="text-align:center">
|
|
27
|
+
<h2 style="color:#22c55e">Authorization successful!</h2>
|
|
28
|
+
<p>You can close this tab and return to your terminal.</p>
|
|
29
|
+
</div>
|
|
30
|
+
</body></html>`);
|
|
31
|
+
// Exchange code for session token
|
|
32
|
+
fetch(new URL("/api/v1/cli/auth/exchange", baseUrl), {
|
|
33
|
+
method: "PUT",
|
|
34
|
+
headers: { "Content-Type": "application/json" },
|
|
35
|
+
body: JSON.stringify({ code }),
|
|
36
|
+
})
|
|
37
|
+
.then(async (r) => {
|
|
38
|
+
const text = await r.text();
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(text);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new Error(`Exchange API returned non-JSON (HTTP ${r.status}): ${text.slice(0, 200)}`);
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
.then((data) => {
|
|
47
|
+
server.close();
|
|
48
|
+
if (data.success && data.data?.token) {
|
|
49
|
+
resolve(data.data.token);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
reject(new Error(data.error || "Failed to exchange code"));
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
.catch((err) => {
|
|
56
|
+
server.close();
|
|
57
|
+
reject(err);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
res.writeHead(404);
|
|
62
|
+
res.end();
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Listen on random port
|
|
66
|
+
server.listen(0, "127.0.0.1", () => {
|
|
67
|
+
const addr = server.address();
|
|
68
|
+
if (!addr || typeof addr === "string") {
|
|
69
|
+
reject(new Error("Failed to start local server"));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const port = addr.port;
|
|
73
|
+
const authUrl = `${baseUrl}/auth/cli?port=${port}`;
|
|
74
|
+
console.log(`Opening browser to authorize...`);
|
|
75
|
+
console.log(` ${authUrl}`);
|
|
76
|
+
console.log();
|
|
77
|
+
console.log("Waiting for authorization...");
|
|
78
|
+
openBrowser(authUrl);
|
|
79
|
+
});
|
|
80
|
+
// Timeout after 3 minutes
|
|
81
|
+
setTimeout(() => {
|
|
82
|
+
server.close();
|
|
83
|
+
reject(new Error("Authorization timed out (3 minutes)"));
|
|
84
|
+
}, 3 * 60 * 1000);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// ── Device Flow login ─────────────────────────────────────────────────────
|
|
88
|
+
async function deviceLogin(baseUrl) {
|
|
89
|
+
// Step 1: Request device code
|
|
90
|
+
const codeRes = await fetch(new URL("/api/auth/device/code", baseUrl), {
|
|
91
|
+
method: "POST",
|
|
92
|
+
headers: { "Content-Type": "application/json" },
|
|
93
|
+
body: JSON.stringify({ client_id: "leaperone-cli" }),
|
|
94
|
+
});
|
|
95
|
+
if (!codeRes.ok) {
|
|
96
|
+
const body = await codeRes.json().catch(() => ({}));
|
|
97
|
+
throw new Error(body.message || `Failed to request device code (HTTP ${codeRes.status})`);
|
|
98
|
+
}
|
|
99
|
+
const codeData = await codeRes.json();
|
|
100
|
+
// Step 2: Show code to user
|
|
101
|
+
console.log();
|
|
102
|
+
console.log(` Your device code: ${codeData.user_code}`);
|
|
103
|
+
console.log();
|
|
104
|
+
const verifyUrl = codeData.verification_uri_complete
|
|
105
|
+
|| `${baseUrl}${codeData.verification_uri}?user_code=${encodeURIComponent(codeData.user_code)}`;
|
|
106
|
+
console.log(` Open this URL to authorize:`);
|
|
107
|
+
console.log(` ${verifyUrl}`);
|
|
108
|
+
console.log();
|
|
109
|
+
console.log("Waiting for authorization...");
|
|
110
|
+
openBrowser(verifyUrl);
|
|
111
|
+
// Step 3: Poll for token
|
|
112
|
+
const interval = (codeData.interval || 5) * 1000;
|
|
113
|
+
const deadline = Date.now() + codeData.expires_in * 1000;
|
|
114
|
+
while (Date.now() < deadline) {
|
|
115
|
+
await new Promise((r) => setTimeout(r, interval));
|
|
116
|
+
const tokenRes = await fetch(new URL("/api/auth/device/token", baseUrl), {
|
|
117
|
+
method: "POST",
|
|
118
|
+
headers: { "Content-Type": "application/json" },
|
|
119
|
+
body: JSON.stringify({
|
|
120
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
121
|
+
device_code: codeData.device_code,
|
|
122
|
+
client_id: "leaperone-cli",
|
|
123
|
+
}),
|
|
124
|
+
});
|
|
125
|
+
const tokenData = await tokenRes.json();
|
|
126
|
+
if (tokenData.access_token) {
|
|
127
|
+
return tokenData.access_token;
|
|
128
|
+
}
|
|
129
|
+
if (tokenData.error === "authorization_pending" || tokenData.error === "slow_down") {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (tokenData.error === "expired_token") {
|
|
133
|
+
throw new Error("Device code expired. Please try again.");
|
|
134
|
+
}
|
|
135
|
+
if (tokenData.error === "access_denied") {
|
|
136
|
+
throw new Error("Authorization was denied.");
|
|
137
|
+
}
|
|
138
|
+
if (tokenData.error) {
|
|
139
|
+
throw new Error(`Device flow error: ${tokenData.error}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
throw new Error("Device code expired. Please try again.");
|
|
143
|
+
}
|
|
144
|
+
// ── Verify token and save ─────────────────────────────────────────────────
|
|
145
|
+
async function verifyAndSaveToken(token, baseUrl, json) {
|
|
146
|
+
const res = await fetch(new URL("/api/v1/cli/me", baseUrl), {
|
|
147
|
+
headers: {
|
|
148
|
+
Authorization: `Bearer ${token}`,
|
|
149
|
+
"User-Agent": "@leaperone/cli",
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
if (!res.ok) {
|
|
153
|
+
const body = await res.json().catch(() => ({}));
|
|
154
|
+
throw new Error(body.error || `Verification failed (HTTP ${res.status})`);
|
|
155
|
+
}
|
|
156
|
+
const data = (await res.json());
|
|
157
|
+
if (!data.success)
|
|
158
|
+
throw new Error("Verification failed");
|
|
159
|
+
const config = loadConfig();
|
|
160
|
+
config.token = token;
|
|
161
|
+
saveConfig(config);
|
|
162
|
+
if (json) {
|
|
163
|
+
jsonOutput({ success: true, user: data.data });
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
success(`Authenticated as ${data.data.name || data.data.email || data.data.id}`);
|
|
167
|
+
console.log(` Config saved to ${CONFIG_FILE}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// ── Commands ──────────────────────────────────────────────────────────────
|
|
171
|
+
export function registerAuthCommand(program) {
|
|
172
|
+
const auth = program.command("auth").description("Manage authentication");
|
|
173
|
+
auth
|
|
174
|
+
.command("login")
|
|
175
|
+
.description("Authenticate with LEAPERone")
|
|
176
|
+
.option("--device", "Use device flow (no localhost server needed)")
|
|
177
|
+
.action(async (opts) => {
|
|
178
|
+
const json = program.opts().json;
|
|
179
|
+
const baseUrl = getBaseUrl();
|
|
180
|
+
try {
|
|
181
|
+
let token;
|
|
182
|
+
if (opts.device) {
|
|
183
|
+
// Device flow
|
|
184
|
+
token = await deviceLogin(baseUrl);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// Browser-based login (default)
|
|
188
|
+
token = await browserLogin(baseUrl);
|
|
189
|
+
}
|
|
190
|
+
await verifyAndSaveToken(token, baseUrl, json);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
if (json) {
|
|
194
|
+
jsonOutput({ success: false, error: err.message });
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
error(`Login failed: ${err.message}`);
|
|
198
|
+
}
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
auth
|
|
203
|
+
.command("logout")
|
|
204
|
+
.description("Remove stored credentials")
|
|
205
|
+
.action(() => {
|
|
206
|
+
const json = program.opts().json;
|
|
207
|
+
clearAuth();
|
|
208
|
+
if (json) {
|
|
209
|
+
jsonOutput({ success: true });
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
success("Logged out. Credentials removed.");
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
auth
|
|
216
|
+
.command("status")
|
|
217
|
+
.description("Show current authentication status")
|
|
218
|
+
.action(async () => {
|
|
219
|
+
const json = program.opts().json;
|
|
220
|
+
const credential = getCredential();
|
|
221
|
+
if (!credential) {
|
|
222
|
+
if (json) {
|
|
223
|
+
jsonOutput({ authenticated: false });
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
console.log("Not authenticated. Run `leaperone auth login` to get started.");
|
|
227
|
+
}
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const source = process.env.LEAPERONE_API_KEY ? "api-key (env)" : "session token";
|
|
231
|
+
const baseUrl = getBaseUrl();
|
|
232
|
+
try {
|
|
233
|
+
const res = await fetch(new URL("/api/v1/cli/me", baseUrl), {
|
|
234
|
+
headers: {
|
|
235
|
+
Authorization: `Bearer ${credential}`,
|
|
236
|
+
"User-Agent": "@leaperone/cli",
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
if (!res.ok)
|
|
240
|
+
throw new Error(`HTTP ${res.status}`);
|
|
241
|
+
const data = (await res.json());
|
|
242
|
+
if (json) {
|
|
243
|
+
jsonOutput({ authenticated: true, source, user: data.data, baseUrl });
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
console.log("Authenticated:");
|
|
247
|
+
keyValue([
|
|
248
|
+
["Name", data.data.name || "-"],
|
|
249
|
+
["Email", data.data.email || "-"],
|
|
250
|
+
["Role", data.data.role],
|
|
251
|
+
["Source", source],
|
|
252
|
+
["API", baseUrl],
|
|
253
|
+
]);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
if (json) {
|
|
258
|
+
jsonOutput({ authenticated: true, source, verified: false, baseUrl });
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
console.log(`Credential configured (${source}) but could not verify.`);
|
|
262
|
+
console.log(` API: ${baseUrl}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
//# 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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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { loadConfig, setConfigValue, CONFIG_FILE } from "../lib/config.js";
|
|
2
|
+
import { jsonOutput, keyValue } from "../lib/output.js";
|
|
3
|
+
const ALLOWED_KEYS = ["baseUrl", "outputFormat"];
|
|
4
|
+
export function registerConfigCommand(program) {
|
|
5
|
+
const config = program.command("config").description("Manage CLI configuration");
|
|
6
|
+
config
|
|
7
|
+
.command("show")
|
|
8
|
+
.description("Show current configuration")
|
|
9
|
+
.action(() => {
|
|
10
|
+
const json = program.opts().json;
|
|
11
|
+
const cfg = loadConfig();
|
|
12
|
+
const envApiKey = process.env.LEAPERONE_API_KEY;
|
|
13
|
+
if (json) {
|
|
14
|
+
jsonOutput({
|
|
15
|
+
...cfg,
|
|
16
|
+
token: cfg.token ? cfg.token.slice(0, 8) + "..." : null,
|
|
17
|
+
apiKeyEnv: envApiKey ? envApiKey.slice(0, 8) + "..." : null,
|
|
18
|
+
configFile: CONFIG_FILE,
|
|
19
|
+
});
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
console.log(`Config file: ${CONFIG_FILE}`);
|
|
23
|
+
keyValue([
|
|
24
|
+
["baseUrl", cfg.baseUrl],
|
|
25
|
+
["outputFormat", cfg.outputFormat],
|
|
26
|
+
["token", cfg.token ? cfg.token.slice(0, 8) + "..." : "(not set)"],
|
|
27
|
+
["LEAPERONE_API_KEY", envApiKey ? envApiKey.slice(0, 8) + "..." : "(not set)"],
|
|
28
|
+
]);
|
|
29
|
+
});
|
|
30
|
+
config
|
|
31
|
+
.command("set")
|
|
32
|
+
.description("Set a configuration value")
|
|
33
|
+
.argument("<key>", `Configuration key (${ALLOWED_KEYS.join(", ")})`)
|
|
34
|
+
.argument("<value>", "Configuration value")
|
|
35
|
+
.action((key, value) => {
|
|
36
|
+
const json = program.opts().json;
|
|
37
|
+
if (!ALLOWED_KEYS.includes(key)) {
|
|
38
|
+
const msg = `Invalid key "${key}". Allowed: ${ALLOWED_KEYS.join(", ")}`;
|
|
39
|
+
if (json)
|
|
40
|
+
jsonOutput({ error: msg });
|
|
41
|
+
else
|
|
42
|
+
console.error(msg);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
setConfigValue(key, value);
|
|
46
|
+
if (json) {
|
|
47
|
+
jsonOutput({ success: true, key, value });
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.log(`Set ${key} = ${value}`);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { request } from "../lib/api.js";
|
|
2
|
+
import { jsonOutput, keyValue, table, error } from "../lib/output.js";
|
|
3
|
+
export function registerCreditCommand(program) {
|
|
4
|
+
const credit = program.command("credit").description("View credits and usage");
|
|
5
|
+
credit
|
|
6
|
+
.command("balance")
|
|
7
|
+
.description("Show current credit balance")
|
|
8
|
+
.action(async () => {
|
|
9
|
+
const json = program.opts().json;
|
|
10
|
+
try {
|
|
11
|
+
const data = await request("/credits/balance");
|
|
12
|
+
if (json) {
|
|
13
|
+
jsonOutput(data);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
console.log("Credit Balance:");
|
|
17
|
+
keyValue([
|
|
18
|
+
["Paid credits", `$${data.paid.toFixed(4)}`],
|
|
19
|
+
["Gift credits", `$${data.gift.toFixed(4)}`],
|
|
20
|
+
["Total", `$${data.total.toFixed(4)}`],
|
|
21
|
+
["Gift expires", data.giftExpiresAt ? new Date(data.giftExpiresAt).toLocaleDateString() : "N/A"],
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
if (json)
|
|
26
|
+
jsonOutput({ error: err.message });
|
|
27
|
+
else
|
|
28
|
+
error(err.message);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
credit
|
|
33
|
+
.command("usage")
|
|
34
|
+
.description("Show recent credit usage")
|
|
35
|
+
.option("-l, --limit <n>", "Number of records to show", "20")
|
|
36
|
+
.action(async (opts) => {
|
|
37
|
+
const json = program.opts().json;
|
|
38
|
+
try {
|
|
39
|
+
const records = await request("/credits/usage", {
|
|
40
|
+
query: { limit: opts.limit },
|
|
41
|
+
});
|
|
42
|
+
if (json) {
|
|
43
|
+
jsonOutput(records);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (records.length === 0) {
|
|
47
|
+
console.log("No usage records found.");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
table(["Time", "Endpoint", "Model", "Tokens", "Cost", "API Key"], records.map((r) => [
|
|
51
|
+
new Date(r.createdAt).toLocaleString(),
|
|
52
|
+
r.endpoint,
|
|
53
|
+
r.model || "-",
|
|
54
|
+
String(r.totalTokens),
|
|
55
|
+
`$${r.creditsUsed}`,
|
|
56
|
+
r.apiKeyName || "-",
|
|
57
|
+
]));
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (json)
|
|
61
|
+
jsonOutput({ error: err.message });
|
|
62
|
+
else
|
|
63
|
+
error(err.message);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=credit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credit.js","sourceRoot":"","sources":["../../src/commands/credit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { request } from "../lib/api.js";
|
|
2
|
+
import { jsonOutput, table, error } from "../lib/output.js";
|
|
3
|
+
export function registerDocsCommand(program) {
|
|
4
|
+
const docs = program.command("docs").description("View API documentation");
|
|
5
|
+
docs
|
|
6
|
+
.command("endpoints")
|
|
7
|
+
.description("List available API endpoints")
|
|
8
|
+
.action(async () => {
|
|
9
|
+
const json = program.opts().json;
|
|
10
|
+
try {
|
|
11
|
+
const data = await request("/docs");
|
|
12
|
+
if (json) {
|
|
13
|
+
jsonOutput(data.endpoints);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
table(["Method", "Path", "Description", "Auth"], data.endpoints.map((e) => [e.method, e.path, e.description, e.auth]));
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
if (json)
|
|
20
|
+
jsonOutput({ error: err.message });
|
|
21
|
+
else
|
|
22
|
+
error(err.message);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
docs
|
|
27
|
+
.command("models")
|
|
28
|
+
.description("List available models and pricing")
|
|
29
|
+
.action(async () => {
|
|
30
|
+
const json = program.opts().json;
|
|
31
|
+
try {
|
|
32
|
+
const data = await request("/docs");
|
|
33
|
+
if (json) {
|
|
34
|
+
jsonOutput(data.models);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
table(["Model", "Provider", "Input/1M tokens", "Output/1M tokens"], data.models.map((m) => [
|
|
38
|
+
m.id,
|
|
39
|
+
m.provider,
|
|
40
|
+
`$${m.inputPer1M}`,
|
|
41
|
+
`$${m.outputPer1M}`,
|
|
42
|
+
]));
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
if (json)
|
|
46
|
+
jsonOutput({ error: err.message });
|
|
47
|
+
else
|
|
48
|
+
error(err.message);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
docs
|
|
53
|
+
.command("quickstart")
|
|
54
|
+
.description("Show quick start guide")
|
|
55
|
+
.action(async () => {
|
|
56
|
+
const json = program.opts().json;
|
|
57
|
+
try {
|
|
58
|
+
const data = await request("/docs");
|
|
59
|
+
if (json) {
|
|
60
|
+
jsonOutput({ quickStart: data.quickStart });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
console.log(data.quickStart);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
if (json)
|
|
67
|
+
jsonOutput({ error: err.message });
|
|
68
|
+
else
|
|
69
|
+
error(err.message);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { registerAuthCommand } from "./commands/auth.js";
|
|
3
|
+
import { registerApiKeyCommand } from "./commands/apikey.js";
|
|
4
|
+
import { registerCreditCommand } from "./commands/credit.js";
|
|
5
|
+
import { registerDocsCommand } from "./commands/docs.js";
|
|
6
|
+
import { registerConfigCommand } from "./commands/config.js";
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name("leaperone")
|
|
10
|
+
.description("LEAPERone CLI - Manage API keys, credits, and access documentation")
|
|
11
|
+
.version("0.1.0")
|
|
12
|
+
.option("--json", "Output in JSON format (useful for agents and scripts)")
|
|
13
|
+
.configureHelp({
|
|
14
|
+
sortSubcommands: true,
|
|
15
|
+
});
|
|
16
|
+
registerAuthCommand(program);
|
|
17
|
+
registerApiKeyCommand(program);
|
|
18
|
+
registerCreditCommand(program);
|
|
19
|
+
registerDocsCommand(program);
|
|
20
|
+
registerConfigCommand(program);
|
|
21
|
+
program.parse();
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,uDAAuD,CAAC;KACzE,aAAa,CAAC;IACb,eAAe,EAAE,IAAI;CACtB,CAAC,CAAC;AAEL,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/lib/api.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getBaseUrl, requireCredential } from "./config.js";
|
|
2
|
+
export async function request(path, options = {}) {
|
|
3
|
+
const baseUrl = getBaseUrl();
|
|
4
|
+
const credential = requireCredential();
|
|
5
|
+
const { method = "GET", body, query } = options;
|
|
6
|
+
const url = new URL(`/api/v1/cli${path}`, baseUrl);
|
|
7
|
+
if (query) {
|
|
8
|
+
for (const [k, v] of Object.entries(query)) {
|
|
9
|
+
url.searchParams.set(k, v);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const headers = {
|
|
13
|
+
Authorization: `Bearer ${credential}`,
|
|
14
|
+
"Content-Type": "application/json",
|
|
15
|
+
"User-Agent": "@leaperone/cli",
|
|
16
|
+
};
|
|
17
|
+
const res = await fetch(url, {
|
|
18
|
+
method,
|
|
19
|
+
headers,
|
|
20
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
21
|
+
});
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
let errorMsg = `HTTP ${res.status}`;
|
|
24
|
+
try {
|
|
25
|
+
const err = (await res.json());
|
|
26
|
+
if (err.error)
|
|
27
|
+
errorMsg = err.error;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Use status text
|
|
31
|
+
}
|
|
32
|
+
throw new Error(errorMsg);
|
|
33
|
+
}
|
|
34
|
+
const json = (await res.json());
|
|
35
|
+
if (!json.success) {
|
|
36
|
+
throw new Error(json.error || "Unknown error");
|
|
37
|
+
}
|
|
38
|
+
return json.data;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG5D,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAY,EACZ,UAII,EAAE;IAEN,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEhD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,UAAU,EAAE;QACrC,cAAc,EAAE,kBAAkB;QAClC,YAAY,EAAE,gBAAgB;KAC/B,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,QAAQ,GAAG,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;YACrD,IAAI,GAAG,CAAC,KAAK;gBAAE,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmB,CAAC;IAClD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC,IAAS,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CLIConfig } from "../types.js";
|
|
2
|
+
declare const CONFIG_DIR: string;
|
|
3
|
+
declare const CONFIG_FILE: string;
|
|
4
|
+
export declare function loadConfig(): CLIConfig;
|
|
5
|
+
export declare function saveConfig(config: CLIConfig): void;
|
|
6
|
+
export declare function setConfigValue(key: string, value: string): void;
|
|
7
|
+
export declare function clearAuth(): void;
|
|
8
|
+
/**
|
|
9
|
+
* Returns the credential to use for CLI requests.
|
|
10
|
+
* Priority: LEAPERONE_API_KEY env var (API Key) > config token (session token).
|
|
11
|
+
*/
|
|
12
|
+
export declare function getCredential(): string | undefined;
|
|
13
|
+
export declare function requireCredential(): string;
|
|
14
|
+
export declare function getBaseUrl(): string;
|
|
15
|
+
export { CONFIG_DIR, CONFIG_FILE };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const CONFIG_DIR = path.join(os.homedir(), ".leaperone");
|
|
5
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
|
|
6
|
+
const DEFAULT_CONFIG = {
|
|
7
|
+
baseUrl: "https://leaperone.com",
|
|
8
|
+
outputFormat: "text",
|
|
9
|
+
};
|
|
10
|
+
function ensureConfigDir() {
|
|
11
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
12
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function loadConfig() {
|
|
16
|
+
try {
|
|
17
|
+
if (fs.existsSync(CONFIG_FILE)) {
|
|
18
|
+
const raw = fs.readFileSync(CONFIG_FILE, "utf-8");
|
|
19
|
+
return { ...DEFAULT_CONFIG, ...JSON.parse(raw) };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Ignore parse errors, return default
|
|
24
|
+
}
|
|
25
|
+
return { ...DEFAULT_CONFIG };
|
|
26
|
+
}
|
|
27
|
+
export function saveConfig(config) {
|
|
28
|
+
ensureConfigDir();
|
|
29
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), {
|
|
30
|
+
mode: 0o600,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export function setConfigValue(key, value) {
|
|
34
|
+
const config = loadConfig();
|
|
35
|
+
const mutable = { ...config };
|
|
36
|
+
mutable[key] = value;
|
|
37
|
+
saveConfig(mutable);
|
|
38
|
+
}
|
|
39
|
+
export function clearAuth() {
|
|
40
|
+
const config = loadConfig();
|
|
41
|
+
delete config.token;
|
|
42
|
+
saveConfig(config);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns the credential to use for CLI requests.
|
|
46
|
+
* Priority: LEAPERONE_API_KEY env var (API Key) > config token (session token).
|
|
47
|
+
*/
|
|
48
|
+
export function getCredential() {
|
|
49
|
+
return process.env.LEAPERONE_API_KEY || loadConfig().token;
|
|
50
|
+
}
|
|
51
|
+
export function requireCredential() {
|
|
52
|
+
const cred = getCredential();
|
|
53
|
+
if (!cred) {
|
|
54
|
+
console.error("Error: Not authenticated. Run `leaperone auth login` first, or set LEAPERONE_API_KEY.");
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
return cred;
|
|
58
|
+
}
|
|
59
|
+
export function getBaseUrl() {
|
|
60
|
+
return process.env.LEAPERONE_BASE_URL || loadConfig().baseUrl;
|
|
61
|
+
}
|
|
62
|
+
export { CONFIG_DIR, CONFIG_FILE };
|
|
63
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,cAAc,GAAc;IAChC,OAAO,EAAE,uBAAuB;IAChC,YAAY,EAAE,MAAM;CACrB,CAAC;AAEF,SAAS,eAAe;IACtB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IACD,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,eAAe,EAAE,CAAC;IAClB,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC7D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,KAAa;IACvD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,OAAO,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACrB,UAAU,CAAC,OAA+B,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,KAAK,CAAC;IACpB,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CACX,uFAAuF,CACxF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,UAAU,EAAE,CAAC,OAAO,CAAC;AAChE,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function jsonOutput(data: unknown): void;
|
|
2
|
+
export declare function table(headers: string[], rows: string[][]): void;
|
|
3
|
+
export declare function keyValue(pairs: [string, string][]): void;
|
|
4
|
+
export declare function success(msg: string): void;
|
|
5
|
+
export declare function error(msg: string): void;
|
|
6
|
+
export declare function warn(msg: string): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export function jsonOutput(data) {
|
|
2
|
+
console.log(JSON.stringify(data, null, 2));
|
|
3
|
+
}
|
|
4
|
+
export function table(headers, rows) {
|
|
5
|
+
const colWidths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] || "").length)));
|
|
6
|
+
const separator = colWidths.map((w) => "-".repeat(w + 2)).join("+");
|
|
7
|
+
const formatRow = (row) => row.map((cell, i) => ` ${(cell || "").padEnd(colWidths[i])} `).join("|");
|
|
8
|
+
console.log(formatRow(headers));
|
|
9
|
+
console.log(separator);
|
|
10
|
+
for (const row of rows) {
|
|
11
|
+
console.log(formatRow(row));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function keyValue(pairs) {
|
|
15
|
+
const maxKeyLen = Math.max(...pairs.map(([k]) => k.length));
|
|
16
|
+
for (const [key, value] of pairs) {
|
|
17
|
+
console.log(` ${key.padEnd(maxKeyLen)} ${value}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function success(msg) {
|
|
21
|
+
console.log(`\u2713 ${msg}`);
|
|
22
|
+
}
|
|
23
|
+
export function error(msg) {
|
|
24
|
+
console.error(`\u2717 ${msg}`);
|
|
25
|
+
}
|
|
26
|
+
export function warn(msg) {
|
|
27
|
+
console.warn(`! ${msg}`);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,OAAiB,EACjB,IAAgB;IAEhB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAC5D,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,CAAC,GAAa,EAAE,EAAE,CAClC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE3E,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAyB;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface CLIConfig {
|
|
2
|
+
token?: string;
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
outputFormat: "text" | "json";
|
|
5
|
+
}
|
|
6
|
+
export interface ApiKeyInfo {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
keyPreview: string;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
lastUsedAt: string | null;
|
|
12
|
+
revokedAt: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface ApiKeyCreateResult {
|
|
15
|
+
key: string;
|
|
16
|
+
name: string;
|
|
17
|
+
}
|
|
18
|
+
export interface CreditSummary {
|
|
19
|
+
paid: number;
|
|
20
|
+
gift: number;
|
|
21
|
+
total: number;
|
|
22
|
+
giftExpiresAt: string | null;
|
|
23
|
+
}
|
|
24
|
+
export interface CreditUsageRecord {
|
|
25
|
+
id: string;
|
|
26
|
+
endpoint: string;
|
|
27
|
+
model: string | null;
|
|
28
|
+
inputTokens: number;
|
|
29
|
+
outputTokens: number;
|
|
30
|
+
totalTokens: number;
|
|
31
|
+
creditsUsed: string;
|
|
32
|
+
apiKeyName: string | null;
|
|
33
|
+
createdAt: string;
|
|
34
|
+
}
|
|
35
|
+
export interface UserInfo {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string | null;
|
|
38
|
+
email: string | null;
|
|
39
|
+
username: string | null;
|
|
40
|
+
role: string;
|
|
41
|
+
createdAt: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ApiResponse<T> {
|
|
44
|
+
success: boolean;
|
|
45
|
+
data?: T;
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@leaperone/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "LEAPERone CLI - Manage API keys, credits, and access documentation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"leaperone": "./bin/leaperone.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "tsc --watch"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"bin"
|
|
16
|
+
],
|
|
17
|
+
"keywords": ["leaperone", "cli", "api", "ai"],
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"commander": "^13.1.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^22.0.0",
|
|
24
|
+
"typescript": "^5.7.0"
|
|
25
|
+
}
|
|
26
|
+
}
|