coolhand-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/LICENSE +201 -0
- package/README.md +119 -0
- package/dist/auth/callback-server.d.ts +13 -0
- package/dist/auth/callback-server.d.ts.map +1 -0
- package/dist/auth/callback-server.js +133 -0
- package/dist/auth/callback-server.js.map +1 -0
- package/dist/auth/open-browser.d.ts +8 -0
- package/dist/auth/open-browser.d.ts.map +1 -0
- package/dist/auth/open-browser.js +31 -0
- package/dist/auth/open-browser.js.map +1 -0
- package/dist/auth/state.d.ts +3 -0
- package/dist/auth/state.d.ts.map +1 -0
- package/dist/auth/state.js +16 -0
- package/dist/auth/state.js.map +1 -0
- package/dist/auth/success-page.d.ts +3 -0
- package/dist/auth/success-page.d.ts.map +1 -0
- package/dist/auth/success-page.js +176 -0
- package/dist/auth/success-page.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +14 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +187 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/accounts.d.ts +3 -0
- package/dist/commands/accounts.d.ts.map +1 -0
- package/dist/commands/accounts.js +59 -0
- package/dist/commands/accounts.js.map +1 -0
- package/dist/commands/clients.d.ts +3 -0
- package/dist/commands/clients.d.ts.map +1 -0
- package/dist/commands/clients.js +59 -0
- package/dist/commands/clients.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +119 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +39 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +37 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +20 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +127 -0
- package/dist/config.js.map +1 -0
- package/dist/env-file.d.ts +12 -0
- package/dist/env-file.d.ts.map +1 -0
- package/dist/env-file.js +62 -0
- package/dist/env-file.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +29 -0
- package/dist/logger.js.map +1 -0
- package/dist/mask.d.ts +7 -0
- package/dist/mask.d.ts.map +1 -0
- package/dist/mask.js +12 -0
- package/dist/mask.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +11 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The HTML the local callback listener returns to the browser after a
|
|
3
|
+
* successful token capture. Pure inline CSS, no external assets, no JS.
|
|
4
|
+
* Color palette mirrors coolhandlabs.com (shadcn dark mode HSL values).
|
|
5
|
+
*/
|
|
6
|
+
const BASE_STYLES = `
|
|
7
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
8
|
+
html, body { height: 100%; }
|
|
9
|
+
body {
|
|
10
|
+
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
|
|
11
|
+
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
12
|
+
background: hsl(222.2 84% 4.9%);
|
|
13
|
+
color: hsl(210 40% 98%);
|
|
14
|
+
display: flex;
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
min-height: 100vh;
|
|
18
|
+
padding: 24px;
|
|
19
|
+
line-height: 1.5;
|
|
20
|
+
-webkit-font-smoothing: antialiased;
|
|
21
|
+
-moz-osx-font-smoothing: grayscale;
|
|
22
|
+
}
|
|
23
|
+
.wrap { width: 100%; max-width: 440px; }
|
|
24
|
+
.brand {
|
|
25
|
+
text-align: center;
|
|
26
|
+
margin-bottom: 32px;
|
|
27
|
+
}
|
|
28
|
+
.brand-logo {
|
|
29
|
+
height: 157px;
|
|
30
|
+
width: auto;
|
|
31
|
+
max-width: 100%;
|
|
32
|
+
display: inline-block;
|
|
33
|
+
}
|
|
34
|
+
.brand-text {
|
|
35
|
+
display: none;
|
|
36
|
+
font-size: 13px;
|
|
37
|
+
font-weight: 600;
|
|
38
|
+
letter-spacing: 0.15em;
|
|
39
|
+
text-transform: uppercase;
|
|
40
|
+
color: hsl(215 20.2% 65.1%);
|
|
41
|
+
align-items: center;
|
|
42
|
+
justify-content: center;
|
|
43
|
+
}
|
|
44
|
+
.brand-dot {
|
|
45
|
+
display: inline-block;
|
|
46
|
+
width: 8px;
|
|
47
|
+
height: 8px;
|
|
48
|
+
border-radius: 50%;
|
|
49
|
+
background: hsl(217.2 91.2% 59.8%);
|
|
50
|
+
margin-right: 8px;
|
|
51
|
+
vertical-align: middle;
|
|
52
|
+
transform: translateY(-1px);
|
|
53
|
+
}
|
|
54
|
+
.card {
|
|
55
|
+
background: hsl(222.2 84% 4.9%);
|
|
56
|
+
border: 1px solid hsl(217.2 32.6% 17.5%);
|
|
57
|
+
border-radius: 12px;
|
|
58
|
+
padding: 40px 32px 32px;
|
|
59
|
+
text-align: center;
|
|
60
|
+
box-shadow: 0 24px 48px -16px rgba(0, 0, 0, 0.5);
|
|
61
|
+
}
|
|
62
|
+
.icon-wrap {
|
|
63
|
+
width: 64px;
|
|
64
|
+
height: 64px;
|
|
65
|
+
border-radius: 50%;
|
|
66
|
+
display: flex;
|
|
67
|
+
align-items: center;
|
|
68
|
+
justify-content: center;
|
|
69
|
+
margin: 0 auto 20px;
|
|
70
|
+
}
|
|
71
|
+
.icon-svg { width: 32px; height: 32px; }
|
|
72
|
+
h1 {
|
|
73
|
+
font-size: 20px;
|
|
74
|
+
font-weight: 600;
|
|
75
|
+
color: hsl(210 40% 98%);
|
|
76
|
+
margin-bottom: 8px;
|
|
77
|
+
letter-spacing: -0.01em;
|
|
78
|
+
}
|
|
79
|
+
p {
|
|
80
|
+
color: hsl(215 20.2% 65.1%);
|
|
81
|
+
font-size: 14px;
|
|
82
|
+
}
|
|
83
|
+
p + p { margin-top: 12px; }
|
|
84
|
+
.foot {
|
|
85
|
+
text-align: center;
|
|
86
|
+
margin-top: 24px;
|
|
87
|
+
font-size: 12px;
|
|
88
|
+
color: hsl(215 20.2% 65.1%);
|
|
89
|
+
}
|
|
90
|
+
`;
|
|
91
|
+
const BRAND_BLOCK = `
|
|
92
|
+
<div class="brand">
|
|
93
|
+
<img src="https://coolhandlabs.com/coolhand-logo.png" alt="Coolhand"
|
|
94
|
+
class="brand-logo"
|
|
95
|
+
onerror="this.style.display='none'; this.nextElementSibling.style.display='inline-flex';">
|
|
96
|
+
<span class="brand-text"><span class="brand-dot"></span>coolhand</span>
|
|
97
|
+
</div>
|
|
98
|
+
`;
|
|
99
|
+
const SUCCESS_BODY = `
|
|
100
|
+
${BRAND_BLOCK}
|
|
101
|
+
<div class="card">
|
|
102
|
+
<div class="icon-wrap" style="background: hsl(217.2 91.2% 59.8% / 0.12);">
|
|
103
|
+
<svg class="icon-svg" viewBox="0 0 24 24" fill="none"
|
|
104
|
+
stroke="hsl(217.2 91.2% 59.8%)" stroke-width="2.5"
|
|
105
|
+
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
106
|
+
<polyline points="20 6 9 17 4 12"></polyline>
|
|
107
|
+
</svg>
|
|
108
|
+
</div>
|
|
109
|
+
<h1>Token captured</h1>
|
|
110
|
+
<p>You can close this tab and return to your terminal.</p>
|
|
111
|
+
</div>
|
|
112
|
+
<p class="foot">coolhand-cli received your API token securely.</p>
|
|
113
|
+
`;
|
|
114
|
+
export const SUCCESS_HTML = `<!doctype html>
|
|
115
|
+
<html lang="en">
|
|
116
|
+
<head>
|
|
117
|
+
<meta charset="utf-8">
|
|
118
|
+
<title>Coolhand — Token captured</title>
|
|
119
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
120
|
+
<meta name="color-scheme" content="dark">
|
|
121
|
+
<meta name="robots" content="noindex">
|
|
122
|
+
<style>${BASE_STYLES}</style>
|
|
123
|
+
</head>
|
|
124
|
+
<body>
|
|
125
|
+
<main class="wrap">${SUCCESS_BODY}</main>
|
|
126
|
+
</body>
|
|
127
|
+
</html>
|
|
128
|
+
`;
|
|
129
|
+
export function errorHtml(message) {
|
|
130
|
+
const safe = message.replace(/[&<>"']/g, (ch) => {
|
|
131
|
+
switch (ch) {
|
|
132
|
+
case '&':
|
|
133
|
+
return '&';
|
|
134
|
+
case '<':
|
|
135
|
+
return '<';
|
|
136
|
+
case '>':
|
|
137
|
+
return '>';
|
|
138
|
+
case '"':
|
|
139
|
+
return '"';
|
|
140
|
+
default:
|
|
141
|
+
return ''';
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
const body = `
|
|
145
|
+
${BRAND_BLOCK}
|
|
146
|
+
<div class="card">
|
|
147
|
+
<div class="icon-wrap" style="background: hsl(0 62.8% 30.6% / 0.15);">
|
|
148
|
+
<svg class="icon-svg" viewBox="0 0 24 24" fill="none"
|
|
149
|
+
stroke="hsl(0 84% 60%)" stroke-width="2.5"
|
|
150
|
+
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
151
|
+
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
152
|
+
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
153
|
+
</svg>
|
|
154
|
+
</div>
|
|
155
|
+
<h1>Request rejected</h1>
|
|
156
|
+
<p>${safe}</p>
|
|
157
|
+
<p>Return to your terminal for details.</p>
|
|
158
|
+
</div>
|
|
159
|
+
`;
|
|
160
|
+
return `<!doctype html>
|
|
161
|
+
<html lang="en">
|
|
162
|
+
<head>
|
|
163
|
+
<meta charset="utf-8">
|
|
164
|
+
<title>Coolhand — Request rejected</title>
|
|
165
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
166
|
+
<meta name="color-scheme" content="dark">
|
|
167
|
+
<meta name="robots" content="noindex">
|
|
168
|
+
<style>${BASE_STYLES}</style>
|
|
169
|
+
</head>
|
|
170
|
+
<body>
|
|
171
|
+
<main class="wrap">${body}</main>
|
|
172
|
+
</body>
|
|
173
|
+
</html>
|
|
174
|
+
`;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=success-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"success-page.js","sourceRoot":"","sources":["../../src/auth/success-page.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoFnB,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;;CAOnB,CAAC;AAEF,MAAM,YAAY,GAAG;IACjB,WAAW;;;;;;;;;;;;;CAad,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;WAQjB,WAAW;;;uBAGC,YAAY;;;CAGlC,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE;QAC9C,QAAQ,EAAE,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,OAAO,OAAO,CAAC;YACjB,KAAK,GAAG;gBACN,OAAO,MAAM,CAAC;YAChB,KAAK,GAAG;gBACN,OAAO,MAAM,CAAC;YAChB,KAAK,GAAG;gBACN,OAAO,QAAQ,CAAC;YAClB;gBACE,OAAO,OAAO,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG;MACT,WAAW;;;;;;;;;;;WAWN,IAAI;;;GAGZ,CAAC;IACF,OAAO;;;;;;;;WAQE,WAAW;;;uBAGC,IAAI;;;CAG1B,CAAC;AACF,CAAC"}
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { run } from './cli.js';
|
|
3
|
+
import { ExitCode } from './errors.js';
|
|
4
|
+
import { logger, redact } from './logger.js';
|
|
5
|
+
run(process.argv.slice(2))
|
|
6
|
+
.then((code) => {
|
|
7
|
+
process.exit(code);
|
|
8
|
+
})
|
|
9
|
+
.catch((err) => {
|
|
10
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
11
|
+
logger.info(`Unexpected error: ${redact(message)}`);
|
|
12
|
+
process.exit(ExitCode.INTERNAL);
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE7C,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACvB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;IACb,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface ParsedArgs {
|
|
2
|
+
command: string;
|
|
3
|
+
positional: string[];
|
|
4
|
+
flags: Record<string, string | boolean>;
|
|
5
|
+
}
|
|
6
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
7
|
+
export declare function run(argv: string[]): Promise<number>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAgBA,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CACzC;AAgCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAqCpD;AAsED,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CzD"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { CliError, ExitCode } from './errors.js';
|
|
2
|
+
import { logger, redact } from './logger.js';
|
|
3
|
+
import { PACKAGE_VERSION } from './version.js';
|
|
4
|
+
import { run as runLogin } from './commands/login.js';
|
|
5
|
+
import { run as runLogout } from './commands/logout.js';
|
|
6
|
+
import { run as runStatus } from './commands/status.js';
|
|
7
|
+
import { run as runWhoami } from './commands/whoami.js';
|
|
8
|
+
import { run as runClients } from './commands/clients.js';
|
|
9
|
+
const HELP_TEXT = `coolhand-cli — authenticate with Coolhand from your terminal
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
coolhand <command> [options]
|
|
13
|
+
|
|
14
|
+
Commands:
|
|
15
|
+
login Open a browser to retrieve and store an API token
|
|
16
|
+
logout Remove a stored client
|
|
17
|
+
status Check whether a token is configured
|
|
18
|
+
whoami Show the currently configured client
|
|
19
|
+
clients [use <id>] List or switch the default client
|
|
20
|
+
help Show this message
|
|
21
|
+
|
|
22
|
+
Global options:
|
|
23
|
+
--version, -v Print version and exit
|
|
24
|
+
--help, -h Show command help
|
|
25
|
+
|
|
26
|
+
Login options:
|
|
27
|
+
--base-url URL Coolhand server (default: https://coolhandlabs.com)
|
|
28
|
+
--write-env PATH Idempotently set COOLHAND_API_KEY in PATH
|
|
29
|
+
--client-id ID Hint to the server about which client to select
|
|
30
|
+
--json Emit JSON output instead of human-readable text
|
|
31
|
+
|
|
32
|
+
Logout options:
|
|
33
|
+
--client-id ID Remove a specific client
|
|
34
|
+
--all Remove every stored client
|
|
35
|
+
|
|
36
|
+
Run "coolhand <command> --help" for more details.
|
|
37
|
+
`;
|
|
38
|
+
export function parseArgs(argv) {
|
|
39
|
+
const flags = {};
|
|
40
|
+
const positional = [];
|
|
41
|
+
let i = 0;
|
|
42
|
+
while (i < argv.length) {
|
|
43
|
+
const arg = argv[i];
|
|
44
|
+
if (arg === '--') {
|
|
45
|
+
positional.push(...argv.slice(i + 1));
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
if (arg.startsWith('--')) {
|
|
49
|
+
const eq = arg.indexOf('=');
|
|
50
|
+
if (eq >= 0) {
|
|
51
|
+
flags[arg.slice(2, eq)] = arg.slice(eq + 1);
|
|
52
|
+
i += 1;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const name = arg.slice(2);
|
|
56
|
+
const next = argv[i + 1];
|
|
57
|
+
if (next !== undefined && !next.startsWith('-')) {
|
|
58
|
+
flags[name] = next;
|
|
59
|
+
i += 2;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
flags[name] = true;
|
|
63
|
+
i += 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (arg.startsWith('-') && arg.length > 1) {
|
|
68
|
+
flags[arg.slice(1)] = true;
|
|
69
|
+
i += 1;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
positional.push(arg);
|
|
73
|
+
i += 1;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const command = positional.shift() ?? '';
|
|
77
|
+
return { command, positional, flags };
|
|
78
|
+
}
|
|
79
|
+
function loginOptions(parsed) {
|
|
80
|
+
const opts = {};
|
|
81
|
+
if (typeof parsed.flags['base-url'] === 'string') {
|
|
82
|
+
opts.baseUrl = parsed.flags['base-url'];
|
|
83
|
+
}
|
|
84
|
+
if ('write-env' in parsed.flags) {
|
|
85
|
+
const v = parsed.flags['write-env'];
|
|
86
|
+
if (typeof v !== 'string' || v.length === 0) {
|
|
87
|
+
throw new CliError('INVALID_ARGS', '--write-env requires a path argument');
|
|
88
|
+
}
|
|
89
|
+
opts.writeEnv = v;
|
|
90
|
+
}
|
|
91
|
+
if (typeof parsed.flags['client-id'] === 'string') {
|
|
92
|
+
opts.clientId = parsed.flags['client-id'];
|
|
93
|
+
}
|
|
94
|
+
if (parsed.flags.json === true) {
|
|
95
|
+
opts.json = true;
|
|
96
|
+
}
|
|
97
|
+
if (typeof parsed.flags['timeout-ms'] === 'string') {
|
|
98
|
+
const n = Number(parsed.flags['timeout-ms']);
|
|
99
|
+
if (Number.isFinite(n) && n > 0) {
|
|
100
|
+
opts.timeoutMs = n;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return opts;
|
|
104
|
+
}
|
|
105
|
+
function logoutOptions(parsed) {
|
|
106
|
+
const opts = {};
|
|
107
|
+
if (typeof parsed.flags['client-id'] === 'string') {
|
|
108
|
+
opts.clientId = parsed.flags['client-id'];
|
|
109
|
+
}
|
|
110
|
+
if (parsed.flags.all === true) {
|
|
111
|
+
opts.all = true;
|
|
112
|
+
}
|
|
113
|
+
if (parsed.flags.json === true) {
|
|
114
|
+
opts.json = true;
|
|
115
|
+
}
|
|
116
|
+
return opts;
|
|
117
|
+
}
|
|
118
|
+
function statusOptions(parsed) {
|
|
119
|
+
const opts = {};
|
|
120
|
+
if (typeof parsed.flags['client-id'] === 'string') {
|
|
121
|
+
opts.clientId = parsed.flags['client-id'];
|
|
122
|
+
}
|
|
123
|
+
if (parsed.flags.json === true) {
|
|
124
|
+
opts.json = true;
|
|
125
|
+
}
|
|
126
|
+
return opts;
|
|
127
|
+
}
|
|
128
|
+
function whoamiOptions(parsed) {
|
|
129
|
+
const opts = {};
|
|
130
|
+
if (typeof parsed.flags['client-id'] === 'string') {
|
|
131
|
+
opts.clientId = parsed.flags['client-id'];
|
|
132
|
+
}
|
|
133
|
+
return opts;
|
|
134
|
+
}
|
|
135
|
+
function clientsOptions(parsed) {
|
|
136
|
+
const opts = {};
|
|
137
|
+
if (parsed.flags.json === true) {
|
|
138
|
+
opts.json = true;
|
|
139
|
+
}
|
|
140
|
+
return opts;
|
|
141
|
+
}
|
|
142
|
+
export async function run(argv) {
|
|
143
|
+
if (argv.length === 0) {
|
|
144
|
+
logger.info(HELP_TEXT);
|
|
145
|
+
return ExitCode.OK;
|
|
146
|
+
}
|
|
147
|
+
const parsed = parseArgs(argv);
|
|
148
|
+
if (parsed.flags.version === true || parsed.flags.v === true || parsed.command === 'version') {
|
|
149
|
+
process.stdout.write(`${PACKAGE_VERSION}\n`);
|
|
150
|
+
return ExitCode.OK;
|
|
151
|
+
}
|
|
152
|
+
if (parsed.flags.help === true || parsed.flags.h === true || parsed.command === 'help' || parsed.command === '') {
|
|
153
|
+
logger.info(HELP_TEXT);
|
|
154
|
+
return ExitCode.OK;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
switch (parsed.command) {
|
|
158
|
+
case 'login':
|
|
159
|
+
return await runLogin(loginOptions(parsed));
|
|
160
|
+
case 'logout':
|
|
161
|
+
return await runLogout(logoutOptions(parsed));
|
|
162
|
+
case 'status':
|
|
163
|
+
return await runStatus(statusOptions(parsed));
|
|
164
|
+
case 'whoami':
|
|
165
|
+
return await runWhoami(whoamiOptions(parsed));
|
|
166
|
+
case 'clients':
|
|
167
|
+
return await runClients(parsed.positional, clientsOptions(parsed));
|
|
168
|
+
default:
|
|
169
|
+
logger.info(`Unknown command: ${parsed.command}`);
|
|
170
|
+
logger.info(HELP_TEXT);
|
|
171
|
+
return ExitCode.USER_ERROR;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (err instanceof CliError) {
|
|
176
|
+
if (parsed.flags.json === true) {
|
|
177
|
+
logger.json({ ok: false, error: err.code, message: redact(err.message) });
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
logger.info(`Error: ${redact(err.message)} [${err.code}]`);
|
|
181
|
+
}
|
|
182
|
+
return err.exitCode;
|
|
183
|
+
}
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/commands/accounts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA4CnD,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAYtF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { CliError, ExitCode } from '../errors.js';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
|
+
import { loadConfig, setDefault } from '../config.js';
|
|
4
|
+
import { maskToken } from '../mask.js';
|
|
5
|
+
import { buildStatusOutput } from './status.js';
|
|
6
|
+
async function listAccounts(opts) {
|
|
7
|
+
const cfg = await loadConfig();
|
|
8
|
+
const output = buildStatusOutput(cfg);
|
|
9
|
+
if (opts.json) {
|
|
10
|
+
logger.json(output);
|
|
11
|
+
return ExitCode.OK;
|
|
12
|
+
}
|
|
13
|
+
if (!output.configured) {
|
|
14
|
+
logger.info('No accounts configured. Run `coolhand login` to add one.');
|
|
15
|
+
return ExitCode.OK;
|
|
16
|
+
}
|
|
17
|
+
for (const acct of output.accounts) {
|
|
18
|
+
const marker = acct.account_id === output.default_account_id ? '* ' : ' ';
|
|
19
|
+
logger.info(`${marker}${acct.account_id} ${acct.account_name} ${acct.masked_token} ${acct.base_url}`);
|
|
20
|
+
}
|
|
21
|
+
return ExitCode.OK;
|
|
22
|
+
}
|
|
23
|
+
async function useAccount(accountId, opts) {
|
|
24
|
+
if (!accountId) {
|
|
25
|
+
throw new CliError('INVALID_ARGS', 'accounts use requires an account id');
|
|
26
|
+
}
|
|
27
|
+
const cfg = await setDefault(accountId);
|
|
28
|
+
const entry = cfg.accounts[accountId];
|
|
29
|
+
if (opts.json) {
|
|
30
|
+
logger.json({
|
|
31
|
+
ok: true,
|
|
32
|
+
default_account_id: cfg.default_account_id,
|
|
33
|
+
account: {
|
|
34
|
+
account_id: entry.account_id,
|
|
35
|
+
account_name: entry.account_name,
|
|
36
|
+
masked_token: maskToken(entry.api_key),
|
|
37
|
+
base_url: entry.base_url,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
logger.info(`Default account is now "${entry.account_name}" (${entry.account_id}).`);
|
|
43
|
+
}
|
|
44
|
+
return ExitCode.OK;
|
|
45
|
+
}
|
|
46
|
+
export async function run(positional, opts) {
|
|
47
|
+
const sub = positional[0];
|
|
48
|
+
if (!sub) {
|
|
49
|
+
return listAccounts(opts);
|
|
50
|
+
}
|
|
51
|
+
if (sub === 'use') {
|
|
52
|
+
return useAccount(positional[1] ?? '', opts);
|
|
53
|
+
}
|
|
54
|
+
if (sub === 'list') {
|
|
55
|
+
return listAccounts(opts);
|
|
56
|
+
}
|
|
57
|
+
throw new CliError('INVALID_ARGS', `Unknown accounts subcommand: ${sub}`);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/commands/accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/commands/clients.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA4ClD,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAYrF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { CliError, ExitCode } from '../errors.js';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
|
+
import { loadConfig, setDefault } from '../config.js';
|
|
4
|
+
import { maskToken } from '../mask.js';
|
|
5
|
+
import { buildStatusOutput } from './status.js';
|
|
6
|
+
async function listClients(opts) {
|
|
7
|
+
const cfg = await loadConfig();
|
|
8
|
+
const output = buildStatusOutput(cfg);
|
|
9
|
+
if (opts.json) {
|
|
10
|
+
logger.json(output);
|
|
11
|
+
return ExitCode.OK;
|
|
12
|
+
}
|
|
13
|
+
if (!output.configured) {
|
|
14
|
+
logger.info('No clients configured. Run `coolhand login` to add one.');
|
|
15
|
+
return ExitCode.OK;
|
|
16
|
+
}
|
|
17
|
+
for (const acct of output.clients) {
|
|
18
|
+
const marker = acct.client_id === output.default_client_id ? '* ' : ' ';
|
|
19
|
+
logger.info(`${marker}${acct.client_id} ${acct.client_name} ${acct.masked_token} ${acct.base_url}`);
|
|
20
|
+
}
|
|
21
|
+
return ExitCode.OK;
|
|
22
|
+
}
|
|
23
|
+
async function useClient(clientId, opts) {
|
|
24
|
+
if (!clientId) {
|
|
25
|
+
throw new CliError('INVALID_ARGS', 'clients use requires an client id');
|
|
26
|
+
}
|
|
27
|
+
const cfg = await setDefault(clientId);
|
|
28
|
+
const entry = cfg.clients[clientId];
|
|
29
|
+
if (opts.json) {
|
|
30
|
+
logger.json({
|
|
31
|
+
ok: true,
|
|
32
|
+
default_client_id: cfg.default_client_id,
|
|
33
|
+
client: {
|
|
34
|
+
client_id: entry.client_id,
|
|
35
|
+
client_name: entry.client_name,
|
|
36
|
+
masked_token: maskToken(entry.api_key),
|
|
37
|
+
base_url: entry.base_url,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
logger.info(`Default client is now "${entry.client_name}" (${entry.client_id}).`);
|
|
43
|
+
}
|
|
44
|
+
return ExitCode.OK;
|
|
45
|
+
}
|
|
46
|
+
export async function run(positional, opts) {
|
|
47
|
+
const sub = positional[0];
|
|
48
|
+
if (!sub) {
|
|
49
|
+
return listClients(opts);
|
|
50
|
+
}
|
|
51
|
+
if (sub === 'use') {
|
|
52
|
+
return useClient(positional[1] ?? '', opts);
|
|
53
|
+
}
|
|
54
|
+
if (sub === 'list') {
|
|
55
|
+
return listClients(opts);
|
|
56
|
+
}
|
|
57
|
+
throw new CliError('INVALID_ARGS', `Unknown clients subcommand: ${sub}`);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=clients.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/commands/clients.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAQA,OAAO,EAA0D,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAwBxG,wBAAsB,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA4F7D"}
|