hacklab 0.0.2 → 0.3.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 +44 -3
- package/bin/ddd +19 -0
- package/dist/commands/brag.d.ts +3 -6
- package/dist/commands/brag.d.ts.map +1 -1
- package/dist/commands/brag.js +68 -299
- package/dist/commands/brag.js.map +1 -1
- package/dist/commands/claim.d.ts +2 -0
- package/dist/commands/claim.d.ts.map +1 -0
- package/dist/commands/claim.js +534 -0
- package/dist/commands/claim.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +48 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dojo-init.d.ts +2 -0
- package/dist/commands/dojo-init.d.ts.map +1 -0
- package/dist/commands/dojo-init.js +75 -0
- package/dist/commands/dojo-init.js.map +1 -0
- package/dist/commands/drop.d.ts +2 -0
- package/dist/commands/drop.d.ts.map +1 -0
- package/dist/commands/drop.js +29 -0
- package/dist/commands/drop.js.map +1 -0
- package/dist/commands/exam.d.ts +5 -0
- package/dist/commands/exam.d.ts.map +1 -0
- package/dist/commands/exam.js +224 -0
- package/dist/commands/exam.js.map +1 -0
- package/dist/commands/login.d.ts +1 -15
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +69 -133
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/scan-profile.d.ts +33 -0
- package/dist/commands/scan-profile.d.ts.map +1 -0
- package/dist/commands/scan-profile.js +279 -0
- package/dist/commands/scan-profile.js.map +1 -0
- package/dist/commands/signup.d.ts +11 -0
- package/dist/commands/signup.d.ts.map +1 -0
- package/dist/commands/signup.js +242 -0
- package/dist/commands/signup.js.map +1 -0
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +55 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/whoami.d.ts +1 -3
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +10 -37
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +18 -0
- package/dist/config.js.map +1 -0
- package/dist/dd.d.ts +3 -0
- package/dist/dd.d.ts.map +1 -0
- package/dist/dd.js +28 -0
- package/dist/dd.js.map +1 -0
- package/dist/index.js +117 -112
- package/dist/index.js.map +1 -1
- package/dist/project-brag.d.ts +58 -0
- package/dist/project-brag.d.ts.map +1 -0
- package/dist/project-brag.js +270 -0
- package/dist/project-brag.js.map +1 -0
- package/dist/scanners/index.d.ts +24 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +543 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/util.d.ts +83 -0
- package/dist/scanners/util.d.ts.map +1 -0
- package/dist/scanners/util.js +129 -0
- package/dist/scanners/util.js.map +1 -0
- package/dist/session.d.ts +17 -13
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +46 -155
- package/dist/session.js.map +1 -1
- package/dist/share-card.d.ts +29 -0
- package/dist/share-card.d.ts.map +1 -0
- package/dist/share-card.js +401 -0
- package/dist/share-card.js.map +1 -0
- package/dist/sync.d.ts +64 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +805 -0
- package/dist/sync.js.map +1 -0
- package/dist/ui.d.ts +10 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +21 -0
- package/dist/ui.js.map +1 -0
- package/dist/utils/openBrowser.js.map +1 -1
- package/package.json +36 -29
- package/dist/api/client.d.ts +0 -150
- package/dist/api/client.d.ts.map +0 -1
- package/dist/api/client.js +0 -246
- package/dist/api/client.js.map +0 -1
- package/dist/commands/admin-waitlist.d.ts +0 -12
- package/dist/commands/admin-waitlist.d.ts.map +0 -1
- package/dist/commands/admin-waitlist.js +0 -96
- package/dist/commands/admin-waitlist.js.map +0 -1
- package/dist/commands/brag.utils.d.ts +0 -12
- package/dist/commands/brag.utils.d.ts.map +0 -1
- package/dist/commands/brag.utils.js +0 -43
- package/dist/commands/brag.utils.js.map +0 -1
- package/dist/commands/essay.d.ts +0 -18
- package/dist/commands/essay.d.ts.map +0 -1
- package/dist/commands/essay.js +0 -117
- package/dist/commands/essay.js.map +0 -1
- package/dist/commands/explore.d.ts +0 -9
- package/dist/commands/explore.d.ts.map +0 -1
- package/dist/commands/explore.js +0 -32
- package/dist/commands/explore.js.map +0 -1
- package/dist/commands/init.d.ts +0 -16
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -237
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/join.d.ts +0 -10
- package/dist/commands/join.d.ts.map +0 -1
- package/dist/commands/join.js +0 -314
- package/dist/commands/join.js.map +0 -1
- package/dist/commands/link.d.ts +0 -17
- package/dist/commands/link.d.ts.map +0 -1
- package/dist/commands/link.js +0 -36
- package/dist/commands/link.js.map +0 -1
- package/dist/commands/login.utils.d.ts +0 -3
- package/dist/commands/login.utils.d.ts.map +0 -1
- package/dist/commands/login.utils.js +0 -13
- package/dist/commands/login.utils.js.map +0 -1
- package/dist/commands/new.d.ts +0 -15
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -172
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/new.utils.d.ts +0 -7
- package/dist/commands/new.utils.d.ts.map +0 -1
- package/dist/commands/new.utils.js +0 -50
- package/dist/commands/new.utils.js.map +0 -1
- package/dist/commands/onboard.d.ts +0 -10
- package/dist/commands/onboard.d.ts.map +0 -1
- package/dist/commands/onboard.js +0 -93
- package/dist/commands/onboard.js.map +0 -1
- package/dist/commands/publish.d.ts +0 -8
- package/dist/commands/publish.d.ts.map +0 -1
- package/dist/commands/publish.js +0 -47
- package/dist/commands/publish.js.map +0 -1
- package/dist/commands/tui.d.ts +0 -12
- package/dist/commands/tui.d.ts.map +0 -1
- package/dist/commands/tui.js +0 -112
- package/dist/commands/tui.js.map +0 -1
- package/dist/help-format.d.ts +0 -4
- package/dist/help-format.d.ts.map +0 -1
- package/dist/help-format.js +0 -30
- package/dist/help-format.js.map +0 -1
- package/dist/lab/config.d.ts +0 -32
- package/dist/lab/config.d.ts.map +0 -1
- package/dist/lab/config.js +0 -148
- package/dist/lab/config.js.map +0 -1
- package/dist/lab/contentStatus.d.ts +0 -6
- package/dist/lab/contentStatus.d.ts.map +0 -1
- package/dist/lab/contentStatus.js +0 -19
- package/dist/lab/contentStatus.js.map +0 -1
- package/dist/ui/banner.d.ts +0 -2
- package/dist/ui/banner.d.ts.map +0 -1
- package/dist/ui/banner.js +0 -22
- package/dist/ui/banner.js.map +0 -1
- package/dist/utils/findRepoRoot.d.ts +0 -2
- package/dist/utils/findRepoRoot.d.ts.map +0 -1
- package/dist/utils/findRepoRoot.js +0 -17
- package/dist/utils/findRepoRoot.js.map +0 -1
- package/dist/utils/pathExists.d.ts +0 -2
- package/dist/utils/pathExists.d.ts.map +0 -1
- package/dist/utils/pathExists.js +0 -11
- package/dist/utils/pathExists.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import { loadSessionState } from '../session.js';
|
|
3
|
+
import { checkSession, formatTokens, runSync } from '../sync.js';
|
|
4
|
+
import { bold, dim, error, info, success } from '../ui.js';
|
|
5
|
+
export async function sync() {
|
|
6
|
+
const sessionState = await loadSessionState();
|
|
7
|
+
const session = sessionState.session;
|
|
8
|
+
if (!session) {
|
|
9
|
+
error(sessionState.status === 'expired' ? 'login expired' : 'not logged in');
|
|
10
|
+
info(`run ${dim('hacklab login')} first`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const sessionCheck = await checkSession(session);
|
|
14
|
+
if (sessionCheck.status === 'unauthorized') {
|
|
15
|
+
error('login expired');
|
|
16
|
+
info(`run ${dim('hacklab login')} again`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
if (sessionCheck.status === 'failed') {
|
|
20
|
+
error(sessionCheck.message);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
console.log('');
|
|
24
|
+
console.log(bold(' hacklab sync'));
|
|
25
|
+
console.log(dim(' scanning local AI tool usage...'));
|
|
26
|
+
console.log('');
|
|
27
|
+
let result;
|
|
28
|
+
try {
|
|
29
|
+
result = await runSync(session);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
error(e instanceof Error ? e.message : 'sync failed');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const { claudeTotal, codexTotal, cursorTotal, openclawTotal, hermesTotal, opencodeTotal, result: r, } = result;
|
|
36
|
+
if (claudeTotal > 0)
|
|
37
|
+
info(` Claude Code ${formatTokens(claudeTotal)} tokens`);
|
|
38
|
+
if (codexTotal > 0)
|
|
39
|
+
info(` Codex ${formatTokens(codexTotal)} tokens`);
|
|
40
|
+
if (cursorTotal > 0)
|
|
41
|
+
info(` Cursor ${formatTokens(cursorTotal)} tokens`);
|
|
42
|
+
if (openclawTotal > 0)
|
|
43
|
+
info(` OpenClaw ${formatTokens(openclawTotal)} tokens`);
|
|
44
|
+
if (hermesTotal > 0)
|
|
45
|
+
info(` Hermes ${formatTokens(hermesTotal)} tokens`);
|
|
46
|
+
if (opencodeTotal > 0)
|
|
47
|
+
info(` OpenCode ${formatTokens(opencodeTotal)} tokens`);
|
|
48
|
+
console.log('');
|
|
49
|
+
success(` ${bold(String(r.title))} lv.${r.level} — ${formatTokens(Number(r.tokensTotal))} total`);
|
|
50
|
+
if (Number(r.tokensDelta) > 0) {
|
|
51
|
+
info(` +${formatTokens(Number(r.tokensDelta))} since last sync`);
|
|
52
|
+
}
|
|
53
|
+
clack.outro(dim('synced.'));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function formatWhoamiMessage(user: CliIdentityUser, nickname?: string): string;
|
|
3
|
-
export declare function whoamiCommand(): Promise<void>;
|
|
1
|
+
export declare function whoami(): Promise<void>;
|
|
4
2
|
//# sourceMappingURL=whoami.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAGA,
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,kBAe3B"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -1,44 +1,17 @@
|
|
|
1
|
-
import { intro, outro } from '@clack/prompts';
|
|
2
|
-
import { fetchCliWhoAmI } from '../api/client.js';
|
|
3
1
|
import { loadSession } from '../session.js';
|
|
4
|
-
import {
|
|
5
|
-
function
|
|
6
|
-
if (user.type === 'AGENT') {
|
|
7
|
-
return 'agent';
|
|
8
|
-
}
|
|
9
|
-
if (user.type === 'HUMAN') {
|
|
10
|
-
return 'human';
|
|
11
|
-
}
|
|
12
|
-
if (user.agent) {
|
|
13
|
-
return 'agent';
|
|
14
|
-
}
|
|
15
|
-
return 'human';
|
|
16
|
-
}
|
|
17
|
-
export function formatWhoamiMessage(user, nickname) {
|
|
18
|
-
const nicknameLabel = nickname ? ` (${nickname})` : '';
|
|
19
|
-
const systemModeLabel = user.systemMode.toLowerCase();
|
|
20
|
-
const identityType = resolveIdentityType(user);
|
|
21
|
-
const tags = [systemModeLabel, identityType];
|
|
22
|
-
if (identityType === 'agent' && user.agent?.slug) {
|
|
23
|
-
tags.push(`@${user.agent.slug}`);
|
|
24
|
-
}
|
|
25
|
-
return `logged in as ${user.email}${nicknameLabel} [${tags.join(', ')}]`;
|
|
26
|
-
}
|
|
27
|
-
export async function whoamiCommand() {
|
|
28
|
-
intro('hacklab cli');
|
|
2
|
+
import { dim, error, info, success } from '../ui.js';
|
|
3
|
+
export async function whoami() {
|
|
29
4
|
const session = await loadSession();
|
|
30
5
|
if (!session) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
6
|
+
error('not logged in');
|
|
7
|
+
info(`run ${dim('hacklab login')} to authenticate`);
|
|
8
|
+
process.exit(1);
|
|
34
9
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (
|
|
38
|
-
|
|
39
|
-
process.exitCode = 1;
|
|
40
|
-
return;
|
|
10
|
+
success(session.handle ?? session.email);
|
|
11
|
+
info(`email: ${session.email}`);
|
|
12
|
+
if (session.handle) {
|
|
13
|
+
info(`handle: ${session.handle}`);
|
|
41
14
|
}
|
|
42
|
-
|
|
15
|
+
info(`server: ${session.appUrl}`);
|
|
43
16
|
}
|
|
44
17
|
//# sourceMappingURL=whoami.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,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,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,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACnC,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAID,wBAAsB,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,CAOzD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
const CONFIG_PATH = join(homedir(), '.hacklab', 'config.json');
|
|
5
|
+
export async function loadConfig() {
|
|
6
|
+
try {
|
|
7
|
+
const raw = await readFile(CONFIG_PATH, 'utf8');
|
|
8
|
+
return JSON.parse(raw);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function saveConfig(config) {
|
|
15
|
+
await mkdir(dirname(CONFIG_PATH), { recursive: true });
|
|
16
|
+
await writeFile(CONFIG_PATH, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAOzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;AAE9D,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAA;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAqB;IACpD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACtD,MAAM,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAC9E,CAAC"}
|
package/dist/dd.d.ts
ADDED
package/dist/dd.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dd.d.ts","sourceRoot":"","sources":["../src/dd.ts"],"names":[],"mappings":""}
|
package/dist/dd.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { drop } from './commands/drop.js';
|
|
3
|
+
import { error } from './ui.js';
|
|
4
|
+
const args = process.argv.slice(2);
|
|
5
|
+
if (args.length === 0) {
|
|
6
|
+
error('nothing to drop');
|
|
7
|
+
console.error('usage: dd your message here');
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
// Check for -u/--url flag
|
|
11
|
+
let url;
|
|
12
|
+
const filtered = [];
|
|
13
|
+
for (let i = 0; i < args.length; i++) {
|
|
14
|
+
const arg = args[i];
|
|
15
|
+
if ((arg === '-u' || arg === '--url') && args[i + 1]) {
|
|
16
|
+
url = args[i + 1];
|
|
17
|
+
i++;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
filtered.push(arg);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const content = filtered.join(' ');
|
|
24
|
+
drop(content, url).catch((err) => {
|
|
25
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=dd.js.map
|
package/dist/dd.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dd.js","sourceRoot":"","sources":["../src/dd.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAElC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACtB,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACxB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,0BAA0B;AAC1B,IAAI,GAAuB,CAAA;AAC3B,MAAM,QAAQ,GAAa,EAAE,CAAA;AAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;IACpB,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACjB,CAAC,EAAE,CAAA;IACL,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACpB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAElC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,124 +1,129 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { whoamiCommand } from './commands/whoami.js';
|
|
12
|
-
import { createGreenHelpConfig, HELP_BANNER } from './help-format.js';
|
|
2
|
+
import { brag, parseBragArgs } from './commands/brag.js';
|
|
3
|
+
import { configCommand } from './commands/config.js';
|
|
4
|
+
import { drop } from './commands/drop.js';
|
|
5
|
+
import { exam } from './commands/exam.js';
|
|
6
|
+
import { login } from './commands/login.js';
|
|
7
|
+
import { scanProfile } from './commands/scan-profile.js';
|
|
8
|
+
import { signup } from './commands/signup.js';
|
|
9
|
+
import { sync } from './commands/sync.js';
|
|
10
|
+
import { whoami } from './commands/whoami.js';
|
|
13
11
|
import { loadSession } from './session.js';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
.
|
|
19
|
-
.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
.
|
|
23
|
-
.
|
|
24
|
-
.
|
|
25
|
-
.
|
|
26
|
-
.
|
|
27
|
-
.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
.
|
|
38
|
-
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
.description('create or initialize your hq repository in the current git repo')
|
|
43
|
-
.option('-n, --name <name>', 'lab display name')
|
|
44
|
-
.option('-f, --force', 'overwrite existing .hacklab/config.json')
|
|
45
|
-
.action(async (options) => {
|
|
46
|
-
await initCommand({
|
|
47
|
-
name: options.name,
|
|
48
|
-
force: options.force,
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
program
|
|
52
|
-
.command('new')
|
|
53
|
-
.description('create new content in your hq')
|
|
54
|
-
.argument('[type]', 'project | guide | course | essay | research-paper')
|
|
55
|
-
.argument('[slug]', 'content slug, e.g. my-first-project')
|
|
56
|
-
.option('-t, --title <title>', 'custom title')
|
|
57
|
-
.action(async (type, slug, options) => {
|
|
58
|
-
await newCommand(type, slug, {
|
|
59
|
-
title: options.title,
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
program
|
|
63
|
-
.command('publish')
|
|
64
|
-
.description('push your hq repo to github so hacklab can sync')
|
|
65
|
-
.option('-r, --remote <remote>', 'git remote to push to (defaults to git default)')
|
|
66
|
-
.option('-b, --branch <branch>', 'git branch to push')
|
|
67
|
-
.action(async (options) => {
|
|
68
|
-
await publishCommand(options);
|
|
69
|
-
});
|
|
70
|
-
program
|
|
71
|
-
.command('explore')
|
|
72
|
-
.description('open hacklab discovery in your browser')
|
|
73
|
-
.option('-a, --app-url <url>', 'hacklab app url (defaults to localhost)')
|
|
74
|
-
.option('--path <path>', 'relative path to open (defaults to /explore)')
|
|
75
|
-
.option('--no-browser', 'print the url instead of opening a browser')
|
|
76
|
-
.action(async (options) => {
|
|
77
|
-
await exploreCommand(options);
|
|
78
|
-
});
|
|
79
|
-
async function isCliAdmin() {
|
|
80
|
-
const session = await loadSession();
|
|
81
|
-
if (!session) {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
if (session.systemMode) {
|
|
85
|
-
return session.systemMode === 'DEV' || session.systemMode === 'GOD';
|
|
12
|
+
import { banner, bold, dim } from './ui.js';
|
|
13
|
+
const [cmd, ...args] = process.argv.slice(2);
|
|
14
|
+
function printHelp() {
|
|
15
|
+
banner();
|
|
16
|
+
console.log('');
|
|
17
|
+
console.log(bold('usage:'));
|
|
18
|
+
console.log(` hacklab ${dim('signup')} join hacklab from your terminal`);
|
|
19
|
+
console.log(` hacklab ${dim('sync')} sync AI token usage to your profile`);
|
|
20
|
+
console.log(` hacklab ${dim('whoami')} check who you're logged in as`);
|
|
21
|
+
console.log(` hacklab ${dim('drop')} ${dim('"message"')} post a drop to your feed`);
|
|
22
|
+
console.log(` hacklab ${dim('login')} re-authenticate with github`);
|
|
23
|
+
console.log(` hacklab ${dim('exam')} run your belt exam (pyro + hacker)`);
|
|
24
|
+
console.log(` hacklab ${dim('scan')} build your full profile (skills, repos, blog)`);
|
|
25
|
+
console.log(` hacklab ${dim('config')} ${dim('<key> <val>')} set config (cursor-api-key, cursor-email)`);
|
|
26
|
+
console.log(` hacklab ${dim('brag')} ${dim('[path]')} sync .hacklab/project.yaml`);
|
|
27
|
+
console.log('');
|
|
28
|
+
}
|
|
29
|
+
// Node-version guard (T9). The CLI uses modern Node APIs (global fetch,
|
|
30
|
+
// AbortSignal.timeout). Fail fast with a clear message instead of a cryptic
|
|
31
|
+
// runtime error on an old runtime. The nvm hint matters because a piped
|
|
32
|
+
// `curl | sh` install runs in a non-interactive shell where nvm isn't sourced,
|
|
33
|
+
// so version-manager users are told to run npx directly in their own shell.
|
|
34
|
+
function enforceNodeVersion() {
|
|
35
|
+
const major = Number(process.versions.node.split('.')[0]);
|
|
36
|
+
if (Number.isFinite(major) && major < 20) {
|
|
37
|
+
console.error(`hacklab requires Node 20 or newer (you have ${process.versions.node}).`);
|
|
38
|
+
console.error('Using a version manager (nvm/fnm/volta)? Run `npx hacklab@latest` in your shell.');
|
|
39
|
+
process.exit(1);
|
|
86
40
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
41
|
+
}
|
|
42
|
+
async function main() {
|
|
43
|
+
enforceNodeVersion();
|
|
44
|
+
if (cmd === '--help' || cmd === '-h') {
|
|
45
|
+
printHelp();
|
|
46
|
+
process.exit(0);
|
|
93
47
|
}
|
|
94
|
-
|
|
95
|
-
|
|
48
|
+
if (cmd === '--version' || cmd === '-v') {
|
|
49
|
+
console.log('0.3.0');
|
|
50
|
+
process.exit(0);
|
|
96
51
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (!
|
|
52
|
+
// Bare invocation (e.g. `npx hacklab@latest`): signup for newcomers, sync for
|
|
53
|
+
// a returning, already-authenticated user.
|
|
54
|
+
if (!cmd) {
|
|
55
|
+
const session = await loadSession();
|
|
56
|
+
if (session) {
|
|
57
|
+
await sync();
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
await signup();
|
|
61
|
+
}
|
|
100
62
|
return;
|
|
101
63
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
64
|
+
if (cmd === 'signup') {
|
|
65
|
+
await signup();
|
|
66
|
+
}
|
|
67
|
+
else if (cmd === 'login') {
|
|
68
|
+
await login();
|
|
69
|
+
}
|
|
70
|
+
else if (cmd === 'whoami') {
|
|
71
|
+
await whoami();
|
|
72
|
+
}
|
|
73
|
+
else if (cmd === 'sync') {
|
|
74
|
+
await sync();
|
|
75
|
+
}
|
|
76
|
+
else if (cmd === 'drop') {
|
|
77
|
+
const content = parseDropArgs(args);
|
|
78
|
+
await drop(content.text, content.url);
|
|
79
|
+
}
|
|
80
|
+
else if (cmd === 'exam') {
|
|
81
|
+
const pyro = args.includes('--pyro');
|
|
82
|
+
const hacker = args.includes('--hacker');
|
|
83
|
+
await exam({ pyro, hacker });
|
|
84
|
+
}
|
|
85
|
+
else if (cmd === 'scan') {
|
|
86
|
+
await scanProfile();
|
|
87
|
+
}
|
|
88
|
+
else if (cmd === 'config') {
|
|
89
|
+
await configCommand(args);
|
|
90
|
+
}
|
|
91
|
+
else if (cmd === 'brag') {
|
|
92
|
+
const options = parseBragArgs(args);
|
|
93
|
+
await brag(options.manifestPath);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.error(`unknown command: ${cmd}`);
|
|
97
|
+
console.error('run hacklab --help for usage');
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
115
100
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
101
|
+
function parseDropArgs(args) {
|
|
102
|
+
let url;
|
|
103
|
+
const words = [];
|
|
104
|
+
for (let i = 0; i < args.length; i++) {
|
|
105
|
+
const arg = args[i];
|
|
106
|
+
if ((arg === '-u' || arg === '--url') && args[i + 1]) {
|
|
107
|
+
url = args[i + 1];
|
|
108
|
+
i++;
|
|
109
|
+
}
|
|
110
|
+
else if (arg.startsWith('-')) {
|
|
111
|
+
console.error(`unknown flag: ${arg}`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
words.push(arg);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const text = words.join(' ');
|
|
119
|
+
if (!text) {
|
|
120
|
+
console.error('usage: hacklab drop your message here');
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
return { text, url };
|
|
119
124
|
}
|
|
120
|
-
main().catch((
|
|
121
|
-
console.error(
|
|
125
|
+
main().catch((err) => {
|
|
126
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
122
127
|
process.exit(1);
|
|
123
128
|
});
|
|
124
129
|
//# sourceMappingURL=index.js.map
|
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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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const DEFAULT_BRAG_MANIFEST_PATH = ".hacklab/project.yaml";
|
|
3
|
+
declare const projectManifestSchema: z.ZodObject<{
|
|
4
|
+
title: z.ZodString;
|
|
5
|
+
slug: z.ZodOptional<z.ZodString>;
|
|
6
|
+
description: z.ZodOptional<z.ZodString>;
|
|
7
|
+
tags: z.ZodDefault<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodOptional<z.ZodArray<z.ZodString>>>>;
|
|
8
|
+
repoUrl: z.ZodPipe<z.ZodTransform<string | undefined, unknown>, z.ZodOptional<z.ZodString>>;
|
|
9
|
+
liveUrl: z.ZodPipe<z.ZodTransform<string | undefined, unknown>, z.ZodOptional<z.ZodString>>;
|
|
10
|
+
screenshots: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
11
|
+
path: z.ZodPipe<z.ZodTransform<string | undefined, unknown>, z.ZodOptional<z.ZodString>>;
|
|
12
|
+
url: z.ZodPipe<z.ZodTransform<string | undefined, unknown>, z.ZodOptional<z.ZodString>>;
|
|
13
|
+
caption: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
14
|
+
}, z.core.$strip>]>>>>;
|
|
15
|
+
content: z.ZodPipe<z.ZodTransform<string | undefined, unknown>, z.ZodOptional<z.ZodString>>;
|
|
16
|
+
contentFile: z.ZodPipe<z.ZodTransform<string | undefined, unknown>, z.ZodOptional<z.ZodString>>;
|
|
17
|
+
publishedAt: z.ZodPipe<z.ZodTransform<string | Date | undefined, unknown>, z.ZodOptional<z.ZodCoercedDate<unknown>>>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export type BragManifest = z.infer<typeof projectManifestSchema>;
|
|
20
|
+
export type LoadedBragManifest = {
|
|
21
|
+
cwd: string;
|
|
22
|
+
manifestPath: string;
|
|
23
|
+
manifest: BragManifest & {
|
|
24
|
+
slug: string;
|
|
25
|
+
};
|
|
26
|
+
rawYaml: string;
|
|
27
|
+
};
|
|
28
|
+
export type BragScreenshot = {
|
|
29
|
+
url: string;
|
|
30
|
+
caption: string;
|
|
31
|
+
};
|
|
32
|
+
export type BragProjectPayload = {
|
|
33
|
+
title: string;
|
|
34
|
+
slug: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
tags: string[];
|
|
37
|
+
repoUrl?: string;
|
|
38
|
+
liveUrl?: string;
|
|
39
|
+
screenshots: BragScreenshot[];
|
|
40
|
+
content?: string;
|
|
41
|
+
sourceYaml: string;
|
|
42
|
+
publishedAt?: string;
|
|
43
|
+
};
|
|
44
|
+
export type ScreenshotUploadInput = {
|
|
45
|
+
absolutePath: string;
|
|
46
|
+
base64: string;
|
|
47
|
+
contentType: 'image/png' | 'image/jpeg';
|
|
48
|
+
filename: string;
|
|
49
|
+
caption: string;
|
|
50
|
+
};
|
|
51
|
+
export type ScreenshotUploader = (input: ScreenshotUploadInput) => Promise<string>;
|
|
52
|
+
export declare function loadBragManifest(options?: {
|
|
53
|
+
cwd?: string;
|
|
54
|
+
manifestPath?: string;
|
|
55
|
+
}): Promise<LoadedBragManifest>;
|
|
56
|
+
export declare function buildBragProjectPayload(manifest: LoadedBragManifest, uploadScreenshot: ScreenshotUploader): Promise<BragProjectPayload>;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=project-brag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-brag.d.ts","sourceRoot":"","sources":["../src/project-brag.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,0BAA0B,0BAA0B,CAAA;AAoDjE,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;iBA0CzB,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEhE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,YAAY,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,cAAc,EAAE,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,WAAW,GAAG,YAAY,CAAA;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,KAAK,EAAE,qBAAqB,KACzB,OAAO,CAAC,MAAM,CAAC,CAAA;AA+DpB,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmD9B;AAkED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,kBAAkB,EAC5B,gBAAgB,EAAE,kBAAkB,GACnC,OAAO,CAAC,kBAAkB,CAAC,CA+D7B"}
|