@sellable/install 0.1.331 → 0.1.333-phase981.202607110535

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.
@@ -15,9 +15,6 @@ customer's profile-local Sellable MCP config. Customer profiles must not store
15
15
  or read Sellable Admin MCP credentials, admin Slack app tokens, or sibling
16
16
  profile config.
17
17
 
18
- The shared dispatcher remains a fallback/research path only. Use it only when
19
- Sellable Admin explicitly owns one shared listener and route registry.
20
-
21
18
  The 2026-07-06 Hostinger POC proved the native Hermes listener for the
22
19
  `sellable-admin` profile with the existing `Sellable Reply Bot` app in
23
20
  `#team-chat`: a human mention produced a new Hermes session and a threaded bot
@@ -34,8 +31,7 @@ hermes --profile acme send --to slack:C0BFERDV3N0 --subject '[Hermes acme smoke]
34
31
 
35
32
  That succeeded and is useful as an internal smoke test. It does not change the
36
33
  inbound listener rule: each active customer profile needs its own native Slack
37
- app token pair unless Sellable Admin deliberately chooses the dispatcher
38
- fallback.
34
+ app token pair.
39
35
 
40
36
  ## Which Slack Values Are Enough
41
37
 
@@ -128,27 +124,14 @@ closed before making Sellable API calls instead of falling back to shared or
128
124
  admin config state. Only the `sellable-admin` profile should provision,
129
125
  inspect, or repair other profiles.
130
126
 
131
- For the shared dispatcher model, do not copy the shared `SLACK_BOT_TOKEN` or
132
- `SLACK_APP_TOKEN` into customer profile `.env` files. The dispatcher owns those
133
- tokens and route metadata decides the customer profile.
134
-
135
- ## Shared Dispatcher Ownership
136
-
137
- The shared Slack dispatcher and its route registry are fallback Sellable Admin
138
- surfaces. This customer-facing installer must not create shared route bundles or
139
- write shared listener tokens. Sellable Admin owns Slack app creation and profile
140
- provisioning, then calls this installer for profile-local Sellable runtime
141
- bootstrap inside the already-provisioned Hermes profile.
142
-
143
127
  ## Verification
144
128
 
145
- Run the installer and dispatcher UAT before publishing installer changes:
129
+ Run the installer and native profile UAT before publishing installer changes:
146
130
 
147
131
  ```bash
148
132
  npm run test:unit -- tests/install-package/agent-preferences.test.ts
149
133
  scripts/run-phase92-hermes-profile-bootstrap-uat.sh --mode local-temp
150
134
  scripts/run-phase92-hermes-profile-bootstrap-uat.sh --mode linux-shaped
151
- scripts/run-phase031-hermes-slack-dispatcher-uat.sh --mode local-fixture
152
135
  ```
153
136
 
154
137
  Expected proof:
package/README.md CHANGED
@@ -212,6 +212,7 @@ source-scout agents.
212
212
  Use the same public entrypoints across supported hosts:
213
213
 
214
214
  - Claude Code: `/sellable:create-campaign`
215
+ - Claude Code: `/sellable:find-leads`
215
216
  - Claude Code: `/sellable:create-ab-test`
216
217
  - Claude Code: `/sellable:create-evergreen-campaigns`
217
218
  - Claude Code: `/sellable:foundation`
@@ -220,6 +221,7 @@ Use the same public entrypoints across supported hosts:
220
221
  - Claude Code: `/sellable:refresh-sender-engagement`
221
222
  - Claude Code: `/sellable:refill-sends`
222
223
  - Codex: `$sellable:create-campaign`
224
+ - Codex: `$sellable:find-leads`
223
225
  - Codex: `$sellable:create-ab-test`
224
226
  - Codex: `$sellable:create-evergreen-campaigns`
225
227
  - Codex: `$sellable:foundation`
@@ -228,6 +230,7 @@ Use the same public entrypoints across supported hosts:
228
230
  - Codex: `$sellable:refresh-sender-engagement`
229
231
  - Codex: `$sellable:refill-sends`
230
232
  - Hermes: `/sellable-create-campaign`
233
+ - Hermes: `/sellable-find-leads`
231
234
  - Hermes: `/sellable-create-ab-test`
232
235
  - Hermes: `/sellable-create-evergreen-campaigns`
233
236
  - Hermes: `/sellable-foundation`
@@ -237,6 +240,7 @@ Use the same public entrypoints across supported hosts:
237
240
  - Hermes: `/sellable-refill-sends`
238
241
  - Codex Desktop plugin: `sellable@sellable`
