@sellable/mcp 0.1.236 → 0.1.237
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 -14
- package/dist/server.js +28 -0
- package/dist/tools/campaigns.js +10 -7
- package/dist/tools/content-posts.d.ts +308 -0
- package/dist/tools/content-posts.js +611 -0
- package/dist/tools/leads.d.ts +2 -2
- package/dist/tools/registry.d.ts +105 -0
- package/dist/tools/registry.js +2 -0
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +6 -4
- package/skills/create-campaign-v2/SOUL.md +6 -4
- package/skills/create-campaign-v2/core/flow.v2.json +1 -1
- package/skills/create-campaign-v2/references/watch-link-handoff.md +6 -4
- package/skills/create-post/SKILL.md +204 -1273
- package/skills/create-post/references/hook-research-playbook.md +68 -0
- package/skills/create-post/references/post-file-contract.md +88 -0
- package/skills/create-post/references/post-validation.md +95 -0
- package/skills/interview/SKILL.md +19 -0
- package/skills/load-voice/SKILL.md +8 -2
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Hook Research Playbook
|
|
2
|
+
|
|
3
|
+
Hook research must use current Sellable engagement data before drafting unless the user explicitly asks for `unsaved_preview`.
|
|
4
|
+
|
|
5
|
+
## Search Inputs
|
|
6
|
+
|
|
7
|
+
Derive 3-8 keyword searches from:
|
|
8
|
+
|
|
9
|
+
- the raw idea
|
|
10
|
+
- user-supplied topic
|
|
11
|
+
- proven search terms in engage memory
|
|
12
|
+
- tracked people/inspiration references when relevant
|
|
13
|
+
|
|
14
|
+
## Default Search
|
|
15
|
+
|
|
16
|
+
Use `mcp__sellable__search_engagement_posts` with practical constraints:
|
|
17
|
+
|
|
18
|
+
- recent enough to reflect what is working now
|
|
19
|
+
- high enough engagement to matter
|
|
20
|
+
- narrow enough to match the idea
|
|
21
|
+
|
|
22
|
+
Record every keyword, filter, and result count.
|
|
23
|
+
|
|
24
|
+
## Full Text Reality
|
|
25
|
+
|
|
26
|
+
Search results may only include previews.
|
|
27
|
+
|
|
28
|
+
When full hook/body text matters:
|
|
29
|
+
|
|
30
|
+
1. use the result's author/profile URL
|
|
31
|
+
2. call `mcp__sellable__fetch_linkedin_posts`
|
|
32
|
+
3. match recent posts by URL or LinkedIn activity ID
|
|
33
|
+
4. record whether the full text was found
|
|
34
|
+
|
|
35
|
+
If full text is unavailable, record `full_text_unavailable`. Use only the preview for hook analysis and do not infer missing body details.
|
|
36
|
+
|
|
37
|
+
## Hook Extraction
|
|
38
|
+
|
|
39
|
+
Extract structure, not wording.
|
|
40
|
+
|
|
41
|
+
For each shortlisted source post, record:
|
|
42
|
+
|
|
43
|
+
- URL
|
|
44
|
+
- author
|
|
45
|
+
- engagement totals
|
|
46
|
+
- visible hook text or preview
|
|
47
|
+
- line count and mobile preview fit
|
|
48
|
+
- hook mechanism
|
|
49
|
+
- internal question created
|
|
50
|
+
- emotional trigger
|
|
51
|
+
- proof/story dependency
|
|
52
|
+
- replicability score
|
|
53
|
+
|
|
54
|
+
## Blocked States
|
|
55
|
+
|
|
56
|
+
Local idea capture can still succeed when research fails.
|
|
57
|
+
|
|
58
|
+
Draft-ready output must block or retry when:
|
|
59
|
+
|
|
60
|
+
- `unauthenticated`
|
|
61
|
+
- `no_active_workspace`
|
|
62
|
+
- `search_timeout_or_rate_limited`
|
|
63
|
+
- `zero_useful_hook_results`
|
|
64
|
+
- `full_text_unavailable` when the selected hook requires body context
|
|
65
|
+
|
|
66
|
+
## Save Requirement
|
|
67
|
+
|
|
68
|
+
Save the research with `mcp__sellable__save_hook_research` before drafting.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Post File Contract
|
|
2
|
+
|
|
3
|
+
The v1 content library is local Markdown under `~/.sellable/content/linkedin/**`.
|
|
4
|
+
|
|
5
|
+
## Ownership
|
|
6
|
+
|
|
7
|
+
MCP/package owns:
|
|
8
|
+
|
|
9
|
+
- tool definitions
|
|
10
|
+
- prompt workflow
|
|
11
|
+
- file schemas
|
|
12
|
+
- validation rules
|
|
13
|
+
- hook research rules
|
|
14
|
+
|
|
15
|
+
Customer computer owns:
|
|
16
|
+
|
|
17
|
+
- raw ideas
|
|
18
|
+
- hook research artifacts
|
|
19
|
+
- drafts
|
|
20
|
+
- published post records
|
|
21
|
+
- future comment history
|
|
22
|
+
|
|
23
|
+
## Layout
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
~/.sellable/content/linkedin/
|
|
27
|
+
ideas/
|
|
28
|
+
idea_YYYYMMDD_slug.md
|
|
29
|
+
research/
|
|
30
|
+
hooks/
|
|
31
|
+
research_YYYYMMDD_slug.md
|
|
32
|
+
drafts/
|
|
33
|
+
draft_YYYYMMDD_slug_v1.md
|
|
34
|
+
published/
|
|
35
|
+
YYYY/
|
|
36
|
+
post_linkedinActivityId.md
|
|
37
|
+
comments/
|
|
38
|
+
library/ # reserved only; no v1 comment drafting
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Required Fields
|
|
42
|
+
|
|
43
|
+
Idea files must preserve:
|
|
44
|
+
|
|
45
|
+
- `id`
|
|
46
|
+
- `type: idea`
|
|
47
|
+
- `status: captured`
|
|
48
|
+
- `createdAt`
|
|
49
|
+
- `updatedAt`
|
|
50
|
+
- exact raw source between raw-source markers
|
|
51
|
+
- optional distilled brief that does not add new claims
|
|
52
|
+
|
|
53
|
+
Hook research files must preserve:
|
|
54
|
+
|
|
55
|
+
- source idea ID
|
|
56
|
+
- keywords searched
|
|
57
|
+
- filters used
|
|
58
|
+
- source post URLs
|
|
59
|
+
- author/profile URLs
|
|
60
|
+
- engagement totals
|
|
61
|
+
- full-text availability
|
|
62
|
+
- extracted hook patterns
|
|
63
|
+
- selected hook basis
|
|
64
|
+
|
|
65
|
+
Draft files must preserve:
|
|
66
|
+
|
|
67
|
+
- source idea ID
|
|
68
|
+
- hook research ID
|
|
69
|
+
- draft body
|
|
70
|
+
- validation receipt
|
|
71
|
+
- status: `draft`, `ready`, or `needs_revision`
|
|
72
|
+
|
|
73
|
+
Published files must preserve:
|
|
74
|
+
|
|
75
|
+
- source draft ID when available
|
|
76
|
+
- publish URL
|
|
77
|
+
- LinkedIn activity ID when available
|
|
78
|
+
- published date
|
|
79
|
+
- optional future metrics placeholders
|
|
80
|
+
|
|
81
|
+
## Safety
|
|
82
|
+
|
|
83
|
+
- Do not write to a repo-local Sellable content directory.
|
|
84
|
+
- Do not append new content to `~/.sellable/configs/content/linkedin-posts-drafts.md`.
|
|
85
|
+
- List operations return metadata and short sanitized previews only.
|
|
86
|
+
- Full raw source requires a single-object get call.
|
|
87
|
+
- Drafts and published posts remain separate files.
|
|
88
|
+
- Comment drafting is out of v1 scope.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Post Validation
|
|
2
|
+
|
|
3
|
+
Every saved draft needs a validation receipt. A draft without this receipt is not ready.
|
|
4
|
+
|
|
5
|
+
## Required Receipt Fields
|
|
6
|
+
|
|
7
|
+
- `sourceIdeaId`
|
|
8
|
+
- `hookResearchId`
|
|
9
|
+
- `candidateHooksConsidered`
|
|
10
|
+
- `selectedHook`
|
|
11
|
+
- `selectedHookWhy`
|
|
12
|
+
- `proofClaimsUsed`
|
|
13
|
+
- `proofClaimSources`
|
|
14
|
+
- `storyFilesConsulted`
|
|
15
|
+
- `voiceRulesApplied`
|
|
16
|
+
- `simplifierConcreteLanguageAudit`
|
|
17
|
+
- `antiAiAudit`
|
|
18
|
+
- `finalizerChanges`
|
|
19
|
+
- `blockedReasons`
|
|
20
|
+
- `retryNeededReasons`
|
|
21
|
+
- `readyStatus`
|
|
22
|
+
|
|
23
|
+
## Candidate Set
|
|
24
|
+
|
|
25
|
+
Generate multiple hook candidates before drafting. Do not lock onto the first draft.
|
|
26
|
+
|
|
27
|
+
Each candidate should include:
|
|
28
|
+
|
|
29
|
+
- hook text
|
|
30
|
+
- source pattern
|
|
31
|
+
- score
|
|
32
|
+
- proof/story dependency
|
|
33
|
+
- AI-tell risk
|
|
34
|
+
- why it should win or lose
|
|
35
|
+
|
|
36
|
+
## Finalizer Pass
|
|
37
|
+
|
|
38
|
+
After the first draft:
|
|
39
|
+
|
|
40
|
+
1. remove unsupported claims
|
|
41
|
+
2. tighten the hook
|
|
42
|
+
3. simplify abstract phrasing
|
|
43
|
+
4. replace generic language with concrete words only when supported
|
|
44
|
+
5. preserve the user's actual story and point
|
|
45
|
+
6. remove AI tells
|
|
46
|
+
|
|
47
|
+
## Simplifier / Concrete-Language Audit
|
|
48
|
+
|
|
49
|
+
Flag and rewrite:
|
|
50
|
+
|
|
51
|
+
- vague abstraction
|
|
52
|
+
- fake profundity
|
|
53
|
+
- broad claims without proof
|
|
54
|
+
- corporate phrasing
|
|
55
|
+
- lines that sound polished but unsupported
|
|
56
|
+
- needless meta commentary
|
|
57
|
+
|
|
58
|
+
Do not make language concrete by inventing new facts.
|
|
59
|
+
|
|
60
|
+
## Anti-AI Audit
|
|
61
|
+
|
|
62
|
+
Reject or rewrite:
|
|
63
|
+
|
|
64
|
+
- "game-changing"
|
|
65
|
+
- "leverage"
|
|
66
|
+
- "synergy"
|
|
67
|
+
- "this is key"
|
|
68
|
+
- "let that sink in"
|
|
69
|
+
- "read that again"
|
|
70
|
+
- generic lessons without a story
|
|
71
|
+
- tidy three-part frameworks that were not in the source material
|
|
72
|
+
- fabricated numbers or examples
|
|
73
|
+
|
|
74
|
+
## Proof And Voice Gates
|
|
75
|
+
|
|
76
|
+
Every claim must trace to at least one of:
|
|
77
|
+
|
|
78
|
+
- raw idea
|
|
79
|
+
- current user answer
|
|
80
|
+
- `core/proof-ledger.md`
|
|
81
|
+
- `core/wins-ledger.md`
|
|
82
|
+
- `core/story-bank.md`
|
|
83
|
+
- `core/answer-bank.md`
|
|
84
|
+
- approved reference material
|
|
85
|
+
|
|
86
|
+
If the necessary proof or story is missing, ask the user or return blocked/retry-needed.
|
|
87
|
+
|
|
88
|
+
## Ready Status
|
|
89
|
+
|
|
90
|
+
Use:
|
|
91
|
+
|
|
92
|
+
- `ready` only when proof, voice, anti-AI, and concrete-language gates pass
|
|
93
|
+
- `needs_revision` when a draft exists but a gate failed
|
|
94
|
+
- `blocked` when required context is missing
|
|
95
|
+
- `retry-needed` when a tool/package/search failure blocked the pipeline
|
|
@@ -32,6 +32,25 @@ Load only the references needed for the current run:
|
|
|
32
32
|
legacy workflow.
|
|
33
33
|
</reference_loading>
|
|
34
34
|
|
|
35
|
+
<content_bridge>
|
|
36
|
+
This interview owns durable core memory. Keep identity, company truth, proof,
|
|
37
|
+
stories, answer-bank entries, transcript entries, references, anti-AI rules,
|
|
38
|
+
context modes, decision rules, and change-log updates under
|
|
39
|
+
`~/.sellable/configs/core/**` and raw archives under `~/.sellable/interviews/**`.
|
|
40
|
+
|
|
41
|
+
If the run captures a content-specific LinkedIn post idea, hook/taste
|
|
42
|
+
correction, draft-first post calibration note, or voice-note transcript meant
|
|
43
|
+
as a post idea, offer to bridge that item into the content library with
|
|
44
|
+
`mcp__sellable__capture_post_idea` under
|
|
45
|
+
`~/.sellable/content/linkedin/ideas/**`.
|
|
46
|
+
|
|
47
|
+
Do not move or mirror core identity/proof/story material into
|
|
48
|
+
`~/.sellable/content/**`. The content bridge is only for post ideas and
|
|
49
|
+
content-specific calibration notes. `story-bank.md`, `proof-ledger.md`,
|
|
50
|
+
`answer-bank.md`, transcripts, references, and raw interview archives remain
|
|
51
|
+
the source of truth for stories and proof.
|
|
52
|
+
</content_bridge>
|
|
53
|
+
|
|
35
54
|
<modes>
|
|
36
55
|
Choose the lightest mode that can produce useful memory.
|
|
37
56
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: load-voice
|
|
3
|
-
description:
|
|
4
|
-
visibility:
|
|
3
|
+
description: Internal utility for loading Sellable voice/company memory before generic writing tasks that are not covered by create-post or create-campaign.
|
|
4
|
+
visibility: internal
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- Read
|
|
7
7
|
- Glob
|
|
@@ -18,6 +18,12 @@ answering, rewriting, reviewing, or calibrating copy in the user's voice.
|
|
|
18
18
|
This is a read-only usage workflow. Do not interview by default, do not write
|
|
19
19
|
memory files, and do not update `~/.sellable/**` unless the user explicitly
|
|
20
20
|
asks to switch into `$sellable:interview`.
|
|
21
|
+
|
|
22
|
+
This is no longer a normal public command. Use `$sellable:create-post` for
|
|
23
|
+
LinkedIn posts; that workflow loads voice internally. Use
|
|
24
|
+
`$sellable:create-campaign` for campaign/outbound work; that workflow loads its
|
|
25
|
+
own campaign/sender context. This prompt remains available as a direct MCP
|
|
26
|
+
utility for generic writing and review surfaces.
|
|
21
27
|
</role>
|
|
22
28
|
|
|
23
29
|
<default_use_cases>
|