@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 +3 -6
- package/bin/sellable-install.mjs +10 -99
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +11 -2
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
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -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
|
|
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
|
-
|
|
3798
|
-
|
|
3799
|
-
|
|
3800
|
-
|
|
3801
|
-
|
|
3802
|
-
|
|
3803
|
-
|
|
3804
|
-
|
|
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
|
@@ -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
|
|
124
|
-
|
|
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
|