@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 +4 -0
- package/bin/sellable-install.mjs +80 -19
- package/package.json +1 -1
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.
|
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.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
|
-
|
|
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’
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
3. what proof or offer we should use
|
|
510
|
-
4. where we should source leads
|
|
554
|
+
First I need to confirm who we’re 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
|
|
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
|
-
|
|
798
|
-
join(
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
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) {
|