@sellable/mcp 0.1.263 → 0.1.265
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/dist/server.js +4 -1
- package/dist/tools/content-posts.d.ts +205 -6
- package/dist/tools/content-posts.js +315 -17
- package/dist/tools/registry.d.ts +40 -5
- package/package.json +1 -1
- package/skills/create-post/SKILL.md +155 -25
- package/skills/create-post/references/hook-research-playbook.md +90 -14
- package/skills/create-post/references/linkedin-preview-rendering.md +38 -34
- package/skills/create-post/references/post-file-contract.md +8 -0
- package/skills/create-post/references/post-validation.md +38 -11
- package/skills/create-post/references/premise-development.md +3 -3
|
@@ -5,45 +5,49 @@ research, hook candidate generation, gold-standard decomposition, and draft
|
|
|
5
5
|
validation.
|
|
6
6
|
|
|
7
7
|
Character budgets are only diagnostics. They are not the preview gate. A hook is
|
|
8
|
-
not studied, selected, or ready until
|
|
9
|
-
`
|
|
8
|
+
not studied, selected, or ready until its visible mobile and desktop blocks come
|
|
9
|
+
from `mcp__sellable__calculate_linkedin_hook_preview` or from a stricter
|
|
10
10
|
authenticated LinkedIn screenshot.
|
|
11
11
|
|
|
12
|
-
Do not let the LLM imagine wrapping.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
Do not let the LLM imagine wrapping. The normal path is a function call that
|
|
13
|
+
returns rendered mobile and desktop lines. HTML and PNG outputs from
|
|
14
|
+
`mcp__sellable__render_linkedin_post_preview` are optional visual QA artifacts,
|
|
15
|
+
not the primary interface.
|
|
16
16
|
|
|
17
17
|
## Rendering Basis
|
|
18
18
|
|
|
19
19
|
LinkedIn does not publish exact feed truncation rules, and rendering can vary by
|
|
20
20
|
surface, app version, device, media attachment, and account state. Use this
|
|
21
|
-
deterministic
|
|
21
|
+
deterministic function as the MCP review gate for unpublished drafts.
|
|
22
|
+
|
|
23
|
+
Simple operating policy: judge the hook by the first 3 rendered lines. Use ~140
|
|
24
|
+
characters on mobile and ~210 characters on desktop as guardrails only. If the
|
|
25
|
+
3-line preview and the character guardrail disagree, trust the rendered lines.
|
|
22
26
|
|
|
23
27
|
Call:
|
|
24
28
|
|
|
25
29
|
```json
|
|
26
|
-
|
|
30
|
+
mcp__sellable__calculate_linkedin_hook_preview({
|
|
27
31
|
"postText": "<full post text or candidate hook block>",
|
|
28
32
|
"sourceLabel": "<draft id, hook id, or source label>",
|
|
29
|
-
"
|
|
33
|
+
"measurementMode": "browser"
|
|
30
34
|
})
|
|
31
35
|
```
|
|
32
36
|
|
|
33
|
-
When
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
When local Chrome is available, browser measurement is the preferred functional
|
|
38
|
+
basis because it asks the browser layout engine to wrap the text under the
|
|
39
|
+
contract. When Chrome is unavailable, the tool falls back to the deterministic
|
|
40
|
+
width model and must mark that basis.
|
|
36
41
|
|
|
37
42
|
Treat "see more" as a rendered-line problem first and a character-count problem
|
|
38
|
-
second.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
-
|
|
44
|
-
|
|
45
|
-
- posts with media may show fewer text lines before truncation
|
|
46
|
-
1-2 lines
|
|
43
|
+
second. Observed LinkedIn screenshots show the current desktop feed behaving
|
|
44
|
+
like a first-3-rendered-lines clamp: a first line, a blank line, and a third
|
|
45
|
+
line can be all that appears before `... more`.
|
|
46
|
+
|
|
47
|
+
- review gate: first 3 rendered visual lines
|
|
48
|
+
- mobile feed: tighter because the text column is narrower
|
|
49
|
+
- desktop feed: more characters can fit per line, but still review line count
|
|
50
|
+
- posts with media may show fewer text lines before truncation
|
|
47
51
|
- blank lines and intentional separators consume visible preview lines
|
|
48
52
|
- device width, font scaling, app version, browser, and profile/page context can
|
|
49
53
|
move the cutoff
|
|
@@ -86,13 +90,16 @@ selected hook must include a `renderedPreview` record:
|
|
|
86
90
|
|
|
87
91
|
```text
|
|
88
92
|
renderedPreview:
|
|
89
|
-
basis:
|
|
90
|
-
cssContractVersion: linkedin-preview-rendering/
|
|
93
|
+
basis: linkedin_rendering_rule_function | authenticated_linkedin_screenshot | manual_user_source
|
|
94
|
+
cssContractVersion: linkedin-preview-rendering/v2
|
|
91
95
|
mobile:
|
|
92
96
|
textWidthPx: 308
|
|
93
97
|
fontSizePx: 14
|
|
94
98
|
lineHeightPx: 21
|
|
95
|
-
|
|
99
|
+
clampLines: 3
|
|
100
|
+
charGuardrail: 140
|
|
101
|
+
measurementBasis: local_chrome_browser_layout | estimated_width_model
|
|
102
|
+
visibleTextBlock: <literal first 3 rendered lines>
|
|
96
103
|
renderedLines:
|
|
97
104
|
- <line 1 exactly as wrapped>
|
|
98
105
|
- <line 2 exactly as wrapped>
|
|
@@ -106,13 +113,14 @@ renderedPreview:
|
|
|
106
113
|
payoffPlannedImmediatelyAfterClamp: true | false
|
|
107
114
|
seeMoreClickReason: <why a reader would click see more>
|
|
108
115
|
seeMoreRisk: pass | warn | fail
|
|
109
|
-
htmlPath: <local path>
|
|
110
|
-
screenshotPath: <local path when Chrome rendered PNG>
|
|
111
116
|
desktop:
|
|
112
117
|
textWidthPx: 582
|
|
113
118
|
fontSizePx: 14
|
|
114
119
|
lineHeightPx: 21
|
|
115
|
-
|
|
120
|
+
clampLines: 3
|
|
121
|
+
charGuardrail: 210
|
|
122
|
+
measurementBasis: local_chrome_browser_layout | estimated_width_model
|
|
123
|
+
visibleTextBlock: <literal first 3 rendered lines>
|
|
116
124
|
renderedLines:
|
|
117
125
|
- <line 1 exactly as wrapped>
|
|
118
126
|
- <line 2 exactly as wrapped>
|
|
@@ -122,8 +130,6 @@ renderedPreview:
|
|
|
122
130
|
corePainProofOrCuriosityVisible: true | false
|
|
123
131
|
corePointVisible: true | false
|
|
124
132
|
seeMoreRisk: pass | warn | fail
|
|
125
|
-
htmlPath: <local path>
|
|
126
|
-
screenshotPath: <local path when Chrome rendered PNG>
|
|
127
133
|
diagnostics:
|
|
128
134
|
charCount: <number>
|
|
129
135
|
charCountIncludingNewlines: <number>
|
|
@@ -136,11 +142,9 @@ renderedPreview:
|
|
|
136
142
|
rewriteIfTruncated: <short fallback>
|
|
137
143
|
```
|
|
138
144
|
|
|
139
|
-
If a host cannot produce
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
`needs_revision`; do not claim the hook passed preview validation from character
|
|
143
|
-
counts alone.
|
|
145
|
+
If a host cannot produce literal wrapped line blocks from
|
|
146
|
+
`calculate_linkedin_hook_preview`, return `blocked` or `needs_revision`; do not
|
|
147
|
+
claim the hook passed preview validation from character counts alone.
|
|
144
148
|
|
|
145
149
|
## Study Rules
|
|
146
150
|
|
|
@@ -67,9 +67,14 @@ Hook research files must preserve:
|
|
|
67
67
|
- source hook preview measurements, including text basis, char count including
|
|
68
68
|
newlines, physical/content line counts, longest nonblank line, blank-line
|
|
69
69
|
visual risk, and mobile/desktop preview budget status
|
|
70
|
+
- audience tension snapshot and selected angle
|
|
70
71
|
- rendered preview records for kept source hooks and adapted hook blocks,
|
|
71
72
|
including literal mobile/desktop preview blocks and whether the first-screen
|
|
72
73
|
promise is visible
|
|
74
|
+
- thought leader inspiration packets when the user supplied creators, including
|
|
75
|
+
worker status, profile URL/handle, recent posts reviewed, weighted winners,
|
|
76
|
+
follower-adjusted signal when available, allowed mechanics to adapt, and
|
|
77
|
+
forbidden borrowing
|
|
73
78
|
- source-message outlines for keeper posts, preserving source paragraph order
|
|
74
79
|
and branching each paragraph, line, or phrase into high-level goal, reader
|
|
75
80
|
effect, reusable move, and adaptation guard without reproducing the full
|
|
@@ -94,6 +99,9 @@ Draft files must preserve:
|
|
|
94
99
|
- draft body
|
|
95
100
|
- source-message outline for any outside post being adapted, when the draft's
|
|
96
101
|
body shape was learned from a specific source post
|
|
102
|
+
- thought leader inspiration lab when used, including the selected inspiration
|
|
103
|
+
adapter, variants considered, Christian/Sellable voice layer, and
|
|
104
|
+
copying/voice-clone risk
|
|
97
105
|
- pre-draft narrative outline: hierarchical `I.`, `A.`, `i.` outline covering
|
|
98
106
|
hook debt, thesis, reader, core mechanism, definitions, proof claims,
|
|
99
107
|
working body patterns adapted, narrative beats, mobile scan path, body
|
|
@@ -28,7 +28,8 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
|
|
|
28
28
|
- `storyFilesConsulted`
|
|
29
29
|
- `goldStandardsConsulted`
|
|
30
30
|
- `voiceRulesApplied`
|
|
31
|
-
- `
|
|
31
|
+
- `audienceTensionAudit`
|
|
32
|
+
- `thoughtLeaderInspirationLab`
|
|
32
33
|
- `premiseValueAudit`
|
|
33
34
|
- `mobileScanabilityAudit`
|
|
34
35
|
- `templateAdaptationAudit`
|
|
@@ -110,7 +111,7 @@ Each candidate should include:
|
|
|
110
111
|
After the first draft:
|
|
111
112
|
|
|
112
113
|
1. remove unsupported claims
|
|
113
|
-
2. verify the draft is anchored to the selected
|
|
114
|
+
2. verify the draft is anchored to the selected audience tension and credible angle
|
|
114
115
|
3. verify the real story/scene, tension, and reader value are visible early
|
|
115
116
|
4. verify the body repays the selected hook's curiosity debt
|
|
116
117
|
5. verify the final post follows the selected positioning sequence or explains
|
|
@@ -181,7 +182,7 @@ Record:
|
|
|
181
182
|
artifact is `preDraftNarrativeOutline`
|
|
182
183
|
- `premiseQualityGates`: pass/fail for `specific_scene_or_pattern`,
|
|
183
184
|
`clear_reader`, `visible_tension`, `reader_value`, `credible_speaker`,
|
|
184
|
-
`proof_safety`, `
|
|
185
|
+
`proof_safety`, `audience_tension`, and `pre_draft_narrative_outline`
|
|
185
186
|
- `bodyOutline`: how the body delivers the premise before prose
|
|
186
187
|
- `viralPostOutline`: the selected narrative structure, including beat jobs
|
|
187
188
|
- `hookToBodyPromiseMap`: how the body repays the hook's open loop
|
|
@@ -296,27 +297,53 @@ Save as `needs_revision` when the draft copies outside wording, borrows outside
|
|
|
296
297
|
proof, keeps a source template's status without equivalent user authority, or
|
|
297
298
|
uses a hook whose promised body payoff is not delivered.
|
|
298
299
|
|
|
299
|
-
##
|
|
300
|
+
## Audience Tension Audit
|
|
300
301
|
|
|
301
302
|
Before a draft can be `ready`, validate that it is not merely an internally
|
|
302
|
-
coherent idea. It must be anchored to the saved research's
|
|
303
|
+
coherent idea. It must be anchored to the saved research's audience tension
|
|
304
|
+
snapshot.
|
|
303
305
|
|
|
304
306
|
Record:
|
|
305
307
|
|
|
306
308
|
- `resonatingIdea`: the current-space idea this draft enters
|
|
307
|
-
- `
|
|
309
|
+
- `visibleAudienceTension`: the contradiction, tradeoff, cost, or unfinished
|
|
310
|
+
question readers are reacting to
|
|
308
311
|
- `audienceWant`: what the audience wants permission, leverage, proof, or a new
|
|
309
312
|
category for
|
|
310
|
-
- `
|
|
311
|
-
- `
|
|
313
|
+
- `audienceObjectionOrFear`: what skepticism, frustration, or risk gives the post tension
|
|
314
|
+
- `selectedAngle`: the claim the post is testing
|
|
312
315
|
- `credibleWhyUs`: why the user can credibly say this from raw idea, memory,
|
|
313
316
|
story, proof, or product mechanism
|
|
314
317
|
- `engagementReason`: why someone would react, comment, repost, or argue
|
|
315
318
|
- `unsupportedHypeRemoved`: unsupported claims removed during finalizer
|
|
316
319
|
|
|
317
|
-
If `
|
|
318
|
-
|
|
319
|
-
|
|
320
|
+
If `selectedAngle` is missing, if the audience tension is only a generic label
|
|
321
|
+
like "founders want growth," or if `credibleWhyUs` depends on borrowed proof
|
|
322
|
+
from another creator, save as `needs_revision`.
|
|
323
|
+
|
|
324
|
+
## Thought Leader Inspiration Audit
|
|
325
|
+
|
|
326
|
+
When the user supplied thought leaders or creators, validate that inspiration
|
|
327
|
+
was used as structural adaptation, not persona cloning.
|
|
328
|
+
|
|
329
|
+
Record:
|
|
330
|
+
|
|
331
|
+
- `thoughtLeaderList`: names and profile URLs or handles
|
|
332
|
+
- `workerPackets`: one packet per person, or `not_available` with reason
|
|
333
|
+
- `weightedWinners`: best posts used, with follower-adjusted signal when
|
|
334
|
+
available
|
|
335
|
+
- `normalizationConfidence`: high | medium | low
|
|
336
|
+
- `inspirationAdapters`: hook/body mechanics selected for adaptation
|
|
337
|
+
- `voiceLayer`: must be `Christian/Sellable`
|
|
338
|
+
- `forbiddenBorrowingAvoided`: source wording, proof, jokes, personal stories,
|
|
339
|
+
status, and persona markers avoided
|
|
340
|
+
- `variantsConsidered`: adapted variants generated from the selected premise
|
|
341
|
+
- `selectedVariant`: winning adapter and why
|
|
342
|
+
- `copyingOrVoiceCloneRisk`: pass | needs_revision | blocked
|
|
343
|
+
|
|
344
|
+
Save as `needs_revision` when a draft imitates a living person's voice, borrows
|
|
345
|
+
their proof/status, copies outside wording, or lets a creator with a giant
|
|
346
|
+
audience win without any follower-adjusted or confidence-adjusted signal.
|
|
320
347
|
|
|
321
348
|
## LinkedIn Preview Audit
|
|
322
349
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
A strong post is not an idea with a better hook. A strong post is a valuable
|
|
4
4
|
premise wrapped in a sharp opening.
|
|
5
5
|
|
|
6
|
-
Use this stage after
|
|
6
|
+
Use this stage after audience/hook research and before hook candidates. V2 premise
|
|
7
7
|
development also consumes the source post templates from hook research:
|
|
8
8
|
post positioning breakdowns, viral-post outlines, hook-to-body promise maps, and
|
|
9
9
|
body expression inputs.
|
|
@@ -109,7 +109,7 @@ tension:
|
|
|
109
109
|
reader value:
|
|
110
110
|
<what the reader learns, sees differently, or can do after reading>
|
|
111
111
|
|
|
112
|
-
why now /
|
|
112
|
+
why now / audience tension:
|
|
113
113
|
<what current research says is resonating>
|
|
114
114
|
|
|
115
115
|
credible why-us:
|
|
@@ -366,7 +366,7 @@ A premise can move to hook generation only when it passes all of these:
|
|
|
366
366
|
- `reader_value`: pass
|
|
367
367
|
- `credible_speaker`: pass
|
|
368
368
|
- `proof_safety`: pass
|
|
369
|
-
- `
|
|
369
|
+
- `audience_tension`: pass or explained
|
|
370
370
|
- `template_fit`: pass or explicitly no-template
|
|
371
371
|
- `hook_to_body_repayment`: pass
|
|
372
372
|
- `pre_draft_narrative_outline`: pass
|