feat: multi-extension plugin framework for Claude Code and agy #1

Merged
rootiest merged 1 commits from feat-plugin-marketplace-framework into main 2026-08-24 23:22:50 +00:00
Owner

Why

The repo only supported one extension type (skills) and one real install
path (a curl script duplicating what the Claude Code marketplace already
does). The goal is a single source tree that produces a real plugin
marketplace — skills, MCP servers, hooks, rules, commands, agents — for
both Claude Code and the Antigravity CLI (agy), plus a way to layer a
private, non-public repo (PII/tokens/personal-only plugins) on top without
either repo ever touching the other's git history.

What

  • New SSoT: plugins/<name>/ (was skills/<name>/). A plugin bundles a
    plugin.json plus any mix of skills/, hooks.json, mcp.json,
    rules/, commands/, agents/. All 7 existing skills migrated 1:1;
    the previously-orphaned delegate-agy skill (no frontmatter, not wired
    into the generator at all) is now a proper core-essentials plugin.
  • scripts/generate_plugins.py rewritten: discovers plugins from one or
    more layered --source roots, emits dist/claude-code/** +
    .claude-plugin/marketplace.json and dist/agy/**, translating
    hooks.json/mcp.json between Claude Code's and agy's real (differing)
    schemas rather than only fanning out flat skill lists.
  • Private overlay build: --source / --private-repo (+ --private-ref,
    --private-token-env) / --out / --install-local. A private source
    layers on top of the public one per-plugin, per-file; output defaults to
    gitignored dist-private/ whenever more than one source is in play, and
    never touches the public repo's tracked paths.
  • Dropped install.sh and descriptions.json — both only ever covered
    skills and pre-date the marketplace. Both tools now install the native
    way (Claude Code's /plugin marketplace add, agy's plugins.json
    entries) — documented in the rewritten README.
  • CI (.gitea/workflows/plugins.yml): path filters moved to plugins/**,
    added workflow_dispatch for a manual re-trigger.

Manual Verification Checklist

  • python3 scripts/generate_plugins.py --check passes
  • /plugin marketplace add <this repo> + /plugin install date-time@rootiest-ai installs and the skill activates in a real Claude Code session
  • agy plugin validate dist/agy/<name> reports [ok] for a plugin you pick, and agy actually loads it via a plugins.json entry
  • A dry run of --source . --source <fixture-dir> produces the expected merged output in dist-private/ and leaves the public dist//.claude-plugin/ untouched
  • CI's generate job still runs cleanly on push to main (path filters now watch plugins/**)
## Why The repo only supported one extension type (skills) and one real install path (a curl script duplicating what the Claude Code marketplace already does). The goal is a single source tree that produces a real plugin marketplace — skills, MCP servers, hooks, rules, commands, agents — for both Claude Code and the Antigravity CLI (`agy`), plus a way to layer a private, non-public repo (PII/tokens/personal-only plugins) on top without either repo ever touching the other's git history. ## What - New SSoT: `plugins/<name>/` (was `skills/<name>/`). A plugin bundles a `plugin.json` plus any mix of `skills/`, `hooks.json`, `mcp.json`, `rules/`, `commands/`, `agents/`. All 7 existing skills migrated 1:1; the previously-orphaned `delegate-agy` skill (no frontmatter, not wired into the generator at all) is now a proper `core-essentials` plugin. - `scripts/generate_plugins.py` rewritten: discovers plugins from one or more layered `--source` roots, emits `dist/claude-code/**` + `.claude-plugin/marketplace.json` and `dist/agy/**`, translating `hooks.json`/`mcp.json` between Claude Code's and agy's real (differing) schemas rather than only fanning out flat skill lists. - Private overlay build: `--source` / `--private-repo` (+ `--private-ref`, `--private-token-env`) / `--out` / `--install-local`. A private source layers on top of the public one per-plugin, per-file; output defaults to gitignored `dist-private/` whenever more than one source is in play, and never touches the public repo's tracked paths. - Dropped `install.sh` and `descriptions.json` — both only ever covered skills and pre-date the marketplace. Both tools now install the native way (Claude Code's `/plugin marketplace add`, agy's `plugins.json` entries) — documented in the rewritten README. - CI (`.gitea/workflows/plugins.yml`): path filters moved to `plugins/**`, added `workflow_dispatch` for a manual re-trigger. ## Manual Verification Checklist - [x] `python3 scripts/generate_plugins.py --check` passes - [x] `/plugin marketplace add <this repo>` + `/plugin install date-time@rootiest-ai` installs and the skill activates in a real Claude Code session - [x] `agy plugin validate dist/agy/<name>` reports `[ok]` for a plugin you pick, and `agy` actually loads it via a `plugins.json` entry - [x] A dry run of `--source . --source <fixture-dir>` produces the expected merged output in `dist-private/` and leaves the public `dist/`/`.claude-plugin/` untouched - [x] CI's `generate` job still runs cleanly on push to `main` (path filters now watch `plugins/**`)
rootiest added 1 commit 2026-08-24 23:21:26 +00:00
feat: restructure into a multi-extension plugin framework for Claude Code and agy
Generate plugin manifests / validate (pull_request) Successful in 7s
Generate plugin manifests / generate (pull_request) Skipped
bfd96285ee
Replace the skills-only SSoT (skills/<name>/SKILL.md) with plugins/<name>/,
where a plugin can bundle skills, MCP servers, lifecycle hooks, rules,
commands, and agents. scripts/generate_plugins.py now discovers plugins
from one or more layered --source roots and emits real per-target trees
(dist/claude-code/** + .claude-plugin/marketplace.json, dist/agy/**),
translating hooks.json/mcp.json between Claude Code's and agy's actual
schemas instead of only fanning out flat skill lists.

Adds a private-overlay build path (--source/--private-repo/--out/
--install-local) so a second, non-public repo (PII, tokens, personal-only
plugins) can extend or override the public plugin set without either repo
touching the other's history — private builds default to a gitignored
dist-private/ and never land in tracked output.

Drops install.sh and descriptions.json: both only ever covered skills and
pre-date the native plugin marketplace; both tools now install the plugin
marketplace the documented way (Claude Code's /plugin marketplace add,
agy's plugins.json entries). CI path filters move to plugins/**, and the
workflow gains workflow_dispatch for a manual re-trigger.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YVWWAnvR5TDQzmfY3RXG9
rootiest merged commit 4d9ca3cef1 into main 2026-08-24 23:22:50 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rootiest/rootiest-ai#1