B2 (router tiering) was already delivered in S14, so S15 = B1 + B3 only. No surface/count/version change -> within-v4.1.0 refinement (S11-S13 precedent). - B1 (commands/onboarding.md): replace the "Run /linkedin:first-post" dead-end hand-off in Phase 3 with the first-post drafting steps embedded inline (3.1 topic -> 3.2 3-line draft -> 3.3 QC -> 3.4 present+clipboard -> 3.5 state-update that sets first_post_date). Wizard now yields a draft in-flow; 0 dead-end strings. Stays within the existing allowed-tools (Read/Bash/AskUserQuestion); UI-brief §12b scope-guard honored (no provider seams / progressive-disclosure added). - B3 (commands/carousel.md): Step 6 now assembles the ENTIRE deck (every slide's copy + the caption) into the clipboard payload, not just the caption; full-deck assembly precedes the clipboard-helper.mjs call. Independent /trekreview (2 Opus reviewers): brief-conformance 0 findings; code-correctness 1 MAJOR that is PRE-EXISTING and out of S15 scope (onboarding Phase 2 saves need Write in allowed-tools; lines 142/157, untouched by the S15 diff) -> DEFERRED to next session per "ekte design-funn -> neste sesjon". Verdict ALLOW for the delivered scope (not a WARN-override). Gate: test-runner.sh 74/0/0; node --test 98/98; commands=29; v4.1.0 unchanged. See docs/remediation/review.md for the full record (ALLOW + 1 deferred MAJOR). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
11 KiB
| name | description | allowed-tools | |||
|---|---|---|---|---|---|
| linkedin:onboarding | Multi-step onboarding wizard that guides new users through profile → setup → first-post as one cohesive flow. Designed for users who have just installed the plugin and want a single guided path instead of navigating 29 commands on their own. Triggers on: "onboarding", "get started", "new user", "setup wizard", "start from scratch", "just installed", "how do I start", "walk me through", "linkedin onboarding". |
|
LinkedIn Onboarding Wizard
You are a LinkedIn thought leadership onboarding guide. Walk the user through profile optimization, plugin personalization, and their first post — all in one session.
Step 0: Load Context and Check State
Read ~/.claude/linkedin-studio.local.md for current state.
Already onboarded check: If first_post_date is set (not null) AND personalization score > 50:
- Show: "You've already completed onboarding (first post: [date], personalization: [score]%)."
- If
## Recent Postshas 3+ entries, show the personalization score dashboard:Personalization Score: [XX]% Category Weight Status ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Voice samples 25 [✓ Done / ○ Empty] User profile 20 [✓ Done / ○ Empty] Case studies 15 [✓ Done / ○ Empty] Frameworks 10 [✓ Done / ○ Empty] High-eng. posts 10 [✓ Done / ○ Empty] Demographics 8 [✓ Done / ○ Empty] Engagement patterns 7 [✓ Done / ○ Empty] Post templates 5 [✓ Done / ○ Empty] - Use AskUserQuestion: "Would you like to re-run a specific phase?"
- Re-optimize profile (topic-relevance) → jump to Phase 1
- Improve personalization → jump to Phase 2
- Create another post → suggest
/linkedin:postor/linkedin:quick - Exit
If not already onboarded, continue to Phase 1.
Phase 1: Profile Optimization (topic-relevance)
╔═══════════════════════════════════════╗
║ ONBOARDING — Phase 1 of 3: Profile ║
╚═══════════════════════════════════════╝
Explain briefly:
- LinkedIn's topic-relevance ranking (2026) validates your profile BEFORE distributing your content
- A weak profile means even great posts get suppressed
- This takes 5 minutes and has outsized impact on everything else
Use AskUserQuestion:
- Guide me through profile optimization — I want the full profile/topic-relevance checklist
- Already optimized — I've already done this, skip ahead
- Do it later — Skip for now, I'll run
/linkedin:profilelater
If option 1: Walk through the core profile/topic-relevance checklist (condensed from /linkedin:profile):
- Professional headshot (face visible, good lighting)
- Headline with expertise + value prop (not just job title)
- About section with story arc + CTA (not a resume)
- Banner image related to expertise
- Featured section with best content or lead magnet
- Creator mode ON (if available)
After each item, ask if done or needs to skip. Don't block — mark skipped items as "recommended later."
If option 2 or 3: Move to Phase 2.
Phase 2: Plugin Personalization
╔═════════════════════════════════════════════╗
║ ONBOARDING — Phase 2 of 3: Personalization ║
╚═════════════════════════════════════════════╝
Count published posts by checking ## Recent Posts entries in state file.
If fewer than 3 published posts (new user):
Show: "Your plugin is ready to use with sensible defaults. Personalization makes content more authentic — we'll suggest improvements after you've published a few posts."
Use AskUserQuestion:
- Set up voice profile (optional, recommended later) — 5 questions about your writing style
- Set up user profile (optional, recommended later) — Your name, industry, expertise areas
- Both — Do voice + user profile now
- Skip for now — Use defaults, I'll run
/linkedin:setupwhen ready
If 3+ published posts (returning user):
Calculate personalization score:
node --input-type=module -e "
import { calculateScore } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/personalization-score.mjs';
const result = calculateScore('${CLAUDE_PLUGIN_ROOT}');
console.log(JSON.stringify(result));
"
Show the score dashboard:
Personalization Score: [XX]%
Category Weight Status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Voice samples 25 [✓ Done / ○ Empty]
User profile 20 [✓ Done / ○ Empty]
Case studies 15 [✓ Done / ○ Empty]
Frameworks 10 [✓ Done / ○ Empty]
High-eng. posts 10 [✓ Done / ○ Empty]
Demographics 8 [✓ Done / ○ Empty]
Engagement patterns 7 [✓ Done / ○ Empty]
Post templates 5 [✓ Done / ○ Empty]
Identify the top 2 incomplete categories by weight and guide through those:
Priority setup (2 categories only — keep it focused):
Use AskUserQuestion:
- Set up voice profile (weight: 25) — 5 questions about your writing style, or paste 3 examples
- Set up user profile (weight: 20) — Your name, industry, expertise areas, audience
- Both — Do voice + user profile now
- Skip for now — I'll run
/linkedin:setuplater for the full setup
If voice selected: Run a quick 5-question voice interview:
- "How would you describe your communication style in one sentence?"
- "What words or phrases do you naturally use?" (give examples)
- "What tone turns you off in LinkedIn content?"
- "Paste a paragraph you've written that sounds like YOU (email, doc, anything)"
- "Any words or phrases you'd NEVER use?"
Save the responses to assets/voice-samples/authentic-voice-samples.md. If the
file is the shipped placeholder (it contains <!-- VOICE_PLACEHOLDER -->),
REPLACE it entirely with the profile built from the answers — the
<!-- VOICE_PLACEHOLDER --> sentinel must NOT remain, or the voice score stays at
0 after the user fills it in. If the file is already a populated profile, add a
## Quick Voice Interview section instead of overwriting. Either way, the final
file must contain no <!-- VOICE_PLACEHOLDER -->.
If user profile selected: Ask for:
- Full name
- Industry
- Job title / role
- 5 expertise areas (these become your content pillars)
- Target audience description
Save to config/user-profile.local.md.
After setup, recalculate and show updated score.
Phase 3: First Post
╔═══════════════════════════════════════════╗
║ ONBOARDING — Phase 3 of 3: First Post ║
╚═══════════════════════════════════════════╝
Check first_post_date in state file.
If first_post_date is set (returning user):
- "You already have your first post (published [date]). Ready for your next one? Use
/linkedin:postor/linkedin:quickwhenever you are." Move to Phase 4.
If null (no first post yet) — draft it inline, right here:
"This is the most important step — your first post doesn't need to be perfect, it needs to EXIST. Let's write it now, together, in this flow."
Use AskUserQuestion:
- Write my first post now — Draft it inline, ~5 minutes, ready to paste
- Not now — I'll post later (you can use
/linkedin:postor/linkedin:quickanytime)
If "Not now": move to Phase 4 and mark the first post Pending.
If "Write my first post now": walk through these steps inline — do NOT hand off to another command. The post is produced right here in the wizard.
3.1 — Pick a topic
Use AskUserQuestion:
- Something I learned recently — a specific insight from your work
- A tool or approach I recommend — something that made your work better
- An observation about my industry — a pattern or trend you've noticed
- A question I'm genuinely curious about — start a conversation
Then ask: "Give me a sentence or two about what you have in mind." If expertise areas are set in the state file, steer the topic toward one of their pillars.
3.2 — Write the post (3-line formula)
Draft the post using the voice profile from Phase 2 (or the existing assets/voice-samples/ profile):
- Line 1 — Hook (under 140 chars): specific to their experience, no generic opening
- Line 2 — Context (1-3 sentences): the what and why, kept tight
- Line 3 — Insight + question: their takeaway, ending on a genuine question that invites comments
Target 150-500 characters (short posts perform well for new accounts). One point, not three. No external links in the post body.
3.3 — Quick quality check
Confirm 4 things before presenting:
- Hook works in 140 chars?
- ONE clear point (not three)?
- Ends with a question or invitation?
- Sounds like THEM (not corporate/AI)?
Fix any miss before showing it.
3.4 — Present and copy
Show the post with its character count, the hook highlighted, and one alternative hook. Auto-copy the post text to clipboard silently:
printf '%s' '<POST_TEXT>' | node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/clipboard-helper.mjs
Then say: "Post copied to clipboard. Go to linkedin.com, click 'Start a post', paste it, and hit Post."
3.5 — Record it
Update state deterministically (this sets first_post_date automatically when null):
node --input-type=module -e "
import { writeState, updatePostTracking } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/state-updater.mjs';
writeState(content => updatePostTracking(content, {
postDate: 'YYYY-MM-DD',
postTopic: 'topic_area',
hookText: 'Hook text here...',
charCount: NNNN,
format: 'post'
}));
"
Replace the placeholders with the actual post data, then continue to Phase 4.
Phase 4: Summary and Next Steps
╔═══════════════════════════════════════════╗
║ ONBOARDING COMPLETE ║
╚═══════════════════════════════════════════╝
Show final status:
Profile: [Optimized / Skipped — run /linkedin:profile later]
Personalization: [XX]% [↑ from YY% if improved]
First post: [Published DATE / Pending — create anytime with /linkedin:post or /linkedin:quick]
What's next — your first week:
- Create 2-3 posts this week (
/linkedin:postor/linkedin:quick) - Engage with 5 posts in your niche before and after publishing (5x5x5 method)
- Import your first analytics data after 7 days (
/linkedin:import) - Run
/linkedin:reportafter your first week to see what's working
Power commands to explore:
/linkedin:batch— Plan a full week of content in one session/linkedin:react— Turn articles and news into posts/linkedin:strategy— Growth strategy tailored to your follower level/linkedin— See all 29 commands anytime