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.
Files changed (166) hide show
  1. package/README.md +44 -3
  2. package/bin/ddd +19 -0
  3. package/dist/commands/brag.d.ts +3 -6
  4. package/dist/commands/brag.d.ts.map +1 -1
  5. package/dist/commands/brag.js +68 -299
  6. package/dist/commands/brag.js.map +1 -1
  7. package/dist/commands/claim.d.ts +2 -0
  8. package/dist/commands/claim.d.ts.map +1 -0
  9. package/dist/commands/claim.js +534 -0
  10. package/dist/commands/claim.js.map +1 -0
  11. package/dist/commands/config.d.ts +2 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +48 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/dojo-init.d.ts +2 -0
  16. package/dist/commands/dojo-init.d.ts.map +1 -0
  17. package/dist/commands/dojo-init.js +75 -0
  18. package/dist/commands/dojo-init.js.map +1 -0
  19. package/dist/commands/drop.d.ts +2 -0
  20. package/dist/commands/drop.d.ts.map +1 -0
  21. package/dist/commands/drop.js +29 -0
  22. package/dist/commands/drop.js.map +1 -0
  23. package/dist/commands/exam.d.ts +5 -0
  24. package/dist/commands/exam.d.ts.map +1 -0
  25. package/dist/commands/exam.js +224 -0
  26. package/dist/commands/exam.js.map +1 -0
  27. package/dist/commands/login.d.ts +1 -15
  28. package/dist/commands/login.d.ts.map +1 -1
  29. package/dist/commands/login.js +69 -133
  30. package/dist/commands/login.js.map +1 -1
  31. package/dist/commands/scan-profile.d.ts +33 -0
  32. package/dist/commands/scan-profile.d.ts.map +1 -0
  33. package/dist/commands/scan-profile.js +279 -0
  34. package/dist/commands/scan-profile.js.map +1 -0
  35. package/dist/commands/signup.d.ts +11 -0
  36. package/dist/commands/signup.d.ts.map +1 -0
  37. package/dist/commands/signup.js +242 -0
  38. package/dist/commands/signup.js.map +1 -0
  39. package/dist/commands/sync.d.ts +2 -0
  40. package/dist/commands/sync.d.ts.map +1 -0
  41. package/dist/commands/sync.js +55 -0
  42. package/dist/commands/sync.js.map +1 -0
  43. package/dist/commands/whoami.d.ts +1 -3
  44. package/dist/commands/whoami.d.ts.map +1 -1
  45. package/dist/commands/whoami.js +10 -37
  46. package/dist/commands/whoami.js.map +1 -1
  47. package/dist/config.d.ts +7 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +18 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/dd.d.ts +3 -0
  52. package/dist/dd.d.ts.map +1 -0
  53. package/dist/dd.js +28 -0
  54. package/dist/dd.js.map +1 -0
  55. package/dist/index.js +117 -112
  56. package/dist/index.js.map +1 -1
  57. package/dist/project-brag.d.ts +58 -0
  58. package/dist/project-brag.d.ts.map +1 -0
  59. package/dist/project-brag.js +270 -0
  60. package/dist/project-brag.js.map +1 -0
  61. package/dist/scanners/index.d.ts +24 -0
  62. package/dist/scanners/index.d.ts.map +1 -0
  63. package/dist/scanners/index.js +543 -0
  64. package/dist/scanners/index.js.map +1 -0
  65. package/dist/scanners/util.d.ts +83 -0
  66. package/dist/scanners/util.d.ts.map +1 -0
  67. package/dist/scanners/util.js +129 -0
  68. package/dist/scanners/util.js.map +1 -0
  69. package/dist/session.d.ts +17 -13
  70. package/dist/session.d.ts.map +1 -1
  71. package/dist/session.js +46 -155
  72. package/dist/session.js.map +1 -1
  73. package/dist/share-card.d.ts +29 -0
  74. package/dist/share-card.d.ts.map +1 -0
  75. package/dist/share-card.js +401 -0
  76. package/dist/share-card.js.map +1 -0
  77. package/dist/sync.d.ts +64 -0
  78. package/dist/sync.d.ts.map +1 -0
  79. package/dist/sync.js +805 -0
  80. package/dist/sync.js.map +1 -0
  81. package/dist/ui.d.ts +10 -0
  82. package/dist/ui.d.ts.map +1 -0
  83. package/dist/ui.js +21 -0
  84. package/dist/ui.js.map +1 -0
  85. package/dist/utils/openBrowser.js.map +1 -1
  86. package/package.json +36 -29
  87. package/dist/api/client.d.ts +0 -150
  88. package/dist/api/client.d.ts.map +0 -1
  89. package/dist/api/client.js +0 -246
  90. package/dist/api/client.js.map +0 -1
  91. package/dist/commands/admin-waitlist.d.ts +0 -12
  92. package/dist/commands/admin-waitlist.d.ts.map +0 -1
  93. package/dist/commands/admin-waitlist.js +0 -96
  94. package/dist/commands/admin-waitlist.js.map +0 -1
  95. package/dist/commands/brag.utils.d.ts +0 -12
  96. package/dist/commands/brag.utils.d.ts.map +0 -1
  97. package/dist/commands/brag.utils.js +0 -43
  98. package/dist/commands/brag.utils.js.map +0 -1
  99. package/dist/commands/essay.d.ts +0 -18
  100. package/dist/commands/essay.d.ts.map +0 -1
  101. package/dist/commands/essay.js +0 -117
  102. package/dist/commands/essay.js.map +0 -1
  103. package/dist/commands/explore.d.ts +0 -9
  104. package/dist/commands/explore.d.ts.map +0 -1
  105. package/dist/commands/explore.js +0 -32
  106. package/dist/commands/explore.js.map +0 -1
  107. package/dist/commands/init.d.ts +0 -16
  108. package/dist/commands/init.d.ts.map +0 -1
  109. package/dist/commands/init.js +0 -237
  110. package/dist/commands/init.js.map +0 -1
  111. package/dist/commands/join.d.ts +0 -10
  112. package/dist/commands/join.d.ts.map +0 -1
  113. package/dist/commands/join.js +0 -314
  114. package/dist/commands/join.js.map +0 -1
  115. package/dist/commands/link.d.ts +0 -17
  116. package/dist/commands/link.d.ts.map +0 -1
  117. package/dist/commands/link.js +0 -36
  118. package/dist/commands/link.js.map +0 -1
  119. package/dist/commands/login.utils.d.ts +0 -3
  120. package/dist/commands/login.utils.d.ts.map +0 -1
  121. package/dist/commands/login.utils.js +0 -13
  122. package/dist/commands/login.utils.js.map +0 -1
  123. package/dist/commands/new.d.ts +0 -15
  124. package/dist/commands/new.d.ts.map +0 -1
  125. package/dist/commands/new.js +0 -172
  126. package/dist/commands/new.js.map +0 -1
  127. package/dist/commands/new.utils.d.ts +0 -7
  128. package/dist/commands/new.utils.d.ts.map +0 -1
  129. package/dist/commands/new.utils.js +0 -50
  130. package/dist/commands/new.utils.js.map +0 -1
  131. package/dist/commands/onboard.d.ts +0 -10
  132. package/dist/commands/onboard.d.ts.map +0 -1
  133. package/dist/commands/onboard.js +0 -93
  134. package/dist/commands/onboard.js.map +0 -1
  135. package/dist/commands/publish.d.ts +0 -8
  136. package/dist/commands/publish.d.ts.map +0 -1
  137. package/dist/commands/publish.js +0 -47
  138. package/dist/commands/publish.js.map +0 -1
  139. package/dist/commands/tui.d.ts +0 -12
  140. package/dist/commands/tui.d.ts.map +0 -1
  141. package/dist/commands/tui.js +0 -112
  142. package/dist/commands/tui.js.map +0 -1
  143. package/dist/help-format.d.ts +0 -4
  144. package/dist/help-format.d.ts.map +0 -1
  145. package/dist/help-format.js +0 -30
  146. package/dist/help-format.js.map +0 -1
  147. package/dist/lab/config.d.ts +0 -32
  148. package/dist/lab/config.d.ts.map +0 -1
  149. package/dist/lab/config.js +0 -148
  150. package/dist/lab/config.js.map +0 -1
  151. package/dist/lab/contentStatus.d.ts +0 -6
  152. package/dist/lab/contentStatus.d.ts.map +0 -1
  153. package/dist/lab/contentStatus.js +0 -19
  154. package/dist/lab/contentStatus.js.map +0 -1
  155. package/dist/ui/banner.d.ts +0 -2
  156. package/dist/ui/banner.d.ts.map +0 -1
  157. package/dist/ui/banner.js +0 -22
  158. package/dist/ui/banner.js.map +0 -1
  159. package/dist/utils/findRepoRoot.d.ts +0 -2
  160. package/dist/utils/findRepoRoot.d.ts.map +0 -1
  161. package/dist/utils/findRepoRoot.js +0 -17
  162. package/dist/utils/findRepoRoot.js.map +0 -1
  163. package/dist/utils/pathExists.d.ts +0 -2
  164. package/dist/utils/pathExists.d.ts.map +0 -1
  165. package/dist/utils/pathExists.js +0 -11
  166. 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
