diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 3f7b1b5..273851e 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "linkedin-studio", - "version": "0.5.2", + "version": "0.5.3", "description": "LinkedIn Studio — full-spectrum LinkedIn content engine: feed posts, carousels, video scripts, and long-form newsletter editions, with the 2026 relevance-ranking model baked in. v4.0.0 is an audit-remediation release (Voyage Phase 0–3): every user-facing claim is made honest or removed, all 11 previously-orphaned agents are wired (→ 19 agents), a `/linkedin:firsthour` post-publish command is added (→ 27 commands), the algorithm-signal claims are reconciled to one sourced statement (no unpublishable model name or date), short-form de-AI and video quality gates are added, and the structure lint is rebuilt to guard the real layout plus version/count/stat consistency. Breaking: the newly-wired agents register only on reinstall/reload, and this consolidates the v3.0.0 identity break (slug, agent namespace `linkedin-studio:`, state-file path `~/.claude/linkedin-studio.local.md`). v3.1.0 added the cold adversarial review package (`/linkedin:headless-review` + Step 6.5 + `/linkedin:pivot` + per-artifact personas); the `/linkedin:*` commands are unchanged. v4.1.0 adds a journey layer: two guided front-doors (`/linkedin:create`, `/linkedin:measure`) plus a router re-tiered into five journeys (Start · Create · Engage · Measure · Grow), with the 27 existing commands kept as the execution tier (→ 29 commands; additive, reload registers the two new commands).", "author": { "name": "Kjell Tore Guttormsen" diff --git a/CHANGELOG.md b/CHANGELOG.md index e549bb2..cb13551 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ 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). +## [0.5.3] - 2026-06-24 + +### Changed — registration hygiene: agent fasit fixtures moved out of `agents/` + +**Stops Claude Code from registering 6 spurious agents.** The six long-form-review fasit fixtures lived in `agents/fixtures/*-cases.md`; because Claude Code scans `agents/` recursively, each was registered as a junk `fixtures:*` agent (`fixtures:content-reviewer-cases`, …). They are test fixtures, not capabilities. **Count-neutral** (no real agent/command/reference/skill change; `ls agents/*.md` still 19) — pure namespace hygiene. + +- **Moved** the 6 fasit fixtures `agents/fixtures/*-cases.md` → `tests/fixtures/*-cases.md`, and their 6 lint tests `agents/__tests__/*-fixture.test.mjs` → `tests/*-fixture.test.mjs` (co-located; each test's relative fixture path retargeted `../fixtures/` → `./fixtures/`). `agents/fixtures/` and `agents/__tests__/` are now removed. +- **Retargeted** the 5 agent fasit-refs (`content`/`language`/`persona`/`editorial`/`fact-reviewer`) from `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/…` to `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/…`. +- **Tests.** Fixture-lint 35/35 at the new path (`node --test 'tests/*.test.mjs'`); render 20/20, hooks 139/139 unaffected; gate `scripts/test-runner.sh` green (counts + version-consistency). Reinstall/reload required for the 6 spurious agents to disappear from the registry. + ## [0.5.2] - 2026-06-23 ### Added — SB-S2: the evolution loop (second-brain arc) diff --git a/CLAUDE.md b/CLAUDE.md index bd81150..961271c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,4 +1,4 @@ -# LinkedIn Studio Plugin (v0.5.2) +# LinkedIn Studio Plugin (v0.5.3) > **Version re-baseline (2026-05-31) · M0 landed (2026-06-18, v0.5.0).** Previously numbered 1.0.0–4.1.0; those were pre-release iterations. The honest maturity is **v0.5.0** — **the architecture workstream (M0) is complete: user data now lives in a per-user data dir (`${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/`) resolved through one seam per runtime, with automatic idempotent migration on session-start** (see `references/data-path-convention.md`). No command has yet passed the hardening quality-gate, command testing is incomplete, and there is no GUI. The remaining path to **v1.0.0** is three workstreams: **hardening** (every command through the quality-gate), **command testing**, and a **GUI**. The development narrative below is preserved as history. diff --git a/README.md b/README.md index 5208de4..b355d54 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ *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-0.5.2-blue) +![Version](https://img.shields.io/badge/version-0.5.3-blue) ![Platform](https://img.shields.io/badge/platform-Claude_Code_Plugin-purple) ![Commands](https://img.shields.io/badge/commands-29-green) ![Agents](https://img.shields.io/badge/agents-19-orange) diff --git a/agents/content-reviewer.md b/agents/content-reviewer.md index b598994..232e481 100644 --- a/agents/content-reviewer.md +++ b/agents/content-reviewer.md @@ -283,6 +283,6 @@ Read these for the contract and the pipeline position: lock (Step 8). - `${CLAUDE_PLUGIN_ROOT}/references/longform-quality-rules.md` — the broad quality pass; this agent is the *finer* argument-integrity gate that runs cold after it. -- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/content-reviewer-cases.md` — fasit +- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/content-reviewer-cases.md` — fasit fixture: the Del 4 (Security Champions, Maskinrommet, 2026-05-29) worked cases mapping real argument defects to C1–C5 + severities. diff --git a/agents/editorial-reviewer.md b/agents/editorial-reviewer.md index 33f6e79..9487abe 100644 --- a/agents/editorial-reviewer.md +++ b/agents/editorial-reviewer.md @@ -276,6 +276,6 @@ Read these for the contract and the pipeline position: the gate that runs *after* this one; the role boundary is craft vs. response. - `${CLAUDE_PLUGIN_ROOT}/agents/fact-checker.md` — the Step 5 sweep (truth); this agent runs *after* it on the fact-checked draft. -- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/editorial-reviewer-cases.md` — fasit +- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/editorial-reviewer-cases.md` — fasit fixture: the Del 4 v5 gold-standard (KTG's eight editorial points mapped to the two axes + severities). diff --git a/agents/fact-reviewer.md b/agents/fact-reviewer.md index 949dd1b..d211cb1 100644 --- a/agents/fact-reviewer.md +++ b/agents/fact-reviewer.md @@ -349,6 +349,6 @@ Read these for the package, the boundary, and the pipeline position: for the five-archetype cold adversarial-review package. - `${CLAUDE_PLUGIN_ROOT}/commands/newsletter.md` — Step 6.5 (where this agent runs, cold, on the frozen draft) and Step 8 (lock + pivot-detection). -- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/fact-reviewer-cases.md` — fasit fixture: +- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/fact-reviewer-cases.md` — fasit fixture: the six Del 4 (Security Champions) worked cases mapped to F1–F4 + risk sort + the pivot-premise rationale. diff --git a/agents/language-reviewer.md b/agents/language-reviewer.md index 8a511ac..87ed032 100644 --- a/agents/language-reviewer.md +++ b/agents/language-reviewer.md @@ -314,6 +314,6 @@ Read these for the boundary and the pipeline position: - `${CLAUDE_PLUGIN_ROOT}/references/longform-quality-rules.md` — the broad quality pass; rule 3 (AI-slop ban-list) is `voice-scrubber`'s; your axis is the cold Norwegian-language re-read, not the de-AI ban-list. -- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/language-reviewer-cases.md` — fasit +- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/language-reviewer-cases.md` — fasit fixture: the Del 4 / F5 language blind spots (the «Vi» vs «Vi i Nav» quote error, anglicisms, repetitions) mapped to L1–L5 + severities. diff --git a/agents/persona-reviewer.md b/agents/persona-reviewer.md index 2e71d70..e413e8d 100644 --- a/agents/persona-reviewer.md +++ b/agents/persona-reviewer.md @@ -394,4 +394,4 @@ the skeleton + pitches (NOT prose — there is none yet) and re-runs this sweep. Read these files for the persona contract and pipeline position: - `${CLAUDE_PLUGIN_ROOT}/config/personas.template.md` — the reader persona library, five-field contract, primær rule, two-mode usage -- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/persona-reviewer-cases.md` — fasit fixture: one persona + sample draft + six axes + both modes +- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/persona-reviewer-cases.md` — fasit fixture: one persona + sample draft + six axes + both modes diff --git a/agents/__tests__/content-reviewer-fixture.test.mjs b/tests/content-reviewer-fixture.test.mjs similarity index 97% rename from agents/__tests__/content-reviewer-fixture.test.mjs rename to tests/content-reviewer-fixture.test.mjs index 5cadc85..5439c8f 100644 --- a/agents/__tests__/content-reviewer-fixture.test.mjs +++ b/tests/content-reviewer-fixture.test.mjs @@ -13,7 +13,7 @@ import { fileURLToPath } from 'node:url'; // [GATE]/[OPERATØR], never self-certified here. const FIXTURE_PATH = fileURLToPath( - new URL('../fixtures/content-reviewer-cases.md', import.meta.url) + new URL('./fixtures/content-reviewer-cases.md', import.meta.url) ); const fixture = readFileSync(FIXTURE_PATH, 'utf8'); diff --git a/agents/__tests__/editorial-reviewer-fixture.test.mjs b/tests/editorial-reviewer-fixture.test.mjs similarity index 97% rename from agents/__tests__/editorial-reviewer-fixture.test.mjs rename to tests/editorial-reviewer-fixture.test.mjs index ba39674..4c73ed9 100644 --- a/agents/__tests__/editorial-reviewer-fixture.test.mjs +++ b/tests/editorial-reviewer-fixture.test.mjs @@ -12,7 +12,7 @@ import { fileURLToPath } from 'node:url'; // never self-certified here. const FIXTURE_PATH = fileURLToPath( - new URL('../fixtures/editorial-reviewer-cases.md', import.meta.url) + new URL('./fixtures/editorial-reviewer-cases.md', import.meta.url) ); const fixture = readFileSync(FIXTURE_PATH, 'utf8'); diff --git a/agents/__tests__/fact-checker-fixture.test.mjs b/tests/fact-checker-fixture.test.mjs similarity index 97% rename from agents/__tests__/fact-checker-fixture.test.mjs rename to tests/fact-checker-fixture.test.mjs index fdb1841..ddab72d 100644 --- a/agents/__tests__/fact-checker-fixture.test.mjs +++ b/tests/fact-checker-fixture.test.mjs @@ -11,7 +11,7 @@ import { fileURLToPath } from 'node:url'; // self-certified here. const FIXTURE_PATH = fileURLToPath( - new URL('../fixtures/fact-checker-cases.md', import.meta.url) + new URL('./fixtures/fact-checker-cases.md', import.meta.url) ); const VERDICTS = ['🟢', '🔴', '🟡']; diff --git a/agents/__tests__/fact-reviewer-fixture.test.mjs b/tests/fact-reviewer-fixture.test.mjs similarity index 97% rename from agents/__tests__/fact-reviewer-fixture.test.mjs rename to tests/fact-reviewer-fixture.test.mjs index 83764a6..52d1bcc 100644 --- a/agents/__tests__/fact-reviewer-fixture.test.mjs +++ b/tests/fact-reviewer-fixture.test.mjs @@ -13,7 +13,7 @@ import { fileURLToPath } from 'node:url'; // [GATE]/[OPERATØR], never self-certified here. const FIXTURE_PATH = fileURLToPath( - new URL('../fixtures/fact-reviewer-cases.md', import.meta.url) + new URL('./fixtures/fact-reviewer-cases.md', import.meta.url) ); const fixture = readFileSync(FIXTURE_PATH, 'utf8'); diff --git a/agents/fixtures/content-reviewer-cases.md b/tests/fixtures/content-reviewer-cases.md similarity index 100% rename from agents/fixtures/content-reviewer-cases.md rename to tests/fixtures/content-reviewer-cases.md diff --git a/agents/fixtures/editorial-reviewer-cases.md b/tests/fixtures/editorial-reviewer-cases.md similarity index 100% rename from agents/fixtures/editorial-reviewer-cases.md rename to tests/fixtures/editorial-reviewer-cases.md diff --git a/agents/fixtures/fact-checker-cases.md b/tests/fixtures/fact-checker-cases.md similarity index 100% rename from agents/fixtures/fact-checker-cases.md rename to tests/fixtures/fact-checker-cases.md diff --git a/agents/fixtures/fact-reviewer-cases.md b/tests/fixtures/fact-reviewer-cases.md similarity index 100% rename from agents/fixtures/fact-reviewer-cases.md rename to tests/fixtures/fact-reviewer-cases.md diff --git a/agents/fixtures/language-reviewer-cases.md b/tests/fixtures/language-reviewer-cases.md similarity index 100% rename from agents/fixtures/language-reviewer-cases.md rename to tests/fixtures/language-reviewer-cases.md diff --git a/agents/fixtures/persona-reviewer-cases.md b/tests/fixtures/persona-reviewer-cases.md similarity index 100% rename from agents/fixtures/persona-reviewer-cases.md rename to tests/fixtures/persona-reviewer-cases.md diff --git a/agents/__tests__/language-reviewer-fixture.test.mjs b/tests/language-reviewer-fixture.test.mjs similarity index 97% rename from agents/__tests__/language-reviewer-fixture.test.mjs rename to tests/language-reviewer-fixture.test.mjs index 8c76f93..209369c 100644 --- a/agents/__tests__/language-reviewer-fixture.test.mjs +++ b/tests/language-reviewer-fixture.test.mjs @@ -13,7 +13,7 @@ import { fileURLToPath } from 'node:url'; // the fasit directions is [GATE]/[OPERATØR], never self-certified here. const FIXTURE_PATH = fileURLToPath( - new URL('../fixtures/language-reviewer-cases.md', import.meta.url) + new URL('./fixtures/language-reviewer-cases.md', import.meta.url) ); const fixture = readFileSync(FIXTURE_PATH, 'utf8'); diff --git a/agents/__tests__/persona-reviewer-fixture.test.mjs b/tests/persona-reviewer-fixture.test.mjs similarity index 97% rename from agents/__tests__/persona-reviewer-fixture.test.mjs rename to tests/persona-reviewer-fixture.test.mjs index 1dedf0c..e5e55de 100644 --- a/agents/__tests__/persona-reviewer-fixture.test.mjs +++ b/tests/persona-reviewer-fixture.test.mjs @@ -12,7 +12,7 @@ import { fileURLToPath } from 'node:url'; // never self-certified here. const FIXTURE_PATH = fileURLToPath( - new URL('../fixtures/persona-reviewer-cases.md', import.meta.url) + new URL('./fixtures/persona-reviewer-cases.md', import.meta.url) ); const fixture = readFileSync(FIXTURE_PATH, 'utf8');