@sellable/mcp 0.1.269 → 0.1.272
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/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/server.js +7 -8
- package/dist/tools/content-posts.d.ts +421 -1
- package/dist/tools/content-posts.js +802 -0
- package/dist/tools/engage-discovery.d.ts +24 -0
- package/dist/tools/engage-discovery.js +114 -9
- package/dist/tools/leads.js +1 -1
- package/dist/tools/registry.d.ts +76 -47
- package/dist/tools/registry.js +0 -2
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +0 -10
- package/skills/create-campaign/core/providers/prospeo.json +2 -5
- package/skills/create-post/SKILL.md +768 -36
- package/skills/create-post/references/hook-research-playbook.md +509 -31
- package/skills/create-post/references/linkedin-preview-rendering.md +221 -0
- package/skills/create-post/references/post-file-contract.md +41 -0
- package/skills/create-post/references/post-validation.md +297 -27
- package/skills/create-post/references/premise-development.md +298 -7
- package/skills/providers/prospeo.md +0 -21
- package/skills/research/config.json +9 -0
- package/dist/tools/harvest-jobs.d.ts +0 -182
- package/dist/tools/harvest-jobs.js +0 -429
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# LinkedIn Preview Rendering
|
|
2
|
+
|
|
3
|
+
This asset defines the required rendered-preview contract for create-post hook
|
|
4
|
+
research, hook candidate generation, gold-standard decomposition, and draft
|
|
5
|
+
validation.
|
|
6
|
+
|
|
7
|
+
Character budgets are only diagnostics. They are not the preview gate. A hook is
|
|
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
|
+
authenticated LinkedIn screenshot.
|
|
11
|
+
|
|
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
|
+
|
|
17
|
+
## Rendering Basis
|
|
18
|
+
|
|
19
|
+
LinkedIn does not publish exact feed truncation rules, and rendering can vary by
|
|
20
|
+
surface, app version, device, media attachment, and account state. Use this
|
|
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.
|
|
26
|
+
|
|
27
|
+
Call:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
mcp__sellable__calculate_linkedin_hook_preview({
|
|
31
|
+
"postText": "<full post text or candidate hook block>",
|
|
32
|
+
"sourceLabel": "<draft id, hook id, or source label>",
|
|
33
|
+
"measurementMode": "browser"
|
|
34
|
+
})
|
|
35
|
+
```
|
|
36
|
+
|
|
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.
|
|
41
|
+
|
|
42
|
+
Treat "see more" as a rendered-line problem first and a character-count problem
|
|
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
|
|
51
|
+
- blank lines and intentional separators consume visible preview lines
|
|
52
|
+
- device width, font scaling, app version, browser, and profile/page context can
|
|
53
|
+
move the cutoff
|
|
54
|
+
|
|
55
|
+
Because of that variation, never say a hook is guaranteed to render before
|
|
56
|
+
"see more." Say `pass`, `warn`, or `fail` under the rendered-preview contract,
|
|
57
|
+
and show the visible mobile and desktop blocks.
|
|
58
|
+
|
|
59
|
+
When an authenticated LinkedIn feed/composer/browser screenshot is available,
|
|
60
|
+
that screenshot is the strongest evidence. Still record the fields below so
|
|
61
|
+
future agents can compare candidates without redoing the visual inspection.
|
|
62
|
+
|
|
63
|
+
Observed public LinkedIn post text style for feed-style post pages:
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
selector basis: p.attributed-text-segment-list__content
|
|
67
|
+
font family: -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
|
|
68
|
+
"Fira Sans", Ubuntu, "Oxygen Sans", Cantarell, "Droid Sans",
|
|
69
|
+
"Lucida Grande", Helvetica, Arial, sans-serif
|
|
70
|
+
font size: 14px
|
|
71
|
+
line height: 21px
|
|
72
|
+
font weight: 400
|
|
73
|
+
letter spacing: normal
|
|
74
|
+
white space: pre-wrap
|
|
75
|
+
overflow wrap: break-word
|
|
76
|
+
text color: rgba(0, 0, 0, 0.9)
|
|
77
|
+
mobile text width: 308px
|
|
78
|
+
desktop text width: 582px
|
|
79
|
+
review clamp: first 3 rendered text lines
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The `review clamp` is not an official LinkedIn rule. It is the conservative
|
|
83
|
+
apples-to-apples region create-post must use when comparing hooks. Do not let a
|
|
84
|
+
desktop pass rescue a mobile fail.
|
|
85
|
+
|
|
86
|
+
## Required Rendering Record
|
|
87
|
+
|
|
88
|
+
Every shortlisted source hook, adapted hook block, generated hook candidate, and
|
|
89
|
+
selected hook must include a `renderedPreview` record:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
renderedPreview:
|
|
93
|
+
basis: linkedin_rendering_rule_function | authenticated_linkedin_screenshot | manual_user_source
|
|
94
|
+
cssContractVersion: linkedin-preview-rendering/v2
|
|
95
|
+
mobile:
|
|
96
|
+
textWidthPx: 308
|
|
97
|
+
fontSizePx: 14
|
|
98
|
+
lineHeightPx: 21
|
|
99
|
+
clampLines: 3
|
|
100
|
+
charGuardrail: 140
|
|
101
|
+
measurementBasis: local_chrome_browser_layout | estimated_width_model
|
|
102
|
+
visibleTextBlock: <literal first 3 rendered lines>
|
|
103
|
+
renderedLines:
|
|
104
|
+
- <line 1 exactly as wrapped>
|
|
105
|
+
- <line 2 exactly as wrapped>
|
|
106
|
+
- <line 3 exactly as wrapped>
|
|
107
|
+
lineCountBeforeClamp: <number>
|
|
108
|
+
blankLinesBeforeClamp: <number>
|
|
109
|
+
corePainProofOrCuriosityVisible: true | false
|
|
110
|
+
corePointVisible: true | false
|
|
111
|
+
intentionalOpenLoop: true | false
|
|
112
|
+
specificClickQuestionVisible: true | false
|
|
113
|
+
payoffPlannedImmediatelyAfterClamp: true | false
|
|
114
|
+
seeMoreClickReason: <why a reader would click see more>
|
|
115
|
+
seeMoreRisk: pass | warn | fail
|
|
116
|
+
desktop:
|
|
117
|
+
textWidthPx: 582
|
|
118
|
+
fontSizePx: 14
|
|
119
|
+
lineHeightPx: 21
|
|
120
|
+
clampLines: 3
|
|
121
|
+
charGuardrail: 210
|
|
122
|
+
measurementBasis: local_chrome_browser_layout | estimated_width_model
|
|
123
|
+
visibleTextBlock: <literal first 3 rendered lines>
|
|
124
|
+
renderedLines:
|
|
125
|
+
- <line 1 exactly as wrapped>
|
|
126
|
+
- <line 2 exactly as wrapped>
|
|
127
|
+
- <line 3 exactly as wrapped>
|
|
128
|
+
lineCountBeforeClamp: <number>
|
|
129
|
+
blankLinesBeforeClamp: <number>
|
|
130
|
+
corePainProofOrCuriosityVisible: true | false
|
|
131
|
+
corePointVisible: true | false
|
|
132
|
+
seeMoreRisk: pass | warn | fail
|
|
133
|
+
diagnostics:
|
|
134
|
+
charCount: <number>
|
|
135
|
+
charCountIncludingNewlines: <number>
|
|
136
|
+
firstLineChars: <number>
|
|
137
|
+
firstTwoPhysicalLinesChars: <number>
|
|
138
|
+
longestNonblankLineChars: <number>
|
|
139
|
+
blankLineVisualRisk: none | low | medium | high
|
|
140
|
+
pointAfterMobileClamp: true | false
|
|
141
|
+
openLoopType: none | hidden_payoff | contradiction | proof_gap | workflow_reveal | asset_reveal | story_gap
|
|
142
|
+
rewriteIfTruncated: <short fallback>
|
|
143
|
+
```
|
|
144
|
+
|
|
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.
|
|
148
|
+
|
|
149
|
+
## Study Rules
|
|
150
|
+
|
|
151
|
+
For source-post research:
|
|
152
|
+
|
|
153
|
+
- Render the exact visible opening from full text when full text is available.
|
|
154
|
+
- If only a search preview is available, render only the preview text and set
|
|
155
|
+
`basis: manual_user_source` or record `sourceTextBasis: search_preview`.
|
|
156
|
+
- Lower confidence when the search preview is cut off or the body is
|
|
157
|
+
unavailable.
|
|
158
|
+
- Extract hook lessons from the rendered first-screen experience, not from the
|
|
159
|
+
full post in isolation.
|
|
160
|
+
|
|
161
|
+
For generated hooks:
|
|
162
|
+
|
|
163
|
+
- Generate the hook from the selected premise first.
|
|
164
|
+
- Render the hook for mobile and desktop before scoring it.
|
|
165
|
+
- Score the rendered first-screen click reason before scoring cleverness.
|
|
166
|
+
- If the goal is see-more clicks, the hook may intentionally hide the payoff
|
|
167
|
+
after the mobile clamp, but the visible block must create a specific question
|
|
168
|
+
the target reader wants answered.
|
|
169
|
+
- Rewrite any candidate whose real point appears after the mobile clamp unless
|
|
170
|
+
that point is the planned payoff for an intentional open loop.
|
|
171
|
+
|
|
172
|
+
## Pass, Warn, Fail
|
|
173
|
+
|
|
174
|
+
Use these rendered gates:
|
|
175
|
+
|
|
176
|
+
- `pass`: the mobile rendered preview shows the pain, proof, or curiosity by the
|
|
177
|
+
end of the first 3 rendered lines, and either the core point is
|
|
178
|
+
understandable without opening "see more" or an intentional open loop creates
|
|
179
|
+
a specific click question with an immediate planned payoff.
|
|
180
|
+
- `warn`: the mobile rendered preview creates useful curiosity but the core
|
|
181
|
+
point or click question is slightly softened by wrapping, blank-line rhythm,
|
|
182
|
+
or one missing context word. A compact fallback is required.
|
|
183
|
+
- `fail`: the hook's real point appears after the first 3 mobile rendered lines,
|
|
184
|
+
the visible open loop is vague, the first rendered line is generic setup,
|
|
185
|
+
blank lines consume the preview before the reader sees the point, or desktop
|
|
186
|
+
fit is the only reason it looks good.
|
|
187
|
+
|
|
188
|
+
A draft cannot be `ready` when the selected hook has:
|
|
189
|
+
|
|
190
|
+
- no `renderedPreview`
|
|
191
|
+
- `mobile.seeMoreRisk: fail`
|
|
192
|
+
- `mobile.corePainProofOrCuriosityVisible: false`
|
|
193
|
+
- `mobile.corePointVisible: false` unless `mobile.intentionalOpenLoop: true`,
|
|
194
|
+
`mobile.specificClickQuestionVisible: true`, and
|
|
195
|
+
`mobile.payoffPlannedImmediatelyAfterClamp: true`
|
|
196
|
+
- `pointAfterMobileClamp: true` unless the point after the clamp is the
|
|
197
|
+
intentional payoff for a specific open loop
|
|
198
|
+
|
|
199
|
+
## Report Format
|
|
200
|
+
|
|
201
|
+
Research reports must show rendered preview blocks for the best examples and
|
|
202
|
+
recommended draft directions:
|
|
203
|
+
|
|
204
|
+
```text
|
|
205
|
+
Rendered preview:
|
|
206
|
+
mobile:
|
|
207
|
+
<line 1>
|
|
208
|
+
<line 2>
|
|
209
|
+
<line 3>
|
|
210
|
+
|
|
211
|
+
desktop:
|
|
212
|
+
<line 1>
|
|
213
|
+
<line 2>
|
|
214
|
+
<line 3>
|
|
215
|
+
|
|
216
|
+
verdict: pass | warn | fail
|
|
217
|
+
why: <what is visible before the fold>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Do not say "it fits on mobile" without showing what the mobile reader actually
|
|
221
|
+
sees.
|
|
@@ -50,19 +50,41 @@ Idea files must preserve:
|
|
|
50
50
|
- `updatedAt`
|
|
51
51
|
- exact raw source between raw-source markers
|
|
52
52
|
- optional distilled brief that does not add new claims
|
|
53
|
+
- transcript worldview packet when create-post has mined relevant
|
|
54
|
+
transcript/content-memory material for this idea
|
|
53
55
|
|
|
54
56
|
Hook research files must preserve:
|
|
55
57
|
|
|
56
58
|
- source idea ID
|
|
59
|
+
- transcript/content-memory match status and transcript worldview packet
|
|
57
60
|
- keywords searched
|
|
58
61
|
- filters used
|
|
59
62
|
- source post URLs
|
|
60
63
|
- author/profile URLs
|
|
61
64
|
- engagement totals
|
|
65
|
+
- author follower counts when available, target follower band, follower-band
|
|
66
|
+
fit, engagement per 1k followers, weighted engagement per 1k followers,
|
|
67
|
+
reach-adjusted score, and normalization confidence notes when reach
|
|
68
|
+
normalization was used
|
|
62
69
|
- full-text availability
|
|
63
70
|
- source hook preview measurements, including text basis, char count including
|
|
64
71
|
newlines, physical/content line counts, longest nonblank line, blank-line
|
|
65
72
|
visual risk, and mobile/desktop preview budget status
|
|
73
|
+
- audience tension snapshot and selected angle
|
|
74
|
+
- rendered preview records for kept source hooks and adapted hook blocks,
|
|
75
|
+
including literal mobile/desktop preview blocks and whether the first-screen
|
|
76
|
+
promise is visible
|
|
77
|
+
- thought leader voice variants from the configured active influencer list or
|
|
78
|
+
supplied named subset, including worker status, profile URL/handle, recent
|
|
79
|
+
posts sampled, inferred voice model, representative-length role-played post
|
|
80
|
+
variant, source URLs sampled, steal/drop notes, factual risk notes,
|
|
81
|
+
`workerExecutionMode`, expected active influencer count, actual variant count,
|
|
82
|
+
missing variants, weak variants, and background worker IDs or labels when
|
|
83
|
+
available
|
|
84
|
+
- source-message outlines for keeper posts, preserving source paragraph order
|
|
85
|
+
and branching each paragraph, line, or phrase into high-level goal, reader
|
|
86
|
+
effect, reusable move, and adaptation guard without reproducing the full
|
|
87
|
+
outside source post
|
|
66
88
|
- extracted hook patterns
|
|
67
89
|
- selected hook basis
|
|
68
90
|
|
|
@@ -70,6 +92,8 @@ Draft files must preserve:
|
|
|
70
92
|
|
|
71
93
|
- source idea ID
|
|
72
94
|
- hook research ID
|
|
95
|
+
- transcript worldview packet used to build the premise, worldview, and hot
|
|
96
|
+
take
|
|
73
97
|
- versioned draft ID, normally ending in `_v1`, `_v2`, `_v3`, etc.
|
|
74
98
|
- iteration metadata when there is a prior or baseline draft:
|
|
75
99
|
- `version`
|
|
@@ -81,8 +105,25 @@ Draft files must preserve:
|
|
|
81
105
|
- score fields for hook, proof, voice, specificity, skimmability, and publish confidence
|
|
82
106
|
- `verdict`: `baseline`, `keep`, `revise`, `reject`, `publish_candidate`, or a similarly explicit state
|
|
83
107
|
- draft body
|
|
108
|
+
- source-message outline for any outside post being adapted, when the draft's
|
|
109
|
+
body shape was learned from a specific source post
|
|
110
|
+
- thought leader voice variant lab by default, including voice models, variants
|
|
111
|
+
considered, selected synthesis ingredients, final Christian/Sellable voice,
|
|
112
|
+
style-simulation risk, active configured influencer list, expected-vs-actual
|
|
113
|
+
variant counts, `workerExecutionMode`, background worker IDs or labels, and
|
|
114
|
+
skipped/opt-out reason when omitted
|
|
115
|
+
- pre-draft narrative outline: hierarchical `I.`, `A.`, `i.` outline covering
|
|
116
|
+
hook debt, thesis, reader, core mechanism, definitions, proof claims,
|
|
117
|
+
working body patterns adapted, narrative beats, mobile scan path, body
|
|
118
|
+
promise, concrete examples, abstractions to remove, and draft risks
|
|
84
119
|
- validation receipt, including LinkedIn preview pass/warn/fail status and
|
|
85
120
|
compact fallback when the selected hook carries a warning
|
|
121
|
+
- visible flow trace when the user asked for whole-flow, debug, or step-by-step
|
|
122
|
+
mode, including checkpoint statuses, quality break, downstream effect, and
|
|
123
|
+
whether the trace was shown before saving
|
|
124
|
+
- rendered mobile and desktop preview blocks for the selected hook; drafts
|
|
125
|
+
cannot be ready when this rendered-preview audit is missing or fails mobile
|
|
126
|
+
visibility
|
|
86
127
|
- status: `draft`, `ready`, `needs_revision`, `published`, or `archived`
|
|
87
128
|
|
|
88
129
|
Multiple drafts for the same idea are expected. Keep the `ideaId` stable and
|