refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0)

BREAKING CHANGE: the marketplace slug, the agent namespace
(linkedin-studio:<agent>), and the runtime state-file path
(~/.claude/linkedin-studio.local.md) all change. Reinstall required;
existing state migrated in place (post metrics, streak, history preserved).
The /linkedin:* commands are unchanged — the command namespace is set
per-command in frontmatter and was always independent of the plugin slug.
Functionality is byte-identical to v2.4.0; this release is pure identity.

- dir + manifests: plugins/linkedin-studio + plugin.json + root marketplace.json
- agent namespace updated in commands/newsletter.md (only functional invoker)
- state path updated in 4 hook scripts + topic-rotation prompt + state template
- catch-all skill dir renamed skills/linkedin-studio (5 functional skills unchanged)
- docs + version bump to 3.0.0 across README badge, CHANGELOG, root README/CLAUDE.md
- historical records (CHANGELOG past entries, docs/ build artifacts,
  config-audit v5.0.0 snapshots) intentionally retain the old slug

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-05-29 11:32:02 +02:00
commit 52fa87a255
59 changed files with 148 additions and 122 deletions

View file

@ -40,7 +40,7 @@ ls -1 ${CLAUDE_PLUGIN_ROOT}/assets/analytics/ab-tests/ 2>/dev/null | head -20
ls -1 ${CLAUDE_PLUGIN_ROOT}/assets/analytics/posts/ 2>/dev/null | grep -E '\.json$' | head -10
```
If `~/.claude/linkedin-thought-leadership.local.md` exists, read it for user context (posting frequency, follower level, topics).
If `~/.claude/linkedin-studio.local.md` exists, read it for user context (posting frequency, follower level, topics).
## Step 1: Determine Intent

View file

@ -20,7 +20,7 @@ You are a LinkedIn performance analyst. Help the user diagnose why their content
Read these reference files:
- `references/troubleshooting-guide.md` - Failure patterns and solutions
- `references/algorithm-signals-reference.md` - Algorithm mechanics
- `skills/linkedin-thought-leadership/SKILL.md` - User's profile and goals
- `skills/linkedin-studio/SKILL.md` - User's profile and goals
## Step 1: Diagnose the Problem

View file

@ -20,9 +20,9 @@ You are a LinkedIn content strategy auditor. Conduct a thorough review of the us
## Step 0: Gather Data
Load all available data:
- Read `~/.claude/linkedin-thought-leadership.local.md` for posting history
- Read `~/.claude/linkedin-studio.local.md` for posting history
- Read `${CLAUDE_PLUGIN_ROOT}/assets/plans/` for planned content
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-thought-leadership/SKILL.md` for strategy reference
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for strategy reference
- Check for any analytics data in `${CLAUDE_PLUGIN_ROOT}/assets/analytics/`
- Read `assets/audience-insights/demographics.md` for audience composition — compare intended vs actual audience
- Read `assets/audience-insights/engagement-patterns.md` for tracked patterns (timing, topics, formats, hooks)
@ -103,7 +103,7 @@ Analyze trajectory:
## Step 5.5: Milestone Progress Check
If `follower_count > 0` in the state file (`~/.claude/linkedin-thought-leadership.local.md`), analyze milestone progress:
If `follower_count > 0` in the state file (`~/.claude/linkedin-studio.local.md`), analyze milestone progress:
### Growth Trajectory

View file

@ -23,8 +23,8 @@ You are a LinkedIn batch content creator. Help the user create an entire week's
## Step 0: Load Context
Load state and personalization:
- Read `~/.claude/linkedin-thought-leadership.local.md` for recent topics and weekly goals
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-thought-leadership/SKILL.md` for profile and preferences
- Read `~/.claude/linkedin-studio.local.md` for recent topics and weekly goals
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for profile and preferences
- Check `${CLAUDE_PLUGIN_ROOT}/assets/plans/` for existing weekly plan
- Read `assets/templates/my-post-templates.md` for proven templates — vary templates across the batch for format diversity

View file

@ -42,7 +42,7 @@ console.log(JSON.stringify(queueCount(), null, 2));
```
Also read state for context:
- `~/.claude/linkedin-thought-leadership.local.md` for weekly goal and current progress
- `~/.claude/linkedin-studio.local.md` for weekly goal and current progress
## Step 2: Display Calendar View

