v2.20.0
Added
- Agent Plugins support — the repository is now a conformant Agent Plugins 1.0.0 package, so its skills load in any client implementing the standard rather than only in Claude Code. A root
plugin.jsonmanifest declares the plugin against the canonical1.0.0schema, andscripts/sync_skills.pymirrors it into.claude/andscientific_writer/.claude/so each bundled payload is a loadable plugin root of its own — apip install scientific-writeris enough to point another client at the skills..claude-plugin/marketplace.jsonis unchanged and still drives Claude Code. See docs/AGENT_PLUGINS.md. scripts/validate_agent_plugin.py— validates any plugin root against the specification: the closedplugin.jsonandmcp.jsonschemas, Agent Skills frontmatter for every discovered skill, plugin-root path containment, MCP transport and command rules, and${PLUGIN_ROOT}/${PLUGIN_DATA}placeholder expansion. It is dependency-free and offline — the canonical schemas are vendored underscripts/schemas/agent-plugins/1.0.0/, as §5.2 requires of clients — and supporting a future spec version means dropping in a new schema directory. CI runs it on every push, and it is the first thing that reports the pre-existingskills/document-skillsbundle as undiscoverable (§7.1 forbids recursing past immediate children ofskills/, sodocx,pdf,pptx, andxlsxare invisible to every client, Claude Code included; the fix belongs upstream in the hash-locked skills repository).AGENTS.mdalongsideCLAUDE.md— the repository root now carriesAGENTS.mdas a generated, byte-identical mirror ofCLAUDE.md, enforced byscripts/sync_skills.py --checkso the two cannot drift./claude-scientific-writer:scientific-writer-initwrites both files into a user's project fromtemplates/CLAUDE.scientific-writer.mdand the newtemplates/AGENTS.scientific-writer.md..agents/alongside.claude/—load_system_instructions()now searches.claude/then.agents/forWRITER.md,AGENTS.md, andCLAUDE.md, then falls back to rootAGENTS.mdandCLAUDE.md, so a project that already documents its agents in either layout is honored.setup_claude_skills()still installs into.claude/(the Claude Agent SDK discovers skills there) and now also refreshes.agents/when the project already has one, and it accepts a bundled payload shipped under either name.- GitHub releases are created by the release workflow —
release.ymlnow creates the GitHub release from theCHANGELOG.mdsection for the tag, after PyPI publishing succeeds. Previously the workflow only published to PyPI and release entries were written by hand, so the releases page drifted (v2.19.0shipped to PyPI while the page still showedv2.18.0as latest, and several earlier versions have no entry at all). The step is idempotent: re-running a tag refreshes the notes instead of failing. scripts/changelog_notes.py— extracts the release body for one version fromCHANGELOG.mdand appends a compare link to the previous release. Run it to preview what a tag will publish:uv run scripts/changelog_notes.py X.Y.Z.
Changed
- README section for non-Claude agents rewritten — "Use with Gemini CLI and Other Agents" is now "Use with Antigravity, Pi, and Other Agents", leads with the portable Agent Plugins path, and treats hand-loading a skill as the fallback. The worked example no longer writes to a vendor-specific config path; it appends the skill body to the project's
AGENTS.md. It also strips YAML frontmatter correctly — the oldtail -n +6leakedmetadata:,version,skill-author, and the closing---into the prompt, because the frontmatter inskills/scientific-writing/SKILL.mdcloses at line 9. - A changelog entry is now required to release — the workflow extracts the notes before running any checks, so a tag whose version has no
## [X.Y.Z]section (or an empty one) fails immediately, rather than after the package is already on PyPI.docs/RELEASING.mddocuments this, along with why the localscripts/publish.pypath does not produce a GitHub release.
Full Changelog: v2.19.0...v2.20.0