@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 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
@@ -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.25";
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 = `@sellable/install@${CODEX_PLUGIN_VERSION}`;
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 present it as a sender picker yet. If there is one strong
581
- likely sender, use \`mcp__sellable__enrich_sender\` to infer their current or
582
- most recent company, then ask a structured confirmation question:
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
- 1. \`Yes, that's me and this is for {company}\`
593
- 2. \`That's me, but this is for a different company\`
594
- 3. \`No, I'll paste my LinkedIn URL so you can look me up\`
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
- If the user chooses option 2, ask for the company website/domain and call
599
- \`mcp__sellable__fetch_company\` when possible, otherwise one web lookup. If the
600
- user chooses option 3, ask for their LinkedIn URL, call
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, then confirm company and sender again. If the user chooses option 4,
603
- ask for the company website/domain, call \`mcp__sellable__fetch_company\` when
604
- possible, otherwise one web lookup, then ask who the LinkedIn messages should
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. Ask for the user's LinkedIn URL or the
609
- company they want to send on behalf of so you can research context:
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, make the first setup choice ask for the
620
- user's LinkedIn URL or company website. The point of this gate is not "pick a
621
- sender"; it is to learn who the user is, infer the current or most recent
622
- company, and then confirm who we are sending from. The customer-facing shape
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
- The LinkedIn/company identity gate should ask:
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 LinkedIn account here. If I cant
908
- confirm it, Ill ask for your LinkedIn URL or company website and use that to
909
- understand the company before we choose the target, offer, proof, and lead
910
- source.
914
+ I’ll check whether you already have a connected sender here. If I find one, Ill
915
+ ask whether thats 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’ll first check whether you already have a connected sender here. If not, I’ll
923
- ask for your LinkedIn URL or company website and use that to understand the
924
- campaign before we choose the audience and offer.
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {