@sellable/install 0.1.101 → 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 +46 -15
- package/package.json +2 -2
- package/skill-templates/create-campaign.md +50 -16
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",
|
|
@@ -646,6 +646,31 @@ data, compare sources by source volume, sampled ICP fit, activity/warmth
|
|
|
646
646
|
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
|
+
Before any provider prompt, search, source scout, or signal-discovery call,
|
|
650
|
+
show a short source-plan gate and ask for approval. This first approval
|
|
651
|
+
authorizes scouting/search only. The gate should say:
|
|
652
|
+
|
|
653
|
+
- given this campaign, the viable source options
|
|
654
|
+
- the recommended first lane
|
|
655
|
+
- why that lane fits the buyer, offer, and likely public activity
|
|
656
|
+
- what will be tested next
|
|
657
|
+
- the fallback lane if relevant posts or ICP engagement look thin
|
|
658
|
+
- that approval authorizes scouting/search only, not lead import or sending
|
|
659
|
+
|
|
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.
|
|
673
|
+
|
|
649
674
|
For campaign-attached Signal Discovery sampling, promote/select the exact posts
|
|
650
675
|
with \`select_promising_posts\` before \`fetch_post_engagers\` so the user can see
|
|
651
676
|
which posts are being sampled in the watched app. The watch guide should say
|
|
@@ -943,15 +968,20 @@ updates.
|
|
|
943
968
|
queue workflow cells, attach a sequence, or start until filter choice is
|
|
944
969
|
resolved, rubrics are saved when filters are enabled, template/token rules
|
|
945
970
|
are approved on the default Use Template path, and the approved message set
|
|
946
|
-
is synced into the campaign brief.
|
|
947
|
-
|
|
948
|
-
|
|
971
|
+
is synced into the campaign brief. When filters are approved, immediately
|
|
972
|
+
call \`mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })\`
|
|
973
|
+
so the watched app moves to Filter Rules while rubrics are drafted/saved.
|
|
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
|
|
977
|
+
\`enrichCellId\` cells to kick off enrichment/filtering.
|
|
949
978
|
Product Generate Message cells must not run from the background template
|
|
950
979
|
path before that template/token approval. AI Generated uses the
|
|
951
980
|
product's AI-generated path and cancels or ignores the background template
|
|
952
981
|
draft.
|
|
953
982
|
6. The main thread owns watch navigation: use \`filter-choice\` after the 15-row
|
|
954
|
-
review batch, \`
|
|
983
|
+
review batch, \`create-icp-rubric\` as soon as filters are approved,
|
|
984
|
+
\`apply-icp-rubric\` after rubrics save, \`messages\` for the Use Template / AI Generated mode choice,
|
|
955
985
|
\`auto-execute-messaging\` for approved message work or the product's
|
|
956
986
|
AI-generated path, and \`awaiting-user-greenlight\` for the final handoff.
|
|
957
987
|
\`validate-sample\` is recovery/legacy only if reached.
|
|
@@ -1153,18 +1183,17 @@ show you the draft next so you can approve it or change it.
|
|
|
1153
1183
|
Good opening:
|
|
1154
1184
|
|
|
1155
1185
|
\`\`\`text
|
|
1156
|
-
I’ll help you launch this as a Sellable campaign. First I’ll
|
|
1157
|
-
|
|
1158
|
-
|
|
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.
|
|
1159
1189
|
\`\`\`
|
|
1160
1190
|
|
|
1161
1191
|
Good identity setup:
|
|
1162
1192
|
|
|
1163
1193
|
\`\`\`text
|
|
1164
|
-
I’ll
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
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.
|
|
1168
1197
|
\`\`\`
|
|
1169
1198
|
|
|
1170
1199
|
Bad:
|
|
@@ -2365,7 +2394,9 @@ async function main() {
|
|
|
2365
2394
|
);
|
|
2366
2395
|
console.log(`✓ Token saved to ${authPath()}`);
|
|
2367
2396
|
console.log(` apiUrl: ${apiUrl}`);
|
|
2368
|
-
console.log(`
|
|
2397
|
+
console.log(` Continue in your agent:`);
|
|
2398
|
+
console.log(` Claude Code: /sellable:create-campaign`);
|
|
2399
|
+
console.log(` Codex: $sellable:create-campaign`);
|
|
2369
2400
|
process.exit(0);
|
|
2370
2401
|
}
|
|
2371
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
|
|
@@ -117,6 +118,31 @@ data, compare sources by source volume, sampled ICP fit, activity/warmth
|
|
|
117
118
|
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
|
|
|
121
|
+
Before any provider prompt, search, source scout, or signal-discovery call,
|
|
122
|
+
show a short source-plan gate and ask for approval. This first approval
|
|
123
|
+
authorizes scouting/search only. The gate should say:
|
|
124
|
+
|
|
125
|
+
- given this campaign, the viable source options
|
|
126
|
+
- the recommended first lane
|
|
127
|
+
- why that lane fits the buyer, offer, and likely public activity
|
|
128
|
+
- what will be tested next
|
|
129
|
+
- the fallback lane if relevant posts or ICP engagement look thin
|
|
130
|
+
- that approval authorizes scouting/search only, not lead import or sending
|
|
131
|
+
|
|
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.
|
|
145
|
+
|
|
120
146
|
When the user has not supplied a source and multiple source angles are viable,
|
|
121
147
|
scout those angles as independent branches when the host can actually do it:
|
|
122
148
|
LinkedIn Engagement / active post engagers (internal `signal-discovery`
|
|
@@ -312,7 +338,7 @@ the brief. This is only the client-prospect/bootstrap identity for
|
|
|
312
338
|
Do not call `mcp__sellable__list_senders`, `mcp__sellable__get_sender`, or
|
|
313
339
|
surface connected/missing sender state during setup, brief, source, filter, or
|
|
314
340
|
message review. Sender availability belongs only to the Settings/final launch
|
|
315
|
-
handoff after message approval and the
|
|
341
|
+
handoff after message approval and the review-batch validation sample.
|
|
316
342
|
|
|
317
343
|
If the invocation or user answer includes an existing `clientProspectId`, keep
|
|
318
344
|
it as the preferred `create_campaign` identity input. If it includes a LinkedIn
|
|
@@ -518,9 +544,9 @@ updates.
|
|
|
518
544
|
```text
|
|
519
545
|
You're in — {activeWorkspaceName} workspace, ready to roll.
|
|
520
546
|
|
|
521
|
-
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.
|
|
522
548
|
|
|
523
|
-
e.g. https://www.linkedin.com/in/
|
|
549
|
+
e.g. https://example.com or https://www.linkedin.com/in/client-handle
|
|
524
550
|
```
|
|
525
551
|
|
|
526
552
|
- If `isReturningUser === false`, prepend ONE line confirming the new
|
|
@@ -529,16 +555,18 @@ updates.
|
|
|
529
555
|
```text
|
|
530
556
|
You're set up — your {activeWorkspaceName} workspace is ready.
|
|
531
557
|
|
|
532
|
-
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.
|
|
533
559
|
|
|
534
|
-
e.g. https://www.linkedin.com/in/
|
|
560
|
+
e.g. https://example.com or https://www.linkedin.com/in/client-handle
|
|
535
561
|
```
|
|
536
562
|
|
|
537
563
|
No other lines. No "all set", no "signed in", no other acknowledgement.
|
|
538
564
|
|
|
539
|
-
After the user pastes the URL, proceed with the
|
|
540
|
-
|
|
541
|
-
|
|
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.
|
|
542
570
|
|
|
543
571
|
3. If auth is not OK with `error.type === "workspace"` (token valid, no active
|
|
544
572
|
workspace), stop and show the returned guidance — that's not a fresh-user
|
|
@@ -577,9 +605,13 @@ updates.
|
|
|
577
605
|
queue workflow cells, attach a sequence, or start until the filter choice is
|
|
578
606
|
resolved, rubrics are saved when filters are enabled, template/token rules
|
|
579
607
|
are approved on the default Use Template path, and the approved message set
|
|
580
|
-
is synced into the campaign brief.
|
|
581
|
-
|
|
582
|
-
|
|
608
|
+
is synced into the campaign brief. When filters are approved, immediately
|
|
609
|
+
call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
|
|
610
|
+
so the watched app moves to Filter Rules while rubrics are drafted/saved.
|
|
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
|
|
614
|
+
`enrichCellId` cells to kick off enrichment/filtering.
|
|
583
615
|
Product Generate Message cells must not run from the background template
|
|
584
616
|
path before that template/token approval.
|
|
585
617
|
Do not ask the user to approve the brief before shell creation unless they
|
|
@@ -588,8 +620,10 @@ updates.
|
|
|
588
620
|
`mcp__sellable__update_campaign({ campaignId, currentStep })` before major
|
|
589
621
|
visible work so the user can watch progress in the app: `create-offer` for
|
|
590
622
|
the brief, `pick-provider` or the selected provider step while sourcing,
|
|
591
|
-
`filter-choice` after the 15-row review batch, `
|
|
592
|
-
|
|
623
|
+
`filter-choice` after the 15-row review batch, `create-icp-rubric` as soon
|
|
624
|
+
as filters are approved, `apply-icp-rubric` after rubrics save, `messages`
|
|
625
|
+
for the Use Template / AI Generated mode
|
|
626
|
+
choice, `auto-execute-messaging` for approved
|
|
593
627
|
message work or the product's AI-generated path, `awaiting-user-greenlight`
|
|
594
628
|
for the final handoff, `settings` for sender selection, `sequence` after
|
|
595
629
|
sender attach, and `send` once the recommended sequence is attached.
|