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.
- package/README.md +48 -8
- 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 -14
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +70 -102
- 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 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +10 -16
- 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 +125 -134
- 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 -12
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +46 -141
- 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 -27
- package/dist/api/client.d.ts +0 -118
- package/dist/api/client.d.ts.map +0 -1
- package/dist/api/client.js +0 -214
- package/dist/api/client.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/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/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,33 @@
|
|
|
1
|
+
type SkillDetection = {
|
|
2
|
+
skillClass: string;
|
|
3
|
+
skill: string;
|
|
4
|
+
level: number;
|
|
5
|
+
};
|
|
6
|
+
type GitHubData = {
|
|
7
|
+
bio: string | null;
|
|
8
|
+
avatarUrl: string | null;
|
|
9
|
+
blogUrl: string | null;
|
|
10
|
+
repos: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
description: string | null;
|
|
13
|
+
url: string;
|
|
14
|
+
language: string | null;
|
|
15
|
+
stars: number;
|
|
16
|
+
updatedAt: string;
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Scan local git repos for languages and frameworks.
|
|
21
|
+
* Looks in common workspace directories.
|
|
22
|
+
*/
|
|
23
|
+
export declare function scanSkillTree(): Promise<SkillDetection[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Fetch GitHub profile data using gh CLI (already authenticated).
|
|
26
|
+
*/
|
|
27
|
+
export declare function scanGitHub(): Promise<GitHubData | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Run the full profile scan and submit to hacklab.
|
|
30
|
+
*/
|
|
31
|
+
export declare function scanProfile(): Promise<void>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=scan-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-profile.d.ts","sourceRoot":"","sources":["../../src/commands/scan-profile.ts"],"names":[],"mappings":"AAQA,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,KAAK,UAAU,GAAG;IAChB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;QAC1B,GAAG,EAAE,MAAM,CAAA;QACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;KAClB,CAAC,CAAA;CACH,CAAA;AA2DD;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CA2F/D;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA2B7D;AAED;;GAEG;AACH,wBAAsB,WAAW,kBA+GhC"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { loadSession } from '../session.js';
|
|
6
|
+
import { bold, dim, error, info, success } from '../ui.js';
|
|
7
|
+
// Map file extensions and config files to skill class + skill name
|
|
8
|
+
const LANGUAGE_SKILL_MAP = {
|
|
9
|
+
ts: { skillClass: 'builder', skill: 'TypeScript' },
|
|
10
|
+
tsx: { skillClass: 'builder', skill: 'React' },
|
|
11
|
+
js: { skillClass: 'builder', skill: 'JavaScript' },
|
|
12
|
+
jsx: { skillClass: 'builder', skill: 'React' },
|
|
13
|
+
py: { skillClass: 'hacker', skill: 'Python' },
|
|
14
|
+
go: { skillClass: 'builder', skill: 'Go' },
|
|
15
|
+
rs: { skillClass: 'builder', skill: 'Rust' },
|
|
16
|
+
swift: { skillClass: 'builder', skill: 'Swift' },
|
|
17
|
+
kt: { skillClass: 'builder', skill: 'Kotlin' },
|
|
18
|
+
java: { skillClass: 'builder', skill: 'Java' },
|
|
19
|
+
rb: { skillClass: 'builder', skill: 'Ruby' },
|
|
20
|
+
php: { skillClass: 'builder', skill: 'PHP' },
|
|
21
|
+
cs: { skillClass: 'builder', skill: 'C#' },
|
|
22
|
+
cpp: { skillClass: 'builder', skill: 'C++' },
|
|
23
|
+
c: { skillClass: 'builder', skill: 'C' },
|
|
24
|
+
sol: { skillClass: 'hacker', skill: 'Solidity' },
|
|
25
|
+
sql: { skillClass: 'operator', skill: 'SQL' },
|
|
26
|
+
prisma: { skillClass: 'operator', skill: 'Prisma' },
|
|
27
|
+
proto: { skillClass: 'builder', skill: 'Protobuf' },
|
|
28
|
+
};
|
|
29
|
+
const CONFIG_FILE_SKILL_MAP = {
|
|
30
|
+
'next.config.js': { skillClass: 'builder', skill: 'Next.js' },
|
|
31
|
+
'next.config.ts': { skillClass: 'builder', skill: 'Next.js' },
|
|
32
|
+
'next.config.mjs': { skillClass: 'builder', skill: 'Next.js' },
|
|
33
|
+
'nuxt.config.ts': { skillClass: 'builder', skill: 'Nuxt' },
|
|
34
|
+
'svelte.config.js': { skillClass: 'builder', skill: 'Svelte' },
|
|
35
|
+
'astro.config.mjs': { skillClass: 'builder', skill: 'Astro' },
|
|
36
|
+
'tailwind.config.js': { skillClass: 'designer', skill: 'Tailwind CSS' },
|
|
37
|
+
'tailwind.config.ts': { skillClass: 'designer', skill: 'Tailwind CSS' },
|
|
38
|
+
'postcss.config.js': { skillClass: 'designer', skill: 'CSS' },
|
|
39
|
+
Dockerfile: { skillClass: 'operator', skill: 'Docker' },
|
|
40
|
+
'docker-compose.yml': { skillClass: 'operator', skill: 'Docker' },
|
|
41
|
+
'docker-compose.yaml': { skillClass: 'operator', skill: 'Docker' },
|
|
42
|
+
'.github': { skillClass: 'operator', skill: 'GitHub Actions' },
|
|
43
|
+
'fly.toml': { skillClass: 'operator', skill: 'Fly.io' },
|
|
44
|
+
'vercel.json': { skillClass: 'operator', skill: 'Vercel' },
|
|
45
|
+
'terraform.tf': { skillClass: 'operator', skill: 'Terraform' },
|
|
46
|
+
'go.mod': { skillClass: 'builder', skill: 'Go' },
|
|
47
|
+
'Cargo.toml': { skillClass: 'builder', skill: 'Rust' },
|
|
48
|
+
'pyproject.toml': { skillClass: 'hacker', skill: 'Python' },
|
|
49
|
+
'requirements.txt': { skillClass: 'hacker', skill: 'Python' },
|
|
50
|
+
Gemfile: { skillClass: 'builder', skill: 'Ruby' },
|
|
51
|
+
'CLAUDE.md': { skillClass: 'hacker', skill: 'Claude Code' },
|
|
52
|
+
'.cursor': { skillClass: 'hacker', skill: 'Cursor' },
|
|
53
|
+
'AGENTS.md': { skillClass: 'hacker', skill: 'Codex' },
|
|
54
|
+
'DESIGN.md': { skillClass: 'designer', skill: 'Design Systems' },
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Scan local git repos for languages and frameworks.
|
|
58
|
+
* Looks in common workspace directories.
|
|
59
|
+
*/
|
|
60
|
+
export async function scanSkillTree() {
|
|
61
|
+
const home = homedir();
|
|
62
|
+
const searchDirs = [
|
|
63
|
+
join(home, 'gh'),
|
|
64
|
+
join(home, 'projects'),
|
|
65
|
+
join(home, 'code'),
|
|
66
|
+
join(home, 'dev'),
|
|
67
|
+
join(home, 'src'),
|
|
68
|
+
join(home, 'repos'),
|
|
69
|
+
join(home, 'workspace'),
|
|
70
|
+
join(home, 'Developer'),
|
|
71
|
+
join(home, 'Documents', 'GitHub'),
|
|
72
|
+
];
|
|
73
|
+
const skillCounts = new Map();
|
|
74
|
+
for (const searchDir of searchDirs) {
|
|
75
|
+
try {
|
|
76
|
+
await stat(searchDir);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const entries = await readdir(searchDir, {
|
|
83
|
+
withFileTypes: true,
|
|
84
|
+
});
|
|
85
|
+
for (const entry of entries) {
|
|
86
|
+
if (!entry.isDirectory())
|
|
87
|
+
continue;
|
|
88
|
+
const repoDir = join(searchDir, entry.name);
|
|
89
|
+
// Check if it's a git repo
|
|
90
|
+
try {
|
|
91
|
+
await stat(join(repoDir, '.git'));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
// Scan for config files
|
|
97
|
+
try {
|
|
98
|
+
const files = await readdir(repoDir);
|
|
99
|
+
for (const file of files) {
|
|
100
|
+
const mapping = CONFIG_FILE_SKILL_MAP[file];
|
|
101
|
+
if (mapping) {
|
|
102
|
+
const key = `${mapping.skillClass}:${mapping.skill}`;
|
|
103
|
+
skillCounts.set(key, (skillCounts.get(key) ?? 0) + 1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// skip
|
|
109
|
+
}
|
|
110
|
+
// Quick scan for file extensions (top level + src/)
|
|
111
|
+
const dirsToScan = [repoDir, join(repoDir, 'src')];
|
|
112
|
+
for (const dir of dirsToScan) {
|
|
113
|
+
try {
|
|
114
|
+
const files = await readdir(dir);
|
|
115
|
+
for (const file of files) {
|
|
116
|
+
const ext = file.split('.').pop();
|
|
117
|
+
if (ext && LANGUAGE_SKILL_MAP[ext]) {
|
|
118
|
+
const mapping = LANGUAGE_SKILL_MAP[ext];
|
|
119
|
+
const key = `${mapping.skillClass}:${mapping.skill}`;
|
|
120
|
+
skillCounts.set(key, (skillCounts.get(key) ?? 0) + 1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// skip
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// can't read dir
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Convert counts to skill levels (more repos = higher level)
|
|
135
|
+
const skills = [];
|
|
136
|
+
for (const [key, count] of skillCounts) {
|
|
137
|
+
const [skillClass, skill] = key.split(':');
|
|
138
|
+
// Level: 1 repo = 1, 3+ repos = 2, 6+ repos = 3, 10+ = 4, 20+ = 5
|
|
139
|
+
let level = 1;
|
|
140
|
+
if (count >= 20)
|
|
141
|
+
level = 5;
|
|
142
|
+
else if (count >= 10)
|
|
143
|
+
level = 4;
|
|
144
|
+
else if (count >= 6)
|
|
145
|
+
level = 3;
|
|
146
|
+
else if (count >= 3)
|
|
147
|
+
level = 2;
|
|
148
|
+
skills.push({ skillClass: skillClass, skill: skill, level });
|
|
149
|
+
}
|
|
150
|
+
return skills.sort((a, b) => b.level - a.level);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Fetch GitHub profile data using gh CLI (already authenticated).
|
|
154
|
+
*/
|
|
155
|
+
export async function scanGitHub() {
|
|
156
|
+
try {
|
|
157
|
+
// Get user profile
|
|
158
|
+
const profileRaw = execSync("gh api user --jq '{ login: .login, bio: .bio, avatar_url: .avatar_url, blog: .blog }'", { encoding: 'utf8', timeout: 10000 }).trim();
|
|
159
|
+
const profile = JSON.parse(profileRaw);
|
|
160
|
+
// Get top repos (by stars, recently updated)
|
|
161
|
+
const reposRaw = execSync('gh api "user/repos?sort=updated&per_page=20&type=owner" --jq \'[.[] | select(.fork == false) | { name: .name, description: .description, url: .html_url, language: .language, stars: .stargazers_count, updatedAt: .updated_at }]\'', { encoding: 'utf8', timeout: 15000 }).trim();
|
|
162
|
+
const repos = JSON.parse(reposRaw);
|
|
163
|
+
return {
|
|
164
|
+
bio: profile.bio || null,
|
|
165
|
+
avatarUrl: profile.avatar_url || null,
|
|
166
|
+
blogUrl: profile.blog || null,
|
|
167
|
+
repos,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Run the full profile scan and submit to hacklab.
|
|
176
|
+
*/
|
|
177
|
+
export async function scanProfile() {
|
|
178
|
+
const session = await loadSession();
|
|
179
|
+
if (!session) {
|
|
180
|
+
error('not logged in');
|
|
181
|
+
info(`run ${dim('hacklab login')} first`);
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
const handle = session.handle ?? 'you';
|
|
185
|
+
const appUrl = session.appUrl.replace(/\/$/, '');
|
|
186
|
+
console.log('');
|
|
187
|
+
console.log(bold(' Building your profile...'));
|
|
188
|
+
console.log(dim(' Scanning repos, GitHub, and blog. Takes a moment.'));
|
|
189
|
+
console.log('');
|
|
190
|
+
// 1. Skill tree
|
|
191
|
+
info('scanning local repos for skills...');
|
|
192
|
+
const skills = await scanSkillTree();
|
|
193
|
+
if (skills.length > 0) {
|
|
194
|
+
info(` found ${bold(String(skills.length))} skills across ${new Set(skills.map((s) => s.skillClass)).size} classes`);
|
|
195
|
+
for (const s of skills.slice(0, 8)) {
|
|
196
|
+
info(` ${dim(s.skillClass)} / ${s.skill} (lv.${s.level})`);
|
|
197
|
+
}
|
|
198
|
+
if (skills.length > 8) {
|
|
199
|
+
info(` ${dim(`...and ${skills.length - 8} more`)}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
info(` ${dim('no repos found in common directories')}`);
|
|
204
|
+
}
|
|
205
|
+
console.log('');
|
|
206
|
+
// 2. GitHub
|
|
207
|
+
info('fetching GitHub profile...');
|
|
208
|
+
const github = await scanGitHub();
|
|
209
|
+
if (github) {
|
|
210
|
+
info(` bio: ${github.bio ?? dim('(none)')}`);
|
|
211
|
+
info(` blog: ${github.blogUrl ?? dim('(none)')}`);
|
|
212
|
+
info(` repos: ${github.repos.length} (non-fork, recent)`);
|
|
213
|
+
const topRepos = github.repos.sort((a, b) => b.stars - a.stars).slice(0, 5);
|
|
214
|
+
for (const r of topRepos) {
|
|
215
|
+
info(` ${r.name} ${r.language ? dim(`(${r.language})`) : ''} ${r.stars > 0 ? `${r.stars}*` : ''}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
info(` ${dim('gh CLI not found or not authenticated. run gh auth login')}`);
|
|
220
|
+
}
|
|
221
|
+
console.log('');
|
|
222
|
+
// 3. Submit skills
|
|
223
|
+
if (skills.length > 0) {
|
|
224
|
+
info('submitting skills...');
|
|
225
|
+
const res = await fetch(`${appUrl}/api/skills`, {
|
|
226
|
+
method: 'POST',
|
|
227
|
+
headers: {
|
|
228
|
+
'Content-Type': 'application/json',
|
|
229
|
+
Authorization: `Bearer ${session.token}`,
|
|
230
|
+
},
|
|
231
|
+
body: JSON.stringify({ skills }),
|
|
232
|
+
});
|
|
233
|
+
if (res.ok) {
|
|
234
|
+
success(`${skills.length} skills synced`);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
info(` ${dim('skills API not available yet (will sync later)')}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// 4. Submit GitHub repos as projects
|
|
241
|
+
if (github && github.repos.length > 0) {
|
|
242
|
+
info('syncing top repos as projects...');
|
|
243
|
+
let synced = 0;
|
|
244
|
+
for (const repo of github.repos.slice(0, 10)) {
|
|
245
|
+
const res = await fetch(`${appUrl}/api/projects`, {
|
|
246
|
+
method: 'POST',
|
|
247
|
+
headers: {
|
|
248
|
+
'Content-Type': 'application/json',
|
|
249
|
+
Authorization: `Bearer ${session.token}`,
|
|
250
|
+
},
|
|
251
|
+
body: JSON.stringify({
|
|
252
|
+
slug: repo.name,
|
|
253
|
+
title: repo.name,
|
|
254
|
+
description: repo.description,
|
|
255
|
+
repoUrl: repo.url,
|
|
256
|
+
tags: repo.language ? [repo.language] : [],
|
|
257
|
+
}),
|
|
258
|
+
});
|
|
259
|
+
if (res.ok)
|
|
260
|
+
synced++;
|
|
261
|
+
}
|
|
262
|
+
if (synced > 0) {
|
|
263
|
+
success(`${synced} repos synced as projects`);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
info(` ${dim('projects API not available yet (will sync later)')}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// 5. Set blog URL if found
|
|
270
|
+
if (github?.blogUrl) {
|
|
271
|
+
info(`blog detected: ${bold(github.blogUrl)}`);
|
|
272
|
+
info(` ${dim('RSS sync will start automatically after profile is set up')}`);
|
|
273
|
+
}
|
|
274
|
+
console.log('');
|
|
275
|
+
success('profile scan complete');
|
|
276
|
+
info(`view: ${bold(`${appUrl}/${handle}`)}`);
|
|
277
|
+
console.log('');
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=scan-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-profile.js","sourceRoot":"","sources":["../../src/commands/scan-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The hero command: the guided signup ritual.
|
|
3
|
+
*
|
|
4
|
+
* scan → anonymous rank → pick username + fields → GitHub OAuth → claim
|
|
5
|
+
*
|
|
6
|
+
* Value (rank) is shown before any account exists; GitHub auth comes last.
|
|
7
|
+
* Each stage degrades on its own terms (see the per-stage handling below) so a
|
|
8
|
+
* network blip on the vanity rank never blocks the actual signup.
|
|
9
|
+
*/
|
|
10
|
+
export declare function signup(): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=signup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.d.ts","sourceRoot":"","sources":["../../src/commands/signup.ts"],"names":[],"mappings":"AAoBA;;;;;;;;GAQG;AACH,wBAAsB,MAAM,kBAiL3B"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import { formatTokens, scanAllTools, } from '../scanners/index.js';
|
|
3
|
+
import { getAppUrl, loadSession } from '../session.js';
|
|
4
|
+
import { bold, dim, info } from '../ui.js';
|
|
5
|
+
import { login } from './login.js';
|
|
6
|
+
const TOOL_LABELS = {
|
|
7
|
+
claude_code: 'Claude Code',
|
|
8
|
+
codex: 'Codex',
|
|
9
|
+
cursor: 'Cursor',
|
|
10
|
+
openclaw: 'OpenClaw',
|
|
11
|
+
hermes: 'Hermes',
|
|
12
|
+
opencode: 'OpenCode',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The hero command: the guided signup ritual.
|
|
16
|
+
*
|
|
17
|
+
* scan → anonymous rank → pick username + fields → GitHub OAuth → claim
|
|
18
|
+
*
|
|
19
|
+
* Value (rank) is shown before any account exists; GitHub auth comes last.
|
|
20
|
+
* Each stage degrades on its own terms (see the per-stage handling below) so a
|
|
21
|
+
* network blip on the vanity rank never blocks the actual signup.
|
|
22
|
+
*/
|
|
23
|
+
export async function signup() {
|
|
24
|
+
clack.intro(bold('hacklab'));
|
|
25
|
+
const appUrl = getAppUrl();
|
|
26
|
+
// ── Stage 1: scan ────────────────────────────────────────────────────────
|
|
27
|
+
const spin = clack.spinner();
|
|
28
|
+
spin.start('scanning local AI tool usage');
|
|
29
|
+
let scan;
|
|
30
|
+
try {
|
|
31
|
+
scan = await scanAllTools();
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
spin.stop('scan failed');
|
|
35
|
+
clack.cancel(`couldn't read local AI usage: ${err instanceof Error ? err.message : String(err)}`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
spin.stop('scan complete');
|
|
39
|
+
for (const [tool, total] of Object.entries(scan.toolTotals)) {
|
|
40
|
+
if (total > 0) {
|
|
41
|
+
info(`${(TOOL_LABELS[tool] ?? tool).padEnd(12)} ${formatTokens(total)} tokens`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
info(bold(`total: ${formatTokens(scan.grandTotal)} tokens`));
|
|
45
|
+
// Empty-scan branch: no hard floor gate, but nothing to rank — let the user
|
|
46
|
+
// decide whether to continue.
|
|
47
|
+
if (scan.grandTotal <= 0) {
|
|
48
|
+
const cont = await clack.confirm({
|
|
49
|
+
message: 'No AI token usage found on this machine. Sign up anyway? (you can sync usage later)',
|
|
50
|
+
initialValue: false,
|
|
51
|
+
});
|
|
52
|
+
if (clack.isCancel(cont) || !cont) {
|
|
53
|
+
clack.outro(dim('come back after some Claude Code / Codex / Cursor sessions.'));
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ── Stage 2: anonymous rank (best-effort; never blocks signup) ────────────
|
|
58
|
+
try {
|
|
59
|
+
const res = await fetch(`${appUrl}/api/rank/preview`, {
|
|
60
|
+
method: 'POST',
|
|
61
|
+
headers: { 'Content-Type': 'application/json' },
|
|
62
|
+
body: JSON.stringify({ totalTokens: scan.grandTotal }),
|
|
63
|
+
});
|
|
64
|
+
if (res.ok) {
|
|
65
|
+
const { rank, ofTotal } = (await res.json());
|
|
66
|
+
clack.note(`${bold(`you'd be #${rank}`)} of ${ofTotal} hackers`, 'your rank');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Rank is a hook, not a gate. Skip silently and continue to signup.
|
|
71
|
+
}
|
|
72
|
+
// ── Stage 3: pick username + fields ───────────────────────────────────────
|
|
73
|
+
const username = await promptAvailableUsername(appUrl);
|
|
74
|
+
if (username === null) {
|
|
75
|
+
clack.outro(dim('signup cancelled.'));
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
|
78
|
+
const bio = await optionalText('one line — what are you building?');
|
|
79
|
+
const xRaw = await optionalText('x / twitter (handle or url, optional)');
|
|
80
|
+
const websiteRaw = await optionalText('website (optional)');
|
|
81
|
+
// ── Stage 4: GitHub OAuth (reuses the existing login flow) ────────────────
|
|
82
|
+
try {
|
|
83
|
+
await login();
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
clack.cancel(`GitHub sign-in failed: ${err instanceof Error ? err.message : String(err)}. run \`hacklab signup\` again.`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
const session = await loadSession();
|
|
90
|
+
if (!session) {
|
|
91
|
+
clack.cancel('GitHub sign-in did not complete. run `hacklab signup` again.');
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
// ── Stage 5: claim (re-prompt username on a TOCTOU collision) ─────────────
|
|
95
|
+
let claimedHandle = username;
|
|
96
|
+
while (true) {
|
|
97
|
+
const res = await fetch(`${appUrl}/api/cli/claim`, {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
headers: {
|
|
100
|
+
'Content-Type': 'application/json',
|
|
101
|
+
Authorization: `Bearer ${session.token}`,
|
|
102
|
+
},
|
|
103
|
+
body: JSON.stringify({
|
|
104
|
+
username: claimedHandle,
|
|
105
|
+
...(bio ? { bio } : {}),
|
|
106
|
+
...(normalizeXUrl(xRaw) ? { xUrl: normalizeXUrl(xRaw) } : {}),
|
|
107
|
+
...(normalizeWebsite(websiteRaw)
|
|
108
|
+
? { websiteUrl: normalizeWebsite(websiteRaw) }
|
|
109
|
+
: {}),
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
112
|
+
if (res.ok) {
|
|
113
|
+
const data = (await res.json());
|
|
114
|
+
claimedHandle = data.handle;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
if (res.status === 409) {
|
|
118
|
+
const reprompt = await promptAvailableUsername(appUrl, 'that name was just taken — pick another');
|
|
119
|
+
if (reprompt === null) {
|
|
120
|
+
clack.cancel('signup cancelled before claiming a handle.');
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
claimedHandle = reprompt;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const data = (await res.json().catch(() => null));
|
|
127
|
+
clack.cancel(data?.error ?? `claim failed (${res.status})`);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
// ── Stage 6: sync token totals to the claimed profile ─────────────────────
|
|
131
|
+
spin.start('syncing your usage');
|
|
132
|
+
try {
|
|
133
|
+
const res = await fetch(`${appUrl}/api/claim/sync`, {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: {
|
|
136
|
+
'Content-Type': 'application/json',
|
|
137
|
+
Authorization: `Bearer ${session.token}`,
|
|
138
|
+
},
|
|
139
|
+
body: JSON.stringify({
|
|
140
|
+
dailyTotals: scan.dailyTotals,
|
|
141
|
+
toolTotals: scan.toolTotals,
|
|
142
|
+
modelTotals: scan.modelTotals,
|
|
143
|
+
hourlyTotals: scan.hourlyTotals,
|
|
144
|
+
}),
|
|
145
|
+
});
|
|
146
|
+
if (res.ok) {
|
|
147
|
+
const r = (await res.json());
|
|
148
|
+
spin.stop('usage synced');
|
|
149
|
+
if (r.title && r.level != null) {
|
|
150
|
+
info(`${bold(r.title)} lv.${r.level}${r.beltColor ? ` (${r.beltColor} belt)` : ''}`);
|
|
151
|
+
}
|
|
152
|
+
if (r.rankAfter)
|
|
153
|
+
info(`rank: #${r.rankAfter}`);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
spin.stop('usage sync deferred');
|
|
157
|
+
info(dim('your profile is live; usage will sync next run.'));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
spin.stop('usage sync deferred');
|
|
162
|
+
info(dim('your profile is live; usage will sync next run.'));
|
|
163
|
+
}
|
|
164
|
+
const base = appUrl.replace(/\/$/, '');
|
|
165
|
+
clack.outro(`${bold('claimed.')} ${base}/${claimedHandle}`);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Prompt for a username and loop until it passes the availability check or the
|
|
169
|
+
* user cancels. Returns the chosen username, or null if cancelled.
|
|
170
|
+
*/
|
|
171
|
+
async function promptAvailableUsername(appUrl, firstMessage = 'pick your hacklab username') {
|
|
172
|
+
let message = firstMessage;
|
|
173
|
+
while (true) {
|
|
174
|
+
const value = await clack.text({
|
|
175
|
+
message,
|
|
176
|
+
placeholder: 'e.g. ada-lovelace',
|
|
177
|
+
});
|
|
178
|
+
if (clack.isCancel(value))
|
|
179
|
+
return null;
|
|
180
|
+
const candidate = String(value).trim();
|
|
181
|
+
let available = false;
|
|
182
|
+
let reason = 'could not check availability — try again';
|
|
183
|
+
try {
|
|
184
|
+
const res = await fetch(`${appUrl}/api/cli/username-available?u=${encodeURIComponent(candidate)}`);
|
|
185
|
+
if (res.ok) {
|
|
186
|
+
const data = (await res.json());
|
|
187
|
+
available = data.available;
|
|
188
|
+
if (!available && data.reason)
|
|
189
|
+
reason = data.reason;
|
|
190
|
+
}
|
|
191
|
+
else if (res.status === 429) {
|
|
192
|
+
reason = 'too many checks — wait a moment and try again';
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// network error — fall through to re-prompt with the generic reason
|
|
197
|
+
}
|
|
198
|
+
if (available)
|
|
199
|
+
return candidate;
|
|
200
|
+
message = `${reason}\n pick your hacklab username`;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** A clack text prompt that returns trimmed text, or undefined if empty/cancelled. */
|
|
204
|
+
async function optionalText(message) {
|
|
205
|
+
const value = await clack.text({ message, placeholder: '(optional)' });
|
|
206
|
+
if (clack.isCancel(value))
|
|
207
|
+
return undefined;
|
|
208
|
+
const trimmed = String(value).trim();
|
|
209
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
210
|
+
}
|
|
211
|
+
/** Discard a value that isn't a parseable URL, so an optional vanity field can
|
|
212
|
+
* never 400 the claim and abort signup at the final step. */
|
|
213
|
+
function asValidUrl(value) {
|
|
214
|
+
try {
|
|
215
|
+
return new URL(value).href;
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return undefined;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** Turn a handle or partial url into a full x.com url; undefined if blank/invalid. */
|
|
222
|
+
function normalizeXUrl(raw) {
|
|
223
|
+
if (!raw)
|
|
224
|
+
return undefined;
|
|
225
|
+
const v = raw.trim();
|
|
226
|
+
if (!v)
|
|
227
|
+
return undefined;
|
|
228
|
+
if (/^https?:\/\//i.test(v))
|
|
229
|
+
return asValidUrl(v);
|
|
230
|
+
const handle = v.replace(/^@/, '');
|
|
231
|
+
return asValidUrl(`https://x.com/${handle}`);
|
|
232
|
+
}
|
|
233
|
+
/** Ensure a website has a scheme; undefined if blank/invalid. */
|
|
234
|
+
function normalizeWebsite(raw) {
|
|
235
|
+
if (!raw)
|
|
236
|
+
return undefined;
|
|
237
|
+
const v = raw.trim();
|
|
238
|
+
if (!v)
|
|
239
|
+
return undefined;
|
|
240
|
+
return asValidUrl(/^https?:\/\//i.test(v) ? v : `https://${v}`);
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=signup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.js","sourceRoot":"","sources":["../../src/commands/signup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAMA,wBAAsB,IAAI,kBAiEzB"}
|