@octonodes/cli 0.0.3
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/README.md +29 -0
- package/dist/auth.d.ts +13 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +326 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/package.json +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# @octonodes/cli
|
|
2
|
+
|
|
3
|
+
Thin command-line wrapper over `@octonodes/sdk`.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
npx @octonodes/cli login
|
|
7
|
+
|
|
8
|
+
npx @octonodes/cli operations
|
|
9
|
+
npx @octonodes/cli projects.api.get --input '{"query":{"workspace":"acme"}}'
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The installed command is `octonodes`. `login` opens GitHub authentication in your browser,
|
|
13
|
+
receives the result on a temporary loopback callback, then stores the refreshable Supabase
|
|
14
|
+
session in `~/.octonode/session.json` with user-only permissions. The CLI refreshes expired
|
|
15
|
+
access tokens automatically. If the browser does not open, visit the URL printed by the CLI.
|
|
16
|
+
|
|
17
|
+
Use `octonodes login --email you@example.com` for terminal email-code login instead. The
|
|
18
|
+
Supabase redirect allow list must contain `http://127.0.0.1:*/auth/callback/**` for browser
|
|
19
|
+
login.
|
|
20
|
+
|
|
21
|
+
Use `octonodes login --token <api-token>` for a personal, service, public, or agent token.
|
|
22
|
+
For automation, set `OCTONODE_TOKEN`; it takes precedence over every saved login.
|
|
23
|
+
|
|
24
|
+
Run `octonodes logout` to revoke the CLI's Supabase refresh session and remove saved
|
|
25
|
+
credentials. Static API tokens must still be revoked in Studio, and logout cannot unset
|
|
26
|
+
`OCTONODE_TOKEN` in your shell.
|
|
27
|
+
|
|
28
|
+
Run `octonodes operations [filter]` to list every available SDK operation. Use
|
|
29
|
+
`octonodes --help` or `octonodes <command> --help` for command help.
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface LoginOptions {
|
|
2
|
+
token?: string;
|
|
3
|
+
email?: string;
|
|
4
|
+
code?: string;
|
|
5
|
+
openBrowser?: (url: string) => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function login(apiUrl: string, options?: LoginOptions): Promise<string>;
|
|
8
|
+
export declare function accessToken(): Promise<string | undefined>;
|
|
9
|
+
export declare function logout(): Promise<{
|
|
10
|
+
removed: boolean;
|
|
11
|
+
warning?: string;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AA2OD,wBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCvF;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAwB/D;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB9E"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.login = login;
|
|
4
|
+
exports.accessToken = accessToken;
|
|
5
|
+
exports.logout = logout;
|
|
6
|
+
const node_child_process_1 = require("node:child_process");
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_http_1 = require("node:http");
|
|
10
|
+
const node_os_1 = require("node:os");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const promises_1 = require("node:readline/promises");
|
|
13
|
+
const supabase_js_1 = require("@supabase/supabase-js");
|
|
14
|
+
function configPath(name) {
|
|
15
|
+
return (0, node_path_1.join)(process.env.OCTONODE_CONFIG_DIR ?? (0, node_path_1.join)((0, node_os_1.homedir)(), ".octonode"), name);
|
|
16
|
+
}
|
|
17
|
+
function readFile(name) {
|
|
18
|
+
try {
|
|
19
|
+
return (0, node_fs_1.readFileSync)(configPath(name), "utf8").trim() || undefined;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error.code === "ENOENT")
|
|
23
|
+
return undefined;
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function writePrivateFile(name, value) {
|
|
28
|
+
const path = configPath(name);
|
|
29
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true, mode: 0o700 });
|
|
30
|
+
(0, node_fs_1.chmodSync)((0, node_path_1.dirname)(path), 0o700);
|
|
31
|
+
(0, node_fs_1.writeFileSync)(path, value, { encoding: "utf8", mode: 0o600 });
|
|
32
|
+
(0, node_fs_1.chmodSync)(path, 0o600);
|
|
33
|
+
}
|
|
34
|
+
function removeFile(name) {
|
|
35
|
+
try {
|
|
36
|
+
(0, node_fs_1.unlinkSync)(configPath(name));
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error.code === "ENOENT")
|
|
41
|
+
return false;
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function readSession() {
|
|
46
|
+
const value = readFile("session.json");
|
|
47
|
+
if (!value)
|
|
48
|
+
return undefined;
|
|
49
|
+
try {
|
|
50
|
+
const session = JSON.parse(value);
|
|
51
|
+
if (typeof session.supabaseUrl !== "string" ||
|
|
52
|
+
typeof session.supabasePublishableKey !== "string" ||
|
|
53
|
+
typeof session.accessToken !== "string" ||
|
|
54
|
+
typeof session.refreshToken !== "string") {
|
|
55
|
+
throw new Error("missing session fields");
|
|
56
|
+
}
|
|
57
|
+
return session;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new Error("saved login is invalid; run \"octonodes login\" again");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function saveSession(config, session) {
|
|
64
|
+
writePrivateFile("session.json", `${JSON.stringify({
|
|
65
|
+
supabaseUrl: config.supabaseUrl,
|
|
66
|
+
supabasePublishableKey: config.supabasePublishableKey,
|
|
67
|
+
accessToken: session.access_token,
|
|
68
|
+
refreshToken: session.refresh_token,
|
|
69
|
+
})}\n`);
|
|
70
|
+
}
|
|
71
|
+
function authClient(config, flowType = "implicit") {
|
|
72
|
+
return (0, supabase_js_1.createClient)(config.supabaseUrl, config.supabasePublishableKey, {
|
|
73
|
+
auth: { autoRefreshToken: false, persistSession: false, detectSessionInUrl: false, flowType },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function fetchAuthConfig(apiUrl) {
|
|
77
|
+
const response = await fetch(new URL("/api/auth/config", apiUrl), { headers: { accept: "application/json" } });
|
|
78
|
+
if (!response.ok)
|
|
79
|
+
throw new Error(`could not load login configuration (HTTP ${response.status})`);
|
|
80
|
+
const config = (await response.json());
|
|
81
|
+
if (typeof config.supabaseUrl !== "string" || typeof config.supabasePublishableKey !== "string") {
|
|
82
|
+
throw new Error("Octonode returned an invalid login configuration");
|
|
83
|
+
}
|
|
84
|
+
return config;
|
|
85
|
+
}
|
|
86
|
+
async function promptLine(message) {
|
|
87
|
+
const reader = (0, promises_1.createInterface)({ input: process.stdin, output: process.stdout });
|
|
88
|
+
try {
|
|
89
|
+
return (await reader.question(message)).trim();
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
reader.close();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function promptSecret(message) {
|
|
96
|
+
if (!process.stdin.isTTY || !process.stdin.setRawMode)
|
|
97
|
+
throw new Error("verification code is required on stdin");
|
|
98
|
+
process.stdout.write(message);
|
|
99
|
+
process.stdin.setEncoding("utf8");
|
|
100
|
+
process.stdin.setRawMode(true);
|
|
101
|
+
process.stdin.resume();
|
|
102
|
+
return new Promise((resolve, reject) => {
|
|
103
|
+
let value = "";
|
|
104
|
+
const finish = (error) => {
|
|
105
|
+
process.stdin.setRawMode(false);
|
|
106
|
+
process.stdin.pause();
|
|
107
|
+
process.stdin.off("data", onData);
|
|
108
|
+
process.stdout.write("\n");
|
|
109
|
+
if (error)
|
|
110
|
+
reject(error);
|
|
111
|
+
else
|
|
112
|
+
resolve(value.trim());
|
|
113
|
+
};
|
|
114
|
+
const onData = (chunk) => {
|
|
115
|
+
for (const character of chunk) {
|
|
116
|
+
if (character === "\r" || character === "\n")
|
|
117
|
+
return finish();
|
|
118
|
+
if (character === "\u0003")
|
|
119
|
+
return finish(new Error("login cancelled"));
|
|
120
|
+
if (character === "\u007f" || character === "\b") {
|
|
121
|
+
if (value) {
|
|
122
|
+
value = value.slice(0, -1);
|
|
123
|
+
process.stdout.write("\b \b");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (character >= " ") {
|
|
127
|
+
value += character;
|
|
128
|
+
process.stdout.write("*");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
process.stdin.on("data", onData);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async function openBrowser(url) {
|
|
136
|
+
const [command, args] = process.platform === "darwin"
|
|
137
|
+
? ["open", [url]]
|
|
138
|
+
: process.platform === "win32"
|
|
139
|
+
? ["explorer.exe", [url]]
|
|
140
|
+
: ["xdg-open", [url]];
|
|
141
|
+
await new Promise((resolve, reject) => {
|
|
142
|
+
const child = (0, node_child_process_1.spawn)(command, args, { detached: true, stdio: "ignore" });
|
|
143
|
+
child.once("error", reject);
|
|
144
|
+
child.once("spawn", () => {
|
|
145
|
+
child.unref();
|
|
146
|
+
resolve();
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
async function oauthCallback() {
|
|
151
|
+
const path = `/auth/callback/${(0, node_crypto_1.randomBytes)(18).toString("base64url")}`;
|
|
152
|
+
let resolveCode;
|
|
153
|
+
let rejectCode;
|
|
154
|
+
let finished = false;
|
|
155
|
+
const code = new Promise((resolve, reject) => {
|
|
156
|
+
resolveCode = resolve;
|
|
157
|
+
rejectCode = reject;
|
|
158
|
+
});
|
|
159
|
+
const server = (0, node_http_1.createServer)((request, response) => {
|
|
160
|
+
const requestUrl = new URL(request.url ?? "/", "http://127.0.0.1");
|
|
161
|
+
if (request.method !== "GET" || requestUrl.pathname !== path) {
|
|
162
|
+
response.writeHead(404).end("Not found");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const authCode = requestUrl.searchParams.get("code");
|
|
166
|
+
const authError = requestUrl.searchParams.get("error_description") ?? requestUrl.searchParams.get("error");
|
|
167
|
+
response.writeHead(authCode ? 200 : 400, {
|
|
168
|
+
"cache-control": "no-store",
|
|
169
|
+
"content-security-policy": "default-src 'none'",
|
|
170
|
+
"content-type": "text/html; charset=utf-8",
|
|
171
|
+
});
|
|
172
|
+
response.end(authCode
|
|
173
|
+
? "<!doctype html><title>Octonode login complete</title><h1>Login complete</h1><p>You can close this window.</p>"
|
|
174
|
+
: "<!doctype html><title>Octonode login failed</title><h1>Login failed</h1><p>Return to the terminal for details.</p>");
|
|
175
|
+
finish(authCode ?? undefined, new Error(authError ?? "GitHub login did not return an authorization code"));
|
|
176
|
+
});
|
|
177
|
+
const timer = setTimeout(() => finish(undefined, new Error("browser login timed out")), 5 * 60_000);
|
|
178
|
+
const finish = (value, error) => {
|
|
179
|
+
if (finished)
|
|
180
|
+
return;
|
|
181
|
+
finished = true;
|
|
182
|
+
clearTimeout(timer);
|
|
183
|
+
server.close();
|
|
184
|
+
if (value)
|
|
185
|
+
resolveCode(value);
|
|
186
|
+
else
|
|
187
|
+
rejectCode(error ?? new Error("browser login cancelled"));
|
|
188
|
+
};
|
|
189
|
+
try {
|
|
190
|
+
await new Promise((resolve, reject) => {
|
|
191
|
+
const onError = (error) => reject(error);
|
|
192
|
+
server.once("error", onError);
|
|
193
|
+
server.listen(0, "127.0.0.1", () => {
|
|
194
|
+
server.off("error", onError);
|
|
195
|
+
resolve();
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
finished = true;
|
|
201
|
+
clearTimeout(timer);
|
|
202
|
+
server.close();
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
server.once("error", (error) => finish(undefined, error));
|
|
206
|
+
const address = server.address();
|
|
207
|
+
return {
|
|
208
|
+
url: `http://127.0.0.1:${address.port}${path}`,
|
|
209
|
+
code,
|
|
210
|
+
close: () => {
|
|
211
|
+
if (!finished) {
|
|
212
|
+
finished = true;
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
server.close();
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
async function browserLogin(config, launch) {
|
|
220
|
+
const callback = await oauthCallback();
|
|
221
|
+
try {
|
|
222
|
+
const supabase = authClient(config, "pkce");
|
|
223
|
+
const started = await supabase.auth.signInWithOAuth({
|
|
224
|
+
provider: "github",
|
|
225
|
+
options: { redirectTo: callback.url, skipBrowserRedirect: true },
|
|
226
|
+
});
|
|
227
|
+
if (started.error)
|
|
228
|
+
throw new Error(started.error.message);
|
|
229
|
+
if (!started.data.url)
|
|
230
|
+
throw new Error("Supabase did not return a GitHub login URL");
|
|
231
|
+
process.stdout.write(`Opening GitHub login in your browser.\nIf it does not open, visit:\n${started.data.url}\n`);
|
|
232
|
+
void launch(started.data.url).catch((error) => {
|
|
233
|
+
process.stderr.write(`Could not open a browser: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
234
|
+
});
|
|
235
|
+
const exchanged = await supabase.auth.exchangeCodeForSession(await callback.code);
|
|
236
|
+
if (exchanged.error)
|
|
237
|
+
throw new Error(exchanged.error.message);
|
|
238
|
+
if (!exchanged.data.session)
|
|
239
|
+
throw new Error("Supabase did not return a session");
|
|
240
|
+
saveSession(config, exchanged.data.session);
|
|
241
|
+
removeFile("access-token");
|
|
242
|
+
return `Finished octonodes login as ${exchanged.data.user?.email ?? "a Studio user"}.`;
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
callback.close();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async function login(apiUrl, options = {}) {
|
|
249
|
+
const token = options.token?.trim();
|
|
250
|
+
if (token) {
|
|
251
|
+
writePrivateFile("access-token", `${token}\n`);
|
|
252
|
+
removeFile("session.json");
|
|
253
|
+
return "Finished octonodes login with an API token.";
|
|
254
|
+
}
|
|
255
|
+
const config = await fetchAuthConfig(apiUrl);
|
|
256
|
+
if (!options.email)
|
|
257
|
+
return browserLogin(config, options.openBrowser ?? openBrowser);
|
|
258
|
+
const piped = process.stdin.isTTY || options.code ? [] : (0, node_fs_1.readFileSync)(0, "utf8").split(/\r?\n/);
|
|
259
|
+
const email = options.email.trim() || piped.shift()?.trim() || (process.stdin.isTTY ? await promptLine("Email: ") : "");
|
|
260
|
+
if (!email)
|
|
261
|
+
throw new Error("email is required");
|
|
262
|
+
const supabase = authClient(config);
|
|
263
|
+
const sent = await supabase.auth.signInWithOtp({ email, options: { shouldCreateUser: true } });
|
|
264
|
+
if (sent.error)
|
|
265
|
+
throw new Error(sent.error.message);
|
|
266
|
+
process.stdout.write(`Verification code sent to ${email}.\n`);
|
|
267
|
+
const code = options.code?.trim() ||
|
|
268
|
+
piped.shift()?.trim() ||
|
|
269
|
+
(process.stdin.isTTY ? await promptSecret("Verification code: ") : "");
|
|
270
|
+
if (!code)
|
|
271
|
+
throw new Error("verification code is required");
|
|
272
|
+
const verified = await supabase.auth.verifyOtp({ email, token: code, type: "email" });
|
|
273
|
+
if (verified.error)
|
|
274
|
+
throw new Error(verified.error.message);
|
|
275
|
+
if (!verified.data.session)
|
|
276
|
+
throw new Error("Supabase did not return a session");
|
|
277
|
+
saveSession(config, verified.data.session);
|
|
278
|
+
removeFile("access-token");
|
|
279
|
+
return `Finished octonodes login as ${verified.data.user?.email ?? email}.`;
|
|
280
|
+
}
|
|
281
|
+
async function accessToken() {
|
|
282
|
+
const environmentToken = process.env.OCTONODE_TOKEN?.trim();
|
|
283
|
+
if (environmentToken)
|
|
284
|
+
return environmentToken;
|
|
285
|
+
const apiToken = readFile("access-token");
|
|
286
|
+
if (apiToken)
|
|
287
|
+
return apiToken;
|
|
288
|
+
const stored = readSession();
|
|
289
|
+
if (!stored)
|
|
290
|
+
return undefined;
|
|
291
|
+
const supabase = authClient(stored);
|
|
292
|
+
const result = await supabase.auth.setSession({
|
|
293
|
+
access_token: stored.accessToken,
|
|
294
|
+
refresh_token: stored.refreshToken,
|
|
295
|
+
});
|
|
296
|
+
if (result.error || !result.data.session) {
|
|
297
|
+
throw new Error(`saved login expired${result.error ? `: ${result.error.message}` : ""}; run "octonodes login" again`);
|
|
298
|
+
}
|
|
299
|
+
if (result.data.session.access_token !== stored.accessToken ||
|
|
300
|
+
result.data.session.refresh_token !== stored.refreshToken) {
|
|
301
|
+
saveSession(stored, result.data.session);
|
|
302
|
+
}
|
|
303
|
+
return result.data.session.access_token;
|
|
304
|
+
}
|
|
305
|
+
async function logout() {
|
|
306
|
+
const stored = readSession();
|
|
307
|
+
let warning;
|
|
308
|
+
if (stored) {
|
|
309
|
+
const supabase = authClient(stored);
|
|
310
|
+
const restored = await supabase.auth.setSession({
|
|
311
|
+
access_token: stored.accessToken,
|
|
312
|
+
refresh_token: stored.refreshToken,
|
|
313
|
+
});
|
|
314
|
+
if (restored.error)
|
|
315
|
+
warning = `Supabase session could not be revoked: ${restored.error.message}`;
|
|
316
|
+
else {
|
|
317
|
+
const signedOut = await supabase.auth.signOut({ scope: "local" });
|
|
318
|
+
if (signedOut.error)
|
|
319
|
+
warning = `Supabase session could not be revoked: ${signedOut.error.message}`;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const removedSession = removeFile("session.json");
|
|
323
|
+
const removedToken = removeFile("access-token");
|
|
324
|
+
return { removed: removedSession || removedToken, ...(warning ? { warning } : {}) };
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const sdk_1 = require("@octonodes/sdk");
|
|
5
|
+
const auth_1 = require("./auth");
|
|
6
|
+
const VERSION = require("../package.json").version;
|
|
7
|
+
const argv = process.argv.slice(2);
|
|
8
|
+
const command = argv[0];
|
|
9
|
+
const helpRequested = argv.some((value) => value === "-h" || value === "--h" || value === "--help");
|
|
10
|
+
function listOperations(target, path = []) {
|
|
11
|
+
const operations = [];
|
|
12
|
+
for (let prototype = Object.getPrototypeOf(target); prototype && prototype !== Object.prototype; prototype = Object.getPrototypeOf(prototype)) {
|
|
13
|
+
for (const name of Object.getOwnPropertyNames(prototype)) {
|
|
14
|
+
if (name === "constructor")
|
|
15
|
+
continue;
|
|
16
|
+
const descriptor = Object.getOwnPropertyDescriptor(prototype, name);
|
|
17
|
+
if (descriptor?.get)
|
|
18
|
+
operations.push(...listOperations(descriptor.get.call(target), [...path, name]));
|
|
19
|
+
else if (typeof descriptor?.value === "function" && /^(delete|get|head|options|patch|post|put|trace)$/.test(name)) {
|
|
20
|
+
operations.push([...path, name].join("."));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return operations;
|
|
25
|
+
}
|
|
26
|
+
function resolveOperation(target, path) {
|
|
27
|
+
const segments = path.split(".");
|
|
28
|
+
let owner = target;
|
|
29
|
+
for (const segment of segments.slice(0, -1)) {
|
|
30
|
+
const next = owner[segment];
|
|
31
|
+
if (!next || typeof next !== "object")
|
|
32
|
+
return undefined;
|
|
33
|
+
owner = next;
|
|
34
|
+
}
|
|
35
|
+
const operation = owner[segments.at(-1)];
|
|
36
|
+
return typeof operation === "function" ? operation.bind(owner) : undefined;
|
|
37
|
+
}
|
|
38
|
+
function isEventStream(value) {
|
|
39
|
+
if (!value || typeof value !== "object")
|
|
40
|
+
return false;
|
|
41
|
+
const stream = value.stream;
|
|
42
|
+
return !!stream && typeof stream === "object" && Symbol.asyncIterator in stream;
|
|
43
|
+
}
|
|
44
|
+
const operations = listOperations(new sdk_1.OctonodeClient("unused")).sort();
|
|
45
|
+
function flag(name) {
|
|
46
|
+
const index = argv.indexOf(name);
|
|
47
|
+
if (index < 0)
|
|
48
|
+
return undefined;
|
|
49
|
+
const value = argv[index + 1];
|
|
50
|
+
if (!value || value.startsWith("--"))
|
|
51
|
+
throw new Error(`${name} requires a value`);
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function usage(topic) {
|
|
55
|
+
if (topic === "login") {
|
|
56
|
+
process.stdout.write(`Usage:\n octonodes login [--base-url <url>]\n octonodes login --email <email> [--base-url <url>]\n octonodes login --token <api-token>\n\nOpens GitHub login in your browser and signs in as the same user as Octonode Studio. Use --email for terminal email-code login, or --token for a personal, service, public, or agent API token.\n`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (topic === "operations") {
|
|
60
|
+
process.stdout.write("Usage:\n octonodes operations [filter]\n");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (topic === "logout") {
|
|
64
|
+
process.stdout.write("Usage:\n octonodes logout\n\nRemoves the locally saved access token.\n");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (topic && operations.includes(topic)) {
|
|
68
|
+
process.stdout.write(`Usage:\n octonodes ${topic} [--input <json>] [--base-url <url>]\n`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
process.stdout.write(`octonodes v${VERSION}\n\nUsage:\n octonodes login [--base-url <url>]\n octonodes login --email <email> [--base-url <url>]\n octonodes login --token <api-token>\n octonodes logout\n octonodes operations [filter]\n octonodes <operation> [--input <json>] [--base-url <url>]\n\nFlags:\n -h, --h, --help Show help\n -v, --version Show version\n\nEnvironment:\n OCTONODE_TOKEN Overrides the saved login\n OCTONODE_URL Overrides ${sdk_1.OCTONODE_API_URL}\n OCTONODE_CONFIG_DIR Overrides ~/.octonode\n`);
|
|
72
|
+
}
|
|
73
|
+
async function main() {
|
|
74
|
+
if (!command)
|
|
75
|
+
return usage();
|
|
76
|
+
if (command === "--version" || command === "-v") {
|
|
77
|
+
process.stdout.write(`${VERSION}\n`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (helpRequested)
|
|
81
|
+
return usage(command.startsWith("-") ? undefined : command);
|
|
82
|
+
if (command === "login") {
|
|
83
|
+
const baseUrl = flag("--base-url") ?? process.env.OCTONODE_URL ?? sdk_1.OCTONODE_API_URL;
|
|
84
|
+
process.stdout.write(`${await (0, auth_1.login)(baseUrl, { token: flag("--token"), email: flag("--email") })}\n`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (command === "logout") {
|
|
88
|
+
const result = await (0, auth_1.logout)();
|
|
89
|
+
process.stdout.write(result.removed ? "Logged out.\n" : "No saved login found.\n");
|
|
90
|
+
if (result.warning)
|
|
91
|
+
process.stderr.write(`${result.warning}\n`);
|
|
92
|
+
if (process.env.OCTONODE_TOKEN) {
|
|
93
|
+
process.stdout.write("OCTONODE_TOKEN is still set and will continue to authenticate commands.\n");
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (command === "operations") {
|
|
98
|
+
const filter = argv[1]?.toLowerCase();
|
|
99
|
+
process.stdout.write(operations
|
|
100
|
+
.filter((name) => !filter || name.toLowerCase().includes(filter))
|
|
101
|
+
.join("\n") + "\n");
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!operations.includes(command))
|
|
105
|
+
throw new Error(`unknown operation "${command}"; run "octonodes operations"`);
|
|
106
|
+
const baseUrl = flag("--base-url") ?? process.env.OCTONODE_URL;
|
|
107
|
+
const token = await (0, auth_1.accessToken)();
|
|
108
|
+
if (!token)
|
|
109
|
+
throw new Error("run \"octonodes login\" or set OCTONODE_TOKEN");
|
|
110
|
+
const operation = resolveOperation((0, sdk_1.createClient)(token, { url: baseUrl }), command);
|
|
111
|
+
const input = JSON.parse(flag("--input") ?? "{}");
|
|
112
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
113
|
+
throw new Error("--input must be a JSON object");
|
|
114
|
+
const result = await operation(input);
|
|
115
|
+
if (isEventStream(result)) {
|
|
116
|
+
for await (const event of result.stream)
|
|
117
|
+
process.stdout.write(`${JSON.stringify(event)}\n`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
main().catch((error) => {
|
|
124
|
+
process.stderr.write(`octonodes: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
125
|
+
process.exitCode = 1;
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@octonodes/cli",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "Thin CLI wrapper for the Octonode cloud SDK.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"octonodes": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@octonodes/sdk": "0.0.3",
|
|
16
|
+
"@supabase/supabase-js": "2.107.0"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"prepack": "tsc -b"
|
|
20
|
+
}
|
|
21
|
+
}
|