@sellable/install 0.1.102 → 0.1.103
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 +5 -3
- package/bin/sellable-install.mjs +31 -23
- package/package.json +2 -2
- package/skill-templates/create-campaign.md +34 -23
package/README.md
CHANGED
|
@@ -16,7 +16,8 @@ sellable create
|
|
|
16
16
|
Campaign creation itself runs inside Claude Code or Codex, where the Sellable
|
|
17
17
|
MCP tools and approval flow are available.
|
|
18
18
|
|
|
19
|
-
If you do not pass a token, the
|
|
19
|
+
Install is auth-free by default. If you do not pass a token, the agent handles
|
|
20
|
+
Sellable sign-in on the first campaign run with a magic-link handoff.
|
|
20
21
|
|
|
21
22
|
The installer uses package stdio MCP by default:
|
|
22
23
|
|
|
@@ -29,13 +30,14 @@ MCP server also checks npm at startup and during `get_auth_status`, caching the
|
|
|
29
30
|
result at `~/.sellable/update-check.json` so users are prompted to rerun the
|
|
30
31
|
latest installer only when an update is actually available.
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
For CI/scripted installs, get a Sellable API token from:
|
|
33
34
|
|
|
34
35
|
```text
|
|
35
36
|
https://app.sellable.dev/settings
|
|
36
37
|
```
|
|
37
38
|
|
|
38
|
-
Then
|
|
39
|
+
Then pass it with `--token` / `SELLABLE_TOKEN` plus `--workspace-id` /
|
|
40
|
+
`SELLABLE_WORKSPACE_ID`.
|
|
39
41
|
|
|
40
42
|
Auth is stored once at:
|
|
41
43
|
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -40,7 +40,7 @@ function getMcpVersion() {
|
|
|
40
40
|
} catch {}
|
|
41
41
|
return "latest";
|
|
42
42
|
}
|
|
43
|
-
const CODEX_PLUGIN_VERSION = "0.1.
|
|
43
|
+
const CODEX_PLUGIN_VERSION = "0.1.31";
|
|
44
44
|
const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
45
45
|
"0.1.8",
|
|
46
46
|
"0.1.9",
|
|
@@ -508,6 +508,8 @@ function codexPluginMcp(opts) {
|
|
|
508
508
|
|
|
509
509
|
const CREATE_CAMPAIGN_ALLOWED_TOOLS = [
|
|
510
510
|
"mcp__sellable__get_auth_status",
|
|
511
|
+
"mcp__sellable__start_cli_login",
|
|
512
|
+
"mcp__sellable__wait_for_cli_login",
|
|
511
513
|
"mcp__sellable__bootstrap_create_campaign",
|
|
512
514
|
"mcp__sellable__get_subskill_prompt",
|
|
513
515
|
"mcp__sellable__get_subskill_asset",
|
|
@@ -518,7 +520,6 @@ const CREATE_CAMPAIGN_ALLOWED_TOOLS = [
|
|
|
518
520
|
"mcp__sellable__get_active_workspace",
|
|
519
521
|
"mcp__sellable__list_senders",
|
|
520
522
|
"mcp__sellable__get_sender",
|
|
521
|
-
"mcp__sellable__enrich_sender",
|
|
522
523
|
"mcp__sellable__complete_sender_research",
|
|
523
524
|
"mcp__sellable__fetch_linkedin_profile",
|
|
524
525
|
"mcp__sellable__fetch_linkedin_posts",
|
|
@@ -556,7 +557,6 @@ const CREATE_CAMPAIGN_ALLOWED_TOOLS = [
|
|
|
556
557
|
"mcp__sellable__load_csv_linkedin_leads",
|
|
557
558
|
"mcp__sellable__load_csv_domains",
|
|
558
559
|
"mcp__sellable__queue_cells",
|
|
559
|
-
"mcp__sellable__generate_messages",
|
|
560
560
|
"mcp__sellable__get_campaign_messages_preview",
|
|
561
561
|
"mcp__sellable__attach_sequence",
|
|
562
562
|
"mcp__sellable__attach_recommended_sequence",
|
|
@@ -647,7 +647,8 @@ signals, cleanup risk, and confidence basis. If a user asks for a forecast,
|
|
|
647
647
|
label it explicitly as not estimated from this run.
|
|
648
648
|
|
|
649
649
|
Before any provider prompt, search, source scout, or signal-discovery call,
|
|
650
|
-
show a short source-plan gate and ask for approval.
|
|
650
|
+
show a short source-plan gate and ask for approval. This first approval
|
|
651
|
+
authorizes scouting/search only. The gate should say:
|
|
651
652
|
|
|
652
653
|
- given this campaign, the viable source options
|
|
653
654
|
- the recommended first lane
|
|
@@ -656,14 +657,19 @@ show a short source-plan gate and ask for approval. The gate should say:
|
|
|
656
657
|
- the fallback lane if relevant posts or ICP engagement look thin
|
|
657
658
|
- that approval authorizes scouting/search only, not lead import or sending
|
|
658
659
|
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
\`
|
|
665
|
-
|
|
666
|
-
|
|
660
|
+
Do not surface blanket source heuristics as product copy. Make the
|
|
661
|
+
recommendation specific to the campaign. If Signal Discovery is recommended,
|
|
662
|
+
name the exact post themes you will search. If relevant public conversations
|
|
663
|
+
look unlikely, recommend the specific Sales Nav or Prospeo lane instead and say
|
|
664
|
+
why. Do not call \`search_signals\`, \`search_sales_nav\`, \`search_prospeo\`,
|
|
665
|
+
\`fetch_post_engagers\`, or provider-scoped subagents until the user approves this
|
|
666
|
+
source plan or explicitly chooses a different source.
|
|
667
|
+
|
|
668
|
+
After scouting, ask for a second approval on the concrete source action. For
|
|
669
|
+
Signal Discovery, name how many selected posts will be scraped, the target
|
|
670
|
+
engager/source-candidate volume, and the bounded review-batch size. For Sales
|
|
671
|
+
Nav or Prospeo, name the specific approved import lane. Do not call
|
|
672
|
+
\`import_leads\` or \`confirm_lead_list\` until this second approval is granted.
|
|
667
673
|
|
|
668
674
|
For campaign-attached Signal Discovery sampling, promote/select the exact posts
|
|
669
675
|
with \`select_promising_posts\` before \`fetch_post_engagers\` so the user can see
|
|
@@ -965,8 +971,9 @@ updates.
|
|
|
965
971
|
is synced into the campaign brief. When filters are approved, immediately
|
|
966
972
|
call \`mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })\`
|
|
967
973
|
so the watched app moves to Filter Rules while rubrics are drafted/saved.
|
|
968
|
-
After rubrics save,
|
|
969
|
-
|
|
974
|
+
After rubrics save, move the watched app to \`apply-icp-rubric\` / Filter
|
|
975
|
+
Leads and say the fit rules are saved; approve the message template next;
|
|
976
|
+
after approval, queue the bounded review-batch
|
|
970
977
|
\`enrichCellId\` cells to kick off enrichment/filtering.
|
|
971
978
|
Product Generate Message cells must not run from the background template
|
|
972
979
|
path before that template/token approval. AI Generated uses the
|
|
@@ -974,7 +981,7 @@ updates.
|
|
|
974
981
|
draft.
|
|
975
982
|
6. The main thread owns watch navigation: use \`filter-choice\` after the 15-row
|
|
976
983
|
review batch, \`create-icp-rubric\` as soon as filters are approved,
|
|
977
|
-
\`messages\` for the Use Template / AI Generated mode choice,
|
|
984
|
+
\`apply-icp-rubric\` after rubrics save, \`messages\` for the Use Template / AI Generated mode choice,
|
|
978
985
|
\`auto-execute-messaging\` for approved message work or the product's
|
|
979
986
|
AI-generated path, and \`awaiting-user-greenlight\` for the final handoff.
|
|
980
987
|
\`validate-sample\` is recovery/legacy only if reached.
|
|
@@ -1176,18 +1183,17 @@ show you the draft next so you can approve it or change it.
|
|
|
1176
1183
|
Good opening:
|
|
1177
1184
|
|
|
1178
1185
|
\`\`\`text
|
|
1179
|
-
I’ll help you launch this as a Sellable campaign. First I’ll
|
|
1180
|
-
|
|
1181
|
-
|
|
1186
|
+
I’ll help you launch this as a Sellable campaign. First I’ll resolve the
|
|
1187
|
+
client/company this campaign is for, then I’ll turn that into a campaign brief
|
|
1188
|
+
before any leads are imported or anything can send.
|
|
1182
1189
|
\`\`\`
|
|
1183
1190
|
|
|
1184
1191
|
Good identity setup:
|
|
1185
1192
|
|
|
1186
1193
|
\`\`\`text
|
|
1187
|
-
I’ll
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
keep going.
|
|
1194
|
+
I’ll confirm the client/company this campaign is for before we pick the target,
|
|
1195
|
+
offer, proof, and lead source. Paste a LinkedIn profile or company website and
|
|
1196
|
+
I’ll resolve the campaign identity before the setup choices.
|
|
1191
1197
|
\`\`\`
|
|
1192
1198
|
|
|
1193
1199
|
Bad:
|
|
@@ -2388,7 +2394,9 @@ async function main() {
|
|
|
2388
2394
|
);
|
|
2389
2395
|
console.log(`✓ Token saved to ${authPath()}`);
|
|
2390
2396
|
console.log(` apiUrl: ${apiUrl}`);
|
|
2391
|
-
console.log(`
|
|
2397
|
+
console.log(` Continue in your agent:`);
|
|
2398
|
+
console.log(` Claude Code: /sellable:create-campaign`);
|
|
2399
|
+
console.log(` Codex: $sellable:create-campaign`);
|
|
2392
2400
|
process.exit(0);
|
|
2393
2401
|
}
|
|
2394
2402
|
if (rawArgs[0] === "uninstall") {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sellable/install",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.103",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "One-command installer for Sellable MCP in Claude Code and Codex",
|
|
6
6
|
"bin": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"sync-skills": "node scripts/sync-skill-templates.mjs",
|
|
11
|
-
"prepublishOnly": "node scripts/sync-skill-templates.mjs"
|
|
11
|
+
"prepublishOnly": "node scripts/sync-skill-templates.mjs && cd ../.. && npm run validate:sellable-skills"
|
|
12
12
|
},
|
|
13
13
|
"files": [
|
|
14
14
|
"bin",
|
|
@@ -16,7 +16,6 @@ allowed-tools:
|
|
|
16
16
|
- mcp__sellable__get_active_workspace
|
|
17
17
|
- mcp__sellable__list_senders
|
|
18
18
|
- mcp__sellable__get_sender
|
|
19
|
-
- mcp__sellable__enrich_sender
|
|
20
19
|
- mcp__sellable__complete_sender_research
|
|
21
20
|
- mcp__sellable__fetch_linkedin_profile
|
|
22
21
|
- mcp__sellable__fetch_linkedin_posts
|
|
@@ -54,7 +53,6 @@ allowed-tools:
|
|
|
54
53
|
- mcp__sellable__load_csv_linkedin_leads
|
|
55
54
|
- mcp__sellable__load_csv_domains
|
|
56
55
|
- mcp__sellable__queue_cells
|
|
57
|
-
- mcp__sellable__generate_messages
|
|
58
56
|
- mcp__sellable__get_campaign_messages_preview
|
|
59
57
|
- mcp__sellable__attach_sequence
|
|
60
58
|
- mcp__sellable__attach_recommended_sequence
|
|
@@ -63,7 +61,10 @@ allowed-tools:
|
|
|
63
61
|
|
|
64
62
|
# Sellable Create Campaign
|
|
65
63
|
|
|
66
|
-
Use this as the customer-facing
|
|
64
|
+
Use this as the customer-facing public wrapper for Sellable campaign creation.
|
|
65
|
+
It bootstraps auth and host capabilities, then loads the internal
|
|
66
|
+
`create-campaign-v2` workflow prompt and `core/flow.v2.json` through MCP. Keep
|
|
67
|
+
this wrapper thin; v2 is the operational source of truth.
|
|
67
68
|
|
|
68
69
|
CampaignOffer state and the watch link are the customer-facing source of truth.
|
|
69
70
|
Disk artifacts are optional debug/UAT diagnostics; normal customer runs should
|
|
@@ -118,7 +119,8 @@ signals, cleanup risk, and confidence basis. If a user asks for a forecast,
|
|
|
118
119
|
label it explicitly as not estimated from this run.
|
|
119
120
|
|
|
120
121
|
Before any provider prompt, search, source scout, or signal-discovery call,
|
|
121
|
-
show a short source-plan gate and ask for approval.
|
|
122
|
+
show a short source-plan gate and ask for approval. This first approval
|
|
123
|
+
authorizes scouting/search only. The gate should say:
|
|
122
124
|
|
|
123
125
|
- given this campaign, the viable source options
|
|
124
126
|
- the recommended first lane
|
|
@@ -127,14 +129,19 @@ show a short source-plan gate and ask for approval. The gate should say:
|
|
|
127
129
|
- the fallback lane if relevant posts or ICP engagement look thin
|
|
128
130
|
- that approval authorizes scouting/search only, not lead import or sending
|
|
129
131
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
`
|
|
136
|
-
|
|
137
|
-
|
|
132
|
+
Do not surface blanket source heuristics as product copy. Make the
|
|
133
|
+
recommendation specific to the campaign. If Signal Discovery is recommended,
|
|
134
|
+
name the exact post themes you will search. If relevant public conversations
|
|
135
|
+
look unlikely, recommend the specific Sales Nav or Prospeo lane instead and say
|
|
136
|
+
why. Do not call `search_signals`, `search_sales_nav`, `search_prospeo`,
|
|
137
|
+
`fetch_post_engagers`, or provider-scoped subagents until the user approves this
|
|
138
|
+
source plan or explicitly chooses a different source.
|
|
139
|
+
|
|
140
|
+
After scouting, ask for a second approval on the concrete source action. For
|
|
141
|
+
Signal Discovery, name how many selected posts will be scraped, the target
|
|
142
|
+
engager/source-candidate volume, and the bounded review-batch size. For Sales
|
|
143
|
+
Nav or Prospeo, name the specific approved import lane. Do not call
|
|
144
|
+
`import_leads` or `confirm_lead_list` until this second approval is granted.
|
|
138
145
|
|
|
139
146
|
When the user has not supplied a source and multiple source angles are viable,
|
|
140
147
|
scout those angles as independent branches when the host can actually do it:
|
|
@@ -331,7 +338,7 @@ the brief. This is only the client-prospect/bootstrap identity for
|
|
|
331
338
|
Do not call `mcp__sellable__list_senders`, `mcp__sellable__get_sender`, or
|
|
332
339
|
surface connected/missing sender state during setup, brief, source, filter, or
|
|
333
340
|
message review. Sender availability belongs only to the Settings/final launch
|
|
334
|
-
handoff after message approval and the
|
|
341
|
+
handoff after message approval and the review-batch validation sample.
|
|
335
342
|
|
|
336
343
|
If the invocation or user answer includes an existing `clientProspectId`, keep
|
|
337
344
|
it as the preferred `create_campaign` identity input. If it includes a LinkedIn
|
|
@@ -537,9 +544,9 @@ updates.
|
|
|
537
544
|
```text
|
|
538
545
|
You're in — {activeWorkspaceName} workspace, ready to roll.
|
|
539
546
|
|
|
540
|
-
Now — paste the LinkedIn profile
|
|
547
|
+
Now — paste the LinkedIn profile or company website for the client/company this campaign is for. I’ll use that to resolve the campaign identity before we pick the target, offer, proof, and lead source.
|
|
541
548
|
|
|
542
|
-
e.g. https://www.linkedin.com/in/
|
|
549
|
+
e.g. https://example.com or https://www.linkedin.com/in/client-handle
|
|
543
550
|
```
|
|
544
551
|
|
|
545
552
|
- If `isReturningUser === false`, prepend ONE line confirming the new
|
|
@@ -548,16 +555,18 @@ updates.
|
|
|
548
555
|
```text
|
|
549
556
|
You're set up — your {activeWorkspaceName} workspace is ready.
|
|
550
557
|
|
|
551
|
-
Now — paste the LinkedIn profile
|
|
558
|
+
Now — paste the LinkedIn profile or company website for the client/company this campaign is for. I’ll use that to resolve the campaign identity before we pick the target, offer, proof, and lead source.
|
|
552
559
|
|
|
553
|
-
e.g. https://www.linkedin.com/in/
|
|
560
|
+
e.g. https://example.com or https://www.linkedin.com/in/client-handle
|
|
554
561
|
```
|
|
555
562
|
|
|
556
563
|
No other lines. No "all set", no "signed in", no other acknowledgement.
|
|
557
564
|
|
|
558
|
-
After the user pastes the URL, proceed with the
|
|
559
|
-
|
|
560
|
-
|
|
565
|
+
After the user pastes the URL, proceed with the identity-first campaign
|
|
566
|
+
setup in the v2 subskill prompt. Resolve a LinkedIn profile with
|
|
567
|
+
`fetch_linkedin_profile`, a company website/domain with `fetch_company`
|
|
568
|
+
when possible, and mark the client/company research gate with
|
|
569
|
+
`complete_sender_research` when that protocol is required.
|
|
561
570
|
|
|
562
571
|
3. If auth is not OK with `error.type === "workspace"` (token valid, no active
|
|
563
572
|
workspace), stop and show the returned guidance — that's not a fresh-user
|
|
@@ -599,8 +608,9 @@ updates.
|
|
|
599
608
|
is synced into the campaign brief. When filters are approved, immediately
|
|
600
609
|
call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
|
|
601
610
|
so the watched app moves to Filter Rules while rubrics are drafted/saved.
|
|
602
|
-
After rubrics save,
|
|
603
|
-
|
|
611
|
+
After rubrics save, move the watched app to `apply-icp-rubric` / Filter
|
|
612
|
+
Leads and say the fit rules are saved; approve the message template next;
|
|
613
|
+
after approval, queue the bounded review-batch
|
|
604
614
|
`enrichCellId` cells to kick off enrichment/filtering.
|
|
605
615
|
Product Generate Message cells must not run from the background template
|
|
606
616
|
path before that template/token approval.
|
|
@@ -611,7 +621,8 @@ updates.
|
|
|
611
621
|
visible work so the user can watch progress in the app: `create-offer` for
|
|
612
622
|
the brief, `pick-provider` or the selected provider step while sourcing,
|
|
613
623
|
`filter-choice` after the 15-row review batch, `create-icp-rubric` as soon
|
|
614
|
-
as filters are approved, `
|
|
624
|
+
as filters are approved, `apply-icp-rubric` after rubrics save, `messages`
|
|
625
|
+
for the Use Template / AI Generated mode
|
|
615
626
|
choice, `auto-execute-messaging` for approved
|
|
616
627
|
message work or the product's AI-generated path, `awaiting-user-greenlight`
|
|
617
628
|
for the final handoff, `settings` for sender selection, `sequence` after
|