@sellable/install 0.1.12 → 0.1.14
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/bin/sellable-install.mjs +77 -35
- package/package.json +1 -1
package/bin/sellable-install.mjs
CHANGED
|
@@ -15,8 +15,15 @@ import { createInterface } from "node:readline/promises";
|
|
|
15
15
|
const DEFAULT_API_URL = "https://app.sellable.dev";
|
|
16
16
|
const DEFAULT_SERVER_PACKAGE =
|
|
17
17
|
process.env.SELLABLE_MCP_PACKAGE || "@sellable/mcp";
|
|
18
|
-
const CODEX_PLUGIN_VERSION = "0.1.
|
|
19
|
-
const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
18
|
+
const CODEX_PLUGIN_VERSION = "0.1.14";
|
|
19
|
+
const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
20
|
+
"0.1.8",
|
|
21
|
+
"0.1.9",
|
|
22
|
+
"0.1.10",
|
|
23
|
+
"0.1.11",
|
|
24
|
+
"0.1.12",
|
|
25
|
+
"0.1.13",
|
|
26
|
+
];
|
|
20
27
|
const INSTALL_PACKAGE_SPEC = `@sellable/install@${CODEX_PLUGIN_VERSION}`;
|
|
21
28
|
|
|
22
29
|
function usage() {
|
|
@@ -460,9 +467,9 @@ instruction loading, file lookup, plugin cache versions, missing linked files,
|
|
|
460
467
|
or tool discovery. Start in product language:
|
|
461
468
|
|
|
462
469
|
\`\`\`text
|
|
463
|
-
I’ll build this as an approval-gated Sellable campaign. First I’ll
|
|
464
|
-
|
|
465
|
-
|
|
470
|
+
I’ll build this as an approval-gated Sellable campaign. First I’ll ask who you
|
|
471
|
+
are, use your LinkedIn or company site to understand the company, then confirm
|
|
472
|
+
the sender before anything is created.
|
|
466
473
|
\`\`\`
|
|
467
474
|
|
|
468
475
|
If a linked/local skill file is stale or missing, silently use the installed
|
|
@@ -536,54 +543,89 @@ sender name in the invocation, do one lightweight lookup first:
|
|
|
536
543
|
Then summarize what you found in one or two lines and ask the user to confirm
|
|
537
544
|
the campaign subject and sender before continuing.
|
|
538
545
|
|
|
539
|
-
If the user did not provide the launch identity,
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
546
|
+
If the user did not provide the launch identity, quietly call
|
|
547
|
+
\`mcp__sellable__list_senders\` once if available. This is a shortcut to deduce
|
|
548
|
+
who the user might be from their Sellable API token and connected LinkedIn
|
|
549
|
+
accounts. Do not present it as a sender picker yet. If there is one strong
|
|
550
|
+
likely sender, use \`mcp__sellable__enrich_sender\` to infer their current or
|
|
551
|
+
most recent company, then ask a structured confirmation question:
|
|
552
|
+
|
|
553
|
+
\`\`\`text
|
|
554
|
+
I’m ready to build this in {workspace}. I found {matched sender} connected here.
|
|
555
|
+
|
|
556
|
+
Is that you, and is this campaign for {company}?
|
|
557
|
+
\`\`\`
|
|
544
558
|
|
|
545
|
-
The
|
|
559
|
+
The options must be:
|
|
560
|
+
|
|
561
|
+
1. \`Yes, that's me and this is for {company}\`
|
|
562
|
+
2. \`That's me, but this is for a different company\`
|
|
563
|
+
3. \`No, I'll paste my LinkedIn URL so you can look me up\`
|
|
564
|
+
4. \`No, I'll paste the company website instead\`
|
|
565
|
+
5. \`Other / custom\`
|
|
566
|
+
|
|
567
|
+
If the user chooses option 2, ask for the company website/domain and call
|
|
568
|
+
\`mcp__sellable__fetch_company\` when possible, otherwise one web lookup. If the
|
|
569
|
+
user chooses option 3, ask for their LinkedIn URL, call
|
|
570
|
+
\`mcp__sellable__fetch_linkedin_profile\`, infer their current or most recent
|
|
571
|
+
company, then confirm company and sender again. If the user chooses option 4,
|
|
572
|
+
ask for the company website/domain, call \`mcp__sellable__fetch_company\` when
|
|
573
|
+
possible, otherwise one web lookup, then ask who the LinkedIn messages should
|
|
574
|
+
send from.
|
|
575
|
+
|
|
576
|
+
If there is no strong sender match, make the first quick question panel ask for
|
|
577
|
+
the user's LinkedIn URL or company website. The point of this gate is not "pick
|
|
578
|
+
a sender"; it is to learn who the user is, infer the current or most recent
|
|
579
|
+
company, and then confirm who we are sending from. The customer-facing shape
|
|
580
|
+
should be:
|
|
546
581
|
|
|
547
582
|
\`\`\`text
|
|
548
|
-
I
|
|
583
|
+
I’m ready to build this in {workspace}.
|
|
549
584
|
|
|
550
|
-
First
|
|
551
|
-
|
|
552
|
-
URL or company website.
|
|
585
|
+
First, what’s your LinkedIn URL? If you’d rather start from the company, paste
|
|
586
|
+
the company website instead.
|
|
553
587
|
\`\`\`
|
|
554
588
|
|
|
555
|
-
The identity gate should ask:
|
|
589
|
+
The LinkedIn/company identity gate should ask:
|
|
590
|
+
|
|
591
|
+
1. \`What’s your LinkedIn URL?\` Options: \`I’ll paste my LinkedIn profile\`,
|
|
592
|
+
\`I’ll paste the company website instead\`, \`Other / custom\`.
|
|
556
593
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
connected sender names if available, \`I’ll paste a different sender profile\`,
|
|
562
|
-
\`Other / custom\`.
|
|
594
|
+
After that answer, do the lightweight lookup. For a LinkedIn profile, call
|
|
595
|
+
\`mcp__sellable__fetch_linkedin_profile\` and infer the user's current or most
|
|
596
|
+
recent company from the profile. For a company website, call
|
|
597
|
+
\`mcp__sellable__fetch_company\` when possible, otherwise one web lookup.
|
|
563
598
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
\`mcp__sellable__fetch_linkedin_profile\` and infer the current or most recent
|
|
568
|
-
company from the profile. Then ask:
|
|
599
|
+
If \`mcp__sellable__list_senders\` did not already run, call it once after the
|
|
600
|
+
lookup to see whether the fetched user appears to match a connected sender. If
|
|
601
|
+
there is a likely match, ask:
|
|
569
602
|
|
|
570
603
|
\`\`\`text
|
|
571
|
-
Cool —
|
|
604
|
+
Cool — are you {matched sender}, and is this campaign for {company}?
|
|
572
605
|
\`\`\`
|
|
573
606
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
company
|
|
607
|
+
If there is no likely sender match, ask:
|
|
608
|
+
|
|
609
|
+
\`\`\`text
|
|
610
|
+
Cool — I have this campaign as {company}. Who should the LinkedIn messages send from?
|
|
611
|
+
\`\`\`
|
|
612
|
+
|
|
613
|
+
Sender options should include connected sender names if available, \`same as
|
|
614
|
+
me\`, \`I’ll paste a different sender profile\`, and \`Other / custom\`.
|
|
615
|
+
|
|
616
|
+
After the user confirms the subject and sender, run one lightweight company
|
|
617
|
+
lookup if it has not already run, then ask the campaign setup questions. The
|
|
618
|
+
setup questions should use the confirmed company context so they do not feel
|
|
619
|
+
generic.
|
|
578
620
|
|
|
579
621
|
Before the identity gate, use this customer-facing shape:
|
|
580
622
|
|
|
581
623
|
\`\`\`text
|
|
582
624
|
I’m ready to build the campaign in {workspace}.
|
|
583
625
|
|
|
584
|
-
First I
|
|
585
|
-
|
|
586
|
-
|
|
626
|
+
First I’ll check whether your Sellable token already tells me who you are. If
|
|
627
|
+
not, I’ll ask for your LinkedIn URL or company website, look it up, then confirm
|
|
628
|
+
the company and sender before we pick the target, offer, proof, and lead source.
|
|
587
629
|
|
|
588
630
|
Then I’ll turn that into a campaign brief for you to approve before anything is created.
|
|
589
631
|
\`\`\`
|