buildpartner 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/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +44 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/api-client.d.ts +18 -0
- package/dist/src/api-client.js +74 -0
- package/dist/src/api-client.js.map +1 -0
- package/dist/src/classifiers/activity-classifier.d.ts +12 -0
- package/dist/src/classifiers/activity-classifier.js +300 -0
- package/dist/src/classifiers/activity-classifier.js.map +1 -0
- package/dist/src/classifiers/path-detector.d.ts +33 -0
- package/dist/src/classifiers/path-detector.js +98 -0
- package/dist/src/classifiers/path-detector.js.map +1 -0
- package/dist/src/commands/log-session.d.ts +10 -0
- package/dist/src/commands/log-session.js +162 -0
- package/dist/src/commands/log-session.js.map +1 -0
- package/dist/src/commands/serve.d.ts +1 -0
- package/dist/src/commands/serve.js +5 -0
- package/dist/src/commands/serve.js.map +1 -0
- package/dist/src/commands/setup.d.ts +1 -0
- package/dist/src/commands/setup.js +578 -0
- package/dist/src/commands/setup.js.map +1 -0
- package/dist/src/constants.d.ts +9 -0
- package/dist/src/constants.js +12 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/installer/hook-installer.d.ts +19 -0
- package/dist/src/installer/hook-installer.js +114 -0
- package/dist/src/installer/hook-installer.js.map +1 -0
- package/dist/src/installer/mcp-installer.d.ts +9 -0
- package/dist/src/installer/mcp-installer.js +80 -0
- package/dist/src/installer/mcp-installer.js.map +1 -0
- package/dist/src/installer/skill-installer.d.ts +5 -0
- package/dist/src/installer/skill-installer.js +55 -0
- package/dist/src/installer/skill-installer.js.map +1 -0
- package/dist/src/installer/skill-sync.d.ts +10 -0
- package/dist/src/installer/skill-sync.js +76 -0
- package/dist/src/installer/skill-sync.js.map +1 -0
- package/dist/src/mcp/server.d.ts +3 -0
- package/dist/src/mcp/server.js +106 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/subscription-gate.d.ts +19 -0
- package/dist/src/mcp/subscription-gate.js +74 -0
- package/dist/src/mcp/subscription-gate.js.map +1 -0
- package/dist/src/mcp/tools/ai-profile.d.ts +88 -0
- package/dist/src/mcp/tools/ai-profile.js +123 -0
- package/dist/src/mcp/tools/ai-profile.js.map +1 -0
- package/dist/src/mcp/tools/classify-session.d.ts +31 -0
- package/dist/src/mcp/tools/classify-session.js +34 -0
- package/dist/src/mcp/tools/classify-session.js.map +1 -0
- package/dist/src/mcp/tools/get-knowledge.d.ts +25 -0
- package/dist/src/mcp/tools/get-knowledge.js +31 -0
- package/dist/src/mcp/tools/get-knowledge.js.map +1 -0
- package/dist/src/mcp/tools/get-profile.d.ts +1 -0
- package/dist/src/mcp/tools/get-profile.js +77 -0
- package/dist/src/mcp/tools/get-profile.js.map +1 -0
- package/dist/src/mcp/tools/get-stats.d.ts +58 -0
- package/dist/src/mcp/tools/get-stats.js +135 -0
- package/dist/src/mcp/tools/get-stats.js.map +1 -0
- package/dist/src/mcp/tools/get-suggestions.d.ts +7 -0
- package/dist/src/mcp/tools/get-suggestions.js +176 -0
- package/dist/src/mcp/tools/get-suggestions.js.map +1 -0
- package/dist/src/mcp/tools/get-training.d.ts +48 -0
- package/dist/src/mcp/tools/get-training.js +102 -0
- package/dist/src/mcp/tools/get-training.js.map +1 -0
- package/dist/src/mcp/tools/log-highlight.d.ts +32 -0
- package/dist/src/mcp/tools/log-highlight.js +39 -0
- package/dist/src/mcp/tools/log-highlight.js.map +1 -0
- package/dist/src/mcp/tools/quest.d.ts +78 -0
- package/dist/src/mcp/tools/quest.js +72 -0
- package/dist/src/mcp/tools/quest.js.map +1 -0
- package/dist/src/mcp/tools/web-search.d.ts +15 -0
- package/dist/src/mcp/tools/web-search.js +17 -0
- package/dist/src/mcp/tools/web-search.js.map +1 -0
- package/dist/src/readers/history-reader.d.ts +28 -0
- package/dist/src/readers/history-reader.js +83 -0
- package/dist/src/readers/history-reader.js.map +1 -0
- package/dist/src/readers/session-reader.d.ts +89 -0
- package/dist/src/readers/session-reader.js +310 -0
- package/dist/src/readers/session-reader.js.map +1 -0
- package/dist/src/readers/stats-reader.d.ts +38 -0
- package/dist/src/readers/stats-reader.js +125 -0
- package/dist/src/readers/stats-reader.js.map +1 -0
- package/dist/src/store/local-store.d.ts +72 -0
- package/dist/src/store/local-store.js +145 -0
- package/dist/src/store/local-store.js.map +1 -0
- package/dist/src/store/quest-store.d.ts +77 -0
- package/dist/src/store/quest-store.js +309 -0
- package/dist/src/store/quest-store.js.map +1 -0
- package/dist/src/store/status-store.d.ts +73 -0
- package/dist/src/store/status-store.js +372 -0
- package/dist/src/store/status-store.js.map +1 -0
- package/dist/src/suggestions/rules.d.ts +1 -0
- package/dist/src/suggestions/rules.js +2 -0
- package/dist/src/suggestions/rules.js.map +1 -0
- package/dist/src/suggestions/video-links.d.ts +1 -0
- package/dist/src/suggestions/video-links.js +2 -0
- package/dist/src/suggestions/video-links.js.map +1 -0
- package/package.json +35 -0
- package/skills/he-coach/SKILL.md +56 -0
- package/skills/he-consult/SKILL.md +43 -0
- package/skills/he-enhance-claude-md/SKILL.md +58 -0
- package/skills/he-flex-socials/SKILL.md +50 -0
- package/skills/he-full-audit/SKILL.md +119 -0
- package/skills/he-improve-skill/SKILL.md +111 -0
- package/skills/he-interview/SKILL.md +54 -0
- package/skills/he-life-story/SKILL.md +64 -0
- package/skills/he-log-experience/SKILL.md +68 -0
- package/skills/he-open-dashboard/SKILL.md +27 -0
- package/skills/he-quest-status/SKILL.md +48 -0
- package/skills/he-recap-week/SKILL.md +49 -0
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import ora from "ora";
|
|
6
|
+
import { input, select, confirm } from "@inquirer/prompts";
|
|
7
|
+
import { getHistorySummary } from "../readers/history-reader.js";
|
|
8
|
+
import { parseAllSessions, extractTooling } from "../readers/session-reader.js";
|
|
9
|
+
import { getStatsSummary } from "../readers/stats-reader.js";
|
|
10
|
+
import { classifySession } from "../classifiers/activity-classifier.js";
|
|
11
|
+
import { detectPath, getPathLabel } from "../classifiers/path-detector.js";
|
|
12
|
+
import { writeAuth, writeProfile, readProfile, writeSessions, } from "../store/local-store.js";
|
|
13
|
+
import { installMcp } from "../installer/mcp-installer.js";
|
|
14
|
+
import { installSkills } from "../installer/skill-installer.js";
|
|
15
|
+
import { installHook, installPermissions } from "../installer/hook-installer.js";
|
|
16
|
+
import { API_BASE } from "../api-client.js";
|
|
17
|
+
import { skillCommand } from "../constants.js";
|
|
18
|
+
import { initializeQuests, setEnvironment } from "../store/quest-store.js";
|
|
19
|
+
import { initializeStatus } from "../store/status-store.js";
|
|
20
|
+
const CLAUDE_DIR = join(homedir(), ".claude");
|
|
21
|
+
const orange = chalk.hex("#E47025");
|
|
22
|
+
const isInteractive = process.stdin.isTTY === true;
|
|
23
|
+
function detectEnvironment() {
|
|
24
|
+
// Check for VS Code
|
|
25
|
+
if (process.env.TERM_PROGRAM === "vscode" || process.env.VSCODE_PID)
|
|
26
|
+
return "vscode";
|
|
27
|
+
// Check for Claude Desktop/Cowork (non-TTY with Claude-specific env)
|
|
28
|
+
if (!process.stdin.isTTY && (process.env.CLAUDE_CODE || process.env.CLAUDE_DESKTOP))
|
|
29
|
+
return "cowork";
|
|
30
|
+
// Non-interactive but no specific env detected
|
|
31
|
+
if (!process.stdin.isTTY)
|
|
32
|
+
return "desktop";
|
|
33
|
+
// Standard terminal
|
|
34
|
+
return "terminal";
|
|
35
|
+
}
|
|
36
|
+
export async function setup() {
|
|
37
|
+
const token = getTokenArg();
|
|
38
|
+
// Header
|
|
39
|
+
console.log();
|
|
40
|
+
console.log(orange(" ╭─────────────────────────────────────╮\n" +
|
|
41
|
+
" │ BuildPartner - Your AI Build Partner │\n" +
|
|
42
|
+
" ╰─────────────────────────────────────╯"));
|
|
43
|
+
console.log();
|
|
44
|
+
// Check Claude Code
|
|
45
|
+
if (!existsSync(CLAUDE_DIR)) {
|
|
46
|
+
console.log(chalk.red(" ✗ Claude Code not found (~/.claude/ missing)"));
|
|
47
|
+
console.log(" Install Claude Code first: https://claude.ai/code");
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const historySummary = getHistorySummary();
|
|
51
|
+
console.log(chalk.dim(` Found ${historySummary.uniqueSessions} Claude Code sessions.`));
|
|
52
|
+
console.log();
|
|
53
|
+
// Step 1: Quick interview
|
|
54
|
+
let answers;
|
|
55
|
+
if (isInteractive) {
|
|
56
|
+
console.log(chalk.bold(" [1/4] Quick interview"));
|
|
57
|
+
console.log(chalk.dim(" Help us personalize your setup.\n"));
|
|
58
|
+
answers = await runInterview();
|
|
59
|
+
console.log();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log(chalk.bold(" [1/4] Quick interview"));
|
|
63
|
+
console.log(chalk.dim(` Skipped (non-interactive terminal). Run ${skillCommand("interview")} later to personalize.`));
|
|
64
|
+
answers = { use_case: "mix", experience: "beginner", goal: "tools" };
|
|
65
|
+
console.log();
|
|
66
|
+
}
|
|
67
|
+
// Step 2: Create account
|
|
68
|
+
console.log(chalk.bold(" [2/4] Create your account"));
|
|
69
|
+
console.log();
|
|
70
|
+
let email;
|
|
71
|
+
let username;
|
|
72
|
+
if (token) {
|
|
73
|
+
console.log(chalk.green(" ✓ Token verified"));
|
|
74
|
+
email = "user@buildpartner.ai";
|
|
75
|
+
username = "player";
|
|
76
|
+
}
|
|
77
|
+
else if (!isInteractive) {
|
|
78
|
+
// Non-interactive: use CLI args or generate defaults
|
|
79
|
+
const emailArg = getArg("--email");
|
|
80
|
+
const usernameArg = getArg("--username");
|
|
81
|
+
email = emailArg || `user-${Date.now()}@buildpartner.ai`;
|
|
82
|
+
username = usernameArg || `user-${Math.random().toString(36).slice(2, 8)}`;
|
|
83
|
+
console.log(chalk.dim(` Using: ${email} / ${username}`));
|
|
84
|
+
console.log(chalk.dim(" To set your own: npx buildpartner setup --email you@example.com --username your-name"));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
email = await input({
|
|
88
|
+
message: " Email:",
|
|
89
|
+
validate: (val) => {
|
|
90
|
+
if (!val.includes("@"))
|
|
91
|
+
return "Enter a valid email";
|
|
92
|
+
return true;
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
username = await input({
|
|
96
|
+
message: " Username:",
|
|
97
|
+
validate: (val) => {
|
|
98
|
+
if (val.length < 2)
|
|
99
|
+
return "Username must be at least 2 characters";
|
|
100
|
+
if (!/^[a-z0-9-]+$/.test(val))
|
|
101
|
+
return "Lowercase letters, numbers, and hyphens only";
|
|
102
|
+
return true;
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
let authToken = `sk_${generateId()}`;
|
|
107
|
+
try {
|
|
108
|
+
const res = await fetch(`${API_BASE}/api/myplayer/signup`, {
|
|
109
|
+
method: "POST",
|
|
110
|
+
headers: { "Content-Type": "application/json" },
|
|
111
|
+
body: JSON.stringify({ email, username }),
|
|
112
|
+
});
|
|
113
|
+
const data = await res.json();
|
|
114
|
+
if (res.ok && data.token) {
|
|
115
|
+
authToken = data.token;
|
|
116
|
+
}
|
|
117
|
+
else if (res.status === 409) {
|
|
118
|
+
console.log(chalk.yellow(` ! ${data.error || "Account already exists"}`));
|
|
119
|
+
console.log(chalk.dim(" Linking to existing account..."));
|
|
120
|
+
const verifyRes = await fetch(`${API_BASE}/api/myplayer/login`, {
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers: { "Content-Type": "application/json" },
|
|
123
|
+
body: JSON.stringify({ email }),
|
|
124
|
+
});
|
|
125
|
+
const verifyData = await verifyRes.json();
|
|
126
|
+
if (verifyRes.ok && verifyData.token) {
|
|
127
|
+
authToken = verifyData.token;
|
|
128
|
+
username = verifyData.username || username;
|
|
129
|
+
console.log(chalk.green(` ✓ Linked to existing account: ${username}`));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// API unavailable, use local token
|
|
135
|
+
}
|
|
136
|
+
writeAuth({
|
|
137
|
+
email,
|
|
138
|
+
username,
|
|
139
|
+
token: authToken,
|
|
140
|
+
profile_url: `buildpartner.ai/${username}`,
|
|
141
|
+
created_at: new Date().toISOString(),
|
|
142
|
+
});
|
|
143
|
+
console.log(chalk.green(" ✓ Account created"));
|
|
144
|
+
console.log();
|
|
145
|
+
// Step 3: Set up tools
|
|
146
|
+
console.log(chalk.bold(" [3/4] Setting up your tools..."));
|
|
147
|
+
const mcpResult = installMcp();
|
|
148
|
+
if (mcpResult.alreadyExists) {
|
|
149
|
+
console.log(chalk.green(" ✓ MCP server (already configured)"));
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
console.log(chalk.green(" ✓ MCP server"));
|
|
153
|
+
}
|
|
154
|
+
const installedSkills = installSkills();
|
|
155
|
+
const skillCount = installedSkills.length;
|
|
156
|
+
if (skillCount > 0) {
|
|
157
|
+
// Highlight key skills
|
|
158
|
+
const hasConsult = installedSkills.includes("he-consult");
|
|
159
|
+
const hasInterview = installedSkills.includes("he-interview");
|
|
160
|
+
if (hasConsult)
|
|
161
|
+
console.log(chalk.green(` ✓ ${skillCommand("consult")} (expert advice on any topic)`));
|
|
162
|
+
if (hasInterview)
|
|
163
|
+
console.log(chalk.green(` ✓ ${skillCommand("interview")} (build your training data)`));
|
|
164
|
+
console.log(chalk.green(` ✓ ${skillCount} skills total`));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
console.log(chalk.yellow(" ! Skills not found (will work after npm publish)"));
|
|
168
|
+
}
|
|
169
|
+
const hookResult = installHook();
|
|
170
|
+
if (hookResult.alreadyExists) {
|
|
171
|
+
console.log(chalk.green(" ✓ Auto-tracking (already configured)"));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
console.log(chalk.green(" ✓ Auto-tracking"));
|
|
175
|
+
}
|
|
176
|
+
const permResult = installPermissions();
|
|
177
|
+
if (permResult.alreadyExists) {
|
|
178
|
+
console.log(chalk.green(" ✓ MCP permissions (already configured)"));
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.log(chalk.green(" ✓ MCP permissions (auto-approved)"));
|
|
182
|
+
}
|
|
183
|
+
console.log();
|
|
184
|
+
// Step 4: Build profile from history
|
|
185
|
+
console.log(chalk.bold(" [4/4] Building your profile..."));
|
|
186
|
+
// Always backfill from Claude Code history for the freshest data
|
|
187
|
+
const spinner = ora(" Classifying sessions...").start();
|
|
188
|
+
const result = await backfillSessions();
|
|
189
|
+
spinner.stop();
|
|
190
|
+
const sessionEntries = result.entries;
|
|
191
|
+
const pathLabel = result.pathLabel;
|
|
192
|
+
const totalTokens = result.totalTokens;
|
|
193
|
+
console.log(chalk.green(` ✓ ${sessionEntries.length} sessions analyzed`));
|
|
194
|
+
console.log(chalk.green(` ✓ You're a ${pathLabel}`));
|
|
195
|
+
// Store onboarding answers in profile
|
|
196
|
+
const currentProfile = readProfile();
|
|
197
|
+
if (currentProfile) {
|
|
198
|
+
writeProfile({
|
|
199
|
+
...currentProfile,
|
|
200
|
+
onboarding: answers,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Sync to server
|
|
204
|
+
await syncSessions(sessionEntries, authToken, username);
|
|
205
|
+
console.log();
|
|
206
|
+
// CLAUDE.md Generator
|
|
207
|
+
await offerClaudeMd(sessionEntries);
|
|
208
|
+
// Initialize quests and status
|
|
209
|
+
const env = detectEnvironment();
|
|
210
|
+
setEnvironment(env);
|
|
211
|
+
initializeQuests();
|
|
212
|
+
initializeStatus();
|
|
213
|
+
if (env !== "terminal") {
|
|
214
|
+
console.log(chalk.dim(` Detected environment: ${env}`));
|
|
215
|
+
}
|
|
216
|
+
// Build personalized recommendations from session history
|
|
217
|
+
const recs = getRecommendations(sessionEntries);
|
|
218
|
+
// Final output
|
|
219
|
+
console.log();
|
|
220
|
+
console.log(orange(" ╭──────────────────────────────────────────────╮\n" +
|
|
221
|
+
" │ │\n" +
|
|
222
|
+
` │ You're set up. │\n` +
|
|
223
|
+
" │ │\n" +
|
|
224
|
+
` │ ${padRight(`${sessionEntries.length} sessions analyzed`, 45)}│\n` +
|
|
225
|
+
` │ ${padRight(`${skillCount} skills installed`, 45)}│\n` +
|
|
226
|
+
` │ ${padRight(`Auto-tracking enabled`, 45)}│\n` +
|
|
227
|
+
" │ │\n" +
|
|
228
|
+
" ╰──────────────────────────────────────────────╯"));
|
|
229
|
+
console.log();
|
|
230
|
+
// Personalized recommendations
|
|
231
|
+
if (recs.length > 0) {
|
|
232
|
+
console.log(chalk.bold(" Based on your history, try these in Claude Code:"));
|
|
233
|
+
console.log();
|
|
234
|
+
for (let i = 0; i < recs.length; i++) {
|
|
235
|
+
const rec = recs[i];
|
|
236
|
+
console.log(` ${chalk.dim(`${i + 1}.`)} ${rec.reason}`);
|
|
237
|
+
console.log(` ${orange(rec.prompt)}`);
|
|
238
|
+
console.log();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Dashboard CTA
|
|
242
|
+
const dashUrl = `https://web-mu-six-27.vercel.app/dashboard?t=${authToken}`;
|
|
243
|
+
console.log(chalk.bold(" See your full dashboard and personalized quests:\n") +
|
|
244
|
+
` ${chalk.underline(dashUrl)}`);
|
|
245
|
+
console.log();
|
|
246
|
+
}
|
|
247
|
+
async function runInterview() {
|
|
248
|
+
const use_case = await select({
|
|
249
|
+
message: " What do you mainly use Claude Code for?",
|
|
250
|
+
choices: [
|
|
251
|
+
{ value: "coding", name: "Coding" },
|
|
252
|
+
{ value: "content", name: "Content creation" },
|
|
253
|
+
{ value: "research", name: "Research" },
|
|
254
|
+
{ value: "automation", name: "Automation" },
|
|
255
|
+
{ value: "mix", name: "A mix of things" },
|
|
256
|
+
],
|
|
257
|
+
});
|
|
258
|
+
const experience = await select({
|
|
259
|
+
message: " What's your experience level with Claude Code?",
|
|
260
|
+
choices: [
|
|
261
|
+
{ value: "beginner", name: "Just started" },
|
|
262
|
+
{ value: "intermediate", name: "A few months" },
|
|
263
|
+
{ value: "power-user", name: "Power user" },
|
|
264
|
+
],
|
|
265
|
+
});
|
|
266
|
+
const goal = await select({
|
|
267
|
+
message: " What would help you most?",
|
|
268
|
+
choices: [
|
|
269
|
+
{ value: "tools", name: "Finding the right tools" },
|
|
270
|
+
{ value: "speed", name: "Building faster" },
|
|
271
|
+
{ value: "automation", name: "Automating workflows" },
|
|
272
|
+
{ value: "learning", name: "Learning best practices" },
|
|
273
|
+
],
|
|
274
|
+
});
|
|
275
|
+
return { use_case, experience, goal };
|
|
276
|
+
}
|
|
277
|
+
function getRecommendations(sessions) {
|
|
278
|
+
// Count activity types and track top projects per type
|
|
279
|
+
const counts = {};
|
|
280
|
+
const projectsByType = {};
|
|
281
|
+
for (const s of sessions) {
|
|
282
|
+
counts[s.activity_type] = (counts[s.activity_type] || 0) + 1;
|
|
283
|
+
if (!projectsByType[s.activity_type])
|
|
284
|
+
projectsByType[s.activity_type] = {};
|
|
285
|
+
const proj = s.project.split("/").filter(Boolean).pop() || "project";
|
|
286
|
+
projectsByType[s.activity_type][proj] = (projectsByType[s.activity_type][proj] || 0) + 1;
|
|
287
|
+
}
|
|
288
|
+
// Sort by frequency
|
|
289
|
+
const ranked = Object.entries(counts).sort((a, b) => b[1] - a[1]);
|
|
290
|
+
// Get the top project for an activity type
|
|
291
|
+
function topProject(activity) {
|
|
292
|
+
const projects = projectsByType[activity] || {};
|
|
293
|
+
const sorted = Object.entries(projects).sort((a, b) => b[1] - a[1]);
|
|
294
|
+
return sorted[0]?.[0] || "my project";
|
|
295
|
+
}
|
|
296
|
+
const consultCmd = skillCommand("consult");
|
|
297
|
+
const coachCmd = skillCommand("coach");
|
|
298
|
+
// Map activity types to skills with contextual prompts
|
|
299
|
+
function buildRec(activity) {
|
|
300
|
+
const proj = topProject(activity);
|
|
301
|
+
switch (activity) {
|
|
302
|
+
case "code":
|
|
303
|
+
return {
|
|
304
|
+
skill: consultCmd,
|
|
305
|
+
prompt: `${consultCmd} I'm building ${proj}. What's the fastest way to validate if people actually want this?`,
|
|
306
|
+
reason: `You've been building ${proj}. Get a validation framework.`,
|
|
307
|
+
};
|
|
308
|
+
case "content":
|
|
309
|
+
return {
|
|
310
|
+
skill: consultCmd,
|
|
311
|
+
prompt: `${consultCmd} I'm creating content about ${proj}. How do I package this so people actually click?`,
|
|
312
|
+
reason: `You create content. Get packaging and hook frameworks.`,
|
|
313
|
+
};
|
|
314
|
+
case "research":
|
|
315
|
+
return {
|
|
316
|
+
skill: coachCmd,
|
|
317
|
+
prompt: coachCmd,
|
|
318
|
+
reason: `You do deep research. Get a personalized setup review.`,
|
|
319
|
+
};
|
|
320
|
+
case "automation":
|
|
321
|
+
return {
|
|
322
|
+
skill: consultCmd,
|
|
323
|
+
prompt: `${consultCmd} I'm automating workflows for ${proj}. How do I turn this into something others can use?`,
|
|
324
|
+
reason: `You automate things. Get a distribution plan.`,
|
|
325
|
+
};
|
|
326
|
+
case "design":
|
|
327
|
+
return {
|
|
328
|
+
skill: consultCmd,
|
|
329
|
+
prompt: `${consultCmd} I'm designing ${proj}. What's the smallest version I should build first?`,
|
|
330
|
+
reason: `You spend time planning. Get an MVP framework.`,
|
|
331
|
+
};
|
|
332
|
+
case "ops":
|
|
333
|
+
return {
|
|
334
|
+
skill: consultCmd,
|
|
335
|
+
prompt: `${consultCmd} I manage infra for ${proj}. What's the best way to launch this?`,
|
|
336
|
+
reason: `You manage systems. Get a launch playbook.`,
|
|
337
|
+
};
|
|
338
|
+
case "data":
|
|
339
|
+
return {
|
|
340
|
+
skill: consultCmd,
|
|
341
|
+
prompt: `${consultCmd} I'm working with data in ${proj}. How do I turn these insights into a product?`,
|
|
342
|
+
reason: `You work with data. Get a product framework.`,
|
|
343
|
+
};
|
|
344
|
+
case "debug":
|
|
345
|
+
return {
|
|
346
|
+
skill: coachCmd,
|
|
347
|
+
prompt: coachCmd,
|
|
348
|
+
reason: `You fix a lot of bugs. Get tips to work more efficiently.`,
|
|
349
|
+
};
|
|
350
|
+
default:
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const recs = [];
|
|
355
|
+
const seen = new Set();
|
|
356
|
+
for (const [activity] of ranked) {
|
|
357
|
+
const rec = buildRec(activity);
|
|
358
|
+
if (rec && !seen.has(rec.skill)) {
|
|
359
|
+
recs.push(rec);
|
|
360
|
+
seen.add(rec.skill);
|
|
361
|
+
}
|
|
362
|
+
if (recs.length >= 3)
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
// Fallback
|
|
366
|
+
if (recs.length === 0) {
|
|
367
|
+
recs.push({
|
|
368
|
+
skill: coachCmd,
|
|
369
|
+
prompt: `${coachCmd} Review my setup and tell me what to do next.`,
|
|
370
|
+
reason: "Get a personalized plan for how to use BuildPartner.",
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
return recs;
|
|
374
|
+
}
|
|
375
|
+
async function backfillSessions() {
|
|
376
|
+
const allSessions = parseAllSessions();
|
|
377
|
+
const stats = getStatsSummary();
|
|
378
|
+
const sessionEntries = [];
|
|
379
|
+
const activityTypes = [];
|
|
380
|
+
const wsServers = {};
|
|
381
|
+
const wsSkills = {};
|
|
382
|
+
const wsApps = {};
|
|
383
|
+
const wsEditors = {};
|
|
384
|
+
const wsTech = {};
|
|
385
|
+
for (const session of allSessions) {
|
|
386
|
+
const result = classifySession(session);
|
|
387
|
+
const tooling = extractTooling(session);
|
|
388
|
+
let durationMinutes = 0;
|
|
389
|
+
if (session.startTime && session.endTime) {
|
|
390
|
+
const ms = new Date(session.endTime).getTime() - new Date(session.startTime).getTime();
|
|
391
|
+
durationMinutes = Math.round(ms / 60000);
|
|
392
|
+
}
|
|
393
|
+
const estimatedTokens = session.toolCalls.length * 1500 + session.userPromptCount * 2000;
|
|
394
|
+
sessionEntries.push({
|
|
395
|
+
id: crypto.randomUUID(),
|
|
396
|
+
timestamp: session.startTime || new Date().toISOString(),
|
|
397
|
+
project: session.projectPath,
|
|
398
|
+
activity_type: result.activityType,
|
|
399
|
+
tokens: estimatedTokens,
|
|
400
|
+
duration_minutes: durationMinutes,
|
|
401
|
+
prompts: session.userPromptCount,
|
|
402
|
+
files_touched: session.filesTouched.slice(0, 20),
|
|
403
|
+
summary: session.summary || "",
|
|
404
|
+
mcp_servers_used: tooling.mcpServersUsed,
|
|
405
|
+
mcp_tool_counts: tooling.mcpToolCounts,
|
|
406
|
+
skills_invoked: tooling.skillsInvoked,
|
|
407
|
+
tool_counts: tooling.toolCounts,
|
|
408
|
+
});
|
|
409
|
+
activityTypes.push(result.activityType);
|
|
410
|
+
for (const s of tooling.mcpServersUsed)
|
|
411
|
+
wsServers[s] = (wsServers[s] || 0) + 1;
|
|
412
|
+
for (const s of tooling.skillsInvoked)
|
|
413
|
+
wsSkills[s] = (wsSkills[s] || 0) + 1;
|
|
414
|
+
for (const a of tooling.appsDetected)
|
|
415
|
+
wsApps[a] = (wsApps[a] || 0) + 1;
|
|
416
|
+
for (const e of tooling.editorsDetected)
|
|
417
|
+
wsEditors[e] = (wsEditors[e] || 0) + 1;
|
|
418
|
+
for (const t of tooling.techStack)
|
|
419
|
+
wsTech[t] = (wsTech[t] || 0) + 1;
|
|
420
|
+
}
|
|
421
|
+
writeSessions(sessionEntries);
|
|
422
|
+
const pathResult = detectPath(activityTypes);
|
|
423
|
+
const pathLabel = pathResult ? getPathLabel(pathResult.path) : "Explorer";
|
|
424
|
+
const totalTokens = sessionEntries.reduce((sum, s) => sum + s.tokens, 0);
|
|
425
|
+
const streakBest = stats?.bestStreak ?? 0;
|
|
426
|
+
const streakCurrent = stats?.currentStreak ?? 0;
|
|
427
|
+
writeProfile({
|
|
428
|
+
path: pathResult?.path ?? "unknown",
|
|
429
|
+
path_scores: pathResult?.scores ?? {},
|
|
430
|
+
streak_current: streakCurrent,
|
|
431
|
+
streak_best: streakBest,
|
|
432
|
+
total_sessions: sessionEntries.length,
|
|
433
|
+
total_tokens: totalTokens,
|
|
434
|
+
active_since: stats?.firstDate ?? new Date().toISOString().slice(0, 10),
|
|
435
|
+
last_session: new Date().toISOString(),
|
|
436
|
+
workspace: {
|
|
437
|
+
mcp_servers: wsServers,
|
|
438
|
+
skills: wsSkills,
|
|
439
|
+
apps: wsApps,
|
|
440
|
+
editors: wsEditors,
|
|
441
|
+
tech_stack: wsTech,
|
|
442
|
+
},
|
|
443
|
+
});
|
|
444
|
+
return { entries: sessionEntries, pathLabel, totalTokens };
|
|
445
|
+
}
|
|
446
|
+
async function syncSessions(sessions, authToken, username) {
|
|
447
|
+
const syncSpinner = ora(" Syncing to buildpartner.ai...").start();
|
|
448
|
+
try {
|
|
449
|
+
const syncPayload = sessions.map((s) => ({
|
|
450
|
+
timestamp: s.timestamp,
|
|
451
|
+
activity_type: s.activity_type,
|
|
452
|
+
tokens: s.tokens,
|
|
453
|
+
duration_minutes: s.duration_minutes,
|
|
454
|
+
prompts: s.prompts,
|
|
455
|
+
project_name: s.project.split("/").filter(Boolean).pop() || "",
|
|
456
|
+
summary: s.summary,
|
|
457
|
+
mcp_servers_used: s.mcp_servers_used || [],
|
|
458
|
+
skills_invoked: s.skills_invoked || [],
|
|
459
|
+
tool_counts: s.tool_counts || {},
|
|
460
|
+
}));
|
|
461
|
+
const totalBatches = Math.ceil(syncPayload.length / 50);
|
|
462
|
+
for (let i = 0; i < syncPayload.length; i += 50) {
|
|
463
|
+
const batchNum = Math.floor(i / 50) + 1;
|
|
464
|
+
syncSpinner.text = ` Syncing to buildpartner.ai... (${batchNum}/${totalBatches})`;
|
|
465
|
+
const batch = syncPayload.slice(i, i + 50);
|
|
466
|
+
await fetch(`${API_BASE}/api/myplayer/sync`, {
|
|
467
|
+
method: "POST",
|
|
468
|
+
headers: {
|
|
469
|
+
"Authorization": `Bearer ${authToken}`,
|
|
470
|
+
"Content-Type": "application/json",
|
|
471
|
+
},
|
|
472
|
+
body: JSON.stringify({ sessions: batch }),
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
syncSpinner.stop();
|
|
476
|
+
console.log(chalk.green(` ✓ Synced ${sessions.length} sessions`));
|
|
477
|
+
}
|
|
478
|
+
catch {
|
|
479
|
+
syncSpinner.stop();
|
|
480
|
+
console.log(chalk.yellow(" ! Could not sync to server"));
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
function getTokenArg() {
|
|
484
|
+
return getArg("--token");
|
|
485
|
+
}
|
|
486
|
+
function getArg(flag) {
|
|
487
|
+
const idx = process.argv.indexOf(flag);
|
|
488
|
+
if (idx !== -1 && process.argv[idx + 1]) {
|
|
489
|
+
return process.argv[idx + 1];
|
|
490
|
+
}
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
function generateId() {
|
|
494
|
+
return crypto.randomUUID().replace(/-/g, "").slice(0, 24);
|
|
495
|
+
}
|
|
496
|
+
function padRight(str, len) {
|
|
497
|
+
return str.length >= len ? str : str + " ".repeat(len - str.length);
|
|
498
|
+
}
|
|
499
|
+
async function offerClaudeMd(sessions) {
|
|
500
|
+
const claudeMdPath = join(homedir(), ".claude", "CLAUDE.md");
|
|
501
|
+
if (existsSync(claudeMdPath)) {
|
|
502
|
+
// Check if it's large
|
|
503
|
+
try {
|
|
504
|
+
const content = readFileSync(claudeMdPath, "utf-8");
|
|
505
|
+
const lines = content.split("\n").length;
|
|
506
|
+
if (lines > 50) {
|
|
507
|
+
console.log(chalk.dim(` Your CLAUDE.md has ${lines} lines. Shorter is usually better.`));
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
console.log(chalk.green(" ✓ CLAUDE.md already exists"));
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
// ignore
|
|
515
|
+
}
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
// Detect tech stack from sessions
|
|
519
|
+
const techSignals = [];
|
|
520
|
+
for (const s of sessions) {
|
|
521
|
+
const files = s.files_touched || [];
|
|
522
|
+
for (const f of files) {
|
|
523
|
+
if (f.endsWith(".ts") || f.endsWith(".tsx"))
|
|
524
|
+
techSignals.push("TypeScript");
|
|
525
|
+
if (f.endsWith(".py"))
|
|
526
|
+
techSignals.push("Python");
|
|
527
|
+
if (f.endsWith(".go"))
|
|
528
|
+
techSignals.push("Go");
|
|
529
|
+
if (f.endsWith(".rs"))
|
|
530
|
+
techSignals.push("Rust");
|
|
531
|
+
if (f.includes("next.config") || f.includes("next/"))
|
|
532
|
+
techSignals.push("Next.js");
|
|
533
|
+
if (f.includes("tailwind"))
|
|
534
|
+
techSignals.push("Tailwind");
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
const techCounts = {};
|
|
538
|
+
for (const t of techSignals)
|
|
539
|
+
techCounts[t] = (techCounts[t] || 0) + 1;
|
|
540
|
+
const topTech = Object.entries(techCounts)
|
|
541
|
+
.sort((a, b) => b[1] - a[1])
|
|
542
|
+
.slice(0, 3)
|
|
543
|
+
.map(([t]) => t);
|
|
544
|
+
console.log(chalk.bold(" Optional: Create a starter CLAUDE.md?"));
|
|
545
|
+
console.log();
|
|
546
|
+
if (topTech.length > 0) {
|
|
547
|
+
console.log(chalk.dim(` Detected stack: ${topTech.join(", ")}`));
|
|
548
|
+
}
|
|
549
|
+
console.log(chalk.dim(" This gives Claude persistent instructions across all sessions."));
|
|
550
|
+
console.log();
|
|
551
|
+
let shouldCreate = true;
|
|
552
|
+
if (isInteractive) {
|
|
553
|
+
shouldCreate = await confirm({
|
|
554
|
+
message: " Create a starter CLAUDE.md?",
|
|
555
|
+
default: true,
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
else {
|
|
559
|
+
console.log(chalk.dim(" Auto-creating CLAUDE.md (non-interactive mode)."));
|
|
560
|
+
}
|
|
561
|
+
if (!shouldCreate) {
|
|
562
|
+
console.log(chalk.dim(" Skipped. You can create one anytime."));
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
const lines = ["# CLAUDE.md", ""];
|
|
566
|
+
lines.push("Before doing any work, explain how you will verify that work.");
|
|
567
|
+
if (topTech.length > 0) {
|
|
568
|
+
lines.push(`When writing ${topTech[0]}, use the project's existing patterns and conventions.`);
|
|
569
|
+
}
|
|
570
|
+
lines.push("Before building anything new, ask what \"done\" looks like.");
|
|
571
|
+
lines.push("");
|
|
572
|
+
const content = lines.join("\n");
|
|
573
|
+
writeFileSync(claudeMdPath, content);
|
|
574
|
+
console.log(chalk.green(` ✓ Created ~/.claude/CLAUDE.md (${lines.filter(l => l.trim()).length} rules)`));
|
|
575
|
+
console.log(chalk.dim(" Tip: less is more. Only add rules when Claude makes a mistake you want to prevent."));
|
|
576
|
+
console.log();
|
|
577
|
+
}
|
|
578
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global constants shared across CLI, MCP server, and web app.
|
|
3
|
+
* Change SKILL_PREFIX here and it propagates everywhere.
|
|
4
|
+
*/
|
|
5
|
+
export declare const SKILL_PREFIX = "he-";
|
|
6
|
+
/**
|
|
7
|
+
* Format a skill command for display (e.g., "interview" -> "/he-interview").
|
|
8
|
+
*/
|
|
9
|
+
export declare function skillCommand(name: string): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global constants shared across CLI, MCP server, and web app.
|
|
3
|
+
* Change SKILL_PREFIX here and it propagates everywhere.
|
|
4
|
+
*/
|
|
5
|
+
export const SKILL_PREFIX = "he-";
|
|
6
|
+
/**
|
|
7
|
+
* Format a skill command for display (e.g., "interview" -> "/he-interview").
|
|
8
|
+
*/
|
|
9
|
+
export function skillCommand(name) {
|
|
10
|
+
return `/${SKILL_PREFIX}${name}`;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,YAAY,GAAG,IAAI,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge the MyPlayer Stop hook into ~/.claude/settings.json.
|
|
3
|
+
* Uses the correct Claude Code hook schema:
|
|
4
|
+
* hooks.Stop[].hooks[].{type, command, timeout}
|
|
5
|
+
* Preserves all existing hooks and settings.
|
|
6
|
+
*/
|
|
7
|
+
export declare function installHook(): {
|
|
8
|
+
installed: boolean;
|
|
9
|
+
alreadyExists: boolean;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Add mcp__myplayer__* to the allow list in ~/.claude/settings.json
|
|
13
|
+
* so users don't get prompted for every MCP tool call.
|
|
14
|
+
*/
|
|
15
|
+
export declare function installPermissions(): {
|
|
16
|
+
installed: boolean;
|
|
17
|
+
alreadyExists: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare function isHookInstalled(): boolean;
|