239
242
  - Codex visible skill: `Sellable Create Campaign`
243
+ - Codex visible skill: `Sellable Find Leads`
240
244
  - Codex visible skill: `Sellable Create A/B Test`
241
245
  - Codex visible skill: `Sellable Create Evergreen Campaigns`
242
246
  - Codex visible skill: `Sellable Foundation`
@@ -245,6 +249,7 @@ Use the same public entrypoints across supported hosts:
245
249
  - Codex visible skill: `Sellable Refresh Sender Engagement`
246
250
  - Codex visible skill: `Sellable Refill Sends`
247
251
  - Internal MCP workflow prompt: `create-campaign-v2`
252
+ - Internal MCP workflow prompt: `find-leads-v2`
248
253
  - Internal MCP workflow prompt: `refill-sends-workflow`
249
254
  - Internal/backward-compatible memory prompt: `interview`
250
255
 
@@ -48,7 +48,7 @@ function getInstallVersion() {
48
48
  }
49
49
  }
50
50
 
51
- const CODEX_PLUGIN_VERSION = "0.1.61";
51
+ const CODEX_PLUGIN_VERSION = "0.1.63-phase981.202607110535";
52
52
  const CODEX_PLUGIN_COMPAT_VERSIONS = [
53
53
  "0.1.8",
54
54
  "0.1.9",
@@ -213,6 +213,7 @@ Options:
213
213
  Auth:
214
214
  Install is auth-free by default. Sign in happens on the first run of
215
215
  /sellable:create-campaign, /sellable:create-evergreen-campaigns,
216
+ /sellable:find-leads,
216
217
  /sellable:foundation, /sellable:content, /sellable:create-post,
217
218
  /sellable:refresh-sender-engagement, or /sellable:refill-sends in Claude Code,
218
219
  Codex, or Hermes,
@@ -240,11 +241,9 @@ Hermes profile bootstrap:
240
241
  workspace id is supplied, so a customer profile fails closed if the workspace
241
242
  lock is later removed or not yet provisioned.
242
243
 
243
- Hermes shared Slack dispatcher:
244
- Shared listener setup and route-registry validation are internal Sellable
245
- Admin responsibilities. This customer-facing installer only bootstraps a
246
- profile-local Sellable runtime after Sellable Admin provisions the profile
247
- and dispatcher route.
244
+ Hermes customer Slack runtime:
245
+ Each customer profile uses its own dedicated native Slack app and gateway.
246
+ Sellable Admin owns the single resumable customer bootstrap interface.
248
247
  `;
249
248
  }
250
249
 
@@ -1124,6 +1123,35 @@ const CREATE_CAMPAIGN_ALLOWED_TOOLS = [
1124
1123
  "mcp__sellable__start_campaign",
1125
1124
  ];
1126
1125
 
1126
+ const FIND_LEADS_ALLOWED_TOOLS = [
1127
+ "mcp__sellable__get_auth_status",
1128
+ "mcp__sellable__start_cli_login",
1129
+ "mcp__sellable__wait_for_cli_login",
1130
+ "mcp__sellable__get_active_workspace",
1131
+ "mcp__sellable__list_workspaces",
1132
+ "mcp__sellable__set_active_workspace",
1133
+ "mcp__sellable__get_subskill_prompt",
1134
+ "mcp__sellable__get_subskill_asset",
1135
+ "mcp__sellable__search_subskill_prompts",
1136
+ "mcp__sellable__get_provider_prompt",
1137
+ "mcp__sellable__bootstrap_find_leads",
1138
+ "mcp__sellable__get_find_leads_run",
1139
+ "mcp__sellable__update_find_leads_run",
1140
+ "mcp__sellable__wait_for_find_leads_run",
1141
+ "mcp__sellable__cancel_find_leads",
1142
+ "mcp__sellable__reissue_find_leads_watch_link",
1143
+ "mcp__sellable__preflight_find_leads_provider",
1144
+ "mcp__sellable__lookup_sales_nav_filter",
1145
+ "mcp__sellable__search_sales_nav",
1146
+ "mcp__sellable__search_prospeo",
1147
+ "mcp__sellable__search_signals",
1148
+ "mcp__sellable__select_promising_posts",
1149
+ "mcp__sellable__import_leads",
1150
+ "mcp__sellable__wait_for_lead_list_ready",
1151
+ "mcp__sellable__get_rows_minimal",
1152
+ "mcp__sellable__export_table_csv",
1153
+ ];
1154
+
1127
1155
  const CREATE_EVERGREEN_CAMPAIGNS_ALLOWED_TOOLS = [
1128
1156
  ...CREATE_CAMPAIGN_ALLOWED_TOOLS,
1129
1157
  "mcp__sellable__setup_evergreen_campaigns",
@@ -1939,6 +1967,17 @@ then retry \`get_subskill_prompt\`.
1939
1967
  `, host, "create-campaign");
