@sellable/mcp 0.1.235 → 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/index-dev.js +0 -0
- package/dist/index.js +0 -0
- 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/gold-standard-message-validation-example.md +21 -0
- package/skills/create-campaign-v2/references/validation-criteria.md +7 -0
- package/skills/create-campaign-v2/references/watch-link-handoff.md +6 -4
- package/skills/create-campaign-v2-validation/SKILL.md +7 -0
- 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/generate-messages/SKILL.md +45 -3
- 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
|
|
@@ -939,9 +939,34 @@ here`. If sender proof matters, write it as a normal human sentence tied
|
|
|
939
939
|
concreteness, or believability, keep the
|
|
940
940
|
finalizer winner
|
|
941
941
|
|
|
942
|
-
Run a `
|
|
943
|
-
the Gold-Standard Quality Gate. This
|
|
944
|
-
|
|
942
|
+
Run a `Concrete Language Audit` after the Optional Simplifier Pass and before
|
|
943
|
+
the Gold-Standard Quality Gate. This pass starts from the current selected
|
|
944
|
+
winner and highlights every word, phrase, or sentence that contains:
|
|
945
|
+
|
|
946
|
+
- abstract verbs
|
|
947
|
+
- abstract nouns
|
|
948
|
+
- abstract adjectives
|
|
949
|
+
- abstract adverbs
|
|
950
|
+
- cliches
|
|
951
|
+
|
|
952
|
+
For every highlight, write the exact text, category, why it is too abstract or
|
|
953
|
+
stale for this buyer, the concrete replacement, and whether the replacement was
|
|
954
|
+
applied or the line was cut. The replacement must name a buyer-visible action,
|
|
955
|
+
object, workflow, artifact, risk, result, or next step from the brief,
|
|
956
|
+
lead-sample, proof inventory, or approved token rules. Do not replace abstract
|
|
957
|
+
language with a different abstraction. If the concrete replacement would invent
|
|
958
|
+
proof, overclaim intent, or create a safety issue, cut the phrase or route to
|
|
959
|
+
`revise-message` / `revise-filter`.
|
|
960
|
+
|
|
961
|
+
Use this audit as a rewrite engine, not a style note. The selected winner must
|
|
962
|
+
not carry unresolved abstract or cliche language that can be made concrete from
|
|
963
|
+
available evidence. If an abstract term is intentionally kept because it is the
|
|
964
|
+
buyer-native category noun, document why it is buyer-native and why a concrete
|
|
965
|
+
replacement would be less clear.
|
|
966
|
+
|
|
967
|
+
Run a `Final Subtraction Pass` after the Concrete Language Audit and before the
|
|
968
|
+
Gold-Standard Quality Gate. This is the last copy pass and it optimizes for
|
|
969
|
+
reply likelihood, not constraint coverage.
|
|
945
970
|
|
|
946
971
|
Goal: shortest truthful message most likely to earn a reply.
|
|
947
972
|
|
|
@@ -1830,6 +1855,14 @@ side project`, `serious company`, `legit`, or any line that argues with an
|
|
|
1830
1855
|
prospect-side answer to "so what?" If a line is true but the prospect
|
|
1831
1856
|
would not immediately understand why it matters, it is BLOCKED until
|
|
1832
1857
|
rewritten, moved, or cut.
|
|
1858
|
+
- **Concrete language audit:** the selected winner must highlight and resolve
|
|
1859
|
+
every abstract verb, abstract noun, abstract adjective, abstract adverb, and
|
|
1860
|
+
cliche that weakens the message. For each highlighted item, replace it with a
|
|
1861
|
+
buyer-visible action, object, workflow, artifact, risk, result, or next step
|
|
1862
|
+
from available evidence; cut it if no safe concrete replacement exists. If a
|
|
1863
|
+
highlighted item remains, the audit must explain why it is buyer-native and
|
|
1864
|
+
clearer than the concrete alternative. Unresolved abstraction or cliche is
|
|
1865
|
+
BLOCKED.
|
|
1833
1866
|
- **Skeptical prospect:** the selected winner must survive a skeptical
|
|
1834
1867
|
prospect who has been prospected on LinkedIn by similar products hundreds
|
|
1835
1868
|
of times. If that reader would dismiss the note as founder story, vague
|
|
@@ -2607,6 +2640,14 @@ hiring for`
|
|
|
2607
2640
|
- Robustness check: PASS | BLOCKED — reason
|
|
2608
2641
|
- Decision: applied | rejected
|
|
2609
2642
|
|
|
2643
|
+
## Concrete Language Audit
|
|
2644
|
+
|
|
2645
|
+
| Location | Highlighted Text | Category (`abstract verb` / `abstract noun` / `abstract adjective` / `abstract adverb` / `cliche`) | Why It Weakens Reply Odds | Concrete Replacement | Decision (`applied` / `cut` / `kept as buyer-native`) |
|
|
2646
|
+
| -------- | ---------------- | -------------------------------------------------------------------------------------------------- | ------------------------- | -------------------- | ------------------------------------------------------ |
|
|
2647
|
+
|
|
2648
|
+
- Rewrite summary: ...
|
|
2649
|
+
- Remaining abstraction/cliche risk: PASS | BLOCKED — reason
|
|
2650
|
+
|
|
2610
2651
|
## Gold-Standard Quality Gate
|
|
2611
2652
|
|
|
2612
2653
|
- Believability: PASS | BLOCKED — reason
|
|
@@ -2629,6 +2670,7 @@ hiring for`
|
|
|
2629
2670
|
- Brief CTA obedience: PASS | BLOCKED | NOT APPLICABLE — reason
|
|
2630
2671
|
- CTA clarity: PASS | BLOCKED — reason
|
|
2631
2672
|
- PS restraint: PASS | BLOCKED | OMITTED — reason
|
|
2673
|
+
- Concrete language audit: PASS | BLOCKED — reason
|
|
2632
2674
|
- YC / backing PS: PASS | BLOCKED | OMITTED — reason
|
|
2633
2675
|
- Hard-to-fake proof used correctly: PASS | BLOCKED | OMITTED — reason
|
|
2634
2676
|
- Gold-standard match: PASS | BLOCKED — reason
|
|
@@ -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>
|