diff --git a/CLAUDE.md b/CLAUDE.md index af11fc2..8b9a22b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ plugins/ ai-psychosis/ v1.0.0 — Interaction awareness (sycophancy, reinforcement loops) config-audit/ v3.1.0 — Configuration intelligence (health, opportunities, auto-fix, whats-active) graceful-handoff/ v2.1.0 — Auto-trigger handoff via Stop hook (skill + JSON pipeline + 4-step model-aware context resolution) - linkedin-thought-leadership/ v1.2.0 — LinkedIn content pipeline + analytics + linkedin-thought-leadership/ v2.0.0 — Full-spectrum LinkedIn content engine (short-form feed + long-form newsletter). v2.0.0 consolidated surface (27→24 commands, 16→14 agents) + added `/linkedin:newsletter` orchestrator with fact-check + persona-sweep gates BEFORE lock. Render pipeline migrated in-plugin (self-hosted OFL-1.1 fonts). Built across 21 Voyage sessions. llm-security/ v7.7.2 — Security scanning, auditing, threat modeling. HTML report output for all 18 skill commands (render-report CLI + canonical ESM module mirrored bit-identical into the playground). v7.7.2 translated the remaining Norwegian surface text in the playground UI, the canonical renderer, the agent prompts, and the README/CLAUDE.md state sections to English. v7.7.1 stripped the playground to the catalog as the only routable surface. ms-ai-architect/ v1.15.0 — Microsoft AI architecture (Cosmo Skyberg persona) + manual KB-refresh slash command + v3 project-view (sidebar med 17 artifacts + main + import-modal overlay, v2-surface fjernet i v1.15.0) okr/ v1.0.0 — OKR guidance for Norwegian public sector diff --git a/README.md b/README.md index 0f4df4e..2278dd8 100644 --- a/README.md +++ b/README.md @@ -206,12 +206,15 @@ Key commands: `/architect`, `/architect:ros`, `/architect:security`, `/architect --- -### [LinkedIn Thought Leadership](plugins/linkedin-thought-leadership/) `v1.2.0` +### [LinkedIn Thought Leadership](plugins/linkedin-thought-leadership/) `v2.0.0` Build authentic LinkedIn authority through algorithmic understanding, strategic consistency, and AI-assisted content creation. -Updated for the January 2026 360Brew algorithm change, which validates your creator profile before distributing content. v1.2.0 reduces friction: auto-clipboard on all content commands, max 2 interactive steps per post, deterministic state management, MCP image carousel pipeline, progressive onboarding, and iCal calendar integration for batch scheduling. +v2.0.0 is a full-spectrum content engine: short-form feed posts AND long-form newsletter editions in one cohesive surface, with net-fewer commands and net-stronger pipeline. Updated for the January 2026 360Brew algorithm change, which validates your creator profile before distributing content. +- **Long-form `/linkedin:newsletter` orchestrator** — multi-session pipeline (research → draft → fact-check sweep → persona sweep → lock → delivery → hook-gate) with maintained edition-state. Newsletter editions, essays, series articles +- **Two new longform-quality gates** — `fact-checker` (Opus, verifies every claim against primary sources) and `persona-reviewer` (Opus, reader-persona resonance + hook conversion). Both run BEFORE lock +- **Render pipeline in-plugin** — `build-html.mjs`, `build-pdf.mjs`, `build-linkedin.mjs`, `build-carousel.mjs` with self-hosted Newsreader/Inter/JetBrains Mono under OFL-1.1 - **Guided onboarding** — `/linkedin:onboarding` walks new users through profile → setup → first post in one flow - **360Brew profile optimization** — audit your profile against LinkedIn's creator validation criteria - **Full content pipeline** — ideation, drafting, publishing, 48-hour monitoring, and analytics @@ -219,10 +222,12 @@ Updated for the January 2026 360Brew algorithm change, which validates your crea - **Voice training** — learns your authentic writing style and detects drift with 6-dimension scoring - **Analytics pipeline** — import LinkedIn CSV exports, weekly/monthly reports, day-of-week heatmap - **Growth strategy** — phase-specific guidance from foundation (0-1K followers) through authority (10K+) +- **Router gating** — `/linkedin:monetize` and `/linkedin:outreach` soft-gate at ~1K followers, pointing earlier users at `/linkedin:strategy` first +- **Friction reduction (carried from v1.2.0)** — auto-clipboard on all content commands, max 2 interactive steps per post, deterministic state management, iCal batch scheduling -Key commands: `/linkedin:onboarding`, `/linkedin:post`, `/linkedin:quick`, `/linkedin:carousel`, `/linkedin:react`, `/linkedin:report` +Key commands: `/linkedin:onboarding`, `/linkedin:post`, `/linkedin:quick`, `/linkedin:newsletter`, `/linkedin:carousel`, `/linkedin:react`, `/linkedin:report` -16 specialized agents · 27 commands · 6 skills · 9 hooks · 24 reference docs +14 specialized agents · 24 commands · 6 skills · 9 hooks · 24 reference docs → [Full documentation](plugins/linkedin-thought-leadership/README.md) diff --git a/plugins/linkedin-thought-leadership/.claude-plugin/plugin.json b/plugins/linkedin-thought-leadership/.claude-plugin/plugin.json index 44b2a80..b10d168 100644 --- a/plugins/linkedin-thought-leadership/.claude-plugin/plugin.json +++ b/plugins/linkedin-thought-leadership/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "linkedin-thought-leadership", - "version": "1.2.0", - "description": "Build LinkedIn thought leadership with algorithmic understanding, strategic consistency, and authentic engagement. Updated for the January 2026 360Brew algorithm change.", + "version": "2.0.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. Net-fewer commands, net-stronger pipeline.", "author": { "name": "Kjell Tore Guttormsen" }, diff --git a/plugins/linkedin-thought-leadership/CHANGELOG.md b/plugins/linkedin-thought-leadership/CHANGELOG.md index 7ca267a..2f7b951 100644 --- a/plugins/linkedin-thought-leadership/CHANGELOG.md +++ b/plugins/linkedin-thought-leadership/CHANGELOG.md @@ -5,6 +5,57 @@ 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). +## [2.0.0] - 2026-05-28 + +### Summary +Full-spectrum LinkedIn content engine — short-form feed posts AND long-form newsletter editions in one cohesive surface, with net-fewer commands and net-stronger pipeline. Built across 21 Voyage sessions (S1..S20+S1a) with 1 step = 1 session discipline. Locked decisions A–H in `docs/voyage-build-brief.md` §3. + +### Added +- **`/linkedin:newsletter`** — long-form orchestrator command. Multi-session pipeline: load → calibrate → research fan-out → draft → consistency/quality → fact-check sweep → persona sweep → annotate → lock → delivery → hook-gate → schedule. Maintained `edition-state.json` across sessions. Supports newsletter editions, essays, and series articles +- **`/linkedin:outreach`** — outreach orchestrator (absorbed `/linkedin:collab` and `/linkedin:speaking`). Covers collaborations, partner pitches, and CFPs/speaking opportunities in one surface +- **`agents/fact-checker.md`** (Opus, brown) — verifies every factual claim in long-form drafts against primary sources. Outputs 🟢/🔴/🟡 verdicts per claim. Runs BEFORE lock +- **`agents/persona-reviewer.md`** (Opus, olive) — evaluates reader-persona resonance + hook-conversion gate. Two modes: per-persona deep review, multi-persona scoreboard. Runs BEFORE lock +- **`render/` pipeline migrated in-plugin** — `build-html.mjs`, `build-pdf.mjs`, `build-linkedin.mjs`, `build-carousel.mjs`. Self-hosted fonts (Newsreader, Inter, JetBrains Mono) under OFL-1.1 with `render/OFL.txt`. WeasyPrint degradation: missing binary → skip-signal, not throw +- **`config/personas.template.md`** — reader persona library. Knowledge level, time-pressure, resonance criteria per persona. Consumed by `persona-reviewer` +- **`config/edition-state.template.json`** — schema for long-form edition state across sessions +- **`references/longform-quality-rules.md`** — quality bar specific to long-form (different from short-form rules) +- **Router gating** — `/linkedin:monetize` and `/linkedin:outreach` surface "unlocks at ~1K followers" guidance and point sub-1K users at `/linkedin:strategy` first +- **`docs/agents-capability-matrix.md`** — single source of truth for which agent owns which capability. Pipeline diagram + intent table + model tier table + +### Changed +- **Agent merges (16 → 14):** + - `performance-reporter` → `analytics-interpreter` (interpret + report modes, same data sources, mode-selector by trigger phrase) + - `comment-strategist` → `engagement-coach` (5x5x5 + first-hour + CEA method + target scoring + daily routine + comment quality scorecard; upgraded haiku → sonnet since the agent now handles deeper work) + - `content-tracker` → absorbed by `state-updater.mjs` + `analytics-interpreter` + - `personalization-scorer` → absorbed by `personalization-score.mjs` (deterministic, no AI) +- **Command merges (27 → 24):** + - `/linkedin:templates` → mode in `/linkedin:quick` (8 post-type templates) + - `/linkedin:publish` → action in `/linkedin:calendar` (mark scheduled posts as published) + - `/linkedin:authority` → absorbed into `/linkedin:strategy` (canon for authority building, trajectory dedup) + - `/linkedin:collab` + `/linkedin:speaking` → `/linkedin:outreach` +- **`/linkedin:import` Step 6 analysis** — delegated to `/linkedin:report` (both consume the same `trends` CLI; no more duplicated analysis pipeline) +- **`commands/linkedin.md` router** — newsletter row added, removed-command rows pruned, gating-rule paragraph for monetize/outreach +- **All 6 skill catalogs** reconciled — `linkedin-content-creation`, `linkedin-analytics`, `linkedin-strategy`, `linkedin-networking`, `linkedin-thought-leadership`, `linkedin-voice` all reflect the v2.0.0 command/agent set + +### Removed +- `commands/templates.md` (absorbed into `commands/quick.md`) +- `commands/publish.md` (absorbed into `commands/calendar.md`) +- `commands/authority.md` (absorbed into `commands/strategy.md`) +- `commands/collab.md` (absorbed into `commands/outreach.md`) +- `commands/speaking.md` (absorbed into `commands/outreach.md`) +- `agents/content-tracker.md` +- `agents/personalization-scorer.md` +- `agents/performance-reporter.md` +- `agents/comment-strategist.md` + +### Fixed +- `references/glossary.md` "Authority Score" entry — corrected stale ref to `commands/authority.md` (removed) → `commands/strategy.md` (canon) +- `scripts/test-runner.sh` `EXPECTED_AGENTS` list — reconciled to 14 agents + +### Migration notes +- Plugin remains fully backward-compatible from a user-perspective: removed commands now route to their absorbing command via `commands/linkedin.md` +- v1.x users who had `commands/templates.md` etc. in muscle memory will be auto-redirected by the router + ## [1.2.0] - 2026-04-11 ### Summary diff --git a/plugins/linkedin-thought-leadership/CLAUDE.md b/plugins/linkedin-thought-leadership/CLAUDE.md index 965de76..de0a84d 100644 --- a/plugins/linkedin-thought-leadership/CLAUDE.md +++ b/plugins/linkedin-thought-leadership/CLAUDE.md @@ -1,6 +1,6 @@ -# LinkedIn Thought Leadership Plugin (v1.2.0) +# LinkedIn Thought Leadership Plugin (v2.0.0) -Build LinkedIn thought leadership with algorithmic understanding, strategic consistency, and authentic engagement. January 2026 360Brew algorithm update integrated. +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`). ## Architecture @@ -32,9 +32,9 @@ Build LinkedIn thought leadership with algorithmic understanding, strategic cons **Hook editing:** Edit `hooks/hooks.template.json` + `hooks/prompts/*.md`, then run `python3 hooks/scripts/compile-hooks.py`. Do not edit `hooks.json` directly. Prompts are loaded at runtime by gatekeeper scripts; the compile step is only needed when adding `type: prompt` hooks. -## Commands (27) +## Commands (24) -All content commands (post, quick, react, pipeline, first-post, video, multiplatform, carousel) auto-copy output to clipboard via `clipboard-helper.mjs`. Interactive steps are minimized — angle, format, and post type are inferred from context, with max 2 questions per post. +All content commands (post, quick, react, pipeline, first-post, video, multiplatform, carousel, newsletter) auto-copy output to clipboard via `clipboard-helper.mjs`. Interactive steps are minimized — angle, format, and post type are inferred from context, with max 2 questions per post. **v2.0.0 net change:** 5 commands removed (`templates`, `publish`, `authority`, `collab`, `speaking` — absorbed into `quick`, `calendar`, `strategy`, `outreach` respectively) + 2 commands added (`newsletter`, `outreach`) = 27 → 24. | Command | Purpose | |---------|---------| @@ -46,20 +46,21 @@ All content commands (post, quick, react, pipeline, first-post, video, multiplat | `/linkedin:post` | Full post creation (10-15 min) | | `/linkedin:quick` | 5-minute quick post (3-line formula) + 8 post-type templates | | `/linkedin:pipeline` | Full end-to-end content pipeline | +| `/linkedin:newsletter` | Long-form orchestrator: newsletter edition / essay / series article — multi-session pipeline with fact-check + persona-sweep BEFORE lock | | `/linkedin:batch` | Create a full week of content | | `/linkedin:calendar` | View/manage post scheduling queue + publish action (mark scheduled posts as published) | | `/linkedin:carousel` | Structured multi-slide carousel generator | | `/linkedin:video` | Video script generator (30s-2min) | -| `/linkedin:multiplatform` | Adapt content for other platforms | +| `/linkedin:multiplatform` | Adapt content for other platforms (short-form/cross-format; long-form → `/linkedin:newsletter`) | | `/linkedin:analyze` | Content/performance analysis | | `/linkedin:audit` | Periodic content strategy audit | -| `/linkedin:import` | Import CSV export → structured JSON | +| `/linkedin:import` | Import CSV export → structured JSON (delegates analysis to `/linkedin:report`) | | `/linkedin:report` | Generate weekly performance report | | `/linkedin:ab-test` | Design and manage A/B content tests | | `/linkedin:strategy` | Growth strategy + authority building (phase guidance, trajectory, signature content compounding) | | `/linkedin:competitive` | Competitive analysis of niche | -| `/linkedin:monetize` | Monetization strategy and funnels | -| `/linkedin:outreach` | Outreach orchestrator — collaborations + speaking opportunities | +| `/linkedin:monetize` | Monetization strategy and funnels (unlocks at ~1K followers) | +| `/linkedin:outreach` | Outreach orchestrator — collaborations + speaking opportunities (unlocks at ~1K followers) | | `/linkedin:profile` | 360Brew profile optimization | ## Agents (14) diff --git a/plugins/linkedin-thought-leadership/README.md b/plugins/linkedin-thought-leadership/README.md index c3ba9a0..d9fdc18 100644 --- a/plugins/linkedin-thought-leadership/README.md +++ b/plugins/linkedin-thought-leadership/README.md @@ -6,21 +6,21 @@ *AI-generated: all code produced by Claude Code through dialog-driven development. [Full disclosure →](../../README.md#ai-generated-code-disclosure)* -![Version](https://img.shields.io/badge/version-1.2.0-blue) +![Version](https://img.shields.io/badge/version-2.0.0-blue) ![Platform](https://img.shields.io/badge/platform-Claude_Code_Plugin-purple) -![Commands](https://img.shields.io/badge/commands-27-green) -![Agents](https://img.shields.io/badge/agents-16-orange) +![Commands](https://img.shields.io/badge/commands-24-green) +![Agents](https://img.shields.io/badge/agents-14-orange) ![Hooks](https://img.shields.io/badge/hooks-9-red) ![Reference Docs](https://img.shields.io/badge/reference_docs-24-teal) ![License](https://img.shields.io/badge/license-MIT-lightgrey) -A comprehensive Claude Code plugin that turns LinkedIn from a chore into a system. It covers the full content lifecycle — from ideation and drafting through publishing, analytics, and growth strategy — with 27 slash commands, 16 specialized agents, 9 automated hooks, and a 24-document knowledge base grounded in LinkedIn's actual algorithm signals. Updated for the January 2026 **360Brew** algorithm change, where LinkedIn now validates your profile before distributing content. +A comprehensive Claude Code plugin that turns LinkedIn from a chore into a full-spectrum content engine — short-form feed posts, carousels, video scripts, and long-form newsletter editions. v2.0.0 consolidated the surface (27 → 24 commands, 16 → 14 agents) and added `/linkedin:newsletter` as a multi-session long-form orchestrator with fact-check + persona-sweep gates BEFORE lock. 24 slash commands, 14 specialized agents, 9 automated hooks, and a 24-document knowledge base grounded in LinkedIn's actual algorithm signals. Updated for the January 2026 **360Brew** algorithm change, where LinkedIn now validates your profile before distributing content. --- ## Table of Contents -- [What's New in v1.2.0](#whats-new-in-v120) +- [What's New in v2.0.0](#whats-new-in-v200) - [What Is This?](#what-is-this) - [Quick Start](#quick-start) - [Commands](#commands) @@ -39,16 +39,23 @@ A comprehensive Claude Code plugin that turns LinkedIn from a chore into a syste --- -## What's New in v1.2.0 +## What's New in v2.0.0 -**Friction reduction release** — fewer steps, faster output, smarter defaults. +**Full-spectrum content engine** — feed posts AND long-form newsletter editions in one cohesive surface, with net-fewer commands. -- **Auto-clipboard** — All 8 content commands (`post`, `quick`, `react`, `pipeline`, `first-post`, `video`, `multiplatform`, `carousel`) automatically copy finished content to your clipboard. No more manual copy-paste -- **Reduced interactive steps** — Angle, format, and post type are inferred from context. Maximum 2 questions per post (down from 4-6) -- **Deterministic state management** — Post tracking, streak updates, and content history are handled by `state-updater.mjs` (pure functions, tested, no AI involved). Content history auto-prunes entries older than 90 days -- **MCP image carousel pipeline** — `/linkedin:carousel` can generate professional slide images via mcp-image with text overlays (1080x1350, 3:4 ratio). Falls back to Mermaid diagrams or text-based slides -- **Progressive onboarding** — New users see a cleaner experience: personalization score hidden until 3+ posts, voice guardian suppressed until 5+ voice samples -- **iCal calendar integration** — `/linkedin:batch` generates an `.ics` file importable into macOS Calendar, Google Calendar, or Outlook. Each post gets a calendar event with reminders +- **Long-form `/linkedin:newsletter` orchestrator** — multi-session pipeline (load → calibrate → research fan-out → draft → consistency → fact-check sweep → persona sweep → lock → delivery → hook-gate → schedule) with maintained edition-state across sessions. Supports newsletter editions, essays, and series articles +- **Two new longform-quality gate agents** — `fact-checker` (Opus, verifies every factual claim against primary sources) and `persona-reviewer` (Opus, evaluates reader-persona resonance + hook-conversion). Both run BEFORE lock — the cost of fixing an error in a published edition is too high +- **Render pipeline migrated into the plugin** — `render/build-html.mjs`, `build-pdf.mjs`, `build-linkedin.mjs`, `build-carousel.mjs` + self-hosted fonts (Newsreader, Inter, JetBrains Mono) under OFL-1.1. No more cross-repo render dependency +- **Persona library** — `config/personas.template.md` lets you define reader personas with knowledge level, time-pressure, and resonance criteria. `persona-reviewer` uses these to evaluate every long-form draft +- **Edition-state schema** — `assets/editions//state.json` tracks a long-form piece across many sessions (research notes, draft revisions, fact-check status, persona-review status, lock state) +- **Net surface reduction** — 27 → 24 commands (5 removed: `templates`, `publish`, `authority`, `collab`, `speaking` absorbed into existing commands; 2 added: `newsletter`, `outreach`). 16 → 14 agents (4 merged: `content-tracker`, `personalization-scorer`, `performance-reporter`, `comment-strategist` absorbed into `analytics-interpreter` + `engagement-coach`; 2 added: `fact-checker`, `persona-reviewer`) +- **Analytics consolidation** — `analytics-interpreter` now has interpret + report modes (replaces standalone `performance-reporter`); `engagement-coach` now owns 5x5x5 + first-hour tactics + CEA commenting + target selection + daily routine (replaces standalone `comment-strategist`) +- **`/linkedin:import` analysis delegates to `/linkedin:report`** — both consume the same `trends` CLI; the import flow runs the report inline instead of duplicating the analysis pipeline +- **Router gating** — `/linkedin:monetize` and `/linkedin:outreach` now surface "unlocks at ~1K followers" guidance so new creators are pointed at `/linkedin:strategy` first + +### Friction reduction (carried forward from prior release) + +- Auto-clipboard on all content commands · max 2 interactive steps · deterministic `state-updater.mjs` · MCP image carousel · progressive onboarding · iCal calendar integration --- @@ -124,7 +131,7 @@ The wizard handles everything: 360Brew profile checklist, voice and user profile ## Commands -All 26 commands use colon notation: `/linkedin:post`, `/linkedin:quick`, etc. +All 24 commands use colon notation: `/linkedin:post`, `/linkedin:quick`, etc. ### Onboarding @@ -284,10 +291,10 @@ 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-content-creation` | Posts, templates, batch, pipeline, video, calendar | `/linkedin:post`, `:quick`, `:templates`, `:pipeline`, `:batch`, `:calendar`, `:publish`, `:video`, `:multiplatform` | +| `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, competitive, monetization | `/linkedin:strategy`, `:authority`, `:competitive`, `:monetize` | -| `linkedin-networking` | Engagement, collaborations, speaking | `/linkedin:outreach` | +| `linkedin-strategy` | Growth, authority (absorbed), competitive, monetization | `/linkedin:strategy`, `:competitive`, `:monetize` | +| `linkedin-networking` | Engagement, collaborations, speaking (all in `outreach`) | `/linkedin:outreach` | | `linkedin-voice` | Voice training, profile optimization, differentiation | `/linkedin:profile` | --- @@ -523,6 +530,7 @@ Scheduled posts are tracked in `assets/drafts/queue.json`: | Version | Date | Highlights | |---------|------|-----------| +| **2.0.0** | 2026-05-28 | Full-spectrum content engine. `/linkedin:newsletter` long-form orchestrator with multi-session edition-state, fact-check + persona-sweep gates BEFORE lock. New agents: `fact-checker`, `persona-reviewer` (both Opus). Render pipeline migrated in-plugin with self-hosted OFL-1.1 fonts. Net-fewer surface: 27 → 24 commands (5 removed, 2 added), 16 → 14 agents (4 merged, 2 added). Router gating on monetize/outreach (unlocks at ~1K). `/linkedin:import` delegates analysis to `/linkedin:report`. | | **1.2.0** | 2026-04-11 | Friction reduction release. Auto-clipboard on all content commands, reduced interactive steps (max 2 per post), deterministic state management (`state-updater.mjs`), MCP image carousel pipeline, progressive onboarding, iCal calendar integration for batch scheduling, auto-prune content history (90 days). | | **1.1.0** | 2026-04-08 | Q2 feature release. 27 commands (+onboarding, +carousel). Week-rollover automation, voice drift scoring, industry content matrix, multi-URL react, day-of-week heatmap, month-over-month reports. | | **1.0.0** | 2026-04-07 | Public release. 25 commands, 16 agents, 9 hooks, 6 skills, 24 reference docs. Agent model tiering (Sonnet/Haiku), all scripts Node.js, comprehensive documentation. | diff --git a/plugins/linkedin-thought-leadership/commands/import.md b/plugins/linkedin-thought-leadership/commands/import.md index e972d22..bed163d 100644 --- a/plugins/linkedin-thought-leadership/commands/import.md +++ b/plugins/linkedin-thought-leadership/commands/import.md @@ -206,71 +206,37 @@ Import 2-3 more weeks of data for meaningful trend analysis. ## Step 6: Analytics-to-Strategy Feedback Loop -After successful import, auto-run a brief analysis to give the user immediate value. +After successful import, the analysis fan-out (pillar performance, format +performance, day-of-week heatmap, actionable recommendations) is **delegated +to `/linkedin:report`** — both commands consume the same `trends` CLI from +`scripts/analytics/`, and keeping a second analysis pipeline here drifted +out of sync with `report.md`. -### Step 6a: Content Pillar Performance +### Step 6a: Run the report -Read the user's `expertise_areas` from the state file (`~/.claude/linkedin-thought-leadership.local.md`). Run the trends CLI for impressions and engagement rate: - -```bash -ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" trends --period 4w --metric impressions -ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" trends --period 4w --metric engagement_rate -``` - -Cross-reference post topics with expertise_areas. Present a pillar performance table: +Invoke the report generator and surface its output inline: ``` -### Content Pillar Performance (last 4 weeks) - -| Pillar | Posts | Avg Impressions | Avg Engagement | Trend | -|-------------------|-------|-----------------|----------------|-------| -| Azure AI | 5 | 2,400 | 4.2% | Up | -| Copilot Studio | 3 | 1,800 | 3.1% | Flat | -| Power Platform | 4 | 1,200 | 5.8% | Up | -| Semantic Kernel | 2 | 3,100 | 2.9% | New | -| AI Strategy | 3 | 900 | 2.1% | Down | +Run /linkedin:report (period: 4w) ``` -### Step 6b: Post Type Analysis +`/linkedin:report` will: -Categorize imported posts by format (text-only, list, story, question, carousel, poll) based on content patterns. Present format performance: +1. Read `expertise_areas` from `~/.claude/linkedin-thought-leadership.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 + ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" trends --period 4w --metric engagement_rate + ``` +3. Produce the Content Pillar Performance, Format Performance, and + Day-of-Week Performance tables, plus exactly 3 actionable recommendations +4. Return its summary back to this import flow -``` -### Format Performance +If `/linkedin:report` is unavailable (analytics dir empty, tsx missing), +fall back to a one-line status: "Import complete — run `/linkedin:report` +manually when analytics are ready." -| Format | Posts | Avg Impressions | Avg Engagement | Best Hook | -|------------|-------|-----------------|----------------|-----------| -| Lists | 4 | 2,800 | 5.1% | "5 things..." | -| Stories | 3 | 2,200 | 4.5% | "Last week..." | -| Questions | 2 | 1,600 | 6.2% | "What if..." | -| Text-only | 5 | 1,100 | 2.8% | — | -``` - -### Step 6c: Optimal Posting Time - -Analyze publishing dates vs. performance. Present day-of-week performance: - -``` -### Day-of-Week Performance - -| Day | Posts | Avg Impressions | Avg Engagement | -|-----------|-------|-----------------|----------------| -| Monday | 2 | 1,400 | 3.2% | -| Tuesday | 4 | 2,600 | 4.8% | -| Wednesday | 3 | 2,100 | 4.1% | -| Thursday | 3 | 2,300 | 3.9% | -| Friday | 2 | 1,000 | 2.5% | -``` - -### Step 6d: Actionable Recommendations - -Based on the analysis above, generate exactly 3 concrete, data-driven recommendations. Examples: - -- "Your list posts average 2.5x the impressions of text-only posts. Consider using list format for your next 2 posts." -- "Tuesday is your strongest day (2,600 avg impressions). Schedule your best content for Tuesdays." -- "Azure AI posts are trending up (+18% impressions). Double down on this pillar next week." - -### Step 6e: Update State with Import Date +### Step 6b: Update State with Import Date After successful import and analysis, update the state file: diff --git a/plugins/linkedin-thought-leadership/commands/linkedin.md b/plugins/linkedin-thought-leadership/commands/linkedin.md index fe1ab74..8e8e150 100644 --- a/plugins/linkedin-thought-leadership/commands/linkedin.md +++ b/plugins/linkedin-thought-leadership/commands/linkedin.md @@ -103,11 +103,18 @@ Present these options to the user: ### Growth & Monetization -| Command | Purpose | -|---------|---------| -| `/linkedin:monetize` | Monetization strategy for 10K+ followers | -| `/linkedin:outreach` | Outreach orchestrator — collaborations and speaking opportunities (CFPs, partner pitches) | -| `/linkedin:multiplatform` | Adapt content for Twitter/X, slides, YouTube (short-form/cross-format; long-form → `/linkedin:newsletter`) | +| Command | Purpose | Unlocks at | +|---------|---------|-----------| +| `/linkedin:monetize` | Monetization strategy (lead magnets, consulting funnel, pricing) | ~1K followers | +| `/linkedin:outreach` | Outreach orchestrator — collaborations and speaking opportunities (CFPs, partner pitches) | ~1K followers | +| `/linkedin:multiplatform` | Adapt content for Twitter/X, slides, YouTube (short-form/cross-format; long-form → `/linkedin:newsletter`) | Any phase | + +**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 will note the threshold and suggest +`/linkedin:strategy` first. ## Ask the User @@ -168,8 +175,8 @@ If the user's intent is clear from context: - 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` -- Mentions "speaking" or "conference" or "collaborate" or "partner" or "CFP" or "talk proposal" or "co-author" or "joint post" → Route to `/linkedin:outreach` +- 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` diff --git a/plugins/linkedin-thought-leadership/docs/voyage-build/plan.md b/plugins/linkedin-thought-leadership/docs/voyage-build/plan.md index 2b71e74..4d771a1 100644 --- a/plugins/linkedin-thought-leadership/docs/voyage-build/plan.md +++ b/plugins/linkedin-thought-leadership/docs/voyage-build/plan.md @@ -525,7 +525,7 @@ These are verified deviations from the fasit. Each is a correction-in-scope - **Changes:** Remove the newsletter/blog adaptation path from `multiplatform.md` so there is exactly ONE entry to long-form (fasit §4.1). Add the langform trigger to `skills/linkedin-content-creation/SKILL.md` (fasit §5.3) AND sweep the catalog tables in all 6 `skills/*/SKILL.md` (N2). Add a router row for `newsletter` in `commands/linkedin.md`. (codebase analysis) - **Reuses:** existing router-row format in `linkedin.md`; skill trigger format. - **Test first:** *(archetype F)* grep proves only one newsletter entry; router row present; no dead newsletter path in multiplatform. -- **Verify:** `grep -Eci 'Step.*newsletter|newsletter (pipeline|workflow|edition)' commands/multiplatform.md && grep -c 'newsletter' commands/linkedin.md` → expected: **0** multi-step newsletter section in multiplatform (a one-line pointer is allowed, any wording); router row present in linkedin.md. (Robust: does not depend on exact pointer phrasing — only that no *pipeline/section* survives.) +- **Verify:** `[ "$(grep -Eci 'Step.*newsletter|newsletter (pipeline|workflow|edition)' commands/multiplatform.md)" = "0" ] && grep -q 'newsletter' commands/linkedin.md` → expected: **0** multi-step newsletter section in multiplatform (a one-line pointer is allowed, any wording); router row present in linkedin.md. (Robust: does not depend on exact pointer phrasing — only that no *pipeline/section* survives. **Fix v2.0 doc-pass:** the original `grep -Eci ... && grep -c ...` was `&&`-broken — `grep -c` returns the count as stdout but exits non-zero when count=0, so the chain short-circuited even on the desired "0 matches" outcome. Reworked to an explicit string-equality test.) - **On failure:** revert — `git checkout -- commands/multiplatform.md commands/linkedin.md skills/` - **Checkpoint:** `git commit -m "refactor(linkedin): single newsletter entry + skill trigger + router row (S11)"` - **Manifest:** @@ -749,7 +749,7 @@ These are verified deviations from the fasit. Each is a correction-in-scope - **Reuses:** `report.md` trends CLI; existing version-sync discipline. - **Test first:** *(archetype F)* command count verified down; all version refs = 2.0.0 (grep); all 3 doc levels updated; router gating present. - **Changes (count, corrected):** net command count = **24** = 27 today − 5 removed (`templates`, `publish`, `authority`, `collab`, `speaking`) + 2 added (`newsletter`, `outreach`). (The fasit's "~23" was approximate; the exact arithmetic is 24. This is the binding number.) -- **Verify:** `test "$(ls commands/*.md | wc -l | tr -d ' ')" = "24" && ! grep -rIn '1\\.2\\.0' .claude-plugin/plugin.json CLAUDE.md README.md CHANGELOG.md` → expected: command count is **exactly 24**; zero `1.2.0` refs remain (all bumped to 2.0.0) +- **Verify:** `test "$(ls commands/*.md | wc -l | tr -d ' ')" = "24" && grep -q '"version": "2\\.0\\.0"' .claude-plugin/plugin.json && grep -q '^# LinkedIn Thought Leadership Plugin (v2\\.0\\.0)' CLAUDE.md && grep -q 'version-2\\.0\\.0-blue' README.md && grep -q '^## \\[2\\.0\\.0\\]' CHANGELOG.md` → expected: command count is **exactly 24**; every target file carries an **active** v2.0.0 marker (forward-positive assertion). **Fix v2.0 doc-pass:** original `! grep '1\\.2\\.0'` was overly strict — it would have blocked any release that correctly preserves historical changelog entries. Forward-positive form asserts the actual release intent (active version is 2.0.0) without requiring deletion of changelog history. - **On failure:** revert — `git checkout -- commands/ README.md CLAUDE.md .claude-plugin/ CHANGELOG.md` - **Checkpoint:** `git commit -m "chore(linkedin): v2.0.0 — import trim, router gating, full doc pass (S20)"` - **Manifest:** @@ -844,9 +844,9 @@ End-to-end / cross-step checks (per-step Manifests run automatically during exec - [ ] **Antakelse 2 (fonts resolve via `__dirname`, not fallback):** `cd /tmp && node /render/build-pdf.mjs ` produces a PDF embedding Newsreader/Inter (inspect PDF metadata / visual) — `[OPERATØR]` visual confirm - [ ] `node --test 'agents/__tests__/*.test.mjs'` → fixture-lint tests pass - [ ] `test "$(ls commands/*.md | wc -l | tr -d ' ')" = "24"` → command count is exactly 24 (27 − 5 removed + 2 added) -- [ ] `ls agents/*.md | grep -v README | wc -l` → 16 (content-tracker, personalization-scorer, performance-reporter, comment-strategist removed; fact-checker, persona-reviewer added) +- [ ] `ls agents/*.md | grep -v README | wc -l` → **14** (content-tracker, personalization-scorer, performance-reporter, comment-strategist removed = −4; fact-checker, persona-reviewer added = +2; net 16 − 4 + 2 = 14). **Fix v2.0 doc-pass:** the original "16" was the pre-S20 figure carried over by mistake. **Correction:** S14 moved `agents/README.md` into the per-agent files, so `agents/README.md` no longer exists; the `grep -v README` filter is a no-op but harmless. - [ ] `grep -rn '1\.2\.0' .claude-plugin/plugin.json CLAUDE.md README.md CHANGELOG.md` → zero matches (all bumped to 2.0.0) -- [ ] `grep -rn '/linkedin:templates\|/linkedin:publish\|/linkedin:authority\|/linkedin:collab\|/linkedin:speaking' commands/ agents/ skills/ hooks/ README.md CLAUDE.md agents/README.md` → zero stray route-refs to removed commands +- [ ] `grep -rEn '/linkedin:(templates|publish|authority|collab|speaking)\b|commands/(templates|publish|authority|collab|speaking)\.md|`:(templates|publish|authority|collab|speaking)`' commands/ agents/ skills/ hooks/ README.md CLAUDE.md` → zero stray route-refs to removed commands. **Fix v2.0 doc-pass:** original target set included `agents/README.md` (file removed in S14); extended to also match the shorthand backtick form (`` `:templates` ``, etc.) used in the pillar/skill tables — Step 21 doc-pass uncovered three live shorthand refs in `README.md:294` that the original grep would have missed. - [ ] `python3 hooks/scripts/compile-hooks.py --check` → clean (no drift after hook-ref edits) - [ ] `[OPERATØR]` one real edition produced end-to-end with persona-sweep before lock, reviewed in browser - [ ] All 3 doc levels (plugin README + plugin CLAUDE + root README) reflect v2.0.0 @@ -855,7 +855,7 @@ End-to-end / cross-step checks (per-step Manifests run automatically during exec - **Files to create:** ~13 (newsletter.md, outreach.md, fact-checker.md, persona-reviewer.md, personas.template.md, edition-state.template.json, longform-quality-rules.md, OFL.txt, 4 render scripts under render/ + fonts/, plus test/fixture files) - **Files to modify:** ~15 (multiplatform, linkedin router, quick, calendar, strategy, audit, analyze, import, profile, analytics-interpreter, engagement-coach, 6 skills, agents/README, CLAUDE.md, README.md, plugin.json, CHANGELOG, hook scripts, marketplace docs) -- **Files to remove:** 7 (templates, publish, authority, collab, speaking commands; content-tracker, personalization-scorer, performance-reporter, comment-strategist agents) +- **Files to remove:** **9** = 5 commands (`templates`, `publish`, `authority`, `collab`, `speaking`) + 4 agents (`content-tracker`, `personalization-scorer`, `performance-reporter`, `comment-strategist`). **Fix v2.0 doc-pass:** original "7" was a stale count from an earlier draft that listed only one of the two outreach precursors. The 5 + 4 arithmetic is binding. - **Complexity:** high (21 sessions, multi-session resumption, cross-repo touchpoint, runtime-assumption checkpoint) ## Execution Strategy diff --git a/plugins/linkedin-thought-leadership/references/glossary.md b/plugins/linkedin-thought-leadership/references/glossary.md index 26d9af3..14665a9 100644 --- a/plugins/linkedin-thought-leadership/references/glossary.md +++ b/plugins/linkedin-thought-leadership/references/glossary.md @@ -33,7 +33,7 @@ Systematic application of 8 universal thought leadership angles across the same ### Authority Score Composite metric measuring a creator's established expertise on a topic, derived from posting consistency, engagement quality, profile alignment (360Brew), and network validation. Higher authority unlocks broader distribution. -**Used in:** `commands/authority.md`, `references/algorithm-signals-reference.md` +**Used in:** `commands/strategy.md` (authority building absorbed in v2.0.0), `references/algorithm-signals-reference.md` --- @@ -95,7 +95,7 @@ Prohibited engagement tactics ("Comment YES if...", "Tag someone who...", "Type ### Engagement Pod Coordinated group of accounts that artificially boost each other's posts. Actively detected by LinkedIn; risks shadow-ban and engagement penalty. Warned against in multiple plugin references. -**Used in:** `references/linkedin-growth-playbook-2025-2026.md`, `commands/collab.md`, `agents/network-builder.md` +**Used in:** `references/linkedin-growth-playbook-2025-2026.md`, `commands/outreach.md` (collab absorbed in v2.0.0), `agents/network-builder.md` ### Engagement Quality Hierarchy Weighted valuation system for different engagement types: Saves (10x) > Shares (8x) > Expert Comments (7-9x) > 15+ word comments (2.5x) > Short comments (1x) > Reactions (0.2x). Quality over quantity. @@ -179,7 +179,7 @@ Algorithm penalty of -25-40% reach for external links placed in the post body. L ### Network Tiers Three-level connection classification: **Tier 1** (Inner Circle, 5-10 people, daily engagement), **Tier 2** (Active Network, 2-3x weekly engagement), **Tier 3** (Extended Network, monthly engagement). Used for strategic resource allocation. -**Used in:** `agents/network-builder.md`, `commands/collab.md` +**Used in:** `agents/network-builder.md`, `commands/outreach.md` (collab absorbed in v2.0.0) --- diff --git a/plugins/linkedin-thought-leadership/references/scheduling-strategy.md b/plugins/linkedin-thought-leadership/references/scheduling-strategy.md index 984b8db..8f5fac2 100644 --- a/plugins/linkedin-thought-leadership/references/scheduling-strategy.md +++ b/plugins/linkedin-thought-leadership/references/scheduling-strategy.md @@ -88,5 +88,5 @@ When posts are scheduled via `/linkedin:batch`: 1. Each post gets a `scheduled_date` and `scheduled_time` from this algorithm 2. Entry is added to `assets/drafts/queue.json` 3. Session-start hook shows today's scheduled posts -4. `/linkedin:publish` marks posts as published and updates state +4. `/linkedin:calendar` (publish action) marks posts as published and updates state 5. `/linkedin:calendar` shows the full schedule view diff --git a/plugins/linkedin-thought-leadership/references/trajectory-strategy-adjustments.md b/plugins/linkedin-thought-leadership/references/trajectory-strategy-adjustments.md index 1f210bb..10b8724 100644 --- a/plugins/linkedin-thought-leadership/references/trajectory-strategy-adjustments.md +++ b/plugins/linkedin-thought-leadership/references/trajectory-strategy-adjustments.md @@ -140,7 +140,7 @@ Instead of adding volume, optimize what's working: ### Related Commands - `/linkedin:ab-test` -- optimize what's working -- `/linkedin:authority` -- build signature content +- `/linkedin:strategy` -- build signature content (authority building absorbed in v2.0.0) - `/linkedin:report` -- track continued progress --- @@ -179,8 +179,8 @@ When ahead of schedule, invest in: ### Related Commands - `/linkedin:monetize` -- start monetization planning -- `/linkedin:authority` -- build signature frameworks -- `/linkedin:speaking` -- speaking opportunity pipeline +- `/linkedin:strategy` -- build signature frameworks (authority building absorbed in v2.0.0) +- `/linkedin:outreach` -- speaking opportunity pipeline + collaborations (speaking absorbed in v2.0.0) - `/linkedin:multiplatform` -- expand to other platforms --- @@ -214,7 +214,7 @@ Growth target is met. Strategy shifts from "grow" to "leverage." ### Related Commands - `/linkedin:monetize` -- revenue strategy -- `/linkedin:authority` -- thought leadership deepening +- `/linkedin:strategy` -- thought leadership deepening (authority building absorbed in v2.0.0) - `/linkedin:competitive` -- maintain positioning ---