@sellable/install 0.1.209 → 0.1.211

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.
@@ -771,7 +771,46 @@ function codexSkillOpenAiYaml(displayName, description) {
771
771
  `;
772
772
  }
773
773
 
774
- function createCampaignSkillMd() {
774
+ function createCampaignHostContract(host) {
775
+ if (host === "codex") {
776
+ return `## Installed Host Contract
777
+
778
+ This installed skill is running in Codex. Treat Codex as the current host, use
779
+ \`request_user_input\` for structured questions when it is exposed, use
780
+ \`$sellable:create-campaign\` in user-facing retry instructions, and call
781
+ \`mcp__sellable__bootstrap_create_campaign\` with \`host: "Codex"\` plus the
782
+ current Codex model and reasoning when available.
783
+
784
+ Do not describe this run as Claude Code and do not recommend Claude Code-only
785
+ commands or settings from this Codex skill.`;
786
+ }
787
+
788
+ if (host === "claude") {
789
+ return `## Installed Host Contract
790
+
791
+ This installed command is running in Claude Code. Treat Claude Code as the
792
+ current host, use \`AskUserQuestion\` for structured questions, use
793
+ \`/sellable:create-campaign\` in user-facing retry instructions, and call
794
+ \`mcp__sellable__bootstrap_create_campaign\` with \`host: "Claude Code"\` plus
795
+ the current Claude Code model and reasoning when available.
796
+
797
+ Do not describe this run as Codex and do not recommend Codex-only commands or
798
+ settings from this Claude Code command.`;
799
+ }
800
+
801
+ return "";
802
+ }
803
+
804
+ function addCreateCampaignHostContract(markdown, host) {
805
+ const contract = createCampaignHostContract(host);
806
+ if (!contract) return markdown;
807
+ return String(markdown).replace(
808
+ "\n# Sellable Create Campaign\n",
809
+ `\n# Sellable Create Campaign\n\n${contract}\n`
810
+ );
811
+ }
812
+
813
+ function createCampaignSkillMd({ host = "shared" } = {}) {
775
814
  // Single source of truth: ../skill-templates/create-campaign.md, which is
776
815
  // copied from the canonical mcp/sellable/skills/create-campaign/SKILL.md at
777
816
  // publish time via scripts/sync-skill-templates.mjs (prepublishOnly hook).
@@ -786,7 +825,10 @@ function createCampaignSkillMd() {
786
825
  "create-campaign.md"
787
826
  );
788
827
  if (existsSync(templatePath)) {
789
- return readFileSync(templatePath, "utf8");
828
+ return addCreateCampaignHostContract(
829
+ readFileSync(templatePath, "utf8"),
830
+ host
831
+ );
790
832
  }
791
833
  } catch {
792
834
  // fall through to hardcoded fallback below
@@ -814,11 +856,17 @@ person/company this campaign is for, then I’ll turn that into a campaign brief
814
856
  before anything is created.
815
857
  \`\`\`
816
858
 
817
- Exception: if \`bootstrap_create_campaign.modelQuality.status === "warn"\`,
818
- the first visible campaign message must be the model-quality warning from
859
+ Exception: if \`bootstrap_create_campaign.modelQuality.status === "warn"\` and
860
+ \`bootstrap_create_campaign.modelQuality.metadataStale !== true\`, the first
861
+ visible campaign message must be the model-quality warning from
819
862
  \`modelQuality.message\`. Ask the user to switch to the configured minimum model
820
863
  or explicitly continue anyway before identity setup, research, lead filtering,
821
- message generation, or launch review.
864
+ message generation, or launch review. If \`metadataStale === true\`, continue
865
+ normally and do not ask the user to switch.
866
+
867
+ If \`bootstrap_create_campaign.modelQuality.metadataStale === true\`, continue
868
+ normally. Do not ask the user to switch models; this is an accepted Codex host
869
+ metadata mismatch.
822
870
 
823
871
  If a linked/local skill file is stale or missing, silently use the installed
824
872
  \`sellable@sellable\` plugin copy. Do not tell the user about the stale link,
@@ -1260,8 +1308,10 @@ updates.
1260
1308
  5. Call \`mcp__sellable__bootstrap_create_campaign({ flowVersion: "v2", campaignId?, host?, model?, reasoningEffort? })\`.
1261
1309
  Pass the current host, model, and reasoning when the host exposes them.
1262
1310
  6. If \`safeToProceed !== true\`, stop and show \`blockingErrors\` + \`nextStep\`.
1263
- 7. If \`modelQuality.status === "warn"\`, show \`modelQuality.message\` before any
1264
- setup/research and wait for the user to switch or explicitly continue.
1311
+ 7. If \`modelQuality.status === "warn"\` and \`modelQuality.metadataStale !== true\`,
1312
+ show \`modelQuality.message\` before any setup/research and wait for the user
1313
+ to switch or explicitly continue. If \`metadataStale === true\`, continue
1314
+ normally and do not tell the user to switch.
1265
1315
 
1266
1316
  ## Execute Workflow
1267
1317
 
@@ -1819,7 +1869,7 @@ function codexPluginSkills() {
1819
1869
  dir: "sellable-create-campaign",
1820
1870
  displayName: "Sellable Create Campaign",
1821
1871
  description: "Create a Sellable campaign with approval gates",
1822
- skillMd: createCampaignSkillMd(),
1872
+ skillMd: createCampaignSkillMd({ host: "codex" }),
1823
1873
  soulMd: createCampaignSoulMd(),
1824
1874
  },
1825
1875
  {
@@ -2043,7 +2093,7 @@ function claudeCommands() {
2043
2093
  filename: join("sellable", "create-campaign.md"),
2044
2094
  description: "Create a Sellable campaign through the approval-gated workflow.",
2045
2095
  argumentHint: "[campaign goal, company, or offer]",
2046
- skillMd: createCampaignSkillMd(),
2096
+ skillMd: createCampaignSkillMd({ host: "claude" }),
2047
2097
  allowedTools: ["AskUserQuestion", "Task", ...CREATE_CAMPAIGN_ALLOWED_TOOLS],
2048
2098
  },
2049
2099
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.209",
3
+ "version": "0.1.211",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -179,11 +179,17 @@ person/company this campaign is for, then I’ll turn that into a campaign brief
179
179
  before we move into lead sourcing.
180
180
  ```
181
181
 
182
- Exception: if `bootstrap_create_campaign.modelQuality.status === "warn"`,
183
- the first visible campaign message must be the model-quality warning from
182
+ Exception: if `bootstrap_create_campaign.modelQuality.status === "warn"` and
183
+ `bootstrap_create_campaign.modelQuality.metadataStale !== true`, the first
184
+ visible campaign message must be the model-quality warning from
184
185
  `modelQuality.message`. Ask the user to switch to the configured minimum model
185
186
  or explicitly continue anyway before identity setup, research, lead filtering,
186
- message generation, or launch review.
187
+ message generation, or launch review. If `metadataStale === true`, continue
188
+ normally and do not ask the user to switch.
189
+
190
+ If `bootstrap_create_campaign.modelQuality.metadataStale === true`, continue
191
+ normally. Do not ask the user to switch models; this is an accepted Codex host
192
+ metadata mismatch.
187
193
 
188
194
  If a linked/local skill file is stale or missing, silently use the installed
189
195
  `sellable@sellable` plugin copy. Do not tell the user about the stale link,
@@ -769,9 +775,10 @@ messages, and wait for final launch approval.
769
775
  What's your LinkedIn profile URL or handle?
770
776
  ```
771
777
 
772
- Do not silently ask Codex intake or approval questions as plain chat when
773
- `request_user_input` is unavailable in an interactive session. Stop and tell
774
- the user:
778
+ Codex only: do not silently ask intake or approval questions as plain chat when
779
+ `request_user_input` is unavailable in an interactive Codex session. Claude Code
780
+ uses `AskUserQuestion`; do not apply this Codex setup blocker in Claude Code.
781
+ In Codex, stop and tell the user:
775
782
 
776
783
  ```text
777
784
  I need Codex’s quick question panel to collect campaign inputs and approvals cleanly.
@@ -810,17 +817,18 @@ there.
810
817
  ## Bootstrap
811
818
 
812
819
  MCP tool access is required. First call `mcp__sellable__get_auth_status({})`
813
- directly. If that tool is unavailable, stop and say this is a Codex
814
- install/reload problem, not a campaign problem. Tell the user to
815
- run `curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | sh` so the
816
- packaged MCP server, Codex Desktop plugin, and Sellable skill bundle are
817
- installed. If they want an agent-readable checklist, tell them:
820
+ directly. If that tool is unavailable, stop and say this is a Sellable
821
+ install/reload problem for the current host, not a campaign problem. Tell the
822
+ user to run `curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | sh` so
823
+ the packaged MCP server and the current host integration are installed. If they
824
+ want an agent-readable checklist, tell them:
818
825
  `Install Sellable CLI and skills using https://app.sellable.dev/agent-install.txt`.
819
826
  For CLI verification, tell them to run
820
827
  `sellable --verify-only --host all --json --artifact "$HOME/.local/sellable/app-sellable-dev/installer/.last-verify.json"`.
821
- After that, they must fully quit and reopen Codex Desktop before starting a new
822
- thread. Do not use `scripts/mcp/sellable-tool-call.mjs`, `npm run`, `node`, or
823
- any local harness as a fallback for this interactive skill.
828
+ After that, they must fully quit and reopen the current host app before starting
829
+ a new thread. In Codex, say Codex Desktop. In Claude Code, say Claude Code. Do
830
+ not use `scripts/mcp/sellable-tool-call.mjs`, `npm run`, `node`, or any local
831
+ harness as a fallback for this interactive skill.
824
832
  Do not mention prompt loading, local skill files, missing linked versions,
825
833
  plugin cache paths, MCP namespaces, or runbooks in customer-facing progress
826
834
  updates.
@@ -932,11 +940,15 @@ updates.
932
940
  - Do not call `mcp__sellable__get_campaigns`.
933
941
  - Do not call `mcp__sellable__get_campaign` to hunt for IDs.
934
942
  - Do not call `mcp__sellable__create_campaign({ campaignId: ... })` unless the user supplied that id.
935
- 6. Call `mcp__sellable__bootstrap_create_campaign({ flowVersion: "v2", campaignId?, host?, model?, reasoningEffort? })`.
936
- Pass the current host, model, and reasoning when the host exposes them.
943
+ 6. Call `mcp__sellable__bootstrap_create_campaign({ flowVersion: "v2", campaignId?, host, model?, reasoningEffort? })`.
944
+ Pass the explicit current host label: `host: "Codex"` from Codex and
945
+ `host: "Claude Code"` from Claude Code. Also pass the current model and
946
+ reasoning when the host exposes them.
937
947
  7. If `safeToProceed !== true`, stop and show `blockingErrors` + `nextStep`.
938
- 8. If `modelQuality.status === "warn"`, show `modelQuality.message` before any
939
- setup/research and wait for the user to switch or explicitly continue.
948
+ 8. If `modelQuality.status === "warn"` and `modelQuality.metadataStale !== true`,
949
+ show `modelQuality.message` before any setup/research and wait for the user
950
+ to switch or explicitly continue. If `metadataStale === true`, continue
951
+ normally and do not tell the user to switch.
940
952
 
941
953
  ## Execute Workflow
942
954