View file

@ -22,7 +22,7 @@ You are a LinkedIn carousel content specialist. Create high-engagement carousel
## Step 0: Load Context
- Read `~/.claude/linkedin-thought-leadership.local.md` for posting state and expertise areas
- Read `~/.claude/linkedin-studio.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

View file

@ -20,8 +20,8 @@ You are a LinkedIn competitive intelligence analyst. Help the user learn from ot
## Step 0: Load Context
Read the user's profile and strategy:
- `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-thought-leadership/SKILL.md` — Expertise areas and positioning
- `~/.claude/linkedin-thought-leadership.local.md` — Current posting patterns
- `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` — Expertise areas and positioning
- `~/.claude/linkedin-studio.local.md` — Current posting patterns
## Step 1: Identify Competitors

View file

@ -23,7 +23,7 @@ The first post doesn't need to be perfect. It needs to EXIST. Every day without
## Step 0: Load Context
Read `~/.claude/linkedin-thought-leadership.local.md` for current state.
Read `~/.claude/linkedin-studio.local.md` for current state.
Read `assets/voice-samples/authentic-voice-samples.md` for voice profile (if it exists).
Check: If `first_post_date` is already set, this user has posted before. Suggest `/linkedin:post` or `/linkedin:quick` instead, and explain this command is for true first-timers.

View file

@ -222,7 +222,7 @@ Run /linkedin:report (period: 4w)
`/linkedin:report` will:
1. Read `expertise_areas` from `~/.claude/linkedin-thought-leadership.local.md`
1. Read `expertise_areas` from `~/.claude/linkedin-studio.local.md`
2. Call `trends` for impressions and engagement_rate over the last 4 weeks:
```bash
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" trends --period 4w --metric impressions
@ -241,7 +241,7 @@ manually when analytics are ready."
After successful import and analysis, update the state file:
```
Read ~/.claude/linkedin-thought-leadership.local.md
Read ~/.claude/linkedin-studio.local.md
Set last_import_date to today (YYYY-MM-DD)
Set last_import_week to current ISO week (YYYY-WXX)
Write the updated state file

View file

@ -11,13 +11,13 @@ allowed-tools:
- AskUserQuestion
---
# LinkedIn Thought Leadership Command Router
# LinkedIn Studio Command Router
You are a LinkedIn thought leadership assistant. The user has invoked the main `/linkedin` command. Your job is to help them navigate to the right subcommand.
## Session Status
If `~/.claude/linkedin-thought-leadership.local.md` exists, read it and show a brief status line:
If `~/.claude/linkedin-studio.local.md` exists, read it and show a brief status line:
```
LinkedIn: X/Y posts this week | Streak: N days | Last: YYYY-MM-DD | X/10000 followers (Phase)
@ -200,4 +200,4 @@ If the user's intent is clear from context:
## Reference
For full skill documentation, see:
- `skills/linkedin-thought-leadership/SKILL.md` - Complete skill with personalization settings
- `skills/linkedin-studio/SKILL.md` - Complete skill with personalization settings

View file

