@sellable/install 0.1.102 → 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",
@@ -647,7 +647,8 @@ 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
649
  Before any provider prompt, search, source scout, or signal-discovery call,
650
- show a short source-plan gate and ask for approval. The gate should say:
650
+ show a short source-plan gate and ask for approval. This first approval
651
+ authorizes scouting/search only. The gate should say:
651
652
 
652
653
  - given this campaign, the viable source options
653
654
  - the recommended first lane
@@ -656,14 +657,19 @@ show a short source-plan gate and ask for approval. The gate should say:
656
657
  - the fallback lane if relevant posts or ICP engagement look thin
657
658
  - that approval authorizes scouting/search only, not lead import or sending
658
659
 
659
- If active prospects likely engage with relevant LinkedIn content, recommend
660
- LinkedIn post engagement / Signal Discovery and name the post themes you will
661
- look for. If the niche is too private, low-volume, or unlikely to have relevant
662
- public posts, recommend Sales Nav recent activity, broader Sales Nav role/title
663
- filters, or Prospeo, and explain the tradeoff. Do not call \`search_signals\`,
664
- \`search_sales_nav\`, \`search_prospeo\`, \`fetch_post_engagers\`, or provider-scoped
665
- subagents until the user approves this source plan or explicitly chooses a
666
- different source.
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.
667
673
 
668
674
  For campaign-attached Signal Discovery sampling, promote/select the exact posts
669
675
  with \`select_promising_posts\` before \`fetch_post_engagers\` so the user can see
@@ -965,8 +971,9 @@ updates.
965
971
  is synced into the campaign brief. When filters are approved, immediately
966
972
  call \`mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })\`
967
973
  so the watched app moves to Filter Rules while rubrics are drafted/saved.
968
- After rubrics save, pause and say the fit rules are saved; approve the
969
- message template next; after approval, queue the bounded review-batch
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
970
977
  \`enrichCellId\` cells to kick off enrichment/filtering.
971
978
  Product Generate Message cells must not run from the background template
972
979
  path before that template/token approval. AI Generated uses the
@@ -974,7 +981,7 @@ updates.
974
981
  draft.
975
982
  6. The main thread owns watch navigation: use \`filter-choice\` after the 15-row
976
983
  review batch, \`create-icp-rubric\` as soon as filters are approved,
977
- \`messages\` for the Use Template / AI Generated mode choice,
984
+ \`apply-icp-rubric\` after rubrics save, \`messages\` for the Use Template / AI Generated mode choice,
978
985
  \`auto-execute-messaging\` for approved message work or the product's
979
986
  AI-generated path, and \`awaiting-user-greenlight\` for the final handoff.
980
987
  \`validate-sample\` is recovery/legacy only if reached.
@@ -1176,18 +1183,17 @@ show you the draft next so you can approve it or change it.
1176
1183
  Good opening:
1177
1184
 
1178
1185
  \`\`\`text
1179
- I’ll help you launch this as a Sellable campaign. First I’ll confirm who we’re
1180
- sending from and which company this is for, then I’ll turn that into a campaign
1181
- 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.
1182
1189
  \`\`\`
1183
1190
 
1184
1191
  Good identity setup:
1185
1192
 
1186
1193
  \`\`\`text
1187
- I’ll check whether you already have a connected sender here. If I find one, I’ll
1188
- ask whether that’s you and whether this campaign is for that company. If not,
1189
- just paste your LinkedIn URL or company domain and I’ll look it up before we
1190
- 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.
1191
1197
  \`\`\`
1192
1198
 
1193
1199
  Bad:
@@ -2388,7 +2394,9 @@ async function main() {
2388
2394
  );
2389
2395
  console.log(`✓ Token saved to ${authPath()}`);
2390
2396
  console.log(` apiUrl: ${apiUrl}`);
2391
- 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`);
2392
2400
  process.exit(0);
2393
2401
  }
2394
2402
  if (rawArgs[0] === "uninstall") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.102",
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
@@ -118,7 +119,8 @@ 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
 
120
121
  Before any provider prompt, search, source scout, or signal-discovery call,
121
- show a short source-plan gate and ask for approval. The gate should say:
122
+ show a short source-plan gate and ask for approval. This first approval
123
+ authorizes scouting/search only. The gate should say:
122
124
 