- import type { CliIdentityUser } from '../api/client.js';
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,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAoBvD,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,eAAe,EACrB,QAAQ,CAAC,EAAE,MAAM,GAClB,MAAM,CAWR;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBnD"}
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,kBAe3B"}
@@ -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 { getAppUrl } from './login.utils.js';
5
- function resolveIdentityType(user) {
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
- outro('not logged in. run `hacklab login`.');
32
- process.exitCode = 1;
33
- return;
6
+ error('not logged in');
7
+ info(`run ${dim('hacklab login')} to authenticate`);
8
+ process.exit(1);
34
9
  }
35
- const appUrl = getAppUrl(session.appUrl);
36
- const identity = await fetchCliWhoAmI(appUrl, session.token);
37
- if (!identity) {
38
- outro('your cli session is invalid or expired. run `hacklab login`.');
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
- outro(formatWhoamiMessage(identity.user, session.nickname));
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,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,SAAS,mBAAmB,CAAC,IAAqB;IAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,OAAO,CAAA;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,OAAO,CAAA;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,OAAO,CAAA;IAClB,CAAC;IAED,OAAO,OAAO,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAC/B,IAAqB,EACrB,QAAiB;IAEjB,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAA;IACrD,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;IAE5C,IAAI,YAAY,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,gBAAgB,IAAI,CAAC,KAAK,GAAG,aAAa,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IAC/B,KAAK,CAAC,aAAa,CAAC,CAAA;IAEpB,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;IAEnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,KAAK,CAAC,qCAAqC,CAAC,CAAA;QAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IAE5D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,KAAK,CAAC,8DAA8D,CAAC,CAAA;QACrE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC/D,CAAC"}
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"}
@@ -0,0 +1,7 @@
1
+ export type HacklabConfig = {
2
+ cursorApiKey?: string;
3
+ cursorEmail?: string;
4
+ };
5
+ export declare function loadConfig(): Promise<HacklabConfig>;
6
+ export declare function saveConfig(config: HacklabConfig): Promise<void>;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -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
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=dd.d.ts.map
@@ -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 { Command } from 'commander';
3
- import { fetchCliWhoAmI } from './api/client.js';
4
- import { adminWaitlistCommand } from './commands/admin-waitlist.js';
5
- import { exploreCommand } from './commands/explore.js';
6
- import { initCommand } from './commands/init.js';
7
- import { loginCommand } from './commands/login.js';
8
- import { getAppUrl } from './commands/login.utils.js';
9
- import { newCommand } from './commands/new.js';
10
- import { publishCommand } from './commands/publish.js';
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
- const program = new Command();
15
- program
16
- .name('hacklab')
17
- .description('hacklab hq cli')
18
- .version('0.0.1')
19
- .addHelpText('beforeAll', HELP_BANNER);
20
- program.configureHelp(createGreenHelpConfig());
21
- program
22
- .command('login')
23
- .description('authenticate with github oauth or a pre-issued cli token')
24
- .option('-a, --app-url <url>', 'hacklab app url (defaults to localhost)')
25
- .option('-t, --token <token>', 'cli access token for non-interactive login')
26
- .option('-n, --nickname <nickname>', 'local nickname for this login')
27
- .action(async (options) => {
28
- await loginCommand({
29
- appUrl: options.appUrl,
30
- token: options.token,
31
- nickname: options.nickname,
32
- });
33
- });
34
- program
35
- .command('whoami')
36
- .description('print current logged in account')
37
- .action(async () => {
38
- await whoamiCommand();
39
- });
40
- program
41
- .command('init')
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
- try {
88
- const appUrl = getAppUrl(session.appUrl);
89
- const identity = await fetchCliWhoAmI(appUrl, session.token);
90
- return Boolean(identity &&
91
- (identity.user.systemMode === 'DEV' ||
92
- identity.user.systemMode === 'GOD'));
41
+ }
42
+ async function main() {
43
+ enforceNodeVersion();
44
+ if (cmd === '--help' || cmd === '-h') {
45
+ printHelp();
46
+ process.exit(0);
93
47
  }
94
- catch {
95
- return false;
48
+ if (cmd === '--version' || cmd === '-v') {
49
+ console.log('0.3.0');
50
+ process.exit(0);
96
51
  }
97
- }
98
- async function registerAdminCommands() {
99
- if (!(await isCliAdmin())) {
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
- const admin = program
103
- .command('admin')
104
- .description('admin-only commands');
105
- admin
106
- .command('waitlist')
107
- .description('inspect waitlist signups (humans/agents)')
108
- .option('-a, --app-url <url>', 'hacklab app url (defaults to localhost)')
109
- .option('-r, --role <role>', 'all | human | agent')
110
- .option('-l, --limit <number>', 'max rows to return (1-500)')
111
- .option('-s, --search <email>', 'filter by email')
112
- .action(async (options) => {
113
- await adminWaitlistCommand(options);
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
- async function main() {
117
- await registerAdminCommands();
118
- await program.parseAsync(process.argv);
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((error) => {
121
- console.error(error instanceof Error ? error.message : String(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":"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"}
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"}