@skillsmith/cli 0.5.7 → 0.5.8

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.
@@ -1,23 +1,3 @@
1
- /**
2
- * Login Command - Authenticate the Skillsmith CLI
3
- *
4
- * SMI-2715: CLI Login Device Flow
5
- *
6
- * Opens the Skillsmith dashboard in the browser (or prints the URL for
7
- * headless/CI environments), prompts for an API key with masked input,
8
- * validates the format, and stores it securely via @skillsmith/core.
9
- *
10
- * Security notes:
11
- * - No --key <value> flag: would expose the secret in ps aux / shell history
12
- * - Headless path: SKILLSMITH_API_KEY env var (documented in README)
13
- * - Always-masked input: @inquirer/prompts password() renders bullets
14
- */
15
1
  import { Command } from 'commander';
16
- /**
17
- * Create the `skillsmith login` command.
18
- *
19
- * Options:
20
- * --no-browser Print URL instead of opening browser (for CI/headless)
21
- */
22
2
  export declare function createLoginCommand(): Command;
23
3
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8BnC;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAwF5C"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsSnC,wBAAgB,kBAAkB,IAAI,OAAO,CAyD5C"}
@@ -1,34 +1,37 @@
1
- /**
2
- * Login Command - Authenticate the Skillsmith CLI
3
- *
4
- * SMI-2715: CLI Login Device Flow
5
- *
6
- * Opens the Skillsmith dashboard in the browser (or prints the URL for
7
- * headless/CI environments), prompts for an API key with masked input,
8
- * validates the format, and stores it securely via @skillsmith/core.
9
- *
10
- * Security notes:
11
- * - No --key <value> flag: would expose the secret in ps aux / shell history
12
- * - Headless path: SKILLSMITH_API_KEY env var (documented in README)
13
- * - Always-masked input: @inquirer/prompts password() renders bullets
14
- */
1
+ // SMI-4402: RFC 8628 device-code OAuth flow replacing paste-key model.
2
+ // --paste-legacy retained as deliberate opt-out (L1 deprecation window).
3
+ // SMI-4454: client_meta on auth-device-code; paste-flow ground-truth echo.
4
+ import { hostname } from 'node:os';
15
5
  import { Command } from 'commander';
16
6
  import { password } from '@inquirer/prompts';
17
7
  import chalk from 'chalk';
