buildpartner 0.14.0 → 0.15.1
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 +0 -0
- package/dist/src/mcp/build-pad.d.ts +42 -0
- package/dist/src/mcp/build-pad.js +416 -0
- package/dist/src/mcp/build-pad.js.map +1 -0
- package/dist/src/mcp/server.d.ts +2 -0
- package/dist/src/mcp/server.js +111 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/package.json +2 -2
- package/dist/src/commands/reset.d.ts +0 -1
- package/dist/src/commands/reset.js +0 -130
- package/dist/src/commands/reset.js.map +0 -1
- package/dist/src/commands/setup.d.ts +0 -1
- package/dist/src/commands/setup.js +0 -358
- package/dist/src/commands/setup.js.map +0 -1
- package/dist/src/constants.d.ts +0 -9
- package/dist/src/constants.js +0 -12
- package/dist/src/constants.js.map +0 -1
- package/dist/src/mcp/subscription-gate.d.ts +0 -19
- package/dist/src/mcp/subscription-gate.js +0 -69
- package/dist/src/mcp/subscription-gate.js.map +0 -1
- package/dist/src/store/quest-store.d.ts +0 -14
- package/dist/src/store/quest-store.js +0 -41
- package/dist/src/store/quest-store.js.map +0 -1
- package/dist/src/store/status-store.d.ts +0 -10
- package/dist/src/store/status-store.js +0 -99
- package/dist/src/store/status-store.js.map +0 -1
- package/dist/src/suggestions/rules.d.ts +0 -1
- package/dist/src/suggestions/rules.js +0 -2
- package/dist/src/suggestions/rules.js.map +0 -1
- package/dist/src/suggestions/video-links.d.ts +0 -1
- package/dist/src/suggestions/video-links.js +0 -2
- package/dist/src/suggestions/video-links.js.map +0 -1
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
import { existsSync } from "fs";
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
import { homedir, platform } from "os";
|
|
4
|
-
import { execSync, spawn } from "child_process";
|
|
5
|
-
import chalk from "chalk";
|
|
6
|
-
import ora from "ora";
|
|
7
|
-
import { input } from "@inquirer/prompts";
|
|
8
|
-
import { scanAllSessions } from "../readers/session-sync.js";
|
|
9
|
-
import { writeAuth, readAuth, } from "../store/local-store.js";
|
|
10
|
-
import { installMcp } from "../installer/mcp-installer.js";
|
|
11
|
-
import { installSkills } from "../installer/skill-installer.js";
|
|
12
|
-
import { installHook, installPermissions } from "../installer/hook-installer.js";
|
|
13
|
-
import { API_BASE } from "../api-client.js";
|
|
14
|
-
import { skillCommand } from "../constants.js";
|
|
15
|
-
const CLAUDE_DIR = join(homedir(), ".claude");
|
|
16
|
-
const orange = chalk.hex("#E47025");
|
|
17
|
-
const isInteractive = process.stdin.isTTY === true;
|
|
18
|
-
function detectEnvironment() {
|
|
19
|
-
// Check for VS Code
|
|
20
|
-
if (process.env.TERM_PROGRAM === "vscode" || process.env.VSCODE_PID)
|
|
21
|
-
return "vscode";
|
|
22
|
-
// Check for Claude Desktop/Cowork (non-TTY with Claude-specific env)
|
|
23
|
-
if (!process.stdin.isTTY && (process.env.CLAUDE_CODE || process.env.CLAUDE_DESKTOP))
|
|
24
|
-
return "cowork";
|
|
25
|
-
// Non-interactive but no specific env detected
|
|
26
|
-
if (!process.stdin.isTTY)
|
|
27
|
-
return "desktop";
|
|
28
|
-
// Standard terminal
|
|
29
|
-
return "terminal";
|
|
30
|
-
}
|
|
31
|
-
export async function setup() {
|
|
32
|
-
const token = getTokenArg();
|
|
33
|
-
// Header (only show if not coming from install.sh, which prints its own)
|
|
34
|
-
const fromInstallScript = process.env.BUILDPARTNER_INSTALL === "1";
|
|
35
|
-
if (!fromInstallScript) {
|
|
36
|
-
console.log();
|
|
37
|
-
console.log(orange(" ╭─────────────────────────────────────────╮\n" +
|
|
38
|
-
" │ BuildPartner - Your AI Build Partner │\n" +
|
|
39
|
-
" ╰─────────────────────────────────────────╯"));
|
|
40
|
-
}
|
|
41
|
-
console.log();
|
|
42
|
-
// Check Claude Code
|
|
43
|
-
if (!existsSync(CLAUDE_DIR)) {
|
|
44
|
-
console.log(chalk.red(" ✗ Claude Code not found (~/.claude/ missing)"));
|
|
45
|
-
console.log(" Install Claude Code first: https://claude.ai/code");
|
|
46
|
-
process.exit(1);
|
|
47
|
-
}
|
|
48
|
-
console.log();
|
|
49
|
-
// Step 1: Create or verify account
|
|
50
|
-
let email;
|
|
51
|
-
let username;
|
|
52
|
-
let authToken = `sk_${generateId()}`;
|
|
53
|
-
let serverLinked = false;
|
|
54
|
-
// Check for existing account first
|
|
55
|
-
const existingAuth = readAuth();
|
|
56
|
-
if (existingAuth?.token && existingAuth?.email) {
|
|
57
|
-
let verified = false;
|
|
58
|
-
try {
|
|
59
|
-
const verifyRes = await fetch(`${API_BASE}/api/buildpartner/verify-token`, {
|
|
60
|
-
headers: { Authorization: `Bearer ${existingAuth.token}` },
|
|
61
|
-
signal: AbortSignal.timeout(5000),
|
|
62
|
-
});
|
|
63
|
-
verified = verifyRes.ok;
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
// Verification failed, fall through to signup
|
|
67
|
-
}
|
|
68
|
-
if (verified) {
|
|
69
|
-
console.log(chalk.bold(" [1/3] Account"));
|
|
70
|
-
console.log();
|
|
71
|
-
console.log(chalk.green(` ✓ Logged in as ${existingAuth.email}`));
|
|
72
|
-
console.log();
|
|
73
|
-
email = existingAuth.email;
|
|
74
|
-
username = existingAuth.username;
|
|
75
|
-
authToken = existingAuth.token;
|
|
76
|
-
serverLinked = true;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
// Token invalid, proceed with fresh signup
|
|
80
|
-
const account = await createAccount(token, authToken);
|
|
81
|
-
email = account.email;
|
|
82
|
-
username = account.username;
|
|
83
|
-
authToken = account.authToken;
|
|
84
|
-
serverLinked = account.serverLinked;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
// No existing auth, fresh signup
|
|
89
|
-
const account = await createAccount(token, authToken);
|
|
90
|
-
email = account.email;
|
|
91
|
-
username = account.username;
|
|
92
|
-
authToken = account.authToken;
|
|
93
|
-
serverLinked = account.serverLinked;
|
|
94
|
-
}
|
|
95
|
-
writeAuth({
|
|
96
|
-
email,
|
|
97
|
-
username,
|
|
98
|
-
token: authToken,
|
|
99
|
-
profile_url: `buildpartner.ai/${username}`,
|
|
100
|
-
created_at: existingAuth?.created_at || new Date().toISOString(),
|
|
101
|
-
});
|
|
102
|
-
// Step 2: Set up tools
|
|
103
|
-
console.log(chalk.bold(" [2/3] Setting up your tools..."));
|
|
104
|
-
const mcpResult = installMcp();
|
|
105
|
-
if (mcpResult.alreadyExists) {
|
|
106
|
-
console.log(chalk.green(" ✓ MCP server (already configured)"));
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
console.log(chalk.green(" ✓ MCP server"));
|
|
110
|
-
}
|
|
111
|
-
const installedSkills = installSkills();
|
|
112
|
-
const skillCount = installedSkills.length;
|
|
113
|
-
if (skillCount > 0) {
|
|
114
|
-
// Highlight key skills
|
|
115
|
-
const hasClaudeCoach = installedSkills.includes("bp-claude-coach");
|
|
116
|
-
const hasExpertAdvice = installedSkills.includes("bp-expert-advice");
|
|
117
|
-
if (hasClaudeCoach)
|
|
118
|
-
console.log(chalk.green(` ✓ ${skillCommand("claude-coach")} (review your Claude Code setup)`));
|
|
119
|
-
if (hasExpertAdvice)
|
|
120
|
-
console.log(chalk.green(` ✓ ${skillCommand("expert-advice")} (expert advice on any topic)`));
|
|
121
|
-
console.log(chalk.green(` ✓ ${skillCount} skills total`));
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
console.log(chalk.yellow(" ! Skills not found (will work after npm publish)"));
|
|
125
|
-
}
|
|
126
|
-
const hookResult = installHook();
|
|
127
|
-
if (hookResult.alreadyExists) {
|
|
128
|
-
console.log(chalk.green(" ✓ Auto-tracking (already configured)"));
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
console.log(chalk.green(" ✓ Auto-tracking"));
|
|
132
|
-
}
|
|
133
|
-
const permResult = installPermissions();
|
|
134
|
-
if (permResult.alreadyExists) {
|
|
135
|
-
console.log(chalk.green(" ✓ MCP permissions (already configured)"));
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
console.log(chalk.green(" ✓ MCP permissions (auto-approved)"));
|
|
139
|
-
}
|
|
140
|
-
console.log();
|
|
141
|
-
// Step 3: Scan history
|
|
142
|
-
console.log(chalk.bold(" [3/3] Scanning your history..."));
|
|
143
|
-
const spinner = ora(" Scanning sessions...").start();
|
|
144
|
-
const sessionEntries = scanAllSessions();
|
|
145
|
-
spinner.succeed(` ${sessionEntries.length} sessions found`);
|
|
146
|
-
// Background sync
|
|
147
|
-
if (serverLinked) {
|
|
148
|
-
const child = spawn("npx", ["buildpartner", "sync"], {
|
|
149
|
-
detached: true,
|
|
150
|
-
stdio: "ignore",
|
|
151
|
-
});
|
|
152
|
-
child.unref();
|
|
153
|
-
console.log(chalk.dim(` Syncing ${sessionEntries.length} sessions in background...`));
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
console.log(chalk.dim(" Sessions will sync on next launch."));
|
|
157
|
-
}
|
|
158
|
-
console.log();
|
|
159
|
-
// Auto-open dashboard
|
|
160
|
-
const dashUrl = serverLinked ? `https://buildpartner.ai/dashboard?t=${authToken}` : null;
|
|
161
|
-
if (dashUrl) {
|
|
162
|
-
const opened = openUrl(dashUrl);
|
|
163
|
-
if (opened) {
|
|
164
|
-
console.log(chalk.green(" ✓ Opening your dashboard..."));
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
console.log(chalk.bold(" Open your dashboard:"));
|
|
168
|
-
console.log(` ${orange(chalk.underline(dashUrl))}`);
|
|
169
|
-
}
|
|
170
|
-
console.log();
|
|
171
|
-
}
|
|
172
|
-
// Single CTA
|
|
173
|
-
const env = detectEnvironment();
|
|
174
|
-
const coachCmd = skillCommand("claude-coach");
|
|
175
|
-
console.log(orange(" ╭──────────────────────────────────────────────╮\n" +
|
|
176
|
-
" │ │\n" +
|
|
177
|
-
` │ ${padRight("You're all set.", 44)}│\n` +
|
|
178
|
-
" │ │\n" +
|
|
179
|
-
` │ ${padRight(`${sessionEntries.length} sessions found`, 44)}│\n` +
|
|
180
|
-
` │ ${padRight(`${skillCount} skills installed`, 44)}│\n` +
|
|
181
|
-
` │ ${padRight("Auto-tracking enabled", 44)}│\n` +
|
|
182
|
-
" │ │\n" +
|
|
183
|
-
" ╰──────────────────────────────────────────────╯"));
|
|
184
|
-
console.log();
|
|
185
|
-
if (env !== "terminal") {
|
|
186
|
-
console.log(chalk.bold(" Restart Claude Code, then paste this to get started:"));
|
|
187
|
-
console.log();
|
|
188
|
-
console.log(` ${orange(coachCmd)}`);
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
console.log(chalk.bold(" Paste this into your terminal to get started:"));
|
|
192
|
-
console.log();
|
|
193
|
-
console.log(` ${orange(`claude "${coachCmd}"`)}`);
|
|
194
|
-
}
|
|
195
|
-
console.log();
|
|
196
|
-
}
|
|
197
|
-
async function createAccount(token, defaultToken) {
|
|
198
|
-
let email;
|
|
199
|
-
let username;
|
|
200
|
-
let authToken = defaultToken;
|
|
201
|
-
let serverLinked = false;
|
|
202
|
-
console.log(chalk.bold(" [1/3] Create your account"));
|
|
203
|
-
console.log();
|
|
204
|
-
if (token) {
|
|
205
|
-
console.log(chalk.green(" ✓ Token verified"));
|
|
206
|
-
email = "user@buildpartner.ai";
|
|
207
|
-
username = "player";
|
|
208
|
-
}
|
|
209
|
-
else if (!isInteractive) {
|
|
210
|
-
const emailArg = getArg("--email");
|
|
211
|
-
email = emailArg || `user-${Date.now()}@buildpartner.ai`;
|
|
212
|
-
username = getArg("--username") || usernameFromEmail(email);
|
|
213
|
-
console.log(chalk.dim(` Using: ${email}`));
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
email = await input({
|
|
217
|
-
message: " Email:",
|
|
218
|
-
validate: (val) => {
|
|
219
|
-
if (!val.includes("@"))
|
|
220
|
-
return "Enter a valid email";
|
|
221
|
-
return true;
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
username = usernameFromEmail(email);
|
|
225
|
-
}
|
|
226
|
-
const signup = async (signupEmail, signupUsername) => {
|
|
227
|
-
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
228
|
-
try {
|
|
229
|
-
const res = await fetch(`${API_BASE}/api/buildpartner/signup`, {
|
|
230
|
-
method: "POST",
|
|
231
|
-
headers: { "Content-Type": "application/json" },
|
|
232
|
-
body: JSON.stringify({ email: signupEmail, username: signupUsername }),
|
|
233
|
-
signal: AbortSignal.timeout(10000),
|
|
234
|
-
});
|
|
235
|
-
const data = await res.json();
|
|
236
|
-
if (res.ok && data.token) {
|
|
237
|
-
authToken = data.token;
|
|
238
|
-
serverLinked = true;
|
|
239
|
-
return "ok";
|
|
240
|
-
}
|
|
241
|
-
else if (res.status === 409) {
|
|
242
|
-
const msg = (data.error || "").toLowerCase();
|
|
243
|
-
if (msg.includes("username"))
|
|
244
|
-
return "duplicate-username";
|
|
245
|
-
return "duplicate-email";
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
catch {
|
|
249
|
-
if (attempt < 3) {
|
|
250
|
-
await new Promise((r) => setTimeout(r, 1000 * attempt));
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
return "error";
|
|
255
|
-
};
|
|
256
|
-
let result = await signup(email, username);
|
|
257
|
-
// Username collision: auto-retry with a random suffix (up to 3 times)
|
|
258
|
-
if (result === "duplicate-username") {
|
|
259
|
-
for (let i = 0; i < 3; i++) {
|
|
260
|
-
username = `${usernameFromEmail(email)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
261
|
-
result = await signup(email, username);
|
|
262
|
-
if (result !== "duplicate-username")
|
|
263
|
-
break;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
// Email collision: offer login or retry
|
|
267
|
-
if (result === "duplicate-email" && isInteractive) {
|
|
268
|
-
let retrying = true;
|
|
269
|
-
while (retrying) {
|
|
270
|
-
console.log(chalk.yellow(` ! This email is already registered.`));
|
|
271
|
-
console.log(chalk.dim(` Log in from your dashboard: ${API_BASE}/dashboard/login`));
|
|
272
|
-
console.log();
|
|
273
|
-
const retry = await input({
|
|
274
|
-
message: " Try a different email? (y/n):",
|
|
275
|
-
});
|
|
276
|
-
if (retry.toLowerCase() !== "y") {
|
|
277
|
-
console.log();
|
|
278
|
-
console.log(chalk.dim(` Log in at ${API_BASE}/dashboard/login to access your account.`));
|
|
279
|
-
process.exit(0);
|
|
280
|
-
}
|
|
281
|
-
email = await input({
|
|
282
|
-
message: " Email:",
|
|
283
|
-
validate: (val) => {
|
|
284
|
-
if (!val.includes("@"))
|
|
285
|
-
return "Enter a valid email";
|
|
286
|
-
return true;
|
|
287
|
-
},
|
|
288
|
-
});
|
|
289
|
-
username = usernameFromEmail(email);
|
|
290
|
-
result = await signup(email, username);
|
|
291
|
-
if (result === "duplicate-username") {
|
|
292
|
-
for (let i = 0; i < 3; i++) {
|
|
293
|
-
username = `${usernameFromEmail(email)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
294
|
-
result = await signup(email, username);
|
|
295
|
-
if (result !== "duplicate-username")
|
|
296
|
-
break;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
if (result !== "duplicate-email")
|
|
300
|
-
retrying = false;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
else if (result === "duplicate-email") {
|
|
304
|
-
console.log(chalk.yellow(` ! This email is already registered.`));
|
|
305
|
-
console.log(chalk.dim(` Log in from your dashboard: ${API_BASE}/dashboard/login`));
|
|
306
|
-
process.exit(0);
|
|
307
|
-
}
|
|
308
|
-
if (result === "error") {
|
|
309
|
-
console.log(chalk.yellow(" ! Could not reach buildpartner.ai. Your data will sync next time you run a skill."));
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
console.log(chalk.green(" ✓ Account created"));
|
|
313
|
-
}
|
|
314
|
-
console.log();
|
|
315
|
-
return { email, username, authToken, serverLinked };
|
|
316
|
-
}
|
|
317
|
-
function getTokenArg() {
|
|
318
|
-
return getArg("--token");
|
|
319
|
-
}
|
|
320
|
-
function getArg(flag) {
|
|
321
|
-
const idx = process.argv.indexOf(flag);
|
|
322
|
-
if (idx !== -1 && process.argv[idx + 1]) {
|
|
323
|
-
return process.argv[idx + 1];
|
|
324
|
-
}
|
|
325
|
-
return null;
|
|
326
|
-
}
|
|
327
|
-
function generateId() {
|
|
328
|
-
return crypto.randomUUID().replace(/-/g, "").slice(0, 24);
|
|
329
|
-
}
|
|
330
|
-
function usernameFromEmail(email) {
|
|
331
|
-
const local = email.split("@")[0] || "";
|
|
332
|
-
const clean = local.replace(/[^a-zA-Z0-9-]/g, "-").toLowerCase().replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
333
|
-
if (clean.length >= 2)
|
|
334
|
-
return clean;
|
|
335
|
-
return `user-${Math.random().toString(36).slice(2, 8)}`;
|
|
336
|
-
}
|
|
337
|
-
function openUrl(url) {
|
|
338
|
-
try {
|
|
339
|
-
const os = platform();
|
|
340
|
-
if (os === "darwin") {
|
|
341
|
-
execSync(`open "${url}"`, { stdio: "ignore" });
|
|
342
|
-
}
|
|
343
|
-
else if (os === "win32") {
|
|
344
|
-
execSync(`start "" "${url}"`, { stdio: "ignore" });
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
execSync(`xdg-open "${url}"`, { stdio: "ignore" });
|
|
348
|
-
}
|
|
349
|
-
return true;
|
|
350
|
-
}
|
|
351
|
-
catch {
|
|
352
|
-
return false;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
function padRight(str, len) {
|
|
356
|
-
return str.length >= len ? str : str + " ".repeat(len - str.length);
|
|
357
|
-
}
|
|
358
|
-
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/src/constants.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Global constants shared across CLI, MCP server, and web app.
|
|
3
|
-
* Change SKILL_PREFIX here and it propagates everywhere.
|
|
4
|
-
*/
|
|
5
|
-
export declare const SKILL_PREFIX = "bp-";
|
|
6
|
-
/**
|
|
7
|
-
* Format a skill command for display (e.g., "interview" -> "/bp-interview").
|
|
8
|
-
*/
|
|
9
|
-
export declare function skillCommand(name: string): string;
|
package/dist/src/constants.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Global constants shared across CLI, MCP server, and web app.
|
|
3
|
-
* Change SKILL_PREFIX here and it propagates everywhere.
|
|
4
|
-
*/
|
|
5
|
-
export const SKILL_PREFIX = "bp-";
|
|
6
|
-
/**
|
|
7
|
-
* Format a skill command for display (e.g., "interview" -> "/bp-interview").
|
|
8
|
-
*/
|
|
9
|
-
export function skillCommand(name) {
|
|
10
|
-
return `/${SKILL_PREFIX}${name}`;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,YAAY,GAAG,IAAI,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Subscription gate for MCP tool calls.
|
|
3
|
-
*
|
|
4
|
-
* Checks if the user has an active trial (usage-based) or has paid.
|
|
5
|
-
* Caches the result for 5 minutes to avoid hitting the API on every call.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Check if the user can use tools. Returns null if access is granted,
|
|
9
|
-
* or an error message string if access is denied.
|
|
10
|
-
*/
|
|
11
|
-
export declare function checkAccess(): Promise<string | null>;
|
|
12
|
-
/**
|
|
13
|
-
* Get trial status for informational purposes (used by check_status).
|
|
14
|
-
*/
|
|
15
|
-
export declare function getTrialInfo(): Promise<{
|
|
16
|
-
status: "active" | "trial" | "expired";
|
|
17
|
-
uses_left: number;
|
|
18
|
-
upgrade_url: string;
|
|
19
|
-
} | null>;
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Subscription gate for MCP tool calls.
|
|
3
|
-
*
|
|
4
|
-
* Checks if the user has an active trial (usage-based) or has paid.
|
|
5
|
-
* Caches the result for 5 minutes to avoid hitting the API on every call.
|
|
6
|
-
*/
|
|
7
|
-
import { apiGet } from "../api-client.js";
|
|
8
|
-
import { readAuth } from "../store/local-store.js";
|
|
9
|
-
let cachedStatus = null;
|
|
10
|
-
let cacheTimestamp = 0;
|
|
11
|
-
const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
12
|
-
async function getSubscriptionStatus() {
|
|
13
|
-
const now = Date.now();
|
|
14
|
-
if (cachedStatus && now - cacheTimestamp < CACHE_TTL_MS) {
|
|
15
|
-
return cachedStatus;
|
|
16
|
-
}
|
|
17
|
-
const result = await apiGet("/api/buildpartner/subscription");
|
|
18
|
-
if (result) {
|
|
19
|
-
cachedStatus = result;
|
|
20
|
-
cacheTimestamp = now;
|
|
21
|
-
}
|
|
22
|
-
return result;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Check if the user can use tools. Returns null if access is granted,
|
|
26
|
-
* or an error message string if access is denied.
|
|
27
|
-
*/
|
|
28
|
-
export async function checkAccess() {
|
|
29
|
-
const auth = readAuth();
|
|
30
|
-
if (!auth?.token) {
|
|
31
|
-
// No auth = not set up yet. Allow access (setup flow needs tools).
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
const status = await getSubscriptionStatus();
|
|
35
|
-
// If we can't reach the API, allow access (offline-friendly)
|
|
36
|
-
if (!status) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
if (status.status === "active") {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
if (status.status === "trial") {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
// Trial expired (used all free skill uses) and hasn't paid
|
|
46
|
-
return [
|
|
47
|
-
"You've used all 20 free skill runs.",
|
|
48
|
-
"",
|
|
49
|
-
"Upgrade to keep using BuildPartner ($8.99, one-time):",
|
|
50
|
-
status.upgrade_url,
|
|
51
|
-
"",
|
|
52
|
-
"Run this to open your dashboard:",
|
|
53
|
-
`open "${status.upgrade_url}"`,
|
|
54
|
-
].join("\n");
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Get trial status for informational purposes (used by check_status).
|
|
58
|
-
*/
|
|
59
|
-
export async function getTrialInfo() {
|
|
60
|
-
const status = await getSubscriptionStatus();
|
|
61
|
-
if (!status)
|
|
62
|
-
return null;
|
|
63
|
-
return {
|
|
64
|
-
status: status.status,
|
|
65
|
-
uses_left: status.uses_left,
|
|
66
|
-
upgrade_url: status.upgrade_url,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=subscription-gate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscription-gate.js","sourceRoot":"","sources":["../../../src/mcp/subscription-gate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAWnD,IAAI,YAAY,GAA8B,IAAI,CAAC;AACnD,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAEhD,KAAK,UAAU,qBAAqB;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,YAAY,IAAI,GAAG,GAAG,cAAc,GAAG,YAAY,EAAE,CAAC;QACxD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAqB,gCAAgC,CAAC,CAAC;IAClF,IAAI,MAAM,EAAE,CAAC;QACX,YAAY,GAAG,MAAM,CAAC;QACtB,cAAc,GAAG,GAAG,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,mEAAmE;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAE7C,6DAA6D;IAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2DAA2D;IAC3D,OAAO;QACL,qCAAqC;QACrC,EAAE;QACF,uDAAuD;QACvD,MAAM,CAAC,WAAW;QAClB,EAAE;QACF,kCAAkC;QAClC,SAAS,MAAM,CAAC,WAAW,GAAG;KAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAKhC,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC;AACJ,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Quest store - now only holds quest definitions for setup recommendations.
|
|
3
|
-
* All quest state management is server-side via /api/buildpartner/check-status.
|
|
4
|
-
*/
|
|
5
|
-
export type QuestPath = "core" | "builder" | "storyteller" | "systems-thinker";
|
|
6
|
-
export interface Quest {
|
|
7
|
-
id: string;
|
|
8
|
-
title: string;
|
|
9
|
-
description: string;
|
|
10
|
-
prompt: string;
|
|
11
|
-
path: QuestPath;
|
|
12
|
-
order: number;
|
|
13
|
-
}
|
|
14
|
-
export declare const QUEST_DEFINITIONS: Quest[];
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Quest store - now only holds quest definitions for setup recommendations.
|
|
3
|
-
* All quest state management is server-side via /api/buildpartner/check-status.
|
|
4
|
-
*/
|
|
5
|
-
import { skillCommand } from "../constants.js";
|
|
6
|
-
export const QUEST_DEFINITIONS = [
|
|
7
|
-
// Core quests
|
|
8
|
-
{
|
|
9
|
-
id: "run-first-skill",
|
|
10
|
-
title: "Run Your First Skill",
|
|
11
|
-
description: `Type ${skillCommand("coach")} in Claude Code to get a personalized setup review.`,
|
|
12
|
-
prompt: skillCommand("coach"),
|
|
13
|
-
path: "core",
|
|
14
|
-
order: 1,
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
id: "build-training-data",
|
|
18
|
-
title: "Build Your Training Data",
|
|
19
|
-
description: `Type ${skillCommand("interview")} in Claude Code to teach BuildPartner how you work.`,
|
|
20
|
-
prompt: skillCommand("interview"),
|
|
21
|
-
path: "core",
|
|
22
|
-
order: 2,
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
id: "review-claude-md",
|
|
26
|
-
title: "Review Your CLAUDE.md",
|
|
27
|
-
description: `Run ${skillCommand("enhance-claude-md")} to get data-backed rules for your CLAUDE.md.`,
|
|
28
|
-
prompt: skillCommand("enhance-claude-md"),
|
|
29
|
-
path: "core",
|
|
30
|
-
order: 3,
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
id: "consult-an-expert",
|
|
34
|
-
title: "Consult an Expert",
|
|
35
|
-
description: `Type ${skillCommand("consult")} and ask any question. Get matched to the right expert framework.`,
|
|
36
|
-
prompt: skillCommand("consult"),
|
|
37
|
-
path: "core",
|
|
38
|
-
order: 4,
|
|
39
|
-
},
|
|
40
|
-
];
|
|
41
|
-
//# sourceMappingURL=quest-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quest-store.js","sourceRoot":"","sources":["../../../src/store/quest-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAa/C,MAAM,CAAC,MAAM,iBAAiB,GAAY;IACxC,cAAc;IACd;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,QAAQ,YAAY,CAAC,OAAO,CAAC,qDAAqD;QAC/F,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC;QAC7B,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,QAAQ,YAAY,CAAC,WAAW,CAAC,qDAAqD;QACnG,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC;QACjC,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,OAAO,YAAY,CAAC,mBAAmB,CAAC,+CAA+C;QACpG,MAAM,EAAE,YAAY,CAAC,mBAAmB,CAAC;QACzC,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,QAAQ,YAAY,CAAC,SAAS,CAAC,mEAAmE;QAC/G,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC;QAC/B,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,CAAC;KACT;CACF,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Status store - now only handles version checking.
|
|
3
|
-
* All other bookkeeping (consumption, quests, reminders) moved to server.
|
|
4
|
-
*/
|
|
5
|
-
export interface VersionInfo {
|
|
6
|
-
current: string;
|
|
7
|
-
latest: string | null;
|
|
8
|
-
update_available: boolean;
|
|
9
|
-
}
|
|
10
|
-
export declare function getVersionInfo(): Promise<VersionInfo>;
|