buildpartner 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +44 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/api-client.d.ts +18 -0
- package/dist/src/api-client.js +74 -0
- package/dist/src/api-client.js.map +1 -0
- package/dist/src/classifiers/activity-classifier.d.ts +12 -0
- package/dist/src/classifiers/activity-classifier.js +300 -0
- package/dist/src/classifiers/activity-classifier.js.map +1 -0
- package/dist/src/classifiers/path-detector.d.ts +33 -0
- package/dist/src/classifiers/path-detector.js +98 -0
- package/dist/src/classifiers/path-detector.js.map +1 -0
- package/dist/src/commands/log-session.d.ts +10 -0
- package/dist/src/commands/log-session.js +162 -0
- package/dist/src/commands/log-session.js.map +1 -0
- package/dist/src/commands/serve.d.ts +1 -0
- package/dist/src/commands/serve.js +5 -0
- package/dist/src/commands/serve.js.map +1 -0
- package/dist/src/commands/setup.d.ts +1 -0
- package/dist/src/commands/setup.js +578 -0
- package/dist/src/commands/setup.js.map +1 -0
- package/dist/src/constants.d.ts +9 -0
- package/dist/src/constants.js +12 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/installer/hook-installer.d.ts +19 -0
- package/dist/src/installer/hook-installer.js +114 -0
- package/dist/src/installer/hook-installer.js.map +1 -0
- package/dist/src/installer/mcp-installer.d.ts +9 -0
- package/dist/src/installer/mcp-installer.js +80 -0
- package/dist/src/installer/mcp-installer.js.map +1 -0
- package/dist/src/installer/skill-installer.d.ts +5 -0
- package/dist/src/installer/skill-installer.js +55 -0
- package/dist/src/installer/skill-installer.js.map +1 -0
- package/dist/src/installer/skill-sync.d.ts +10 -0
- package/dist/src/installer/skill-sync.js +76 -0
- package/dist/src/installer/skill-sync.js.map +1 -0
- package/dist/src/mcp/server.d.ts +3 -0
- package/dist/src/mcp/server.js +106 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/subscription-gate.d.ts +19 -0
- package/dist/src/mcp/subscription-gate.js +74 -0
- package/dist/src/mcp/subscription-gate.js.map +1 -0
- package/dist/src/mcp/tools/ai-profile.d.ts +88 -0
- package/dist/src/mcp/tools/ai-profile.js +123 -0
- package/dist/src/mcp/tools/ai-profile.js.map +1 -0
- package/dist/src/mcp/tools/classify-session.d.ts +31 -0
- package/dist/src/mcp/tools/classify-session.js +34 -0
- package/dist/src/mcp/tools/classify-session.js.map +1 -0
- package/dist/src/mcp/tools/get-knowledge.d.ts +25 -0
- package/dist/src/mcp/tools/get-knowledge.js +31 -0
- package/dist/src/mcp/tools/get-knowledge.js.map +1 -0
- package/dist/src/mcp/tools/get-profile.d.ts +1 -0
- package/dist/src/mcp/tools/get-profile.js +77 -0
- package/dist/src/mcp/tools/get-profile.js.map +1 -0
- package/dist/src/mcp/tools/get-stats.d.ts +58 -0
- package/dist/src/mcp/tools/get-stats.js +135 -0
- package/dist/src/mcp/tools/get-stats.js.map +1 -0
- package/dist/src/mcp/tools/get-suggestions.d.ts +7 -0
- package/dist/src/mcp/tools/get-suggestions.js +176 -0
- package/dist/src/mcp/tools/get-suggestions.js.map +1 -0
- package/dist/src/mcp/tools/get-training.d.ts +48 -0
- package/dist/src/mcp/tools/get-training.js +102 -0
- package/dist/src/mcp/tools/get-training.js.map +1 -0
- package/dist/src/mcp/tools/log-highlight.d.ts +32 -0
- package/dist/src/mcp/tools/log-highlight.js +39 -0
- package/dist/src/mcp/tools/log-highlight.js.map +1 -0
- package/dist/src/mcp/tools/quest.d.ts +78 -0
- package/dist/src/mcp/tools/quest.js +72 -0
- package/dist/src/mcp/tools/quest.js.map +1 -0
- package/dist/src/mcp/tools/web-search.d.ts +15 -0
- package/dist/src/mcp/tools/web-search.js +17 -0
- package/dist/src/mcp/tools/web-search.js.map +1 -0
- package/dist/src/readers/history-reader.d.ts +28 -0
- package/dist/src/readers/history-reader.js +83 -0
- package/dist/src/readers/history-reader.js.map +1 -0
- package/dist/src/readers/session-reader.d.ts +89 -0
- package/dist/src/readers/session-reader.js +310 -0
- package/dist/src/readers/session-reader.js.map +1 -0
- package/dist/src/readers/stats-reader.d.ts +38 -0
- package/dist/src/readers/stats-reader.js +125 -0
- package/dist/src/readers/stats-reader.js.map +1 -0
- package/dist/src/store/local-store.d.ts +72 -0
- package/dist/src/store/local-store.js +145 -0
- package/dist/src/store/local-store.js.map +1 -0
- package/dist/src/store/quest-store.d.ts +77 -0
- package/dist/src/store/quest-store.js +309 -0
- package/dist/src/store/quest-store.js.map +1 -0
- package/dist/src/store/status-store.d.ts +73 -0
- package/dist/src/store/status-store.js +372 -0
- package/dist/src/store/status-store.js.map +1 -0
- package/dist/src/suggestions/rules.d.ts +1 -0
- package/dist/src/suggestions/rules.js +2 -0
- package/dist/src/suggestions/rules.js.map +1 -0
- package/dist/src/suggestions/video-links.d.ts +1 -0
- package/dist/src/suggestions/video-links.js +2 -0
- package/dist/src/suggestions/video-links.js.map +1 -0
- package/package.json +35 -0
- package/skills/he-coach/SKILL.md +56 -0
- package/skills/he-consult/SKILL.md +43 -0
- package/skills/he-enhance-claude-md/SKILL.md +58 -0
- package/skills/he-flex-socials/SKILL.md +50 -0
- package/skills/he-full-audit/SKILL.md +119 -0
- package/skills/he-improve-skill/SKILL.md +111 -0
- package/skills/he-interview/SKILL.md +54 -0
- package/skills/he-life-story/SKILL.md +64 -0
- package/skills/he-log-experience/SKILL.md +68 -0
- package/skills/he-open-dashboard/SKILL.md +27 -0
- package/skills/he-quest-status/SKILL.md +48 -0
- package/skills/he-recap-week/SKILL.md +49 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ActivityType } from "../classifiers/activity-classifier.js";
|
|
2
|
+
export interface AuthData {
|
|
3
|
+
email: string;
|
|
4
|
+
username: string;
|
|
5
|
+
token: string;
|
|
6
|
+
profile_url: string;
|
|
7
|
+
created_at: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ProfileData {
|
|
10
|
+
path: string;
|
|
11
|
+
path_scores: Record<string, number>;
|
|
12
|
+
streak_current: number;
|
|
13
|
+
streak_best: number;
|
|
14
|
+
total_sessions: number;
|
|
15
|
+
total_tokens: number;
|
|
16
|
+
active_since: string;
|
|
17
|
+
last_session: string;
|
|
18
|
+
workspace?: WorkspaceData;
|
|
19
|
+
onboarding?: {
|
|
20
|
+
use_case: string;
|
|
21
|
+
experience: string;
|
|
22
|
+
goal: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface WorkspaceData {
|
|
26
|
+
mcp_servers: Record<string, number>;
|
|
27
|
+
skills: Record<string, number>;
|
|
28
|
+
apps: Record<string, number>;
|
|
29
|
+
editors: Record<string, number>;
|
|
30
|
+
tech_stack: Record<string, number>;
|
|
31
|
+
}
|
|
32
|
+
export interface SessionEntry {
|
|
33
|
+
id: string;
|
|
34
|
+
timestamp: string;
|
|
35
|
+
project: string;
|
|
36
|
+
activity_type: ActivityType;
|
|
37
|
+
tokens: number;
|
|
38
|
+
duration_minutes: number;
|
|
39
|
+
prompts: number;
|
|
40
|
+
files_touched: string[];
|
|
41
|
+
summary: string;
|
|
42
|
+
mcp_servers_used: string[];
|
|
43
|
+
mcp_tool_counts: Record<string, number>;
|
|
44
|
+
skills_invoked: string[];
|
|
45
|
+
tool_counts: Record<string, number>;
|
|
46
|
+
}
|
|
47
|
+
export interface HighlightEntry {
|
|
48
|
+
id: string;
|
|
49
|
+
session_id: string;
|
|
50
|
+
title: string;
|
|
51
|
+
description: string;
|
|
52
|
+
activity_type: ActivityType;
|
|
53
|
+
tech_stack: string[];
|
|
54
|
+
created_at: string;
|
|
55
|
+
}
|
|
56
|
+
export declare function ensureDir(): void;
|
|
57
|
+
export declare function getMyPlayerDir(): string;
|
|
58
|
+
export declare function readAuth(): AuthData | null;
|
|
59
|
+
export declare function writeAuth(auth: AuthData): void;
|
|
60
|
+
export declare function readProfile(): ProfileData | null;
|
|
61
|
+
export declare function writeProfile(profile: ProfileData): void;
|
|
62
|
+
export declare function updateProfile(updates: Partial<ProfileData>): ProfileData;
|
|
63
|
+
export declare function readSessions(): SessionEntry[];
|
|
64
|
+
export declare function appendSession(entry: Omit<SessionEntry, "id">): SessionEntry;
|
|
65
|
+
export declare function writeSessions(entries: SessionEntry[]): void;
|
|
66
|
+
/**
|
|
67
|
+
* Check if a session has already been logged (by timestamp + project combo).
|
|
68
|
+
*/
|
|
69
|
+
export declare function isSessionLogged(timestamp: string, project: string): boolean;
|
|
70
|
+
export declare function readHighlights(): HighlightEntry[];
|
|
71
|
+
export declare function appendHighlight(entry: Omit<HighlightEntry, "id" | "created_at">): HighlightEntry;
|
|
72
|
+
export declare function logError(error: unknown): void;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, appendFileSync, mkdirSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { v4 as uuidv4 } from "uuid";
|
|
5
|
+
const MYPLAYER_DIR = join(homedir(), ".myplayer");
|
|
6
|
+
const AUTH_PATH = join(MYPLAYER_DIR, "auth.json");
|
|
7
|
+
const PROFILE_PATH = join(MYPLAYER_DIR, "profile.json");
|
|
8
|
+
const SESSIONS_PATH = join(MYPLAYER_DIR, "sessions.jsonl");
|
|
9
|
+
const HIGHLIGHTS_PATH = join(MYPLAYER_DIR, "highlights.jsonl");
|
|
10
|
+
const ERRORS_PATH = join(MYPLAYER_DIR, "errors.log");
|
|
11
|
+
// --- Directory ---
|
|
12
|
+
export function ensureDir() {
|
|
13
|
+
if (!existsSync(MYPLAYER_DIR)) {
|
|
14
|
+
mkdirSync(MYPLAYER_DIR, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function getMyPlayerDir() {
|
|
18
|
+
return MYPLAYER_DIR;
|
|
19
|
+
}
|
|
20
|
+
// --- Auth ---
|
|
21
|
+
export function readAuth() {
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(readFileSync(AUTH_PATH, "utf-8"));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function writeAuth(auth) {
|
|
30
|
+
ensureDir();
|
|
31
|
+
writeFileSync(AUTH_PATH, JSON.stringify(auth, null, 2) + "\n");
|
|
32
|
+
}
|
|
33
|
+
// --- Profile ---
|
|
34
|
+
export function readProfile() {
|
|
35
|
+
try {
|
|
36
|
+
return JSON.parse(readFileSync(PROFILE_PATH, "utf-8"));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function writeProfile(profile) {
|
|
43
|
+
ensureDir();
|
|
44
|
+
writeFileSync(PROFILE_PATH, JSON.stringify(profile, null, 2) + "\n");
|
|
45
|
+
}
|
|
46
|
+
export function updateProfile(updates) {
|
|
47
|
+
const current = readProfile() || {
|
|
48
|
+
path: "unknown",
|
|
49
|
+
path_scores: {},
|
|
50
|
+
streak_current: 0,
|
|
51
|
+
streak_best: 0,
|
|
52
|
+
total_sessions: 0,
|
|
53
|
+
total_tokens: 0,
|
|
54
|
+
active_since: new Date().toISOString(),
|
|
55
|
+
last_session: new Date().toISOString(),
|
|
56
|
+
};
|
|
57
|
+
const updated = { ...current, ...updates };
|
|
58
|
+
writeProfile(updated);
|
|
59
|
+
return updated;
|
|
60
|
+
}
|
|
61
|
+
// --- Sessions ---
|
|
62
|
+
export function readSessions() {
|
|
63
|
+
try {
|
|
64
|
+
const raw = readFileSync(SESSIONS_PATH, "utf-8");
|
|
65
|
+
const entries = [];
|
|
66
|
+
for (const line of raw.split("\n")) {
|
|
67
|
+
const trimmed = line.trim();
|
|
68
|
+
if (!trimmed)
|
|
69
|
+
continue;
|
|
70
|
+
try {
|
|
71
|
+
entries.push(JSON.parse(trimmed));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// skip
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return entries;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function appendSession(entry) {
|
|
84
|
+
ensureDir();
|
|
85
|
+
const full = { id: uuidv4(), ...entry };
|
|
86
|
+
appendFileSync(SESSIONS_PATH, JSON.stringify(full) + "\n");
|
|
87
|
+
return full;
|
|
88
|
+
}
|
|
89
|
+
export function writeSessions(entries) {
|
|
90
|
+
ensureDir();
|
|
91
|
+
const content = entries.map((e) => JSON.stringify(e)).join("\n") + "\n";
|
|
92
|
+
writeFileSync(SESSIONS_PATH, content);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if a session has already been logged (by timestamp + project combo).
|
|
96
|
+
*/
|
|
97
|
+
export function isSessionLogged(timestamp, project) {
|
|
98
|
+
const sessions = readSessions();
|
|
99
|
+
return sessions.some((s) => s.timestamp === timestamp && s.project === project);
|
|
100
|
+
}
|
|
101
|
+
// --- Highlights ---
|
|
102
|
+
export function readHighlights() {
|
|
103
|
+
try {
|
|
104
|
+
const raw = readFileSync(HIGHLIGHTS_PATH, "utf-8");
|
|
105
|
+
const entries = [];
|
|
106
|
+
for (const line of raw.split("\n")) {
|
|
107
|
+
const trimmed = line.trim();
|
|
108
|
+
if (!trimmed)
|
|
109
|
+
continue;
|
|
110
|
+
try {
|
|
111
|
+
entries.push(JSON.parse(trimmed));
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// skip
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return entries;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function appendHighlight(entry) {
|
|
124
|
+
ensureDir();
|
|
125
|
+
const full = {
|
|
126
|
+
id: uuidv4(),
|
|
127
|
+
created_at: new Date().toISOString(),
|
|
128
|
+
...entry,
|
|
129
|
+
};
|
|
130
|
+
appendFileSync(HIGHLIGHTS_PATH, JSON.stringify(full) + "\n");
|
|
131
|
+
return full;
|
|
132
|
+
}
|
|
133
|
+
// --- Error logging ---
|
|
134
|
+
export function logError(error) {
|
|
135
|
+
try {
|
|
136
|
+
ensureDir();
|
|
137
|
+
const timestamp = new Date().toISOString();
|
|
138
|
+
const message = error instanceof Error ? error.stack || error.message : String(error);
|
|
139
|
+
appendFileSync(ERRORS_PATH, `[${timestamp}] ${message}\n`);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Silently fail — we can't even log errors
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=local-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-store.js","sourceRoot":"","sources":["../../../src/store/local-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export type QuestStatus = "locked" | "active" | "completed" | "coming_soon";
|
|
2
|
+
export type QuestPath = "core" | "builder" | "storyteller" | "systems-thinker";
|
|
3
|
+
export interface Quest {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
description: string;
|
|
7
|
+
prompt: string;
|
|
8
|
+
path: QuestPath;
|
|
9
|
+
order: number;
|
|
10
|
+
status: QuestStatus;
|
|
11
|
+
completed_at?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface QuestState {
|
|
14
|
+
quests: Record<string, {
|
|
15
|
+
status: QuestStatus;
|
|
16
|
+
completed_at?: string;
|
|
17
|
+
}>;
|
|
18
|
+
detected_path?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface AppState {
|
|
21
|
+
skill_first_runs: Record<string, boolean>;
|
|
22
|
+
quests_initialized: boolean;
|
|
23
|
+
environment?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const QUEST_DEFINITIONS: Omit<Quest, "status" | "completed_at">[];
|
|
26
|
+
export declare const COMING_SOON_QUESTS: {
|
|
27
|
+
id: string;
|
|
28
|
+
title: string;
|
|
29
|
+
path: QuestPath;
|
|
30
|
+
description: string;
|
|
31
|
+
}[];
|
|
32
|
+
export declare function readQuests(): QuestState;
|
|
33
|
+
export declare function writeQuests(state: QuestState): void;
|
|
34
|
+
export declare function initializeQuests(): void;
|
|
35
|
+
export declare function completeQuest(questId: string): Quest | null;
|
|
36
|
+
export declare function getActiveQuest(): Quest | null;
|
|
37
|
+
export declare function getQuestProgress(): {
|
|
38
|
+
completed: number;
|
|
39
|
+
total: number;
|
|
40
|
+
allDone: boolean;
|
|
41
|
+
core: {
|
|
42
|
+
completed: number;
|
|
43
|
+
total: number;
|
|
44
|
+
};
|
|
45
|
+
builder: {
|
|
46
|
+
completed: number;
|
|
47
|
+
total: number;
|
|
48
|
+
};
|
|
49
|
+
storyteller: {
|
|
50
|
+
completed: number;
|
|
51
|
+
total: number;
|
|
52
|
+
};
|
|
53
|
+
systemsThinker: {
|
|
54
|
+
completed: number;
|
|
55
|
+
total: number;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
export declare function getQuestsForPath(path: QuestPath): Quest[];
|
|
59
|
+
/**
|
|
60
|
+
* Try to auto-complete a quest based on which skill just ran.
|
|
61
|
+
*/
|
|
62
|
+
export declare function tryAutoCompleteQuest(skillName: string): {
|
|
63
|
+
completed_quest: string;
|
|
64
|
+
next_quest: {
|
|
65
|
+
id: string;
|
|
66
|
+
title: string;
|
|
67
|
+
description: string;
|
|
68
|
+
prompt: string;
|
|
69
|
+
} | null;
|
|
70
|
+
message: string;
|
|
71
|
+
} | null;
|
|
72
|
+
export declare function readAppState(): AppState;
|
|
73
|
+
export declare function writeAppState(state: AppState): void;
|
|
74
|
+
export declare function isFirstSkillRun(skillName: string): boolean;
|
|
75
|
+
export declare function markSkillRun(skillName: string): void;
|
|
76
|
+
export declare function setEnvironment(env: string): void;
|
|
77
|
+
export declare function getEnvironment(): string;
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { ensureDir } from "./local-store.js";
|
|
5
|
+
import { skillCommand } from "../constants.js";
|
|
6
|
+
const QUEST_PATH = join(homedir(), ".myplayer", "quests.json");
|
|
7
|
+
const STATE_PATH = join(homedir(), ".myplayer", "state.json");
|
|
8
|
+
// --- Quest Definitions ---
|
|
9
|
+
export const QUEST_DEFINITIONS = [
|
|
10
|
+
// Core quests (everyone does these first)
|
|
11
|
+
{
|
|
12
|
+
id: "run-first-skill",
|
|
13
|
+
title: "Run Your First Skill",
|
|
14
|
+
description: `Type ${skillCommand("coach")} in Claude Code to get a personalized setup review.`,
|
|
15
|
+
prompt: skillCommand("coach"),
|
|
16
|
+
path: "core",
|
|
17
|
+
order: 1,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "build-training-data",
|
|
21
|
+
title: "Build Your Training Data",
|
|
22
|
+
description: `Type ${skillCommand("interview")} in Claude Code to teach BuildPartner how you work.`,
|
|
23
|
+
prompt: skillCommand("interview"),
|
|
24
|
+
path: "core",
|
|
25
|
+
order: 2,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "plan-before-build",
|
|
29
|
+
title: "Plan Before You Build",
|
|
30
|
+
description: 'Start a session with: "Before we start, interview me about what we\'re making."',
|
|
31
|
+
prompt: "Before we start, interview me about what we're making.",
|
|
32
|
+
path: "core",
|
|
33
|
+
order: 3,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: "consult-an-expert",
|
|
37
|
+
title: "Consult an Expert",
|
|
38
|
+
description: `Type ${skillCommand("consult")} and ask any question. Get matched to the right expert framework.`,
|
|
39
|
+
prompt: skillCommand("consult"),
|
|
40
|
+
path: "core",
|
|
41
|
+
order: 4,
|
|
42
|
+
},
|
|
43
|
+
// Builder path (code-heavy users)
|
|
44
|
+
{
|
|
45
|
+
id: "builder-create-skill",
|
|
46
|
+
title: "Create a Custom Skill",
|
|
47
|
+
description: 'Tell Claude: "Create a skill called daily-log that asks what I worked on today."',
|
|
48
|
+
prompt: 'Create a skill called daily-log that asks what I worked on today and saves it to knowledge/daily-logs/ with today\'s date.',
|
|
49
|
+
path: "builder",
|
|
50
|
+
order: 1,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "builder-parallel-sessions",
|
|
54
|
+
title: "Run Parallel Sessions",
|
|
55
|
+
description: "Open 2 Claude Code sessions at once. One builds, one tests. 2x output.",
|
|
56
|
+
prompt: "Open a second terminal and start a Claude Code session for tests while this one builds.",
|
|
57
|
+
path: "builder",
|
|
58
|
+
order: 2,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: "builder-improve-skill",
|
|
62
|
+
title: "Improve a Skill",
|
|
63
|
+
description: 'Tell Claude: "Make this skill better based on how I\'ve been using it."',
|
|
64
|
+
prompt: "Review my /daily-log skill and improve it based on how I've been using it.",
|
|
65
|
+
path: "builder",
|
|
66
|
+
order: 3,
|
|
67
|
+
},
|
|
68
|
+
// Storyteller path (content-heavy users)
|
|
69
|
+
{
|
|
70
|
+
id: "storyteller-life-story",
|
|
71
|
+
title: "Tell Your Life Story",
|
|
72
|
+
description: `Run ${skillCommand("life-story")}. The deeper your context, the better every skill works for you.`,
|
|
73
|
+
prompt: skillCommand("life-story"),
|
|
74
|
+
path: "storyteller",
|
|
75
|
+
order: 1,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "storyteller-content-consult",
|
|
79
|
+
title: "Get Content Feedback",
|
|
80
|
+
description: `Run ${skillCommand("consult")} with a title, hook, or script. Get expert packaging frameworks applied to YOUR content.`,
|
|
81
|
+
prompt: `${skillCommand("consult")} How do I package my content so people actually click?`,
|
|
82
|
+
path: "storyteller",
|
|
83
|
+
order: 2,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "storyteller-weekly-recap",
|
|
87
|
+
title: "Review Your Week",
|
|
88
|
+
description: `Run ${skillCommand("recap-week")} to see what you created and what to add to your playbook.`,
|
|
89
|
+
prompt: skillCommand("recap-week"),
|
|
90
|
+
path: "storyteller",
|
|
91
|
+
order: 3,
|
|
92
|
+
},
|
|
93
|
+
// Systems Thinker path (automation-heavy users)
|
|
94
|
+
{
|
|
95
|
+
id: "systems-coach-review",
|
|
96
|
+
title: "Get a Setup Review",
|
|
97
|
+
description: `Run ${skillCommand("coach")} to analyze your MCP servers, tools, and workflows.`,
|
|
98
|
+
prompt: skillCommand("coach"),
|
|
99
|
+
path: "systems-thinker",
|
|
100
|
+
order: 1,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: "systems-launch-strategy",
|
|
104
|
+
title: "Plan a Launch",
|
|
105
|
+
description: `Run ${skillCommand("consult")} with your product idea. Get viral launch frameworks applied to your project.`,
|
|
106
|
+
prompt: `${skillCommand("consult")} How do I launch this product to get maximum traction?`,
|
|
107
|
+
path: "systems-thinker",
|
|
108
|
+
order: 2,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: "systems-automate-workflow",
|
|
112
|
+
title: "Automate a Workflow",
|
|
113
|
+
description: "Ask Claude to create a hook or skill that automates something you do manually.",
|
|
114
|
+
prompt: "Help me automate something I do manually. What repetitive task from my recent sessions could be a hook or skill?",
|
|
115
|
+
path: "systems-thinker",
|
|
116
|
+
order: 3,
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
// Coming soon teasers (not playable yet)
|
|
120
|
+
export const COMING_SOON_QUESTS = [
|
|
121
|
+
{ id: "builder-deploy", title: "Ship to Production", path: "builder", description: "Deploy something you built. Coming soon." },
|
|
122
|
+
{ id: "builder-mcp-server", title: "Build an MCP Server", path: "builder", description: "Create your own MCP server for Claude Code. Coming soon." },
|
|
123
|
+
{ id: "storyteller-brand-voice", title: "Define Your Brand Voice", path: "storyteller", description: "Create a brand voice document Claude follows. Coming soon." },
|
|
124
|
+
{ id: "storyteller-repurpose", title: "Repurpose Content", path: "storyteller", description: "Turn one piece of content into 5 formats. Coming soon." },
|
|
125
|
+
{ id: "systems-schedule-agent", title: "Schedule an Agent", path: "systems-thinker", description: "Set up a Claude agent that runs on a schedule. Coming soon." },
|
|
126
|
+
{ id: "systems-build-pipeline", title: "Build a Pipeline", path: "systems-thinker", description: "Connect 3+ tools into an automated pipeline. Coming soon." },
|
|
127
|
+
];
|
|
128
|
+
// Skill-to-quest auto-completion mapping (a skill can complete multiple quests)
|
|
129
|
+
const SKILL_QUEST_MAP = {
|
|
130
|
+
"he-coach": ["run-first-skill", "systems-coach-review"],
|
|
131
|
+
"he-flex-socials": ["run-first-skill"],
|
|
132
|
+
"he-recap-week": ["run-first-skill", "storyteller-weekly-recap"],
|
|
133
|
+
"he-interview": ["build-training-data"],
|
|
134
|
+
"he-life-story": ["build-training-data", "storyteller-life-story"],
|
|
135
|
+
"he-consult": ["consult-an-expert", "storyteller-content-consult", "systems-launch-strategy"],
|
|
136
|
+
"he-enhance-claude-md": ["run-first-skill"],
|
|
137
|
+
"he-log-experience": ["build-training-data"],
|
|
138
|
+
"he-full-audit": ["run-first-skill", "systems-coach-review"],
|
|
139
|
+
"he-improve-skill": ["builder-improve-skill"],
|
|
140
|
+
};
|
|
141
|
+
// --- Quest State ---
|
|
142
|
+
export function readQuests() {
|
|
143
|
+
try {
|
|
144
|
+
return JSON.parse(readFileSync(QUEST_PATH, "utf-8"));
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return { quests: {} };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export function writeQuests(state) {
|
|
151
|
+
ensureDir();
|
|
152
|
+
writeFileSync(QUEST_PATH, JSON.stringify(state, null, 2) + "\n");
|
|
153
|
+
}
|
|
154
|
+
export function initializeQuests() {
|
|
155
|
+
const state = readQuests();
|
|
156
|
+
if (Object.keys(state.quests).length > 0)
|
|
157
|
+
return;
|
|
158
|
+
state.quests = {};
|
|
159
|
+
const coreQuests = QUEST_DEFINITIONS.filter((q) => q.path === "core");
|
|
160
|
+
const pathQuests = QUEST_DEFINITIONS.filter((q) => q.path !== "core");
|
|
161
|
+
// Core quests: first is active, rest locked
|
|
162
|
+
for (let i = 0; i < coreQuests.length; i++) {
|
|
163
|
+
state.quests[coreQuests[i].id] = { status: i === 0 ? "active" : "locked" };
|
|
164
|
+
}
|
|
165
|
+
// Path quests: all locked until core is done
|
|
166
|
+
for (const q of pathQuests) {
|
|
167
|
+
state.quests[q.id] = { status: "locked" };
|
|
168
|
+
}
|
|
169
|
+
writeQuests(state);
|
|
170
|
+
}
|
|
171
|
+
export function completeQuest(questId) {
|
|
172
|
+
const state = readQuests();
|
|
173
|
+
const questEntry = state.quests[questId];
|
|
174
|
+
if (!questEntry || questEntry.status === "completed")
|
|
175
|
+
return null;
|
|
176
|
+
questEntry.status = "completed";
|
|
177
|
+
questEntry.completed_at = new Date().toISOString();
|
|
178
|
+
const def = QUEST_DEFINITIONS.find((q) => q.id === questId);
|
|
179
|
+
if (!def)
|
|
180
|
+
return null;
|
|
181
|
+
// Unlock next quest in same path
|
|
182
|
+
const samePath = QUEST_DEFINITIONS.filter((q) => q.path === def.path);
|
|
183
|
+
const currentIndex = samePath.findIndex((q) => q.id === questId);
|
|
184
|
+
if (currentIndex >= 0 && currentIndex < samePath.length - 1) {
|
|
185
|
+
const nextId = samePath[currentIndex + 1].id;
|
|
186
|
+
if (state.quests[nextId]?.status === "locked") {
|
|
187
|
+
state.quests[nextId].status = "active";
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// If all core quests are done, unlock first quest of each path
|
|
191
|
+
const coreQuests = QUEST_DEFINITIONS.filter((q) => q.path === "core");
|
|
192
|
+
const allCoreDone = coreQuests.every((q) => state.quests[q.id]?.status === "completed");
|
|
193
|
+
if (allCoreDone) {
|
|
194
|
+
for (const path of ["builder", "storyteller", "systems-thinker"]) {
|
|
195
|
+
const firstInPath = QUEST_DEFINITIONS.find((q) => q.path === path && q.order === 1);
|
|
196
|
+
if (firstInPath && state.quests[firstInPath.id]?.status === "locked") {
|
|
197
|
+
state.quests[firstInPath.id].status = "active";
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
writeQuests(state);
|
|
202
|
+
return { ...def, status: "completed", completed_at: questEntry.completed_at };
|
|
203
|
+
}
|
|
204
|
+
export function getActiveQuest() {
|
|
205
|
+
const state = readQuests();
|
|
206
|
+
// Prioritize core quests first
|
|
207
|
+
for (const def of QUEST_DEFINITIONS.filter((q) => q.path === "core")) {
|
|
208
|
+
if (state.quests[def.id]?.status === "active") {
|
|
209
|
+
return { ...def, status: "active" };
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Then path quests
|
|
213
|
+
for (const def of QUEST_DEFINITIONS.filter((q) => q.path !== "core")) {
|
|
214
|
+
if (state.quests[def.id]?.status === "active") {
|
|
215
|
+
return { ...def, status: "active" };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
export function getQuestProgress() {
|
|
221
|
+
const state = readQuests();
|
|
222
|
+
const count = (path) => {
|
|
223
|
+
const quests = QUEST_DEFINITIONS.filter((q) => q.path === path);
|
|
224
|
+
const done = quests.filter((q) => state.quests[q.id]?.status === "completed").length;
|
|
225
|
+
return { completed: done, total: quests.length };
|
|
226
|
+
};
|
|
227
|
+
const core = count("core");
|
|
228
|
+
const builder = count("builder");
|
|
229
|
+
const storyteller = count("storyteller");
|
|
230
|
+
const systemsThinker = count("systems-thinker");
|
|
231
|
+
const total = QUEST_DEFINITIONS.length;
|
|
232
|
+
const completed = core.completed + builder.completed + storyteller.completed + systemsThinker.completed;
|
|
233
|
+
return { completed, total, allDone: completed === total, core, builder, storyteller, systemsThinker };
|
|
234
|
+
}
|
|
235
|
+
export function getQuestsForPath(path) {
|
|
236
|
+
const state = readQuests();
|
|
237
|
+
return QUEST_DEFINITIONS
|
|
238
|
+
.filter((q) => q.path === path)
|
|
239
|
+
.map((def) => ({
|
|
240
|
+
...def,
|
|
241
|
+
status: state.quests[def.id]?.status || "locked",
|
|
242
|
+
completed_at: state.quests[def.id]?.completed_at,
|
|
243
|
+
}));
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Try to auto-complete a quest based on which skill just ran.
|
|
247
|
+
*/
|
|
248
|
+
export function tryAutoCompleteQuest(skillName) {
|
|
249
|
+
const questIds = SKILL_QUEST_MAP[skillName];
|
|
250
|
+
if (!questIds)
|
|
251
|
+
return null;
|
|
252
|
+
const state = readQuests();
|
|
253
|
+
// Try to complete the first active quest that matches
|
|
254
|
+
for (const questId of questIds) {
|
|
255
|
+
const entry = state.quests[questId];
|
|
256
|
+
if (!entry || entry.status !== "active")
|
|
257
|
+
continue;
|
|
258
|
+
const completed = completeQuest(questId);
|
|
259
|
+
if (!completed)
|
|
260
|
+
continue;
|
|
261
|
+
const next = getActiveQuest();
|
|
262
|
+
// Check if core just finished
|
|
263
|
+
const coreQuests = QUEST_DEFINITIONS.filter((q) => q.path === "core");
|
|
264
|
+
const allCoreDone = coreQuests.every((q) => readQuests().quests[q.id]?.status === "completed");
|
|
265
|
+
const pathsJustUnlocked = completed.path === "core" && allCoreDone;
|
|
266
|
+
return {
|
|
267
|
+
completed_quest: completed.title,
|
|
268
|
+
next_quest: next ? { id: next.id, title: next.title, description: next.description, prompt: next.prompt } : null,
|
|
269
|
+
message: pathsJustUnlocked
|
|
270
|
+
? `Quest complete: "${completed.title}"! Core quests done. You've unlocked 3 paths: Builder, Storyteller, Systems Thinker. Type /quest to pick your path.`
|
|
271
|
+
: next
|
|
272
|
+
? `Quest complete: "${completed.title}"! Next: "${next.title}" - ${next.description}`
|
|
273
|
+
: `Quest complete: "${completed.title}"! All quests done. You're a BuildPartner expert.`,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
// --- App State ---
|
|
279
|
+
export function readAppState() {
|
|
280
|
+
try {
|
|
281
|
+
return JSON.parse(readFileSync(STATE_PATH, "utf-8"));
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return { skill_first_runs: {}, quests_initialized: false };
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
export function writeAppState(state) {
|
|
288
|
+
ensureDir();
|
|
289
|
+
writeFileSync(STATE_PATH, JSON.stringify(state, null, 2) + "\n");
|
|
290
|
+
}
|
|
291
|
+
export function isFirstSkillRun(skillName) {
|
|
292
|
+
const state = readAppState();
|
|
293
|
+
return !state.skill_first_runs[skillName];
|
|
294
|
+
}
|
|
295
|
+
export function markSkillRun(skillName) {
|
|
296
|
+
const state = readAppState();
|
|
297
|
+
state.skill_first_runs[skillName] = true;
|
|
298
|
+
writeAppState(state);
|
|
299
|
+
}
|
|
300
|
+
export function setEnvironment(env) {
|
|
301
|
+
const state = readAppState();
|
|
302
|
+
state.environment = env;
|
|
303
|
+
writeAppState(state);
|
|
304
|
+
}
|
|
305
|
+
export function getEnvironment() {
|
|
306
|
+
const state = readAppState();
|
|
307
|
+
return state.environment || "terminal";
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=quest-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quest-store.js","sourceRoot":"","sources":["../../../src/store/quest-store.ts"],"names":[],"mappings":"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"}
|