@sellable/install 0.1.178 → 0.1.180
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 +9 -7
- package/bin/sellable-install.mjs +72 -31
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +21 -17
package/README.md
CHANGED
|
@@ -23,8 +23,8 @@ agent command for launching a campaign:
|
|
|
23
23
|
sellable create
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
Campaign creation
|
|
27
|
-
MCP tools and approval
|
|
26
|
+
Campaign creation, post drafting, and identity interviews run inside Claude Code
|
|
27
|
+
or Codex, where the Sellable MCP tools and approval flows are available.
|
|
28
28
|
|
|
29
29
|
Install is auth-free by default. If you do not pass a token, the agent handles
|
|
30
30
|
Sellable sign-in on the first campaign run with a magic-link handoff.
|
|
@@ -70,19 +70,21 @@ Use the same public entrypoints in both hosts:
|
|
|
70
70
|
|
|
71
71
|
- Claude Code: `/sellable:create-campaign`
|
|
72
72
|
- Claude Code: `/sellable:interview`
|
|
73
|
-
- Claude Code: `/sellable:
|
|
73
|
+
- Claude Code: `/sellable:create-post`
|
|
74
74
|
- Codex: `$sellable:create-campaign`
|
|
75
75
|
- Codex: `$sellable:interview`
|
|
76
|
-
- Codex: `$sellable:
|
|
76
|
+
- Codex: `$sellable:create-post`
|
|
77
77
|
- Codex Desktop plugin: `sellable@sellable`
|
|
78
78
|
- Codex visible skill: `Sellable Create Campaign`
|
|
79
79
|
- Codex visible skill: `Sellable Identity Interview`
|
|
80
|
-
- Codex visible skill: `Sellable
|
|
80
|
+
- Codex visible skill: `Sellable Create Post`
|
|
81
81
|
- Internal MCP workflow prompt: `create-campaign-v2`
|
|
82
82
|
|
|
83
83
|
Do not ask users to run `/sellable:create-campaign-v2`,
|
|
84
|
-
`$sellable:create-campaign-v2`,
|
|
85
|
-
`create-campaign-v2` is loaded internally
|
|
84
|
+
`$sellable:create-campaign-v2`, `$sellable:load-voice`, or
|
|
85
|
+
`$sellable:sellable:create-campaign`. `create-campaign-v2` is loaded internally
|
|
86
|
+
by the campaign skill. `create-post` loads voice internally, so there is no
|
|
87
|
+
separate public voice-loading command.
|
|
86
88
|
|
|
87
89
|
## Structured Questions
|
|
88
90
|
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -31,7 +31,7 @@ function getInstallVersion() {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
const CODEX_PLUGIN_VERSION = "0.1.
|
|
34
|
+
const CODEX_PLUGIN_VERSION = "0.1.35";
|
|
35
35
|
const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
36
36
|
"0.1.8",
|
|
37
37
|
"0.1.9",
|
|
@@ -59,6 +59,7 @@ const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
|
59
59
|
"0.1.31",
|
|
60
60
|
"0.1.32",
|
|
61
61
|
"0.1.33",
|
|
62
|
+
"0.1.34",
|
|
62
63
|
];
|
|
63
64
|
const INSTALL_PACKAGE_SPEC =
|
|
64
65
|
process.env.SELLABLE_INSTALL_PACKAGE_SPEC || "@sellable/install@latest";
|
|
@@ -149,9 +150,9 @@ Options:
|
|
|
149
150
|
|
|
150
151
|
Auth:
|
|
151
152
|
Install is auth-free by default. Sign in happens on the first run of
|
|
152
|
-
/sellable:create-campaign in Claude Code or Codex,
|
|
153
|
-
you through signup or sign-in and stores credentials
|
|
154
|
-
~/.sellable/config.json.
|
|
153
|
+
/sellable:create-campaign or /sellable:create-post in Claude Code or Codex,
|
|
154
|
+
where the agent walks you through signup or sign-in and stores credentials
|
|
155
|
+
in ~/.sellable/config.json.
|
|
155
156
|
|
|
156
157
|
For CI/scripted installs, pass --token + --workspace-id or set
|
|
157
158
|
SELLABLE_TOKEN + SELLABLE_WORKSPACE_ID and the installer will write the
|
|
@@ -174,11 +175,15 @@ function printCreateCommandHint() {
|
|
|
174
175
|
console.log("");
|
|
175
176
|
printAgentBox("Using Claude Code?", "claude", [
|
|
176
177
|
{ label: "Campaign", command: "/sellable:create-campaign" },
|
|
178
|
+
{ label: "Post", command: "/sellable:create-post" },
|
|
179
|
+
{ label: "Interview", command: "/sellable:interview" },
|
|
177
180
|
]);
|
|
178
181
|
console.log("");
|
|
179
182
|
console.log("");
|
|
180
183
|
printAgentBox("Using Codex?", "codex", [
|
|
181
184
|
{ label: "Campaign", command: "$sellable:create-campaign" },
|
|
185
|
+
{ label: "Post", command: "$sellable:create-post" },
|
|
186
|
+
{ label: "Interview", command: "$sellable:interview" },
|
|
182
187
|
]);
|
|
183
188
|
console.log("");
|
|
184
189
|
console.log(` ${"─".repeat(63)}`);
|
|
@@ -839,16 +844,18 @@ automation just because a watch link exists. If \`create_campaign\` returns
|
|
|
839
844
|
\`watchHandoff.markdown\`, print that exact value once, directly before the brief
|
|
840
845
|
approval question. It will use the URL mode to say Codex or Claude Code:
|
|
841
846
|
|
|
847
|
+
\`\`\`\`markdown
|
|
842
848
|
\`\`\`text
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
849
|
+
+------------------------------------------------------+
|
|
850
|
+
| WATCH CODEX BUILD THE CAMPAIGN LIVE |
|
|
851
|
+
+------------------------------------------------------+
|
|
852
|
+
\`\`\`
|
|
846
853
|
|
|
847
854
|
[Open live campaign builder]({watchUrl})
|
|
848
855
|
|
|
849
856
|
Keep this chat open. I'll ask approval questions here before making decisions
|
|
850
857
|
that need your judgment.
|
|
851
|
-
|
|
858
|
+
\`\`\`\`
|
|
852
859
|
|
|
853
860
|
The Markdown link is intentional: rendered chat clients turn it into a large
|
|
854
861
|
click target, and plain terminals still expose the tokenized URL inside the
|
|
@@ -1226,6 +1233,7 @@ allowed-tools:
|
|
|
1226
1233
|
- mcp__sellable__get_subskill_prompt
|
|
1227
1234
|
- mcp__sellable__get_subskill_asset
|
|
1228
1235
|
- mcp__sellable__search_subskill_prompts
|
|
1236
|
+
- mcp__sellable__capture_post_idea
|
|
1229
1237
|
- Read
|
|
1230
1238
|
- Write
|
|
1231
1239
|
- Edit
|
|
@@ -1262,6 +1270,14 @@ Desktop, then start a new thread.
|
|
|
1262
1270
|
3. Follow the canonical prompt exactly. Save local memory only where that prompt
|
|
1263
1271
|
directs, under \`~/.sellable/configs/core/**\` and
|
|
1264
1272
|
\`~/.sellable/interviews/**\`.
|
|
1273
|
+
4. If the interview captures a content-specific LinkedIn post idea, hook/taste
|
|
1274
|
+
correction, draft-first post calibration note, or voice-note transcript meant
|
|
1275
|
+
as a post idea, the canonical prompt may bridge only that item with
|
|
1276
|
+
\`mcp__sellable__capture_post_idea\` under
|
|
1277
|
+
\`~/.sellable/content/linkedin/ideas/**\`. Core identity, proof, stories,
|
|
1278
|
+
answer-bank entries, transcripts, references, and raw archives must stay in
|
|
1279
|
+
\`~/.sellable/configs/core/**\` and \`~/.sellable/interviews/**\`.
|
|
1280
|
+
Core identity, proof, stories, answer-bank entries, transcripts, references, and raw archives must stay in core/interviews.
|
|
1265
1281
|
|
|
1266
1282
|
## MCP Prompt Fallback
|
|
1267
1283
|
|
|
@@ -1271,27 +1287,40 @@ then retry \`get_subskill_prompt\`.
|
|
|
1271
1287
|
`;
|
|
1272
1288
|
}
|
|
1273
1289
|
|
|
1274
|
-
function
|
|
1290
|
+
function createPostSkillMd() {
|
|
1275
1291
|
return `---
|
|
1276
|
-
name:
|
|
1277
|
-
description:
|
|
1292
|
+
name: create-post
|
|
1293
|
+
description: Capture rough LinkedIn post ideas, research currently working hooks, and save validated drafts in the user's voice.
|
|
1278
1294
|
allowed-tools:
|
|
1295
|
+
- mcp__sellable__get_auth_status
|
|
1279
1296
|
- mcp__sellable__get_subskill_prompt
|
|
1297
|
+
- mcp__sellable__get_subskill_asset
|
|
1280
1298
|
- mcp__sellable__search_subskill_prompts
|
|
1281
|
-
-
|
|
1282
|
-
-
|
|
1283
|
-
-
|
|
1299
|
+
- mcp__sellable__get_engage_memory
|
|
1300
|
+
- mcp__sellable__capture_post_idea
|
|
1301
|
+
- mcp__sellable__get_post_idea
|
|
1302
|
+
- mcp__sellable__list_post_ideas
|
|
1303
|
+
- mcp__sellable__save_hook_research
|
|
1304
|
+
- mcp__sellable__save_post_draft
|
|
1305
|
+
- mcp__sellable__get_post_draft
|
|
1306
|
+
- mcp__sellable__mark_post_published
|
|
1307
|
+
- mcp__sellable__list_published_posts
|
|
1308
|
+
- mcp__sellable__search_engagement_posts
|
|
1309
|
+
- mcp__sellable__fetch_linkedin_posts
|
|
1310
|
+
- mcp__sellable__fetch_linkedin_profile
|
|
1311
|
+
- mcp__sellable__record_engage_proven_search
|
|
1284
1312
|
---
|
|
1285
1313
|
|
|
1286
|
-
# Sellable
|
|
1314
|
+
# Sellable Create Post
|
|
1287
1315
|
|
|
1288
|
-
Use this as the customer-facing entrypoint for
|
|
1289
|
-
|
|
1290
|
-
|
|
1316
|
+
Use this as the customer-facing entrypoint for the Sellable \`create-post\`
|
|
1317
|
+
workflow. It captures raw LinkedIn post ideas, preserves the user's source
|
|
1318
|
+
wording, researches currently working hooks, validates proof/voice/AI tells, and
|
|
1319
|
+
saves drafts under \`~/.sellable/content/linkedin/**\`.
|
|
1291
1320
|
|
|
1292
1321
|
## Bootstrap
|
|
1293
1322
|
|
|
1294
|
-
MCP prompt access
|
|
1323
|
+
MCP prompt access is required. Do not inspect repo files, run shell commands,
|
|
1295
1324
|
use \`npm\`, \`node\`, local harness scripts, or read local prompt files to
|
|
1296
1325
|
emulate this workflow.
|
|
1297
1326
|
|
|
@@ -1302,20 +1331,24 @@ Desktop, then start a new thread.
|
|
|
1302
1331
|
|
|
1303
1332
|
## Execute Workflow
|
|
1304
1333
|
|
|
1305
|
-
1.
|
|
1306
|
-
|
|
1334
|
+
1. Call \`mcp__sellable__get_auth_status({})\` so hook research failures can be
|
|
1335
|
+
distinguished from local content capture.
|
|
1336
|
+
2. Load the canonical prompt via
|
|
1337
|
+
\`mcp__sellable__get_subskill_prompt({ subskillName: "create-post" })\`.
|
|
1307
1338
|
If the response has \`hasMore=true\`, continue with \`nextOffset\` until
|
|
1308
1339
|
\`hasMore=false\`.
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1340
|
+
3. Load every required create-post reference with
|
|
1341
|
+
\`mcp__sellable__get_subskill_asset({ subskillName: "create-post", assetPath: "references/<file>.md" })\`.
|
|
1342
|
+
If any asset response has \`hasMore=true\`, continue with \`nextOffset\`
|
|
1343
|
+
until \`hasMore=false\`.
|
|
1344
|
+
4. Follow the canonical prompt exactly. Use the content tools for ideas,
|
|
1345
|
+
research, drafts, and published records. Do not write repo-local prompt files
|
|
1346
|
+
or append to legacy flat draft files.
|
|
1314
1347
|
|
|
1315
1348
|
## MCP Prompt Fallback
|
|
1316
1349
|
|
|
1317
1350
|
If exact subskill lookup fails, use
|
|
1318
|
-
\`mcp__sellable__search_subskill_prompts({ query: "
|
|
1351
|
+
\`mcp__sellable__search_subskill_prompts({ query: "create-post", includePublic: true, includeInternal: true })\`,
|
|
1319
1352
|
then retry \`get_subskill_prompt\`.
|
|
1320
1353
|
`;
|
|
1321
1354
|
}
|
|
@@ -1524,10 +1557,10 @@ function codexPluginSkills() {
|
|
|
1524
1557
|
skillMd: interviewSkillMd(),
|
|
1525
1558
|
},
|
|
1526
1559
|
{
|
|
1527
|
-
dir: "sellable-
|
|
1528
|
-
displayName: "Sellable
|
|
1529
|
-
description: "
|
|
1530
|
-
skillMd:
|
|
1560
|
+
dir: "sellable-create-post",
|
|
1561
|
+
displayName: "Sellable Create Post",
|
|
1562
|
+
description: "Capture ideas and draft LinkedIn posts in your voice",
|
|
1563
|
+
skillMd: createPostSkillMd(),
|
|
1531
1564
|
},
|
|
1532
1565
|
];
|
|
1533
1566
|
}
|
|
@@ -2500,6 +2533,8 @@ function printNextSteps(installedHosts, authReused) {
|
|
|
2500
2533
|
if (hasClaude) {
|
|
2501
2534
|
printAgentBox("Using Claude Code?", "claude", [
|
|
2502
2535
|
{ label: "Campaign", command: "/sellable:create-campaign" },
|
|
2536
|
+
{ label: "Post", command: "/sellable:create-post" },
|
|
2537
|
+
{ label: "Interview", command: "/sellable:interview" },
|
|
2503
2538
|
]);
|
|
2504
2539
|
console.log("");
|
|
2505
2540
|
console.log("");
|
|
@@ -2507,6 +2542,8 @@ function printNextSteps(installedHosts, authReused) {
|
|
|
2507
2542
|
if (hasCodex) {
|
|
2508
2543
|
printAgentBox("Using Codex?", "codex", [
|
|
2509
2544
|
{ label: "Campaign", command: "$sellable:create-campaign" },
|
|
2545
|
+
{ label: "Post", command: "$sellable:create-post" },
|
|
2546
|
+
{ label: "Interview", command: "$sellable:interview" },
|
|
2510
2547
|
]);
|
|
2511
2548
|
console.log("");
|
|
2512
2549
|
}
|
|
@@ -2777,7 +2814,11 @@ async function main() {
|
|
|
2777
2814
|
console.log(` apiUrl: ${apiUrl}`);
|
|
2778
2815
|
console.log(` Continue in your agent:`);
|
|
2779
2816
|
console.log(` Claude Code: /sellable:create-campaign`);
|
|
2817
|
+
console.log(` Claude Code: /sellable:create-post`);
|
|
2818
|
+
console.log(` Claude Code: /sellable:interview`);
|
|
2780
2819
|
console.log(` Codex: $sellable:create-campaign`);
|
|
2820
|
+
console.log(` Codex: $sellable:create-post`);
|
|
2821
|
+
console.log(` Codex: $sellable:interview`);
|
|
2781
2822
|
process.exit(0);
|
|
2782
2823
|
}
|
|
2783
2824
|
if (rawArgs[0] === "uninstall") {
|
package/package.json
CHANGED
|
@@ -220,19 +220,21 @@ reference to avoid long-token copy errors. Account rows are not people leads
|
|
|
220
220
|
yet. The confirmation creates the `domainFilterId` that constrains the follow-on
|
|
221
221
|
`search_prospeo` people search.
|
|
222
222
|
|
|
223
|
-
For lookalike seed selection,
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
223
|
+
For lookalike seed selection, route by campaign intent. In outbound/sales
|
|
224
|
+
prospecting campaigns, treat "best customer", "top customer", "target domains",
|
|
225
|
+
"approved accounts", "customer domains", and similar wording as target
|
|
226
|
+
account/customer seed asks. Use explicit user-provided target/account/customer
|
|
227
|
+
domains or company names first, then verified past-customer/account evidence from
|
|
228
|
+
research, CRM, or proof. Never substitute the sender's current company/domain or
|
|
229
|
+
employer history as a lookalike seed for outbound unless the user explicitly
|
|
230
|
+
confirms that domain is a target/customer seed or asks for sender-company peers.
|
|
231
|
+
In job-search/application campaigns, lookalike seeds may be existing companies
|
|
232
|
+
from the candidate's current or past employers because those companies define
|
|
233
|
+
the candidate-fit lane. If campaign intent or seed source is ambiguous, ask
|
|
234
|
+
whether the seed should be target/customer domains or current/past employers; if
|
|
235
|
+
YOLO requires moving without a seed, switch to non-lookalike company filters
|
|
236
|
+
instead of inventing a seed. If the user asks for a geography like Germany,
|
|
237
|
+
preserve it in account discovery where supported (`company_location_search` or
|
|
236
238
|
`company_icp.geographic_markets`) and in follow-on people search
|
|
237
239
|
(`person_location_search`); do not drop geography when moving from lookalike
|
|
238
240
|
accounts to people leads.
|
|
@@ -406,16 +408,18 @@ automation just because a watch link exists. If `create_campaign` returns
|
|
|
406
408
|
`watchHandoff.markdown`, print that exact value once, directly before the brief
|
|
407
409
|
approval question. It will use the URL mode to say Codex or Claude Code:
|
|
408
410
|
|
|
411
|
+
````markdown
|
|
409
412
|
```text
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
+
+------------------------------------------------------+
|
|
414
|
+
| WATCH CODEX BUILD THE CAMPAIGN LIVE |
|
|
415
|
+
+------------------------------------------------------+
|
|
416
|
+
```
|
|
413
417
|
|
|
414
418
|
[Open live campaign builder]({watchUrl})
|
|
415
419
|
|
|
416
420
|
Keep this chat open. I'll ask approval questions here before making decisions
|
|
417
421
|
that need your judgment.
|
|
418
|
-
|
|
422
|
+
````
|
|
419
423
|
|
|
420
424
|
The Markdown link is intentional: rendered chat clients turn it into a large
|
|
421
425
|
click target, and plain terminals still expose the tokenized URL inside the
|