@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 +13 -0
- package/bin/sellable-install.mjs +157 -18
- package/package.json +1 -1
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.
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -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.
|
|
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:
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
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
|
-
|
|
690
|
-
join(
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
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) {
|