@botiverse/hands-cli 0.4.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/README.md +71 -0
- package/dist/commands/apps.d.ts +7 -0
- package/dist/commands/apps.js +71 -0
- package/dist/commands/apps.js.map +1 -0
- package/dist/commands/builds.d.ts +14 -0
- package/dist/commands/builds.js +611 -0
- package/dist/commands/builds.js.map +1 -0
- package/dist/commands/deploy_tokens.d.ts +12 -0
- package/dist/commands/deploy_tokens.js +98 -0
- package/dist/commands/deploy_tokens.js.map +1 -0
- package/dist/commands/feedback.d.ts +7 -0
- package/dist/commands/feedback.js +141 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/login.d.ts +22 -0
- package/dist/commands/login.js +129 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/releases.d.ts +5 -0
- package/dist/commands/releases.js +200 -0
- package/dist/commands/releases.js.map +1 -0
- package/dist/commands/whoami.d.ts +5 -0
- package/dist/commands/whoami.js +43 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +25 -0
- package/dist/lib/api.js +126 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +22 -0
- package/dist/lib/config.js +71 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/env.d.ts +7 -0
- package/dist/lib/env.js +10 -0
- package/dist/lib/env.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releases.js","sourceRoot":"","sources":["../../src/commands/releases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `quiver whoami` — print the current authenticated account.
|
|
3
|
+
*/
|
|
4
|
+
import { apiRequest, QuiverApiError, getApiBase } from "../lib/api.js";
|
|
5
|
+
import { resolveSessionCookie } from "../lib/config.js";
|
|
6
|
+
export function registerWhoamiCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("whoami")
|
|
9
|
+
.description("Print the currently authenticated account + roles.")
|
|
10
|
+
.option("--json", "Output machine-readable JSON.", false)
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
if (!resolveSessionCookie()) {
|
|
13
|
+
console.error("Not logged in. Run `quiver login` first.");
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const me = await apiRequest("/api/auth/me");
|
|
18
|
+
if (!me.account) {
|
|
19
|
+
console.error("Server returned no account info.");
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
if (opts.json) {
|
|
23
|
+
console.log(JSON.stringify(me, null, 2));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const a = me.account;
|
|
27
|
+
console.log(`${a.display_name} (${a.principal_type})`);
|
|
28
|
+
console.log(` server: ${a.server_slug ?? a.server_id}`);
|
|
29
|
+
console.log(` username: @${a.username ?? "(none)"}`);
|
|
30
|
+
console.log(` org_id: ${a.org_id ?? "(none)"}`);
|
|
31
|
+
console.log(` org_role: ${a.org_role ?? "(none)"}`);
|
|
32
|
+
console.log(` api: ${getApiBase()}`);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
if (e instanceof QuiverApiError && e.status === 401) {
|
|
36
|
+
console.error("Not authenticated. Run `quiver login` to refresh.");
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
throw e;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAmBxD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,+BAA+B,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,UAAU,CAAa,cAAc,CAAC,CAAC;YACxD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzC,OAAO;YACT,CAAC;YACD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACpD,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* quiver CLI — entry point.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands are registered via the registry module. This file only
|
|
6
|
+
* handles top-level commander setup + global flags (--api, --json, --verbose).
|
|
7
|
+
*
|
|
8
|
+
* Auth model: the CLI doesn't store long-lived tokens. It uses the same
|
|
9
|
+
* browser-cookie session as the admin SPA. Two ways to "log in":
|
|
10
|
+
* - `quiver login` — prints a URL to visit in any browser; the user
|
|
11
|
+
* completes Raft OAuth there, the Worker sets the quiver_session
|
|
12
|
+
* cookie, the user copies the cookie value back into the CLI.
|
|
13
|
+
* - `quiver login --token <cookie>` — paste an existing session cookie.
|
|
14
|
+
*
|
|
15
|
+
* For CI: `quiver login --token "$QUIVER_SESSION_COOKIE"`.
|
|
16
|
+
*
|
|
17
|
+
* Token storage: ~/.config/quiver/auth.json (or $XDG_CONFIG_HOME/quiver/auth.json).
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* quiver CLI — entry point.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands are registered via the registry module. This file only
|
|
6
|
+
* handles top-level commander setup + global flags (--api, --json, --verbose).
|
|
7
|
+
*
|
|
8
|
+
* Auth model: the CLI doesn't store long-lived tokens. It uses the same
|
|
9
|
+
* browser-cookie session as the admin SPA. Two ways to "log in":
|
|
10
|
+
* - `quiver login` — prints a URL to visit in any browser; the user
|
|
11
|
+
* completes Raft OAuth there, the Worker sets the quiver_session
|
|
12
|
+
* cookie, the user copies the cookie value back into the CLI.
|
|
13
|
+
* - `quiver login --token <cookie>` — paste an existing session cookie.
|
|
14
|
+
*
|
|
15
|
+
* For CI: `quiver login --token "$QUIVER_SESSION_COOKIE"`.
|
|
16
|
+
*
|
|
17
|
+
* Token storage: ~/.config/quiver/auth.json (or $XDG_CONFIG_HOME/quiver/auth.json).
|
|
18
|
+
*/
|
|
19
|
+
import { Command } from "commander";
|
|
20
|
+
import { registerAppCommands } from "./commands/apps.js";
|
|
21
|
+
import { registerBuildCommands } from "./commands/builds.js";
|
|
22
|
+
import { registerLoginCommands } from "./commands/login.js";
|
|
23
|
+
import { registerReleaseCommands } from "./commands/releases.js";
|
|
24
|
+
import { registerFeedbackCommands } from "./commands/feedback.js";
|
|
25
|
+
import { registerDeployTokenCommands } from "./commands/deploy_tokens.js";
|
|
26
|
+
import { registerWhoamiCommand } from "./commands/whoami.js";
|
|
27
|
+
import { getConfig } from "./lib/config.js";
|
|
28
|
+
import { readEnv } from "./lib/env.js";
|
|
29
|
+
import { setApiBase } from "./lib/api.js";
|
|
30
|
+
const program = new Command();
|
|
31
|
+
program
|
|
32
|
+
.name("hands")
|
|
33
|
+
.description("Hands CLI — manage apps, builds, releases from the terminal.")
|
|
34
|
+
.version("0.4.0")
|
|
35
|
+
.option("--api <url>", "Quiver Worker base URL (default: https://quiver.oranix.io or $QUIVER_API)")
|
|
36
|
+
.option("--json", "Output machine-readable JSON (suppresses human output)", false)
|
|
37
|
+
.option("--verbose", "Print HTTP request details for debugging", false);
|
|
38
|
+
// Re-read global options after parse to wire into the API client.
|
|
39
|
+
program.hook("preAction", (thisCommand) => {
|
|
40
|
+
const opts = thisCommand.opts();
|
|
41
|
+
const cfg = getConfig();
|
|
42
|
+
const apiBase = opts.api ?? readEnv("API") ?? cfg.apiBase;
|
|
43
|
+
if (apiBase)
|
|
44
|
+
setApiBase(apiBase);
|
|
45
|
+
if (opts.verbose)
|
|
46
|
+
process.env.HANDS_VERBOSE = "1";
|
|
47
|
+
});
|
|
48
|
+
// --- Subcommand groups ---
|
|
49
|
+
registerLoginCommands(program);
|
|
50
|
+
registerWhoamiCommand(program);
|
|
51
|
+
registerAppCommands(program);
|
|
52
|
+
registerBuildCommands(program);
|
|
53
|
+
registerReleaseCommands(program);
|
|
54
|
+
registerFeedbackCommands(program);
|
|
55
|
+
registerDeployTokenCommands(program);
|
|
56
|
+
program
|
|
57
|
+
.command("version")
|
|
58
|
+
.description("Print quiver CLI version")
|
|
59
|
+
.action(() => {
|
|
60
|
+
console.log(program.version());
|
|
61
|
+
});
|
|
62
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
63
|
+
if (err instanceof Error && err.name === "QuiverApiError") {
|
|
64
|
+
// Admin-native, actionable error print (mirrors the Raft CLI discipline):
|
|
65
|
+
// surface the server's stable Code and Next action so an agent knows what
|
|
66
|
+
// to do — request a role, or have an admin act — not just "forbidden".
|
|
67
|
+
const body = err.body;
|
|
68
|
+
const info = body && typeof body === "object" ? body : {};
|
|
69
|
+
console.error(`Error: ${err.message}`);
|
|
70
|
+
if (typeof info.code === "string")
|
|
71
|
+
console.error(`Code: ${info.code}`);
|
|
72
|
+
if (typeof info.next_action === "string") {
|
|
73
|
+
console.error(`Next action: ${info.next_action}`);
|
|
74
|
+
}
|
|
75
|
+
else if (typeof info.manage_url === "string") {
|
|
76
|
+
console.error(`Next action: see ${info.manage_url}`);
|
|
77
|
+
}
|
|
78
|
+
if (readEnv("VERBOSE") === "1" && err.stack) {
|
|
79
|
+
console.error(err.stack);
|
|
80
|
+
}
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
});
|
|
86
|
+
//# 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,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for the Quiver Worker API.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the shape of admin/src/lib/api.ts but uses a CLI cookie instead
|
|
5
|
+
* of the browser's `credentials: "include"` mechanism.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints called by the CLI use `requireAppRole("viewer")` or
|
|
8
|
+
* `requireOrgRole("member")` — they accept the HttpOnly session cookie
|
|
9
|
+
* as long as the user has been logged in via `quiver login`.
|
|
10
|
+
*/
|
|
11
|
+
export declare class QuiverApiError extends Error {
|
|
12
|
+
readonly status: number;
|
|
13
|
+
readonly body: unknown;
|
|
14
|
+
constructor(status: number, body: unknown, message: string);
|
|
15
|
+
}
|
|
16
|
+
export declare function setApiBase(url: string): void;
|
|
17
|
+
export declare function getApiBase(): string;
|
|
18
|
+
export interface ApiRequestOptions {
|
|
19
|
+
method?: "GET" | "POST" | "PATCH" | "DELETE";
|
|
20
|
+
body?: unknown;
|
|
21
|
+
query?: Record<string, string | number | boolean | null | undefined>;
|
|
22
|
+
raw?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function apiRequest<T = unknown>(path: string, opts?: ApiRequestOptions): Promise<T>;
|
|
25
|
+
export declare function apiUploadFile<T = unknown>(path: string, filePath: string, fieldName?: string): Promise<T>;
|
package/dist/lib/api.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for the Quiver Worker API.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the shape of admin/src/lib/api.ts but uses a CLI cookie instead
|
|
5
|
+
* of the browser's `credentials: "include"` mechanism.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints called by the CLI use `requireAppRole("viewer")` or
|
|
8
|
+
* `requireOrgRole("member")` — they accept the HttpOnly session cookie
|
|
9
|
+
* as long as the user has been logged in via `quiver login`.
|
|
10
|
+
*/
|
|
11
|
+
import { resolveApiBase, resolveSessionCookie } from "./config.js";
|
|
12
|
+
import { readEnv } from "./env.js";
|
|
13
|
+
import { Blob } from "node:buffer";
|
|
14
|
+
import { readFile } from "node:fs/promises";
|
|
15
|
+
import { basename } from "node:path";
|
|
16
|
+
export class QuiverApiError extends Error {
|
|
17
|
+
status;
|
|
18
|
+
body;
|
|
19
|
+
constructor(status, body, message) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = "QuiverApiError";
|
|
22
|
+
this.status = status;
|
|
23
|
+
this.body = body;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
let currentApiBase = null;
|
|
27
|
+
export function setApiBase(url) {
|
|
28
|
+
currentApiBase = url;
|
|
29
|
+
}
|
|
30
|
+
export function getApiBase() {
|
|
31
|
+
return currentApiBase ?? resolveApiBase();
|
|
32
|
+
}
|
|
33
|
+
export async function apiRequest(path, opts = {}) {
|
|
34
|
+
const url = new URL(path.startsWith("/") ? path : `/${path}`, getApiBase());
|
|
35
|
+
if (opts.query) {
|
|
36
|
+
for (const [k, v] of Object.entries(opts.query)) {
|
|
37
|
+
if (v === null || v === undefined)
|
|
38
|
+
continue;
|
|
39
|
+
url.searchParams.set(k, String(v));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const headers = {
|
|
43
|
+
accept: "application/json",
|
|
44
|
+
};
|
|
45
|
+
const bearer = readEnv("AUTH_TOKEN") ?? readEnv("BEARER_TOKEN");
|
|
46
|
+
if (bearer)
|
|
47
|
+
headers.authorization = `Bearer ${bearer}`;
|
|
48
|
+
const cookie = resolveSessionCookie();
|
|
49
|
+
if (!bearer && cookie)
|
|
50
|
+
headers["cookie"] = cookie;
|
|
51
|
+
let body;
|
|
52
|
+
if (opts.body !== undefined) {
|
|
53
|
+
headers["content-type"] = "application/json";
|
|
54
|
+
body = JSON.stringify(opts.body);
|
|
55
|
+
}
|
|
56
|
+
const res = await fetch(url.toString(), {
|
|
57
|
+
method: opts.method ?? "GET",
|
|
58
|
+
headers,
|
|
59
|
+
...(body !== undefined ? { body } : {}),
|
|
60
|
+
});
|
|
61
|
+
if (readEnv("VERBOSE") === "1") {
|
|
62
|
+
console.error(`> ${opts.method ?? "GET"} ${url}`);
|
|
63
|
+
console.error(`< ${res.status}`);
|
|
64
|
+
}
|
|
65
|
+
if (opts.raw)
|
|
66
|
+
return res;
|
|
67
|
+
const text = await res.text();
|
|
68
|
+
let data = text;
|
|
69
|
+
if (text.length > 0) {
|
|
70
|
+
try {
|
|
71
|
+
data = JSON.parse(text);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// keep as text
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (!res.ok) {
|
|
78
|
+
const msg = typeof data === "object" && data && "error" in data
|
|
79
|
+
? String(data.error)
|
|
80
|
+
: `${res.status} ${res.statusText}`;
|
|
81
|
+
throw new QuiverApiError(res.status, data, msg);
|
|
82
|
+
}
|
|
83
|
+
return data;
|
|
84
|
+
}
|
|
85
|
+
export async function apiUploadFile(path, filePath, fieldName = "apk") {
|
|
86
|
+
const url = new URL(path.startsWith("/") ? path : `/${path}`, getApiBase());
|
|
87
|
+
const cookie = resolveSessionCookie();
|
|
88
|
+
const form = new FormData();
|
|
89
|
+
const bytes = await readFile(filePath);
|
|
90
|
+
form.append(fieldName, new Blob([bytes]), basename(filePath));
|
|
91
|
+
const headers = {
|
|
92
|
+
accept: "application/json",
|
|
93
|
+
};
|
|
94
|
+
const bearer = readEnv("AUTH_TOKEN") ?? readEnv("BEARER_TOKEN");
|
|
95
|
+
if (bearer)
|
|
96
|
+
headers.authorization = `Bearer ${bearer}`;
|
|
97
|
+
if (!bearer && cookie)
|
|
98
|
+
headers.cookie = cookie;
|
|
99
|
+
const res = await fetch(url.toString(), {
|
|
100
|
+
method: "POST",
|
|
101
|
+
headers,
|
|
102
|
+
body: form,
|
|
103
|
+
});
|
|
104
|
+
if (readEnv("VERBOSE") === "1") {
|
|
105
|
+
console.error(`> POST ${url}`);
|
|
106
|
+
console.error(`< ${res.status}`);
|
|
107
|
+
}
|
|
108
|
+
const text = await res.text();
|
|
109
|
+
let data = text;
|
|
110
|
+
if (text.length > 0) {
|
|
111
|
+
try {
|
|
112
|
+
data = JSON.parse(text);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// keep as text
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (!res.ok) {
|
|
119
|
+
const msg = typeof data === "object" && data && "error" in data
|
|
120
|
+
? String(data.error)
|
|
121
|
+
: `${res.status} ${res.statusText}`;
|
|
122
|
+
throw new QuiverApiError(res.status, data, msg);
|
|
123
|
+
}
|
|
124
|
+
return data;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config + auth storage for the quiver CLI.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order for any setting (first wins):
|
|
5
|
+
* 1. CLI flag (--api, --token, ...)
|
|
6
|
+
* 2. Environment variable (QUIVER_API, QUIVER_SESSION_COOKIE, ...)
|
|
7
|
+
* 3. File at $XDG_CONFIG_HOME/quiver/auth.json (default ~/.config/quiver/auth.json)
|
|
8
|
+
*
|
|
9
|
+
* The config file holds:
|
|
10
|
+
* - apiBase: the Quiver Worker URL the CLI talks to
|
|
11
|
+
* - sessionCookie: the HttpOnly `quiver_session` cookie value the
|
|
12
|
+
* Worker set after `quiver login` (or copied from the browser DevTools)
|
|
13
|
+
*/
|
|
14
|
+
export interface CliConfig {
|
|
15
|
+
apiBase?: string;
|
|
16
|
+
sessionCookie?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function getConfig(): CliConfig;
|
|
19
|
+
export declare function saveConfig(patch: Partial<CliConfig>): CliConfig;
|
|
20
|
+
export declare function clearConfig(): void;
|
|
21
|
+
export declare function resolveApiBase(): string;
|
|
22
|
+
export declare function resolveSessionCookie(): string | undefined;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config + auth storage for the quiver CLI.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order for any setting (first wins):
|
|
5
|
+
* 1. CLI flag (--api, --token, ...)
|
|
6
|
+
* 2. Environment variable (QUIVER_API, QUIVER_SESSION_COOKIE, ...)
|
|
7
|
+
* 3. File at $XDG_CONFIG_HOME/quiver/auth.json (default ~/.config/quiver/auth.json)
|
|
8
|
+
*
|
|
9
|
+
* The config file holds:
|
|
10
|
+
* - apiBase: the Quiver Worker URL the CLI talks to
|
|
11
|
+
* - sessionCookie: the HttpOnly `quiver_session` cookie value the
|
|
12
|
+
* Worker set after `quiver login` (or copied from the browser DevTools)
|
|
13
|
+
*/
|
|
14
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
15
|
+
import { readEnv } from "./env.js";
|
|
16
|
+
import { dirname, join } from "node:path";
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
|
+
const DEFAULT_API_BASE = "https://quiver.oranix.io";
|
|
19
|
+
function configPath() {
|
|
20
|
+
const xdg = process.env.XDG_CONFIG_HOME;
|
|
21
|
+
const dir = xdg && xdg.length > 0 ? xdg : join(homedir(), ".config");
|
|
22
|
+
return join(dir, "quiver", "auth.json");
|
|
23
|
+
}
|
|
24
|
+
export function getConfig() {
|
|
25
|
+
const path = configPath();
|
|
26
|
+
if (!existsSync(path))
|
|
27
|
+
return {};
|
|
28
|
+
try {
|
|
29
|
+
const raw = readFileSync(path, "utf8");
|
|
30
|
+
const parsed = JSON.parse(raw);
|
|
31
|
+
return parsed ?? {};
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return {};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function saveConfig(patch) {
|
|
38
|
+
const current = getConfig();
|
|
39
|
+
const next = { ...current, ...patch };
|
|
40
|
+
const path = configPath();
|
|
41
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
42
|
+
// 0600 — session cookie is sensitive.
|
|
43
|
+
writeFileSync(path, JSON.stringify(next, null, 2) + "\n", { mode: 0o600 });
|
|
44
|
+
return next;
|
|
45
|
+
}
|
|
46
|
+
export function clearConfig() {
|
|
47
|
+
const current = getConfig();
|
|
48
|
+
const next = { ...current };
|
|
49
|
+
delete next.sessionCookie;
|
|
50
|
+
saveConfig(next);
|
|
51
|
+
}
|
|
52
|
+
export function resolveApiBase() {
|
|
53
|
+
const cliFlag = readEnv("CLI_API");
|
|
54
|
+
if (cliFlag)
|
|
55
|
+
return cliFlag;
|
|
56
|
+
const env = readEnv("API");
|
|
57
|
+
if (env)
|
|
58
|
+
return env;
|
|
59
|
+
const cfg = getConfig();
|
|
60
|
+
if (cfg.apiBase)
|
|
61
|
+
return cfg.apiBase;
|
|
62
|
+
return DEFAULT_API_BASE;
|
|
63
|
+
}
|
|
64
|
+
export function resolveSessionCookie() {
|
|
65
|
+
// CI mode wins over file config (env vars are explicit).
|
|
66
|
+
const env = readEnv("SESSION_COOKIE");
|
|
67
|
+
if (env)
|
|
68
|
+
return env;
|
|
69
|
+
return getConfig().sessionCookie;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAOlC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAEpD,SAAS,UAAU;IACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QAC5C,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAc,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,sCAAsC;IACtC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAc,EAAE,GAAG,OAAO,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,aAAa,CAAC;IAC1B,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IACpC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,yDAAyD;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,OAAO,SAAS,EAAE,CAAC,aAAa,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variables during the Quiver → Hands rebrand: prefer the new
|
|
3
|
+
* `HANDS_<name>` and fall back to the legacy `QUIVER_<name>` so existing CI
|
|
4
|
+
* (which sets e.g. `QUIVER_BEARER_TOKEN`) keeps working unchanged. Same
|
|
5
|
+
* backward-compat approach as the X-Hands / X-Quiver request headers.
|
|
6
|
+
*/
|
|
7
|
+
export declare function readEnv(suffix: string): string | undefined;
|
package/dist/lib/env.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variables during the Quiver → Hands rebrand: prefer the new
|
|
3
|
+
* `HANDS_<name>` and fall back to the legacy `QUIVER_<name>` so existing CI
|
|
4
|
+
* (which sets e.g. `QUIVER_BEARER_TOKEN`) keeps working unchanged. Same
|
|
5
|
+
* backward-compat approach as the X-Hands / X-Quiver request headers.
|
|
6
|
+
*/
|
|
7
|
+
export function readEnv(suffix) {
|
|
8
|
+
return process.env[`HANDS_${suffix}`] ?? process.env[`QUIVER_${suffix}`];
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;AAC3E,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@botiverse/hands-cli",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Hands CLI \u2014 manage apps, builds, releases from the terminal.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/oranix-io/quiver.git"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"bin": {
|
|
13
|
+
"hands": "dist/index.js",
|
|
14
|
+
"quiver": "dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"dev": "tsx watch src/index.ts",
|
|
23
|
+
"start": "node dist/index.js",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"lint": "eslint src/",
|
|
26
|
+
"lint:fix": "eslint --fix src/"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"commander": "^12.1.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^22.10.0",
|
|
33
|
+
"eslint": "^9.17.0",
|
|
34
|
+
"tsx": "^4.19.2",
|
|
35
|
+
"typescript": "^5.9.3",
|
|
36
|
+
"vitest": "^2.1.9"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=20"
|
|
40
|
+
}
|
|
41
|
+
}
|