@sellable/install 0.1.25 → 0.1.27
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/README.md +7 -2
- package/bin/sellable-install.mjs +56 -40
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Installs Sellable MCP for Claude Code and Codex.
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npx -y @sellable/install --host all
|
|
6
|
+
npx -y @sellable/install@latest --host all
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
If you do not pass a token, the installer prompts you for one and shows where to get it.
|
|
@@ -11,9 +11,14 @@ If you do not pass a token, the installer prompts you for one and shows where to
|
|
|
11
11
|
The installer uses package stdio MCP by default:
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
npx -y @sellable/mcp
|
|
14
|
+
npx -y @sellable/mcp@latest
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
That keeps new Claude Code/Codex MCP starts on the latest stable package. The
|
|
18
|
+
MCP server also checks npm at startup and during `get_auth_status`, caching the
|
|
19
|
+
result at `~/.sellable/update-check.json` so users are prompted to rerun the
|
|
20
|
+
latest installer only when an update is actually available.
|
|
21
|
+
|
|
17
22
|
Get a Sellable API token from:
|
|
18
23
|
|
|
19
24
|
```text
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -14,8 +14,8 @@ import { createInterface } from "node:readline/promises";
|
|
|
14
14
|
|
|
15
15
|
const DEFAULT_API_URL = "https://app.sellable.dev";
|
|
16
16
|
const DEFAULT_SERVER_PACKAGE =
|
|
17
|
-
process.env.SELLABLE_MCP_PACKAGE || "@sellable/mcp";
|
|
18
|
-
const CODEX_PLUGIN_VERSION = "0.1.
|
|
17
|
+
process.env.SELLABLE_MCP_PACKAGE || "@sellable/mcp@latest";
|
|
18
|
+
const CODEX_PLUGIN_VERSION = "0.1.26";
|
|
19
19
|
const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
20
20
|
"0.1.8",
|
|
21
21
|
"0.1.9",
|
|
@@ -34,15 +34,17 @@ const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
|
34
34
|
"0.1.22",
|
|
35
35
|
"0.1.23",
|
|
36
36
|
"0.1.24",
|
|
37
|
+
"0.1.25",
|
|
37
38
|
];
|
|
38
|
-
const INSTALL_PACKAGE_SPEC =
|
|
39
|
+
const INSTALL_PACKAGE_SPEC =
|
|
40
|
+
process.env.SELLABLE_INSTALL_PACKAGE_SPEC || "@sellable/install@latest";
|
|
39
41
|
|
|
40
42
|
function usage() {
|
|
41
43
|
return `Sellable agent installer
|
|
42
44
|
|
|
43
45
|
Usage:
|
|
44
46
|
sellable-install [options]
|
|
45
|
-
npx -y @sellable/install -- [options]
|
|
47
|
+
npx -y @sellable/install@latest -- [options]
|
|
46
48
|
|
|
47
49
|
Options:
|
|
48
50
|
--host <host> claude, codex, or all. Default: all
|
|
@@ -541,6 +543,11 @@ Use the host-native structured question gate for intake and approval:
|
|
|
541
543
|
installer enables this in Default mode with
|
|
542
544
|
\`[features].default_mode_request_user_input = true\`.
|
|
543
545
|
|
|
546
|
+
Use the structured question gate only for multiple-choice decisions or approval
|
|
547
|
+
gates. Never use it to collect open text input like LinkedIn URLs, company
|
|
548
|
+
domains, notes, pasted context, campaign ideas, or feedback. For open text, ask
|
|
549
|
+
in normal chat and wait for the user to paste the value.
|
|
550
|
+
|
|
544
551
|
Customer-facing language must call this "a couple setup choices" during normal
|
|
545
552
|
campaign progress. Use "quick question panel" only when explaining a missing
|
|
546
553
|
Codex/Claude setup capability. Do not tell customers about \`request_user_input\`,
|
|
@@ -577,9 +584,10 @@ the campaign subject and sender before continuing.
|
|
|
577
584
|
If the user did not provide the launch identity, quietly call
|
|
578
585
|
\`mcp__sellable__list_senders\` once if available. This is a shortcut to deduce
|
|
579
586
|
who the user might be from their Sellable API token and connected LinkedIn
|
|
580
|
-
accounts. Do not
|
|
581
|
-
|
|
582
|
-
|
|
587
|
+
accounts. Do not ask the user to pick an input type before checking connected
|
|
588
|
+
senders. If there is any likely connected sender, use
|
|
589
|
+
\`mcp__sellable__enrich_sender\` on the best match to infer their current or most
|
|
590
|
+
recent company, then ask a structured confirmation question:
|
|
583
591
|
|
|
584
592
|
\`\`\`text
|
|
585
593
|
I’m ready to build this in {workspace}. I found {matched sender} connected here.
|
|
@@ -587,26 +595,30 @@ I’m ready to build this in {workspace}. I found {matched sender} connected her
|
|
|
587
595
|
Is that you, and is this campaign for {company}?
|
|
588
596
|
\`\`\`
|
|
589
597
|
|
|
590
|
-
The options must be:
|
|
598
|
+
The structured options must be no more than three choices:
|
|
599
|
+
|
|
600
|
+
1. \`Yes — use {matched sender} for {company}\`
|
|
601
|
+
2. \`No — I'll paste a LinkedIn profile\`
|
|
602
|
+
3. \`Use a company domain instead\`
|
|
591
603
|
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
4. \`No, I'll paste the company website instead\`
|
|
596
|
-
5. \`Other / custom\`
|
|
604
|
+
If there are multiple likely connected senders, mention the best one in the
|
|
605
|
+
question and use option 2 for either a different connected sender or a pasted
|
|
606
|
+
LinkedIn profile.
|
|
597
607
|
|
|
598
|
-
|
|
599
|
-
\`
|
|
600
|
-
user chooses option
|
|
608
|
+
Use the structured question tool only for the choice. Do not use
|
|
609
|
+
\`request_user_input\`/\`AskUserQuestion\` to collect a LinkedIn URL, company
|
|
610
|
+
domain, or freeform text. If the user chooses option 2, ask in normal chat:
|
|
611
|
+
\`Paste the LinkedIn URL I should use, and I’ll look it up.\` Then call
|
|
601
612
|
\`mcp__sellable__fetch_linkedin_profile\`, infer their current or most recent
|
|
602
|
-
company,
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
send from.
|
|
613
|
+
company, and confirm company and sender again. If the user chooses option 3, ask
|
|
614
|
+
in normal chat: \`Paste the company domain, and I’ll do a quick lookup before we
|
|
615
|
+
keep going.\` Then call \`mcp__sellable__fetch_company\` when possible, otherwise
|
|
616
|
+
one web lookup, and ask who the LinkedIn messages should send from.
|
|
606
617
|
|
|
607
618
|
If \`mcp__sellable__list_senders\` returns zero connected senders, avoid the
|
|
608
|
-
sender-confirmation branch entirely.
|
|
609
|
-
|
|
619
|
+
sender-confirmation branch entirely. Do not ask the user to choose an input type
|
|
620
|
+
with the structured question tool. Ask in normal chat for the user's LinkedIn
|
|
621
|
+
URL or the company they want to send on behalf of so you can research context:
|
|
610
622
|
|
|
611
623
|
\`\`\`text
|
|
612
624
|
I’m ready to build this in {workspace}.
|
|
@@ -616,11 +628,11 @@ behalf of. I’ll use that to understand the company before we pick the target,
|
|
|
616
628
|
offer, proof, and lead source.
|
|
617
629
|
\`\`\`
|
|
618
630
|
|
|
619
|
-
If there is no strong sender match,
|
|
620
|
-
|
|
621
|
-
sender"; it is to learn who the user is, infer the
|
|
622
|
-
company, and then confirm who we are sending from. The
|
|
623
|
-
should be:
|
|
631
|
+
If there is no strong sender match, do not show a structured choice that says
|
|
632
|
+
"LinkedIn profile" vs "Company website". The point of this gate is not "pick a
|
|
633
|
+
sender" or "pick an input type"; it is to learn who the user is, infer the
|
|
634
|
+
current or most recent company, and then confirm who we are sending from. The
|
|
635
|
+
customer-facing shape should be:
|
|
624
636
|
|
|
625
637
|
\`\`\`text
|
|
626
638
|
I’m ready to build this in {workspace}.
|
|
@@ -629,12 +641,7 @@ First, what’s your LinkedIn URL? If you’d rather start from the company, pas
|
|
|
629
641
|
the company website instead.
|
|
630
642
|
\`\`\`
|
|
631
643
|
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
1. \`What’s your LinkedIn URL?\` Options: \`I’ll paste my LinkedIn profile\`,
|
|
635
|
-
\`I’ll paste the company website instead\`, \`Other / custom\`.
|
|
636
|
-
|
|
637
|
-
After that answer, do the lightweight lookup. For a LinkedIn profile, call
|
|
644
|
+
After the user pastes a URL/domain, do the lightweight lookup. For a LinkedIn profile, call
|
|
638
645
|
\`mcp__sellable__fetch_linkedin_profile\` and infer the user's current or most
|
|
639
646
|
recent company from the profile. For a company website, call
|
|
640
647
|
\`mcp__sellable__fetch_company\` when possible, otherwise one web lookup.
|
|
@@ -904,10 +911,10 @@ brief before anything is created.
|
|
|
904
911
|
Good identity setup:
|
|
905
912
|
|
|
906
913
|
\`\`\`text
|
|
907
|
-
I’ll check whether you already have a connected
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
914
|
+
I’ll check whether you already have a connected sender here. If I find one, I’ll
|
|
915
|
+
ask whether that’s you and whether this campaign is for that company. If not,
|
|
916
|
+
just paste your LinkedIn URL or company domain and I’ll look it up before we
|
|
917
|
+
keep going.
|
|
911
918
|
\`\`\`
|
|
912
919
|
|
|
913
920
|
Bad:
|
|
@@ -919,9 +926,15 @@ First I’ll check whether your Sellable token already tells me who you are.
|
|
|
919
926
|
Better:
|
|
920
927
|
|
|
921
928
|
\`\`\`text
|
|
922
|
-
I
|
|
923
|
-
|
|
924
|
-
|
|
929
|
+
I found Christian Reyes connected here. Is that you, and is this campaign for
|
|
930
|
+
Sellable? If not, choose LinkedIn profile or company domain and I’ll ask you to
|
|
931
|
+
paste it in chat.
|
|
932
|
+
\`\`\`
|
|
933
|
+
|
|
934
|
+
Bad:
|
|
935
|
+
|
|
936
|
+
\`\`\`text
|
|
937
|
+
What should I use to confirm who this campaign is for?
|
|
925
938
|
\`\`\`
|
|
926
939
|
|
|
927
940
|
Bad:
|
|
@@ -1363,6 +1376,9 @@ async function main() {
|
|
|
1363
1376
|
console.log("Sellable installer");
|
|
1364
1377
|
console.log(`- host: ${opts.host}`);
|
|
1365
1378
|
console.log(`- server: ${opts.server}`);
|
|
1379
|
+
if (opts.server === "package") {
|
|
1380
|
+
console.log(`- mcp package: ${opts.mcpPackage}`);
|
|
1381
|
+
}
|
|
1366
1382
|
console.log(`- api: ${opts.apiUrl}`);
|
|
1367
1383
|
console.log(`- token: ${opts.token ? redact(opts.token) : "(missing)"}`);
|
|
1368
1384
|
|