@sellable/install 0.1.214 → 0.1.216

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
@@ -31,9 +31,9 @@ agent command for launching a campaign:
31
31
  sellable create
32
32
  ```
33
33
 
34
- Campaign creation, foundation memory, content capture/ideation, post drafting,
35
- and inbox reply management run inside Claude Code or Codex, where the Sellable
36
- MCP tools and approval flows are available.
34
+ Campaign creation, foundation memory, content capture/ideation, and post
35
+ drafting run inside Claude Code or Codex, where the Sellable MCP tools and
36
+ approval flows are available.
37
37
 
38
38
  Install is auth-free by default. If you do not pass a token, the agent handles
39
39
  Sellable sign-in on the first campaign run with a magic-link handoff.
@@ -97,20 +97,17 @@ Use the same public entrypoints in both hosts:
97
97
  - Claude Code: `/sellable:foundation`
98
98
  - Claude Code: `/sellable:content`
99
99
  - Claude Code: `/sellable:create-post`
100
- - Claude Code: `/sellable:inbox`
101
100
  - Codex: `$sellable:create-campaign`
102
101
  - Codex: `$sellable:create-ab-test`
103
102
  - Codex: `$sellable:foundation`
104
103
  - Codex: `$sellable:content`
105
104
  - Codex: `$sellable:create-post`
106
- - Codex: `$sellable:inbox`
107
105
  - Codex Desktop plugin: `sellable@sellable`
108
106
  - Codex visible skill: `Sellable Create Campaign`
109
107
  - Codex visible skill: `Sellable Create A/B Test`
110
108
  - Codex visible skill: `Sellable Foundation`
111
109
  - Codex visible skill: `Sellable Content`
112
110
  - Codex visible skill: `Sellable Create Post`
113
- - Codex visible skill: `Sellable Inbox`
114
111
  - Internal MCP workflow prompt: `create-campaign-v2`
115
112
  - Internal/backward-compatible memory prompt: `interview`
116
113
 
@@ -182,7 +182,7 @@ Options:
182
182
 
183
183
  Auth:
184
184
  Install is auth-free by default. Sign in happens on the first run of
185
- /sellable:create-campaign, /sellable:foundation, /sellable:content, /sellable:create-post, or /sellable:inbox in Claude Code or Codex,
185
+ /sellable:create-campaign, /sellable:foundation, /sellable:content, or /sellable:create-post in Claude Code or Codex,
186
186
  where the agent walks you through signup or sign-in and stores credentials
187
187
  in ~/.sellable/config.json.
188
188
 
@@ -211,7 +211,6 @@ function printCreateCommandHint() {
211
211
  { label: "Foundation", command: "/sellable:foundation" },
212
212
  { label: "Content", command: "/sellable:content" },
213
213
  { label: "Post", command: "/sellable:create-post" },
214
- { label: "Inbox", command: "/sellable:inbox" },
215
214
  ]);
216
215
  console.log("");
217
216
  console.log("");
@@ -221,7 +220,6 @@ function printCreateCommandHint() {
221
220
  { label: "Foundation", command: "$sellable:foundation" },
222
221
  { label: "Content", command: "$sellable:content" },
223
222
  { label: "Post", command: "$sellable:create-post" },
224
- { label: "Inbox", command: "$sellable:inbox" },
225
223
  ]);
226
224
  console.log("");
227
225
  console.log(` ${"─".repeat(63)}`);
@@ -743,6 +741,7 @@ const CREATE_CAMPAIGN_ALLOWED_TOOLS = [
743
741
  "mcp__sellable__select_campaign_cells",
744
742
  "mcp__sellable__queue_campaign_cells",
745
743
  "mcp__sellable__wait_for_campaign_processing",
744
+ "mcp__sellable__fill_campaign_horizon",
746
745
  "mcp__sellable__start_campaign_message_preparation",
747
746
  "mcp__sellable__get_campaign_message_preparation_status",
748
747
  "mcp__sellable__cancel_campaign_message_preparation",
@@ -1755,67 +1754,6 @@ then retry \`get_subskill_prompt\`.
1755
1754
  `, host, "create-post");
1756
1755
  }
1757
1756
 
