@sellable/install 0.1.198 → 0.1.200
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/bin/sellable-install.mjs
CHANGED
|
@@ -31,7 +31,7 @@ function getInstallVersion() {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
const CODEX_PLUGIN_VERSION = "0.1.
|
|
34
|
+
const CODEX_PLUGIN_VERSION = "0.1.42";
|
|
35
35
|
const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
36
36
|
"0.1.8",
|
|
37
37
|
"0.1.9",
|
|
@@ -65,6 +65,8 @@ const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
|
65
65
|
"0.1.37",
|
|
66
66
|
"0.1.38",
|
|
67
67
|
"0.1.39",
|
|
68
|
+
"0.1.40",
|
|
69
|
+
"0.1.41",
|
|
68
70
|
];
|
|
69
71
|
const INSTALL_PACKAGE_SPEC =
|
|
70
72
|
process.env.SELLABLE_INSTALL_PACKAGE_SPEC || "@sellable/install@latest";
|
|
@@ -620,9 +622,9 @@ const CREATE_CAMPAIGN_ALLOWED_TOOLS = [
|
|
|
620
622
|
"mcp__sellable__select_campaign_cells",
|
|
621
623
|
"mcp__sellable__queue_campaign_cells",
|
|
622
624
|
"mcp__sellable__wait_for_campaign_processing",
|
|
623
|
-
"
|
|
624
|
-
"
|
|
625
|
-
"
|
|
625
|
+
"mcp__sellable__start_campaign_message_preparation",
|
|
626
|
+
"mcp__sellable__get_campaign_message_preparation_status",
|
|
627
|
+
"mcp__sellable__cancel_campaign_message_preparation",
|
|
626
628
|
"mcp__sellable__revise_message_template_and_rerun",
|
|
627
629
|
"mcp__sellable__update_campaign_brief",
|
|
628
630
|
"mcp__sellable__update_campaign",
|
|
@@ -651,6 +653,13 @@ function allowedToolsYaml(tools) {
|
|
|
651
653
|
return tools.map((tool) => ` - ${tool}`).join("\n");
|
|
652
654
|
}
|
|
653
655
|
|
|
656
|
+
function yamlString(value) {
|
|
657
|
+
return JSON.stringify(String(value));
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
const FOUNDATION_SKILL_DESCRIPTION =
|
|
661
|
+
"Build or update durable founder/company memory: voice, values, proof, stories, positioning, and writing rules.";
|
|
662
|
+
|
|
654
663
|
function codexSkillOpenAiYaml(displayName, description) {
|
|
655
664
|
return `interface:
|
|
656
665
|
display_name: "${displayName.replaceAll('"', '\\"')}"
|
|
@@ -1238,7 +1247,7 @@ Use \`prepare_campaign_ab_test\` to create clean A/B split lead lists and review
|
|
|
1238
1247
|
function genericSellableSkillMd({ name, title, description }) {
|
|
1239
1248
|
return `---
|
|
1240
1249
|
name: ${name}
|
|
1241
|
-
description: ${description}
|
|
1250
|
+
description: ${yamlString(description)}
|
|
1242
1251
|
allowed-tools:
|
|
1243
1252
|
- mcp__sellable__get_auth_status
|
|
1244
1253
|
- mcp__sellable__get_subskill_prompt
|
|
@@ -1277,7 +1286,7 @@ If subskill lookup fails, use \`mcp__sellable__search_subskill_prompts({ query:
|
|
|
1277
1286
|
function foundationSkillMd() {
|
|
1278
1287
|
return `---
|
|
1279
1288
|
name: foundation
|
|
1280
|
-
description:
|
|
1289
|
+
description: ${yamlString(FOUNDATION_SKILL_DESCRIPTION)}
|
|
1281
1290
|
allowed-tools:
|
|
1282
1291
|
- mcp__sellable__get_subskill_prompt
|
|
1283
1292
|
- mcp__sellable__get_subskill_asset
|
package/package.json
CHANGED
|
@@ -4,26 +4,71 @@ description: Create a Sellable campaign A/B test by duplicating a full Campaign
|
|
|
4
4
|
visibility: public
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- mcp__sellable__get_auth_status
|
|
7
|
+
- mcp__sellable__start_cli_login
|
|
8
|
+
- mcp__sellable__wait_for_cli_login
|
|
7
9
|
- mcp__sellable__bootstrap_create_campaign
|
|
8
10
|
- mcp__sellable__get_subskill_prompt
|
|
9
11
|
- mcp__sellable__get_subskill_asset
|
|
12
|
+
- mcp__sellable__search_subskill_prompts
|
|
13
|
+
- mcp__sellable__get_provider_prompt
|
|
14
|
+
- mcp__sellable__get_source_scout_registry
|
|
15
|
+
- mcp__sellable__get_post_find_leads_scout_registry
|
|
10
16
|
- mcp__sellable__get_active_workspace
|
|
17
|
+
- mcp__sellable__list_workspaces
|
|
18
|
+
- mcp__sellable__set_active_workspace
|
|
19
|
+
- mcp__sellable__list_senders
|
|
20
|
+
- mcp__sellable__get_sender
|
|
11
21
|
- mcp__sellable__fetch_linkedin_profile
|
|
22
|
+
- mcp__sellable__fetch_linkedin_posts
|
|
23
|
+
- mcp__sellable__get_linkedin_profile
|
|
24
|
+
- mcp__sellable__fetch_company
|
|
25
|
+
- mcp__sellable__fetch_company_posts
|
|
12
26
|
- mcp__sellable__complete_sender_research
|
|
27
|
+
- mcp__sellable__lookup_sales_nav_filter
|
|
28
|
+
- mcp__sellable__search_sales_nav
|
|
29
|
+
- mcp__sellable__search_prospeo
|
|
30
|
+
- mcp__sellable__search_prospeo_companies
|
|
31
|
+
- mcp__sellable__confirm_prospeo_company_accounts
|
|
32
|
+
- mcp__sellable__search_harvest_jobs
|
|
33
|
+
- mcp__sellable__confirm_harvest_job_companies
|
|
34
|
+
- mcp__sellable__search_signals
|
|
35
|
+
- mcp__sellable__fetch_post_engagers
|
|
36
|
+
- mcp__sellable__enrich_with_prospeo
|
|
37
|
+
- mcp__sellable__bulk_enrich_with_prospeo
|
|
38
|
+
- mcp__sellable__save_domain_filters
|
|
39
|
+
- mcp__sellable__add_rubric_item
|
|
40
|
+
- mcp__sellable__upsert_rubric
|
|
41
|
+
- mcp__sellable__set_headline_icp_criteria
|
|
42
|
+
- mcp__sellable__check_rubric
|
|
13
43
|
- mcp__sellable__create_campaign
|
|
14
44
|
- mcp__sellable__update_campaign_brief
|
|
15
45
|
- mcp__sellable__update_campaign
|
|
16
46
|
- mcp__sellable__save_rubrics
|
|
17
47
|
- mcp__sellable__get_campaign
|
|
18
48
|
- mcp__sellable__get_campaign_context
|
|
49
|
+
- mcp__sellable__get_campaign_framework
|
|
19
50
|
- mcp__sellable__get_campaign_navigation_state
|
|
20
51
|
- mcp__sellable__get_campaign_messages_preview
|
|
52
|
+
- mcp__sellable__get_campaign_table_schema
|
|
53
|
+
- mcp__sellable__select_campaign_cells
|
|
54
|
+
- mcp__sellable__queue_campaign_cells
|
|
55
|
+
- mcp__sellable__wait_for_campaign_processing
|
|
56
|
+
- mcp__sellable__revise_message_template_and_rerun
|
|
57
|
+
- mcp__sellable__confirm_lead_list
|
|
58
|
+
- mcp__sellable__import_leads
|
|
21
59
|
- mcp__sellable__duplicate_campaign
|
|
22
60
|
- mcp__sellable__prepare_campaign_ab_test
|
|
61
|
+
- mcp__sellable__list_dnc_entries
|
|
62
|
+
- mcp__sellable__load_csv_dnc_entries
|
|
23
63
|
- mcp__sellable__load_csv_linkedin_leads
|
|
64
|
+
- mcp__sellable__load_csv_domains
|
|
24
65
|
- mcp__sellable__wait_for_lead_list_ready
|
|
66
|
+
- mcp__sellable__wait_for_campaign_table_ready
|
|
67
|
+
- mcp__sellable__get_rows
|
|
25
68
|
- mcp__sellable__get_table_rows
|
|
26
69
|
- mcp__sellable__get_rows_minimal
|
|
70
|
+
- mcp__sellable__attach_sequence
|
|
71
|
+
- mcp__sellable__attach_recommended_sequence
|
|
27
72
|
---
|
|
28
73
|
|
|
29
74
|
# Sellable Create A/B Test
|
|
@@ -36,11 +81,13 @@ campaign-message approaches from the same source list.
|
|
|
36
81
|
|
|
37
82
|
Start by identifying the campaign idea and the one variable being tested.
|
|
38
83
|
Campaign A must be a real, fully prepared Sellable campaign before this A/B
|
|
39
|
-
helper runs. If the user only supplied an idea,
|
|
40
|
-
`$sellable:create-campaign`
|
|
41
|
-
create
|
|
42
|
-
|
|
43
|
-
|
|
84
|
+
helper runs. If the user only supplied an idea, this skill must first execute
|
|
85
|
+
the normal `$sellable:create-campaign` workflow for Campaign A in the same run:
|
|
86
|
+
bootstrap create-campaign, load `create-campaign-v2` and
|
|
87
|
+
`core/flow.v2.json`, research the sender/company, create the campaign shell,
|
|
88
|
+
build and approve the campaign brief, source or attach leads when appropriate,
|
|
89
|
+
save any approved ICP filters, and get the message/template state into the
|
|
90
|
+
campaign brief. Do not call
|
|
44
91
|
`prepare_campaign_ab_test` with only `campaignName`/`campaignBrief`.
|
|
45
92
|
|
|
46
93
|
Once Campaign A exists, the A/B step duplicates Campaign A through Sellable's
|
|
@@ -54,8 +101,11 @@ split lead list.
|
|
|
54
101
|
1. Decide the source mode:
|
|
55
102
|
- Existing Campaign A: confirm the source campaign ID or resolve it with
|
|
56
103
|
`get_campaign`.
|
|
57
|
-
- Idea-only request: run the full
|
|
58
|
-
|
|
104
|
+
- Idea-only request: run the full create-campaign workflow inline first,
|
|
105
|
+
through `bootstrap_create_campaign`, `get_subskill_prompt({
|
|
106
|
+
subskillName: "create-campaign-v2" })`, and `get_subskill_asset({
|
|
107
|
+
subskillName: "create-campaign-v2", assetPath: "core/flow.v2.json" })`.
|
|
108
|
+
Use the created campaign ID as `sourceCampaignId`.
|
|
59
109
|
2. Confirm the A/B variable in plain language. Keep variant B as the explicit
|
|
60
110
|
change and leave variant A as the control unless the user names an A change.
|
|
61
111
|
3. Inspect Campaign A with `get_campaign` and `get_campaign_context`. Confirm
|
|
@@ -46,9 +46,9 @@ allowed-tools:
|
|
|
46
46
|
- mcp__sellable__select_campaign_cells
|
|
47
47
|
- mcp__sellable__queue_campaign_cells
|
|
48
48
|
- mcp__sellable__wait_for_campaign_processing
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
49
|
+
- mcp__sellable__start_campaign_message_preparation
|
|
50
|
+
- mcp__sellable__get_campaign_message_preparation_status
|
|
51
|
+
- mcp__sellable__cancel_campaign_message_preparation
|
|
52
52
|
- mcp__sellable__revise_message_template_and_rerun
|
|
53
53
|
- mcp__sellable__update_campaign_brief
|
|
54
54
|
- mcp__sellable__update_campaign
|
|
@@ -92,18 +92,28 @@ When filters are chosen, save rubrics, get filter approval, then wait for
|
|
|
92
92
|
message-template approval before enrichment/filtering or Generate Message cells.
|
|
93
93
|
After filter approval, Filter Leads should show `Filters saved + waiting for
|
|
94
94
|
message approval` until the template is approved.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
`
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
95
|
+
The default path stays the existing first campaign-table execution slice:
|
|
96
|
+
review the normal `reviewBatchLimit:15`, approve reviewed draft rows, then move
|
|
97
|
+
to Settings/sequence/final greenlight. Only call
|
|
98
|
+
`start_campaign_message_preparation` when the user explicitly asks for more
|
|
99
|
+
prepared messages or a send count. If the user says "prepare/generate X
|
|
100
|
+
messages", set `targetPreparedMessages:X`, let the backend derive
|
|
101
|
+
`maxRowsToCheck:min(2500,max(300,X*5))`, and keep
|
|
102
|
+
`approvalMode:"mark_ready"`. The backend samples up to 100 rows first, then
|
|
103
|
+
adapts later batches up to 250 rows while recalculating yield. Poll
|
|
104
|
+
`get_campaign_message_preparation_status` for preparation-job status: checked
|
|
105
|
+
rows, prepared/approved count, target, row budget remaining, and stop reason. If
|
|
106
|
+
the user says "approve X messages", use `approvalMode:"approve"` but still do
|
|
107
|
+
not launch. If the user says "schedule X sends", use `approvalMode:"approve"`
|
|
108
|
+
to approve exactly the bounded X-message cohort during preparation, then
|
|
109
|
+
continue through sender, sequence, and final launch greenlight; the launch path
|
|
110
|
+
must verify that bounded cohort and must not broad approve-all.
|
|
111
|
+
Treat `campaignId` as `CampaignOffer.id`. Low level selector/queue tools are
|
|
112
|
+
diagnostics and recovery only for this lane. If the user asks to stop
|
|
113
|
+
preparation, the target is wrong, or status shows the wrong campaign/table, call
|
|
114
|
+
`cancel_campaign_message_preparation`; otherwise do not cancel a healthy prepare
|
|
115
|
+
run. Never call `start_campaign` from message preparation; final launch remains
|
|
116
|
+
a separate explicit user greenlight.
|
|
107
117
|
Use Template is the default message path; AI Generated is only an explicit
|
|
108
118
|
opt-out.
|
|
109
119
|
|