feat(linkedin-thought-leadership): v1.1.0 — Q2 2026 feature release

9 improvements across 3 tracks:

Onboarding: /linkedin:onboarding wizard, README Quick Start rewrite
Content Quality: voice drift scoring, industry angle variants,
  /linkedin:carousel, /linkedin:react multi-URL comparison
Analytics: automated week-rollover, day-of-week heatmap,
  month-over-month reports

25→27 commands. All Q2 ROADMAP items completed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-04-08 06:16:35 +02:00
commit 1a8cc1942c
33 changed files with 1726 additions and 236 deletions

View file

@ -0,0 +1,138 @@
---
name: linkedin:carousel
description: |
Create a LinkedIn carousel post with structured slide-by-slide content and visual layout guidance.
Carousels have the highest engagement rate (6.6%) on LinkedIn. Guides template selection,
topic definition, and generates copy for each slide plus caption.
Triggers on: "carousel", "slide deck", "pdf post", "swipe post", "multi-slide",
"linkedin carousel", "document post", "create slides".
allowed-tools:
- Read
- AskUserQuestion
---
# Carousel Post Generator
You are a LinkedIn carousel content specialist. Create high-engagement carousel posts with structured slide content and visual layout guidance.
## Step 0: Load Context
- Read `~/.claude/linkedin-thought-leadership.local.md` for posting state and expertise areas
- Read `assets/voice-samples/authentic-voice-samples.md` for voice profile
- Check recent posts to avoid topic repetition
## Step 1: Choose Template
Read `assets/templates/carousel-templates.md` for the 5 templates.
Present the options:
```
LinkedIn carousels get 6.6% average engagement — highest of all formats.
Choose a template:
1. How-To Guide — Teach a process step-by-step (8-10 slides)
2. Listicle / Top N — Curated list of tips, tools, or lessons (8-12 slides)
3. Story / Before-After — Personal narrative with transformation (8-10 slides)
4. Comparison / vs. — Side-by-side analysis of two approaches (8-10 slides)
5. Framework / Mental Model — Present an original framework (8-10 slides)
```
Use AskUserQuestion for selection.
## Step 2: Define Topic and Audience
Ask:
1. "What's the core topic or insight for this carousel?"
2. "Who is the primary audience? (e.g., developers, managers, executives)"
If the user's expertise areas are set in the state file, suggest topics aligned with their pillars.
## Step 3: Generate Slide Content
Using the selected template structure from `carousel-templates.md`, generate content for each slide.
**Output format for each slide:**
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SLIDE [N] of [TOTAL] — [Purpose from template]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
HEADER:
[Bold headline text — max 8 words]
BODY:
[Line 1 — max 50 chars]
[Line 2 — max 50 chars]
[Line 3 — max 50 chars]
[Line 4 — max 50 chars (optional)]
[Line 5 — max 50 chars (optional)]
VISUAL NOTE:
[Layout suggestion: e.g., "Icon: lightbulb left of header",
"Before/After split layout", "Numbered list with accent color",
"Summary table with checkmarks"]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```
**Slide content rules:**
- Max 5-7 lines of body text per slide (mobile readability)
- One idea per slide — if it needs two points, it needs two slides
- Use the template's formula for each slide type (cover, step, item, CTA, etc.)
- Headlines in sentence case, not ALL CAPS
- Include the template-specific patterns (Pro tip, Before/After, Winner, etc.)
## Step 4: Generate Caption
Generate a caption following the carousel caption structure from the template file:
1. **Hook** (first line): Question, bold claim, or surprising stat — 110-140 chars
2. **Context** (1-2 lines): Why this matters to the audience
3. **Swipe prompt**: Reference a specific slide to create curiosity
4. **Engagement CTA**: Question that invites comments
5. **Hashtags**: 3-4 maximum
Target: 300-500 characters total.
Match the user's voice profile — check against avoid-list and tone markers.
## Step 5: Quality Check
Run against the Carousel Quality Checklist from `carousel-templates.md`:
- [ ] Cover slide has a clear promise or question
- [ ] Each slide has one point (not multiple ideas)
- [ ] Text is readable on mobile (keep lines short)
- [ ] 8-10 slides total
- [ ] Last slide has a clear CTA
- [ ] Caption hooks attention and prompts swipe
- [ ] Consistent structure across all slides
If any item fails, fix before presenting.
## Step 6: Present Complete Deck
Show all slides in order, then the caption, then design guidance:
```
DESIGN GUIDE
━━━━━━━━━━━━
Dimensions: 1080 × 1350 px (4:5 portrait)
Font: Sans-serif, 24pt+ body, 36pt+ headlines
Colors: Pick 3 — background, text, accent
Export: PDF format, under 100 MB
Tools: Canva, PowerPoint, Figma, or Keynote
Create one slide per page using the content above.
Export as PDF and upload directly to LinkedIn.
```
Use AskUserQuestion: "Want to refine any slides, or is this ready for design?"
## Step 7: State Update
If the user confirms the carousel is ready:
- Note in state file: topic, format=carousel, slide count
- Suggest: "After publishing, run the 5x5x5 engagement method for maximum reach."

View file

@ -27,23 +27,6 @@ The follower segment only appears if `follower_count > 0` in the state file.
If the state file doesn't exist, show: "No LinkedIn state tracked yet. State tracking starts when you create your first post."
## New User Detection
After reading the state file, check if `first_post_date` is null/empty AND `posts_this_week` is 0. If so, this is a new user. Show a condensed getting-started menu INSTEAD of the full command list:
**You haven't posted yet! Here's where to start:**
| # | Action | Time |
|---|--------|------|
| 0 | **Profile audit** — optimize for 360Brew algorithm | 10 min |
| 1 | **Personalize** — set up your voice, audience, and goals | 15 min |
| 2 | **First post** — guided creation with hand-holding | 10 min |
| 3 | **Show all commands** — I know what I'm doing |
Use AskUserQuestion with these 4 options. Route 0 → `/linkedin:profile`, 1 → `/linkedin:setup`, 2 → `/linkedin:first-post`, 3 → continue to the full command list below.
**Skip this section entirely if `first_post_date` is set or `posts_this_week` > 0.** Proceed to Upcoming Posts and the full command list.
## Upcoming Posts
After the status line, show upcoming scheduled posts from the queue:
@ -81,6 +64,7 @@ Present these options to the user:
| Command | Purpose |
|---------|---------|
| `/linkedin:onboarding` | Full onboarding wizard — profile, setup, and first post in one flow |
| `/linkedin:first-post` | First-post accelerator — zero to published in under 10 minutes |
| `/linkedin:setup` | Guided setup to populate empty asset templates with your real voice, case studies, and audience data |
@ -93,6 +77,7 @@ Present these options to the user:
| `/linkedin:quick` | Fast 5-minute post using the 3-line formula |
| `/linkedin:templates` | Browse and apply proven post templates |
| `/linkedin:pipeline` | Full end-to-end workflow from idea to post-publish analysis |
| `/linkedin:carousel` | Create structured multi-slide carousel with visual layout guidance |
| `/linkedin:video` | Create video scripts with hook, body, CTA, captions, and thumbnail suggestions |
| `/linkedin:batch` | Create a full week of content in one session |
| `/linkedin:calendar` | View and manage your post scheduling queue |
@ -133,7 +118,7 @@ Use AskUserQuestion to ask:
**What would you like to do?**
0. **First post** — Never posted? Start here (10 min)
0. **Onboarding wizard** — Just installed? Full guided flow: profile → setup → first post
1. **Setup & personalize** — Guided setup to populate voice, case studies, frameworks, and audience data
2. **Create a post** — Full post workflow with angle selection
3. **React to a URL** — Turn an article/news into a post
@ -170,6 +155,7 @@ If the user already has content they want to turn into a post:
## Direct Routing
If the user's intent is clear from context:
- Mentions "onboarding" or "just installed" or "walk me through" or "setup wizard" or "start from scratch" → Route to `/linkedin:onboarding`
- Mentions "first post" or "never posted" or "get started" or "new to linkedin" or "help me start" → Route to `/linkedin:first-post`
- Mentions "setup" or "personalize" or "templates empty" or "score" or "fill in assets" or "configure plugin" → Route to `/linkedin:setup`
- Mentions "react" or "this article" or "this url" or "turn this into" or "share this news" → Route to `/linkedin:react`
@ -182,6 +168,7 @@ If the user's intent is clear from context:
- Mentions "profile" or "360Brew" → Route to `/linkedin:profile`
- Mentions "not working" or "low reach" → Route to `/linkedin:analyze`
- Mentions "strategy" or "growth plan" → Route to `/linkedin:strategy`
- Mentions "carousel" or "slides" or "slide deck" or "pdf post" or "swipe" or "document post" → Route to `/linkedin:carousel`
- Mentions "template" → Route to `/linkedin:templates`
- Mentions "audit" or "review strategy" → Route to `/linkedin:audit`
- Mentions "authority" or "signature content" → Route to `/linkedin:authority`

View file

@ -0,0 +1,182 @@
---
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 25 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
- Bash
- AskUserQuestion
---
# 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-thought-leadership.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]%)."
- Use AskUserQuestion: "Would you like to re-run a specific phase?"
1. Re-optimize profile (360Brew) → 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 (360Brew)
```
╔═══════════════════════════════════════╗
║ ONBOARDING — Phase 1 of 3: Profile ║
╚═══════════════════════════════════════╝
```
Explain briefly:
- LinkedIn's 360Brew algorithm (January 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 360Brew 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 360Brew 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 ║
╚═════════════════════════════════════════════╝
```
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 responses to `assets/voice-samples/authentic-voice-samples.md` under a new section `## Quick Voice Interview` (append, don't overwrite existing content).
**If user profile selected:** Ask for:
1. Full name
2. Industry
3. Job title / role
4. 3-5 expertise areas (these become your content pillars)
5. 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 null (no first post yet):**
- "You're ready to create your first post! This is the most important step — your first post doesn't need to be perfect, it needs to EXIST."
- Use AskUserQuestion:
1. **Guided first post** (10 min) — Maximum hand-holding, simple format → routes to `/linkedin:first-post` workflow
2. **Quick post** (5 min) — You already know what to say → routes to `/linkedin:quick` workflow
3. **Not now** — I'll post later
**If first_post_date is set:**
- "You already have your first post (published [date]). Ready to create your next one?"
- Use AskUserQuestion:
1. **Create a new post** → suggest `/linkedin:post`
2. **Quick post** → suggest `/linkedin:quick`
3. **Exit onboarding**
**If user chooses to post (option 1 or 2):** Don't invoke the sub-command directly — instead, tell them:
"Run `/linkedin:first-post` to start the guided first-post flow."
or
"Run `/linkedin:quick` to create a quick post."
This keeps the onboarding context clean and lets the post commands manage their own workflow.
## 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 — run /linkedin:first-post]
```
**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 25 commands anytime

View file

@ -23,16 +23,6 @@ You are a LinkedIn thought leadership content creator. Guide the user through cr
First, load persistent state and personalization:
- Read `~/.claude/linkedin-thought-leadership.local.md` for posting state (streak, weekly progress, recent topics)
- Read `skills/linkedin-thought-leadership/SKILL.md` for user profile, voice settings, and preferences
- Read `config/user-profile.local.md` (if it exists) for expertise areas and audience
### Readiness Check
If `config/user-profile.local.md` doesn't exist OR `assets/voice-samples/authentic-voice-samples.md` contains `[Your Name]` in the title line, show this non-blocking notice:
> This plugin isn't personalized yet. Content will use generic best practices.
> Run `/linkedin:setup` after this session to unlock voice-matched content.
Then proceed normally — do not block content creation.
Check state for topic planning:
- Compare intended topic against "Recent Posts" in state file
@ -73,6 +63,8 @@ If they provide a URL, use WebFetch to extract the content first.
Read `references/thought-leadership-angles.md` for the 8 universal angles.
**Industry-specific angles:** If `config/user-profile.local.md` exists and has an `industry` field, check the "Industry Angle Variants" section in `thought-leadership-angles.md` for the matching industry table. Use the industry-specific starter questions and example hooks to generate more targeted angle suggestions.
Present 2-3 possible angles for their content:
```
@ -101,7 +93,7 @@ Based on content type, recommend a format:
| Frameworks/processes | Carousel or Native document |
| Opinions/takes | Text-only medium post |
If carousel, outline the slide structure.
If carousel is the best format, recommend: "This topic works great as a carousel. Run `/linkedin:carousel` for the full slide-by-slide generator with 5 proven templates."
## Step 4: Structure and Write

View file

@ -27,17 +27,6 @@ Read `skills/linkedin-thought-leadership/SKILL.md` for:
- Core expertise areas (for topical alignment)
- Phrases they commonly use
Read `config/user-profile.local.md` (if it exists) for expertise areas and audience.
### Readiness Check
If `config/user-profile.local.md` doesn't exist OR `assets/voice-samples/authentic-voice-samples.md` contains `[Your Name]` in the title line, show this non-blocking notice:
> This plugin isn't personalized yet. Content will use generic best practices.
> Run `/linkedin:setup` after this session to unlock voice-matched content.
Then proceed normally — do not block content creation.
Read `assets/quick-post-resources.md` for:
- Hooks bank
- CTAs bank

View file

@ -26,7 +26,7 @@ First, load persistent state and personalization:
- Read `assets/voice-samples/authentic-voice-samples.md` for voice profile
- Check recent posts to avoid topic repetition within 7 days
## Step 1: Get the URL
## Step 1: Get URL(s)
If the user hasn't provided a URL, ask for one. Accept:
- News articles
@ -36,6 +36,17 @@ If the user hasn't provided a URL, ask for one. Accept:
- Company announcements
- Social media threads
**Multiple URLs:** If the user provides 2-3 URLs, or if you detect multiple links, use AskUserQuestion:
```
I see multiple URLs. Would you like to:
1. React to a single article (pick the most interesting one)
2. Compare and contrast 2-3 articles into one post
```
If option 2 → jump to **Comparison Path** (Step 1b below).
If option 1 or single URL → continue to Step 2.
## Step 2: Fetch and Analyze Content
Use WebFetch to extract the content from the URL. Ask WebFetch to extract:
@ -143,6 +154,96 @@ After the post is finalized, update `~/.claude/linkedin-thought-leadership.local
- Update `longest_streak` if current exceeds it
- Add entry to "## Recent Posts": [YYYY-MM-DD] "Hook text..." (char count) - topic
---
## Comparison Path (Multi-URL)
When the user wants to compare 2-3 articles into one post.
### Step 1b: Collect URLs
Collect 2-3 URLs. Minimum 2, maximum 3. If the user provided them already, confirm the list.
### Step 2b: Fetch All Sources
Use WebFetch on each URL. For each, extract:
- **Title** and author/source
- **Key claims** (3-5 bullet points)
- **Stance/argument** — what position does the author take?
- **Data points** — any statistics or evidence cited
### Step 3b: Synthesis Analysis
Analyze across all sources:
| Dimension | Analysis |
|-----------|----------|
| **Common ground** | Where do the sources agree? |
| **Tension points** | Where do they disagree or contradict? |
| **Blind spots** | What are ALL of them missing? |
| **Your unique angle** | Given your expertise, what perspective do you add? |
### Step 4b: Choose Comparison Angle
Present 3 angles via AskUserQuestion:
1. **Synthesis** — "These perspectives seem opposed, but the truth is more nuanced. Here's how I connect them."
2. **Contrarian to all** — "Both/all articles miss the real issue. Here's what actually matters."
3. **Pattern analysis** — "The fact that [N] experts are all writing about [X] tells us something about [Y]."
### Step 5b: Generate Comparison Draft
Structure:
**Hook (110-140 chars):** Your synthesized perspective — NOT "I read 3 articles about..." Avoid mentioning the number of sources in the hook.
**The conversation (1-2 sentences):** Briefly describe the debate or trend ("There's a growing conversation about [X]. Perspectives range from [A] to [B].")
**Your lens (main body):**
- What the synthesis reveals that individual pieces miss
- Concrete example from your experience that connects the dots
- Where you agree and where you push back
**Implication (1-2 sentences):** What this convergence/divergence means for the audience.
**CTA:** Question that invites people to take a side or share their own synthesis.
### Critical Rules (comparison-specific):
- **NO URLs in post body** — all links go in first comment
- Post must stand alone without reading any of the sources
- Don't summarize each article — synthesize across them
- Your perspective is the star, not the articles
- Character target: 1,200-1,800 chars
### Step 6b: Quality Check
Same as Step 6, plus:
- [ ] Post is a synthesis, not a summary of each article
- [ ] Hook doesn't mention number of sources read
- [ ] Each source is credited in the first comment, not the post
### Step 7b: Present Draft
Show:
1. The main draft with character count
2. 2 alternative hooks
3. Suggested first comment with ALL URLs:
```
Sources referenced:
1. "[Title]" by [Author] — [URL]
2. "[Title]" by [Author] — [URL]
3. "[Title]" by [Author] — [URL] (if applicable)
```
4. Recommended posting time
Offer same refinement options as Step 7.
### Step 8b: State Update
Same as Step 8 — update state file with topic, increment counts, etc.
---
## Reference Files
- `assets/voice-samples/authentic-voice-samples.md` — Voice matching

View file

@ -37,18 +37,32 @@ You need to import your LinkedIn analytics first:
1. Run `/linkedin:import` to import CSV data
2. Then come back to generate reports
## Step 2: Determine Week to Report On
If no week specified, default to current week or most recent available data.
## Step 2: Choose Report Type
**Ask the user** using AskUserQuestion:
```
What kind of report would you like?
1. Weekly report (default) — performance for a specific ISO week
2. Monthly report — month summary with month-over-month comparison
3. Day-of-week heatmap — which days perform best
Enter your choice:
```
**If monthly (option 2):** Ask for month (YYYY-MM format, default to current month), then jump to **Step 2b**.
**If heatmap (option 3):** Run the heatmap CLI command and jump to **Step 6c**.
**If weekly (option 1 or default):** Continue below.
### Weekly: Determine Week
```
Which week would you like a report for?
Available options:
- "current" or "this week" - Current ISO week (2026-W05)
- "last week" - Previous ISO week (2026-W04)
- "current" or "this week" - Current ISO week
- "last week" - Previous ISO week
- Specific week: "2026-W03", "2025-W52", etc.
- "latest" - Most recent week with data
@ -62,6 +76,26 @@ To get current ISO week:
date +%Y-W%V
```
### Step 2b: Monthly Report
If the user chose monthly:
```bash
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" report --month <YYYY-MM>
```
Read the generated JSON from `assets/analytics/monthly-reports/<YYYY-MM>.json`. Present the monthly summary with MoM comparison deltas, weekly breakdown, and top performers. Then jump to Step 7 for deep-dive options.
### Step 2c: Heatmap
If the user chose heatmap:
```bash
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" heatmap
```
Present the day-of-week matrix and best-day findings. Then jump to Step 7 for deep-dive options.
## Step 3: Run Report Generation
Execute the report CLI command: