Multi-agent packaging: add Cursor, Devin, opencode, and AGENTS.md adapters - #9
Conversation
…ic AGENTS.md agents Adopt the multi-agent packaging methodology of obra/superpowers: one root-level adapter per harness, all pointing at the same skills/ + data/ tree. - .cursor-plugin/plugin.json — Cursor plugin manifest with a skills pointer at the shared skills/ tree - .devin-plugin/plugin.json — Devin plugin manifest (devin plugins install Securability-Engineering/securable-claude-plugin) - .opencode/INSTALL.md — agent-followable fetch-and-follow install for opencode, driving the existing layout-preserving installer - .agents/INSTALL.md — the same for any AGENTS.md/SKILL.md-conforming agent (Codex, Zed, Amp, ...) - scripts/check_manifests.py — CI lockstep check: every manifest must agree with .claude-plugin/plugin.json on name/version/license, the Cursor skills pointer must resolve, install docs must exist; wired into scripts/run_checks.sh - scripts/build_plugin_zip.sh — release version now stamped into all three manifests, not just the Claude one - README/AGENTS.md — per-agent installation matrix and layout docs - Version 2.2.0 -> 2.3.0 across all manifests Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AcHBYr49Btj8UFuMPPEWud
There was a problem hiding this comment.
Pull request overview
This PR implements a multi-agent packaging layout (à la obra/superpowers) so the repository can be installed into multiple agent harnesses via per-harness “adapters” (manifests or INSTALL docs) while still sharing one canonical skills/ + data/ tree.
Changes:
- Added new per-agent adapters for Cursor, Devin, opencode, and generic AGENTS.md/SKILL.md agents, plus updated documentation to describe installation paths.
- Added
scripts/check_manifests.pyand wired it intoscripts/run_checks.shto keep per-agent manifests in lockstep with the canonical Claude manifest. - Updated release packaging (
scripts/build_plugin_zip.sh) to stamp the release version into Cursor/Devin manifests in addition to the canonical Claude manifest.
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| scripts/run_checks.sh | Runs the new manifest lockstep check and validates the added manifest JSON files. |
| scripts/check_manifests.py | New CI guard to enforce cross-manifest consistency and validate resource pointers / install docs. |
| scripts/build_plugin_zip.sh | Extends release stamping to Cursor/Devin manifests during ZIP build. |
| README.md | Documents the new multi-agent adapter layout and installation instructions per harness. |
| AGENTS.md | Updates repository layout and tool-compatibility documentation to include new adapters. |
| .opencode/INSTALL.md | New agent-followable install instructions for opencode. |
| .agents/INSTALL.md | New agent-followable install instructions for general AGENTS.md/SKILL.md harnesses. |
| .devin-plugin/plugin.json | New Devin plugin manifest. |
| .cursor-plugin/plugin.json | New Cursor plugin manifest with skills pointer. |
| .claude-plugin/plugin.json | Version bump to 2.3.0 (canonical manifest). |
| .claude-plugin/marketplace.json | Version bump to 2.3.0 for marketplace entry. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| for field in ["name", "version", "license"]: | ||
| if entry.get(field) != canonical.get(field): | ||
| errors.append( | ||
| f".claude-plugin/marketplace.json: plugins[0].{field} " | ||
| f"{entry.get(field)!r} != {CANONICAL} {field} {canonical.get(field)!r}" | ||
| ) |
There was a problem hiding this comment.
Implemented in 6119005: .claude-plugin/marketplace.json lockstep validation now checks repository alongside the other canonical fields.
| # Resource pointers resolve against the plugin root (the repo root), | ||
| # per the Claude/Cursor plugin convention — not the manifest's own dir. | ||
| skills = manifest.get("skills") | ||
| if skills is not None: | ||
| skills_dir = (REPO_ROOT / skills).resolve() | ||
| if not skills_dir.is_dir() or not list(skills_dir.glob("*/SKILL.md")): | ||
| errors.append(f"{rel}: skills path {skills!r} has no */SKILL.md") |
There was a problem hiding this comment.
Implemented in 6119005: skills path validation now rejects paths that resolve outside the repository root before checking for */SKILL.md.
| for rel in (".cursor-plugin/plugin.json", ".devin-plugin/plugin.json"): | ||
| manifest_path = os.path.join(plugin_dir, rel) | ||
| if not os.path.isfile(manifest_path): | ||
| continue | ||
| with open(manifest_path, "r", encoding="utf-8") as f: | ||
| manifest = json.load(f) | ||
| manifest["version"] = version | ||
| with open(manifest_path, "w", encoding="utf-8") as f: | ||
| json.dump(manifest, f, indent=2) | ||
| f.write("\n") |
There was a problem hiding this comment.
Implemented in 6119005: ZIP packaging now stamps .claude-plugin/marketplace.json plugin version so packaged manifests stay version-consistent.
Co-authored-by: Xcaciv <23732819+Xcaciv@users.noreply.github.com>
Implements the obra/superpowers multi-agent packaging model: one skills tree, one adapter per agent harness. Each supported agent now gets a root-level adapter (manifest or agent-followable install instructions), and all adapters point at the same
skills/+data/tree.Key changes
New per-agent adapters:
.cursor-plugin/plugin.json— Cursor plugin manifest withskillspointer.devin-plugin/plugin.json— Devin plugin manifest.opencode/INSTALL.md— Agent-followable install instructions for opencode.agents/INSTALL.md— Agent-followable install instructions for any AGENTS.md/SKILL.md agent (Codex, Zed, Amp, etc.)Manifest lockstep enforcement:
scripts/check_manifests.pyvalidates that all per-agent manifests stay in sync onname,version,license, andrepositoryskillspath) resolve inside the reposcripts/run_checks.shRelease automation:
scripts/build_plugin_zip.shnow stamps the release version into.cursor-plugin/plugin.jsonand.devin-plugin/plugin.jsonalongside the canonical.claude-plugin/plugin.jsonDocumentation:
Implementation details
.claude-plugin/plugin.jsonremains the canonical version source; all other manifests are kept in lockstep by CIskills/,data/,plays/,templates/,schema/,core/, andrules/is load-bearing for relative references inside skill definitionsscripts/check_manifests.pyexits 0 when consistent, 1 with one line per problem otherwisehttps://claude.ai/code/session_01AcHBYr49Btj8UFuMPPEWud