123
125
  - given this campaign, the viable source options
124
126
  - the recommended first lane
@@ -127,14 +129,19 @@ show a short source-plan gate and ask for approval. The gate should say:
127
129
  - the fallback lane if relevant posts or ICP engagement look thin
128
130
  - that approval authorizes scouting/search only, not lead import or sending
129
131
 
130
- If active prospects likely engage with relevant LinkedIn content, recommend
131
- LinkedIn post engagement / Signal Discovery and name the post themes you will
132
- look for. If the niche is too private, low-volume, or unlikely to have relevant
133
- public posts, recommend Sales Nav recent activity, broader Sales Nav role/title
134
- filters, or Prospeo, and explain the tradeoff. Do not call `search_signals`,
135
- `search_sales_nav`, `search_prospeo`, `fetch_post_engagers`, or provider-scoped
136
- subagents until the user approves this source plan or explicitly chooses a
137
- different source.
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.
138
145
 
139
146
  When the user has not supplied a source and multiple source angles are viable,
140
147
  scout those angles as independent branches when the host can actually do it:
@@ -331,7 +338,7 @@ the brief. This is only the client-prospect/bootstrap identity for
331
338
  Do not call `mcp__sellable__list_senders`, `mcp__sellable__get_sender`, or
332
339
  surface connected/missing sender state during setup, brief, source, filter, or
333
340
  message review. Sender availability belongs only to the Settings/final launch
334
- handoff after message approval and the 10-lead validation sample.
341
+ handoff after message approval and the review-batch validation sample.
335
342
 
336
343
  If the invocation or user answer includes an existing `clientProspectId`, keep
337
344
  it as the preferred `create_campaign` identity input. If it includes a LinkedIn
@@ -537,9 +544,9 @@ updates.
537
544
  ```text
538
545
  You're in — {activeWorkspaceName} workspace, ready to roll.
539
546
 
540
- 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.
541
548
 
542
- e.g. https://www.linkedin.com/in/your-handle
549
+ e.g. https://example.com or https://www.linkedin.com/in/client-handle
543
550
  ```
544
551
 
545
552
  - If `isReturningUser === false`, prepend ONE line confirming the new
@@ -548,16 +555,18 @@ updates.
548
555
  ```text
549
556
  You're set up — your {activeWorkspaceName} workspace is ready.
550
557
 
551
- 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.
552
559
 
553
- e.g. https://www.linkedin.com/in/your-handle
560
+ e.g. https://example.com or https://www.linkedin.com/in/client-handle
554
561
  ```
555
562
 
556
563
  No other lines. No "all set", no "signed in", no other acknowledgement.
557
564
 
558
- After the user pastes the URL, proceed with the existing identity-first
559
- sender flow (Step 3 onwards in the v2 subskill prompt sender
560
- 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.
561
570
 
562
571
  3. If auth is not OK with `error.type === "workspace"` (token valid, no active
563
572
  workspace), stop and show the returned guidance — that's not a fresh-user
@@ -599,8 +608,9 @@ updates.
599
608
  is synced into the campaign brief. When filters are approved, immediately
600
609
  call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
601
610
  so the watched app moves to Filter Rules while rubrics are drafted/saved.
602
- After rubrics save, pause and say the fit rules are saved; approve the
603
- message template next; after approval, queue the bounded review-batch
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
604
614
  `enrichCellId` cells to kick off enrichment/filtering.
605
615
  Product Generate Message cells must not run from the background template
606
616
  path before that template/token approval.
@@ -611,7 +621,8 @@ updates.
611
621
  visible work so the user can watch progress in the app: `create-offer` for
612
622
  the brief, `pick-provider` or the selected provider step while sourcing,
613
623
  `filter-choice` after the 15-row review batch, `create-icp-rubric` as soon
614
- as filters are approved, `messages` for the Use Template / AI Generated mode
624
+ as filters are approved, `apply-icp-rubric` after rubrics save, `messages`
625
+ for the Use Template / AI Generated mode
615
626
  choice, `auto-execute-messaging` for approved
616
627
  message work or the product's AI-generated path, `awaiting-user-greenlight`
617
628
  for the final handoff, `settings` for sender selection, `sequence` after