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.
Files changed (109) hide show
  1. package/dist/bin/cli.d.ts +2 -0
  2. package/dist/bin/cli.js +44 -0
  3. package/dist/bin/cli.js.map +1 -0
  4. package/dist/src/api-client.d.ts +18 -0
  5. package/dist/src/api-client.js +74 -0
  6. package/dist/src/api-client.js.map +1 -0
  7. package/dist/src/classifiers/activity-classifier.d.ts +12 -0
  8. package/dist/src/classifiers/activity-classifier.js +300 -0
  9. package/dist/src/classifiers/activity-classifier.js.map +1 -0
  10. package/dist/src/classifiers/path-detector.d.ts +33 -0
  11. package/dist/src/classifiers/path-detector.js +98 -0
  12. package/dist/src/classifiers/path-detector.js.map +1 -0
  13. package/dist/src/commands/log-session.d.ts +10 -0
  14. package/dist/src/commands/log-session.js +162 -0
  15. package/dist/src/commands/log-session.js.map +1 -0
  16. package/dist/src/commands/serve.d.ts +1 -0
  17. package/dist/src/commands/serve.js +5 -0
  18. package/dist/src/commands/serve.js.map +1 -0
  19. package/dist/src/commands/setup.d.ts +1 -0
  20. package/dist/src/commands/setup.js +578 -0
  21. package/dist/src/commands/setup.js.map +1 -0
  22. package/dist/src/constants.d.ts +9 -0
  23. package/dist/src/constants.js +12 -0
  24. package/dist/src/constants.js.map +1 -0
  25. package/dist/src/installer/hook-installer.d.ts +19 -0
  26. package/dist/src/installer/hook-installer.js +114 -0
  27. package/dist/src/installer/hook-installer.js.map +1 -0
  28. package/dist/src/installer/mcp-installer.d.ts +9 -0
  29. package/dist/src/installer/mcp-installer.js +80 -0
  30. package/dist/src/installer/mcp-installer.js.map +1 -0
  31. package/dist/src/installer/skill-installer.d.ts +5 -0
  32. package/dist/src/installer/skill-installer.js +55 -0
  33. package/dist/src/installer/skill-installer.js.map +1 -0
  34. package/dist/src/installer/skill-sync.d.ts +10 -0
  35. package/dist/src/installer/skill-sync.js +76 -0
  36. package/dist/src/installer/skill-sync.js.map +1 -0
  37. package/dist/src/mcp/server.d.ts +3 -0
  38. package/dist/src/mcp/server.js +106 -0
  39. package/dist/src/mcp/server.js.map +1 -0
  40. package/dist/src/mcp/subscription-gate.d.ts +19 -0
  41. package/dist/src/mcp/subscription-gate.js +74 -0
  42. package/dist/src/mcp/subscription-gate.js.map +1 -0
  43. package/dist/src/mcp/tools/ai-profile.d.ts +88 -0
  44. package/dist/src/mcp/tools/ai-profile.js +123 -0
  45. package/dist/src/mcp/tools/ai-profile.js.map +1 -0
  46. package/dist/src/mcp/tools/classify-session.d.ts +31 -0
  47. package/dist/src/mcp/tools/classify-session.js +34 -0
  48. package/dist/src/mcp/tools/classify-session.js.map +1 -0
  49. package/dist/src/mcp/tools/get-knowledge.d.ts +25 -0
  50. package/dist/src/mcp/tools/get-knowledge.js +31 -0
  51. package/dist/src/mcp/tools/get-knowledge.js.map +1 -0
  52. package/dist/src/mcp/tools/get-profile.d.ts +1 -0
  53. package/dist/src/mcp/tools/get-profile.js +77 -0
  54. package/dist/src/mcp/tools/get-profile.js.map +1 -0
  55. package/dist/src/mcp/tools/get-stats.d.ts +58 -0
  56. package/dist/src/mcp/tools/get-stats.js +135 -0
  57. package/dist/src/mcp/tools/get-stats.js.map +1 -0
  58. package/dist/src/mcp/tools/get-suggestions.d.ts +7 -0
  59. package/dist/src/mcp/tools/get-suggestions.js +176 -0
  60. package/dist/src/mcp/tools/get-suggestions.js.map +1 -0
  61. package/dist/src/mcp/tools/get-training.d.ts +48 -0
  62. package/dist/src/mcp/tools/get-training.js +102 -0
  63. package/dist/src/mcp/tools/get-training.js.map +1 -0
  64. package/dist/src/mcp/tools/log-highlight.d.ts +32 -0
  65. package/dist/src/mcp/tools/log-highlight.js +39 -0
  66. package/dist/src/mcp/tools/log-highlight.js.map +1 -0
  67. package/dist/src/mcp/tools/quest.d.ts +78 -0
  68. package/dist/src/mcp/tools/quest.js +72 -0
  69. package/dist/src/mcp/tools/quest.js.map +1 -0
  70. package/dist/src/mcp/tools/web-search.d.ts +15 -0
  71. package/dist/src/mcp/tools/web-search.js +17 -0
  72. package/dist/src/mcp/tools/web-search.js.map +1 -0
  73. package/dist/src/readers/history-reader.d.ts +28 -0
  74. package/dist/src/readers/history-reader.js +83 -0
  75. package/dist/src/readers/history-reader.js.map +1 -0
  76. package/dist/src/readers/session-reader.d.ts +89 -0
  77. package/dist/src/readers/session-reader.js +310 -0
  78. package/dist/src/readers/session-reader.js.map +1 -0
  79. package/dist/src/readers/stats-reader.d.ts +38 -0
  80. package/dist/src/readers/stats-reader.js +125 -0
  81. package/dist/src/readers/stats-reader.js.map +1 -0
  82. package/dist/src/store/local-store.d.ts +72 -0
  83. package/dist/src/store/local-store.js +145 -0
  84. package/dist/src/store/local-store.js.map +1 -0
  85. package/dist/src/store/quest-store.d.ts +77 -0
  86. package/dist/src/store/quest-store.js +309 -0
  87. package/dist/src/store/quest-store.js.map +1 -0
  88. package/dist/src/store/status-store.d.ts +73 -0
  89. package/dist/src/store/status-store.js +372 -0
  90. package/dist/src/store/status-store.js.map +1 -0
  91. package/dist/src/suggestions/rules.d.ts +1 -0
  92. package/dist/src/suggestions/rules.js +2 -0
  93. package/dist/src/suggestions/rules.js.map +1 -0
  94. package/dist/src/suggestions/video-links.d.ts +1 -0
  95. package/dist/src/suggestions/video-links.js +2 -0
  96. package/dist/src/suggestions/video-links.js.map +1 -0
  97. package/package.json +35 -0
  98. package/skills/he-coach/SKILL.md +56 -0
  99. package/skills/he-consult/SKILL.md +43 -0
  100. package/skills/he-enhance-claude-md/SKILL.md +58 -0
  101. package/skills/he-flex-socials/SKILL.md +50 -0
  102. package/skills/he-full-audit/SKILL.md +119 -0
  103. package/skills/he-improve-skill/SKILL.md +111 -0
  104. package/skills/he-interview/SKILL.md +54 -0
  105. package/skills/he-life-story/SKILL.md +64 -0
  106. package/skills/he-log-experience/SKILL.md +68 -0
  107. package/skills/he-open-dashboard/SKILL.md +27 -0
  108. package/skills/he-quest-status/SKILL.md +48 -0
  109. 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;