buildpartner 0.4.2 → 0.8.0-dev.20260430072343

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 (105) hide show
  1. package/dist/bin/cli.js +11 -22
  2. package/dist/bin/cli.js.map +1 -1
  3. package/dist/src/api-client.d.ts +1 -1
  4. package/dist/src/api-client.js +9 -1
  5. package/dist/src/api-client.js.map +1 -1
  6. package/dist/src/commands/reset.js +1 -1
  7. package/dist/src/commands/reset.js.map +1 -1
  8. package/dist/src/mcp/server.d.ts +1 -5
  9. package/dist/src/mcp/server.js +20 -75
  10. package/dist/src/mcp/server.js.map +1 -1
  11. package/dist/src/store/local-store.d.ts +13 -2
  12. package/dist/src/store/local-store.js +21 -0
  13. package/dist/src/store/local-store.js.map +1 -1
  14. package/package.json +2 -6
  15. package/dist/src/classifiers/activity-classifier.d.ts +0 -12
  16. package/dist/src/classifiers/activity-classifier.js +0 -300
  17. package/dist/src/classifiers/activity-classifier.js.map +0 -1
  18. package/dist/src/classifiers/path-detector.d.ts +0 -33
  19. package/dist/src/classifiers/path-detector.js +0 -98
  20. package/dist/src/classifiers/path-detector.js.map +0 -1
  21. package/dist/src/commands/log-session.d.ts +0 -7
  22. package/dist/src/commands/log-session.js +0 -23
  23. package/dist/src/commands/log-session.js.map +0 -1
  24. package/dist/src/commands/sync.d.ts +0 -6
  25. package/dist/src/commands/sync.js +0 -36
  26. package/dist/src/commands/sync.js.map +0 -1
  27. package/dist/src/installer/hook-installer.d.ts +0 -19
  28. package/dist/src/installer/hook-installer.js +0 -114
  29. package/dist/src/installer/hook-installer.js.map +0 -1
  30. package/dist/src/installer/mcp-installer.d.ts +0 -9
  31. package/dist/src/installer/mcp-installer.js +0 -80
  32. package/dist/src/installer/mcp-installer.js.map +0 -1
  33. package/dist/src/installer/skill-installer.d.ts +0 -5
  34. package/dist/src/installer/skill-installer.js +0 -55
  35. package/dist/src/installer/skill-installer.js.map +0 -1
  36. package/dist/src/installer/skill-sync.d.ts +0 -10
  37. package/dist/src/installer/skill-sync.js +0 -80
  38. package/dist/src/installer/skill-sync.js.map +0 -1
  39. package/dist/src/mcp/catch-up.d.ts +0 -6
  40. package/dist/src/mcp/catch-up.js +0 -28
  41. package/dist/src/mcp/catch-up.js.map +0 -1
  42. package/dist/src/mcp/tools/ai-profile.d.ts +0 -88
  43. package/dist/src/mcp/tools/ai-profile.js +0 -123
  44. package/dist/src/mcp/tools/ai-profile.js.map +0 -1
  45. package/dist/src/mcp/tools/classify-session.d.ts +0 -31
  46. package/dist/src/mcp/tools/classify-session.js +0 -34
  47. package/dist/src/mcp/tools/classify-session.js.map +0 -1
  48. package/dist/src/mcp/tools/get-knowledge.d.ts +0 -25
  49. package/dist/src/mcp/tools/get-knowledge.js +0 -31
  50. package/dist/src/mcp/tools/get-knowledge.js.map +0 -1
  51. package/dist/src/mcp/tools/get-profile.d.ts +0 -1
  52. package/dist/src/mcp/tools/get-profile.js +0 -14
  53. package/dist/src/mcp/tools/get-profile.js.map +0 -1
  54. package/dist/src/mcp/tools/get-stats.d.ts +0 -32
  55. package/dist/src/mcp/tools/get-stats.js +0 -45
  56. package/dist/src/mcp/tools/get-stats.js.map +0 -1
  57. package/dist/src/mcp/tools/get-suggestions.d.ts +0 -7
  58. package/dist/src/mcp/tools/get-suggestions.js +0 -65
  59. package/dist/src/mcp/tools/get-suggestions.js.map +0 -1
  60. package/dist/src/mcp/tools/get-training.d.ts +0 -48
  61. package/dist/src/mcp/tools/get-training.js +0 -102
  62. package/dist/src/mcp/tools/get-training.js.map +0 -1
  63. package/dist/src/mcp/tools/log-highlight.d.ts +0 -24
  64. package/dist/src/mcp/tools/log-highlight.js +0 -25
  65. package/dist/src/mcp/tools/log-highlight.js.map +0 -1
  66. package/dist/src/mcp/tools/quest.d.ts +0 -4
  67. package/dist/src/mcp/tools/quest.js +0 -8
  68. package/dist/src/mcp/tools/quest.js.map +0 -1
  69. package/dist/src/mcp/tools/web-search.d.ts +0 -15
  70. package/dist/src/mcp/tools/web-search.js +0 -17
  71. package/dist/src/mcp/tools/web-search.js.map +0 -1
  72. package/dist/src/readers/extract-signals.d.ts +0 -23
  73. package/dist/src/readers/extract-signals.js +0 -50
  74. package/dist/src/readers/extract-signals.js.map +0 -1
  75. package/dist/src/readers/history-reader.d.ts +0 -28
  76. package/dist/src/readers/history-reader.js +0 -83
  77. package/dist/src/readers/history-reader.js.map +0 -1
  78. package/dist/src/readers/session-reader.d.ts +0 -75
  79. package/dist/src/readers/session-reader.js +0 -191
  80. package/dist/src/readers/session-reader.js.map +0 -1
  81. package/dist/src/readers/session-sync.d.ts +0 -24
  82. package/dist/src/readers/session-sync.js +0 -114
  83. package/dist/src/readers/session-sync.js.map +0 -1
  84. package/dist/src/readers/stats-reader.d.ts +0 -38
  85. package/dist/src/readers/stats-reader.js +0 -125
  86. package/dist/src/readers/stats-reader.js.map +0 -1
  87. package/skills/bp-claude-coach/SKILL.md +0 -314
  88. package/skills/bp-enhance-claude-md/SKILL.md +0 -62
  89. package/skills/bp-expert-advice/SKILL.md +0 -62
  90. package/skills/bp-flex-socials/SKILL.md +0 -54
  91. package/skills/bp-full-audit/SKILL.md +0 -145
  92. package/skills/bp-generate-personalized-training-data/SKILL.md +0 -145
  93. package/skills/bp-improve-skill/SKILL.md +0 -115
  94. package/skills/bp-interview/SKILL.md +0 -64
  95. package/skills/bp-interview-me/SKILL.md +0 -120
  96. package/skills/bp-life-story/SKILL.md +0 -68
  97. package/skills/bp-log-experience/SKILL.md +0 -72
  98. package/skills/bp-open-dashboard/SKILL.md +0 -31
  99. package/skills/bp-quest-status/SKILL.md +0 -52
  100. package/skills/bp-recap-week/SKILL.md +0 -53
  101. package/skills/bp-setup-coach/SKILL.md +0 -64
  102. package/skills/bp-shorts-ideation/SKILL.md +0 -108
  103. package/skills/bp-shorts-script/SKILL.md +0 -126
  104. package/skills/bp-youtube-ideation/SKILL.md +0 -99
  105. package/skills/bp-youtube-script/SKILL.md +0 -149
