buildpartner 0.12.7 → 0.13.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.js +2 -1
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/api-client.d.ts +3 -1
- package/dist/src/api-client.js +4 -2
- package/dist/src/api-client.js.map +1 -1
- package/dist/src/commands/login.d.ts +11 -3
- package/dist/src/commands/login.js +130 -35
- package/dist/src/commands/login.js.map +1 -1
- package/dist/src/mcp/server.d.ts +1 -0
- package/dist/src/mcp/server.js +61 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/package.json +1 -1
package/dist/bin/cli.js
CHANGED
|
@@ -18,7 +18,8 @@ async function main() {
|
|
|
18
18
|
|
|
19
19
|
Usage:
|
|
20
20
|
buildpartner serve Start MCP server
|
|
21
|
-
buildpartner login <
|
|
21
|
+
buildpartner login <email> Log in (or sign up) with a link sent to your email
|
|
22
|
+
buildpartner login <token> Connect with a token from the dashboard
|
|
22
23
|
|
|
23
24
|
Install via plugin marketplace:
|
|
24
25
|
claude plugin marketplace add austinmarchese/buildpartner-plugin
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AAEA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YAC3D,MAAM,KAAK,EAAE,CAAC;YACd,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YAC3D,MAAM,KAAK,EAAE,CAAC;YACd,MAAM;QACR,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AAEA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YAC3D,MAAM,KAAK,EAAE,CAAC;YACd,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YAC3D,MAAM,KAAK,EAAE,CAAC;YACd,MAAM;QACR,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;CAWjB,CAAC,CAAC;YACG,MAAM;QACR;YACE,wFAAwF;YACxF,MAAM;IACV,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/src/api-client.d.ts
CHANGED
|
@@ -17,8 +17,10 @@ export declare function isProdApiBase(base: string): boolean;
|
|
|
17
17
|
* Make an authenticated request to the BuildPartner API.
|
|
18
18
|
* Returns the raw Response, or null if offline/unauthenticated.
|
|
19
19
|
* Callers should check res.status for specific error handling (e.g. 403 = trial expired).
|
|
20
|
+
* `timeoutMs` defaults to 5s; social_intel passes more because its server
|
|
21
|
+
* route waits on a third-party vendor (Instagram transcripts take ~8s).
|
|
20
22
|
*/
|
|
21
|
-
export declare function apiFetch(path: string, options?: RequestInit): Promise<Response | null>;
|
|
23
|
+
export declare function apiFetch(path: string, options?: RequestInit, timeoutMs?: number): Promise<Response | null>;
|
|
22
24
|
/**
|
|
23
25
|
* GET from the API and parse JSON. Returns null on any failure.
|
|
24
26
|
* Use apiFetch() directly when you need to check specific status codes.
|
package/dist/src/api-client.js
CHANGED
|
@@ -29,8 +29,10 @@ export function isProdApiBase(base) {
|
|
|
29
29
|
* Make an authenticated request to the BuildPartner API.
|
|
30
30
|
* Returns the raw Response, or null if offline/unauthenticated.
|
|
31
31
|
* Callers should check res.status for specific error handling (e.g. 403 = trial expired).
|
|
32
|
+
* `timeoutMs` defaults to 5s; social_intel passes more because its server
|
|
33
|
+
* route waits on a third-party vendor (Instagram transcripts take ~8s).
|
|
32
34
|
*/
|
|
33
|
-
export async function apiFetch(path, options) {
|
|
35
|
+
export async function apiFetch(path, options, timeoutMs = 5000) {
|
|
34
36
|
const auth = readAuth();
|
|
35
37
|
if (!auth?.token)
|
|
36
38
|
return null;
|
|
@@ -42,7 +44,7 @@ export async function apiFetch(path, options) {
|
|
|
42
44
|
"Content-Type": "application/json",
|
|
43
45
|
...options?.headers,
|
|
44
46
|
},
|
|
45
|
-
signal: AbortSignal.timeout(
|
|
47
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
46
48
|
});
|
|
47
49
|
return res;
|
|
48
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/api-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE5D,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AAE9D,SAAS,UAAU;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,IAAI,IAAI,EAAE,QAAQ;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AACD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;AAErC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,qBAAqB,CAAC;AACtE,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/api-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE5D,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AAE9D,SAAS,UAAU;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,IAAI,IAAI,EAAE,QAAQ;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AACD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;AAErC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,qBAAqB,CAAC;AACtE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAqB,EAAE,SAAS,GAAG,IAAI;IAClF,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,EAAE;YAC5C,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;gBACvC,cAAc,EAAE,kBAAkB;gBAClC,GAAG,OAAO,EAAE,OAAO;aACpB;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAI,IAAY;IAC1C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,IAAY,EAAE,IAAa;IAC1D,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;QAC/B,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC"}
|
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `buildpartner login <token> [--api <url>]
|
|
2
|
+
* `buildpartner login <email|token> [--api <url>] [--source <tag>]`
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Two forms:
|
|
5
|
+
* login you@example.com Email-only login. Emails a confirm link, waits for
|
|
6
|
+
* the click, then saves the account. Works for new
|
|
7
|
+
* and existing emails; the account is created when
|
|
8
|
+
* the link is confirmed. The token is never printed.
|
|
9
|
+
* login sk_... Connect an existing account with a token from the
|
|
10
|
+
* dashboard (after OTP verification).
|
|
6
11
|
*
|
|
7
12
|
* `--api <url>` (or the BP_API_BASE env var) points the CLI at a non-prod
|
|
8
13
|
* environment. When set to a non-prod base, we persist it as `api_base` in
|
|
9
14
|
* auth.json so every later call sticks to that environment. The dashboard's
|
|
10
15
|
* login page injects this flag automatically when it is not on prod, so a dev
|
|
11
16
|
* user's copy-pasted command just works. Mirrors plugin/scripts/install.sh.
|
|
17
|
+
*
|
|
18
|
+
* `--source` tags where the login started ("installer", "lead-magnet:<code>")
|
|
19
|
+
* for the admin drop-off view. Defaults to "cli".
|
|
12
20
|
*/
|
|
13
21
|
export declare function login(): Promise<void>;
|
|
@@ -1,23 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `buildpartner login <token> [--api <url>]
|
|
2
|
+
* `buildpartner login <email|token> [--api <url>] [--source <tag>]`
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Two forms:
|
|
5
|
+
* login you@example.com Email-only login. Emails a confirm link, waits for
|
|
6
|
+
* the click, then saves the account. Works for new
|
|
7
|
+
* and existing emails; the account is created when
|
|
8
|
+
* the link is confirmed. The token is never printed.
|
|
9
|
+
* login sk_... Connect an existing account with a token from the
|
|
10
|
+
* dashboard (after OTP verification).
|
|
6
11
|
*
|
|
7
12
|
* `--api <url>` (or the BP_API_BASE env var) points the CLI at a non-prod
|
|
8
13
|
* environment. When set to a non-prod base, we persist it as `api_base` in
|
|
9
14
|
* auth.json so every later call sticks to that environment. The dashboard's
|
|
10
15
|
* login page injects this flag automatically when it is not on prod, so a dev
|
|
11
16
|
* user's copy-pasted command just works. Mirrors plugin/scripts/install.sh.
|
|
17
|
+
*
|
|
18
|
+
* `--source` tags where the login started ("installer", "lead-magnet:<code>")
|
|
19
|
+
* for the admin drop-off view. Defaults to "cli".
|
|
12
20
|
*/
|
|
13
21
|
import chalk from "chalk";
|
|
14
22
|
import { writeAuth } from "../store/local-store.js";
|
|
15
23
|
import { DEFAULT_API_BASE, isProdApiBase } from "../api-client.js";
|
|
16
24
|
const orange = chalk.hex("#E47025");
|
|
17
|
-
/** Pull the
|
|
25
|
+
/** Pull the credential, --api base, and --source out of the login argv. */
|
|
18
26
|
function parseArgs(argv) {
|
|
19
|
-
let
|
|
27
|
+
let credential;
|
|
20
28
|
let apiFlag;
|
|
29
|
+
let source = "cli";
|
|
21
30
|
// argv here is process.argv.slice(3) -> everything after `login`.
|
|
22
31
|
for (let i = 0; i < argv.length; i++) {
|
|
23
32
|
const arg = argv[i];
|
|
@@ -28,27 +37,63 @@ function parseArgs(argv) {
|
|
|
28
37
|
else if (arg.startsWith("--api=")) {
|
|
29
38
|
apiFlag = arg.slice("--api=".length);
|
|
30
39
|
}
|
|
31
|
-
else if (
|
|
32
|
-
|
|
40
|
+
else if (arg === "--source") {
|
|
41
|
+
source = argv[i + 1] || source;
|
|
42
|
+
i++;
|
|
43
|
+
}
|
|
44
|
+
else if (arg.startsWith("--source=")) {
|
|
45
|
+
source = arg.slice("--source=".length) || source;
|
|
46
|
+
}
|
|
47
|
+
else if (!arg.startsWith("-") && !credential) {
|
|
48
|
+
credential = arg;
|
|
33
49
|
}
|
|
34
50
|
}
|
|
35
51
|
const apiBase = (apiFlag || process.env.BP_API_BASE || DEFAULT_API_BASE).replace(/\/$/, "");
|
|
36
|
-
return {
|
|
52
|
+
return { credential, apiBase, source };
|
|
53
|
+
}
|
|
54
|
+
function save(account, apiBase, domain) {
|
|
55
|
+
writeAuth({
|
|
56
|
+
email: account.email,
|
|
57
|
+
username: account.username,
|
|
58
|
+
token: account.token,
|
|
59
|
+
profile_url: account.profile_url || `${domain}/${account.username}`,
|
|
60
|
+
created_at: account.created_at || new Date().toISOString(),
|
|
61
|
+
// Only persist api_base for non-prod, so a normal user's auth.json stays
|
|
62
|
+
// clean and the default (prod) resolution applies.
|
|
63
|
+
...(isProdApiBase(apiBase) ? {} : { api_base: apiBase }),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function printSuccess(email, apiBase) {
|
|
67
|
+
// Claude Code namespaces skills by plugin name, which differs per env.
|
|
68
|
+
const plugin = isProdApiBase(apiBase) ? "buildpartner" : "bp-dev";
|
|
69
|
+
console.log(chalk.green(` ✓ Logged in as ${email}`));
|
|
70
|
+
console.log();
|
|
71
|
+
console.log(orange(" You're all set. In Claude Code, type:"));
|
|
72
|
+
console.log();
|
|
73
|
+
console.log(` ${orange("/reload-plugins")}`);
|
|
74
|
+
console.log(` ${orange(`/${plugin}:build onboard`)}`);
|
|
75
|
+
console.log();
|
|
76
|
+
}
|
|
77
|
+
function usage(apiBase) {
|
|
78
|
+
console.log();
|
|
79
|
+
console.log(" Usage: npx buildpartner login you@example.com");
|
|
80
|
+
console.log();
|
|
81
|
+
console.log(chalk.dim(" Or connect with a token from:"));
|
|
82
|
+
console.log(chalk.dim(` ${apiBase}/dashboard/login?connect=1`));
|
|
83
|
+
console.log();
|
|
84
|
+
process.exit(1);
|
|
37
85
|
}
|
|
38
86
|
export async function login() {
|
|
39
|
-
const {
|
|
87
|
+
const { credential, apiBase, source } = parseArgs(process.argv.slice(3));
|
|
40
88
|
const domain = apiBase.replace(/^https?:\/\//, "");
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
console.log();
|
|
45
|
-
console.log(" Usage: npx buildpartner login sk_your_token_here");
|
|
89
|
+
if (credential?.includes("@"))
|
|
90
|
+
return loginWithEmail(credential.trim().toLowerCase(), apiBase, domain, source);
|
|
91
|
+
if (!credential || !credential.startsWith("sk_")) {
|
|
46
92
|
console.log();
|
|
47
|
-
console.log(chalk.
|
|
48
|
-
|
|
49
|
-
console.log();
|
|
50
|
-
process.exit(1);
|
|
93
|
+
console.log(chalk.red(" ✗ Enter your email or a token."));
|
|
94
|
+
usage(apiBase);
|
|
51
95
|
}
|
|
96
|
+
const token = credential;
|
|
52
97
|
console.log();
|
|
53
98
|
console.log(chalk.dim(" Verifying token..."));
|
|
54
99
|
try {
|
|
@@ -59,33 +104,83 @@ export async function login() {
|
|
|
59
104
|
if (!res.ok) {
|
|
60
105
|
console.log(chalk.red(" ✗ Invalid token. It may have expired or been reset."));
|
|
61
106
|
console.log();
|
|
62
|
-
console.log(chalk.dim("
|
|
63
|
-
console.log(chalk.dim(
|
|
107
|
+
console.log(chalk.dim(" Log in with your email instead:"));
|
|
108
|
+
console.log(chalk.dim(" npx buildpartner login you@example.com"));
|
|
64
109
|
console.log();
|
|
65
110
|
process.exit(1);
|
|
66
111
|
}
|
|
67
112
|
const data = await res.json();
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
created_at: data.created_at || new Date().toISOString(),
|
|
74
|
-
// Only persist api_base for non-prod, so a normal user's auth.json stays
|
|
75
|
-
// clean and the default (prod) resolution applies.
|
|
76
|
-
...(isProdApiBase(apiBase) ? {} : { api_base: apiBase }),
|
|
77
|
-
});
|
|
78
|
-
console.log(chalk.green(` ✓ Logged in as ${data.email}`));
|
|
79
|
-
console.log();
|
|
80
|
-
console.log(orange(" You're all set. Paste this into your terminal to get started:"));
|
|
81
|
-
console.log();
|
|
82
|
-
console.log(` ${orange('claude "/bp-claude-coach"')}`);
|
|
113
|
+
save({ ...data, token }, apiBase, domain);
|
|
114
|
+
printSuccess(data.email, apiBase);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
console.log(chalk.red(` ✗ Could not reach ${domain}. Check your connection and try again.`));
|
|
83
118
|
console.log();
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
123
|
+
async function loginWithEmail(email, apiBase, domain, source) {
|
|
124
|
+
console.log();
|
|
125
|
+
let start;
|
|
126
|
+
try {
|
|
127
|
+
const res = await fetch(`${apiBase}/api/buildpartner/login/start`, {
|
|
128
|
+
method: "POST",
|
|
129
|
+
headers: { "Content-Type": "application/json" },
|
|
130
|
+
body: JSON.stringify({ email, source }),
|
|
131
|
+
signal: AbortSignal.timeout(15000),
|
|
132
|
+
});
|
|
133
|
+
const data = await res.json().catch(() => ({}));
|
|
134
|
+
if (!res.ok || !data.login_id) {
|
|
135
|
+
console.log(chalk.red(` ✗ ${data.error || "Could not start the login. Try again."}`));
|
|
136
|
+
console.log();
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
start = data;
|
|
84
140
|
}
|
|
85
141
|
catch {
|
|
86
142
|
console.log(chalk.red(` ✗ Could not reach ${domain}. Check your connection and try again.`));
|
|
87
143
|
console.log();
|
|
88
144
|
process.exit(1);
|
|
89
145
|
}
|
|
146
|
+
console.log(orange(` Check your inbox: we sent a login link to ${email}`));
|
|
147
|
+
console.log(chalk.dim(` Click "Yes, log me in" (your phone works too). Code: ${start.code}`));
|
|
148
|
+
console.log(chalk.dim(" Waiting for you to click..."));
|
|
149
|
+
console.log();
|
|
150
|
+
const deadline = Date.now() + start.expires_in * 1000;
|
|
151
|
+
const interval = Math.max(1, start.poll_interval) * 1000;
|
|
152
|
+
let failures = 0;
|
|
153
|
+
while (Date.now() < deadline) {
|
|
154
|
+
await sleep(interval);
|
|
155
|
+
try {
|
|
156
|
+
const res = await fetch(`${apiBase}/api/buildpartner/login/poll`, {
|
|
157
|
+
method: "POST",
|
|
158
|
+
headers: { "Content-Type": "application/json" },
|
|
159
|
+
body: JSON.stringify({ login_id: start.login_id }),
|
|
160
|
+
signal: AbortSignal.timeout(10000),
|
|
161
|
+
});
|
|
162
|
+
const data = await res.json();
|
|
163
|
+
failures = 0;
|
|
164
|
+
if (data.status === "approved" && data.token && data.email && data.username) {
|
|
165
|
+
save(data, apiBase, domain);
|
|
166
|
+
printSuccess(data.email, apiBase);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (data.status === "expired")
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// A dropped request mid-wait is not fatal; give up only if the
|
|
174
|
+
// connection stays down.
|
|
175
|
+
if (++failures >= 5) {
|
|
176
|
+
console.log(chalk.red(` ✗ Lost connection to ${domain}. Run the login again.`));
|
|
177
|
+
console.log();
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
console.log(chalk.red(" ✗ The login link expired. Run the login again for a new one."));
|
|
183
|
+
console.log();
|
|
184
|
+
process.exit(1);
|
|
90
185
|
}
|
|
91
186
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/src/mcp/server.d.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* get_expert_knowledge - search expert frameworks with personalized context
|
|
9
9
|
* get_founder_knowledge - search a team's founder/leadership knowledge base
|
|
10
10
|
* request_founder_knowledge - flag a missing topic to a team's leadership
|
|
11
|
+
* social_intel - public creator data on X, Instagram and YouTube
|
|
11
12
|
*/
|
|
12
13
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
13
14
|
export declare function createServer(): McpServer;
|
package/dist/src/mcp/server.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* get_expert_knowledge - search expert frameworks with personalized context
|
|
9
9
|
* get_founder_knowledge - search a team's founder/leadership knowledge base
|
|
10
10
|
* request_founder_knowledge - flag a missing topic to a team's leadership
|
|
11
|
+
* social_intel - public creator data on X, Instagram and YouTube
|
|
11
12
|
*/
|
|
12
13
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
13
14
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -93,7 +94,13 @@ async function handleFounderKnowledgeBlock(res) {
|
|
|
93
94
|
}));
|
|
94
95
|
}
|
|
95
96
|
export function createServer() {
|
|
96
|
-
|
|
97
|
+
// Server instructions land in the model's system prompt even while the tools
|
|
98
|
+
// themselves are deferred (names only until searched), so this is what
|
|
99
|
+
// routes "get me the transcript of <youtube link>" here instead of to a
|
|
100
|
+
// shell download or web fetch. Caught by the social discovery eval.
|
|
101
|
+
const server = new McpServer({ name: "buildpartner", version: getCliVersion() }, {
|
|
102
|
+
instructions: "For anything on X (Twitter), Instagram or YouTube (a creator's posts or profile, a post's stats or comments, a thread, top or latest posts on a topic, or a video or reel transcript), use the social_intel tool. Prefer it over web fetches, shell tools like yt-dlp, or downloads: it returns transcripts and stats those can't.",
|
|
103
|
+
});
|
|
97
104
|
server.tool("get_expert_knowledge", "Fetch expert frameworks. Preferred: pass category to get all frameworks in that category. Categories: sales, marketing, content, product, business-strategy, ai-automation, persuasion, copywriting, mindset. Also supports query (keyword search) or topic (specific framework by key).", {
|
|
98
105
|
category: z.string().optional().describe("Category or comma-separated categories to fetch all frameworks for (e.g. 'sales', 'product,marketing')"),
|
|
99
106
|
query: z.string().optional().describe("Search query to find relevant frameworks"),
|
|
@@ -206,6 +213,59 @@ export function createServer() {
|
|
|
206
213
|
}
|
|
207
214
|
return textResponse(JSON.stringify(await res.json(), null, 2));
|
|
208
215
|
});
|
|
216
|
+
server.tool("social_intel", "Look up public creator data on X (Twitter), Instagram and YouTube, including video and reel transcripts. Use this, not a web fetch, for anything on those platforms: their pages don't include transcripts, comments or full post stats. Use when the user names a creator or @handle, pastes an x.com / twitter.com / instagram.com / youtube.com link, or asks what a creator posted, what's performing, what people are saying about a topic right now, a video or reel transcript, a thread, or comments on a post. creator_posts returns the account's newest posts first, each with an outlier score (times its median) showing how far it beat that account's usual performance. If the user names a person without handles or links, ask for them before calling instead of guessing. To analyze a creator across platforms, call profile and creator_posts once per platform. Every response includes quota (lookups left today): if remaining is low, tell the user before starting a multi-call task.", {
|
|
217
|
+
action: z
|
|
218
|
+
.enum(["profile", "creator_posts", "post", "transcript", "comments", "search", "thread", "user_replies", "users"])
|
|
219
|
+
.describe("profile: account stats. creator_posts: an account's newest posts, newest first, each with an outlier score. post: one post's stats and full text. transcript: a video or reel's spoken words (not X). comments: comments/replies on a post. search: top posts for a keyword (Instagram searches reels). thread (X only): an X thread in order, from any tweet link in it. user_replies (X only): an account's tweets including its replies. users: several profiles in one call, target = comma-separated handles (max 20)."),
|
|
220
|
+
platform: z.enum(["x", "instagram", "youtube"]),
|
|
221
|
+
target: z
|
|
222
|
+
.string()
|
|
223
|
+
.describe("A @handle (profile, creator_posts, user_replies), comma-separated handles (users), a full post/reel/video link (post, transcript, comments, thread), or search words (search). X search accepts operators like from:naval, min_faves:500, since:2026-09-01, -filter:replies, lang:en."),
|
|
224
|
+
sort: z
|
|
225
|
+
.enum(["top", "latest"])
|
|
226
|
+
.optional()
|
|
227
|
+
.describe("search: 'latest' for the newest posts (X only), 'top' (default) for the best-performing. comments: YouTube only, top or latest."),
|
|
228
|
+
limit: z
|
|
229
|
+
.number()
|
|
230
|
+
.int()
|
|
231
|
+
.min(1)
|
|
232
|
+
.max(50)
|
|
233
|
+
.optional()
|
|
234
|
+
.describe("creator_posts, user_replies, comments, search: how many items to fetch. Leave it off for one page (~20). Only set it when the user wants more, e.g. 'their last 50 tweets': each extra page is another lookup against the daily limit."),
|
|
235
|
+
cursor: z
|
|
236
|
+
.union([z.string(), z.number()])
|
|
237
|
+
.optional()
|
|
238
|
+
.describe("Pass the previous response's `next` to continue. Transcripts come in pages (later pages are free); lists continue with the next page (each costs one lookup). `next: null` means the end."),
|
|
239
|
+
}, async ({ action, platform, target, sort, limit, cursor }) => {
|
|
240
|
+
const authErr = requireLocalAuth();
|
|
241
|
+
if (authErr)
|
|
242
|
+
return authErr;
|
|
243
|
+
const params = new URLSearchParams({ action, platform, target });
|
|
244
|
+
if (sort)
|
|
245
|
+
params.set("sort", sort);
|
|
246
|
+
if (limit !== undefined)
|
|
247
|
+
params.set("limit", String(limit));
|
|
248
|
+
if (cursor !== undefined)
|
|
249
|
+
params.set("cursor", String(cursor));
|
|
250
|
+
// The route waits on a vendor (up to 30s a call); limit= and users make
|
|
251
|
+
// several calls, so allow for a few before giving up.
|
|
252
|
+
const res = await apiFetch(`/api/buildpartner/social?${params.toString()}`, undefined, limit || action === "users" ? 120000 : 45000);
|
|
253
|
+
if (!res)
|
|
254
|
+
return textResponse(JSON.stringify({ error: "Could not reach BuildPartner. Check your internet connection." }));
|
|
255
|
+
if (res.status === 403)
|
|
256
|
+
return handleSubscriptionBlock(res);
|
|
257
|
+
// The feature flag 404s the route for accounts it isn't rolled out to yet.
|
|
258
|
+
if (res.status === 404)
|
|
259
|
+
return textResponse(JSON.stringify({ error: "Social Tools isn't available on this account yet." }));
|
|
260
|
+
// 400 (bad input), 429 (daily cap) and 502 (vendor failed) carry a plain-text message for the user.
|
|
261
|
+
if (res.status === 400 || res.status === 429 || res.status === 502) {
|
|
262
|
+
return textResponse(JSON.stringify({ error: await res.text() }));
|
|
263
|
+
}
|
|
264
|
+
if (!res.ok)
|
|
265
|
+
return textResponse(JSON.stringify({ error: friendlyError(res.status) }));
|
|
266
|
+
// Compact on purpose, like get_build: the route already keeps lists under 40KB.
|
|
267
|
+
return textResponse(JSON.stringify(await res.json()));
|
|
268
|
+
});
|
|
209
269
|
return server;
|
|
210
270
|
}
|
|
211
271
|
export async function startServer() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|