@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 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, format the customer-facing
141
- message review as Markdown with distinct copy blocks:
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 Examples
162
+ ## Rendered Example
159
163
 
160
- ### Good token fill
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 300 unless the parent supplies a target), reachable engagers,
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
- 300-good-fit source target, how many posts are needed for that source target,
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 15-row review batch.
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). If raw preview volume or projected usable volume
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
@@ -40,7 +40,7 @@ function getMcpVersion() {
40
40
  } catch {}
41
41
  return "latest";
42
42
  }
43
- const CODEX_PLUGIN_VERSION = "0.1.32";
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 15-row validation. After message
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 10-lead validation sample.
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 local validation artifacts from
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 15-row
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.105",
3
+ "version": "0.1.107",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -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
- - goal: about 300 good-fit prospects after cleanup, enrichment, and filters
156
- - working assumption: about 15% of raw post engagers become good-fit prospects
157
- - engagers needed: about 2,000 raw engagers
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 15 leads into the review
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 15-row validation. After message
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 local validation artifacts from
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 15-row review batch, `create-icp-rubric` as soon
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,