---
name: linkedin:onboarding
description: |
  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".
allowed-tools:
  - Read
  - Write
  - Bash
  - AskUserQuestion
---

# LinkedIn Onboarding Wizard

You are the LinkedIn Studio 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 Posts` has 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?"
  1. Re-optimize profile (topic-relevance) → jump to Phase 1
  2. Improve personalization → jump to Phase 2
  3. Create another post → suggest `/linkedin:post` or `/linkedin:quick`
  4. 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:
1. **Guide me through profile optimization** — I want the full profile/topic-relevance checklist
2. **Already optimized** — I've already done this, skip ahead
3. **Do it later** — Skip for now, I'll run `/linkedin:profile` later

**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:
1. **Set up voice profile** (optional, recommended later) — 5 questions about your writing style
2. **Set up user profile** (optional, recommended later) — Your name, industry, expertise areas
3. **Both** — Do voice + user profile now
4. **Skip for now** — Use defaults, I'll run `/linkedin:setup` when ready

**If 3+ published posts (returning user):**

Calculate personalization score:
```bash
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:
1. **Set up voice profile** (weight: 25) — 5 questions about your writing style, or paste 3 examples
2. **Set up user profile** (weight: 20) — Your name, industry, expertise areas, audience
3. **Both** — Do voice + user profile now
4. **Skip for now** — I'll run `/linkedin:setup` later for the full setup

**If voice selected:** Run a quick 5-question voice interview:
1. "How would you describe your communication style in one sentence?"
2. "What words or phrases do you naturally use?" (give examples)
3. "What tone turns you off in LinkedIn content?"
4. "Paste a paragraph you've written that sounds like YOU (email, doc, anything)"
5. "Any words or phrases you'd NEVER use?"

Save the responses to `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/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:
1. Full name
2. Industry
3. Job title / role
4. 5 expertise areas (these become your content pillars)
5. Target audience description
6. Research MCPs connected (Tavily / Gemini deep research / Perplexity — or "none"; WebSearch + WebFetch are the always-available floor). Store only what they name — don't invent MCP names.

Save to `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/profile/user-profile.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:post` or `/linkedin:quick` whenever 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:
1. **Write my first post now** — Draft it inline, ~5 minutes, ready to paste
2. **Not now** — I'll post later (you can use `/linkedin:post` or `/linkedin:quick` anytime)

**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:
1. **Something I learned recently** — a specific insight from your work
2. **A tool or approach I recommend** — something that made your work better
3. **An observation about my industry** — a pattern or trend you've noticed
4. **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 `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/` profile):
- **Line 1 — Hook (110-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 in the 110-140 band (not just under 140)?
- [ ] 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:
```bash
node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/clipboard-helper.mjs <<'__LINKEDIN_CLIP_EOF__'
<POST_TEXT>
__LINKEDIN_CLIP_EOF__
```
Substitute `<POST_TEXT>` with the exact post text between the heredoc markers (a quoted heredoc keeps apostrophes, `%`, `$`, and backticks literal). Only if the helper prints `COPIED`, say: "Post copied to clipboard. Go to linkedin.com, click 'Start a post', paste it, and hit Post." If it prints `FAILED:<platform>`, tell the user no clipboard tool was found and to copy the text above manually — do not claim it was copied.

### 3.5 — Record it

Update state deterministically (this sets `first_post_date` automatically when null):
```bash
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:**
1. Create 2-3 posts this week (`/linkedin:post` or `/linkedin:quick`)
2. Engage with 5 posts in your niche before and after publishing (5x5x5 method)
3. Import your first analytics data after 7 days (`/linkedin:import`)
4. Run `/linkedin:report` after 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
