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:
parent
34463e4585
commit
52fa87a255
59 changed files with 148 additions and 122 deletions
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"name": "linkedin-thought-leadership",
|
||||
"version": "2.4.0",
|
||||
"description": "Full-spectrum LinkedIn content engine — feed posts, carousels, video scripts, and long-form newsletter editions — with the January 2026 360Brew algorithm baked in. v2.4 adds Step 5.5 (editorial review) to /linkedin:newsletter: a new editorial-reviewer agent (Opus) judges craft — prose-craft + narrative-architecture — between fact-check (Step 5) and the persona sweep (Step 6), operator-gated via SendUserFile, mirroring the Maskinrommet writing-contract §C2 (pipeline 14→15 phases, agents 15→16). v2.3 added Step 7.5 (visual assets): cover + inline figures or carousel deck, generated and operator-gated BEFORE lock. v2.2 hardened the longform gates: blocking persona hard-fails, post-cutoff fact-check mandate, a Norwegian-chronicle de-AI voice-scrubber, render+annotate operator gates, and STATE.md-reconciled edition state.",
|
||||
"name": "linkedin-studio",
|
||||
"version": "3.0.0",
|
||||
"description": "LinkedIn Studio — full-spectrum LinkedIn content engine: feed posts, carousels, video scripts, and long-form newsletter editions, with the January 2026 360Brew algorithm baked in. v3.0.0 renames the plugin (was `linkedin-thought-leadership`): the slug, agent namespace, and runtime state-file path are now `linkedin-studio` — the `/linkedin:*` commands are unchanged. Breaking: reinstall required and the state file moves to `~/.claude/linkedin-studio.local.md`.",
|
||||
"author": {
|
||||
"name": "Kjell Tore Guttormsen"
|
||||
},
|
||||
"license": "MIT",
|
||||
"repository": "https://git.fromaitochitta.com/open/ktg-plugin-marketplace",
|
||||
"keywords": ["linkedin", "content-creation", "thought-leadership", "analytics", "360brew"]
|
||||
"keywords": ["linkedin", "content-creation", "newsletter", "analytics", "360brew"]
|
||||
}
|
||||
|
|
|
|||
16
CHANGELOG.md
16
CHANGELOG.md
|
|
@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
|
|||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [3.0.0] - 2026-05-29
|
||||
|
||||
### Summary
|
||||
**Plugin renamed `linkedin-thought-leadership` → `linkedin-studio`** ("LinkedIn Thought Leadership" → **LinkedIn Studio**). The old display title read as pompous; the new name is plain and matches how the plugin already describes itself ("LinkedIn content engine"). This is a **breaking change** — the marketplace slug, the agent namespace (`linkedin-studio:<agent>`), and the runtime state-file path all change — so it bumps to a major version. Functionality is byte-for-byte identical to v2.4.0; this release is pure identity.
|
||||
|
||||
### Changed (breaking)
|
||||
- **Slug / directory / manifests:** `plugins/linkedin-thought-leadership/` → `plugins/linkedin-studio/`; `plugin.json` and root `marketplace.json` `name`/`source` updated. **Reinstall required.**
|
||||
- **Agent namespace:** commands invoke plugin agents as `linkedin-studio:<name>` (was `linkedin-thought-leadership:<name>`). Functional change in `commands/newsletter.md`; docs updated to match.
|
||||
- **Runtime state path:** `~/.claude/linkedin-thought-leadership.local.md` → `~/.claude/linkedin-studio.local.md`. Hardcoded in `hooks/scripts/{state-updater,session-start,posting-reminder,user-prompt-context}.mjs`, `hooks/prompts/topic-rotation-gate.md`, and `config/state-file.template.md`. **Existing state migrated in place** (post metrics, streak, content history preserved).
|
||||
- **Catch-all skill** `skills/linkedin-thought-leadership/` → `skills/linkedin-studio/` (frontmatter `name: linkedin-studio`); the five functional skills (`linkedin-analytics`, `-content-creation`, `-networking`, `-strategy`, `-voice`) are unchanged.
|
||||
|
||||
### Not changed (explicit non-deltas)
|
||||
- **Command namespace `/linkedin:*`** — set per-command in frontmatter (`name: linkedin:post`), already independent of the plugin slug. Every command (`/linkedin:post`, `/linkedin:newsletter`, …) is invoked exactly as before. 24 commands, 16 agents — counts unchanged.
|
||||
- **All hooks, scripts, renderers, agent contracts, content** — bit-for-bit identical to v2.4.0.
|
||||
- **History preserved:** `config-audit` v5.0.0 test snapshots and the `docs/` build artifacts retain the old slug as point-in-time records and were intentionally not rewritten.
|
||||
|
||||
## [2.4.0] - 2026-05-29
|
||||
|
||||
### Summary
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
# LinkedIn Thought Leadership Plugin (v2.4.0)
|
||||
# LinkedIn Studio Plugin (v2.4.0)
|
||||
|
||||
Full-spectrum LinkedIn content engine — short-form feed posts, carousels, video scripts, and long-form newsletter editions — with the January 2026 360Brew algorithm baked in. v2.0.0 consolidated the surface (27 commands → 24, 16 agents → 14) while adding the long-form `/linkedin:newsletter` orchestrator + two longform-quality gate agents (`fact-checker`, `persona-reviewer`). v2.1.0 added two gates BEFORE prose (Step 2.5 skeleton + Step 3a spine prose) + a third `persona-reviewer` mode (`skjelett`). v2.2.0 hardened the longform gates with the lessons from the second production run (Seres-serien): blocking persona hard-fails, a post-cutoff fact-check mandate, a `voice-scrubber` agent, render+annotate operator gates, and STATE.md-reconciled edition state. v2.3.0 made **visual assets an explicit pipeline phase** — Step 7.5 (visual-assets) between annotation (Step 7) and lock (Step 8): cover (+ optional inline figures) or a carousel deck, generated (default `mcp-image`, external `cover-raw.png` accepted) and operator-gated BEFORE lock so `render/build-linkedin.mjs` picks up `cover.png` at lock without a post-lock re-render. **v2.4.0** makes an **editor's craft gate an explicit pipeline phase** — new **Step 5.5 (editorial-review)** between fact-check (Step 5) and the persona sweep (Step 6): a new **`editorial-reviewer` agent** (Opus) judges **craft** (prosa-håndverk + narrativ-arkitektur), not reader-response, returning ≤10 flags (BLOCK/REWORK/NICE) as direction, **operator-gated via `SendUserFile` BEFORE the persona sweep** so the personas measure resonance instead of stumbling on craft noise. Motivated by Del 4: every persona reported PASS, yet the editor found 8 fresh points on first reading, ~6/8 of them craft/architecture blind spots no agent measured. Mirrors the Maskinrommet writing-contract §C2. Pipeline 14 → 15 phases; agents 15 → 16; additive `editorialReview` state. Doc/orchestration-only for the wiring (the new agent + its fasit fixture + lint test are the only new files); commands unchanged (24).
|
||||
|
||||
## Architecture
|
||||
|
||||
- **State file:** `~/.claude/linkedin-thought-leadership.local.md` (YAML frontmatter, auto-initialized from `config/state-file.template.md`)
|
||||
- **State file:** `~/.claude/linkedin-studio.local.md` (YAML frontmatter, auto-initialized from `config/state-file.template.md`)
|
||||
- **State updater:** `hooks/scripts/state-updater.mjs` — deterministic state mutations (post tracking, streak, content history pruning). Pure functions, tested, no AI involvement
|
||||
- **Clipboard helper:** `hooks/scripts/clipboard-helper.mjs` — cross-platform clipboard integration (macOS `pbcopy`, Linux `xclip`/`xsel`, WSL `clip.exe`). All content commands auto-copy to clipboard
|
||||
- **iCal generator:** `hooks/scripts/ical-generator.mjs` — RFC 5545 calendar file generation for batch scheduling. Standalone CLI + importable module
|
||||
|
|
@ -87,7 +87,7 @@ All content commands (post, quick, react, pipeline, first-post, video, multiplat
|
|||
**Rule:** Always read `assets/voice-samples/` before generating content.
|
||||
|
||||
**Invocation form:** Commands invoke plugin agents by their **namespaced** type —
|
||||
`subagent_type: linkedin-thought-leadership:<name>` — never the bare `<name>` (a bare
|
||||
`subagent_type: linkedin-studio:<name>` — never the bare `<name>` (a bare
|
||||
type does not resolve and the `Task` call fails).
|
||||
|
||||
**Reload requirement:** Adding a NEW agent file under `agents/` registers it only after
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Contributing to linkedin-thought-leadership
|
||||
# Contributing to linkedin-studio
|
||||
|
||||
This is a solo project. Bug reports and feature requests are welcome, but pull requests are not accepted.
|
||||
|
||||
|
|
@ -29,7 +29,7 @@ Changes to this plugin must preserve:
|
|||
## Testing locally
|
||||
|
||||
```bash
|
||||
claude plugin add /path/to/linkedin-thought-leadership
|
||||
claude plugin add /path/to/linkedin-studio
|
||||
|
||||
# In a Claude Code session:
|
||||
/linkedin # Check status and command menu
|
||||
|
|
|
|||
22
README.md
22
README.md
|
|
@ -1,4 +1,4 @@
|
|||
# LinkedIn Thought Leadership Plugin for Claude Code
|
||||
# LinkedIn Studio Plugin for Claude Code
|
||||
|
||||
> Build authentic LinkedIn authority through algorithmic understanding, strategic consistency, and AI-assisted content creation.
|
||||
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
*AI-generated: all code produced by Claude Code through dialog-driven development. [Full disclosure →](../../README.md#ai-generated-code-disclosure)*
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
|
@ -20,6 +20,7 @@ A comprehensive Claude Code plugin that turns LinkedIn from a chore into a full-
|
|||
|
||||
## Table of Contents
|
||||
|
||||
- [What's New in v3.0.0](#whats-new-in-v300)
|
||||
- [What's New in v2.4.0](#whats-new-in-v240)
|
||||
- [What's New in v2.3.0](#whats-new-in-v230)
|
||||
- [What's New in v2.2.0](#whats-new-in-v220)
|
||||
|
|
@ -43,6 +44,14 @@ A comprehensive Claude Code plugin that turns LinkedIn from a chore into a full-
|
|||
|
||||
---
|
||||
|
||||
## What's New in v3.0.0
|
||||
|
||||
**The plugin is renamed `linkedin-thought-leadership` → `linkedin-studio` ("LinkedIn Thought Leadership" → LinkedIn Studio).** The old display title read as pompous; the new name is plain and matches how the plugin already describes itself — a *LinkedIn content engine*. This is a **breaking** release because the identity changes at three levels, but **no functionality changes** — v3.0.0 is byte-for-byte v2.4.0 under a new name.
|
||||
|
||||
- **What changed:** the marketplace **slug** (`linkedin-studio`), the **agent namespace** (`linkedin-studio:<agent>`, used by `/linkedin:newsletter`), and the **runtime state-file path** (`~/.claude/linkedin-studio.local.md`, migrated in place — your post metrics, streak, and content history are preserved).
|
||||
- **What did *not* change:** the **commands**. `/linkedin:post`, `/linkedin:newsletter`, `/linkedin:quick`, and every other command are invoked exactly as before — the `/linkedin:` namespace is set per-command in frontmatter and was always independent of the plugin slug. 24 commands, 16 agents, 9 hooks — all unchanged.
|
||||
- **Action required:** **reinstall the plugin** so Claude Code registers the new slug and agent namespace, then reload the session. Until reload, the renamed agents won't resolve.
|
||||
|
||||
## What's New in v2.4.0
|
||||
|
||||
**An editor's craft gate becomes an explicit pipeline phase.** The Del 4 production run exposed a gap the existing gates could not see: the persona resonance sweep returned 15 flags across three personas and *every persona reported PASS / ready-to-publish* — yet the editor (KTG) found **eight fresh editorial points on first reading**, and only ~25 % overlapped anything the personas had touched. The other six were **craft and narrative-architecture blind spots** no agent measured. `persona-reviewer` measures *reader response* (does it land?); nothing measured *prose craft* or *narrative architecture* (is it well-made?). v2.4.0 adds the missing role.
|
||||
|
|
@ -165,7 +174,7 @@ Or enable directly in `~/.claude/settings.json`:
|
|||
```json
|
||||
{
|
||||
"enabledPlugins": {
|
||||
"linkedin-thought-leadership@ktg-plugin-marketplace": true
|
||||
"linkedin-studio@ktg-plugin-marketplace": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
|
@ -288,7 +297,7 @@ Parallel support agents: `strategy-advisor`, `analytics-interpreter`, `network-b
|
|||
Longform quality gates (newsletter): **`persona-reviewer` (skjelett) run BEFORE prose** (v2.1, Step 2.5) → `voice-scrubber` de-AI / chronicle-voice scrub (v2.2, Step 4) → `fact-checker` (Step 5) → **`editorial-reviewer` craft gate run BEFORE the persona sweep** (v2.4, Step 5.5) → `persona-reviewer` (resonance) run BEFORE lock (Step 6) → `persona-reviewer` (conversion) run AFTER lock on the hook (Step 9).
|
||||
|
||||
> **Note (agent invocation + reload):** Commands invoke agents by their **namespaced**
|
||||
> type — `subagent_type: linkedin-thought-leadership:<name>`, never the bare name. And a
|
||||
> type — `subagent_type: linkedin-studio:<name>`, never the bare name. And a
|
||||
> **newly added** agent file under `agents/` only becomes invokable after a Claude Code
|
||||
> **session reload** (the plugin agent set is built at session start). Add the agent, then
|
||||
> reload before invoking it.
|
||||
|
|
@ -355,7 +364,7 @@ Six domain-specific skills organize the plugin's knowledge and route commands to
|
|||
|
||||
| Skill | Domain | Commands Routed |
|
||||
|-------|--------|-----------------|
|
||||
| `linkedin-thought-leadership` | Router + shared knowledge (algorithm, quality rules) | `/linkedin`, `/linkedin:setup` |
|
||||
| `linkedin-studio` | Router + shared knowledge (algorithm, quality rules) | `/linkedin`, `/linkedin:setup` |
|
||||
| `linkedin-content-creation` | Posts, batch, pipeline, video, calendar, newsletter | `/linkedin:post`, `:quick`, `:pipeline`, `:batch`, `:calendar`, `:video`, `:multiplatform`, `:newsletter`, `:carousel` |
|
||||
| `linkedin-analytics` | Analysis, reporting, import, A/B testing | `/linkedin:analyze`, `:audit`, `:import`, `:report`, `:ab-test` |
|
||||
| `linkedin-strategy` | Growth, authority (absorbed), competitive, monetization | `/linkedin:strategy`, `:competitive`, `:monetize` |
|
||||
|
|
@ -548,7 +557,7 @@ Edit with your name, expertise areas, target audience, voice preferences, and Li
|
|||
|
||||
### State File
|
||||
|
||||
The plugin tracks posting metrics in `~/.claude/linkedin-thought-leadership.local.md`:
|
||||
The plugin tracks posting metrics in `~/.claude/linkedin-studio.local.md`:
|
||||
|
||||
```yaml
|
||||
---
|
||||
|
|
@ -595,6 +604,7 @@ Scheduled posts are tracked in `assets/drafts/queue.json`:
|
|||
|
||||
| Version | Date | Highlights |
|
||||
|---------|------|-----------|
|
||||
| **3.0.0** | 2026-05-29 | **Renamed** `linkedin-thought-leadership` → `linkedin-studio` ("LinkedIn Thought Leadership" → **LinkedIn Studio**). Breaking (slug + agent namespace `linkedin-studio:<agent>` + runtime state path `~/.claude/linkedin-studio.local.md` all change; reinstall required, state migrated in place), but **functionality byte-identical to v2.4.0**. The `/linkedin:*` commands are unchanged (frontmatter-namespaced, slug-independent). Catch-all skill dir renamed to match (`skills/linkedin-studio/`); the five functional skills unchanged. |
|
||||
| **2.4.0** | 2026-05-29 | Editor's craft gate as an explicit pipeline phase. New **`editorial-reviewer` agent** (Opus) + **Step 5.5 — Editorial review** in `/linkedin:newsletter` (between fact-check and the persona sweep): two axes — **prosa-håndverk** (em-dash density, verbatim repetition, postulated numbers, contradictions, versal-tic) + **narrativ-arkitektur** (concrete instantiation, theory-anchored hypotheses, series-title symmetry, equal action per addressee, un-overloaded conclusion); ≤10 flags BLOCK/REWORK/NICE as direction; operator-gated via `SendUserFile`; mirrors Maskinrommet §C2. Motivated by Del 4 (every persona PASS, yet 8 fresh editor points, ~6/8 craft/architecture blind spots). `editorial-review` phase + additive `editorialReview` state. Pipeline 14 → 15 phases; 15 → 16 agents. New agent + fasit fixture + lint test the only new files; commands (24) unchanged. |
|
||||
| **2.3.0** | 2026-05-28 | Visual assets as an explicit pipeline phase. New **Step 7.5 — Visual assets** in `/linkedin:newsletter` (between annotation and lock): cover (+ optional inline figures) or carousel deck, generated (default `mcp-image`; external `cover-raw.png` accepted) and operator-gated via `SendUserFile` BEFORE lock so `build-linkedin.mjs` picks up `cover.png` without a post-lock re-render. Explicit `format: "carousel"` branch reusing `build-carousel.mjs`. New `config/image-credit-caption.template.md`; additive `visualAssets` state + naming convention (`cover.png` / `cover-v<N>-kandidat.png` / `cover-raw.png` / `fig<N>.png`). Pipeline 13 → 14 phases. Doc/orchestration-only (no new code); commands (24) + agents (15) unchanged. |
|
||||
| **2.2.0** | 2026-05-28 | Longform gates hardened (2nd production run). Persona gate blocking with explicit hard-fail list (primær mistet meg / doesn't own action / sjargong-mur / modell-navne-katalog → BLOCK; «JA med forbehold» = NEI). Fact-check post-cutoff web-search mandate + high-frequency-error checklist. New `voice-scrubber` agent (Opus): de-AI scrub + Norwegian-chronicle voice-drift, gold standard = approved Norwegian editions (NOT the English post corpus). Render+annotate operator gates (Steps 2.5/3a). Edition state reconciled with STATE.md (ONE-system); `edition-HANDOVER.template.md` deleted. 14 → 15 agents; commands unchanged (24). |
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ Always load these for pattern comparison:
|
|||
## Manual Data Sources (fallback)
|
||||
|
||||
When structured analytics aren't available:
|
||||
- `~/.claude/linkedin-thought-leadership.local.md` — Posting history, streaks, weekly stats
|
||||
- `~/.claude/linkedin-studio.local.md` — Posting history, streaks, weekly stats
|
||||
- `${CLAUDE_PLUGIN_ROOT}/assets/plans/` — Planned vs. actual content
|
||||
- `${CLAUDE_PLUGIN_ROOT}/assets/drafts/` — Draft history
|
||||
- See `${CLAUDE_PLUGIN_ROOT}/assets/analytics/README.md` for data format and directory structure.
|
||||
|
|
|
|||
|
|
@ -28,13 +28,13 @@ You are a LinkedIn content planning specialist. You create strategic content pla
|
|||
Read these files before planning:
|
||||
|
||||
```
|
||||
${CLAUDE_PLUGIN_ROOT}/skills/linkedin-thought-leadership/SKILL.md → expertise areas, voice
|
||||
${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md → expertise areas, voice
|
||||
${CLAUDE_PLUGIN_ROOT}/references/thought-leadership-angles.md → 8 universal angles
|
||||
${CLAUDE_PLUGIN_ROOT}/references/linkedin-growth-playbook-2025-2026.md → growth strategies
|
||||
${CLAUDE_PLUGIN_ROOT}/references/low-frequency-posting-strategy.md → sustainable posting
|
||||
${CLAUDE_PLUGIN_ROOT}/references/linkedin-formats.md → format options
|
||||
${CLAUDE_PLUGIN_ROOT}/assets/templates/weekly-content-calendar-2-3x.md → calendar template
|
||||
~/.claude/linkedin-thought-leadership.local.md → user state + recent posts
|
||||
~/.claude/linkedin-studio.local.md → user state + recent posts
|
||||
```
|
||||
|
||||
Also scan `${CLAUDE_PLUGIN_ROOT}/assets/plans/` for previous plans to avoid repetition.
|
||||
|
|
@ -469,7 +469,7 @@ Create the `plans/` directory if it doesn't exist.
|
|||
|
||||
### Update State File
|
||||
|
||||
After plan approval, update `~/.claude/linkedin-thought-leadership.local.md`:
|
||||
After plan approval, update `~/.claude/linkedin-studio.local.md`:
|
||||
- Set `next_planned_topic` to the first upcoming topic
|
||||
- Add planned topics to the recent topics list for dedup
|
||||
- Update `last_plan_date`
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ ${CLAUDE_PLUGIN_ROOT}/references/newsletter-strategy-guide.md → newslette
|
|||
${CLAUDE_PLUGIN_ROOT}/references/thought-leadership-angles.md → 8 universal angles
|
||||
${CLAUDE_PLUGIN_ROOT}/assets/case-studies/case-study-template.md → case study structure + 4 LinkedIn post angles
|
||||
${CLAUDE_PLUGIN_ROOT}/assets/examples/high-engagement-posts.md → proven patterns to replicate
|
||||
~/.claude/linkedin-thought-leadership.local.md → user state + performance data
|
||||
~/.claude/linkedin-studio.local.md → user state + performance data
|
||||
```
|
||||
|
||||
## Step 1: Source Content Analysis
|
||||
|
|
|
|||
|
|
@ -34,8 +34,8 @@ ${CLAUDE_PLUGIN_ROOT}/references/collaborations-guide.md → coll
|
|||
${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md → engagement methods
|
||||
${CLAUDE_PLUGIN_ROOT}/references/linkedin-growth-playbook-2025-2026.md → growth strategies
|
||||
${CLAUDE_PLUGIN_ROOT}/references/opportunity-generation.md → conversion + DM strategy
|
||||
${CLAUDE_PLUGIN_ROOT}/skills/linkedin-thought-leadership/SKILL.md → user expertise + voice
|
||||
~/.claude/linkedin-thought-leadership.local.md → user state + network data
|
||||
${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md → user expertise + voice
|
||||
~/.claude/linkedin-studio.local.md → user state + network data
|
||||
```
|
||||
|
||||
Also check `${CLAUDE_PLUGIN_ROOT}/assets/network/` for existing tracker files.
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ Before analyzing anything, load these files:
|
|||
|
||||
1. **Algorithm knowledge:** Read `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md`
|
||||
2. **Engagement frameworks:** Read `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md`
|
||||
3. **State file:** Read `~/.claude/linkedin-thought-leadership.local.md` (if exists)
|
||||
3. **State file:** Read `~/.claude/linkedin-studio.local.md` (if exists)
|
||||
4. **Latest analytics:** Use Glob to find the most recent file in `${CLAUDE_PLUGIN_ROOT}/assets/analytics/posts/` and read it
|
||||
|
||||
This gives you the user's baseline performance and algorithm context for accurate benchmarking.
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ ${CLAUDE_PLUGIN_ROOT}/assets/audience-insights/demographics.md → audience
|
|||
${CLAUDE_PLUGIN_ROOT}/assets/audience-insights/engagement-patterns.md → timing, topic, and format patterns
|
||||
${CLAUDE_PLUGIN_ROOT}/assets/examples/high-engagement-posts.md → proven patterns from top posts
|
||||
${CLAUDE_PLUGIN_ROOT}/references/trajectory-strategy-adjustments.md → trajectory-to-action mappings
|
||||
~/.claude/linkedin-thought-leadership.local.md → user state + posting history
|
||||
~/.claude/linkedin-studio.local.md → user state + posting history
|
||||
```
|
||||
|
||||
Use demographics data to compare the user's **intended** audience vs **actual** engagers when making strategic recommendations.
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ ${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md → Hook
|
|||
${CLAUDE_PLUGIN_ROOT}/references/thought-leadership-angles.md → 8 universal angles
|
||||
${CLAUDE_PLUGIN_ROOT}/assets/voice-samples/ → User's authentic voice (ALWAYS read before scripting)
|
||||
${CLAUDE_PLUGIN_ROOT}/assets/examples/high-engagement-posts.md → Successful content patterns
|
||||
~/.claude/linkedin-thought-leadership.local.md → User state, recent topics, streak
|
||||
~/.claude/linkedin-studio.local.md → User state, recent topics, streak
|
||||
```
|
||||
|
||||
## Step 1: Video Type Selection
|
||||
|
|
@ -218,7 +218,7 @@ Examples:
|
|||
video-2026-01-30-copilot-demo-screen-recording-60s.md
|
||||
```
|
||||
|
||||
Update state in `~/.claude/linkedin-thought-leadership.local.md`:
|
||||
Update state in `~/.claude/linkedin-studio.local.md`:
|
||||
- Update `last_post_date`, `posts_this_week`, streak (same as text posts)
|
||||
- Add to "Recent Posts" section with format note: `[VIDEO/talking-head/90s]`
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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?» —
|
||||
|
|
|
|||
|
|
@ -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]%)."
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# LinkedIn Thought Leadership — Session State
|
||||
# LinkedIn Studio — Session State
|
||||
|
||||
**Last updated:** [Auto-filled by session-start hook]
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
# LinkedIn Thought Leadership State
|
||||
# Auto-managed by the linkedin-thought-leadership plugin
|
||||
# Copy to ~/.claude/linkedin-thought-leadership.local.md
|
||||
# LinkedIn Studio State
|
||||
# Auto-managed by the linkedin-studio plugin
|
||||
# Copy to ~/.claude/linkedin-studio.local.md
|
||||
|
||||
# Posting metrics
|
||||
last_post_date: null
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Brief — LTL som fullspektrum LinkedIn-innholdsmotor (idé → publisering)
|
||||
|
||||
> **Til:** linkedin-thought-leadership-pluginens utviklingsrepo.
|
||||
> **Til:** linkedin-studio-pluginens utviklingsrepo.
|
||||
> **Skrevet:** 2026-05-26, etter produksjon av den første kronikkserien (Seres-serien, 6 deler).
|
||||
> **Type:** retningsbrief — beslutningsgrunnlag før planlegging/bygging. Selvstendig (kan leses uten annen kontekst).
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
# Integration Test Guide: LinkedIn Thought Leadership Plugin
|
||||
# Integration Test Guide: LinkedIn Studio Plugin
|
||||
|
||||
Manual integration testing scenarios for commands, agents, and hooks in the plugin.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before testing, ensure:
|
||||
- [ ] `~/.claude/linkedin-thought-leadership.local.md` exists (create from `config/state-file.template.md`)
|
||||
- [ ] `~/.claude/linkedin-studio.local.md` exists (create from `config/state-file.template.md`)
|
||||
- [ ] Voice samples exist in `assets/voice-samples/authentic-voice-samples.md`
|
||||
- [ ] Quality scorecard exists at `assets/checklists/quality-scorecard.md`
|
||||
- [ ] Plugin is installed: appears in Claude Code's skill/command list
|
||||
|
|
@ -62,7 +62,7 @@ Before testing, ensure:
|
|||
**Goal:** Graceful handling when state file doesn't exist.
|
||||
|
||||
**Steps:**
|
||||
1. Temporarily rename `~/.claude/linkedin-thought-leadership.local.md`
|
||||
1. Temporarily rename `~/.claude/linkedin-studio.local.md`
|
||||
2. Run `/linkedin:pipeline`
|
||||
3. Verify: no crash, reasonable fallback (e.g., "No posting data found. Starting fresh.")
|
||||
4. Complete the pipeline
|
||||
|
|
@ -220,7 +220,7 @@ Before testing, ensure:
|
|||
1. Run `/linkedin:pipeline` and create a post
|
||||
2. Note the topic and hook
|
||||
3. End the session (or let Stop hook fire)
|
||||
4. Read `~/.claude/linkedin-thought-leadership.local.md`
|
||||
4. Read `~/.claude/linkedin-studio.local.md`
|
||||
5. Verify:
|
||||
- `last_post_date` = today
|
||||
- `last_post_topic` = the topic used
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Plan — LTL som fullspektrum LinkedIn-innholdsmotor
|
||||
|
||||
> **Type:** Renoverings- og byggeplan for `linkedin-thought-leadership`-pluginen («LTL»).
|
||||
> **Type:** Renoverings- og byggeplan for `linkedin-studio`-pluginen («LTL»).
|
||||
> **Skrevet:** 2026-05-26. **Status:** Til godkjenning før bygging. **Versjonsmål:** v1.2.0 → v2.0.0.
|
||||
> **Følger av:** [brief-fullspektrum-innholdsmotor.md](./brief-fullspektrum-innholdsmotor.md) (samme mappe).
|
||||
>
|
||||
|
|
@ -16,7 +16,7 @@ Denne seksjonen gjør planen selvstendig. Hvis et begrep brukes senere uten fork
|
|||
|
||||
| Det | Hva | Absolutt sti | Rolle her |
|
||||
|-----|-----|--------------|-----------|
|
||||
| **LTL-pluginen** | Claude Code-plugin for LinkedIn thought leadership. v1.2.0. 27 kommandoer, 16 agenter, 9 hooks, 6 skills. | `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/` | **DETTE er repoet vi bygger i.** All plugin-endring skjer her. |
|
||||
| **LTL-pluginen** | Claude Code-plugin for LinkedIn thought leadership. v1.2.0. 27 kommandoer, 16 agenter, 9 hooks, 6 skills. | `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-studio/` | **DETTE er repoet vi bygger i.** All plugin-endring skjer her. |
|
||||
| **Marketplace-rot** | Open-source plugin-marketplace (flere plugins + `shared/`). Distribueres via Forgejo: `git.fromaitochitta.com/open/ktg-plugin-marketplace` (aldri GitHub). | `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/` | Rot-`README.md` må oppdateres ved feature-endring (doc-plikt). |
|
||||
| **maskinrommet** | Privat, lokalt repo (INGEN git-remote) der operatøren produserer alt LinkedIn-innhold. Inneholder `tools/` (4 render-skript + `fonts/`) og `serier/<slug>/` (én innholdsserie per mappe). | `/Users/ktg/repos/maskinrommet/` | **Annet repo enn pluginen.** Skriving hit krever eksplisitt instruks (cross-repo). Vi leser render-skriptene herfra i S1. |
|
||||
| **Voyage-pluginen** | En annen plugin i samme marketplace. Implementerer en kontrakt-drevet, multi-sesjons pipeline for KODE-prosjekter: kommandoene `/trekbrief` → `/trekresearch` → `/trekplan` → `/trekexecute` → `/trekreview`, med parallelle spesialist-agenter og adversarielle reviewere. | `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/voyage/` | **Referanse/inspirasjon, IKKE avhengighet.** Vi løfter *mønsteret* (faset pipeline, parallelle agenter, adversariell review før lås, multi-sesjon), men kopierer ALDRI koden — Voyage er kode-spesifikk (`file:line`, kode-reviewere, RULE_CATALOGUE). Les den for mønster-inspirasjon. |
|
||||
|
|
@ -441,7 +441,7 @@ Enhver feature-endring oppdaterer i SAMME commit: plugin-`README.md`, plugin-`CL
|
|||
|
||||
## 12. Filmanifest
|
||||
|
||||
Alle stier relativt til pluginen `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/` med mindre annet er angitt.
|
||||
Alle stier relativt til pluginen `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-studio/` med mindre annet er angitt.
|
||||
|
||||
**Nye filer:**
|
||||
- `commands/newsletter.md` — orkestrator-kommandoen (§5)
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
## 1. Oppgave
|
||||
|
||||
Løft `linkedin-thought-leadership`-pluginen («LTL», v1.2.0) til **v2.0.0**: en fullspektrum-motor for ALT LinkedIn-innhold — fra kortform-post til nyhetsbrev-edition — samtidig som den totale kommando-/agent-overflaten **reduseres** gjennom konsolidering.
|
||||
Løft `linkedin-studio`-pluginen («LTL», v1.2.0) til **v2.0.0**: en fullspektrum-motor for ALT LinkedIn-innhold — fra kortform-post til nyhetsbrev-edition — samtidig som den totale kommando-/agent-overflaten **reduseres** gjennom konsolidering.
|
||||
|
||||
Tre arbeidskropper:
|
||||
1. **Renovering** — konsolider reell redundans (27→~23 kommandoer, 16→~14 agenter). Plan §4.
|
||||
|
|
@ -17,7 +17,7 @@ Tre arbeidskropper:
|
|||
|
||||
## 2. Orientering (kritisk — repoer og stier)
|
||||
|
||||
- **LTL-pluginen (bygg her):** `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/`. Plugin-i-monorepo: steg-stier er relative til denne mappa (sett Execution Strategy `cwd:` deretter).
|
||||
- **LTL-pluginen (bygg her):** `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-studio/`. Plugin-i-monorepo: steg-stier er relative til denne mappa (sett Execution Strategy `cwd:` deretter).
|
||||
- **Marketplace-rot:** `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/` (Forgejo, aldri GitHub).
|
||||
- **maskinrommet (annet repo):** `/Users/ktg/repos/maskinrommet/` — render-skriptene kopieres HERFRA inn i pluginen. Skriving TIL maskinrommet krever eksplisitt instruks (cross-repo, eget spor).
|
||||
- **Voyage:** `/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/voyage/` — harness for denne byggingen.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
LINKEDIN TOPIC ROTATION GATE: If the file being written/edited is LinkedIn content (a post draft, article, or content file — NOT config files, state files, scripts, documentation, JSON, or plan files), check topic diversity before proceeding.
|
||||
|
||||
**Step 1: Read State**
|
||||
Read `~/.claude/linkedin-thought-leadership.local.md` and extract:
|
||||
Read `~/.claude/linkedin-studio.local.md` and extract:
|
||||
- `last_post_topic` — the pillar of the most recent post
|
||||
- `expertise_areas` — the user's 5 content pillars
|
||||
- `## Recent Posts` section — post history with topic_area tags
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ describe('generateIcal', () => {
|
|||
const ical = generateIcal([]);
|
||||
assert.match(ical, /^BEGIN:VCALENDAR\r\n/);
|
||||
assert.match(ical, /\r\nEND:VCALENDAR\r\n$/);
|
||||
assert.match(ical, /PRODID:-\/\/linkedin-thought-leadership\/\/EN/);
|
||||
assert.match(ical, /PRODID:-\/\/linkedin-studio\/\/EN/);
|
||||
assert.match(ical, /VERSION:2\.0/);
|
||||
assert.ok(!ical.includes('BEGIN:VEVENT'), 'should not contain VEVENT');
|
||||
});
|
||||
|
|
@ -39,7 +39,7 @@ describe('generateIcal', () => {
|
|||
assert.match(ical, /BEGIN:VEVENT/);
|
||||
assert.match(ical, /DTSTART;TZID=Europe\/Oslo:20260414T083000/);
|
||||
assert.match(ical, /SUMMARY:LinkedIn: AI strategy in public sector/);
|
||||
assert.match(ical, /UID:post-2026-04-14-ai-strategy@linkedin-thought-leadership/);
|
||||
assert.match(ical, /UID:post-2026-04-14-ai-strategy@linkedin-studio/);
|
||||
assert.match(ical, /END:VEVENT/);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env node
|
||||
// Cross-platform clipboard helper for linkedin-thought-leadership plugin
|
||||
// Cross-platform clipboard helper for linkedin-studio plugin
|
||||
// Copies text to system clipboard using platform-native commands.
|
||||
// Standalone: reads stdin and copies it. Import: export { copyToClipboard, clipboardAvailable }
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env node
|
||||
// content-gatekeeper.mjs
|
||||
// Unified PreToolUse/PostToolUse gatekeeper for linkedin-thought-leadership plugin
|
||||
// Unified PreToolUse/PostToolUse gatekeeper for linkedin-studio plugin
|
||||
//
|
||||
// Replaces 4 nearly identical bash scripts:
|
||||
// pre-content-quality-gate.sh, pre-voice-guardian.sh,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env node
|
||||
// RFC 5545 iCal generator for linkedin-thought-leadership plugin
|
||||
// RFC 5545 iCal generator for linkedin-studio plugin
|
||||
// Import: import { generateIcal, generateIcalFromQueue, writeIcalFile } from './ical-generator.mjs';
|
||||
// Standalone: node ical-generator.mjs --from-queue --output path/to/schedule.ics
|
||||
|
||||
|
|
@ -136,7 +136,7 @@ export function generateIcal(events, options = {}) {
|
|||
const lines = [
|
||||
'BEGIN:VCALENDAR',
|
||||
'VERSION:2.0',
|
||||
'PRODID:-//linkedin-thought-leadership//EN',
|
||||
'PRODID:-//linkedin-studio//EN',
|
||||
'CALSCALE:GREGORIAN',
|
||||
'METHOD:PUBLISH',
|
||||
];
|
||||
|
|
@ -153,7 +153,7 @@ export function generateIcal(events, options = {}) {
|
|||
|
||||
lines.push(
|
||||
'BEGIN:VEVENT',
|
||||
`UID:${event.id}@linkedin-thought-leadership`,
|
||||
`UID:${event.id}@linkedin-studio`,
|
||||
`DTSTAMP:${now}`,
|
||||
`DTSTART;TZID=${tz}:${dtstart}`,
|
||||
`DTEND;TZID=${tz}:${dtend}`,
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ export function isLinkedInContent(filePath) {
|
|||
// POSITIVE: explicit LinkedIn content paths only
|
||||
if (normalized.startsWith('assets/drafts/') || normalized.includes('/assets/drafts/')) return true;
|
||||
if (normalized.includes('/linkedin-posts/')) return true;
|
||||
if (normalized.includes('/linkedin-thought-leadership/assets/')) return true;
|
||||
if (normalized.includes('/linkedin-studio/assets/')) return true;
|
||||
|
||||
// DEFAULT: everything else is NOT LinkedIn content
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env node
|
||||
// Personalization score calculator for linkedin-thought-leadership plugin
|
||||
// Personalization score calculator for linkedin-studio plugin
|
||||
// Checks 8 asset categories for real user data vs placeholder templates
|
||||
// Standalone: outputs SCORE:N|M/8 assets personalized
|
||||
// Import: export function calculateScore(pluginRoot) => { score, personalized, categories }
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env node
|
||||
// Notification hook for linkedin-thought-leadership plugin
|
||||
// Notification hook for linkedin-studio plugin
|
||||
// Fires on idle_prompt to show posting reminders. Rate-limited: max once per 30 min.
|
||||
|
||||
import { readFileSync, existsSync, statSync, writeFileSync, mkdirSync } from 'node:fs';
|
||||
|
|
@ -10,7 +10,7 @@ import { queueToday, queueOverdue } from './queue-manager.mjs';
|
|||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const PLUGIN_ROOT = join(__dirname, '..', '..');
|
||||
const HOME = process.env.HOME || process.env.USERPROFILE || '';
|
||||
const STATE_FILE = join(HOME, '.claude', 'linkedin-thought-leadership.local.md');
|
||||
const STATE_FILE = join(HOME, '.claude', 'linkedin-studio.local.md');
|
||||
const SESSION_DIR = '/tmp/linkedin-hooks';
|
||||
const COOLDOWN_FILE = join(SESSION_DIR, 'last-notification');
|
||||
const COOLDOWN_SECONDS = 1800;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env node
|
||||
// pre-compact.mjs
|
||||
// PreCompact hook for linkedin-thought-leadership plugin
|
||||
// PreCompact hook for linkedin-studio plugin
|
||||
// Reminds Claude to preserve critical LinkedIn session context before compaction
|
||||
//
|
||||
// Exit codes:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env node
|
||||
// Queue management library for linkedin-thought-leadership plugin
|
||||
// Queue management library for linkedin-studio plugin
|
||||
// Import: import { queueRead, queueToday, ... } from './queue-manager.mjs';
|
||||
// Replaces python3 dependency with native Node.js JSON/Date operations
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env node
|
||||
// Quick-import helper for linkedin-thought-leadership plugin
|
||||
// Quick-import helper for linkedin-studio plugin
|
||||
// Opens LinkedIn analytics in browser, watches ~/Downloads for new CSV files
|
||||
|
||||
import { existsSync, mkdirSync, readdirSync, statSync, copyFileSync } from 'node:fs';
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env node
|
||||
// SessionStart hook for linkedin-thought-leadership plugin
|
||||
// SessionStart hook for linkedin-studio plugin
|
||||
// Reads persistent state and session context, outputs JSON with additionalContext
|
||||
|
||||
import { readFileSync, existsSync, copyFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
||||
|
|
@ -12,7 +12,7 @@ import { applyWeekRollover } from './week-rollover.mjs';
|
|||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const PLUGIN_ROOT = join(__dirname, '..', '..');
|
||||
const HOME = process.env.HOME || process.env.USERPROFILE || '';
|
||||
const STATE_FILE = join(HOME, '.claude', 'linkedin-thought-leadership.local.md');
|
||||
const STATE_FILE = join(HOME, '.claude', 'linkedin-studio.local.md');
|
||||
|
||||
function extractYaml(content, key) {
|
||||
const re = new RegExp(`^${key}: *"?([^"\\n]*)"?`, 'm');
|
||||
|
|
@ -234,7 +234,7 @@ if (existsSync(STATE_FILE)) {
|
|||
}
|
||||
|
||||
// Build context output
|
||||
context = 'LinkedIn Thought Leadership session context loaded.\\n\\n';
|
||||
context = 'LinkedIn Studio session context loaded.\\n\\n';
|
||||
context += `## Status\\n\`\`\`\\n${statusLine}\\n\`\`\`\\n\\n`;
|
||||
|
||||
if (weekResetNote) context += `**${weekResetNote}**\\n\\n`;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Deterministic state mutation functions for linkedin-thought-leadership plugin.
|
||||
// Deterministic state mutation functions for linkedin-studio plugin.
|
||||
// Pure functions operate on string content (same pattern as week-rollover.mjs).
|
||||
// I/O wrapper (writeState) handles file reads/writes (same pattern as queue-manager.mjs).
|
||||
|
||||
|
|
@ -9,7 +9,7 @@ import { applyWeekRollover } from './week-rollover.mjs';
|
|||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const HOME = process.env.HOME || process.env.USERPROFILE || '';
|
||||
const STATE_FILE = process.env.STATE_FILE || join(HOME, '.claude', 'linkedin-thought-leadership.local.md');
|
||||
const STATE_FILE = process.env.STATE_FILE || join(HOME, '.claude', 'linkedin-studio.local.md');
|
||||
|
||||
function replaceField(content, field, value) {
|
||||
return content.replace(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env node
|
||||
// stop-reminder.mjs
|
||||
// Stop hook for linkedin-thought-leadership plugin
|
||||
// Stop hook for linkedin-studio plugin
|
||||
//
|
||||
// Only fires if LinkedIn content was worked on (session marker exists).
|
||||
// First stop: blocks with reason (Claude processes reminders).
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env node
|
||||
// user-prompt-context.mjs
|
||||
// UserPromptSubmit hook for linkedin-thought-leadership plugin
|
||||
// UserPromptSubmit hook for linkedin-studio plugin
|
||||
//
|
||||
// Two-tier keyword matching in user prompts:
|
||||
// Tier 1: Strong signals (slash commands, explicit phrases)
|
||||
|
|
@ -19,7 +19,7 @@ import { fileURLToPath } from 'node:url';
|
|||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const pluginRoot = join(__dirname, '..', '..');
|
||||
const home = process.env.HOME || process.env.USERPROFILE || '';
|
||||
const stateFile = join(home, '.claude', 'linkedin-thought-leadership.local.md');
|
||||
const stateFile = join(home, '.claude', 'linkedin-studio.local.md');
|
||||
|
||||
// Read stdin JSON
|
||||
let input;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# LinkedIn Thought Leadership Glossary
|
||||
# LinkedIn Studio Glossary
|
||||
|
||||
Alphabetical glossary of specialized terminology used across the plugin. Each term includes a definition and cross-references to where it's used.
|
||||
|
||||
|
|
@ -9,12 +9,12 @@ Alphabetical glossary of specialized terminology used across the plugin. Each te
|
|||
### 360Brew
|
||||
LinkedIn's 150-parameter foundation model that validates creator profiles before distributing content. Checks expertise alignment across About section, Experience, content history, network quality, and engagement patterns. Content from unvalidated profiles receives limited distribution.
|
||||
|
||||
**Used in:** `references/algorithm-signals-reference.md`, `skills/linkedin-thought-leadership/SKILL.md`, `agents/content-optimizer.md`
|
||||
**Used in:** `references/algorithm-signals-reference.md`, `skills/linkedin-studio/SKILL.md`, `agents/content-optimizer.md`
|
||||
|
||||
### 5x5x5 Pre-Posting Method
|
||||
Engagement priming technique performed 15-20 minutes before posting: identify 5 people with overlapping audiences, find their recent posts (last 24h), write 5 thoughtful comments (15+ words each). Primes algorithm visibility and warms engagement signals.
|
||||
|
||||
**Used in:** `skills/linkedin-thought-leadership/SKILL.md`, `agents/engagement-coach.md`, `agents/network-builder.md`
|
||||
**Used in:** `skills/linkedin-studio/SKILL.md`, `agents/engagement-coach.md`, `agents/network-builder.md`
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -62,17 +62,17 @@ Seven-stage journey of repurposed content: Original Creation → First Repurposi
|
|||
### Content Mix (70/20/10)
|
||||
Optimal content type distribution: 70% Educational (teach, frameworks, how-to), 20% Inspirational (stories, lessons, failures), 10% Entertaining (hot takes, humor, observations). Enforced by content-planner agent.
|
||||
|
||||
**Used in:** `skills/linkedin-thought-leadership/SKILL.md`, `agents/content-planner.md`, `references/linkedin-growth-playbook-2025-2026.md`
|
||||
**Used in:** `skills/linkedin-studio/SKILL.md`, `agents/content-planner.md`, `references/linkedin-growth-playbook-2025-2026.md`
|
||||
|
||||
### Content Pillars
|
||||
3-5 core expertise areas that define your LinkedIn focus. Used for topic consistency validation, gap analysis in content planning, and 360Brew alignment checks. Example for AI content: News, Implementation, Strategy, Tools.
|
||||
|
||||
**Used in:** `agents/content-planner.md`, `references/ai-content-framework.md`, `skills/linkedin-thought-leadership/SKILL.md`
|
||||
**Used in:** `agents/content-planner.md`, `references/ai-content-framework.md`, `skills/linkedin-studio/SKILL.md`
|
||||
|
||||
### CTA (Call-to-Action)
|
||||
Specific, genuine engagement prompt at the end of a post. Must feel natural and offer optionality ("Which strategy has worked for your team?" > "What do you think?"). Creates invitation for the engagement that drives distribution.
|
||||
|
||||
**Used in:** `references/engagement-frameworks.md`, `skills/linkedin-thought-leadership/SKILL.md`, `agents/content-optimizer.md`
|
||||
**Used in:** `references/engagement-frameworks.md`, `skills/linkedin-studio/SKILL.md`, `agents/content-optimizer.md`
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -124,7 +124,7 @@ LinkedIn's mechanism for validating creator authority: professional history, pos
|
|||
### First-Hour Engagement
|
||||
Critical window (0-60 minutes post-publication) determining ~70% of a post's total reach. Requires: 5x5x5 pre-posting engagement, immediate response to first comments (within 5 minutes), and continued engagement through 90 minutes.
|
||||
|
||||
**Used in:** `skills/linkedin-thought-leadership/SKILL.md`, `references/linkedin-formats.md`, `agents/engagement-coach.md`
|
||||
**Used in:** `skills/linkedin-studio/SKILL.md`, `references/linkedin-formats.md`, `agents/engagement-coach.md`
|
||||
|
||||
### Four-Stage Distribution Model
|
||||
Sequential post distribution: Stage 1 (0-30s: Quality classifier + 360Brew validation) → Stage 2 (0-90min: Test to 6-10% of connections) → Stage 3 (1-24h: Extended if velocity good) → Stage 4 (24-72h+: Evergreen circulation).
|
||||
|
|
@ -147,7 +147,7 @@ The critical 60-90 minute window post-publication where LinkedIn tests content w
|
|||
### Hook
|
||||
Opening 110-140 characters of a post that must work standalone on mobile (before "see more" cutoff) and create a curiosity gap. 10 high-performing types: Surprising Stat, Bold Statement, Provocative Question, Contrarian, Personal Confession, Pattern Observation, Time Frame Urgency, Lesson Learned, Scenario, Direct Address.
|
||||
|
||||
**Used in:** `references/engagement-frameworks.md`, `skills/linkedin-thought-leadership/SKILL.md`, `agents/content-optimizer.md`
|
||||
**Used in:** `references/engagement-frameworks.md`, `skills/linkedin-studio/SKILL.md`, `agents/content-optimizer.md`
|
||||
|
||||
### Hook Psychology
|
||||
Neuroscience-backed engagement: Pattern interrupts trigger prediction error → dopamine release → information gap demanding cognitive closure. Pattern interrupts are 2.7x more common in viral posts. Optimal first line: ~49 characters.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/bin/bash
|
||||
# LinkedIn Thought Leadership Plugin — Structure Validator
|
||||
# LinkedIn Studio Plugin — Structure Validator
|
||||
# Validates file existence, frontmatter format, and router completeness
|
||||
# Usage: bash scripts/test-runner.sh
|
||||
|
||||
|
|
@ -21,7 +21,7 @@ fail() { echo -e "${RED}✗${NC} $1"; FAIL=$((FAIL + 1)); }
|
|||
warn() { echo -e "${YELLOW}⚠${NC} $1"; WARN=$((WARN + 1)); }
|
||||
|
||||
echo "================================================"
|
||||
echo "LinkedIn Thought Leadership Plugin — Structure Validator"
|
||||
echo "LinkedIn Studio Plugin — Structure Validator"
|
||||
echo "Plugin root: $PLUGIN_ROOT"
|
||||
echo "================================================"
|
||||
echo ""
|
||||
|
|
@ -129,7 +129,7 @@ echo ""
|
|||
# --- Section 5: Skill Files ---
|
||||
echo "--- Skill Files ---"
|
||||
|
||||
for skill in "linkedin-thought-leadership" "linkedin-content-creation" "linkedin-analytics" "linkedin-strategy" "linkedin-networking" "linkedin-voice"; do
|
||||
for skill in "linkedin-studio" "linkedin-content-creation" "linkedin-analytics" "linkedin-strategy" "linkedin-networking" "linkedin-voice"; do
|
||||
f="skills/${skill}.md"
|
||||
if [ -f "$PLUGIN_ROOT/$f" ]; then
|
||||
pass "$f exists"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
name: linkedin-thought-leadership
|
||||
name: linkedin-studio
|
||||
description: |
|
||||
Main entry point and router for the LinkedIn thought leadership plugin. Provides overview, status, and routes to 5 specialized skills. Contains shared algorithm knowledge and content quality standards.
|
||||
This skill should be used when the user wants a general overview, needs help choosing the right LinkedIn command, or asks about LinkedIn capabilities.
|
||||
Loading…
Add table
Add a link
Reference in a new issue