@ -28,8 +28,8 @@ ${CLAUDE_PLUGIN_ROOT}/references/linkedin-monetization-strategies.md → pricin
${CLAUDE_PLUGIN_ROOT}/references/opportunity-generation.md → conversion funnels, DM strategy
${CLAUDE_PLUGIN_ROOT}/references/linkedin-growth-playbook-2025-2026.md → algorithm context
${CLAUDE_PLUGIN_ROOT}/references/growth-roadmaps.md → stage progression
~/.claude/linkedin-thought-leadership.local.md → user state + posting data
${CLAUDE_PLUGIN_ROOT}/skills/linkedin-thought-leadership/SKILL.md → expertise areas
~/.claude/linkedin-studio.local.md → user state + posting data
${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md → expertise areas
```
## Step 1: Readiness Assessment

View file

@ -22,7 +22,7 @@ You are a multi-platform content strategist. Help the user adapt their LinkedIn
Ask the user to provide their LinkedIn content or read from drafts:
- Read `${CLAUDE_PLUGIN_ROOT}/assets/drafts/` for recent content
- Read `~/.claude/linkedin-thought-leadership.local.md` for recent posts
- Read `~/.claude/linkedin-studio.local.md` for recent posts
## Step 1: Select Target Platform

View file

@ -60,8 +60,8 @@ This command is **fundamentally different** from the short-form commands:
delegate the fan-out to a nested background agent.
> **Agent invocation form (required).** Plugin agents resolve only under their
> namespaced type — `subagent_type: linkedin-thought-leadership:<name>` (e.g.
> `linkedin-thought-leadership:fact-checker`), never the bare `<name>`. A bare
> namespaced type — `subagent_type: linkedin-studio:<name>` (e.g.
> `linkedin-studio:fact-checker`), never the bare `<name>`. A bare
> `subagent_type` does not resolve and the `Task` call fails. Every
> `subagent_type` below is written in the namespaced form for this reason.
@ -428,7 +428,7 @@ Next: Step 2.5 — Skeleton + section pitch (operator + persona gate BEFORE pros
5. **Persona-skjelett-sweep — fan out `persona-reviewer` in skjelett-mode.**
Issue one `persona-reviewer` call per active persona in parallel — a SINGLE
message with multiple `Task` tool-uses, `subagent_type:
linkedin-thought-leadership:persona-reviewer`, from THIS command layer in
linkedin-studio:persona-reviewer`, from THIS command layer in
the foreground (principle 4). Pass each call the persona name, the path to
`<serie>/NN-skjelett.md`, and **`mode: skjelett`** (the before-prose mode —
five spine axes, ≤3 flags as direction, HOLDER/TVILER/MANGLER scoring).
@ -622,7 +622,7 @@ turning-points the spine already named.
3. **Expand with the `content-repurposer` muscle.** Reuse
`agents/content-repurposer.md` (its article→long-form conversion discipline)
for individual section expansions — invoke it via `Task` (`subagent_type:
linkedin-thought-leadership:content-repurposer`) when useful, *from this
linkedin-studio:content-repurposer`) when useful, *from this
command layer* (foreground, principle 4). The command owns assembly and
voice; the agent assists with conversion. The draft is voice-matched by
THIS session, not self-certified for voice — voice-match remains an
@ -683,7 +683,7 @@ checklist (full detail + pass/flag criteria in the reference file):
**De-AI / voice scrub (sub-pass — `voice-scrubber`).** After the rule pass, run
the draft through `voice-scrubber` (Opus) — `Task`, `subagent_type:
linkedin-thought-leadership:voice-scrubber`, from THIS command layer in the
linkedin-studio:voice-scrubber`, from THIS command layer in the
foreground (principle 4). Pass it the draft path AND the paths to the **approved
Norwegian editions** as the gold standard (e.g. earlier parts' locked
`linkedin/NN/POST.html` or their approved `NN-utkast.md`). **Do NOT** point it at
@ -742,7 +742,7 @@ because it "feels" right or because it sits in your own research notes.
block can be verified independently without overlap.
3. **Fan out in parallel — issue all N `fact-checker` calls in a SINGLE message**
(multiple `Task` tool-uses in one turn, `subagent_type: linkedin-thought-leadership:fact-checker`) so they
(multiple `Task` tool-uses in one turn, `subagent_type: linkedin-studio:fact-checker`) so they
run concurrently, from THIS command layer in the foreground (principle 4, plan
§3). Each call gets one claim-block and returns the agent's standard
verification log + risk-sort (🔴/🟡/🟢) + gate decision (PASS/REWORK/BLOCK).
@ -834,7 +834,7 @@ and `persona-reviewer` never flags em-dash density (that is this step).
settled text, not on a draft still moving under fact fixes.
2. **Run `editorial-reviewer` (single foreground `Task` call).** Invoke
`subagent_type: linkedin-thought-leadership:editorial-reviewer` from THIS
`subagent_type: linkedin-studio:editorial-reviewer` from THIS
command layer in the foreground (principle 4), passing the draft path
(`<serie>/NN-utkast.md`) and — when the edition is part of a series — the
series title (for the A3 series-title-symmetry check). The agent returns a
@ -924,7 +924,7 @@ reopening locked texts — the biggest single process error of the series (plan
2. **Fan out one `persona-reviewer` call per persona, in parallel** — issue them
in a SINGLE message (multiple `Task` tool-uses, `subagent_type:
linkedin-thought-leadership:persona-reviewer`), from THIS command layer in the
linkedin-studio:persona-reviewer`), from THIS command layer in the
foreground (principle 4).
Pass each call its persona name and **`mode: resonans`** (the before-lock mode
— all six axes, ≤5 flags as direction). This is NOT conversion mode, which is
@ -1258,7 +1258,7 @@ the post-lock conversion sweep, distinct from the pre-lock resonance sweep
collected post). This is what the reader sees before "…see more".
2. **Run `persona-reviewer` in conversion mode** (`subagent_type:
linkedin-thought-leadership:persona-reviewer`) for the **primær** persona
linkedin-studio:persona-reviewer`) for the **primær** persona
only, from THIS command layer in the foreground. Pass
**`mode: konverter`** (the after-lock, hook-only mode — NOT resonans). The
agent returns a single binary verdict, **JA / NEI**, on «would YOU click?» —

View file

@ -18,7 +18,7 @@ You are a LinkedIn thought leadership onboarding guide. Walk the user through pr
## Step 0: Load Context and Check State
Read `~/.claude/linkedin-thought-leadership.local.md` for current 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]%)."