1758
- function inboxSkillMd(host = "shared") {
1759
- return stampInstalledHost(`---
1760
- name: inbox
1761
- description: Search Sellable inbox threads, review reply eligibility, and manage approval-gated LinkedIn replies.
1762
- allowed-tools:
1763
- - mcp__sellable__get_auth_status
1764
- - mcp__sellable__search_inbox_threads
1765
- - mcp__sellable__get_inbox_thread
1766
- - mcp__sellable__check_inbox_reply_eligibility
1767
- - mcp__sellable__update_inbox_draft
1768
- - mcp__sellable__send_inbox_draft
1769
- - mcp__sellable__send_inbox_manual_reply
1770
- ---
1771
-
1772
- # Sellable Inbox
1773
-
1774
- Use this as the customer-facing entrypoint for Sellable inbox reply management.
1775
- It can search LinkedIn inbox threads, load thread history, check product reply
1776
- eligibility, update an existing draft, send an approved draft, or send one exact
1777
- manual reply.
1778
-
1779
- ## Bootstrap
1780
-
1781
- MCP tool access is required. First call \`mcp__sellable__get_auth_status({})\`.
1782
- Do not inspect repo files, run shell commands, use \`npm\`, \`node\`, local
1783
- harness scripts, browser automation, or product API routes to emulate this
1784
- workflow.
1785
-
1786
- If the Sellable MCP tool is unavailable, stop and say this is a Codex
1787
- install/reload problem. Tell the user to run
1788
- \`curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | sh\`, fully quit and reopen Codex
1789
- Desktop, then start a new thread.
1790
-
1791
- ## Read Workflow
1792
-
1793
- 1. Call \`mcp__sellable__get_auth_status({})\`.
1794
- 2. Use \`mcp__sellable__search_inbox_threads({ limit, search?, filter?, status?, senderId?, classification?, includeReplyEligibility? })\` to find candidate threads.
1795
- 3. Use \`mcp__sellable__get_inbox_thread({ threadId })\` before summarizing or drafting.
1796
- 4. Use \`mcp__sellable__check_inbox_reply_eligibility({ threadId })\` before proposing any reply send path.
1797
-
1798
- ## Approval Gates
1799
-
1800
- Never call \`mcp__sellable__update_inbox_draft\`,
1801
- \`mcp__sellable__send_inbox_draft\`, or
1802
- \`mcp__sellable__send_inbox_manual_reply\` until the user has explicitly
1803
- approved all of:
1804
-
1805
- - workspace/account context
1806
- - sender
1807
- - thread or recipient
1808
- - exact body
1809
- - exact tool to call
1810
- - expected side effect
1811
-
1812
- Draft edits only edit an existing draft. They do not create a new reply draft.
1813
- Send tools support one thread at a time; do not batch sends. If any approval,
1814
- snapshot, hash, version, eligibility, or idempotency value is missing or stale,
1815
- stop and re-read the thread instead of guessing.
1816
- `, host, "inbox");
1817
- }
1818
-
1819
1757
  function createCampaignSoulMd() {
1820
1758
  return `# Sellable Campaign GTM Engineer Soul
1821
1759
 
@@ -2037,12 +1975,6 @@ function codexPluginSkills() {
2037
1975
  description: "Capture ideas and draft LinkedIn posts in your voice",
2038
1976
  skillMd: createPostSkillMd(),
2039
1977
  },
2040
- {
2041
- dir: "sellable-inbox",
2042
- displayName: "Sellable Inbox",
2043
- description: "Search and manage approval-gated LinkedIn inbox replies",
2044
- skillMd: inboxSkillMd(),
2045
- },
2046
1978
  ];
2047
1979
  }
2048
1980
 
@@ -2268,23 +2200,6 @@ function claudeCommands() {
2268
2200
  argumentHint: "[post idea or source material]",
2269
2201
  skillMd: createPostSkillMd(),
2270
2202
  },
2271
- {
2272
- name: "inbox",
2273
- title: "Inbox",
2274
- filename: join("sellable", "inbox.md"),
2275
- description: "Search and manage approval-gated Sellable inbox replies.",
2276
- argumentHint: "[thread, sender, recipient, or reply goal]",
2277
- skillMd: inboxSkillMd(),
2278
- allowedTools: [
2279
- "mcp__sellable__get_auth_status",
2280
- "mcp__sellable__search_inbox_threads",
2281
- "mcp__sellable__get_inbox_thread",
2282
- "mcp__sellable__check_inbox_reply_eligibility",
2283
- "mcp__sellable__update_inbox_draft",
2284
- "mcp__sellable__send_inbox_draft",
2285
- "mcp__sellable__send_inbox_manual_reply",
2286
- ],
2287
- },
2288
2203
  ].map((command) => ({
2289
2204
  ...command,
2290
2205
  content: claudeCommandMd(command),
@@ -3508,7 +3423,6 @@ function printNextSteps(installedHosts, authReused) {
3508
3423
  { label: "Foundation", command: "/sellable:foundation" },
3509
3424
  { label: "Content", command: "/sellable:content" },
3510
3425
  { label: "Post", command: "/sellable:create-post" },
3511
- { label: "Inbox", command: "/sellable:inbox" },
3512
3426
  ]);
3513
3427
  console.log("");
3514
3428
  console.log("");
@@ -3519,7 +3433,6 @@ function printNextSteps(installedHosts, authReused) {
3519
3433
  { label: "Foundation", command: "$sellable:foundation" },
3520
3434
  { label: "Content", command: "$sellable:content" },
3521
3435
  { label: "Post", command: "$sellable:create-post" },
3522
- { label: "Inbox", command: "$sellable:inbox" },
3523
3436
  ]);
3524
3437
  console.log("");
3525
3438
  }
@@ -3794,16 +3707,14 @@ async function main() {
3794
3707
  console.log(` apiUrl: ${apiUrl}`);
3795
3708
  console.log(` Continue in your agent:`);
3796
3709
  console.log(` Claude Code: /sellable:create-campaign`);
3797
- console.log(` Claude Code: /sellable:foundation`);
3798
- console.log(` Claude Code: /sellable:content`);
3799
- console.log(` Claude Code: /sellable:create-post`);
3800
- console.log(` Claude Code: /sellable:inbox`);
3801
- console.log(` Codex: $sellable:create-campaign`);
3802
- console.log(` Codex: $sellable:foundation`);
3803
- console.log(` Codex: $sellable:content`);
3804
- console.log(` Codex: $sellable:create-post`);
3805
- console.log(` Codex: $sellable:inbox`);
3806
- process.exit(0);
3710
+ console.log(` Claude Code: /sellable:foundation`);
3711
+ console.log(` Claude Code: /sellable:content`);
3712
+ console.log(` Claude Code: /sellable:create-post`);
3713
+ console.log(` Codex: $sellable:create-campaign`);
3714
+ console.log(` Codex: $sellable:foundation`);
3715
+ console.log(` Codex: $sellable:content`);
3716
+ console.log(` Codex: $sellable:create-post`);
3717
+ process.exit(0);
3807
3718
  }
3808
3719
  if (rawArgs[0] === "prefs") {
3809
3720
  const dryRun = rawArgs.includes("--dry-run");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.214",
3
+ "version": "0.1.216",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -46,6 +46,7 @@ allowed-tools:
46
46
  - mcp__sellable__select_campaign_cells
47
47
  - mcp__sellable__queue_campaign_cells
48
48
  - mcp__sellable__wait_for_campaign_processing
49
+ - mcp__sellable__fill_campaign_horizon
49
50
  - mcp__sellable__start_campaign_message_preparation
50
51
  - mcp__sellable__get_campaign_message_preparation_status
51
52
  - mcp__sellable__cancel_campaign_message_preparation
@@ -107,6 +108,13 @@ the template is approved.
107
108
  The default path stays the existing first campaign-table execution slice:
108
109
  review the normal `reviewBatchLimit:15`, approve reviewed draft rows, then move
109
110
  to Settings/sequence/final greenlight. Only call
111
+ `fill_campaign_horizon` for explicit source-cleanup horizon-fill requests, such
112
+ as "fill sends from Signal Discovery but not John Cutler posts." Run
113
+ `fill_campaign_horizon({ action:"audit", ... })` first, then apply with the
114
+ returned `stateRevision`. It imports/prepares at most 300 eligible non-excluded
115
+ source rows in the first pass, caps prep batches at 100, skips existing rows
116
+ from excluded post/author sources, and does not launch the campaign. If the
117
+ user only asks for generic extra sends with no source cleanup, use
110
118
  `start_campaign_message_preparation` when the user explicitly asks for more
111
119
  prepared messages, a send count, or language like "fill up/load sends for these
112
120
  senders." Treat those requests as capacity-fill preparation: calculate the
@@ -120,8 +128,9 @@ count `checkedRows` as enriched rows; it is only the table cursor. Use
120
128
  messages", set `targetPreparedMessages:X`, omit `maxRowsToCheck`, and keep
121
129
  `approvalMode:"mark_ready"`. The backend calibrates on at least 100 actually
122
130
  enriched rows, estimates the row budget from observed rubric/pass yield, caps
123
- `maxRowsToCheck` at 2500, then adapts later batches up to 250 rows while
124
- recalculating yield. If the user says "approve X messages", use
131
+ `maxRowsToCheck` at 300, then continues in batches capped at 100 newly checked
132
+ rows. It will not pull another row batch while the current checked batch still
133
+ has queueable or active cells. If the user says "approve X messages", use
125
134
  `approvalMode:"approve"` but still do not launch. If the user says "schedule X
126
135
  sends" or asks to fill sender sends, use `approvalMode:"approve"` to approve
127
136
  exactly the bounded X-message cohort during preparation, then continue through