buildpartner 0.15.2 → 0.15.3-dev.20261103132440

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/bin/cli.js +0 -0
  2. package/dist/src/commands/reset.d.ts +1 -0
  3. package/dist/src/commands/reset.js +130 -0
  4. package/dist/src/commands/reset.js.map +1 -0
  5. package/dist/src/commands/setup.d.ts +1 -0
  6. package/dist/src/commands/setup.js +358 -0
  7. package/dist/src/commands/setup.js.map +1 -0
  8. package/dist/src/constants.d.ts +9 -0
  9. package/dist/src/constants.js +12 -0
  10. package/dist/src/constants.js.map +1 -0
  11. package/dist/src/mcp/build-pad.d.ts +26 -1
  12. package/dist/src/mcp/build-pad.js +80 -14
  13. package/dist/src/mcp/build-pad.js.map +1 -1
  14. package/dist/src/mcp/server.js +2 -1
  15. package/dist/src/mcp/server.js.map +1 -1
  16. package/dist/src/mcp/subscription-gate.d.ts +19 -0
  17. package/dist/src/mcp/subscription-gate.js +69 -0
  18. package/dist/src/mcp/subscription-gate.js.map +1 -0
  19. package/dist/src/store/local-store.d.ts +8 -2
  20. package/dist/src/store/local-store.js +18 -5
  21. package/dist/src/store/local-store.js.map +1 -1
  22. package/dist/src/store/quest-store.d.ts +14 -0
  23. package/dist/src/store/quest-store.js +41 -0
  24. package/dist/src/store/quest-store.js.map +1 -0
  25. package/dist/src/store/status-store.d.ts +10 -0
  26. package/dist/src/store/status-store.js +99 -0
  27. package/dist/src/store/status-store.js.map +1 -0
  28. package/dist/src/suggestions/rules.d.ts +1 -0
  29. package/dist/src/suggestions/rules.js +2 -0
  30. package/dist/src/suggestions/rules.js.map +1 -0
  31. package/dist/src/suggestions/video-links.d.ts +1 -0
  32. package/dist/src/suggestions/video-links.js +2 -0
  33. package/dist/src/suggestions/video-links.js.map +1 -0
  34. package/package.json +1 -1