View file

@ -70,8 +70,8 @@ ${CLAUDE_PLUGIN_ROOT}/references/collaborations-guide.md → format
${CLAUDE_PLUGIN_ROOT}/references/opportunity-generation.md → opportunity funnels, DM strategy
${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md → CEA, engagement strategies, content structures
${CLAUDE_PLUGIN_ROOT}/references/linkedin-growth-playbook-2025-2026.md → algorithm context
~/.claude/linkedin-thought-leadership.local.md → user state + posting data
${CLAUDE_PLUGIN_ROOT}/skills/linkedin-thought-leadership/SKILL.md → expertise areas
~/.claude/linkedin-studio.local.md → user state + posting data
${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md → expertise areas
```
## Step 1: Choose Your Outreach Track

View file

@ -24,8 +24,8 @@ You are a LinkedIn content pipeline orchestrator. Guide the user through the com
## Step 0: Load Context
Load persistent state and personalization:
- Read `~/.claude/linkedin-thought-leadership.local.md` for posting state
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-thought-leadership/SKILL.md` for profile and preferences
- Read `~/.claude/linkedin-studio.local.md` for posting state
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for profile and preferences
- Check `assets/voice-samples/` for voice matching
- Read `assets/templates/my-post-templates.md` for proven post templates — use these in Step 2 (Draft)
- Read `assets/frameworks/framework-template.md` if the topic involves a framework or methodology

View file

@ -22,8 +22,8 @@ You are a LinkedIn thought leadership content creator. Guide the user through cr
## Step 0: Load Context
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 `~/.claude/linkedin-studio.local.md` for posting state (streak, weekly progress, recent topics)
- Read `skills/linkedin-studio/SKILL.md` for user profile, voice settings, and preferences
Check state for topic planning:
- Compare intended topic against "Recent Posts" in state file

View file

@ -201,4 +201,4 @@ If the answer is no, fix the profile FIRST before posting.
- `references/algorithm-signals-reference.md` - 360Brew mechanics and signals
- `references/troubleshooting-guide.md` - Recovery if reach is already down
- `skills/linkedin-thought-leadership/SKILL.md` - User's expertise areas and topics
- `skills/linkedin-studio/SKILL.md` - User's expertise areas and topics

View file

@ -22,12 +22,12 @@ You are a LinkedIn quick-post assistant. Help the user create a short, impactful
## Load Context
Read `~/.claude/linkedin-thought-leadership.local.md` for:
Read `~/.claude/linkedin-studio.local.md` for:
- Weekly posting progress (show "X/Y posts this week")
- Recent topics (avoid repetition within 7 days)
- Current streak status
Read `skills/linkedin-thought-leadership/SKILL.md` for:
Read `skills/linkedin-studio/SKILL.md` for:
- User's voice profile and tone preferences
- Core expertise areas (for topical alignment)
- Phrases they commonly use

View file

@ -23,7 +23,7 @@ You are a LinkedIn content creator specializing in turning external content into
## Step 0: Load Context
First, load persistent state and personalization:
- Read `~/.claude/linkedin-thought-leadership.local.md` for posting state (streak, weekly progress, recent topics)
- Read `~/.claude/linkedin-studio.local.md` for posting state (streak, weekly progress, recent topics)
- Read `assets/voice-samples/authentic-voice-samples.md` for voice profile
- Check recent posts to avoid topic repetition within 7 days

View file

@ -383,7 +383,7 @@ Show detailed metrics for that post and suggest what made it perform well/poorly
After generating report, optionally update user's posting state:
Read `~/.claude/linkedin-thought-leadership.local.md` and suggest:
Read `~/.claude/linkedin-studio.local.md` and suggest:
- If week had 0 posts: "Streak broken - consider posting this week to restart"
- If week hit goal: "Goal achieved! Maintaining consistency."
- If week exceeded goal: "Exceeding goal - strong momentum!"
@ -457,7 +457,7 @@ Save to: `${CLAUDE_PLUGIN_ROOT}/assets/analytics/weekly-reports/YYYY-WXX-report.
3. [Actionable recommendation based on data]
---
*Generated by linkedin-thought-leadership plugin*
*Generated by linkedin-studio plugin*
```
**Important notes:**

View file

@ -27,11 +27,11 @@ Read these files:
- `references/growth-roadmaps.md` - Detailed phase roadmaps
- `references/linkedin-growth-playbook-2025-2026.md` - Comprehensive tactics
- `references/trajectory-strategy-adjustments.md` - Trajectory-based strategy adjustments
- `skills/linkedin-thought-leadership/SKILL.md` - User's goals and context
- `skills/linkedin-studio/SKILL.md` - User's goals and context
## Step 0.5: Auto-Detect from State
Before asking questions, check `~/.claude/linkedin-thought-leadership.local.md`:
Before asking questions, check `~/.claude/linkedin-studio.local.md`:
- If `follower_count > 0`: Auto-detect the user's phase. Skip the "How many followers?" question in Step 1.
- 0-1K → Phase 0: Foundation
@ -249,7 +249,7 @@ Based on their phase, provide detailed guidance.
## Step 3.5: Apply Trajectory Adjustments
If milestone data is available from `~/.claude/linkedin-thought-leadership.local.md`, overlay trajectory-specific adjustments on top of the phase strategy.
If milestone data is available from `~/.claude/linkedin-studio.local.md`, overlay trajectory-specific adjustments on top of the phase strategy.
### Determine Schedule Status

View file

@ -21,8 +21,8 @@ You are a LinkedIn video scripting assistant. Guide the user through creating a
## Step 0: Load Context
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 `~/.claude/linkedin-studio.local.md` for posting state (streak, weekly progress, recent topics)
- Read `skills/linkedin-studio/SKILL.md` for user profile, voice settings, and preferences
Check state for topic planning:
- Compare intended topic against "Recent Posts" in state file