hacklab 0.0.1 → 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 (154) hide show
  1. package/README.md +48 -8
  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 -14
  28. package/dist/commands/login.d.ts.map +1 -1
  29. package/dist/commands/login.js +70 -102
  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 -1
  44. package/dist/commands/whoami.d.ts.map +1 -1
  45. package/dist/commands/whoami.js +10 -16
  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 +125 -134
  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 -12
  70. package/dist/session.d.ts.map +1 -1
  71. package/dist/session.js +46 -141
  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 -27
  87. package/dist/api/client.d.ts +0 -118
  88. package/dist/api/client.d.ts.map +0 -1
  89. package/dist/api/client.js +0 -214
  90. package/dist/api/client.js.map +0 -1
  91. package/dist/commands/brag.utils.d.ts +0 -12
  92. package/dist/commands/brag.utils.d.ts.map +0 -1
  93. package/dist/commands/brag.utils.js +0 -43
  94. package/dist/commands/brag.utils.js.map +0 -1
  95. package/dist/commands/essay.d.ts +0 -18
  96. package/dist/commands/essay.d.ts.map +0 -1
  97. package/dist/commands/essay.js +0 -117
  98. package/dist/commands/essay.js.map +0 -1
  99. package/dist/commands/init.d.ts +0 -16
  100. package/dist/commands/init.d.ts.map +0 -1
  101. package/dist/commands/init.js +0 -237
  102. package/dist/commands/init.js.map +0 -1
  103. package/dist/commands/join.d.ts +0 -10
  104. package/dist/commands/join.d.ts.map +0 -1
  105. package/dist/commands/join.js +0 -314
  106. package/dist/commands/join.js.map +0 -1
  107. package/dist/commands/link.d.ts +0 -17
  108. package/dist/commands/link.d.ts.map +0 -1
  109. package/dist/commands/link.js +0 -36
  110. package/dist/commands/link.js.map +0 -1
  111. package/dist/commands/login.utils.d.ts +0 -3
  112. package/dist/commands/login.utils.d.ts.map +0 -1
  113. package/dist/commands/login.utils.js +0 -13
  114. package/dist/commands/login.utils.js.map +0 -1
  115. package/dist/commands/new.d.ts +0 -15
  116. package/dist/commands/new.d.ts.map +0 -1
  117. package/dist/commands/new.js +0 -172
  118. package/dist/commands/new.js.map +0 -1
  119. package/dist/commands/new.utils.d.ts +0 -7
  120. package/dist/commands/new.utils.d.ts.map +0 -1
  121. package/dist/commands/new.utils.js +0 -50
  122. package/dist/commands/new.utils.js.map +0 -1
  123. package/dist/commands/onboard.d.ts +0 -10
  124. package/dist/commands/onboard.d.ts.map +0 -1
  125. package/dist/commands/onboard.js +0 -93
  126. package/dist/commands/onboard.js.map +0 -1
  127. package/dist/commands/tui.d.ts +0 -12
  128. package/dist/commands/tui.d.ts.map +0 -1
  129. package/dist/commands/tui.js +0 -112
  130. package/dist/commands/tui.js.map +0 -1
  131. package/dist/help-format.d.ts +0 -4
  132. package/dist/help-format.d.ts.map +0 -1
  133. package/dist/help-format.js +0 -30
  134. package/dist/help-format.js.map +0 -1
  135. package/dist/lab/config.d.ts +0 -32
  136. package/dist/lab/config.d.ts.map +0 -1
  137. package/dist/lab/config.js +0 -148
  138. package/dist/lab/config.js.map +0 -1
  139. package/dist/lab/contentStatus.d.ts +0 -6
  140. package/dist/lab/contentStatus.d.ts.map +0 -1
  141. package/dist/lab/contentStatus.js +0 -19
  142. package/dist/lab/contentStatus.js.map +0 -1
  143. package/dist/ui/banner.d.ts +0 -2
  144. package/dist/ui/banner.d.ts.map +0 -1
  145. package/dist/ui/banner.js +0 -22
  146. package/dist/ui/banner.js.map +0 -1
  147. package/dist/utils/findRepoRoot.d.ts +0 -2
  148. package/dist/utils/findRepoRoot.d.ts.map +0 -1
  149. package/dist/utils/findRepoRoot.js +0 -17
  150. package/dist/utils/findRepoRoot.js.map +0 -1
  151. package/dist/utils/pathExists.d.ts +0 -2
  152. package/dist/utils/pathExists.d.ts.map +0 -1
  153. package/dist/utils/pathExists.js +0 -11
  154. package/dist/utils/pathExists.js.map +0 -1
