linkedin-studio/commands/linkedin.md
Kjell Tore Guttormsen e7276cf8bb fix(linkedin-studio): N20 — CLAUDE_PLUGIN_ROOT-normalisering av load-bearing ref-stier [skip-docs]
81 load-bearing stier i 16 kommandofiler pinnet til ${CLAUDE_PLUGIN_ROOT}/.
Rene prefikser: 81 inn / 81 ut, ingen linje lagt til eller fjernet.

FASIT-VERIFISERING (premiss-sjekk mot BASELINE, ikke bare HEAD): planens
68 linjer / 17 filer er RIKTIG mot sin egen baseline 882f6ee. HEAD ga 73/18 —
altså ekte kode-drift siden baseline (newsletter.md 11→15, calendar.md 0→1),
ikke en telle-feil som i N19.

SCOPE UTVIDET ETTER GO: planens grep (references|hooks/scripts|scripts) har en
blindsone — skills/ assets/ config/ render/ agents/ commands/ er samme defekt-
klasse og allerede anerkjent som pin-verdig av mønsteret (audit.md:24 og
competitive.md:22 pinner skills/, batch.md:214 og pipeline.md:211 pinner
assets/). Under planens scope kunne dens EGEN verifisering ikke passere:
quick.md:229-230 ville stått upinnet rett over en pinnet linje, og setup.md
(3 load-bearing Read, 0 pins) var ikke i settet i det hele tatt.
Full defektklasse: 117 linjer / 19 filer → 81 pinnet, 36 bevisst urørt.

KLASSIFISERINGSREGEL (utledet av mønsteret, ikke oppfunnet):
- PIN = stien skal åpnes/kjøres/skrives — Read/Reference/See-pekere,
  ref-fil-lister, Bash/node/npm, edit-mål.
- PROSA = stien står som sitat bak en påstand, eller som beskrivelse av
  oppførsel/plassering. Ingen inline «(see …)» er pinnet noe sted i repoet
  (0 av 25 filer) — den grensen er arvet, ikke satt her.

36 BEVISST URØRTE, tre klasser:
1. Inline sitat/attribusjon (17): carousel.md:37 · pipeline.md:70,75 ·
   newsletter.md:999,1082,1211,1433 · report.md:273 · video.md:69 ·
   react.md:115 · calendar.md:87 · profile.md:28,34 · firsthour.md:112 ·
   monetize.md:343,492 · outreach.md:922
2. Beskrivelse av oppførsel/plassering (10): newsletter.md:50,1097,1205,1694,
   1744,1944 · report.md:45 · linkedin.md:218 · import.md:121,200
3. newsletter.md fase-tabellens Tooling-kolonne (9): :100,102,105,106,111,112,
   113,115,116 — tabellen er et register, og hvert steg pinner sitt eget
   faktiske kall i brødteksten.

S13-LINTEN (M0 data-dir): alle assets/-stiene som ble pinnet står eksplisitt i
lintens NEGATIVE13-unntaksliste, og lintens egen kommentar (test-runner.sh:552)
sier at shipped read-only assets SKAL bære ${CLAUDE_PLUGIN_ROOT}.

VERIFISERING: 76 unike pinnede stier hentet ut og resolvet med cwd=/tmp —
75 finnes. Den ene som ikke gjør det, config/personas.local.md, er en
gitignored valgfri fallback («else personas.template.md») som var pinnet på
newsletter.md:205 før denne endringen. Re-grep: gjenstående 36 er utelukkende
prosa, listet over.

Alle ti suiter grønne, alle floors uendret: test-runner 270/0 (269 assertions
>= floor 251) · trends 300/0 · analytics 202/0 · hooks 191/0 · brain 134/0 ·
editions 72/0 · render 63/0 · specifics-bank 45/0 · tests 35/0 ·
contract-gate 33/0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M31cw43gqiSSDrKzcwUi7L
2026-07-31 17:21:22 +02:00

232 lines
14 KiB
Markdown