1940
1968
  }
1941
1969
 
1970
+ function findLeadsSkillMd(host = "shared") {
1971
+ const here = dirname(fileURLToPath(import.meta.url));
1972
+ const templatePath = join(here, "..", "skill-templates", "find-leads.md");
1973
+ if (!existsSync(templatePath)) {
1974
+ throw new Error(
1975
+ "Find Leads skill template is missing or stale. Reinstall @sellable/install and retry."
1976
+ );
1977
+ }
1978
+ return stampInstalledHost(readFileSync(templatePath, "utf8"), host, "find-leads");
1979
+ }
1980
+
1942
1981
  function createAbTestSkillMd(host = "shared") {
1943
1982
  try {
1944
1983
  const here = dirname(fileURLToPath(import.meta.url));
@@ -2713,6 +2752,12 @@ will change or after they approve the settings update.
2713
2752
 
2714
2753
  function codexPluginSkills(opts = {}) {
2715
2754
  return [
2755
+ {
2756
+ dir: "sellable-find-leads",
2757
+ displayName: "Sellable Find Leads",
2758
+ description: "Find prospects and build a live exportable lead list",
2759
+ skillMd: findLeadsSkillMd("codex"),
2760
+ },
2716
2761
  {
2717
2762
  dir: "sellable-create-campaign",
2718
2763
  displayName: "Sellable Create Campaign",
@@ -2953,6 +2998,14 @@ then retry \`get_subskill_prompt\`.
2953
2998
 
2954
2999
  function hermesSkillDefinitions(opts = {}) {
2955
3000
  return [
3001
+ {
3002
+ commandName: "find-leads",
3003
+ dir: hermesCommandName("find-leads"),
3004
+ skillMd: normalizeHermesSkillMarkdown(
3005
+ findLeadsSkillMd("hermes"),
3006
+ "find-leads"
3007
+ ),
3008
+ },
2956
3009
  {
2957
3010
  commandName: "create-campaign",
2958
3011
  dir: hermesCommandName("create-campaign"),
@@ -3203,6 +3256,15 @@ ${stripFrontmatter(command.skillMd)}
3203
3256
 
3204
3257
  function claudeCommands(opts = {}) {
3205
3258
  return [
3259
+ {
3260
+ name: "find-leads",
3261
+ title: "Find Leads",
3262
+ filename: join("sellable", "find-leads.md"),
3263
+ description: "Find prospects and build a live exportable Sellable lead list.",
3264
+ argumentHint: "[target audience, provider, or lead-list goal]",
3265
+ skillMd: findLeadsSkillMd("claude"),
3266
+ allowedTools: ["AskUserQuestion", ...FIND_LEADS_ALLOWED_TOOLS],
3267
+ },
3206
3268
  {
3207
3269
  name: "create-campaign",
3208
3270
  title: "Create Campaign",
@@ -5437,7 +5499,8 @@ function printNextSteps(installedHosts, authReused, opts = {}) {
5437
5499
  console.log("");
5438
5500
 
5439
5501
  if (hasClaude) {
5440
- printAgentBox("Using Claude Code?", "claude", [
5502
+ printAgentBox("Using Claude Code?", "claude", [
5503
+ { label: "Find Leads", command: "/sellable:find-leads" },
5441
5504
  { label: "Campaign", command: "/sellable:create-campaign" },
5442
5505
  { label: "Evergreen", command: "/sellable:create-evergreen-campaigns" },
5443
5506
  { label: "Foundation", command: "/sellable:foundation" },
@@ -5450,7 +5513,8 @@ function printNextSteps(installedHosts, authReused, opts = {}) {
5450
5513
  console.log("");
5451
5514
  }
5452
5515
  if (hasCodex) {
5453
- printAgentBox("Using Codex?", "codex", [
5516
+ printAgentBox("Using Codex?", "codex", [
5517
+ { label: "Find Leads", command: "$sellable:find-leads" },
5454
5518
  { label: "Campaign", command: "$sellable:create-campaign" },
5455
5519
  { label: "Evergreen", command: "$sellable:create-evergreen-campaigns" },
5456
5520
  { label: "Foundation", command: "$sellable:foundation" },
@@ -5462,7 +5526,8 @@ function printNextSteps(installedHosts, authReused, opts = {}) {
5462
5526
  console.log("");
5463
5527
  }
5464
5528
  if (hasHermes) {
5465
- printAgentBox("Using Hermes?", "hermes", [
5529
+ printAgentBox("Using Hermes?", "hermes", [
5530
+ { label: "Find Leads", command: "/sellable-find-leads" },
5466
5531
  { label: "Campaign", command: "/sellable-create-campaign" },
5467
5532
  { label: "A/B Test", command: "/sellable-create-ab-test" },
5468
5533
  { label: "Evergreen", command: "/sellable-create-evergreen-campaigns" },
@@ -5832,22 +5897,25 @@ async function main() {
5832
5897
  if (workspaceId) {
5833
5898
  console.log(` activeWorkspaceId: ${workspaceId}`);
5834
5899
  }
5835
- console.log(` Continue in your agent:`);
5836
- console.log(` Claude Code: /sellable:create-campaign`);
5900
+ console.log(` Continue in your agent:`);
5901
+ console.log(` Claude Code: /sellable:find-leads`);
5902
+ console.log(` Claude Code: /sellable:create-campaign`);
5837
5903
  console.log(` Claude Code: /sellable:create-evergreen-campaigns`);
5838
5904
  console.log(` Claude Code: /sellable:foundation`);
5839
5905
  console.log(` Claude Code: /sellable:content`);
5840
5906
  console.log(` Claude Code: /sellable:create-post`);
5841
5907
  console.log(` Claude Code: /sellable:refresh-sender-engagement`);
5842
5908
  console.log(` Claude Code: /sellable:refill-sends`);
5843
- console.log(` Codex: $sellable:create-campaign`);
5909
+ console.log(` Codex: $sellable:find-leads`);
5910
+ console.log(` Codex: $sellable:create-campaign`);
5844
5911
  console.log(` Codex: $sellable:create-evergreen-campaigns`);
5845
5912
  console.log(` Codex: $sellable:foundation`);
5846
5913
  console.log(` Codex: $sellable:content`);
5847
5914
  console.log(` Codex: $sellable:create-post`);
5848
5915
  console.log(` Codex: $sellable:refresh-sender-engagement`);
5849
5916
  console.log(` Codex: $sellable:refill-sends`);
5850
- console.log(` Hermes: /sellable-create-campaign`);
5917
+ console.log(` Hermes: /sellable-find-leads`);
5918
+ console.log(` Hermes: /sellable-create-campaign`);
5851
5919
  console.log(` Hermes: /sellable-create-evergreen-campaigns`);
5852
5920
  console.log(` Hermes: /sellable-foundation`);
5853
5921
  console.log(` Hermes: /sellable-content`);
@@ -11,13 +11,25 @@ export const REQUIRED_SELLABLE_MCP_TOOLS = [
11
11
  "start_cli_login",
12
12
  "wait_for_cli_login",
13
13
  "bootstrap_create_campaign",
14
+ "bootstrap_find_leads",
15
+ "get_find_leads_run",
16
+ "update_find_leads_run",
17
+ "wait_for_find_leads_run",
18
+ "cancel_find_leads",
19
+ "reissue_find_leads_watch_link",
20
+ "preflight_find_leads_provider",
14
21
  "get_subskill_prompt",
15
22
  "get_subskill_asset",
16
23
  "search_subskill_prompts",
17
24
  "create_campaign",
18
25
  "import_leads",
26
+ "search_sales_nav",
27
+ "search_prospeo",
28
+ "search_signals",
29
+ "select_promising_posts",
19
30
  "confirm_lead_list",
20
31
  "wait_for_lead_list_ready",
32
+ "export_table_csv",
21
33
  "wait_for_campaign_table_ready",
22
34
  "update_campaign",
23
35
  "update_campaign_brief",
@@ -76,6 +88,14 @@ export const CREATE_CAMPAIGN_SMOKE_CALLS = [
76
88
  limit: 1200,
77
89
  },
78
90
  },
91
+ {
92
+ name: "get_subskill_prompt",
93
+ arguments: {
94
+ subskillName: "find-leads-v2",
95
+ offset: 0,
96
+ limit: 1200,
97
+ },
98
+ },
79
99
  {
80
100
  name: "get_subskill_prompt",
81
101
  arguments: {
@@ -117,6 +137,15 @@ export const CREATE_CAMPAIGN_SMOKE_CALLS = [
117
137
  limit: 1200,
118
138
  },
119
139
  },
140
+ {
141
+ name: "get_subskill_asset",
142
+ arguments: {
143
+ subskillName: "find-leads-v2",
144
+ assetPath: "core/flow.v1.json",
145
+ offset: 0,
146
+ limit: 1200,
147
+ },
148
+ },
120
149
  ];
121
150
 
122
151
  function collectStderrLines(stream) {
@@ -343,7 +372,7 @@ async function verifyCreateCampaignSmoke({
343
372
  ok: false,
344
373
  missingTools,
345
374
  calls,
346
- error: `Missing smoke tool(s): ${missingTools.join(", ")}`,
375
+ error: `Missing or stale Sellable MCP tool(s): ${missingTools.join(", ")}. Reinstall @sellable/install and @sellable/mcp, restart or reload the host, then retry Find Leads.`,
347
376
  startedAt,
348
377
  completedAt: new Date().toISOString(),
349
378
  };
@@ -662,7 +691,7 @@ async function verifySellableMcpRuntimeOnce({
662
691
  ),
663
692
  calls: [],
664
693
  error:
665
- "Skipping create-campaign smoke because required MCP tools are missing.",
694
+ "Sellable MCP is missing required tools. Reinstall @sellable/install and @sellable/mcp, restart or reload the host, then retry Find Leads.",
666
695
  startedAt: new Date().toISOString(),
667
696
  completedAt: new Date().toISOString(),
668
697
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.331",
3
+ "version": "0.1.333-phase981.202607110535",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code, Codex, and Hermes",
6
6
  "bin": {
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: find-leads
3
+ description: Find or source prospects, build and watch a live Sellable lead list, and export the finished list without creating a campaign.
4
+ visibility: public
5
+ allowed-tools:
6
+ - mcp__sellable__get_auth_status
7
+ - mcp__sellable__start_cli_login
8
+ - mcp__sellable__wait_for_cli_login
9
+ - mcp__sellable__get_active_workspace
10
+ - mcp__sellable__list_workspaces
11
+ - mcp__sellable__set_active_workspace
12
+ - mcp__sellable__get_subskill_prompt
13
+ - mcp__sellable__get_subskill_asset
14
+ - mcp__sellable__search_subskill_prompts
15
+ - mcp__sellable__get_provider_prompt
16
+ - mcp__sellable__bootstrap_find_leads
17
+ - mcp__sellable__get_find_leads_run
18
+ - mcp__sellable__update_find_leads_run
19
+ - mcp__sellable__wait_for_find_leads_run
20
+ - mcp__sellable__cancel_find_leads
21
+ - mcp__sellable__reissue_find_leads_watch_link
22
+ - mcp__sellable__preflight_find_leads_provider
23
+ - mcp__sellable__lookup_sales_nav_filter
24
+ - mcp__sellable__search_sales_nav
25
+ - mcp__sellable__search_prospeo
26
+ - mcp__sellable__search_signals
27
+ - mcp__sellable__select_promising_posts
28
+ - mcp__sellable__import_leads
29
+ - mcp__sellable__wait_for_lead_list_ready
30
+ - mcp__sellable__get_rows_minimal
31
+ - mcp__sellable__export_table_csv
32
+ ---
33
+
34
+ # Sellable Find Leads
35
+
36
+ Use this public command when the user asks to find or source prospects, build a lead list,
37
+ watch the list fill in real time, review leads, or export the list.
38
+ It works without an existing campaign.
39
+
40
+ ## Load the canonical workflow
41
+
42
+ 1. Call `mcp__sellable__get_auth_status({})` and complete login/workspace setup
43
+ if required.
44
+ 2. Load `mcp__sellable__get_subskill_prompt({ subskillName: "find-leads-v2" })`.
45
+ Continue chunks until `hasMore` is false.
46
+ 3. Load `mcp__sellable__get_subskill_asset({ subskillName: "find-leads-v2",
47
+ assetPath: "core/flow.v1.json" })`.
48
+ 4. Execute that prompt and flow as the operational source of truth.
49
+
50
+ Do not emulate the workflow from memory or local files. If prompt or asset
51
+ loading fails, use `search_subskill_prompts({ query: "find-leads-v2",
52
+ includePublic: true, includeInternal: true })`, retry once, then give the
53
+ workflow's reinstall/reload guidance.
54
+
55
+ Keep approval questions in the current chat. A source-plan approval allows only
56
+ the bounded provider search. A later import approval is required before rows
57
+ are materialized. Export uses the source list directly.