@@ -1,50 +0,0 @@
1
- export const ENTRY_TYPES = [
2
- 'project',
3
- 'guide',
4
- 'course',
5
- 'essay',
6
- 'research-paper',
7
- ];
8
- export function parseEntryType(value) {
9
- const normalized = value.trim().toLowerCase();
10
- if (!normalized) {
11
- return null;
12
- }
13
- if (normalized === 'guides') {
14
- return 'guide';
15
- }
16
- if (normalized === 'research' || normalized === 'paper') {
17
- return 'research-paper';
18
- }
19
- if (normalized === 'research paper') {
20
- return 'research-paper';
21
- }
22
- if (ENTRY_TYPES.includes(normalized)) {
23
- return normalized;
24
- }
25
- return null;
26
- }
27
- export function getEntryTypeLabel(entryType) {
28
- if (entryType === 'research-paper') {
29
- return 'research paper';
30
- }
31
- return entryType;
32
- }
33
- export function slugify(value) {
34
- const normalized = value
35
- .trim()
36
- .toLowerCase()
37
- .replace(/[^a-z0-9\s-_]/g, '')
38
- .replace(/[\s_]+/g, '-')
39
- .replace(/-+/g, '-')
40
- .replace(/^-|-$/g, '');
41
- return normalized;
42
- }
43
- export function titleFromSlug(slug) {
44
- return slug
45
- .split('-')
46
- .filter(Boolean)
47
- .map((part) => `${part[0].toUpperCase()}${part.slice(1)}`)
48
- .join(' ');
49
- }
50
- //# sourceMappingURL=new.utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"new.utils.js","sourceRoot":"","sources":["../../src/commands/new.utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,SAAS;IACT,OAAO;IACP,QAAQ;IACR,OAAO;IACP,gBAAgB;CACV,CAAA;AAIV,MAAM,UAAU,cAAc,CAAC,KAAa;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAE7C,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,OAAO,IAAI,CAAA;IACf,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAA;IAClB,CAAC;IAED,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QACtD,OAAO,gBAAgB,CAAA;IAC3B,CAAC;IAED,IAAI,UAAU,KAAK,gBAAgB,EAAE,CAAC;QAClC,OAAO,gBAAgB,CAAA;IAC3B,CAAC;IAED,IAAK,WAAiC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1D,OAAO,UAAuB,CAAA;IAClC,CAAC;IAED,OAAO,IAAI,CAAA;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IAClD,IAAI,SAAS,KAAK,gBAAgB,EAAE,CAAC;QACjC,OAAO,gBAAgB,CAAA;IAC3B,CAAC;IAED,OAAO,SAAS,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACjC,MAAM,UAAU,GAAG,KAAK;SACnB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAE1B,OAAO,UAAU,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACtC,OAAO,IAAI;SACN,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,IAAI,CAAC,GAAG,CAAC,CAAA;AAClB,CAAC"}
@@ -1,10 +0,0 @@
1
- type OnboardOptions = {
2
- appUrl?: string;
3
- username?: string;
4
- bio?: string;
5
- labName?: string;
6
- };
7
- export declare function getDefaultUsername(email: string): string;
8
- export declare function onboardCommand(options?: OnboardOptions): Promise<void>;
9
- export {};
10
- //# sourceMappingURL=onboard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AAUA,KAAK,cAAc,GAAG;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGhF"}
@@ -1,93 +0,0 @@
1
- import { cancel, intro, isCancel, note, outro, text } from '@clack/prompts';
2
- import { createCliLab, fetchCliLabs, fetchCliMe, updateCliMe, } from '../api/client.js';
3
- import { loadSession } from '../session.js';
4
- import { getAppUrl } from './login.utils.js';
5
- export function getDefaultUsername(email) {
6
- const localPart = email.trim().toLowerCase().split('@')[0] || 'hacker';
7
- return localPart.replace(/[^a-z0-9._-]/g, '') || 'hacker';
8
- }
9
- export async function onboardCommand(options = {}) {
10
- intro('hacklab onboarding');
11
- const session = await loadSession();
12
- if (!session) {
13
- outro('not logged in. run `hacklab login`.');
14
- process.exitCode = 1;
15
- return;
16
- }
17
- const appUrl = getAppUrl(options.appUrl || session.appUrl);
18
- const me = await fetchCliMe(appUrl, session.token);
19
- if (!me) {
20
- outro('your cli session is invalid or expired. run `hacklab login`.');
21
- process.exitCode = 1;
22
- return;
23
- }
24
- let username = options.username?.trim();
25
- let bio = options.bio;
26
- if (!me.name && !username) {
27
- const usernameInput = await text({
28
- message: 'username',
29
- placeholder: getDefaultUsername(me.email),
30
- });
31
- if (isCancel(usernameInput)) {
32
- cancel('onboarding cancelled.');
33
- process.exit(1);
34
- }
35
- username = String(usernameInput).trim();
36
- }
37
- if (me.bio === null && bio === undefined) {
38
- const bioInput = await text({
39
- message: 'bio (optional)',
40
- placeholder: 'builder, hacker, explorer',
41
- });
42
- if (isCancel(bioInput)) {
43
- cancel('onboarding cancelled.');
44
- process.exit(1);
45
- }
46
- bio = String(bioInput);
47
- }
48
- const shouldUpdateUsername = Boolean(username && username !== me.name);
49
- const shouldUpdateBio = bio !== undefined && bio !== me.bio;
50
- if (shouldUpdateUsername || shouldUpdateBio) {
51
- const updated = await updateCliMe(appUrl, session.token, {
52
- ...(shouldUpdateUsername ? { username } : {}),
53
- ...(shouldUpdateBio ? { bio } : {}),
54
- });
55
- note(updated.name || '-', 'username');
56
- }
57
- else {
58
- note(me.name || '-', 'username');
59
- }
60
- let labs = await fetchCliLabs(appUrl, session.token);
61
- if (labs.length === 0) {
62
- let labName = options.labName?.trim();
63
- if (!labName) {
64
- const labNameInput = await text({
65
- message: 'lab name',
66
- placeholder: `${(username || me.name || 'my').trim()} lab`,
67
- });
68
- if (isCancel(labNameInput)) {
69
- cancel('onboarding cancelled.');
70
- process.exit(1);
71
- }
72
- labName = String(labNameInput).trim();
73
- }
74
- if (!labName) {
75
- cancel('lab name is required.');
76
- process.exit(1);
77
- }
78
- const created = await createCliLab(appUrl, session.token, {
79
- name: labName,
80
- });
81
- note(created.lab.slug, created.created ? 'lab created' : 'lab');
82
- labs = [created.lab];
83
- }
84
- else {
85
- note(labs[0].slug, 'lab');
86
- }
87
- const firstLab = labs[0];
88
- outro([
89
- 'onboarding complete.',
90
- `studio: ${appUrl}/studio/lab/${firstLab.slug}`,
91
- ].join('\n'));
92
- }
93
- //# sourceMappingURL=onboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- type SlashCommandDefinition = {
2
- command: '/new' | '/help' | '/exit';
3
- description: string;
4
- };
5
- export declare function parseSlashCommand(rawInput: string): {
6
- command: string;
7
- args: string[];
8
- };
9
- export declare function getSlashCommandMatches(query: string): SlashCommandDefinition[];
10
- export declare function tuiCommand(): Promise<void>;
11
- export {};
12
- //# sourceMappingURL=tui.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"AAKA,KAAK,sBAAsB,GAAG;IAC1B,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;IACnC,WAAW,EAAE,MAAM,CAAA;CACtB,CAAA;AAiBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACjD,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;CACjB,CAMA;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAQ9E;AAuDD,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA6ChD"}
@@ -1,112 +0,0 @@
1
- import { cancel, intro, isCancel, note, outro, select, text } from '@clack/prompts';
2
- import { newCommand } from './new.js';
3
- import { printTuiSplash } from '../ui/banner.js';
4
- const SLASH_COMMANDS = [
5
- {
6
- command: '/new',
7
- description: 'create new content',
8
- },
9
- {
10
- command: '/help',
11
- description: 'show commands',
12
- },
13
- {
14
- command: '/exit',
15
- description: 'leave tui',
16
- },
17
- ];
18
- export function parseSlashCommand(rawInput) {
19
- const parts = rawInput.trim().split(/\s+/).filter(Boolean);
20
- return {
21
- command: parts[0] || '',
22
- args: parts.slice(1),
23
- };
24
- }
25
- export function getSlashCommandMatches(query) {
26
- const normalized = query.trim().toLowerCase();
27
- if (!normalized || normalized === '/') {
28
- return [...SLASH_COMMANDS];
29
- }
30
- return SLASH_COMMANDS.filter((entry) => entry.command.startsWith(normalized));
31
- }
32
- function commandListText() {
33
- return SLASH_COMMANDS.map((entry) => {
34
- return `${entry.command} - ${entry.description}`;
35
- }).join('\n');
36
- }
37
- async function pickSlashCommand(query) {
38
- const matches = getSlashCommandMatches(query);
39
- if (matches.length === 0) {
40
- return null;
41
- }
42
- const selected = await select({
43
- message: 'slash commands',
44
- options: matches.map((entry) => {
45
- return {
46
- value: entry.command,
47
- label: `${entry.command} ${entry.description}`,
48
- };
49
- }),
50
- });
51
- if (isCancel(selected)) {
52
- cancel('tui cancelled.');
53
- process.exit(1);
54
- }
55
- return String(selected);
56
- }
57
- async function runSlashCommand(command, args) {
58
- if (command === '/exit' || command === '/quit') {
59
- outro('leaving hacklab tui.');
60
- return true;
61
- }
62
- if (command === '/help') {
63
- note(commandListText(), 'slash commands');
64
- return false;
65
- }
66
- if (command === '/new') {
67
- const type = args[0];
68
- const slug = args[1];
69
- await newCommand(type, slug);
70
- return false;
71
- }
72
- note(`unknown command: ${command}. use /help to list commands.`, 'error');
73
- return false;
74
- }
75
- export async function tuiCommand() {
76
- printTuiSplash();
77
- intro('hacklab tui');
78
- note('type / to open slash commands', 'hint');
79
- note(commandListText(), 'slash commands');
80
- while (true) {
81
- const input = await text({
82
- message: 'tui',
83
- placeholder: '/',
84
- });
85
- if (isCancel(input)) {
86
- cancel('tui cancelled.');
87
- process.exit(1);
88
- }
89
- const value = String(input).trim();
90
- if (!value) {
91
- continue;
92
- }
93
- if (value.startsWith('/') && !value.includes(' ')) {
94
- const selected = await pickSlashCommand(value);
95
- if (!selected) {
96
- note(`no slash commands found for "${value}".`, 'error');
97
- continue;
98
- }
99
- const shouldExit = await runSlashCommand(selected, []);
100
- if (shouldExit) {
101
- return;
102
- }
103
- continue;
104
- }
105
- const parsed = parseSlashCommand(value);
106
- const shouldExit = await runSlashCommand(parsed.command, parsed.args);
107
- if (shouldExit) {
108
- return;
109
- }
110
- }
111
- }
112
- //# sourceMappingURL=tui.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { Help } from 'commander';
2
- export declare const HELP_BANNER: string;
3
- export declare function createGreenHelpConfig(): Partial<Help>;
4
- //# sourceMappingURL=help-format.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"help-format.d.ts","sourceRoot":"","sources":["../src/help-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAkBrC,eAAO,MAAM,WAAW,QAMZ,CAAA;AAEZ,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD"}
@@ -1,30 +0,0 @@
1
- const ANSI_RESET = '\x1b[0m';
2
- const ANSI_BOLD = '\x1b[1m';
3
- const ANSI_GREEN = '\x1b[32m';
4
- function green(value) {
5
- return `${ANSI_GREEN}${value}${ANSI_RESET}`;
6
- }
7
- function greenBold(value) {
8
- return `${ANSI_BOLD}${ANSI_GREEN}${value}${ANSI_RESET}`;
9
- }
10
- function bold(value) {
11
- return `${ANSI_BOLD}${value}${ANSI_RESET}`;
12
- }
13
- export const HELP_BANNER = [
14
- '',
15
- bold('👽 hacklab'),
16
- '',
17
- `${bold('☠︎')} ${greenBold('information wants to be free')} ${bold('☠︎')}`,
18
- '',
19
- ].join('\n');
20
- export function createGreenHelpConfig() {
21
- return {
22
- styleTitle: (title) => {
23
- if (title === 'Options:' || title === 'Commands:') {
24
- return greenBold(title);
25
- }
26
- return title;
27
- },
28
- };
29
- }
30
- //# sourceMappingURL=help-format.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"help-format.js","sourceRoot":"","sources":["../src/help-format.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,SAAS,CAAA;AAC5B,MAAM,SAAS,GAAG,SAAS,CAAA;AAC3B,MAAM,UAAU,GAAG,UAAU,CAAA;AAE7B,SAAS,KAAK,CAAC,KAAa;IACxB,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,UAAU,EAAE,CAAA;AAC/C,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC5B,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,UAAU,EAAE,CAAA;AAC3D,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACvB,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,EAAE,CAAA;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,EAAE;IACF,IAAI,CAAC,YAAY,CAAC;IAClB,EAAE;IACF,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,8BAA8B,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;IAC1E,EAAE;CACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,UAAU,qBAAqB;IACjC,OAAO;QACH,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE;YAC1B,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAChD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAA;YAC3B,CAAC;YAED,OAAO,KAAK,CAAA;QAChB,CAAC;KACJ,CAAA;AACL,CAAC"}
@@ -1,32 +0,0 @@
1
- export declare const HACKLAB_SCHEMA_VERSION = 1;
2
- export type WorkspaceType = 'personal' | 'team' | 'org';
3
- export type HacklabConfig = {
4
- schemaVersion: number;
5
- labId?: string;
6
- labSlug: string;
7
- labName: string;
8
- workspaceType: WorkspaceType;
9
- owner: string;
10
- contentDirs: {
11
- projects: string;
12
- guides: string;
13
- courses: string;
14
- essays: string;
15
- research: string;
16
- };
17
- };
18
- type CreateHacklabConfigOptions = {
19
- labId?: string;
20
- labSlug?: string;
21
- labName: string;
22
- workspaceType?: WorkspaceType;
23
- owner?: string;
24
- };
25
- export declare function createDefaultHacklabConfig(options: string | CreateHacklabConfigOptions): HacklabConfig;
26
- export declare function getHacklabConfigDir(repoRoot: string): string;
27
- export declare function getHacklabConfigPath(repoRoot: string): string;
28
- export declare function hasHacklabConfig(repoRoot: string): Promise<boolean>;
29
- export declare function loadHacklabConfig(repoRoot: string): Promise<HacklabConfig | null>;
30
- export declare function saveHacklabConfig(repoRoot: string, config: HacklabConfig): Promise<void>;
31
- export {};
32
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lab/config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,IAAI,CAAA;AAEvC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAA;AAEvD,MAAM,MAAM,aAAa,GAAG;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,aAAa,CAAA;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE;QACT,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;KACnB,CAAA;CACJ,CAAA;AAED,KAAK,0BAA0B,GAAG;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AA0FD,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,MAAM,GAAG,0BAA0B,GAC7C,aAAa,CAqBf;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE;AAED,wBAAsB,iBAAiB,CACnC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA+C/B;AAED,wBAAsB,iBAAiB,CACnC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -1,148 +0,0 @@
1
- import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
- import { join } from 'node:path';
3
- import { pathExists } from '../utils/pathExists.js';
4
- export const HACKLAB_SCHEMA_VERSION = 1;
5
- const DEFAULT_CONTENT_DIRS = {
6
- projects: 'projects',
7
- guides: 'guides',
8
- courses: 'courses',
9
- essays: 'essays',
10
- research: 'research',
11
- };
12
- const WORKSPACE_TYPES = ['personal', 'team', 'org'];
13
- function slugify(rawValue) {
14
- const normalized = rawValue
15
- .trim()
16
- .toLowerCase()
17
- .replace(/[^a-z0-9\s-_]/g, '')
18
- .replace(/[\s_]+/g, '-')
19
- .replace(/-+/g, '-')
20
- .replace(/^-|-$/g, '');
21
- return normalized;
22
- }
23
- function normalizeLabName(rawName) {
24
- const trimmed = rawName.trim();
25
- if (!trimmed) {
26
- return 'my-lab';
27
- }
28
- return trimmed;
29
- }
30
- function normalizeLabSlug(rawValue) {
31
- const normalized = slugify(rawValue);
32
- if (!normalized) {
33
- return 'my-lab';
34
- }
35
- return normalized;
36
- }
37
- function normalizeOwner(rawValue) {
38
- const normalized = rawValue
39
- .trim()
40
- .toLowerCase()
41
- .replace(/\s+/g, '-')
42
- .replace(/[^a-z0-9._-]/g, '');
43
- if (!normalized) {
44
- return 'unknown';
45
- }
46
- return normalized;
47
- }
48
- function getDefaultOwner() {
49
- return (process.env.HACKLAB_OWNER ||
50
- process.env.GITHUB_USER ||
51
- process.env.GITHUB_ACTOR ||
52
- process.env.USER ||
53
- process.env.USERNAME ||
54
- 'unknown');
55
- }
56
- function normalizeWorkspaceType(value) {
57
- if (typeof value !== 'string') {
58
- return null;
59
- }
60
- if (WORKSPACE_TYPES.includes(value)) {
61
- return value;
62
- }
63
- return null;
64
- }
65
- function normalizeLabId(rawValue) {
66
- if (typeof rawValue !== 'string') {
67
- return undefined;
68
- }
69
- const trimmed = rawValue.trim();
70
- return trimmed || undefined;
71
- }
72
- export function createDefaultHacklabConfig(options) {
73
- const normalizedOptions = typeof options === 'string' ? { labName: options } : options;
74
- const labName = normalizeLabName(normalizedOptions.labName);
75
- const workspaceType = normalizedOptions.workspaceType ?? 'personal';
76
- const labSlug = normalizeLabSlug(normalizedOptions.labSlug || labName);
77
- const owner = normalizeOwner(normalizedOptions.owner || getDefaultOwner());
78
- const labId = normalizeLabId(normalizedOptions.labId);
79
- return {
80
- schemaVersion: HACKLAB_SCHEMA_VERSION,
81
- ...(labId ? { labId } : {}),
82
- labSlug,
83
- labName,
84
- workspaceType,
85
- owner,
86
- contentDirs: {
87
- ...DEFAULT_CONTENT_DIRS,
88
- },
89
- };
90
- }
91
- export function getHacklabConfigDir(repoRoot) {
92
- return join(repoRoot, '.hacklab');
93
- }
94
- export function getHacklabConfigPath(repoRoot) {
95
- return join(getHacklabConfigDir(repoRoot), 'config.json');
96
- }
97
- export async function hasHacklabConfig(repoRoot) {
98
- return pathExists(getHacklabConfigPath(repoRoot));
99
- }
100
- export async function loadHacklabConfig(repoRoot) {
101
- const configPath = getHacklabConfigPath(repoRoot);
102
- if (!(await pathExists(configPath))) {
103
- return null;
104
- }
105
- try {
106
- const content = await readFile(configPath, 'utf8');
107
- const parsed = JSON.parse(content);
108
- const workspaceType = normalizeWorkspaceType(parsed.workspaceType);
109
- if (parsed.schemaVersion !== HACKLAB_SCHEMA_VERSION ||
110
- !parsed.labName ||
111
- !workspaceType ||
112
- !parsed.contentDirs?.projects ||
113
- !parsed.contentDirs?.courses ||
114
- !parsed.contentDirs?.essays ||
115
- !parsed.contentDirs?.research) {
116
- return null;
117
- }
118
- const labName = normalizeLabName(parsed.labName);
119
- const owner = normalizeOwner(parsed.owner || getDefaultOwner());
120
- const labSlug = normalizeLabSlug(parsed.labSlug || parsed.labName);
121
- const labId = normalizeLabId(parsed.labId);
122
- return {
123
- schemaVersion: parsed.schemaVersion,
124
- ...(labId ? { labId } : {}),
125
- labSlug,
126
- labName,
127
- workspaceType,
128
- owner,
129
- contentDirs: {
130
- projects: parsed.contentDirs.projects,
131
- guides: parsed.contentDirs.guides || DEFAULT_CONTENT_DIRS.guides,
132
- courses: parsed.contentDirs.courses,
133
- essays: parsed.contentDirs.essays,
134
- research: parsed.contentDirs.research,
135
- },
136
- };
137
- }
138
- catch {
139
- return null;
140
- }
141
- }
142
- export async function saveHacklabConfig(repoRoot, config) {
143
- const configDir = getHacklabConfigDir(repoRoot);
144
- const configPath = getHacklabConfigPath(repoRoot);
145
- await mkdir(configDir, { recursive: true });
146
- await writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
147
- }
148
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lab/config.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- export declare const CONTENT_STATUSES: readonly ["idea", "draft", "in_progress", "in_review", "published", "archived"];
2
- export type ContentStatus = (typeof CONTENT_STATUSES)[number];
3
- export declare const DEFAULT_CONTENT_STATUS: ContentStatus;
4
- export declare const DEFAULT_CONTENT_VISIBILITY = "private";
5
- export declare const STATUS_DESCRIPTIONS: Record<ContentStatus, string>;
6
- //# sourceMappingURL=contentStatus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contentStatus.d.ts","sourceRoot":"","sources":["../../src/lab/contentStatus.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,iFAOnB,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7D,eAAO,MAAM,sBAAsB,EAAE,aAAuB,CAAA;AAC5D,eAAO,MAAM,0BAA0B,YAAY,CAAA;AAEnD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAO7D,CAAA"}
@@ -1,19 +0,0 @@
1
- export const CONTENT_STATUSES = [
2
- 'idea',
3
- 'draft',
4
- 'in_progress',
5
- 'in_review',
6
- 'published',
7
- 'archived',
8
- ];
9
- export const DEFAULT_CONTENT_STATUS = 'draft';
10
- export const DEFAULT_CONTENT_VISIBILITY = 'private';
11
- export const STATUS_DESCRIPTIONS = {
12
- idea: 'early concept or note, no substantial draft yet',
13
- draft: 'first pass exists but still rough',
14
- in_progress: 'actively being developed toward completion',
15
- in_review: 'ready for feedback before publishing',
16
- published: 'live and considered complete for now',
17
- archived: 'retired and not actively maintained',
18
- };
19
- //# sourceMappingURL=contentStatus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contentStatus.js","sourceRoot":"","sources":["../../src/lab/contentStatus.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,MAAM;IACN,OAAO;IACP,aAAa;IACb,WAAW;IACX,WAAW;IACX,UAAU;CACJ,CAAA;AAIV,MAAM,CAAC,MAAM,sBAAsB,GAAkB,OAAO,CAAA;AAC5D,MAAM,CAAC,MAAM,0BAA0B,GAAG,SAAS,CAAA;AAEnD,MAAM,CAAC,MAAM,mBAAmB,GAAkC;IAC9D,IAAI,EAAE,iDAAiD;IACvD,KAAK,EAAE,mCAAmC;IAC1C,WAAW,EAAE,4CAA4C;IACzD,SAAS,EAAE,sCAAsC;IACjD,SAAS,EAAE,sCAAsC;IACjD,QAAQ,EAAE,qCAAqC;CAClD,CAAA"}
@@ -1,2 +0,0 @@
1
- export declare function printTuiSplash(): void;
2
- //# sourceMappingURL=banner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AAgBA,wBAAgB,cAAc,IAAI,IAAI,CASrC"}
package/dist/ui/banner.js DELETED
@@ -1,22 +0,0 @@
1
- const BANNER = String.raw `
2
- █████ █████ ████ █████
3
- ░░███ ░░███ ░░███ ░░███
4
- ░███████ ██████ ██████ ░███ █████ ░███ ██████ ░███████
5
- ░███░░███ ░░░░░███ ███░░███ ░███░░███ ░███ ░░░░░███ ░███░░███
6
- ░███ ░███ ███████ ░███ ░░░ ░██████░ ░███ ███████ ░███ ░███
7
- ░███ ░███ ███░░███ ░███ ███ ░███░░███ ░███ ███░░███ ░███ ░███
8
- ████ █████░░████████░░██████ ████ █████ █████░░████████ ████████
9
- ░░░░ ░░░░░ ░░░░░░░░ ░░░░░░ ░░░░ ░░░░░ ░░░░░ ░░░░░░░░ ░░░░░░░░
10
- `;
11
- const TUI_TAGLINE = '☠️ 👽 hacklab 2026.2.19 (woz-preview) — we ship features faster than bugs can hide.';
12
- let printed = false;
13
- export function printTuiSplash() {
14
- if (printed) {
15
- return;
16
- }
17
- const GREEN = '\x1b[32m';
18
- const RESET = '\x1b[0m';
19
- console.log(`${GREEN}${BANNER}\n${TUI_TAGLINE}${RESET}`);
20
- printed = true;
21
- }
22
- //# sourceMappingURL=banner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;CASxB,CAAA;AAED,MAAM,WAAW,GACb,qFAAqF,CAAA;AAEzF,IAAI,OAAO,GAAG,KAAK,CAAA;AAEnB,MAAM,UAAU,cAAc;IAC1B,IAAI,OAAO,EAAE,CAAC;QACV,OAAM;IACV,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAA;IACxB,MAAM,KAAK,GAAG,SAAS,CAAA;IACvB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,MAAM,KAAK,WAAW,GAAG,KAAK,EAAE,CAAC,CAAA;IACxD,OAAO,GAAG,IAAI,CAAA;AAClB,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function findRepoRoot(startDir?: string): Promise<string>;
2
- //# sourceMappingURL=findRepoRoot.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"findRepoRoot.d.ts","sourceRoot":"","sources":["../../src/utils/findRepoRoot.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,QAAQ,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB5E"}
@@ -1,17 +0,0 @@
1
- import { dirname, resolve } from 'node:path';
2
- import { pathExists } from './pathExists.js';
3
- export async function findRepoRoot(startDir = process.cwd()) {
4
- const initialPath = resolve(startDir);
5
- let currentPath = initialPath;
6
- while (true) {
7
- if (await pathExists(`${currentPath}/.git`)) {
8
- return currentPath;
9
- }
10
- const parentPath = dirname(currentPath);
11
- if (parentPath === currentPath) {
12
- return initialPath;
13
- }
14
- currentPath = parentPath;
15
- }
16
- }
17
- //# sourceMappingURL=findRepoRoot.js.map