---
name: linkedin
description: |
Main router for LinkedIn Studio commands. Lists all available subcommands
and helps the user choose the right workflow. Use when the user mentions "linkedin",
"linkedin help", "what linkedin commands", or needs guidance on which LinkedIn command to use.
Triggers on: "linkedin", "/linkedin", "linkedin help", "show linkedin commands".
allowed-tools:
- Read
- Bash
- AskUserQuestion
---
# LinkedIn Studio Command Router
You are the LinkedIn Studio 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-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)
```
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."
## Upcoming Posts
After the status line, show upcoming scheduled posts from the queue:
```bash
node --input-type=module -e "
import { queueUpcoming, queueOverdue, queueFormatSummary } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs';
console.log('=== UPCOMING ===');
console.log(queueFormatSummary(queueUpcoming(7)));
console.log('=== OVERDUE ===');
console.log(queueFormatSummary(queueOverdue()));
"
```
If there are upcoming posts, display:
```
Upcoming Posts (next 7 days):
[date] [time]: "[hook preview]" — [pillar] ([format])
[date] [time]: "[hook preview]" — [pillar] ([format])
```
If there are overdue posts, display with warning:
```
OVERDUE (should have been posted):
[date]: "[hook preview]" — Run /linkedin:calendar to mark as published or reschedule
```
If queue is empty: "No posts scheduled. Run /linkedin:batch to plan your week."
## Work in Progress + Open Slots
The queue only shows finished posts waiting to go out. Add the production picture —
long-form editions still being written, and publishing slots nothing covers yet:
```bash
node --input-type=module -e "
import { activeEditions, slotVacancies, formatSlot, readSlots } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/slots.mjs';
console.log('=== IN FLIGHT ===');
console.log(activeEditions().map(e => e.series + ' #' + e.editionId + ' | ' + e.currentPhase + ' | next: ' + (e.nextAction || 'unset') + ' | ' + e.daysInFlight + 'd').join('\n') || 'none');
console.log('=== OPEN SLOTS ===');
console.log(readSlots().slots.length ? (slotVacancies({ days: 14 }).map(s => formatSlot(s)).join('\n') || 'none - every planned slot is covered') : 'grid not configured');
"
```
Show one line per in-flight edition and the next open slot:
```
In flight: [series #NN] — [phase] → [next action] ([N]d)
Next open slot: [Thu YYYY-MM-DD 12:00 (in N days)] — [X] open in 14 days
```
Both lines are omitted when there is nothing to report (no active editions / no grid
configured). If the grid is not configured, do **not** nag — `/linkedin:calendar`
explains the opt-in when the user goes there.
## Available Commands
LinkedIn Studio is organized as **five journeys**. Each journey has a **front-door**
command (start here if you're unsure) plus the focused commands it routes to. Type a
front-door when you know the journey but not the exact command; type a specific command
directly when you do.
### 🟢 Start — get set up and publish your first post
| Command | Purpose |
|---------|---------|
| `/linkedin:onboarding` | **Front-door.** Full guided flow: profile → setup → first post |
| `/linkedin:setup` | Populate voice samples, case studies, frameworks, and audience data |
| `/linkedin:first-post` | First-post accelerator — zero to published in under 10 minutes |
### ✍️ Create — make content
| Command | Purpose |
|---------|---------|
| `/linkedin:create` | **Front-door.** Tells you which creation command fits, then routes you |
| `/linkedin:post` | Full post creation with angle selection, format choice, and refinement |
| `/linkedin:quick` | Fast 5-minute post (3-line formula) + the 8 post-type templates |
| `/linkedin:react` | React to a URL (article, news, research) and turn it into a post |
| `/linkedin:carousel` | Structured multi-slide carousel with visual layout guidance |
| `/linkedin:video` | Video scripts with hook, body, CTA, captions, and thumbnail suggestions |
| `/linkedin:multiplatform` | Adapt content for Twitter/X, slides, YouTube (long-form → newsletter) |
| `/linkedin:batch` | Create a full week of content in one session |
| `/linkedin:pipeline` | End-to-end single-post workflow (idea → draft → schedule → analyze) |
| `/linkedin:trends` | Trend discovery pass — scan your sources, persist candidates + morning brief, triage per id |
| `/linkedin:newsletter` | **Long-form spine.** Newsletter editions, essays, series articles. The single long-form entry point |
| `/linkedin:headless-review` | Cold adversarial re-read of a FROZEN long-form draft before lock (ideally in a fresh session) |
| `/linkedin:pivot` | Re-open a long-form edition after a late change so cleared gates re-run |
### 📅 Engage — ship and work the first hour
| Command | Purpose |
|---------|---------|
| `/linkedin:calendar` | View/manage the queue + the publish action (mark a scheduled post as published) |
| `/linkedin:firsthour` | Post-publish first-hour sprint: timestamped targets + draft comments + timeline |
After publishing, the `post-feedback-monitor` agent tracks performance in the critical
first 48 hours, detects anomalies, and advises real-time interventions.
### 📊 Measure — understand performance
| Command | Purpose |
|---------|---------|
| `/linkedin:measure` | **Front-door.** Routes you to the right analytics command |
| `/linkedin:import` | Import LinkedIn CSV exports for analytics |
| `/linkedin:report` | Weekly/monthly performance report with trends and alerts |
| `/linkedin:analyze` | Troubleshoot performance (reach dropped, low engagement) |
| `/linkedin:audit` | Quarterly content strategy audit |
| `/linkedin:ab-test` | Design and manage A/B tests for content optimization |
### 🚀 Grow — authority, reach, and revenue
| Command | Purpose | Unlocks at |
|---------|---------|-----------|
| `/linkedin:strategy` | **Front-door.** Phase roadmap, trajectory, authority + signature content | Any phase |
| `/linkedin:profile` | profile/topic-relevance optimization checklist | Any phase |
| `/linkedin:competitive` | Competitive analysis of other creators in your niche | Any phase |
| `/linkedin:monetize` | Monetization strategy (lead magnets, consulting funnel, pricing) | ~1K followers |
| `/linkedin:outreach` | Collaborations and speaking opportunities (CFPs, partner pitches) | ~1K followers |
**Gating rule:** the "Unlocks at ~1K followers" commands are deliberately listed but
soft-gated — they work at any follower count, but their value compounds once a profile
has the audience scale and authority signal that makes lead magnets, partnerships, and
speaking pitches realistic. Below ~1K followers the router notes the threshold and
suggests `/linkedin:strategy` first. (`/linkedin:competitive` is **not** gated —
competitive analysis helps at any stage, especially early positioning.)
## Ask the User
Show the five journeys as a menu and let the user pick a journey or jump straight to a
command. Lead with the front-doors.
**What would you like to do?**
- **🟢 Start** — `onboarding` (full wizard) · `setup` · `first-post`
- **✍️ Create** — `create` (guided) · post · quick · react · carousel · video · multiplatform · batch · pipeline · newsletter · headless-review · pivot
- **📅 Engage** — `calendar` (queue + mark published) · `firsthour` (first-hour sprint)
- **📊 Measure** — `measure` (guided) · import · report · analyze · audit · ab-test
- **🚀 Grow** — `strategy` (roadmap) · profile · competitive · monetize ⚿ · outreach ⚿
If they name a command, route to it. If they name a journey but not a command, route to
that journey's front-door (`create` / `measure` / `onboarding` / `strategy`); for Engage,
ask whether they're scheduling (`calendar`) or have just published (`firsthour`). Use
`AskUserQuestion` for any sub-choice (≤4 options per question). Based on their answer,
guide them to the appropriate command or invoke it directly.
## If They Have Specific Content
If the user already has content they want to turn into a post:
- If they have a URL, article, or research, recommend `/linkedin:react`
- Ask if they want the full workflow (`/linkedin:post`) or quick version (`/linkedin:quick`)
- If they have a quick observation or reaction, recommend `/linkedin:quick`
## 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`
- Mentions "quick" or "fast" → Route to `/linkedin:quick`
- Mentions "pipeline" or "end to end" → Route to `/linkedin:pipeline`
- Mentions "trends" or "trending" or "discovery pass" or "morning brief" or "what should I write about" → Route to `/linkedin:trends`
- Mentions "batch" or "week of content" → Route to `/linkedin:batch`
- Mentions "calendar" or "schedule" or "queue" or "upcoming posts" or "what's scheduled" → Route to `/linkedin:calendar`
- Mentions "slot" or "publishing slots" or "empty slot" or "open slot" or "slot grid" or "what's in flight" or "work in progress" → Route to `/linkedin:calendar` (slot grid, vacancies, editions in flight)
- Mentions "publish" or "mark as published" or "posted today" or "just published" or "post is live" → Route to `/linkedin:calendar` (publish action)
- Mentions "plan" → Suggest `content-planner` agent
- Mentions "profile" or "topic-relevance" → Route to `/linkedin:profile`
- Mentions "not working" or "low reach" → Route to `/linkedin:analyze`
- Mentions "strategy" or "growth plan" or "authority" or "build authority" or "signature content" or "greatest hits" or "my best content" → 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:quick`
- Mentions "audit" or "review strategy" → Route to `/linkedin:audit`
- Mentions "competitive" or "learn from others" → Route to `/linkedin:competitive`
- Mentions "monetize" or "revenue" → Route to `/linkedin:monetize`. **Gating:** if state-file `follower_count` < 1000, prepend: "Heads-up: monetization compounds at ~1K followers. You're at {N}. Consider `/linkedin:strategy` to plan the path there. Continuing to `/linkedin:monetize` anyway."
- Mentions "speaking" or "conference" or "collaborate" or "partner" or "CFP" or "talk proposal" or "co-author" or "joint post" → Route to `/linkedin:outreach`. **Gating:** if state-file `follower_count` < 1000, prepend: "Heads-up: outreach lands better at ~1K followers (authority signal). You're at {N}. Consider `/linkedin:strategy` first. Continuing to `/linkedin:outreach` anyway."
- Mentions "adapt" or "cross-post" → Route to `/linkedin:multiplatform`
- Mentions "import" or "CSV" or "export data" → Route to `/linkedin:import`
- Mentions "report" or "weekly numbers" → Route to `/linkedin:report`
- Mentions "engagement tips" or "5x5x5" or "first hour strategy" or "comment strategy" or "who to comment on" or "CEA method" or "whale posts" → Suggest `engagement-coach` agent
- Mentions "optimize post" or "improve draft" or "make this better" → Suggest `content-optimizer` agent
- Mentions "trending" or "what should I post about" → Suggest `trend-spotter` agent
- Mentions "my voice" or "voice profile" or "voice audit" → Suggest `voice-trainer` agent
- Mentions "is this original" or "differentiation" or "commodity content" → Suggest `differentiation-checker` agent
- Mentions "network" or "who to connect with" → Suggest `network-builder` agent
- Mentions "performance" or "weekly report" or "how did I do" or "analyze my analytics" or "interpret data" → Suggest `analytics-interpreter` agent
- Mentions "how is my post doing" or "monitor post" or "post performance" or "first hour" or "post-publish" or "boost post" or "post feedback" → Suggest `post-feedback-monitor` agent
- Mentions "A/B test" or "split test" or "test my hooks" or "compare formats" or "experiment" or "what works better" or "test variations" → Route to `/linkedin:ab-test`
- Mentions "personalization score" or "how personalized" or "asset completeness" → Route to `/linkedin:setup` (score computed by `hooks/scripts/personalization-score.mjs`)
- Mentions "milestone" or "10K goal" or "follower target" or "growth tracking" or "am I on track" or "follower progress" → Route to `/linkedin:strategy`
- Mentions "status" or "on track" → Route to `/linkedin:calendar` (plan-vs-queue diff)
- Mentions "repurpose" or "reuse" → Suggest `content-repurposer` agent
- Mentions "video" or "video script" or "film" or "record" or "talking head" or "screen recording" or "slideshow video" → Route to `/linkedin:video`
- Mentions "create" or "make something" or "what should I make" or "new content" (no specific format named) → Route to `/linkedin:create` (the Create front-door)
- Mentions "measure" or "how am I doing" or "my performance" or "performance overview" or "how are my posts doing" → Route to `/linkedin:measure` (the Measure front-door)
- Mentions "first hour" or "I just posted" or "reply loop" or "work my post" or "engage now" → Route to `/linkedin:firsthour` (the worked first-hour sprint plan — distinct from `/linkedin:calendar`'s mark-as-published action)
- Has a URL to react to → Route to `/linkedin:react`
- Has substantial content to convert → Route to `/linkedin:post`
## Reference
For full skill documentation, see:
- `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` - Complete skill with personalization settings