@sellable/install 0.1.9 → 0.1.11

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
@@ -65,4 +65,8 @@ It uses the phrase `quick question panel` for structured intake and approvals.
65
65
  It also tells the agent not to expose prompt-loading, MCP, plugin-cache, or tool
66
66
  names in normal customer-facing progress updates.
67
67
 
68
+ The installer writes compatibility cache aliases for recent Codex plugin
69
+ versions so stale Desktop skill links resolve to the current wrapper instead of
70
+ showing file/version debugging to the user.
71
+
68
72
  If only one host is installed, `--host all` installs the available host and tells you how to add the other one later.
@@ -15,7 +15,8 @@ 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.9";
18
+ const CODEX_PLUGIN_VERSION = "0.1.11";
19
+ const CODEX_PLUGIN_COMPAT_VERSIONS = ["0.1.8", "0.1.9", "0.1.10"];
19
20
  const INSTALL_PACKAGE_SPEC = `@sellable/install@${CODEX_PLUGIN_VERSION}`;
20
21
 
21
22
  function usage() {
@@ -452,6 +453,22 @@ ${allowedToolsYaml(CREATE_CAMPAIGN_ALLOWED_TOOLS)}
452
453
 
453
454
  Use this as the customer-facing entrypoint for Sellable campaign creation.
454
455
 
456
+ ## Opening Turn Contract
457
+
458
+ On the first visible response after this skill is invoked, do not narrate
459
+ instruction loading, file lookup, plugin cache versions, missing linked files,
460
+ or tool discovery. Start in product language:
461
+
462
+ \`\`\`text
463
+ I’ll build this as an approval-gated Sellable campaign. First I’ll confirm who
464
+ we’re launching for, then I’ll use the quick question panel to collect the
465
+ campaign choices before anything is created.
466
+ \`\`\`
467
+
468
+ If a linked/local skill file is stale or missing, silently use the installed
469
+ \`sellable@sellable\` plugin copy. Do not tell the user about the stale link,
470
+ the old version, or the replacement path.
471
+
455
472
  ## Command Soul
456
473
 
457
474
  You are the Sellable campaign GTM engineer. The user is a founder or operator
@@ -498,16 +515,45 @@ Customer-facing language must call this the "quick question panel." Do not tell
498
515
  customers about \`request_user_input\`, Default mode, plugin caches, prompt
499
516
  loading, or skill file versions.
500
517
 
501
- Before the first intake gate, use this customer-facing shape:
518
+ ## Identity-First Campaign Setup
519
+
520
+ Do not treat the active Sellable workspace as the campaign subject. The
521
+ workspace only tells you where the campaign will be saved. Before buyer, CTA,
522
+ proof, or source questions, identify and confirm who the campaign is launching
523
+ for.
524
+
525
+ If the user supplied a LinkedIn profile, website, domain, company name, or
526
+ sender name in the invocation, do one lightweight lookup first:
527
+
528
+ - LinkedIn profile: call \`mcp__sellable__fetch_linkedin_profile\`.
529
+ - Website/domain/company: call \`mcp__sellable__fetch_company\` when possible,
530
+ otherwise one web lookup.
531
+ - Workspace sender id or known sender: call \`mcp__sellable__get_sender\` or
532
+ \`mcp__sellable__enrich_sender\`.
533
+
534
+ Then summarize what you found in one or two lines and ask the user to confirm
535
+ the launch identity before continuing.
536
+
537
+ If the user did not provide the launch identity, make the first quick question
538
+ panel an identity gate. Ask who we are launching for, with options like:
539
+
540
+ 1. Use one of my connected Sellable senders
541
+ 2. I’ll paste a LinkedIn profile
542
+ 3. I’ll paste a company website/domain
543
+ 4. Other / custom
544
+
545
+ After that answer, do the lightweight lookup, confirm the company/sender
546
+ context, then ask the campaign setup questions. The setup questions should use
547
+ the confirmed company context so they do not feel generic.
548
+
549
+ Before the identity gate, use this customer-facing shape:
502
550
 
503
551
  \`\`\`text
504
552
  I’m ready to build the campaign in {workspace}.
505
553
 
506
- First I’ll ask 4 quick setup questions:
507
- 1. who you want to target
508
- 2. what you want them to do
509
- 3. what proof or offer we should use
510
- 4. where we should source leads
554
+ First I need to confirm who were launching for. If you give me a LinkedIn
555
+ profile or company website, I’ll use that to understand the company, then I’ll
556
+ confirm it with you before we pick the target, offer, proof, and lead source.
511
557
 
512
558
  Then I’ll turn that into a campaign brief for you to approve before anything is created.
513
559
  \`\`\`
@@ -532,7 +578,8 @@ Done. Please fully quit and reopen Codex, then run:
532
578
 
533
579
  $sellable:create-campaign
534
580
 
535
- After that, I’ll ask the 4 setup questions and start the campaign brief.
581
+ After that, I’ll confirm who we’re launching for, then ask the setup questions
582
+ and start the campaign brief.
536
583
  \`\`\`
537
584
 
538
585
  If they decline, tell them:
@@ -753,6 +800,12 @@ function installCodexDesktopPlugin(opts) {
753
800
  const pluginRoot = join(marketplaceRoot, "plugins", "sellable");
754
801
  const cacheRoot = join(home, "plugins", "cache", "sellable", "sellable");
755
802
  const pluginCache = join(cacheRoot, CODEX_PLUGIN_VERSION);
803
+ const pluginCacheVersions = [
804
+ CODEX_PLUGIN_VERSION,
805
+ ...CODEX_PLUGIN_COMPAT_VERSIONS.filter(
806
+ (version) => version !== CODEX_PLUGIN_VERSION
807
+ ),
808
+ ];
756
809
 
757
810
  const marketplace = {
758
811
  name: "sellable",
@@ -794,17 +847,24 @@ function installCodexDesktopPlugin(opts) {
794
847
  if (!opts.dryRun) {
795
848
  rmSync(cacheRoot, { recursive: true, force: true });
796
849
  }
797
- writeFile(
798
- join(pluginCache, ".codex-plugin", "plugin.json"),
799
- `${JSON.stringify(manifest, null, 2)}\n`,
800
- opts
801
- );
802
- writeFile(
803
- join(pluginCache, ".mcp.json"),
804
- `${JSON.stringify(mcp, null, 2)}\n`,
805
- opts
806
- );
807
- writeCodexPluginSkills(pluginCache, opts);
850
+ for (const version of pluginCacheVersions) {
851
+ const cachePath = join(cacheRoot, version);
852
+ writeFile(
853
+ join(cachePath, ".codex-plugin", "plugin.json"),
854
+ `${JSON.stringify(
855
+ { ...manifest, version: CODEX_PLUGIN_VERSION },
856
+ null,
857
+ 2
858
+ )}\n`,
859
+ opts
860
+ );
861
+ writeFile(
862
+ join(cachePath, ".mcp.json"),
863
+ `${JSON.stringify(mcp, null, 2)}\n`,
864
+ opts
865
+ );
866
+ writeCodexPluginSkills(cachePath, opts);
867
+ }
808
868
 
809
869
  if (!opts.dryRun) {
810
870
  mkdirSync(home, { recursive: true, mode: 0o700 });
@@ -853,6 +913,7 @@ enabled = false`
853
913
  console.log(`- marketplace: ${marketplaceRoot}`);
854
914
  console.log(`- plugin: sellable@sellable`);
855
915
  console.log(`- cache: ${pluginCache}`);
916
+ console.log(`- compat: ${CODEX_PLUGIN_COMPAT_VERSIONS.join(", ")}`);
856
917
  }
857
918
 
858
919
  function writeAuth(opts) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {