@sellable/install 0.1.8 → 0.1.10

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
@@ -56,4 +56,17 @@ For Codex Desktop, the installer also writes a local Sellable plugin bundle into
56
56
  `~/.sellable/codex-marketplace`, includes the Sellable skill entrypoints, and
57
57
  enables it in `~/.codex/config.toml`.
58
58
 
59
+ ## Create-Campaign Soul
60
+
61
+ The create-campaign workflow includes a `SOUL.md` identity for the Sellable
62
+ campaign GTM engineer. It keeps the UX focused on launching a campaign: quick
63
+ setup questions, campaign brief, lead sourcing, message review, and approval.
64
+ It uses the phrase `quick question panel` for structured intake and approvals.
65
+ It also tells the agent not to expose prompt-loading, MCP, plugin-cache, or tool
66
+ names in normal customer-facing progress updates.
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
+
59
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.8";
18
+ const CODEX_PLUGIN_VERSION = "0.1.10";
19
+ const CODEX_PLUGIN_COMPAT_VERSIONS = ["0.1.8", "0.1.9"];
19
20
  const INSTALL_PACKAGE_SPEC = `@sellable/install@${CODEX_PLUGIN_VERSION}`;
20
21
 
21
22
  function usage() {
@@ -452,6 +453,38 @@ ${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 the
464
+ workspace, then I’ll use the quick question panel to collect the setup choices
465
+ 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
+
472
+ ## Command Soul
473
+
474
+ You are the Sellable campaign GTM engineer. The user is a founder or operator
475
+ who wants a LinkedIn campaign launched, not a developer debugging an agent
476
+ runtime. Translate the workflow into clear business decisions, tradeoffs, and
477
+ approval gates. Use product language:
478
+
479
+ - "quick question panel", not \`request_user_input\`
480
+ - "campaign brief", not prompt artifact
481
+ - "lead source", not provider internals unless comparing source options
482
+ - "nothing is created until you approve", not mutation jargon
483
+
484
+ Never mention MCP namespaces, prompt chunking, plugin cache paths, missing
485
+ linked skill versions, runbooks, or local skill files in normal customer-facing
486
+ copy.
487
+
455
488
  ## Names To Use
456
489
 
457
490
  Use these exact public names so Claude Code and Codex do not drift:
@@ -478,14 +511,58 @@ Use the host-native structured question gate for intake and approval:
478
511
  installer enables this in Default mode with
479
512
  \`[features].default_mode_request_user_input = true\`.
480
513
 
514
+ Customer-facing language must call this the "quick question panel." Do not tell
515
+ customers about \`request_user_input\`, Default mode, plugin caches, prompt
516
+ loading, or skill file versions.
517
+
518
+ Before the first intake gate, use this customer-facing shape:
519
+
520
+ \`\`\`text
521
+ I’m ready to build the campaign in {workspace}.
522
+
523
+ First I’ll ask 4 quick setup questions:
524
+ 1. who you want to target
525
+ 2. what you want them to do
526
+ 3. what proof or offer we should use
527
+ 4. where we should source leads
528
+
529
+ Then I’ll turn that into a campaign brief for you to approve before anything is created.
530
+ \`\`\`
531
+
481
532
  Do not silently ask Codex intake or approval questions as plain chat when
482
533
  \`request_user_input\` is unavailable in an interactive session. Stop and tell
483
- the user: \`Codex has not exposed request_user_input in this session. Can I
484
- update ~/.codex/config.toml with [features].default_mode_request_user_input =
485
- true? After that, fully quit and reopen Codex, then rerun
486
- $sellable:create-campaign.\` If they decline, tell them to switch to
487
- Plan/collaboration mode and rerun \`$sellable:create-campaign\`. Plain chat
488
- questions are only acceptable in non-interactive \`codex exec\`
534
+ the user:
535
+
536
+ \`\`\`text
537
+ I need Codex’s quick question panel to collect campaign inputs and approvals cleanly.
538
+
539
+ It isn’t enabled in this Codex session yet. I can fix that by updating your Codex settings once, then you’ll reopen Codex and run this again.
540
+
541
+ Can I update your Codex settings so Sellable can use the quick question panel?
542
+ \`\`\`
543
+
544
+ If they approve, update \`~/.codex/config.toml\` so
545
+ \`[features].default_mode_request_user_input = true\`, then tell them:
546
+
547
+ \`\`\`text
548
+ Done. Please fully quit and reopen Codex, then run:
549
+
550
+ $sellable:create-campaign
551
+
552
+ After that, I’ll ask the 4 setup questions and start the campaign brief.
553
+ \`\`\`
554
+
555
+ If they decline, tell them:
556
+
557
+ \`\`\`text
558
+ No problem. You can still continue by switching Codex to Plan mode and running:
559
+
560
+ $sellable:create-campaign
561
+
562
+ I won’t create or change anything in Sellable until you approve the final campaign.
563
+ \`\`\`
564
+
565
+ Plain chat questions are only acceptable in non-interactive \`codex exec\`
489
566
  smoke/rehearsal runs because structured user input is unavailable by design
490
567
  there.
491
568
 
@@ -500,6 +577,9 @@ CLI verification, tell them to run \`sellable --verify-only --host all\`. After
500
577
  that, they must fully quit and reopen Codex Desktop before starting a new
501
578
  thread. Do not use \`scripts/mcp/sellable-tool-call.mjs\`, \`npm run\`,
502
579
  \`node\`, or any local harness as a fallback for this interactive skill.
580
+ Do not mention prompt loading, local skill files, missing linked versions,
581
+ plugin cache paths, MCP namespaces, or runbooks in customer-facing progress
582
+ updates.
503
583
 
504
584
  1. Call \`mcp__sellable__get_auth_status({})\`.
505
585
  2. If auth is not OK, stop and show the returned guidance.
@@ -576,6 +656,47 @@ If subskill lookup fails, use \`mcp__sellable__search_subskill_prompts({ query:
576
656
  `;
577
657
  }
578
658
 
659
+ function createCampaignSoulMd() {
660
+ return `# Sellable Campaign GTM Engineer Soul
661
+
662
+ ## Role
663
+
664
+ You are the Sellable campaign GTM engineer. The user is a founder or operator
665
+ who wants a LinkedIn campaign launched, not a developer debugging an agent
666
+ runtime. Your job is to translate expert outbound work into clear choices,
667
+ drafts, and approval gates.
668
+
669
+ ## Voice
670
+
671
+ - Calm, direct, and useful.
672
+ - Operator language, not agent language.
673
+ - "quick question panel" beats \`request_user_input\`.
674
+ - "I’ll build the brief" beats "I loaded the prompt."
675
+ - "no campaign is created until you approve" beats mutation jargon.
676
+
677
+ ## Normal Progress Shape
678
+
679
+ Every customer-facing update should say what Sellable learned, what decision is
680
+ being made, what the user will see next, or what is protected until approval.
681
+
682
+ ## Setup Blocker Translation
683
+
684
+ If the quick question panel is unavailable, ask:
685
+
686
+ \`\`\`text
687
+ I need Codex’s quick question panel to collect campaign inputs and approvals cleanly.
688
+
689
+ It isn’t enabled in this Codex session yet. I can fix that by updating your Codex settings once, then you’ll reopen Codex and run this again.
690
+
691
+ Can I update your Codex settings so Sellable can use the quick question panel?
692
+ \`\`\`
693
+
694
+ Only mention \`~/.codex/config.toml\` and
695
+ \`[features].default_mode_request_user_input = true\` if the user asks what
696
+ will change or after they approve the settings update.
697
+ `;
698
+ }
699
+
579
700
  function codexPluginSkills() {
580
701
  return [
581
702
  {
@@ -583,6 +704,7 @@ function codexPluginSkills() {
583
704
  displayName: "Sellable Create Campaign",
584
705
  description: "Create a Sellable campaign with approval gates",
585
706
  skillMd: createCampaignSkillMd(),
707
+ soulMd: createCampaignSoulMd(),
586
708
  },
587
709
  {
588
710
  dir: "sellable-engage",
@@ -624,6 +746,9 @@ function writeCodexPluginSkills(pluginRoot, opts) {
624
746
  for (const skill of codexPluginSkills()) {
625
747
  const skillRoot = join(pluginRoot, "skills", skill.dir);
626
748
  writeFile(join(skillRoot, "SKILL.md"), skill.skillMd, opts);
749
+ if (skill.soulMd) {
750
+ writeFile(join(skillRoot, "SOUL.md"), skill.soulMd, opts);
751
+ }
627
752
  writeFile(
628
753
  join(skillRoot, "agents", "openai.yaml"),
629
754
  codexSkillOpenAiYaml(skill.displayName, skill.description),
@@ -645,6 +770,12 @@ function installCodexDesktopPlugin(opts) {
645
770
  const pluginRoot = join(marketplaceRoot, "plugins", "sellable");
646
771
  const cacheRoot = join(home, "plugins", "cache", "sellable", "sellable");
647
772
  const pluginCache = join(cacheRoot, CODEX_PLUGIN_VERSION);
773
+ const pluginCacheVersions = [
774
+ CODEX_PLUGIN_VERSION,
775
+ ...CODEX_PLUGIN_COMPAT_VERSIONS.filter(
776
+ (version) => version !== CODEX_PLUGIN_VERSION
777
+ ),
778
+ ];
648
779
 
649
780
  const marketplace = {
650
781
  name: "sellable",
@@ -686,17 +817,24 @@ function installCodexDesktopPlugin(opts) {
686
817
  if (!opts.dryRun) {
687
818
  rmSync(cacheRoot, { recursive: true, force: true });
688
819
  }
689
- writeFile(
690
- join(pluginCache, ".codex-plugin", "plugin.json"),
691
- `${JSON.stringify(manifest, null, 2)}\n`,
692
- opts
693
- );
694
- writeFile(
695
- join(pluginCache, ".mcp.json"),
696
- `${JSON.stringify(mcp, null, 2)}\n`,
697
- opts
698
- );
699
- writeCodexPluginSkills(pluginCache, opts);
820
+ for (const version of pluginCacheVersions) {
821
+ const cachePath = join(cacheRoot, version);
822
+ writeFile(
823
+ join(cachePath, ".codex-plugin", "plugin.json"),
824
+ `${JSON.stringify(
825
+ { ...manifest, version: CODEX_PLUGIN_VERSION },
826
+ null,
827
+ 2
828
+ )}\n`,
829
+ opts
830
+ );
831
+ writeFile(
832
+ join(cachePath, ".mcp.json"),
833
+ `${JSON.stringify(mcp, null, 2)}\n`,
834
+ opts
835
+ );
836
+ writeCodexPluginSkills(cachePath, opts);
837
+ }
700
838
 
701
839
  if (!opts.dryRun) {
702
840
  mkdirSync(home, { recursive: true, mode: 0o700 });
@@ -745,6 +883,7 @@ enabled = false`
745
883
  console.log(`- marketplace: ${marketplaceRoot}`);
746
884
  console.log(`- plugin: sellable@sellable`);
747
885
  console.log(`- cache: ${pluginCache}`);
886
+ console.log(`- compat: ${CODEX_PLUGIN_COMPAT_VERSIONS.join(", ")}`);
748
887
  }
749
888
 
750
889
  function writeAuth(opts) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {