hacklab 0.6.0 → 0.6.2
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/dist/commands/brag.js +4 -4
- package/dist/commands/brag.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +16 -12
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/drop.d.ts +9 -0
- package/dist/commands/drop.d.ts.map +1 -1
- package/dist/commands/drop.js +33 -4
- package/dist/commands/drop.js.map +1 -1
- package/dist/commands/join.d.ts +3 -1
- package/dist/commands/join.d.ts.map +1 -1
- package/dist/commands/join.js +31 -3
- package/dist/commands/join.js.map +1 -1
- package/dist/commands/login.d.ts +18 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +156 -19
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +15 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/org.js +5 -5
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +9 -1
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +10 -2
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +27 -88
- package/dist/index.js.map +1 -1
- package/dist/registry.d.ts +15 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +77 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolve-command.d.ts +0 -1
- package/dist/resolve-command.d.ts.map +1 -1
- package/dist/resolve-command.js +2 -17
- package/dist/resolve-command.js.map +1 -1
- package/dist/session.d.ts +26 -5
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +55 -8
- package/dist/session.js.map +1 -1
- package/dist/share.d.ts +2 -2
- package/dist/share.js +2 -2
- package/dist/sync.d.ts +18 -34
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +47 -686
- package/dist/sync.js.map +1 -1
- package/dist/ui.d.ts +2 -0
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +4 -0
- package/dist/ui.js.map +1 -1
- package/dist/utils/openBrowser.d.ts +12 -0
- package/dist/utils/openBrowser.d.ts.map +1 -1
- package/dist/utils/openBrowser.js +30 -12
- package/dist/utils/openBrowser.js.map +1 -1
- package/package.json +3 -2
- package/dist/commands/company.d.ts +0 -2
- package/dist/commands/company.d.ts.map +0 -1
- package/dist/commands/company.js +0 -214
- package/dist/commands/company.js.map +0 -1
- package/dist/commands/exam.d.ts +0 -5
- package/dist/commands/exam.d.ts.map +0 -1
- package/dist/commands/exam.js +0 -224
- package/dist/commands/exam.js.map +0 -1
- package/dist/commands/scan-profile.d.ts +0 -33
- package/dist/commands/scan-profile.d.ts.map +0 -1
- package/dist/commands/scan-profile.js +0 -279
- package/dist/commands/scan-profile.js.map +0 -1
- package/dist/dd.d.ts +0 -3
- package/dist/dd.d.ts.map +0 -1
- package/dist/dd.js +0 -28
- package/dist/dd.js.map +0 -1
package/dist/commands/login.js
CHANGED
|
@@ -1,13 +1,134 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
2
|
import * as clack from '@clack/prompts';
|
|
3
3
|
import { getAppUrl, saveSession } from '../session.js';
|
|
4
|
-
import { dim, info, success } from '../ui.js';
|
|
4
|
+
import { bold, dim, info, linkBlue, success, white } from '../ui.js';
|
|
5
5
|
import { openBrowser } from '../utils/openBrowser.js';
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Authenticate and save a session. Two paths to the same result:
|
|
8
|
+
* - device-code flow (the default): GitHub's device flow — authorize on
|
|
9
|
+
* github.com/login/device (signed into GitHub, not Hacklab), and the backend
|
|
10
|
+
* maps your GitHub identity to the linked Hacklab account. No local server,
|
|
11
|
+
* no port forwarding, no localhost/app URL. Works the same everywhere.
|
|
12
|
+
* - localhost-callback flow (only with `--browser`): opens the browser and
|
|
13
|
+
* catches the OAuth redirect on a local server.
|
|
14
|
+
*
|
|
15
|
+
* `allowSignup` (set by `join`) lets the device flow *create* an account when
|
|
16
|
+
* the GitHub identity has none yet; `login` leaves it off, so an unknown GitHub
|
|
17
|
+
* is told to run `join`. The callback flow always creates-or-logs-in via real
|
|
18
|
+
* OAuth, so it's signup-capable regardless.
|
|
19
|
+
*/
|
|
20
|
+
export async function login(opts = {}) {
|
|
7
21
|
clack.intro('hacklab login');
|
|
8
22
|
const appUrl = getAppUrl();
|
|
9
|
-
|
|
10
|
-
|
|
23
|
+
let creds = null;
|
|
24
|
+
if (!opts.browser) {
|
|
25
|
+
// Device flow is the default. null = this backend has no device routes yet
|
|
26
|
+
// (e.g. not deployed) — the only case we fall back to the browser flow,
|
|
27
|
+
// since there's no device flow to use there.
|
|
28
|
+
creds = await loginViaDevice(appUrl, opts.allowSignup ?? false);
|
|
29
|
+
if (!creds) {
|
|
30
|
+
info(dim('device login unavailable on this server — using browser sign-in.'));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (!creds) {
|
|
34
|
+
creds = await loginViaCallback(appUrl);
|
|
35
|
+
}
|
|
36
|
+
await saveSession({
|
|
37
|
+
token: creds.token,
|
|
38
|
+
email: creds.email,
|
|
39
|
+
handle: creds.handle,
|
|
40
|
+
appUrl,
|
|
41
|
+
savedAt: new Date().toISOString(),
|
|
42
|
+
expiresAt: creds.expiresAt,
|
|
43
|
+
});
|
|
44
|
+
const label = creds.handle ? `${creds.email} (${creds.handle})` : creds.email;
|
|
45
|
+
success(`logged in as ${label}`);
|
|
46
|
+
clack.outro(dim('hack the planet.'));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Device-code flow. Returns the credentials on approval, or null if the backend
|
|
50
|
+
* doesn't support it (so the caller can fall back). Throws on an explicit
|
|
51
|
+
* denial, expiry, or timeout.
|
|
52
|
+
*/
|
|
53
|
+
async function loginViaDevice(appUrl, allowSignup) {
|
|
54
|
+
let startRes;
|
|
55
|
+
try {
|
|
56
|
+
startRes = await fetch(`${appUrl}/api/cli/device/start`, {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
signal: AbortSignal.timeout(15_000),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Connection refused / DNS / timeout — the server isn't reachable. Name the
|
|
63
|
+
// URL so the cause (e.g. local dev app not running) is obvious.
|
|
64
|
+
throw new Error(`could not reach ${appUrl} — is the server running?`);
|
|
65
|
+
}
|
|
66
|
+
// Older backend without the device routes — let login fall back to callback.
|
|
67
|
+
if (startRes.status === 404)
|
|
68
|
+
return null;
|
|
69
|
+
if (!startRes.ok) {
|
|
70
|
+
throw new Error(`could not start device login (${startRes.status})`);
|
|
71
|
+
}
|
|
72
|
+
const start = (await startRes.json());
|
|
73
|
+
// GitHub's device flow: the user authorizes on github.com, signed into GitHub
|
|
74
|
+
// (not Hacklab). We map the resulting GitHub identity to their linked account.
|
|
75
|
+
// `format` overrides clack's default dim styling: body text white, URL blue.
|
|
76
|
+
clack.note(`open GitHub and authorize Hacklab:\n ${start.verificationUri}\n\nthen enter this code:\n ${bold(start.userCode)}`, 'sign in with github', {
|
|
77
|
+
format: (line) => line.includes(start.verificationUri) ? linkBlue(line) : white(line),
|
|
78
|
+
});
|
|
79
|
+
info(dim('opening your browser to GitHub (or open the link above yourself).'));
|
|
80
|
+
void openBrowser(start.verificationUriComplete ?? start.verificationUri);
|
|
81
|
+
const intervalMs = Math.max(1000, (Number(start.interval) || 5) * 1000);
|
|
82
|
+
const deadline = Date.now() + (Number(start.expiresIn) || 900) * 1000;
|
|
83
|
+
const spin = clack.spinner();
|
|
84
|
+
spin.start('waiting for you to authorize on GitHub');
|
|
85
|
+
while (Date.now() < deadline) {
|
|
86
|
+
let data = null;
|
|
87
|
+
try {
|
|
88
|
+
const res = await fetch(`${appUrl}/api/cli/device/poll`, {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers: { 'Content-Type': 'application/json' },
|
|
91
|
+
body: JSON.stringify({ deviceCode: start.deviceCode, allowSignup }),
|
|
92
|
+
signal: AbortSignal.timeout(10_000),
|
|
93
|
+
});
|
|
94
|
+
// Back off naturally on a rate-limit; otherwise read the status.
|
|
95
|
+
if (res.status !== 429)
|
|
96
|
+
data = await res.json().catch(() => null);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Transient network error — keep polling until the deadline.
|
|
100
|
+
}
|
|
101
|
+
const status = data?.status;
|
|
102
|
+
if (status === 'approved' && data?.token && data.email) {
|
|
103
|
+
spin.stop('approved');
|
|
104
|
+
return {
|
|
105
|
+
token: data.token,
|
|
106
|
+
email: data.email,
|
|
107
|
+
handle: data.handle,
|
|
108
|
+
expiresAt: data.expiresAt,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (status === 'denied') {
|
|
112
|
+
spin.stop('denied');
|
|
113
|
+
throw new Error('authorization was denied on GitHub.');
|
|
114
|
+
}
|
|
115
|
+
if (status === 'expired') {
|
|
116
|
+
spin.stop('code expired');
|
|
117
|
+
throw new Error('the code expired — run `hacklab login` again.');
|
|
118
|
+
}
|
|
119
|
+
if (status === 'no_account') {
|
|
120
|
+
spin.stop('no linked account');
|
|
121
|
+
const who = typeof data?.login === 'string' ? ` (@${data.login})` : '';
|
|
122
|
+
throw new Error(`no hacklab account is linked to that GitHub${who}. run \`hacklab join\` to register.`);
|
|
123
|
+
}
|
|
124
|
+
await sleep(intervalMs);
|
|
125
|
+
}
|
|
126
|
+
spin.stop('timed out');
|
|
127
|
+
throw new Error('login timed out — run `hacklab login` again.');
|
|
128
|
+
}
|
|
129
|
+
/** Localhost-callback flow: open the browser, catch the OAuth redirect locally. */
|
|
130
|
+
async function loginViaCallback(appUrl) {
|
|
131
|
+
return await new Promise((resolve, reject) => {
|
|
11
132
|
let timeout;
|
|
12
133
|
const server = createServer((req, res) => {
|
|
13
134
|
const url = new URL(req.url ?? '/', `http://localhost`);
|
|
@@ -30,7 +151,14 @@ export async function login() {
|
|
|
30
151
|
expiresAt,
|
|
31
152
|
});
|
|
32
153
|
});
|
|
33
|
-
|
|
154
|
+
// Bind 0 = a random free port. On a headless host you can't open the
|
|
155
|
+
// browser locally, so the user opens the URL elsewhere and the OAuth
|
|
156
|
+
// redirect must reach this callback server — which means forwarding the
|
|
157
|
+
// port (e.g. `ssh -L`). Pin it with HACKLAB_CALLBACK_PORT so the forward is
|
|
158
|
+
// deterministic across runs. (Headless usually uses the device flow above,
|
|
159
|
+
// so this hint is a fallback for a misdetected display.)
|
|
160
|
+
const callbackPort = Number(process.env.HACKLAB_CALLBACK_PORT) || 0;
|
|
161
|
+
server.listen(callbackPort, '127.0.0.1', () => {
|
|
34
162
|
const addr = server.address();
|
|
35
163
|
if (!addr || typeof addr === 'string') {
|
|
36
164
|
stopServer();
|
|
@@ -39,10 +167,15 @@ export async function login() {
|
|
|
39
167
|
}
|
|
40
168
|
const callbackUrl = `http://127.0.0.1:${addr.port}`;
|
|
41
169
|
const loginUrl = `${appUrl}/cli/auth?callback=${encodeURIComponent(callbackUrl)}`;
|
|
42
|
-
info(
|
|
43
|
-
info(`if it doesn't open, visit:`);
|
|
170
|
+
info('to sign in, open this URL in a browser:');
|
|
44
171
|
info(` ${loginUrl}`);
|
|
45
|
-
|
|
172
|
+
if (isLikelyHeadless()) {
|
|
173
|
+
info(dim('headless? drop --browser to use the device code, or forward the port:'));
|
|
174
|
+
info(dim(` ssh -L ${addr.port}:localhost:${addr.port} <this-host>`));
|
|
175
|
+
info(dim(' (pin it with HACKLAB_CALLBACK_PORT to reuse one forward)'));
|
|
176
|
+
}
|
|
177
|
+
// Best-effort auto-open — crash-safe, and a harmless no-op on headless.
|
|
178
|
+
void openBrowser(loginUrl);
|
|
46
179
|
});
|
|
47
180
|
// Timeout after 2 minutes
|
|
48
181
|
timeout = setTimeout(() => {
|
|
@@ -55,17 +188,9 @@ export async function login() {
|
|
|
55
188
|
server.close();
|
|
56
189
|
}
|
|
57
190
|
});
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
handle,
|
|
62
|
-
appUrl,
|
|
63
|
-
savedAt: new Date().toISOString(),
|
|
64
|
-
expiresAt,
|
|
65
|
-
});
|
|
66
|
-
const label = handle ? `${email} (${handle})` : email;
|
|
67
|
-
success(`logged in as ${label}`);
|
|
68
|
-
clack.outro(dim('hack the planet.'));
|
|
191
|
+
}
|
|
192
|
+
function sleep(ms) {
|
|
193
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
69
194
|
}
|
|
70
195
|
function normalizeDateParam(value) {
|
|
71
196
|
if (!value)
|
|
@@ -73,4 +198,16 @@ function normalizeDateParam(value) {
|
|
|
73
198
|
const date = new Date(value);
|
|
74
199
|
return Number.isNaN(date.getTime()) ? undefined : date.toISOString();
|
|
75
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Heuristic for "this host probably can't pop a browser": a Linux/Unix box with
|
|
203
|
+
* no display server. macOS and Windows always have a usable GUI opener. Only
|
|
204
|
+
* used inside the `--browser` flow to decide whether to print the port-forward
|
|
205
|
+
* hint — it no longer gates device-vs-browser (device is always the default).
|
|
206
|
+
*/
|
|
207
|
+
function isLikelyHeadless() {
|
|
208
|
+
if (process.platform === 'darwin' || process.platform === 'win32') {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
return !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY;
|
|
212
|
+
}
|
|
76
213
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,kBAa3B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { clearSession, loadSession } from '../session.js';
|
|
2
|
+
import { dim, info, success } from '../ui.js';
|
|
3
|
+
export async function logout() {
|
|
4
|
+
// Read who we're logged in as first (for the confirmation), then clear.
|
|
5
|
+
const session = await loadSession();
|
|
6
|
+
const removed = await clearSession();
|
|
7
|
+
if (!removed) {
|
|
8
|
+
info('not logged in');
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const who = session?.handle ?? session?.email;
|
|
12
|
+
success(who ? `logged out (${who})` : 'logged out');
|
|
13
|
+
info(dim('run `hacklab login` to sign back in'));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAE7C,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,wEAAwE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;IACnC,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAA;IAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,eAAe,CAAC,CAAA;QACrB,OAAM;IACR,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,KAAK,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IACnD,IAAI,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAA;AAClD,CAAC"}
|
package/dist/commands/org.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as clack from '@clack/prompts';
|
|
2
|
-
import { loadSession } from '../session.js';
|
|
2
|
+
import { loadSession, resolveAppUrl } from '../session.js';
|
|
3
3
|
import { bold, dim, error, info, success } from '../ui.js';
|
|
4
4
|
const FIELDS = [
|
|
5
5
|
{ key: 'name', label: 'Name', type: 'text' },
|
|
@@ -33,7 +33,7 @@ function displayValue(spec, value) {
|
|
|
33
33
|
return s.length > 48 ? `${s.slice(0, 47)}…` : s;
|
|
34
34
|
}
|
|
35
35
|
async function fetchOrgs(session) {
|
|
36
|
-
const res = await fetch(`${session
|
|
36
|
+
const res = await fetch(`${resolveAppUrl(session)}/api/cli/org`, {
|
|
37
37
|
headers: { Authorization: `Bearer ${session.token}` },
|
|
38
38
|
});
|
|
39
39
|
const data = await res.json().catch(() => null);
|
|
@@ -43,7 +43,7 @@ async function fetchOrgs(session) {
|
|
|
43
43
|
return (data?.organizations ?? []);
|
|
44
44
|
}
|
|
45
45
|
async function patchOrg(session, orgId, fields) {
|
|
46
|
-
const res = await fetch(`${session
|
|
46
|
+
const res = await fetch(`${resolveAppUrl(session)}/api/cli/org`, {
|
|
47
47
|
method: 'PATCH',
|
|
48
48
|
headers: {
|
|
49
49
|
'Content-Type': 'application/json',
|
|
@@ -138,7 +138,7 @@ export async function org() {
|
|
|
138
138
|
process.exit(1);
|
|
139
139
|
}
|
|
140
140
|
if (orgs.length === 0) {
|
|
141
|
-
clack.cancel(`you don't manage an organization yet — claim one at ${session
|
|
141
|
+
clack.cancel(`you don't manage an organization yet — claim one at ${resolveAppUrl(session)} first.`);
|
|
142
142
|
process.exit(1);
|
|
143
143
|
}
|
|
144
144
|
let target = orgs[0];
|
|
@@ -207,7 +207,7 @@ export async function org() {
|
|
|
207
207
|
}
|
|
208
208
|
if (savedCount > 0) {
|
|
209
209
|
success(`saved ${savedCount} change${savedCount === 1 ? '' : 's'} to ${bold(target.name)}`);
|
|
210
|
-
info(`${session
|
|
210
|
+
info(`${resolveAppUrl(session)}/o/${target.slug}`);
|
|
211
211
|
}
|
|
212
212
|
clack.outro(dim('done.'));
|
|
213
213
|
}
|
package/dist/commands/org.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/commands/org.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,WAAW,EAAgB,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/commands/org.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAWA,wBAAsB,IAAI,kBAyEzB"}
|
package/dist/commands/sync.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as clack from '@clack/prompts';
|
|
2
2
|
import { loadSessionState } from '../session.js';
|
|
3
|
-
import { checkSession, formatTokens, runSync } from '../sync.js';
|
|
3
|
+
import { checkSession, formatTokens, runSync, syncGithubRepos, } from '../sync.js';
|
|
4
4
|
import { bold, dim, error, info, success } from '../ui.js';
|
|
5
5
|
export async function sync() {
|
|
6
6
|
const sessionState = await loadSessionState();
|
|
@@ -50,6 +50,14 @@ export async function sync() {
|
|
|
50
50
|
if (Number(r.tokensDelta) > 0) {
|
|
51
51
|
info(` +${formatTokens(Number(r.tokensDelta))} since last sync`);
|
|
52
52
|
}
|
|
53
|
+
// Mirror pinned GitHub repos into projects (best-effort; never fails sync).
|
|
54
|
+
const repos = await syncGithubRepos(session);
|
|
55
|
+
if (repos && (repos.synced > 0 || repos.removed > 0)) {
|
|
56
|
+
const parts = [`${repos.synced} project${repos.synced === 1 ? '' : 's'}`];
|
|
57
|
+
if (repos.removed > 0)
|
|
58
|
+
parts.push(`removed ${repos.removed}`);
|
|
59
|
+
info(` github: ${parts.join(', ')}`);
|
|
60
|
+
}
|
|
53
61
|
clack.outro(dim('synced.'));
|
|
54
62
|
}
|
|
55
63
|
//# sourceMappingURL=sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,kBAwB3B"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { loadSession } from '../session.js';
|
|
1
|
+
import { loadSession, resolveAppUrl } from '../session.js';
|
|
2
2
|
import { dim, error, info, success } from '../ui.js';
|
|
3
3
|
export async function whoami() {
|
|
4
4
|
const session = await loadSession();
|
|
@@ -7,11 +7,19 @@ export async function whoami() {
|
|
|
7
7
|
info(`run ${dim('hacklab login')} to authenticate`);
|
|
8
8
|
process.exit(1);
|
|
9
9
|
}
|
|
10
|
+
// The backend commands will actually hit, honoring --env / HACKLAB_APP_URL.
|
|
11
|
+
const server = resolveAppUrl(session);
|
|
12
|
+
const loginServer = session.appUrl.replace(/\/$/, '');
|
|
10
13
|
success(session.handle ?? session.email);
|
|
11
14
|
info(`email: ${session.email}`);
|
|
12
15
|
if (session.handle) {
|
|
13
16
|
info(`handle: ${session.handle}`);
|
|
14
17
|
}
|
|
15
|
-
info(`server: ${
|
|
18
|
+
info(`server: ${server}`);
|
|
19
|
+
// An --env override can point requests somewhere this session's token isn't
|
|
20
|
+
// valid (tokens are per-backend) — flag where you actually logged in.
|
|
21
|
+
if (server !== loginServer) {
|
|
22
|
+
info(dim(`(logged in against ${loginServer} — token may not work here)`));
|
|
23
|
+
}
|
|
16
24
|
}
|
|
17
25
|
//# sourceMappingURL=whoami.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAEpD,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;IAEnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,eAAe,CAAC,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAA;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,4EAA4E;IAC5E,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAErD,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA;IACxC,IAAI,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;IAC/B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACnC,CAAC;IACD,IAAI,CAAC,WAAW,MAAM,EAAE,CAAC,CAAA;IACzB,4EAA4E;IAC5E,sEAAsE;IACtE,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,sBAAsB,WAAW,6BAA6B,CAAC,CAAC,CAAA;IAC3E,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { chat } from './commands/chat.js';
|
|
4
|
-
import { configCommand } from './commands/config.js';
|
|
5
|
-
import { drop } from './commands/drop.js';
|
|
6
|
-
import { exam } from './commands/exam.js';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
7
3
|
import { join } from './commands/join.js';
|
|
8
|
-
import { login } from './commands/login.js';
|
|
9
|
-
import { org } from './commands/org.js';
|
|
10
|
-
import { scanProfile } from './commands/scan-profile.js';
|
|
11
4
|
import { sync } from './commands/sync.js';
|
|
12
|
-
import {
|
|
5
|
+
import { COMMANDS, findCommand } from './registry.js';
|
|
13
6
|
import { resolveCommand } from './resolve-command.js';
|
|
14
|
-
import { HACKLAB_ENVIRONMENTS,
|
|
7
|
+
import { HACKLAB_ENVIRONMENTS, loadSession, resolveHacklabEnv, } from './session.js';
|
|
15
8
|
import { banner, bold, dim } from './ui.js';
|
|
9
|
+
// Single source of the published version: read it from package.json (one level
|
|
10
|
+
// up from this module in both `dist/` and `src/`) instead of hardcoding a string
|
|
11
|
+
// that silently drifts from the real package version. `createRequire` resolves
|
|
12
|
+
// JSON the same way under tsx (dev) and the compiled bin.
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
14
|
+
const { version: VERSION } = require('../package.json');
|
|
16
15
|
/**
|
|
17
16
|
* Pull a global `--env <production|staging|development>` (or `--env=<…>`) flag
|
|
18
17
|
* out of the args and point the CLI at that backend by setting HACKLAB_APP_URL
|
|
@@ -35,11 +34,12 @@ function applyEnvFlag(argv) {
|
|
|
35
34
|
rest.push(arg);
|
|
36
35
|
continue;
|
|
37
36
|
}
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
const env = value ? resolveHacklabEnv(value) : null;
|
|
38
|
+
if (!env) {
|
|
39
|
+
console.error(`--env must be one of: ${Object.keys(HACKLAB_ENVIRONMENTS).join(', ')} (abbreviations like dev/prod/stag work)`);
|
|
40
40
|
process.exit(1);
|
|
41
41
|
}
|
|
42
|
-
process.env.HACKLAB_APP_URL = HACKLAB_ENVIRONMENTS[
|
|
42
|
+
process.env.HACKLAB_APP_URL = HACKLAB_ENVIRONMENTS[env];
|
|
43
43
|
}
|
|
44
44
|
return rest;
|
|
45
45
|
}
|
|
@@ -48,17 +48,16 @@ function printHelp() {
|
|
|
48
48
|
banner();
|
|
49
49
|
console.log('');
|
|
50
50
|
console.log(bold('usage:'));
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
console.log(` hacklab ${dim('chat')} ${dim('<sub>')} channel + DMs (tail/post/dm/...); --json for agents`);
|
|
51
|
+
// Align the descriptions: pad to the widest `name + args` so the summaries
|
|
52
|
+
// line up no matter how the registry grows.
|
|
53
|
+
const rows = COMMANDS.map((c) => ({
|
|
54
|
+
label: c.args ? `${c.name} ${c.args}` : c.name,
|
|
55
|
+
summary: c.summary,
|
|
56
|
+
}));
|
|
57
|
+
const width = Math.max(...rows.map((r) => r.label.length));
|
|
58
|
+
for (const { label, summary } of rows) {
|
|
59
|
+
console.log(` hacklab ${dim(label)}${' '.repeat(width - label.length)} ${summary}`);
|
|
60
|
+
}
|
|
62
61
|
console.log('');
|
|
63
62
|
console.log(` ${dim('--env')} ${dim('<production|staging|development>')} pick the backend (default: production)`);
|
|
64
63
|
console.log('');
|
|
@@ -83,7 +82,7 @@ async function main() {
|
|
|
83
82
|
process.exit(0);
|
|
84
83
|
}
|
|
85
84
|
if (cmd === '--version' || cmd === '-v') {
|
|
86
|
-
console.log(
|
|
85
|
+
console.log(VERSION);
|
|
87
86
|
process.exit(0);
|
|
88
87
|
}
|
|
89
88
|
// Bare invocation (e.g. `npx hacklab@latest`): join for newcomers, sync for
|
|
@@ -106,73 +105,13 @@ async function main() {
|
|
|
106
105
|
console.error(`ambiguous command "${cmd}": ${resolution.matches.join(' or ')}?`);
|
|
107
106
|
process.exit(1);
|
|
108
107
|
}
|
|
109
|
-
const command = resolution.kind === 'match' ? resolution.name :
|
|
110
|
-
if (command
|
|
111
|
-
await join();
|
|
112
|
-
}
|
|
113
|
-
else if (command === 'login') {
|
|
114
|
-
await login();
|
|
115
|
-
}
|
|
116
|
-
else if (command === 'whoami') {
|
|
117
|
-
await whoami();
|
|
118
|
-
}
|
|
119
|
-
else if (command === 'sync') {
|
|
120
|
-
await sync();
|
|
121
|
-
}
|
|
122
|
-
else if (command === 'drop') {
|
|
123
|
-
const content = parseDropArgs(args);
|
|
124
|
-
await drop(content.text, content.url);
|
|
125
|
-
}
|
|
126
|
-
else if (command === 'exam') {
|
|
127
|
-
const pyro = args.includes('--pyro');
|
|
128
|
-
const hacker = args.includes('--hacker');
|
|
129
|
-
await exam({ pyro, hacker });
|
|
130
|
-
}
|
|
131
|
-
else if (command === 'scan') {
|
|
132
|
-
await scanProfile();
|
|
133
|
-
}
|
|
134
|
-
else if (command === 'config') {
|
|
135
|
-
await configCommand(args);
|
|
136
|
-
}
|
|
137
|
-
else if (command === 'brag') {
|
|
138
|
-
const options = parseBragArgs(args);
|
|
139
|
-
await brag(options.manifestPath);
|
|
140
|
-
}
|
|
141
|
-
else if (command === 'org') {
|
|
142
|
-
await org();
|
|
143
|
-
}
|
|
144
|
-
else if (command === 'chat') {
|
|
145
|
-
await chat(args);
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
108
|
+
const command = resolution.kind === 'match' ? findCommand(resolution.name) : undefined;
|
|
109
|
+
if (!command) {
|
|
148
110
|
console.error(`unknown command: ${cmd}`);
|
|
149
111
|
console.error('run hacklab --help for usage');
|
|
150
112
|
process.exit(1);
|
|
151
113
|
}
|
|
152
|
-
|
|
153
|
-
function parseDropArgs(args) {
|
|
154
|
-
let url;
|
|
155
|
-
const words = [];
|
|
156
|
-
for (let i = 0; i < args.length; i++) {
|
|
157
|
-
const arg = args[i];
|
|
158
|
-
if ((arg === '-u' || arg === '--url') && args[i + 1]) {
|
|
159
|
-
url = args[i + 1];
|
|
160
|
-
i++;
|
|
161
|
-
}
|
|
162
|
-
else if (arg.startsWith('-')) {
|
|
163
|
-
console.error(`unknown flag: ${arg}`);
|
|
164
|
-
process.exit(1);
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
words.push(arg);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
const text = words.join(' ');
|
|
171
|
-
if (!text) {
|
|
172
|
-
console.error('usage: hacklab drop your message here');
|
|
173
|
-
process.exit(1);
|
|
174
|
-
}
|
|
175
|
-
return { text, url };
|
|
114
|
+
await command.run(args);
|
|
176
115
|
}
|
|
177
116
|
main().catch((err) => {
|
|
178
117
|
console.error(err instanceof Error ? err.message : String(err));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|