package/dist/bin/cli.js CHANGED
File without changes
@@ -0,0 +1 @@
1
+ export declare function reset(): Promise<void>;
@@ -0,0 +1,130 @@
1
+ import { existsSync, readFileSync, writeFileSync, rmSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ import { homedir } from "os";
4
+ import { getBuildPartnerDir } from "../store/local-store.js";
5
+ const CLAUDE_JSON_PATH = join(homedir(), ".claude.json");
6
+ const LEGACY_MCP_PATH = join(homedir(), ".claude", "mcp_servers.json");
7
+ const SETTINGS_PATH = join(homedir(), ".claude", "settings.json");
8
+ const GLOBAL_SKILLS_DIR = join(homedir(), ".claude", "skills");
9
+ const BUILDPARTNER_HOOK_COMMAND = "npx buildpartner log-session";
10
+ export async function reset() {
11
+ console.log("\n BuildPartner Full Reset\n");
12
+ const removed = [];
13
+ // 1. Remove ~/.buildpartner/ directory
14
+ const bpDir = getBuildPartnerDir();
15
+ if (existsSync(bpDir)) {
16
+ rmSync(bpDir, { recursive: true, force: true });
17
+ removed.push("~/.buildpartner/ (all local data)");
18
+ }
19
+ // 2. Remove bp-* and mp-* (legacy) skill directories from ~/.claude/skills/
20
+ if (existsSync(GLOBAL_SKILLS_DIR)) {
21
+ try {
22
+ const entries = readdirSync(GLOBAL_SKILLS_DIR);
23
+ const bpSkills = entries.filter((e) => e.startsWith("bp-") || e.startsWith("mp-"));
24
+ for (const skill of bpSkills) {
25
+ rmSync(join(GLOBAL_SKILLS_DIR, skill), { recursive: true, force: true });
26
+ }
27
+ if (bpSkills.length > 0) {
28
+ removed.push(`${bpSkills.length} skills from ~/.claude/skills/`);
29
+ }
30
+ }
31
+ catch { }
32
+ }
33
+ // 3. Remove MCP server from ~/.claude.json (buildpartner + legacy myplayer)
34
+ if (existsSync(CLAUDE_JSON_PATH)) {
35
+ try {
36
+ const config = JSON.parse(readFileSync(CLAUDE_JSON_PATH, "utf-8"));
37
+ let changed = false;
38
+ for (const key of ["buildpartner", "myplayer"]) {
39
+ if (config.mcpServers?.[key]) {
40
+ delete config.mcpServers[key];
41
+ changed = true;
42
+ }
43
+ }
44
+ if (changed) {
45
+ writeFileSync(CLAUDE_JSON_PATH, JSON.stringify(config, null, 2) + "\n");
46
+ removed.push("MCP server from ~/.claude.json");
47
+ }
48
+ }
49
+ catch { }
50
+ }
51
+ // 4. Remove MCP server from legacy path (buildpartner + legacy myplayer)
52
+ if (existsSync(LEGACY_MCP_PATH)) {
53
+ try {
54
+ const config = JSON.parse(readFileSync(LEGACY_MCP_PATH, "utf-8"));
55
+ let changed = false;
56
+ for (const key of ["buildpartner", "myplayer"]) {
57
+ if (config.mcpServers?.[key]) {
58
+ delete config.mcpServers[key];
59
+ changed = true;
60
+ }
61
+ if (config[key]) {
62
+ delete config[key];
63
+ changed = true;
64
+ }
65
+ }
66
+ if (changed) {
67
+ writeFileSync(LEGACY_MCP_PATH, JSON.stringify(config, null, 2) + "\n");
68
+ removed.push("MCP server from ~/.claude/mcp_servers.json");
69
+ }
70
+ }
71
+ catch { }
72
+ }
73
+ // 5. Remove hook and permission from ~/.claude/settings.json
74
+ if (existsSync(SETTINGS_PATH)) {
75
+ try {
76
+ const settings = JSON.parse(readFileSync(SETTINGS_PATH, "utf-8"));
77
+ let changed = false;
78
+ // Remove Stop hook
79
+ if (Array.isArray(settings?.hooks?.Stop)) {
80
+ const before = settings.hooks.Stop.length;
81
+ settings.hooks.Stop = settings.hooks.Stop.filter((entry) => {
82
+ if (typeof entry !== "object" || entry === null)
83
+ return true;
84
+ const innerHooks = entry.hooks;
85
+ if (!Array.isArray(innerHooks))
86
+ return true;
87
+ return !innerHooks.some((h) => typeof h === "object" &&
88
+ h !== null &&
89
+ h.command === BUILDPARTNER_HOOK_COMMAND);
90
+ });
91
+ if (settings.hooks.Stop.length < before) {
92
+ changed = true;
93
+ removed.push("Stop hook from ~/.claude/settings.json");
94
+ }
95
+ }
96
+ // Remove permissions (buildpartner + legacy myplayer)
97
+ if (Array.isArray(settings?.permissions?.allow)) {
98
+ const allow = settings.permissions.allow;
99
+ const toRemove = ["mcp__buildpartner__*", "mcp__myplayer__*"];
100
+ let removedPerms = false;
101
+ for (const perm of toRemove) {
102
+ const idx = allow.indexOf(perm);
103
+ if (idx !== -1) {
104
+ allow.splice(idx, 1);
105
+ removedPerms = true;
106
+ }
107
+ }
108
+ if (removedPerms) {
109
+ changed = true;
110
+ removed.push("MCP permissions from ~/.claude/settings.json");
111
+ }
112
+ }
113
+ if (changed) {
114
+ writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
115
+ }
116
+ }
117
+ catch { }
118
+ }
119
+ if (removed.length === 0) {
120
+ console.log(" Nothing to reset. BuildPartner is not installed.\n");
121
+ }
122
+ else {
123
+ console.log(" Removed:");
124
+ for (const item of removed) {
125
+ console.log(` - ${item}`);
126
+ }
127
+ console.log("\n Run `claude plugin marketplace add austinmarchese/buildpartner` to reinstall.\n");
128
+ }
129
+ }
130
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../../src/commands/reset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function setup(): Promise<void>;
@@ -0,0 +1,358 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Global constants shared across CLI, MCP server, and web app.
3
+ * Change SKILL_PREFIX here and it propagates everywhere.
4
+ */
5
+ export declare const SKILL_PREFIX = "bp-";
6
+ /**
7
+ * Format a skill command for display (e.g., "interview" -> "/bp-interview").
8
+ */
9
+ export declare function skillCommand(name: string): string;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Global constants shared across CLI, MCP server, and web app.
3
+ * Change SKILL_PREFIX here and it propagates everywhere.
4
+ */
5
+ export const SKILL_PREFIX = "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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,YAAY,GAAG,IAAI,EAAE,CAAC;AACnC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The build_pad tool: BuildPad, the hosted review pages on BuildPartner.ai
3
- * (Executive AI Program, behind the build_pad flag). Publishes a local HTML
3
+ * (any plan, behind the build_pad flag; opening a pad costs a free member 1 credit). Publishes a local HTML
4
4
  * file or folder as a pad, reads the reviewer's feedback, and posts versions
5
5
  * and replies, through the /api/buildpartner/pads routes with this machine's
6
6
  * token. The routes are the real gate (lib/pad-auth.ts in apps/web).
@@ -35,8 +35,33 @@ export type PadArgs = {
35
35
  note?: string;
36
36
  text?: string;
37
37
  url?: string;
38
+ include_data?: boolean;
38
39
  };
39
40
  /** A plain result or a message for the user. Either way the tool returns it as JSON text. */
40
41
  type Result = Record<string, unknown>;
41
42
  export declare function runBuildPad(args: PadArgs): Promise<Result>;
43
+ /**
44
+ * Text from anyone but the owner is wrapped so every caller sees whose words
45
+ * they are, including a skill that never read the build-pad rules. The tag
46
+ * is stripped from the body first, so a comment cannot close the wrapper
47
+ * early and pass the rest off as the tool's own words. Exported for the tests.
48
+ */
49
+ export declare function frameItem(item: Result): Result;
50
+ /**
51
+ * A single .html file uploads as index.html; a folder uploads its index.html
52
+ * plus every non-hidden file a page is made of, and reports the data files it
53
+ * left behind (see DATA_EXTENSIONS). Exported for the tests.
54
+ */
55
+ export declare function padPayload(input: string | undefined, title: string | undefined, includeData?: boolean): {
56
+ body: {
57
+ title: string;
58
+ entry: string;
59
+ files: {
60
+ path: string;
61
+ content_base64: string;
62
+ content_type: string;
63
+ }[];
64
+ };
65
+ skipped: string[];
66
+ };
42
67
  export {};