18
- import { getAuthStatus, storeApiKey, isValidApiKeyFormat } from '@skillsmith/core';
19
- /** URL where users generate their CLI API token */
20
- const CLI_TOKEN_URL = 'https://skillsmith.app/account/cli-token';
21
- /**
22
- * Detect whether the current environment is headless (no interactive display).
23
- * On Linux without DISPLAY, opening a browser will fail silently.
24
- */
25
- function isHeadlessEnvironment() {
8
+ import { getApiKey, getApiBaseUrl, loadCredentials, storeCredentials, storeApiKey, isValidApiKeyFormat, } from '@skillsmith/core';
9
+ import { VERSION as CLI_VERSION } from '../version.js';
10
+ const DEVICE_PAGE_URL = 'https://skillsmith.app/device';
11
+ const DEVICE_CODE_TIMEOUT_MS = 15 * 60 * 1000;
12
+ const POLL_MS = 5_000;
13
+ const SLOW_DOWN_MS = 10_000;
14
+ // Per plan spec §Wave 3 CLI matrix (C6)
15
+ const EXIT = { success: 0, generic: 1, cancelled: 2, authError: 3, timeout: 4, network: 5 };
16
+ function termCols() {
17
+ return Math.max(40, (process.stdout.columns ?? 80) - 4);
18
+ }
19
+ // OSC 8 hyperlink — degrades to plain URL in unsupported terminals
20
+ function oscLink(label, url) {
21
+ if (!process.stdout.isTTY)
22
+ return url;
23
+ return `\x1b]8;;${url}\x07${label}\x1b]8;;\x07`;
24
+ }
25
+ function renderCodeBox(userCode) {
26
+ const raw = userCode.replace(/-/g, '').toUpperCase();
27
+ const display = raw.length >= 8 ? `${raw.slice(0, 4)}-${raw.slice(4, 8)}` : raw;
28
+ const inner = ` ${display} `;
29
+ const bar = '─'.repeat(inner.length);
30
+ return `┌${bar}┐\n│${inner}│\n└${bar}┘`;
31
+ }
32
+ function isHeadless() {
26
33
  return process.env['CI'] === 'true' || (process.platform === 'linux' && !process.env['DISPLAY']);
27
34
  }
28
- /**
29
- * Attempt to open a URL in the default browser.
30
- * Returns true if the browser was opened, false otherwise.
31
- */
32
35
  async function tryOpenBrowser(url) {
33
36
  try {
34
37
  const { default: open } = await import('open');
@@ -39,83 +42,268 @@ async function tryOpenBrowser(url) {
39
42
  return false;
40
43
  }
41
44
  }
42
- /**
43
- * Create the `skillsmith login` command.
44
- *
45
- * Options:
46
- * --no-browser Print URL instead of opening browser (for CI/headless)
47
- */
48
- export function createLoginCommand() {
49
- return new Command('login')
50
- .description('Authenticate the Skillsmith CLI with your API key')
51
- .option('--no-browser', 'Print URL instead of opening browser (for CI/headless)')
52
- .action(async (options) => {
53
- // 1. Check if already authenticated
54
- const status = await getAuthStatus();
55
- if (status.authenticated) {
56
- console.log(`Already authenticated (${status.keyPrefix}...). ` +
57
- `Run \`skillsmith logout\` first to switch accounts.`);
58
- process.exit(0);
45
+ // Returns the legacy sk_live_* key from env or config file, or null.
46
+ function detectLegacyKey() {
47
+ const envKey = process.env['SKILLSMITH_API_KEY'];
48
+ if (envKey && /^sk_live_/.test(envKey))
49
+ return envKey;
50
+ const cfgKey = getApiKey();
51
+ if (cfgKey && /^sk_live_/.test(cfgKey))
52
+ return cfgKey;
53
+ return null;
54
+ }
55
+ function functionUrl(name) {
56
+ const base = getApiBaseUrl();
57
+ // getApiBaseUrl() already ends with /functions/v1 in production
58
+ return base.endsWith('/functions/v1') ? `${base}/${name}` : `${base}/functions/v1/${name}`;
59
+ }
60
+ async function requestDeviceCode() {
61
+ // SMI-4454: send CLI identity so /device approval page can surface a
62
+ // device-recognition cue ("is this really my terminal?") before approve.
63
+ // Server-side length caps (see supabase/migrations/082) are the defense —
64
+ // this payload is best-effort identity, not security-relevant.
65
+ const res = await fetch(functionUrl('auth-device-code'), {
66
+ method: 'POST',
67
+ headers: { 'Content-Type': 'application/json' },
68
+ body: JSON.stringify({
69
+ client_type: 'cli',
70
+ client_meta: {
71
+ cli_version: CLI_VERSION,
72
+ node_version: process.version,
73
+ platform: process.platform,
74
+ arch: process.arch,
75
+ hostname: hostname(),
76
+ },
77
+ }),
78
+ });
79
+ if (!res.ok)
80
+ throw new Error(`auth-device-code HTTP ${res.status}`);
81
+ return res.json();
82
+ }
83
+ async function pollDeviceToken(deviceCode) {
84
+ const res = await fetch(functionUrl('auth-device-token'), {
85
+ method: 'POST',
86
+ headers: { 'Content-Type': 'application/json' },
87
+ body: JSON.stringify({ device_code: deviceCode }),
88
+ });
89
+ if (res.status === 428)
90
+ return { ok: false, status: 'pending' };
91
+ if (res.status === 429)
92
+ return { ok: false, status: 'slow_down' };
93
+ const body = (await res.json().catch(() => ({})));
94
+ if (!res.ok) {
95
+ const err = body['error'] ?? '';
96
+ if (err === 'expired_token')
97
+ return { ok: false, status: 'expired' };
98
+ if (err === 'authorization_declined')
99
+ return { ok: false, status: 'declined' };
100
+ throw new Error(`auth-device-token error: ${err || res.status}`);
101
+ }
102
+ if (typeof body['error'] === 'string') {
103
+ const errVal = body['error'];
104
+ if (errVal === 'authorization_pending')
105
+ return { ok: false, status: 'pending' };
106
+ if (errVal === 'slow_down')
107
+ return { ok: false, status: 'slow_down' };
108
+ if (errVal === 'expired_token')
109
+ return { ok: false, status: 'expired' };
110
+ if (errVal === 'authorization_declined')
111
+ return { ok: false, status: 'declined' };
112
+ throw new Error(`auth-device-token error: ${errVal}`);
113
+ }
114
+ const expiresIn = body['expires_in'] ?? 3600;
115
+ return {
116
+ ok: true,
117
+ creds: {
118
+ accessToken: body['access_token'],
119
+ refreshToken: body['refresh_token'],
120
+ expiresAt: Date.now() + expiresIn * 1000,
121
+ },
122
+ };
123
+ }
124
+ async function runDeviceCodeFlow(noBrowser) {
125
+ let dc;
126
+ try {
127
+ dc = await requestDeviceCode();
128
+ }
129
+ catch (err) {
130
+ if (process.stdout.isTTY) {
131
+ console.error(chalk.red('Network error requesting device code.'));
132
+ if (err instanceof Error)
133
+ console.error(chalk.dim(err.message));
134
+ }
135
+ else {
136
+ process.stderr.write(JSON.stringify({
137
+ error: 'network_error',
138
+ message: err instanceof Error ? err.message : String(err),
139
+ }) + '\n');
140
+ }
141
+ process.exit(EXIT.network);
142
+ }
143
+ const approveUrl = `${DEVICE_PAGE_URL}?user_code=${encodeURIComponent(dc.user_code)}`;
144
+ const width = termCols();
145
+ console.log();
146
+ console.log(chalk.bold('Your one-time code:'));
147
+ console.log(chalk.cyan(renderCodeBox(dc.user_code)));
148
+ console.log();
149
+ console.log(`Enter it at: ${oscLink(chalk.cyan(DEVICE_PAGE_URL), DEVICE_PAGE_URL)}`.slice(0, width));
150
+ console.log(chalk.dim('Code expires in 15 minutes.'));
151
+ console.log();
152
+ if (!noBrowser && !isHeadless()) {
153
+ const opened = await tryOpenBrowser(approveUrl);
154
+ console.log(opened
155
+ ? chalk.dim('Browser opened — approve the request, then return here.')
156
+ : chalk.dim(`Could not open browser. Visit the URL above.`));
157
+ }
158
+ else if (noBrowser) {
159
+ console.log(chalk.dim('--no-browser: visit the URL above to approve.'));
160
+ }
161
+ console.log(chalk.dim('Waiting for approval…'));
162
+ let pollMs = POLL_MS;
163
+ const deadline = Date.now() + DEVICE_CODE_TIMEOUT_MS;
164
+ while (Date.now() < deadline) {
165
+ await new Promise((r) => setTimeout(r, pollMs));
166
+ let result;
167
+ try {
168
+ result = await pollDeviceToken(dc.device_code);
59
169
  }
60
- // 2. Open browser or print URL
61
- const headless = isHeadlessEnvironment();
62
- const shouldOpenBrowser = options.browser && !headless;
63
- if (shouldOpenBrowser) {
64
- const opened = await tryOpenBrowser(CLI_TOKEN_URL);
65
- if (opened) {
66
- console.log(`Opening ${chalk.cyan(CLI_TOKEN_URL)} in your browser...`);
170
+ catch (err) {
171
+ if (process.stdout.isTTY) {
172
+ console.error(chalk.red('\nNetwork error while polling.'));
173
+ if (err instanceof Error)
174
+ console.error(chalk.dim(err.message));
67
175
  }
68
176
  else {
69
- console.log(`Could not open browser. Visit this URL manually:`);
70
- console.log(chalk.cyan(CLI_TOKEN_URL));
177
+ process.stderr.write(JSON.stringify({
178
+ error: 'network_error',
179
+ message: err instanceof Error ? err.message : String(err),
180
+ }) + '\n');
71
181
  }
182
+ process.exit(EXIT.network);
72
183
  }
73
- else {
74
- console.log(`Visit this URL to get your API key:`);
75
- console.log(chalk.cyan(CLI_TOKEN_URL));
184
+ if (!result.ok) {
185
+ if (result.status === 'pending')
186
+ continue;
187
+ if (result.status === 'slow_down') {
188
+ pollMs = SLOW_DOWN_MS;
189
+ continue;
190
+ }
191
+ if (result.status === 'expired') {
192
+ console.error(chalk.red('\nCode expired. Run `skillsmith login` again.'));
193
+ process.exit(EXIT.timeout);
194
+ }
195
+ // declined
196
+ console.error(chalk.red('\nRequest denied. Run `skillsmith login` again if this was a mistake.'));
197
+ process.exit(EXIT.authError);
76
198
  }
77
- // 3. Prompt for masked API key (up to 3 format-validation failures)
78
- console.log('\nAfter authenticating, copy the API key shown and paste it below.');
79
- let attempts = 0;
80
- const MAX_ATTEMPTS = 3;
81
- try {
82
- while (attempts < MAX_ATTEMPTS) {
83
- const raw = await password({ message: 'Paste your API key:' });
84
- if (!isValidApiKeyFormat(raw)) {
85
- attempts++;
86
- if (attempts < MAX_ATTEMPTS) {
87
- console.error(chalk.red(`That doesn't look like a valid key (expected: sk_live_...). ` +
88
- `Try again (${attempts} of ${MAX_ATTEMPTS}).`));
89
- }
90
- continue;
91
- }
92
- // Valid format store and exit
93
- try {
94
- await storeApiKey(raw);
95
- }
96
- catch (storeErr) {
97
- console.error(chalk.red('\nFailed to store credentials: ' +
98
- (storeErr instanceof Error ? storeErr.message : String(storeErr))));
99
- process.exit(1);
199
+ await storeCredentials({ ...result.creds, version: 2 });
200
+ console.log(chalk.green('\nLogged in successfully.'));
201
+ // SMI-4447: close the "did it work?" gap post-login. A single concrete command the
202
+ // user can run in-terminal beats a URL (phishing-safe, no browser context switch).
203
+ console.log(chalk.dim(' Try it: skillsmith skills list'));
204
+ process.exit(EXIT.success);
205
+ }
206
+ console.error(chalk.red('\nApproval timed out. Run `skillsmith login` again.'));
207
+ process.exit(EXIT.timeout);
208
+ }
209
+ async function runPasteLegacyFlow() {
210
+ console.log(`\nVisit: ${chalk.cyan('https://skillsmith.app/account/cli-token')}`);
211
+ console.log('Copy your API key and paste it below.\n');
212
+ let attempts = 0;
213
+ try {
214
+ while (attempts < 3) {
215
+ // SMI-4454: default `•` mask is invisible in some embedded PTYs
216
+ // (Claude Code's among them). Denser ASCII mask + post-paste echo
217
+ // gives the user a ground-truth signal even when the mask character
218
+ // is stripped by the terminal emulator. Echo fires for both valid
219
+ // and invalid keys (validation error follows).
220
+ const raw = await password({
221
+ message: 'Paste your API key:',
222
+ mask: '*',
223
+ });
224
+ console.log(chalk.dim(` Received ${raw.length} characters — validating…`));
225
+ if (!isValidApiKeyFormat(raw)) {
226
+ attempts++;
227
+ if (attempts < 3) {
228
+ console.error(chalk.red(`Invalid format (expected sk_live_…). Try again (${attempts}/3).`));
100
229
  }
101
- console.log(chalk.green('\nLogged in successfully.'));
102
- console.log(chalk.dim(' Note: your API key may still be in your clipboard. Clear it when done.'));
103
- process.exit(0);
230
+ continue;
231
+ }
232
+ try {
233
+ await storeApiKey(raw);
234
+ }
235
+ catch (err) {
236
+ console.error(chalk.red('Failed to store credentials: ' + (err instanceof Error ? err.message : String(err))));
237
+ process.exit(EXIT.generic);
104
238
  }
239
+ console.log(chalk.green('\nLogged in successfully.'));
240
+ console.log(chalk.dim(' Clear your clipboard when done.'));
241
+ process.exit(EXIT.success);
105
242
  }
106
- catch (promptErr) {
107
- // @inquirer/prompts throws ExitPromptError on Ctrl+C — exit cleanly
108
- const name = promptErr.name;
109
- if (name === 'ExitPromptError') {
110
- console.log(chalk.dim('\nCancelled.'));
111
- process.exit(0);
243
+ }
244
+ catch (err) {
245
+ if (err.name === 'ExitPromptError') {
246
+ console.log(chalk.dim('\nCancelled.'));
247
+ process.exit(EXIT.cancelled);
248
+ }
249
+ throw err;
250
+ }
251
+ console.error(chalk.red('\nToo many invalid attempts.'));
252
+ console.error(chalk.cyan('https://skillsmith.app/account/cli-token'));
253
+ process.exit(EXIT.generic);
254
+ }
255
+ export function createLoginCommand() {
256
+ return new Command('login')
257
+ .description('Authenticate the Skillsmith CLI')
258
+ .option('--no-browser', 'Print URL instead of opening browser (for CI/headless)')
259
+ .option('--paste-legacy', 'Use legacy API-key paste flow')
260
+ .action(async (options) => {
261
+ // Already authenticated via JWT?
262
+ const existing = await loadCredentials();
263
+ if (existing && Date.now() < existing.expiresAt) {
264
+ console.log('Already authenticated. Run `skillsmith logout` to switch accounts.');
265
+ process.exit(EXIT.success);
266
+ }
267
+ // Legacy key detection: offer 3-choice menu (M10)
268
+ const legacyKey = detectLegacyKey();
269
+ if (legacyKey && !options.pasteLegacy) {
270
+ console.log();
271
+ console.log(chalk.yellow('A legacy API key is active.'));
272
+ console.log();
273
+ console.log(` ${chalk.bold('(a)')} Keep using this key [Enter]`);
274
+ console.log(` ${chalk.bold('(d)')} Switch to device-code flow`);
275
+ console.log(` ${chalk.bold('(p)')} Paste a new legacy key`);
276
+ console.log();
277
+ const { default: readline } = await import('readline');
278
+ const rl = readline.createInterface({
279
+ input: process.stdin,
280
+ output: process.stdout,
281
+ terminal: false,
282
+ });
283
+ const choice = await new Promise((resolve) => {
284
+ process.stdout.write('Choice [a]: ');
285
+ rl.once('line', (line) => {
286
+ rl.close();
287
+ resolve(line.trim().toLowerCase());
288
+ });
289
+ });
290
+ if (choice === '' || choice === 'a') {
291
+ console.log(chalk.dim('Keeping existing key.'));
292
+ process.exit(EXIT.success);
112
293
  }
113
- throw promptErr;
294
+ else if (choice === 'p') {
295
+ await runPasteLegacyFlow();
296
+ return;
297
+ }
298
+ // 'd' or anything else → device flow
299
+ await runDeviceCodeFlow(!options.browser);
300
+ return;
301
+ }
302
+ if (options.pasteLegacy) {
303
+ await runPasteLegacyFlow();
304
+ return;
114
305
  }
115
- // Exhausted all attempts
116
- console.error(chalk.red('\nToo many invalid attempts. Get a new key at:'));
117
- console.error(chalk.cyan(CLI_TOKEN_URL));
118
- process.exit(1);
306
+ await runDeviceCodeFlow(!options.browser);
119
307
  });
120
308
  }
121
309
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,2 @@
1
- /**
2
- * SMI-2715: Login Command Tests
3
- *
4
- * Tests for `skillsmith login` — already-authenticated guard, browser/headless
5
- * URL display, masked input prompting, format validation retries, and storage.
6
- */
7
1
  export {};
8
2
  //# sourceMappingURL=login.test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.test.d.ts","sourceRoot":"","sources":["../../../src/commands/login.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
1
+ {"version":3,"file":"login.test.d.ts","sourceRoot":"","sources":["../../../src/commands/login.test.ts"],"names":[],"mappings":""}