@sellable/mcp 0.1.247 → 0.1.249
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 +19 -6
- package/dist/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/tools/campaigns.js +5 -20
- package/dist/tools/prompts.d.ts +3 -3
- package/dist/tools/prompts.js +1 -0
- package/dist/tools/registry.d.ts +2 -2
- package/package.json +1 -1
- package/skills/content/SKILL.md +213 -0
- package/skills/create-campaign/SKILL.md +11 -15
- package/skills/create-campaign-v2/SOUL.md +6 -10
- package/skills/create-campaign-v2/references/watch-link-handoff.md +6 -10
- package/skills/create-post/SKILL.md +1 -1
- package/skills/research/config.json +9 -0
package/README.md
CHANGED
|
@@ -16,9 +16,10 @@ Each message gets 5+ minutes of Claude attention with deep research - no other t
|
|
|
16
16
|
|
|
17
17
|
### Prompt Source Of Truth
|
|
18
18
|
|
|
19
|
-
There are
|
|
19
|
+
There are four public Sellable entrypoints shared across hosts:
|
|
20
20
|
|
|
21
21
|
- `sellable:create-campaign`
|
|
22
|
+
- `sellable:content`
|
|
22
23
|
- `sellable:interview`
|
|
23
24
|
- `sellable:create-post`
|
|
24
25
|
|
|
@@ -33,6 +34,12 @@ from:
|
|
|
33
34
|
|
|
34
35
|
- `mcp/sellable/skills/interview/SKILL.md`
|
|
35
36
|
|
|
37
|
+
The content public wrapper captures transcripts and rough notes, clusters
|
|
38
|
+
recurring ideas, extracts story/proof/question cards, and develops post seeds
|
|
39
|
+
before drafting from:
|
|
40
|
+
|
|
41
|
+
- `mcp/sellable/skills/content/SKILL.md`
|
|
42
|
+
|
|
36
43
|
The create-post public wrapper captures raw ideas, loads voice internally,
|
|
37
44
|
researches hooks plus market beliefs, develops a premise with story/tension and
|
|
38
45
|
reader value, validates proof/AI tells, and saves content artifacts under
|
|
@@ -137,9 +144,9 @@ The installer does the full local setup:
|
|
|
137
144
|
`mcp__sellable__*` tools into skill sessions
|
|
138
145
|
|
|
139
146
|
After the installer passes, fully quit and reopen Codex Desktop. Start a new
|
|
140
|
-
thread and select `Sellable Create Campaign`, `Sellable
|
|
141
|
-
`Sellable Create Post`; or invoke `$sellable:create-campaign`,
|
|
142
|
-
`$sellable:interview`, or `$sellable:create-post`. If the app still says
|
|
147
|
+
thread and select `Sellable Create Campaign`, `Sellable Content`,
|
|
148
|
+
`Sellable Identity Interview`, or `Sellable Create Post`; or invoke `$sellable:create-campaign`,
|
|
149
|
+
`$sellable:content`, `$sellable:interview`, or `$sellable:create-post`. If the app still says
|
|
143
150
|
`mcp__sellable__*` tools are missing after the installer passes, check that
|
|
144
151
|
`~/.codex/config.toml` contains both `[marketplaces.sellable]` and
|
|
145
152
|
`[plugins."sellable@sellable"]`.
|
|
@@ -151,16 +158,20 @@ the Sellable MCP tools for Codex Desktop.
|
|
|
151
158
|
Use these names consistently:
|
|
152
159
|
|
|
153
160
|
- Claude Code command: `/sellable:create-campaign`
|
|
161
|
+
- Claude Code command: `/sellable:content`
|
|
154
162
|
- Claude Code command: `/sellable:interview`
|
|
155
163
|
- Claude Code command: `/sellable:create-post`
|
|
156
164
|
- Codex command: `$sellable:create-campaign`
|
|
165
|
+
- Codex command: `$sellable:content`
|
|
157
166
|
- Codex command: `$sellable:interview`
|
|
158
167
|
- Codex command: `$sellable:create-post`
|
|
159
168
|
- Codex Desktop plugin: `sellable@sellable`
|
|
160
169
|
- Codex visible skill: `Sellable Create Campaign`
|
|
170
|
+
- Codex visible skill: `Sellable Content`
|
|
161
171
|
- Codex visible skill: `Sellable Identity Interview`
|
|
162
172
|
- Codex visible skill: `Sellable Create Post`
|
|
163
173
|
- Codex skill frontmatter name: `create-campaign`
|
|
174
|
+
- Codex skill frontmatter name: `content`
|
|
164
175
|
- Codex skill frontmatter name: `interview`
|
|
165
176
|
- Codex skill frontmatter name: `create-post`
|
|
166
177
|
- MCP server name: `sellable`
|
|
@@ -170,8 +181,10 @@ Never tell users to run `/sellable:create-campaign-v2`,
|
|
|
170
181
|
`$sellable:create-campaign-v2`, `$sellable:load-voice`, or
|
|
171
182
|
`$sellable:sellable:create-campaign`. `create-campaign-v2` is an internal MCP
|
|
172
183
|
subskill loaded by `get_subskill_prompt({ subskillName: "create-campaign-v2" })`.
|
|
173
|
-
`load-voice` is an internal direct MCP utility
|
|
174
|
-
|
|
184
|
+
`load-voice` is an internal direct MCP utility. `content` is the preferred
|
|
185
|
+
entrypoint for adding transcripts, recurring ideas, and post seeds; `create-post`
|
|
186
|
+
remains a supported direct drafting shortcut and loads voice silently for post
|
|
187
|
+
drafting.
|
|
175
188
|
|
|
176
189
|
## Structured Question Parity
|
|
177
190
|
|
package/dist/index-dev.js
CHANGED
|
File without changes
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/tools/campaigns.js
CHANGED
|
@@ -49,31 +49,16 @@ function getCampaignBuilderWatchModeFromUrl(watchUrl) {
|
|
|
49
49
|
export function getCampaignBuilderWatchModeDriverLabel(mode = getCampaignBuilderWatchModeParam()) {
|
|
50
50
|
return mode === "codex" ? "Codex" : "Claude Code";
|
|
51
51
|
}
|
|
52
|
-
function buildWatchHandoffHeadlineBox(headline) {
|
|
53
|
-
const width = 52;
|
|
54
|
-
const visibleHeadline = headline.length > width ? headline.slice(0, width) : headline;
|
|
55
|
-
const padding = Math.max(width - visibleHeadline.length, 0);
|
|
56
|
-
const left = Math.floor(padding / 2);
|
|
57
|
-
const right = padding - left;
|
|
58
|
-
const border = `+${"-".repeat(width + 2)}+`;
|
|
59
|
-
return [
|
|
60
|
-
"```",
|
|
61
|
-
border,
|
|
62
|
-
`| ${" ".repeat(left)}${visibleHeadline}${" ".repeat(right)} |`,
|
|
63
|
-
border,
|
|
64
|
-
"```",
|
|
65
|
-
].join("\n");
|
|
66
|
-
}
|
|
67
52
|
export function buildCampaignWatchHandoffMarkdown(watchUrl, mode = getCampaignBuilderWatchModeFromUrl(watchUrl) ??
|
|
68
53
|
getCampaignBuilderWatchModeParam()) {
|
|
69
54
|
const driverLabel = getCampaignBuilderWatchModeDriverLabel(mode);
|
|
70
55
|
const headline = `WATCH ${driverLabel.toUpperCase()} BUILD THE CAMPAIGN LIVE`;
|
|
71
56
|
return [
|
|
72
|
-
|
|
73
|
-
"",
|
|
74
|
-
|
|
75
|
-
"",
|
|
76
|
-
"Keep this chat open. I'll ask approval questions here before making decisions that need your judgment.",
|
|
57
|
+
`> **${headline}**`,
|
|
58
|
+
">",
|
|
59
|
+
`> [Open live campaign builder](${watchUrl})`,
|
|
60
|
+
">",
|
|
61
|
+
"> Keep this chat open. I'll ask approval questions here before making decisions that need your judgment.",
|
|
77
62
|
].join("\n");
|
|
78
63
|
}
|
|
79
64
|
function buildCampaignBuilderWatchPath(campaignId) {
|
package/dist/tools/prompts.d.ts
CHANGED
|
@@ -135,7 +135,7 @@ export interface PostFindLeadsScoutRegistryResponse {
|
|
|
135
135
|
}
|
|
136
136
|
export declare const DEFAULT_SUBSKILL_PROMPT_CHUNK_CHARS = 48000;
|
|
137
137
|
export declare const MAX_SUBSKILL_PROMPT_CHUNK_CHARS = 48000;
|
|
138
|
-
export declare const ALLOWED_SUBSKILL_PROMPT_NAMES: readonly ["building-gtm-tables", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
138
|
+
export declare const ALLOWED_SUBSKILL_PROMPT_NAMES: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
139
139
|
export declare const promptToolDefinitions: ({
|
|
140
140
|
name: string;
|
|
141
141
|
description: string;
|
|
@@ -179,7 +179,7 @@ export declare const promptToolDefinitions: ({
|
|
|
179
179
|
properties: {
|
|
180
180
|
subskillName: {
|
|
181
181
|
type: string;
|
|
182
|
-
enum: readonly ["building-gtm-tables", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
182
|
+
enum: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
183
183
|
description: string;
|
|
184
184
|
};
|
|
185
185
|
offset: {
|
|
@@ -214,7 +214,7 @@ export declare const promptToolDefinitions: ({
|
|
|
214
214
|
properties: {
|
|
215
215
|
subskillName: {
|
|
216
216
|
type: string;
|
|
217
|
-
enum: readonly ["building-gtm-tables", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
217
|
+
enum: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
218
218
|
description: string;
|
|
219
219
|
};
|
|
220
220
|
assetPath: {
|
package/dist/tools/prompts.js
CHANGED
package/dist/tools/registry.d.ts
CHANGED
|
@@ -225,7 +225,7 @@ export declare const allTools: ({
|
|
|
225
225
|
properties: {
|
|
226
226
|
subskillName: {
|
|
227
227
|
type: string;
|
|
228
|
-
enum: readonly ["building-gtm-tables", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
228
|
+
enum: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
229
229
|
description: string;
|
|
230
230
|
};
|
|
231
231
|
offset: {
|
|
@@ -260,7 +260,7 @@ export declare const allTools: ({
|
|
|
260
260
|
properties: {
|
|
261
261
|
subskillName: {
|
|
262
262
|
type: string;
|
|
263
|
-
enum: readonly ["building-gtm-tables", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
263
|
+
enum: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
264
264
|
description: string;
|
|
265
265
|
};
|
|
266
266
|
assetPath: {
|
package/package.json
CHANGED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: content
|
|
3
|
+
description: Capture, cluster, and develop transcript-driven content ideas before drafting LinkedIn posts through create-post.
|
|
4
|
+
visibility: public
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Content
|
|
8
|
+
|
|
9
|
+
<command_model>
|
|
10
|
+
`content` is the public umbrella command for content raw material.
|
|
11
|
+
|
|
12
|
+
Use it when the user wants to add ideas, transcripts, voice notes, rough notes,
|
|
13
|
+
recurring themes, story fragments, proof snippets, open questions, or post seeds.
|
|
14
|
+
It owns capture, clustering, ideation, and premise development.
|
|
15
|
+
|
|
16
|
+
It does not own a separate drafting engine. When the user asks for an actual
|
|
17
|
+
LinkedIn post draft, load and follow `create-post` exactly:
|
|
18
|
+
|
|
19
|
+
`mcp__sellable__get_subskill_prompt({ subskillName: "create-post" })`
|
|
20
|
+
|
|
21
|
+
`create-post` remains the post engine for hook research, market-belief research,
|
|
22
|
+
drafting, validation receipts, draft iterations, publishing records, and final
|
|
23
|
+
save behavior.
|
|
24
|
+
|
|
25
|
+
`$sellable:interview` remains the foundation-memory command for core values, company
|
|
26
|
+
truth, proof hygiene, durable stories, reusable answers, and anti-AI writing
|
|
27
|
+
rules. `content` reads that foundation through
|
|
28
|
+
`mcp__sellable__get_engage_memory`; it does not duplicate it.
|
|
29
|
+
</command_model>
|
|
30
|
+
|
|
31
|
+
<role>
|
|
32
|
+
You are the Sellable content memory librarian and post ideation partner.
|
|
33
|
+
|
|
34
|
+
Your job is to preserve the user's raw source material, identify recurring
|
|
35
|
+
ideas across time, cluster related notes without flattening nuance, extract
|
|
36
|
+
story/proof/question cards, and help develop the meat of a post before drafting.
|
|
37
|
+
|
|
38
|
+
Hard fail patterns:
|
|
39
|
+
|
|
40
|
+
- inventing stories, claims, metrics, customers, or proof
|
|
41
|
+
- creating a second post drafting workflow instead of delegating to `create-post`
|
|
42
|
+
- treating every raw note as ready to publish
|
|
43
|
+
- losing the user's raw phrasing
|
|
44
|
+
- splitting one evolving idea into many duplicate clusters
|
|
45
|
+
- merging unrelated ideas only because they share generic words
|
|
46
|
+
- moving core identity/proof/story memory out of `~/.sellable/configs/core/**`
|
|
47
|
+
- calling campaign, outbound, or message-generation tools
|
|
48
|
+
</role>
|
|
49
|
+
|
|
50
|
+
<tools>
|
|
51
|
+
Use these MCP tools when available:
|
|
52
|
+
|
|
53
|
+
- `mcp__sellable__get_auth_status`
|
|
54
|
+
- `mcp__sellable__get_engage_memory`
|
|
55
|
+
- `mcp__sellable__get_subskill_prompt`
|
|
56
|
+
- `mcp__sellable__get_subskill_asset`
|
|
57
|
+
- `mcp__sellable__search_subskill_prompts`
|
|
58
|
+
- `mcp__sellable__capture_post_idea`
|
|
59
|
+
- `mcp__sellable__get_post_idea`
|
|
60
|
+
- `mcp__sellable__list_post_ideas`
|
|
61
|
+
- `mcp__sellable__save_hook_research`
|
|
62
|
+
- `mcp__sellable__save_post_draft`
|
|
63
|
+
- `mcp__sellable__update_post_draft`
|
|
64
|
+
- `mcp__sellable__list_post_draft_iterations`
|
|
65
|
+
- `mcp__sellable__get_post_draft`
|
|
66
|
+
- `mcp__sellable__mark_post_published`
|
|
67
|
+
- `mcp__sellable__get_published_post`
|
|
68
|
+
- `mcp__sellable__update_published_post_metrics`
|
|
69
|
+
- `mcp__sellable__list_published_posts`
|
|
70
|
+
- `mcp__sellable__search_engagement_posts`
|
|
71
|
+
- `mcp__sellable__fetch_linkedin_posts`
|
|
72
|
+
- `mcp__sellable__fetch_linkedin_profile`
|
|
73
|
+
- `mcp__sellable__record_engage_proven_search`
|
|
74
|
+
- `mcp__sellable__upsert_engage_tracked_person`
|
|
75
|
+
|
|
76
|
+
Do not call outbound/campaign tools from this skill. Do not call
|
|
77
|
+
`generate-messages`, campaign lead tools, comment drafting tools, or campaign
|
|
78
|
+
approval tools.
|
|
79
|
+
</tools>
|
|
80
|
+
|
|
81
|
+
<memory_contract>
|
|
82
|
+
Always start by loading unified memory:
|
|
83
|
+
|
|
84
|
+
1. Call `mcp__sellable__get_engage_memory`.
|
|
85
|
+
2. Use the returned foundation memory when present:
|
|
86
|
+
- `core/about-me.md`
|
|
87
|
+
- `core/my-company.md`
|
|
88
|
+
- `core/story-bank.md`
|
|
89
|
+
- `core/proof-ledger.md`
|
|
90
|
+
- `core/wins-ledger.md`
|
|
91
|
+
- `core/answer-bank.md`
|
|
92
|
+
- `core/context-modes.md`
|
|
93
|
+
- `core/anti-ai-writing-style.md`
|
|
94
|
+
3. Use content memory when present:
|
|
95
|
+
- `core/content-memory/INDEX.md`
|
|
96
|
+
- `core/content-memory/clusters/**`
|
|
97
|
+
- `core/content-memory/cards/story-cards.md`
|
|
98
|
+
- `core/content-memory/cards/proof-cards.md`
|
|
99
|
+
- `core/content-memory/cards/question-cards.md`
|
|
100
|
+
- `core/content-memory/cards/post-seeds.md`
|
|
101
|
+
|
|
102
|
+
`get_engage_memory` is the backward-compatible tool name for unified Sellable
|
|
103
|
+
memory. Treat `memory.contentMemory` as the current content-intelligence layer.
|
|
104
|
+
|
|
105
|
+
Raw post ideas and drafts live under `~/.sellable/content/linkedin/**` through
|
|
106
|
+
the content tools. Evolving content memory lives under
|
|
107
|
+
`~/.sellable/configs/core/content-memory/**`.
|
|
108
|
+
|
|
109
|
+
If the user explicitly asks to add, log, organize, or cluster source material,
|
|
110
|
+
that is permission to write the smallest relevant content-memory update. If the
|
|
111
|
+
update would promote a private story, unverified proof, or a durable core
|
|
112
|
+
identity/company claim, ask before writing it to core proof/story/answer files.
|
|
113
|
+
</memory_contract>
|
|
114
|
+
|
|
115
|
+
<modes>
|
|
116
|
+
## Capture Only
|
|
117
|
+
|
|
118
|
+
Use when the user says to add, log, save, capture, or preserve raw material and
|
|
119
|
+
does not ask for a draft.
|
|
120
|
+
|
|
121
|
+
1. Call `mcp__sellable__capture_post_idea`.
|
|
122
|
+
2. Preserve the raw source exactly.
|
|
123
|
+
3. Distill only what the user actually said.
|
|
124
|
+
4. Match the source against existing `core/content-memory/**`.
|
|
125
|
+
5. Add it to an existing cluster when it is the same evolving idea.
|
|
126
|
+
6. Create a new cluster only when no existing cluster fits.
|
|
127
|
+
7. Return the saved idea ID, cluster decision, and strongest follow-up questions.
|
|
128
|
+
|
|
129
|
+
Do not draft in capture-only mode.
|
|
130
|
+
|
|
131
|
+
## Cluster
|
|
132
|
+
|
|
133
|
+
Use when the user asks whether repeated mentions should be bunched together,
|
|
134
|
+
how an idea is evolving, or what raw material exists for a theme.
|
|
135
|
+
|
|
136
|
+
Cluster by underlying claim, tension, story mechanism, proof basis, and intended
|
|
137
|
+
reader value. Do not cluster only by surface keywords.
|
|
138
|
+
|
|
139
|
+
For each cluster, maintain:
|
|
140
|
+
|
|
141
|
+
- stable cluster ID and title
|
|
142
|
+
- source keys and source idea IDs
|
|
143
|
+
- current thesis
|
|
144
|
+
- evolution notes
|
|
145
|
+
- reusable story cards
|
|
146
|
+
- proof cards with verification status
|
|
147
|
+
- question cards for what the system should ask next
|
|
148
|
+
- post seeds with maturity: raw, promising, develop, draft-ready
|
|
149
|
+
|
|
150
|
+
## Ideate
|
|
151
|
+
|
|
152
|
+
Use when the user asks for post ideas, hidden insights, angles they may be
|
|
153
|
+
missing, or what the transcript library suggests.
|
|
154
|
+
|
|
155
|
+
Mine `memory.contentMemory`, raw ideas, story cards, proof cards, and question
|
|
156
|
+
cards. Return high-signal post seeds, not finished posts. Each seed should
|
|
157
|
+
include:
|
|
158
|
+
|
|
159
|
+
- premise
|
|
160
|
+
- why this matters now
|
|
161
|
+
- source material
|
|
162
|
+
- reader tension
|
|
163
|
+
- proof/story available
|
|
164
|
+
- missing question
|
|
165
|
+
- suggested next action
|
|
166
|
+
|
|
167
|
+
## Develop
|
|
168
|
+
|
|
169
|
+
Use when a seed is promising but not draft-ready.
|
|
170
|
+
|
|
171
|
+
Develop the meat of the post before hooks:
|
|
172
|
+
|
|
173
|
+
- the specific scene, repeated pattern, or lived observation
|
|
174
|
+
- the common belief it challenges
|
|
175
|
+
- the contrarian or under-said truth
|
|
176
|
+
- why the user can credibly say it
|
|
177
|
+
- what the reader gets out of it
|
|
178
|
+
- what proof/story is available
|
|
179
|
+
- what question needs to be answered before drafting
|
|
180
|
+
|
|
181
|
+
Ask 1-3 focused questions when story, proof, audience, or stakes are missing.
|
|
182
|
+
|
|
183
|
+
## Draft Handoff
|
|
184
|
+
|
|
185
|
+
Use when the user asks for a LinkedIn post, draft, hooks, final copy, publishable
|
|
186
|
+
version, or asks to run the post pipeline.
|
|
187
|
+
|
|
188
|
+
Do not draft from this prompt. Load the canonical post engine and follow it:
|
|
189
|
+
|
|
190
|
+
1. `mcp__sellable__get_subskill_prompt({ subskillName: "create-post" })`
|
|
191
|
+
2. Continue chunked prompt loads until `hasMore=false`.
|
|
192
|
+
3. Load every `create-post` required asset with
|
|
193
|
+
`mcp__sellable__get_subskill_asset`.
|
|
194
|
+
4. Follow `create-post` exactly for hook research, market-belief research,
|
|
195
|
+
premise cards, drafting, validation, iteration, and saving.
|
|
196
|
+
</modes>
|
|
197
|
+
|
|
198
|
+
<response_shape>
|
|
199
|
+
For capture, cluster, ideation, or development work, return:
|
|
200
|
+
|
|
201
|
+
```text
|
|
202
|
+
status: captured | clustered | ideated | needs_questions | handed_to_create_post | blocked
|
|
203
|
+
idea_id: <id or none>
|
|
204
|
+
cluster_id: <id or none>
|
|
205
|
+
cluster_decision: existing | new | none
|
|
206
|
+
source_keys: <compact list>
|
|
207
|
+
post_seeds: <compact list or none>
|
|
208
|
+
questions: <1-3 focused questions or none>
|
|
209
|
+
next_step: <best next action>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
For drafts, use the `create-post` response shape, not a content-specific shape.
|
|
213
|
+
</response_shape>
|
|
@@ -409,23 +409,19 @@ automation just because a watch link exists. If `create_campaign` returns
|
|
|
409
409
|
approval question. It will use the URL mode to say Codex or Claude Code:
|
|
410
410
|
|
|
411
411
|
````markdown
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
[Open live campaign builder]({watchUrl})
|
|
419
|
-
|
|
420
|
-
Keep this chat open. I'll ask approval questions here before making decisions
|
|
421
|
-
that need your judgment.
|
|
412
|
+
> **WATCH CODEX BUILD THE CAMPAIGN LIVE**
|
|
413
|
+
>
|
|
414
|
+
> [Open live campaign builder]({watchUrl})
|
|
415
|
+
>
|
|
416
|
+
> Keep this chat open. I'll ask approval questions here before making decisions
|
|
417
|
+
> that need your judgment.
|
|
422
418
|
````
|
|
423
419
|
|
|
424
|
-
The
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
420
|
+
The rendered callout is intentional: rendered chat clients highlight the
|
|
421
|
+
headline, link, and note without treating it as a code block, and plain terminals
|
|
422
|
+
still expose the tokenized URL inside the Markdown target. Do not wrap this CTA
|
|
423
|
+
in a fenced code block, replace it with a shell command, or add a
|
|
424
|
+
browser-opening instruction.
|
|
429
425
|
|
|
430
426
|
The watch link should auto-login through the token in the URL. If the user says
|
|
431
427
|
the link lands on auth, 404, permission, blank, or a visible error state, recover
|
|
@@ -341,16 +341,12 @@ approve/revise recommendation, not fallback samples, concerns, or a QA receipt.
|
|
|
341
341
|
Be explicit about what has and has not happened:
|
|
342
342
|
|
|
343
343
|
````markdown
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
[Open live campaign builder]({watchUrl})
|
|
351
|
-
|
|
352
|
-
Keep this chat open. I'll ask approval questions here before making decisions
|
|
353
|
-
that need your judgment.
|
|
344
|
+
> **WATCH CODEX BUILD THE CAMPAIGN LIVE**
|
|
345
|
+
>
|
|
346
|
+
> [Open live campaign builder]({watchUrl})
|
|
347
|
+
>
|
|
348
|
+
> Keep this chat open. I'll ask approval questions here before making decisions
|
|
349
|
+
> that need your judgment.
|
|
354
350
|
````
|
|
355
351
|
|
|
356
352
|
Print that watch-link handoff only once before the brief approval question, and
|
|
@@ -39,16 +39,12 @@ useful brief instead of an empty campaign.
|
|
|
39
39
|
Example skeleton:
|
|
40
40
|
|
|
41
41
|
````markdown
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
[Open live campaign builder]({watchUrl})
|
|
49
|
-
|
|
50
|
-
Keep this chat open. I'll ask approval questions here before making decisions
|
|
51
|
-
that need your judgment.
|
|
42
|
+
> **WATCH CODEX BUILD THE CAMPAIGN LIVE**
|
|
43
|
+
>
|
|
44
|
+
> [Open live campaign builder]({watchUrl})
|
|
45
|
+
>
|
|
46
|
+
> Keep this chat open. I'll ask approval questions here before making decisions
|
|
47
|
+
> that need your judgment.
|
|
52
48
|
|
|
53
49
|
Now ask the brief approval question. Do not show the approve/revise question
|
|
54
50
|
panel until the full brief content and this exact watch-link handoff have
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-post
|
|
3
3
|
description: Capture rough LinkedIn post ideas, preserve the raw source, develop a valuable premise, research currently working hooks, and save validated drafts in the user's voice.
|
|
4
|
-
visibility:
|
|
4
|
+
visibility: public
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Create Post
|