@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 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 installer prompts you for one and shows where to get it.
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
- Get a Sellable API token from:
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 paste it into the installer, or pass it with `--token` / `SELLABLE_TOKEN`.
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
 
@@ -40,7 +40,7 @@ function getMcpVersion() {
40
40
  } catch {}
41
41
  return "latest";
42
42
  }
43
- const CODEX_PLUGIN_VERSION = "0.1.30";
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. After rubrics save, pause and say the fit
947
- rules are saved; approve the message template next; after approval, queue the
948
- bounded review-batch \`enrichCellId\` cells to kick off enrichment/filtering.
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, \`messages\` for the Use Template / AI Generated mode choice,
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 confirm who we’re
1157
- sending from and which company this is for, then I’ll turn that into a campaign
1158
- brief before anything is created.
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 check whether you already have a connected sender here. If I find one, I’ll
1165
- ask whether that’s you and whether this campaign is for that company. If not,
1166
- just paste your LinkedIn URL or company domain and I’ll look it up before we
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(` Run /sellable:create-campaign in your agent to continue.`);
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.101",
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 entrypoint for Sellable campaign creation.
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 10-lead validation sample.
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 URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.
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/your-handle
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 URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.
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/your-handle
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 existing identity-first
540
- sender flow (Step 3 onwards in the v2 subskill prompt sender
541
- enrichment via `fetch_linkedin_profile` / `enrich_sender`).
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. After rubrics save, pause and say the fit
581
- rules are saved; approve the message template next; after approval, queue the
582
- bounded review-batch `enrichCellId` cells to kick off enrichment/filtering.
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, `messages` for the Use
592
- Template / AI Generated mode choice, `auto-execute-messaging` for approved
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.