@sellable/install 0.1.105 → 0.1.107
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 +3 -0
- package/agents/post-find-leads-message-scout.md +8 -14
- package/agents/source-scout-linkedin-engagement.md +4 -3
- package/agents/source-scout-prospeo-contact.md +1 -1
- package/agents/source-scout-sales-nav.md +3 -2
- package/bin/sellable-install.mjs +67 -10
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +10 -9
package/README.md
CHANGED
|
@@ -61,11 +61,14 @@ Use the same public entrypoints in both hosts:
|
|
|
61
61
|
|
|
62
62
|
- Claude Code: `/sellable:create-campaign`
|
|
63
63
|
- Claude Code: `/sellable:interview`
|
|
64
|
+
- Claude Code: `/sellable:load-voice`
|
|
64
65
|
- Codex: `$sellable:create-campaign`
|
|
65
66
|
- Codex: `$sellable:interview`
|
|
67
|
+
- Codex: `$sellable:load-voice`
|
|
66
68
|
- Codex Desktop plugin: `sellable@sellable`
|
|
67
69
|
- Codex visible skill: `Sellable Create Campaign`
|
|
68
70
|
- Codex visible skill: `Sellable Identity Interview`
|
|
71
|
+
- Codex visible skill: `Sellable Load Voice`
|
|
69
72
|
- Internal MCP workflow prompt: `create-campaign-v2`
|
|
70
73
|
|
|
71
74
|
Do not ask users to run `/sellable:create-campaign-v2`,
|
|
@@ -137,8 +137,12 @@ Return a concise status with:
|
|
|
137
137
|
- quality-gate pass/fail summary
|
|
138
138
|
- whether final template review is ready or needs revision
|
|
139
139
|
|
|
140
|
-
When the parent will show the recommendation in chat,
|
|
141
|
-
message review
|
|
140
|
+
When the parent will show the recommendation in chat, keep the customer-facing
|
|
141
|
+
message review lightweight. Format only the approval target and one strong
|
|
142
|
+
good-fill example as Markdown with distinct copy blocks. Keep token rules,
|
|
143
|
+
omit/fallback examples, and bad-fill avoidance notes in your internal
|
|
144
|
+
recommendation so the parent can persist them to the campaign brief after
|
|
145
|
+
approval; do not print them in the default chat approval packet.
|
|
142
146
|
|
|
143
147
|
````markdown
|
|
144
148
|
## Message Template
|
|
@@ -155,19 +159,9 @@ message review as Markdown with distinct copy blocks:
|
|
|
155
159
|
{{tokenized_message_body}}
|
|
156
160
|
```
|
|
157
161
|
|
|
158
|
-
## Rendered
|
|
162
|
+
## Rendered Example
|
|
159
163
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
```text
|
|
163
|
-
Subject: ...
|
|
164
|
-
|
|
165
|
-
Hey First,
|
|
166
|
-
|
|
167
|
-
...
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### Good omit / fallback
|
|
164
|
+
Good token fill:
|
|
171
165
|
|
|
172
166
|
```text
|
|
173
167
|
Subject: ...
|
|
@@ -51,7 +51,8 @@ currentStep: "signal-discovery" })` before sampling so the watched Signal
|
|
|
51
51
|
visible headline/display-name cues only. Do not enrich people during
|
|
52
52
|
viability estimation.
|
|
53
53
|
7. Compute capacity before recommending the source: source target good-fit
|
|
54
|
-
leads (default
|
|
54
|
+
leads (default 150 for Signal Discovery unless the parent supplies a target),
|
|
55
|
+
reachable engagers,
|
|
55
56
|
sampled ICP-fit rate as `n/N` plus an easy percentage/range, expected usable
|
|
56
57
|
leads per 100 engagers before and after a conservative dedupe/cleanup
|
|
57
58
|
factor, required engagers to scrape (`source target / fit rate`), average
|
|
@@ -93,8 +94,8 @@ Evidence standards:
|
|
|
93
94
|
exist, how many sampled engagers looked in-ICP, how many good-fit prospects
|
|
94
95
|
that implies per 100 engagers, how many usable prospects one right-content
|
|
95
96
|
post should yield after cleanup, how many engagers must be scraped for the
|
|
96
|
-
|
|
97
|
+
150-good-fit source target, how many posts are needed for that source target,
|
|
97
98
|
and which posts you would use. Also say the first campaign import remains the
|
|
98
|
-
bounded
|
|
99
|
+
bounded review batch.
|
|
99
100
|
- If `fetch_post_engagers` is unavailable or fails, report that explicitly and mark the estimate lower-confidence.
|
|
100
101
|
- Keep LinkedIn Engagement viable when selected posts can produce roughly 150+ ICP-fit warm prospects before final filtering, even if Sales Nav is more scalable.
|
|
@@ -27,7 +27,7 @@ Process:
|
|
|
27
27
|
1. Read the campaign brief, source intake, kickoff doc, or lane prompt supplied by the parent.
|
|
28
28
|
2. Identify whether this is domain/account targeting or broad persona expansion.
|
|
29
29
|
3. For domain targeting, use or create the standalone `domainFilterId` before searching; never pass raw domains directly into `search_prospeo`.
|
|
30
|
-
4. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear.
|
|
30
|
+
4. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear. Check scale against a default 300+ good-fit target, capped at 2,500 source candidates unless the parent supplies a different target.
|
|
31
31
|
5. Call out that Prospeo gives contact/account coverage but usually weaker LinkedIn intent than LinkedIn Engagement or Sales Nav activity slices.
|
|
32
32
|
|
|
33
33
|
Return a concise structured result with:
|
|
@@ -28,8 +28,9 @@ Process:
|
|
|
28
28
|
2. Preserve target role names with `CURRENT_TITLE` lookups; do not rely on seniority alone when the brief names concrete roles.
|
|
29
29
|
3. When `lookup_sales_nav_filter` returns multiple title options, choose the closest semantic title match instead of the first result.
|
|
30
30
|
4. Build a broad-but-reasonable baseline from role/title, geography, company size, industry/account context, and recent LinkedIn activity when relevant.
|
|
31
|
-
5. Check scale against the source target good-fit lead count (default 300
|
|
32
|
-
unless the parent supplies a target).
|
|
31
|
+
5. Check scale against the source target good-fit lead count (default 300+
|
|
32
|
+
for Sales Nav, capped at 2,500 source candidates unless the parent supplies a target).
|
|
33
|
+
If raw preview volume or projected usable volume
|
|
33
34
|
is below target, do not present the tiny result as the scale fallback yet.
|
|
34
35
|
Loosen nonessential filters in order: remove recent-activity first, widen
|
|
35
36
|
adjacent title variants, widen geography/company-size constraints, and only
|
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.33";
|
|
44
44
|
const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
45
45
|
"0.1.8",
|
|
46
46
|
"0.1.9",
|
|
@@ -166,9 +166,7 @@ Auth:
|
|
|
166
166
|
|
|
167
167
|
function printCreateCommandHint() {
|
|
168
168
|
printBanner();
|
|
169
|
-
console.log(
|
|
170
|
-
` ${C.bold}Run Sellable from Claude Code or Codex.${C.reset}`
|
|
171
|
-
);
|
|
169
|
+
console.log(` ${C.bold}Run Sellable from Claude Code or Codex.${C.reset}`);
|
|
172
170
|
console.log("");
|
|
173
171
|
console.log(
|
|
174
172
|
` ${C.grey}The terminal command installs and verifies Sellable. Campaign creation runs inside your agent session so the workflow can use MCP tools, live state, and approval gates.${C.reset}`
|
|
@@ -182,12 +180,14 @@ function printCreateCommandHint() {
|
|
|
182
180
|
printAgentBox("Using Claude Code?", "claude", [
|
|
183
181
|
{ label: "Campaign", command: "/sellable:create-campaign" },
|
|
184
182
|
{ label: "Identity", command: "/sellable:interview" },
|
|
183
|
+
{ label: "Voice", command: "/sellable:load-voice" },
|
|
185
184
|
]);
|
|
186
185
|
console.log("");
|
|
187
186
|
console.log("");
|
|
188
187
|
printAgentBox("Using Codex?", "codex", [
|
|
189
188
|
{ label: "Campaign", command: "$sellable:create-campaign" },
|
|
190
189
|
{ label: "Identity", command: "$sellable:interview" },
|
|
190
|
+
{ label: "Voice", command: "$sellable:load-voice" },
|
|
191
191
|
]);
|
|
192
192
|
console.log("");
|
|
193
193
|
console.log(` ${"─".repeat(63)}`);
|
|
@@ -717,7 +717,7 @@ After every \`update_campaign({ campaignId, currentStep })\`, use
|
|
|
717
717
|
\`get_campaign_navigation_state\` when available as a compact orientation check:
|
|
718
718
|
match the saved campaign state to the expected watch-link step, explain the
|
|
719
719
|
current state in one sentence, and only then continue. Sender selection belongs
|
|
720
|
-
at Settings after message approval and
|
|
720
|
+
at Settings after message approval and review-batch validation. After message
|
|
721
721
|
validation, use Settings to help the user connect or select a LinkedIn sender.
|
|
722
722
|
Explain Slack reply review before launch. After sender selection, attach the
|
|
723
723
|
recommended sequence and move the watched UI to Send. Do not start the campaign
|
|
@@ -822,7 +822,7 @@ the brief. This is only the client-prospect/bootstrap identity for
|
|
|
822
822
|
Do not call \`mcp__sellable__list_senders\`, \`mcp__sellable__get_sender\`, or
|
|
823
823
|
surface connected/missing sender state during setup, brief, source, filter, or
|
|
824
824
|
message review. Sender availability belongs only to the Settings/final launch
|
|
825
|
-
handoff after message approval and the
|
|
825
|
+
handoff after message approval and the review-batch validation sample.
|
|
826
826
|
|
|
827
827
|
If the invocation or user answer includes an existing \`clientProspectId\`, keep
|
|
828
828
|
it as the preferred \`create_campaign\` identity input. If it includes a LinkedIn
|
|
@@ -959,9 +959,9 @@ updates.
|
|
|
959
959
|
until \`hasMore=false\`. The create-campaign message-review safety gate is a
|
|
960
960
|
supplemental approval checklist, not a replacement for the long prompt. Use
|
|
961
961
|
campaign state, campaign brief content, selected source state, and imported
|
|
962
|
-
review-batch rows as the source of truth; do not read stale local markdown
|
|
963
|
-
inspect the database directly, or synthesize
|
|
964
|
-
general knowledge.
|
|
962
|
+
review-batch rows as the source of truth; do not read stale local markdown
|
|
963
|
+
such as \`message-validation.md\`, inspect the database directly, or synthesize
|
|
964
|
+
local validation artifacts from general knowledge.
|
|
965
965
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
966
966
|
watch link and see useful setup state immediately. Import only the first
|
|
967
967
|
bounded review batch after the source is attached to the campaign; do not
|
|
@@ -979,7 +979,7 @@ updates.
|
|
|
979
979
|
path before that template/token approval. AI Generated uses the
|
|
980
980
|
product's AI-generated path and cancels or ignores the background template
|
|
981
981
|
draft.
|
|
982
|
-
6. The main thread owns watch navigation: use \`filter-choice\` after the
|
|
982
|
+
6. The main thread owns watch navigation: use \`filter-choice\` after the review
|
|
983
983
|
review batch, \`create-icp-rubric\` as soon as filters are approved,
|
|
984
984
|
\`apply-icp-rubric\` after rubrics save, \`messages\` for the Use Template / AI Generated mode choice,
|
|
985
985
|
\`auto-execute-messaging\` for approved message work or the product's
|
|
@@ -1089,6 +1089,55 @@ then retry \`get_subskill_prompt\`.
|
|
|
1089
1089
|
`;
|
|
1090
1090
|
}
|
|
1091
1091
|
|
|
1092
|
+
function loadVoiceSkillMd() {
|
|
1093
|
+
return `---
|
|
1094
|
+
name: load-voice
|
|
1095
|
+
description: Load Sellable voice/company memory for answering questions, writing posts, applications, replies, and reviews in the user's voice.
|
|
1096
|
+
allowed-tools:
|
|
1097
|
+
- mcp__sellable__get_subskill_prompt
|
|
1098
|
+
- mcp__sellable__search_subskill_prompts
|
|
1099
|
+
- Read
|
|
1100
|
+
- Glob
|
|
1101
|
+
- Grep
|
|
1102
|
+
---
|
|
1103
|
+
|
|
1104
|
+
# Sellable Load Voice
|
|
1105
|
+
|
|
1106
|
+
Use this as the customer-facing entrypoint for loading Sellable voice/company
|
|
1107
|
+
memory before drafting, answering, rewriting, reviewing, or calibrating copy in
|
|
1108
|
+
the user's voice.
|
|
1109
|
+
|
|
1110
|
+
## Bootstrap
|
|
1111
|
+
|
|
1112
|
+
MCP prompt access and local read tools are required. Do not run shell commands,
|
|
1113
|
+
use \`npm\`, \`node\`, local harness scripts, or read local prompt files to
|
|
1114
|
+
emulate this workflow.
|
|
1115
|
+
|
|
1116
|
+
If the Sellable MCP prompt tools are unavailable, stop and say this is a Codex
|
|
1117
|
+
install/reload problem. Tell the user to run
|
|
1118
|
+
\`npx -y ${INSTALL_PACKAGE_SPEC} --host all\`, fully quit and reopen Codex
|
|
1119
|
+
Desktop, then start a new thread.
|
|
1120
|
+
|
|
1121
|
+
## Execute Workflow
|
|
1122
|
+
|
|
1123
|
+
1. Load the canonical prompt via
|
|
1124
|
+
\`mcp__sellable__get_subskill_prompt({ subskillName: "load-voice" })\`.
|
|
1125
|
+
If the response has \`hasMore=true\`, continue with \`nextOffset\` until
|
|
1126
|
+
\`hasMore=false\`.
|
|
1127
|
+
2. Follow the canonical prompt exactly. Read the relevant
|
|
1128
|
+
\`.sellable/configs/**\` memory files it names.
|
|
1129
|
+
3. Apply the loaded memory silently to the user's requested writing or answer.
|
|
1130
|
+
If the user only asked to load voice, summarize the active rules briefly and
|
|
1131
|
+
ask what they want drafted, answered, or reviewed.
|
|
1132
|
+
|
|
1133
|
+
## MCP Prompt Fallback
|
|
1134
|
+
|
|
1135
|
+
If exact subskill lookup fails, use
|
|
1136
|
+
\`mcp__sellable__search_subskill_prompts({ query: "load-voice", includePublic: true })\`,
|
|
1137
|
+
then retry \`get_subskill_prompt\`.
|
|
1138
|
+
`;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1092
1141
|
function createCampaignSoulMd() {
|
|
1093
1142
|
return `# Sellable Campaign GTM Engineer Soul
|
|
1094
1143
|
|
|
@@ -1283,6 +1332,12 @@ function codexPluginSkills() {
|
|
|
1283
1332
|
description: "Build durable identity and company memory",
|
|
1284
1333
|
skillMd: interviewSkillMd(),
|
|
1285
1334
|
},
|
|
1335
|
+
{
|
|
1336
|
+
dir: "sellable-load-voice",
|
|
1337
|
+
displayName: "Sellable Load Voice",
|
|
1338
|
+
description: "Load voice memory for writing and answers",
|
|
1339
|
+
skillMd: loadVoiceSkillMd(),
|
|
1340
|
+
},
|
|
1286
1341
|
];
|
|
1287
1342
|
}
|
|
1288
1343
|
|
|
@@ -2129,6 +2184,7 @@ function printNextSteps(installedHosts, authReused) {
|
|
|
2129
2184
|
printAgentBox("Using Claude Code?", "claude", [
|
|
2130
2185
|
{ label: "Campaign", command: "/sellable:create-campaign" },
|
|
2131
2186
|
{ label: "Identity", command: "/sellable:interview" },
|
|
2187
|
+
{ label: "Voice", command: "/sellable:load-voice" },
|
|
2132
2188
|
]);
|
|
2133
2189
|
console.log("");
|
|
2134
2190
|
console.log("");
|
|
@@ -2137,6 +2193,7 @@ function printNextSteps(installedHosts, authReused) {
|
|
|
2137
2193
|
printAgentBox("Using Codex?", "codex", [
|
|
2138
2194
|
{ label: "Campaign", command: "$sellable:create-campaign" },
|
|
2139
2195
|
{ label: "Identity", command: "$sellable:interview" },
|
|
2196
|
+
{ label: "Voice", command: "$sellable:load-voice" },
|
|
2140
2197
|
]);
|
|
2141
2198
|
console.log("");
|
|
2142
2199
|
}
|
package/package.json
CHANGED
|
@@ -152,13 +152,14 @@ For Signal Discovery, the customer-facing approval card must use the exact
|
|
|
152
152
|
action shape "Approve scraping N Signal Discovery posts?" and the chat summary
|
|
153
153
|
should be a compact `## Source Recommendation` block with:
|
|
154
154
|
|
|
155
|
-
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
155
|
+
- good-fit target: about 150 prospects after cleanup, enrichment, and filters
|
|
156
|
+
- source-candidate plan: about 1,000 raw engagers using a conservative 15%
|
|
157
|
+
fit-rate assumption unless sampled data supports a different number
|
|
158
|
+
- review checkpoint: import the first 25 leads for fit and message review
|
|
158
159
|
- a selected-post table with post author/topic, why it fits, and visible
|
|
159
160
|
engagement
|
|
160
161
|
- total visible pool and estimated good-fit pool
|
|
161
|
-
- first pass: build the source list, then import only
|
|
162
|
+
- first pass: build the source list, then import only the review
|
|
162
163
|
batch
|
|
163
164
|
- fallback: switch to Sales Nav recent activity if the review batch is
|
|
164
165
|
vendor-heavy, agency-heavy, or off-ICP
|
|
@@ -251,7 +252,7 @@ After every `update_campaign({ campaignId, currentStep })`, use
|
|
|
251
252
|
`get_campaign_navigation_state` when available as a compact orientation check:
|
|
252
253
|
match the saved campaign state to the expected watch-link step, explain the
|
|
253
254
|
current state in one sentence, and only then continue. Sender selection belongs
|
|
254
|
-
at Settings after message approval and
|
|
255
|
+
at Settings after message approval and review-batch validation. After message
|
|
255
256
|
validation, use Settings to help the user connect or select a LinkedIn sender.
|
|
256
257
|
Explain Slack reply review before launch. After sender selection, attach the
|
|
257
258
|
recommended sequence and move the watched UI to Send. Do not start the campaign
|
|
@@ -614,9 +615,9 @@ updates.
|
|
|
614
615
|
until `hasMore=false`. The create-campaign message-review safety gate is a
|
|
615
616
|
supplemental approval checklist, not a replacement for the long prompt. Use
|
|
616
617
|
campaign state, campaign brief content, selected source state, and imported
|
|
617
|
-
review-batch rows as the source of truth; do not read stale local markdown
|
|
618
|
-
inspect the database directly, or synthesize
|
|
619
|
-
general knowledge.
|
|
618
|
+
review-batch rows as the source of truth; do not read stale local markdown
|
|
619
|
+
such as `message-validation.md`, inspect the database directly, or synthesize
|
|
620
|
+
local validation artifacts from general knowledge.
|
|
620
621
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
621
622
|
watch link and see useful setup state immediately. Import only the first
|
|
622
623
|
bounded review batch after the source is attached to the campaign; do not
|
|
@@ -640,7 +641,7 @@ updates.
|
|
|
640
641
|
`mcp__sellable__update_campaign({ campaignId, currentStep })` before major
|
|
641
642
|
visible work so the user can watch progress in the app: `create-offer` for
|
|
642
643
|
the brief, `pick-provider` or the selected provider step while sourcing,
|
|
643
|
-
`filter-choice` after the
|
|
644
|
+
`filter-choice` after the review batch, `create-icp-rubric` as soon
|
|
644
645
|
as filters are approved, `apply-icp-rubric` after rubrics save and while
|
|
645
646
|
waiting for message-template approval, `validate-sample` while the approved
|
|
646
647
|
template unlocks bounded enrichment/filter scoring on Filter Leads,
|