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.
/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/**`)
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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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 aprivate, non-public repo (PII/tokens/personal-only plugins) on top without
either repo ever touching the other's git history.
What
plugins/<name>/(wasskills/<name>/). A plugin bundles aplugin.jsonplus any mix ofskills/,hooks.json,mcp.json,rules/,commands/,agents/. All 7 existing skills migrated 1:1;the previously-orphaned
delegate-agyskill (no frontmatter, not wiredinto the generator at all) is now a proper
core-essentialsplugin.scripts/generate_plugins.pyrewritten: discovers plugins from one ormore layered
--sourceroots, emitsdist/claude-code/**+.claude-plugin/marketplace.jsonanddist/agy/**, translatinghooks.json/mcp.jsonbetween Claude Code's and agy's real (differing)schemas rather than only fanning out flat skill lists.
--source/--private-repo(+--private-ref,--private-token-env) /--out/--install-local. A private sourcelayers on top of the public one per-plugin, per-file; output defaults to
gitignored
dist-private/whenever more than one source is in play, andnever touches the public repo's tracked paths.
install.shanddescriptions.json— both only ever coveredskills and pre-date the marketplace. Both tools now install the native
way (Claude Code's
/plugin marketplace add, agy'splugins.jsonentries) — documented in the rewritten README.
.gitea/workflows/plugins.yml): path filters moved toplugins/**,added
workflow_dispatchfor a manual re-trigger.Manual Verification Checklist
python3 scripts/generate_plugins.py --checkpasses/plugin marketplace add <this repo>+/plugin install date-time@rootiest-aiinstalls and the skill activates in a real Claude Code sessionagy plugin validate dist/agy/<name>reports[ok]for a plugin you pick, andagyactually loads it via aplugins.jsonentry--source . --source <fixture-dir>produces the expected merged output indist-private/and leaves the publicdist//.claude-plugin/untouchedgeneratejob still runs cleanly on push tomain(path filters now watchplugins/**)