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.
- package/dist/bin/cli.js +11 -22
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/api-client.d.ts +1 -1
- package/dist/src/api-client.js +9 -1
- package/dist/src/api-client.js.map +1 -1
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/reset.js.map +1 -1
- package/dist/src/mcp/server.d.ts +1 -5
- package/dist/src/mcp/server.js +20 -75
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/store/local-store.d.ts +13 -2
- package/dist/src/store/local-store.js +21 -0
- package/dist/src/store/local-store.js.map +1 -1
- package/package.json +2 -6
- package/dist/src/classifiers/activity-classifier.d.ts +0 -12
- package/dist/src/classifiers/activity-classifier.js +0 -300
- package/dist/src/classifiers/activity-classifier.js.map +0 -1
- package/dist/src/classifiers/path-detector.d.ts +0 -33
- package/dist/src/classifiers/path-detector.js +0 -98
- package/dist/src/classifiers/path-detector.js.map +0 -1
- package/dist/src/commands/log-session.d.ts +0 -7
- package/dist/src/commands/log-session.js +0 -23
- package/dist/src/commands/log-session.js.map +0 -1
- package/dist/src/commands/sync.d.ts +0 -6
- package/dist/src/commands/sync.js +0 -36
- package/dist/src/commands/sync.js.map +0 -1
- package/dist/src/installer/hook-installer.d.ts +0 -19
- package/dist/src/installer/hook-installer.js +0 -114
- package/dist/src/installer/hook-installer.js.map +0 -1
- package/dist/src/installer/mcp-installer.d.ts +0 -9
- package/dist/src/installer/mcp-installer.js +0 -80
- package/dist/src/installer/mcp-installer.js.map +0 -1
- package/dist/src/installer/skill-installer.d.ts +0 -5
- package/dist/src/installer/skill-installer.js +0 -55
- package/dist/src/installer/skill-installer.js.map +0 -1
- package/dist/src/installer/skill-sync.d.ts +0 -10
- package/dist/src/installer/skill-sync.js +0 -80
- package/dist/src/installer/skill-sync.js.map +0 -1
- package/dist/src/mcp/catch-up.d.ts +0 -6
- package/dist/src/mcp/catch-up.js +0 -28
- package/dist/src/mcp/catch-up.js.map +0 -1
- package/dist/src/mcp/tools/ai-profile.d.ts +0 -88
- package/dist/src/mcp/tools/ai-profile.js +0 -123
- package/dist/src/mcp/tools/ai-profile.js.map +0 -1
- package/dist/src/mcp/tools/classify-session.d.ts +0 -31
- package/dist/src/mcp/tools/classify-session.js +0 -34
- package/dist/src/mcp/tools/classify-session.js.map +0 -1
- package/dist/src/mcp/tools/get-knowledge.d.ts +0 -25
- package/dist/src/mcp/tools/get-knowledge.js +0 -31
- package/dist/src/mcp/tools/get-knowledge.js.map +0 -1
- package/dist/src/mcp/tools/get-profile.d.ts +0 -1
- package/dist/src/mcp/tools/get-profile.js +0 -14
- package/dist/src/mcp/tools/get-profile.js.map +0 -1
- package/dist/src/mcp/tools/get-stats.d.ts +0 -32
- package/dist/src/mcp/tools/get-stats.js +0 -45
- package/dist/src/mcp/tools/get-stats.js.map +0 -1
- package/dist/src/mcp/tools/get-suggestions.d.ts +0 -7
- package/dist/src/mcp/tools/get-suggestions.js +0 -65
- package/dist/src/mcp/tools/get-suggestions.js.map +0 -1
- package/dist/src/mcp/tools/get-training.d.ts +0 -48
- package/dist/src/mcp/tools/get-training.js +0 -102
- package/dist/src/mcp/tools/get-training.js.map +0 -1
- package/dist/src/mcp/tools/log-highlight.d.ts +0 -24
- package/dist/src/mcp/tools/log-highlight.js +0 -25
- package/dist/src/mcp/tools/log-highlight.js.map +0 -1
- package/dist/src/mcp/tools/quest.d.ts +0 -4
- package/dist/src/mcp/tools/quest.js +0 -8
- package/dist/src/mcp/tools/quest.js.map +0 -1
- package/dist/src/mcp/tools/web-search.d.ts +0 -15
- package/dist/src/mcp/tools/web-search.js +0 -17
- package/dist/src/mcp/tools/web-search.js.map +0 -1
- package/dist/src/readers/extract-signals.d.ts +0 -23
- package/dist/src/readers/extract-signals.js +0 -50
- package/dist/src/readers/extract-signals.js.map +0 -1
- package/dist/src/readers/history-reader.d.ts +0 -28
- package/dist/src/readers/history-reader.js +0 -83
- package/dist/src/readers/history-reader.js.map +0 -1
- package/dist/src/readers/session-reader.d.ts +0 -75
- package/dist/src/readers/session-reader.js +0 -191
- package/dist/src/readers/session-reader.js.map +0 -1
- package/dist/src/readers/session-sync.d.ts +0 -24
- package/dist/src/readers/session-sync.js +0 -114
- package/dist/src/readers/session-sync.js.map +0 -1
- package/dist/src/readers/stats-reader.d.ts +0 -38
- package/dist/src/readers/stats-reader.js +0 -125
- package/dist/src/readers/stats-reader.js.map +0 -1
- package/skills/bp-claude-coach/SKILL.md +0 -314
- package/skills/bp-enhance-claude-md/SKILL.md +0 -62
- package/skills/bp-expert-advice/SKILL.md +0 -62
- package/skills/bp-flex-socials/SKILL.md +0 -54
- package/skills/bp-full-audit/SKILL.md +0 -145
- package/skills/bp-generate-personalized-training-data/SKILL.md +0 -145
- package/skills/bp-improve-skill/SKILL.md +0 -115
- package/skills/bp-interview/SKILL.md +0 -64
- package/skills/bp-interview-me/SKILL.md +0 -120
- package/skills/bp-life-story/SKILL.md +0 -68
- package/skills/bp-log-experience/SKILL.md +0 -72
- package/skills/bp-open-dashboard/SKILL.md +0 -31
- package/skills/bp-quest-status/SKILL.md +0 -52
- package/skills/bp-recap-week/SKILL.md +0 -53
- package/skills/bp-setup-coach/SKILL.md +0 -64
- package/skills/bp-shorts-ideation/SKILL.md +0 -108
- package/skills/bp-shorts-script/SKILL.md +0 -126
- package/skills/bp-youtube-ideation/SKILL.md +0 -99
- 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,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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAc,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;AAC5E,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAOzD,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAc,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;QAC7C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,0BAA0B;IAC1B,IAAI,KAAK,EAAE,SAAS,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,IAAI,GAAG,GAAG,gBAAgB,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,EAAE,SAAS,IAAI,SAAS,CAAC;QAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAG1B,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,oCAAoC;YACpC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YACzF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,+BAA+B;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,iEAAiE;YACjE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE7C,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,cAAc,CAAC;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -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>;
|
package/dist/src/mcp/catch-up.js
DELETED
|
@@ -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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"}
|