@@ -1,114 +0,0 @@
1
- import { readFileSync, writeFileSync, existsSync } from "fs";
2
- import { join } from "path";
3
- import { homedir } from "os";
4
- const SETTINGS_PATH = join(homedir(), ".claude", "settings.json");
5
- const BUILDPARTNER_HOOK_COMMAND = "npx buildpartner log-session";
6
- /**
7
- * Merge the BuildPartner Stop hook into ~/.claude/settings.json.
8
- * Uses the correct Claude Code hook schema:
9
- * hooks.Stop[].hooks[].{type, command, timeout}
10
- * Preserves all existing hooks and settings.
11
- */
12
- export function installHook() {
13
- let settings = {};
14
- if (existsSync(SETTINGS_PATH)) {
15
- try {
16
- settings = JSON.parse(readFileSync(SETTINGS_PATH, "utf-8"));
17
- }
18
- catch {
19
- settings = {};
20
- }
21
- }
22
- // Ensure hooks object exists
23
- if (!settings.hooks || typeof settings.hooks !== "object") {
24
- settings.hooks = {};
25
- }
26
- const hooks = settings.hooks;
27
- // Ensure Stop array exists
28
- if (!Array.isArray(hooks.Stop)) {
29
- hooks.Stop = [];
30
- }
31
- // Check if our hook already exists anywhere in the Stop array
32
- const exists = hooks.Stop.some((entry) => {
33
- if (typeof entry !== "object" || entry === null)
34
- return false;
35
- const innerHooks = entry.hooks;
36
- if (!Array.isArray(innerHooks))
37
- return false;
38
- return innerHooks.some((h) => typeof h === "object" &&
39
- h !== null &&
40
- h.command === BUILDPARTNER_HOOK_COMMAND);
41
- });
42
- if (exists) {
43
- return { installed: false, alreadyExists: true };
44
- }
45
- // Also clean up any old-format "stop" (lowercase) entries we may have written
46
- if (hooks.stop) {
47
- delete hooks.stop;
48
- }
49
- hooks.Stop.push({
50
- hooks: [
51
- {
52
- type: "command",
53
- command: BUILDPARTNER_HOOK_COMMAND,
54
- timeout: 5,
55
- },
56
- ],
57
- });
58
- writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
59
- return { installed: true, alreadyExists: false };
60
- }
61
- /**
62
- * Add mcp__buildpartner__* to the allow list in ~/.claude/settings.json
63
- * so users don't get prompted for every MCP tool call.
64
- */
65
- export function installPermissions() {
66
- let settings = {};
67
- if (existsSync(SETTINGS_PATH)) {
68
- try {
69
- settings = JSON.parse(readFileSync(SETTINGS_PATH, "utf-8"));
70
- }
71
- catch {
72
- settings = {};
73
- }
74
- }
75
- if (!settings.permissions || typeof settings.permissions !== "object") {
76
- settings.permissions = {};
77
- }
78
- const permissions = settings.permissions;
79
- if (!Array.isArray(permissions.allow)) {
80
- permissions.allow = [];
81
- }
82
- const allowList = permissions.allow;
83
- const buildpartnerPermission = "mcp__buildpartner__*";
84
- if (allowList.includes(buildpartnerPermission)) {
85
- return { installed: false, alreadyExists: true };
86
- }
87
- allowList.push(buildpartnerPermission);
88
- writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
89
- return { installed: true, alreadyExists: false };
90
- }
91
- export function isHookInstalled() {
92
- if (!existsSync(SETTINGS_PATH))
93
- return false;
94
- try {
95
- const settings = JSON.parse(readFileSync(SETTINGS_PATH, "utf-8"));
96
- const stopEntries = settings?.hooks?.Stop;
97
- if (!Array.isArray(stopEntries))
98
- return false;
99
- return stopEntries.some((entry) => {
100
- if (typeof entry !== "object" || entry === null)
101
- return false;
102
- const innerHooks = entry.hooks;
103
- if (!Array.isArray(innerHooks))
104
- return false;
105
- return innerHooks.some((h) => typeof h === "object" &&
106
- h !== null &&
107
- h.command === BUILDPARTNER_HOOK_COMMAND);
108
- });
109
- }
110
- catch {
111
- return false;
112
- }
113
- }
114
- //# sourceMappingURL=hook-installer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-installer.js","sourceRoot":"","sources":["../../../src/installer/hook-installer.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Add BuildPartner MCP server to Claude Code config.
3
- * Writes to ~/.claude.json (primary) and ~/.claude/mcp_servers.json (fallback).
4
- */
5
- export declare function installMcp(): {
6
- installed: boolean;
7
- alreadyExists: boolean;
8
- };
9
- export declare function isMcpInstalled(): boolean;
@@ -1,80 +0,0 @@
1
- import { readFileSync, writeFileSync, existsSync } from "fs";
2
- import { join } from "path";
3
- import { homedir } from "os";
4
- // Claude Code stores user MCP servers in ~/.claude.json (not ~/.claude/mcp_servers.json)
5
- const CLAUDE_JSON_PATH = join(homedir(), ".claude.json");
6
- const LEGACY_MCP_PATH = join(homedir(), ".claude", "mcp_servers.json");
7
- const BUILDPARTNER_MCP_ENTRY = {
8
- command: "npx",
9
- args: ["-y", "buildpartner", "serve"],
10
- };
11
- /**
12
- * Add BuildPartner MCP server to Claude Code config.
13
- * Writes to ~/.claude.json (primary) and ~/.claude/mcp_servers.json (fallback).
14
- */
15
- export function installMcp() {
16
- // Try ~/.claude.json first (this is where Claude Code reads user MCPs)
17
- if (existsSync(CLAUDE_JSON_PATH)) {
18
- try {
19
- const config = JSON.parse(readFileSync(CLAUDE_JSON_PATH, "utf-8"));
20
- if (!config.mcpServers)
21
- config.mcpServers = {};
22
- if (config.mcpServers.buildpartner) {
23
- return { installed: false, alreadyExists: true };
24
- }
25
- config.mcpServers.buildpartner = BUILDPARTNER_MCP_ENTRY;
26
- writeFileSync(CLAUDE_JSON_PATH, JSON.stringify(config, null, 2) + "\n");
27
- return { installed: true, alreadyExists: false };
28
- }
29
- catch {
30
- // Fall through to legacy path
31
- }
32
- }
33
- // Fallback: ~/.claude/mcp_servers.json
34
- let config = {};
35
- if (existsSync(LEGACY_MCP_PATH)) {
36
- try {
37
- config = JSON.parse(readFileSync(LEGACY_MCP_PATH, "utf-8"));
38
- }
39
- catch {
40
- config = {};
41
- }
42
- }
43
- const hasNested = config.mcpServers && typeof config.mcpServers === "object";
44
- const target = hasNested
45
- ? config.mcpServers
46
- : config;
47
- if (target["buildpartner"]) {
48
- return { installed: false, alreadyExists: true };
49
- }
50
- if (!hasNested) {
51
- config.mcpServers = config.mcpServers || {};
52
- }
53
- config.mcpServers["buildpartner"] = BUILDPARTNER_MCP_ENTRY;
54
- writeFileSync(LEGACY_MCP_PATH, JSON.stringify(config, null, 2) + "\n");
55
- return { installed: true, alreadyExists: false };
56
- }
57
- export function isMcpInstalled() {
58
- // Check ~/.claude.json
59
- if (existsSync(CLAUDE_JSON_PATH)) {
60
- try {
61
- const config = JSON.parse(readFileSync(CLAUDE_JSON_PATH, "utf-8"));
62
- if (config.mcpServers?.buildpartner)
63
- return true;
64
- }
65
- catch { }
66
- }
67
- // Check legacy path
68
- if (existsSync(LEGACY_MCP_PATH)) {
69
- try {
70
- const config = JSON.parse(readFileSync(LEGACY_MCP_PATH, "utf-8"));
71
- if (config.mcpServers?.buildpartner)
72
- return true;
73
- if (config.buildpartner)
74
- return true;
75
- }
76
- catch { }
77
- }
78
- return false;
79
- }
80
- //# sourceMappingURL=mcp-installer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-installer.js","sourceRoot":"","sources":["../../../src/installer/mcp-installer.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Copy SKILL.md files to ~/.claude/skills/ (global only).
3
- * Global install makes skills accessible in every project.
4
- */
5
- export declare function installSkills(): string[];
@@ -1,55 +0,0 @@
1
- import { copyFileSync, mkdirSync, existsSync } from "fs";
2
- import { join, dirname } from "path";
3
- import { homedir } from "os";
4
- import { fileURLToPath } from "url";
5
- const __filename = fileURLToPath(import.meta.url);
6
- const __dirname = dirname(__filename);
7
- // When compiled: __dirname = .../dist/src/installer
8
- // Package root = 3 levels up from there
9
- const PACKAGE_ROOT = join(__dirname, "..", "..", "..");
10
- const GLOBAL_SKILLS_DIR = join(homedir(), ".claude", "skills");
11
- const SKILLS = ["bp-expert-advice", "bp-claude-coach", "bp-interview-me", "bp-generate-personalized-training-data", "bp-open-dashboard"];
12
- /**
13
- * Find the source skills directory from the package.
14
- */
15
- function findSkillsSource() {
16
- const searchPaths = [
17
- join(PACKAGE_ROOT, "skills"),
18
- join(PACKAGE_ROOT, "..", "skills"),
19
- join(__dirname, "..", "..", "..", "..", "skills"),
20
- ];
21
- for (const p of searchPaths) {
22
- if (existsSync(join(p, SKILLS[0], "SKILL.md"))) {
23
- return p;
24
- }
25
- }
26
- return null;
27
- }
28
- /**
29
- * Install skills to a target directory.
30
- */
31
- function installToDir(skillsDir, targetDir) {
32
- const installed = [];
33
- for (const skill of SKILLS) {
34
- const source = join(skillsDir, skill, "SKILL.md");
35
- if (!existsSync(source))
36
- continue;
37
- const destDir = join(targetDir, skill);
38
- const dest = join(destDir, "SKILL.md");
39
- mkdirSync(destDir, { recursive: true });
40
- copyFileSync(source, dest);
41
- installed.push(skill);
42
- }
43
- return installed;
44
- }
45
- /**
46
- * Copy SKILL.md files to ~/.claude/skills/ (global only).
47
- * Global install makes skills accessible in every project.
48
- */
49
- export function installSkills() {
50
- const skillsDir = findSkillsSource();
51
- if (!skillsDir)
52
- return [];
53
- return installToDir(skillsDir, GLOBAL_SKILLS_DIR);
54
- }
55
- //# sourceMappingURL=skill-installer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../../../src/installer/skill-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,oDAAoD;AACpD,wCAAwC;AACxC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAE/D,MAAM,MAAM,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,wCAAwC,EAAE,mBAAmB,CAAC,CAAC;AAEzI;;GAEG;AACH,SAAS,gBAAgB;IACvB,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC;QAClC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;KAClD,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,SAAiB,EAAE,SAAiB;IACxD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEvC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,OAAO,YAAY,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AACpD,CAAC"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Skill sync: pulls latest skill definitions from the API.
3
- * Called on MCP server startup. Writes to ~/.claude/skills/bp-*.
4
- * Falls back to bundled skills if offline.
5
- */
6
- /**
7
- * Sync skills from API if stale. Non-blocking, best-effort.
8
- * Returns true if sync happened, false if skipped or failed.
9
- */
10
- export declare function syncSkills(): Promise<boolean>;
@@ -1,80 +0,0 @@
1
- /**
2
- * Skill sync: pulls latest skill definitions from the API.
3
- * Called on MCP server startup. Writes to ~/.claude/skills/bp-*.
4
- * Falls back to bundled skills if offline.
5
- */
6
- import { writeFileSync, readFileSync, mkdirSync } from "fs";
7
- import { join } from "path";
8
- import { homedir } from "os";
9
- import { apiFetch } from "../api-client.js";
10
- const SKILLS_DIR = join(homedir(), ".claude", "skills");
11
- const SYNC_STATE_PATH = join(homedir(), ".buildpartner", "skill-sync.json");
12
- const SYNC_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
13
- function readSyncState() {
14
- try {
15
- return JSON.parse(readFileSync(SYNC_STATE_PATH, "utf-8"));
16
- }
17
- catch {
18
- return null;
19
- }
20
- }
21
- function writeSyncState(state) {
22
- try {
23
- const dir = join(homedir(), ".buildpartner");
24
- mkdirSync(dir, { recursive: true });
25
- writeFileSync(SYNC_STATE_PATH, JSON.stringify(state));
26
- }
27
- catch {
28
- // Non-fatal
29
- }
30
- }
31
- /**
32
- * Sync skills from API if stale. Non-blocking, best-effort.
33
- * Returns true if sync happened, false if skipped or failed.
34
- */
35
- export async function syncSkills() {
36
- const state = readSyncState();
37
- const now = Date.now();
38
- // Skip if synced recently
39
- if (state?.last_sync) {
40
- const age = now - new Date(state.last_sync).getTime();
41
- if (age < SYNC_INTERVAL_MS) {
42
- return false;
43
- }
44
- }
45
- try {
46
- const since = state?.last_sync || undefined;
47
- const qs = since ? `?since=${encodeURIComponent(since)}` : "";
48
- const res = await apiFetch(`/api/buildpartner/skills${qs}`);
49
- if (!res || !res.ok) {
50
- return false;
51
- }
52
- const data = await res.json();
53
- if (!data.skills || data.skills.length === 0) {
54
- // No updates, but mark sync as done
55
- writeSyncState({ last_sync: new Date().toISOString(), sync_version: data.sync_version });
56
- return false;
57
- }
58
- // Write updated skills to disk
59
- for (const skill of data.skills) {
60
- // Validate skill name: must be bp-<word> with no path separators
61
- if (!/^bp-[a-z0-9-]+$/.test(skill.name)) {
62
- continue;
63
- }
64
- const skillDir = join(SKILLS_DIR, skill.name);
65
- const skillPath = join(skillDir, "SKILL.md");
66
- mkdirSync(skillDir, { recursive: true });
67
- writeFileSync(skillPath, skill.content);
68
- }
69
- writeSyncState({
70
- last_sync: new Date().toISOString(),
71
- sync_version: data.sync_version,
72
- });
73
- return true;
74
- }
75
- catch {
76
- // Sync failures are non-fatal, skills fall back to bundled versions
77
- return false;
78
- }
79
- }
80
- //# sourceMappingURL=skill-sync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-sync.js","sourceRoot":"","sources":["../../../src/installer/skill-sync.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Catch-up scan: sync any missed sessions on MCP server startup.
3
- * Scans ~/.claude/projects/ for recent session files, extracts signals,
4
- * and POSTs to the server which classifies and deduplicates.
5
- */
6
- export declare function catchUpSessions(): Promise<void>;
@@ -1,28 +0,0 @@
1
- /**
2
- * Catch-up scan: sync any missed sessions on MCP server startup.
3
- * Scans ~/.claude/projects/ for recent session files, extracts signals,
4
- * and POSTs to the server which classifies and deduplicates.
5
- */
6
- import { readAuth, writeAuth, logError } from "../store/local-store.js";
7
- import { scanRecentSessions, syncToServer } from "../readers/session-sync.js";
8
- const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;
9
- export async function catchUpSessions() {
10
- const auth = readAuth();
11
- if (!auth?.token)
12
- return;
13
- const lastSync = auth.last_session_sync
14
- ? new Date(auth.last_session_sync).getTime()
15
- : 0;
16
- const cutoff = Math.max(lastSync, Date.now() - SEVEN_DAYS_MS);
17
- try {
18
- const sessions = scanRecentSessions(cutoff);
19
- if (sessions.length > 0) {
20
- await syncToServer(sessions, auth.token);
21
- }
22
- writeAuth({ ...auth, last_session_sync: new Date().toISOString() });
23
- }
24
- catch (err) {
25
- logError(err);
26
- }
27
- }
28
- //# sourceMappingURL=catch-up.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"catch-up.js","sourceRoot":"","sources":["../../../src/mcp/catch-up.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE9E,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE,KAAK;QAAE,OAAO;IAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB;QACrC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE;QAC5C,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QAED,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -1,88 +0,0 @@
1
- import { z } from "zod";
2
- export declare const getAiProfileSchema: {};
3
- export declare const updateAiProfileSchema: {
4
- section: z.ZodEnum<{
5
- writing_style: "writing_style";
6
- preferences: "preferences";
7
- tech_identity: "tech_identity";
8
- work_patterns: "work_patterns";
9
- personality: "personality";
10
- }>;
11
- data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
12
- signal: z.ZodOptional<z.ZodString>;
13
- };
14
- export declare const batchUpdateAiProfileSchema: {
15
- updates: z.ZodRecord<z.ZodEnum<{
16
- writing_style: "writing_style";
17
- preferences: "preferences";
18
- tech_identity: "tech_identity";
19
- work_patterns: "work_patterns";
20
- personality: "personality";
21
- }>, z.ZodRecord<z.ZodString, z.ZodUnknown>>;
22
- signals: z.ZodOptional<z.ZodArray<z.ZodString>>;
23
- };
24
- export declare function batchUpdateAiProfile({ updates, signals, }: {
25
- updates: Record<string, Record<string, unknown>>;
26
- signals?: string[];
27
- }): Promise<{
28
- updated: boolean;
29
- sections: string[];
30
- error?: undefined;
31
- } | {
32
- error: string;
33
- updated?: undefined;
34
- sections?: undefined;
35
- }>;
36
- export declare const analyzeHistorySchema: {
37
- session_count: z.ZodOptional<z.ZodNumber>;
38
- };
39
- export declare function getAiProfile(): Promise<{}>;
40
- export declare function updateAiProfile({ section, data, signal, }: {
41
- section: string;
42
- data: Record<string, unknown>;
43
- signal?: string;
44
- }): Promise<{
45
- updated: boolean;
46
- section: string;
47
- keys: string[];
48
- error?: undefined;
49
- } | {
50
- error: string;
51
- updated?: undefined;
52
- section?: undefined;
53
- keys?: undefined;
54
- }>;
55
- /**
56
- * Analyze session history to extract profile signals.
57
- * This is called by the /mp-profile-build skill.
58
- * Returns structured observations that Claude then saves to the profile.
59
- */
60
- export declare function analyzeHistory({ session_count }: {
61
- session_count?: number;
62
- }): Promise<{
63
- error: string;
64
- analysis?: undefined;
65
- instructions?: undefined;
66
- } | {
67
- analysis: {
68
- tech_identity: {
69
- primary_languages: string[];
70
- frameworks: string[];
71
- mcp_servers: string[];
72
- top_tools: {
73
- name: string;
74
- count: number;
75
- }[];
76
- };
77
- work_patterns: {
78
- peak_hour: string;
79
- peak_day: string;
80
- avg_session_minutes: number;
81
- activity_distribution: Record<string, number>;
82
- total_sessions_analyzed: number;
83
- };
84
- session_summaries: string[];
85
- };
86
- instructions: string;
87
- error?: undefined;
88
- }>;
@@ -1,123 +0,0 @@
1
- import { z } from "zod";
2
- import { apiGet, apiPost } from "../../api-client.js";
3
- import { readAuth } from "../../store/local-store.js";
4
- export const getAiProfileSchema = {};
5
- export const updateAiProfileSchema = {
6
- section: z.enum(["writing_style", "preferences", "tech_identity", "work_patterns", "personality"]).describe("Which section of the profile to update"),
7
- data: z.record(z.string(), z.unknown()).describe("Key-value pairs to merge into the section"),
8
- signal: z.string().optional().describe("A raw signal/observation to add to the profile log"),
9
- };
10
- export const batchUpdateAiProfileSchema = {
11
- updates: z.record(z.enum(["writing_style", "preferences", "tech_identity", "work_patterns", "personality"]), z.record(z.string(), z.unknown())).describe("Object with section names as keys and key-value data as values. Updates all sections in one call."),
12
- signals: z.array(z.string()).optional().describe("Array of raw signal strings to append to the profile log"),
13
- };
14
- export async function batchUpdateAiProfile({ updates, signals, }) {
15
- const payload = { ...updates };
16
- if (signals && signals.length > 0) {
17
- payload.raw_signals = signals.map(s => `[${new Date().toISOString().slice(0, 10)}] ${s}`);
18
- }
19
- const result = await apiPost("/api/buildpartner/profile", payload);
20
- if (result)
21
- return { updated: true, sections: Object.keys(updates) };
22
- return { error: "Could not update profile." };
23
- }
24
- export const analyzeHistorySchema = {
25
- session_count: z.number().optional().describe("Number of recent sessions to analyze (default 20)"),
26
- };
27
- export async function getAiProfile() {
28
- const data = await apiGet("/api/buildpartner/profile");
29
- if (data)
30
- return data;
31
- return { error: "Could not fetch profile. Check your connection." };
32
- }
33
- export async function updateAiProfile({ section, data, signal, }) {
34
- const payload = {
35
- [section]: data,
36
- };
37
- if (signal) {
38
- payload.raw_signals = [`[${new Date().toISOString().slice(0, 10)}] ${signal}`];
39
- }
40
- const result = await apiPost("/api/buildpartner/profile", payload);
41
- if (result)
42
- return { updated: true, section, keys: Object.keys(data) };
43
- return { error: "Could not update profile." };
44
- }
45
- /**
46
- * Analyze session history to extract profile signals.
47
- * This is called by the /mp-profile-build skill.
48
- * Returns structured observations that Claude then saves to the profile.
49
- */
50
- export async function analyzeHistory({ session_count }) {
51
- const limit = session_count || 20;
52
- // Fetch recent sessions from API
53
- const dashData = await apiGet(`/api/buildpartner/dashboard?username=${readAuth()?.username || ""}`);
54
- if (!dashData) {
55
- return { error: "Could not fetch session history." };
56
- }
57
- const sessions = dashData.sessions.slice(0, limit);
58
- // Extract tech identity
59
- const frameworks = new Set();
60
- const languages = new Set();
61
- const tools = Object.entries(dashData.workspace.tools).sort((a, b) => b[1] - a[1]).slice(0, 10);
62
- const mcpServers = Object.keys(dashData.workspace.mcp_servers);
63
- for (const s of sessions) {
64
- const summary = (s.summary || "").toLowerCase();
65
- if (summary.includes("next.js") || summary.includes("next js"))
66
- frameworks.add("Next.js");
67
- if (summary.includes("react"))
68
- frameworks.add("React");
69
- if (summary.includes("supabase"))
70
- frameworks.add("Supabase");
71
- if (summary.includes("typescript") || summary.includes(".ts"))
72
- languages.add("TypeScript");
73
- if (summary.includes("python") || summary.includes(".py"))
74
- languages.add("Python");
75
- if (summary.includes("tailwind"))
76
- frameworks.add("Tailwind CSS");
77
- if (summary.includes("vercel"))
78
- frameworks.add("Vercel");
79
- if (summary.includes("mcp"))
80
- frameworks.add("MCP SDK");
81
- }
82
- // Extract work patterns
83
- const hourCounts = {};
84
- const dayCounts = {};
85
- const dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
86
- let totalDuration = 0;
87
- for (const s of sessions) {
88
- const d = new Date(s.timestamp);
89
- const hour = d.getHours();
90
- hourCounts[hour] = (hourCounts[hour] || 0) + 1;
91
- const day = dayNames[d.getDay()];
92
- dayCounts[day] = (dayCounts[day] || 0) + 1;
93
- totalDuration += s.duration_minutes || 0;
94
- }
95
- const peakHour = Object.entries(hourCounts).sort((a, b) => b[1] - a[1])[0];
96
- const peakDay = Object.entries(dayCounts).sort((a, b) => b[1] - a[1])[0];
97
- const avgDuration = sessions.length > 0 ? Math.round(totalDuration / sessions.length) : 0;
98
- // Extract session summaries for Claude to analyze writing style and preferences
99
- const summaries = sessions
100
- .filter((s) => s.summary && s.summary.length > 10)
101
- .map((s) => s.summary)
102
- .slice(0, 15);
103
- return {
104
- analysis: {
105
- tech_identity: {
106
- primary_languages: [...languages],
107
- frameworks: [...frameworks],
108
- mcp_servers: mcpServers,
109
- top_tools: tools.map(([name, count]) => ({ name, count })),
110
- },
111
- work_patterns: {
112
- peak_hour: peakHour ? `${peakHour[0]}:00` : "unknown",
113
- peak_day: peakDay ? peakDay[0] : "unknown",
114
- avg_session_minutes: avgDuration,
115
- activity_distribution: dashData.distribution,
116
- total_sessions_analyzed: sessions.length,
117
- },
118
- session_summaries: summaries,
119
- },
120
- instructions: "Use the session_summaries to infer writing style, communication preferences, and personality traits. Then call update_ai_profile for each section with your observations. Add a raw signal summarizing what you learned.",
121
- };
122
- }
123
- //# sourceMappingURL=ai-profile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-profile.js","sourceRoot":"","sources":["../../../../src/mcp/tools/ai-profile.ts"],"names":[],"mappings":"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"}