{
  "id": "agent-plugin-authoring",
  "type": "loadout",
  "title": "Author plugins for Claude Code and Antigravity",
  "summary": "Build one plugin for Claude Code and Antigravity from a single source tree, pin its MCP servers, and pass claude plugin validate --strict before anyone installs.",
  "description": "Claude Code and Antigravity both install plugins made of skills, subagents and MCP servers, but the manifests differ. Claude Code reads .claude-plugin/plugin.json and .mcp.json with url. Antigravity reads a root plugin.json whose schema allows only a name and description, and mcp_config.json with serverUrl. It has no validate command. This loadout keeps one portable source tree and builds both layouts plus a local marketplace. A checker catches extra manifest fields, reserved names, unpinned npx servers, http remotes, literal credentials and drift between the builds. The verifier builds the example plugin and runs Claude Code 2.1.302's own validate --strict on the plugin and marketplace, with no account needed. It then confirms a broken source fails both checkers. It pairs with the agent-extension-vetting loadout for the reviewer's side.\n",
  "highlights": [
    "One plugin-src tree builds both Claude Code and Antigravity layouts",
    "Antigravity manifest checked against its documented schema (it has no validate command)",
    "claude plugin validate --strict on the plugin and marketplace, no sign-in",
    "Exact MCP pins, https remotes, no literal credentials in env or headers",
    "Release notes: version bumps and sha pins for GitHub marketplace sources"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "Claude Code docs: plugin manifest reference",
      "url": "https://code.claude.com/docs/en/plugins/manifest-reference"
    },
    {
      "title": "Claude Code docs: add components to a plugin",
      "url": "https://code.claude.com/docs/en/plugins/components"
    },
    {
      "title": "Claude Code docs: plugin commands (plugin validate)",
      "url": "https://code.claude.com/docs/en/plugins/cli-reference"
    },
    {
      "title": "Claude Code docs: marketplace reference (ref and sha)",
      "url": "https://code.claude.com/docs/en/plugins/marketplace-reference"
    },
    {
      "title": "Google Antigravity docs: plugins",
      "url": "https://antigravity.google/docs/plugins"
    },
    {
      "title": "Google Antigravity docs: custom subagents",
      "url": "https://antigravity.google/docs/subagents"
    },
    {
      "title": "Google Antigravity docs: MCP configuration",
      "url": "https://antigravity.google/docs/mcp"
    }
  ],
  "categories": [
    "ai-agents",
    "workflow"
  ],
  "stacks": [
    "mcp",
    "nodejs"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Rules for building and releasing a plugin for Claude Code and Antigravity from one source tree.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "antigravity-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/latest/AGENTS.md",
      "bytes": 1804,
      "lang": "markdown",
      "content": "# AGENTS.md: authoring agent plugins (Claude Code and Antigravity)\n\nThis repository builds a plugin that installs in Claude Code and in Antigravity from one source tree. A plugin runs\nas the user in every session where it is enabled: its MCP servers start, its hooks fire and its skill descriptions\nsit in context. Treat each change like a dependency release.\n\n## How to work\n- Use the `build-agent-plugin` skill to build both layouts and check them. Edit `plugin-src/`, never the built\n  output.\n- Claude Code and Antigravity differ: manifest location and fields, MCP file name, remote URL key, hook format and\n  tool names. Keep shared skills and agents portable (frontmatter `name` and `description` only).\n- Check facts against the official docs (code.claude.com/docs/en/plugins, antigravity.google/docs/plugins). Antigravity has no\n  `plugin validate` command. Its manifest allows only `$schema`, `name` and `description`.\n\n## Rules\n- MCP servers are pinned to exact versions (`npx -y pkg@1.2.3`, `uvx pkg==1.2.3`); remote servers use https.\n- No credentials in any plugin file. In Claude Code, use a sensitive `userConfig` option (`${user_config.KEY}`); in\n  Antigravity, use an environment variable (`${VAR}`).\n- Hooks are opt-in per agent and reviewed line by line. Never add a hook that sends data off the machine or edits\n  agent settings.\n- Do not name a plugin `claude-*`, `anthropic-*` or anything that passes as an official plugin.\n- Do not install, enable or publish a plugin, or add a marketplace, without the user's go-ahead.\n\n## Done means\n- The skill's checker prints `plugins ok`, and `claude plugin validate --strict` passes for the plugin and the\n  marketplace.\n- `version` is bumped, the changelog says what changed, and the README lists every MCP server, hook and network\n  call.\n"
    },
    {
      "path": "CLAUDE.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Claude Code.",
      "skill": null,
      "agent": "claude-code",
      "install_to": {
        "claude-code": "CLAUDE.md",
        "codex": null,
        "cursor": null,
        "gemini-cli": null,
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/latest/CLAUDE.md",
      "bytes": 408,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n\n- Skills from this loadout live in `.claude/skills/`: `build-agent-plugin`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Author plugins for Claude Code and Antigravity\" v1.0.0 — https://loadout.jnw-it.com/loadouts/agent-plugin-authoring/ -->\n"
    },
    {
      "path": "GEMINI.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Gemini CLI.",
      "skill": null,
      "agent": "gemini-cli",
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": null,
        "gemini-cli": "GEMINI.md",
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/latest/GEMINI.md",
      "bytes": 409,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n\n- Skills from this loadout live in `.agents/skills/`: `build-agent-plugin`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Author plugins for Claude Code and Antigravity\" v1.0.0 — https://loadout.jnw-it.com/loadouts/agent-plugin-authoring/ -->\n"
    },
    {
      "path": "skills/build-agent-plugin/SKILL.md",
      "role": "skill",
      "description": "Layout differences, build, check, local test and release.",
      "skill": "build-agent-plugin",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/build-agent-plugin/SKILL.md",
        "codex": ".agents/skills/build-agent-plugin/SKILL.md",
        "cursor": ".agents/skills/build-agent-plugin/SKILL.md",
        "gemini-cli": ".agents/skills/build-agent-plugin/SKILL.md",
        "antigravity-cli": ".agents/skills/build-agent-plugin/SKILL.md",
        "copilot": ".agents/skills/build-agent-plugin/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/latest/skills/build-agent-plugin/SKILL.md",
      "bytes": 4803,
      "lang": "markdown",
      "content": "---\nname: build-agent-plugin\ndescription: Author one plugin that installs in both Claude Code and Antigravity from a single source tree (skills, subagents, MCP servers), build both layouts, and validate them before anyone installs. Use when creating, changing, versioning or publishing a Claude Code or Antigravity plugin or a plugin marketplace.\n---\n\n# Build a plugin for Claude Code and Antigravity\n\nBoth agents load a plugin as a folder of `skills/`, `agents/` and MCP config, but the manifests and file names differ:\n\n| | Claude Code | Antigravity |\n| --- | --- | --- |\n| Manifest | `.claude-plugin/plugin.json` (`name` required; set `version`, `description`, `author`) | `plugin.json` at the root: only `$schema`, `name`, `description` (schema forbids other keys) |\n| MCP servers | `.mcp.json`, remote: `\"type\": \"http\", \"url\"` | `mcp_config.json`, remote: `serverUrl` only |\n| Skills | `skills/<name>/SKILL.md`, run as `/<plugin>:<skill>` | `skills/<name>/SKILL.md` |\n| Subagents | `agents/<name>.md` (`name`, `description`, optional `model`, `tools`) | `agents/<name>.md` (`name` and `description` required; `tools` use Antigravity tool names) |\n| Hooks | `hooks/hooks.json`, Claude Code tool names in matchers | `hooks.json` at the root, Antigravity tool names (`run_command`, `view_file`) in matchers |\n| Validate | `claude plugin validate <dir> --strict` | No validate command: check against the documented schema |\n| Plugin root variable | `${CLAUDE_PLUGIN_ROOT}` | None documented |\n\nKeep shared files portable: frontmatter limited to `name` and `description`, no `${CLAUDE_PLUGIN_ROOT}`, and no\ntool lists, because tool names differ between the agents. Write hooks separately for each agent, or leave them\nout. A hook runs as the user on every matching event, so it needs its own review.\n\n## Layout\n\n```\nplugin-src/\n  plugin.json          name, version, description, author, license, repository, mcpServers\n  skills/<skill>/SKILL.md\n  agents/<agent>.md\n```\n\n`references/plugin-src/` is a complete example (`pr-tidy`: one skill, one reviewer subagent, one pinned MCP server).\n\n## Build and check\n\n```bash\nnode scripts/build_plugins.mjs plugin-src dist-plugins\nnode scripts/check_plugins.mjs dist-plugins\nnpx -y @anthropic-ai/claude-code@2.1.302 plugin validate dist-plugins/claude/<name> --strict\nnpx -y @anthropic-ai/claude-code@2.1.302 plugin validate dist-plugins/claude --strict\n```\n\nThe build writes `dist-plugins/claude/<name>/`, `dist-plugins/antigravity/<name>/` and a one-plugin local marketplace\nat `dist-plugins/claude/.claude-plugin/marketplace.json`. `check_plugins.mjs` catches:\n\n- extra Antigravity manifest fields;\n- names the Antigravity CLI rejects, and names reserved for Anthropic;\n- missing `version`, `description` or `author`;\n- a Claude instructions file at the plugin root, which Claude Code does not load;\n- skills or agents without a usable description;\n- MCP servers run with `npx` or `uvx` and no exact version;\n- `url` where Antigravity needs `serverUrl`;\n- non-https remotes, and literal credentials in `env` or `headers`;\n- any difference between the two builds.\n\n`claude plugin validate` is the authority for Claude Code. It runs without signing in, and it also checks the\nmarketplace file.\n\n## Test an install locally (with the user's go-ahead)\n\nInstalling changes the user's agent configuration, so ask first.\n\n- Claude Code: `claude --plugin-dir dist-plugins/claude/<name>` loads the plugin for one session without\n  installing it. Then run `/plugin` and check the Errors tab.\n- Antigravity: `agy plugin install ./dist-plugins/antigravity/<name>`, then `agy plugin list --json` to confirm\n  the skills, agents and MCP servers it found. Remove it with `agy plugin uninstall <name>`.\n\n## Versions and publishing\n\n- Bump `version` in `plugin-src/plugin.json` for every release. Claude Code keeps users on a version until it\n  changes.\n- Set `version` in `plugin.json` only, not in the marketplace entry as well; `validate` warns when both are set.\n- Credentials: Claude Code plugins take a sensitive `userConfig` option referenced as `${user_config.KEY}`. In\n  Antigravity, reference an environment variable as `${VAR}`. Never commit a value.\n- Publish by tagging a commit. Tell users to pin it: a Claude Code marketplace entry from GitHub takes\n  `\"source\": {\"source\": \"github\", \"repo\": \"owner/repo\", \"ref\": \"v1.2.0\", \"sha\": \"<40-char sha>\"}`. `agy plugin\n  install https://github.com/owner/repo` takes no pin, so give Antigravity users the commit to check out and install\n  from a local path. Point reviewers at the `agent-extension-vetting` loadout.\n\n## Done means\n\n`check_plugins.mjs` prints `plugins ok`, and both `validate --strict` runs pass. The version is bumped, and the\nREADME says what the plugin runs: MCP servers, hooks, and any network access.\n"
    },
    {
      "path": "skills/build-agent-plugin/scripts/build_plugins.mjs",
      "role": "reference",
      "description": "Builds both plugin layouts and a local marketplace.",
      "skill": "build-agent-plugin",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/build-agent-plugin/scripts/build_plugins.mjs",
        "codex": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs",
        "cursor": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs",
        "gemini-cli": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs",
        "antigravity-cli": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs",
        "copilot": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/build_plugins.mjs",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/latest/skills/build-agent-plugin/scripts/build_plugins.mjs",
      "bytes": 3566,
      "lang": "markdown",
      "content": "#!/usr/bin/env node\n// Build a Claude Code plugin and an Antigravity plugin from one source tree.\n// Usage: node build_plugins.mjs [plugin-src] [out]   (defaults: plugin-src, dist-plugins)\n//\n// plugin-src/\n//   plugin.json        name, version, description, author, license, repository, mcpServers\n//   skills/<name>/SKILL.md (+ supporting files)  copied to both\n//   agents/<name>.md   frontmatter with name and description only (portable), then the body\n//\n// Output:\n//   out/claude/.claude-plugin/marketplace.json   a one-plugin marketplace for local testing\n//   out/claude/<name>/.claude-plugin/plugin.json, skills/, agents/, .mcp.json\n//   out/antigravity/<name>/plugin.json, skills/, agents/, mcp_config.json\nimport { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst src = process.argv[2] ?? \"plugin-src\";\nconst out = process.argv[3] ?? \"dist-plugins\";\nconst meta = JSON.parse(readFileSync(join(src, \"plugin.json\"), \"utf8\"));\nfor (const k of [\"name\", \"version\", \"description\"]) {\n  if (!meta[k]) throw new Error(`plugin-src/plugin.json: ${k} is required`);\n}\nconst write = (p, obj) => { mkdirSync(join(p, \"..\"), { recursive: true }); writeFileSync(p, JSON.stringify(obj, null, 2) + \"\\n\"); };\n\nrmSync(out, { recursive: true, force: true });\nconst cc = join(out, \"claude\", meta.name);\nconst ag = join(out, \"antigravity\", meta.name);\n\nfor (const dir of [cc, ag]) {\n  mkdirSync(dir, { recursive: true });\n  for (const part of [\"skills\", \"agents\"]) {\n    if (existsSync(join(src, part))) cpSync(join(src, part), join(dir, part), { recursive: true });\n  }\n}\n\n// Claude Code: manifest in .claude-plugin/, MCP in .mcp.json, remote servers use type + url.\nconst ccManifest = {\n  name: meta.name,\n  version: meta.version,\n  description: meta.description,\n  ...(meta.author ? { author: meta.author } : {}),\n  ...(meta.license ? { license: meta.license } : {}),\n  ...(meta.repository ? { repository: meta.repository } : {}),\n  ...(meta.keywords ? { keywords: meta.keywords } : {}),\n};\nwrite(join(cc, \".claude-plugin\", \"plugin.json\"), ccManifest);\n\n// Antigravity: plugin.json at the root, and its schema allows only name and description.\nwrite(join(ag, \"plugin.json\"), {\n  $schema: \"https://antigravity.google/schemas/v1/plugin.json\",\n  name: meta.name,\n  description: meta.description,\n});\n\nconst servers = meta.mcpServers ?? {};\nif (Object.keys(servers).length) {\n  const ccServers = {};\n  const agServers = {};\n  for (const [name, s] of Object.entries(servers)) {\n    if (s.url) {\n      ccServers[name] = { type: \"http\", url: s.url, ...(s.headers ? { headers: s.headers } : {}) };\n      agServers[name] = { serverUrl: s.url, ...(s.headers ? { headers: s.headers } : {}) };\n    } else {\n      const local = { command: s.command, ...(s.args ? { args: s.args } : {}), ...(s.env ? { env: s.env } : {}) };\n      ccServers[name] = local;\n      agServers[name] = local;\n    }\n  }\n  write(join(cc, \".mcp.json\"), { mcpServers: ccServers });\n  write(join(ag, \"mcp_config.json\"), { mcpServers: agServers });\n}\n\n// A local marketplace so `claude plugin validate` and a test install see the real layout.\nwrite(join(out, \"claude\", \".claude-plugin\", \"marketplace.json\"), {\n  name: `${meta.name}-dev`,\n  description: `Local development marketplace for ${meta.name}.`,\n  owner: meta.author ?? { name: \"unknown\" },\n  plugins: [{ name: meta.name, source: `./${meta.name}`, description: meta.description }],\n});\n\nconsole.log(`built ${meta.name} ${meta.version}: ${join(out, \"claude\", meta.name)} and ${ag}`);\n"
    },
    {
      "path": "skills/build-agent-plugin/scripts/check_plugins.mjs",
      "role": "reference",
      "description": "Schema, parity, pin and credential checks for both builds.",
      "skill": "build-agent-plugin",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/build-agent-plugin/scripts/check_plugins.mjs",
        "codex": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs",
        "cursor": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs",
        "gemini-cli": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs",
        "antigravity-cli": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs",
        "copilot": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/check_plugins.mjs",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/latest/skills/build-agent-plugin/scripts/check_plugins.mjs",
      "bytes": 6626,
      "lang": "markdown",
      "content": "#!/usr/bin/env node\n// Check the built plugins for what the agents' own validators miss or do not cover.\n// Usage: node check_plugins.mjs [dist-plugins]\n// Antigravity has no validate command, so its manifest is checked against the schema\n// published in its docs. Claude Code output is checked for parity; run\n// `claude plugin validate <dir> --strict` as well. Exit 1 on any ERROR.\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\n\nconst out = process.argv[2] ?? \"dist-plugins\";\nlet errors = 0;\nconst err = (m) => { errors++; console.log(`ERROR ${m}`); };\nconst ok = (m) => console.log(`ok    ${m}`);\nconst readJson = (p) => JSON.parse(readFileSync(p, \"utf8\"));\n\nfunction frontmatter(text) {\n  const m = /^---\\n([\\s\\S]*?)\\n---\\n/.exec(text);\n  if (!m) return null;\n  const fm = {};\n  for (const line of m[1].split(\"\\n\")) {\n    const kv = /^([A-Za-z][\\w-]*):\\s*(.*)$/.exec(line);\n    if (kv) fm[kv[1]] = kv[2].replace(/^[\"']|[\"']$/g, \"\");\n  }\n  return fm;\n}\n\nfunction* files(dir) {\n  for (const name of readdirSync(dir)) {\n    const p = join(dir, name);\n    if (statSync(p).isDirectory()) yield* files(p); else yield p;\n  }\n}\n\nfunction checkSkillsAndAgents(root, label) {\n  const skills = [];\n  if (existsSync(join(root, \"skills\"))) {\n    for (const name of readdirSync(join(root, \"skills\"))) {\n      const p = join(root, \"skills\", name, \"SKILL.md\");\n      if (!existsSync(p)) { err(`${label}: skills/${name} has no SKILL.md`); continue; }\n      const fm = frontmatter(readFileSync(p, \"utf8\"));\n      if (!fm) { err(`${label}: skills/${name}/SKILL.md has no frontmatter`); continue; }\n      if (fm.name && fm.name !== name) err(`${label}: skills/${name} frontmatter name is \"${fm.name}\"`);\n      if (!fm.description || fm.description.length < 20) err(`${label}: skills/${name} needs a description that says when to use it`);\n      skills.push(name);\n    }\n  }\n  const agents = [];\n  if (existsSync(join(root, \"agents\"))) {\n    for (const name of readdirSync(join(root, \"agents\")).filter((n) => n.endsWith(\".md\"))) {\n      const fm = frontmatter(readFileSync(join(root, \"agents\", name), \"utf8\"));\n      if (!fm?.name || !fm?.description) err(`${label}: agents/${name} needs name and description (Antigravity requires both)`);\n      agents.push(name);\n    }\n  }\n  return { skills, agents };\n}\n\nconst PIN = { npx: /@\\d+\\.\\d+\\.\\d+$/, uvx: /==\\d+(\\.\\d+)*$|@\\d+(\\.\\d+)+$/ };\nfunction checkServers(file, label, remoteKey) {\n  if (!existsSync(file)) return [];\n  const { mcpServers = {} } = readJson(file);\n  for (const [name, s] of Object.entries(mcpServers)) {\n    if (s.command === \"npx\" || s.command === \"uvx\") {\n      const pkg = (s.args ?? []).find((a) => !a.startsWith(\"-\"));\n      if (!pkg || !PIN[s.command].test(pkg)) err(`${label}: MCP server ${name} runs ${s.command} ${pkg ?? \"\"} without an exact version`);\n    }\n    if (remoteKey === \"serverUrl\" && (s.url || s.httpUrl)) err(`${label}: MCP server ${name} uses url/httpUrl; Antigravity reads serverUrl only`);\n    if (remoteKey === \"url\" && s.serverUrl) err(`${label}: MCP server ${name} uses serverUrl; Claude Code reads url`);\n    const remote = s[remoteKey];\n    if (remote && !remote.startsWith(\"https://\")) err(`${label}: MCP server ${name} remote URL is not https`);\n    for (const [k, v] of Object.entries({ ...(s.env ?? {}), ...(s.headers ?? {}) })) {\n      if (typeof v === \"string\" && !/\\$\\{[A-Za-z_][\\w.]*\\}/.test(v) && /token|key|secret|auth|bearer/i.test(k + v)) {\n        err(`${label}: MCP server ${name} ${k} looks like a literal credential; reference an environment variable`);\n      }\n    }\n  }\n  return Object.keys(mcpServers);\n}\n\nconst ccRoot = join(out, \"claude\");\nconst agRoot = join(out, \"antigravity\");\nconst names = existsSync(agRoot) ? readdirSync(agRoot) : [];\nif (!names.length) err(`no plugins under ${agRoot}`);\n\nfor (const name of names) {\n  const ag = join(agRoot, name);\n  const cc = join(ccRoot, name);\n  const before = errors;\n\n  // Antigravity manifest: the documented schema has additionalProperties false.\n  const m = readJson(join(ag, \"plugin.json\"));\n  const allowed = new Set([\"$schema\", \"name\", \"description\"]);\n  const extra = Object.keys(m).filter((k) => !allowed.has(k));\n  if (extra.length) err(`antigravity/${name}/plugin.json: fields not in the schema: ${extra.join(\", \")}`);\n  if (!/^[a-zA-Z0-9-_]+$/.test(m.name ?? \"\")) err(`antigravity/${name}/plugin.json: name must match ^[a-zA-Z0-9-_]+$ (the CLI requires it)`);\n  if (m.name !== name) err(`antigravity/${name}: folder name and manifest name differ`);\n  if (existsSync(join(ag, \".claude-plugin\"))) err(`antigravity/${name}: contains .claude-plugin/`);\n\n  // Claude Code manifest basics (claude plugin validate --strict covers the rest).\n  const c = readJson(join(cc, \".claude-plugin\", \"plugin.json\"));\n  if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(c.name)) err(`claude/${name}: name should be kebab-case`);\n  if (/^(claude|anthropic|anthropics|cc-plugin)-/i.test(c.name)) err(`claude/${name}: name is reserved for Anthropic`);\n  for (const k of [\"version\", \"description\", \"author\"]) if (!c[k]) err(`claude/${name}: ${k} missing (--strict fails)`);\n  if (existsSync(join(cc, \"CLAUDE.md\"))) err(`claude/${name}: a CLAUDE.md at the plugin root is not loaded; use a skill`);\n  if (existsSync(join(cc, \"plugin.json\"))) err(`claude/${name}: plugin.json belongs in .claude-plugin/`);\n\n  // Same components on both sides.\n  const a = checkSkillsAndAgents(ag, `antigravity/${name}`);\n  const b = checkSkillsAndAgents(cc, `claude/${name}`);\n  if (JSON.stringify(a) !== JSON.stringify(b)) err(`${name}: skills or agents differ between the two builds`);\n  const sa = checkServers(join(ag, \"mcp_config.json\"), `antigravity/${name}`, \"serverUrl\");\n  const sb = checkServers(join(cc, \".mcp.json\"), `claude/${name}`, \"url\");\n  if (JSON.stringify(sa) !== JSON.stringify(sb)) err(`${name}: MCP servers differ between the two builds`);\n\n  // Nothing that escapes the plugin root or depends on one agent's variables in shared files.\n  for (const f of [...files(ag)]) {\n    const text = readFileSync(f, \"utf8\");\n    if (text.includes(\"${CLAUDE_PLUGIN_ROOT}\")) err(`antigravity/${name}/${relative(ag, f)}: uses \\${CLAUDE_PLUGIN_ROOT}, which only Claude Code substitutes`);\n    if (/\\.\\.\\//.test(text) && f.endsWith(\".json\")) err(`antigravity/${name}/${relative(ag, f)}: path with ../`);\n  }\n\n  if (errors === before) ok(`${name}: ${a.skills.length} skill(s), ${a.agents.length} agent(s), ${sa.length} MCP server(s) in both builds`);\n}\n\nconsole.log(errors ? `${errors} error(s)` : \"plugins ok\");\nprocess.exit(errors ? 1 : 0);\n"
    },
    {
      "path": "skills/build-agent-plugin/references/plugin-src/plugin.json",
      "role": "reference",
      "description": "Example source manifest with a pinned MCP server.",
      "skill": "build-agent-plugin",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/build-agent-plugin/references/plugin-src/plugin.json",
        "codex": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json",
        "cursor": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json",
        "gemini-cli": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json",
        "antigravity-cli": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json",
        "copilot": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/plugin.json",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/latest/skills/build-agent-plugin/references/plugin-src/plugin.json",
      "bytes": 475,
      "lang": "json",
      "content": "{\n  \"name\": \"pr-tidy\",\n  \"version\": \"1.2.0\",\n  \"description\": \"Tidy a branch before review: small commits, a clear PR description and current library docs.\",\n  \"author\": { \"name\": \"Your Team\", \"url\": \"https://github.com/your-org\" },\n  \"license\": \"MIT\",\n  \"repository\": \"https://github.com/your-org/pr-tidy\",\n  \"keywords\": [\"pull-requests\", \"review\"],\n  \"mcpServers\": {\n    \"context7\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@upstash/context7-mcp@4.4.2\"]\n    }\n  }\n}\n"
    },
    {
      "path": "skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
      "role": "reference",
      "description": "Example portable skill.",
      "skill": "build-agent-plugin",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
        "codex": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
        "cursor": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
        "gemini-cli": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
        "antigravity-cli": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
        "copilot": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/latest/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
      "bytes": 752,
      "lang": "markdown",
      "content": "---\nname: tidy-pr\ndescription: Tidy a branch before opening or updating a pull request. Use when asked to prepare a PR, clean up commits or write a PR description.\n---\n\n# Tidy a pull request\n\n1. Run `git status` and `git log --oneline origin/HEAD..` to see what the branch holds.\n2. Name anything unrelated to the PR's purpose and ask before moving it to another branch.\n3. Run the project's formatter, linter and tests. Fix failures caused by this branch; report others.\n4. Write the description: what changed, why, how it was tested, and what a reviewer should look at first.\n5. Check library calls against current docs with the plugin's `context7` MCP server when a version changed.\n\nNever force-push a branch someone else has pushed to. Ask first.\n"
    },
    {
      "path": "skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
      "role": "reference",
      "description": "Example portable subagent.",
      "skill": "build-agent-plugin",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
        "codex": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
        "cursor": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
        "gemini-cli": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
        "antigravity-cli": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
        "copilot": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/latest/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
      "bytes": 496,
      "lang": "markdown",
      "content": "---\nname: pr-reviewer\ndescription: Reviews a prepared pull request for correctness, missing tests and risky changes. Use after tidy-pr, before asking a human to review.\n---\n\nYou review a pull request that is ready for a human. Read the diff against the base branch and the PR description.\n\nReport, in order: bugs, missing or weak tests, security-sensitive changes (auth, input handling, secrets, migrations),\nand anything the description does not explain. Quote file and line. Do not edit files.\n"
    }
  ],
  "requires": {
    "tools": [
      "nodejs",
      "npm"
    ],
    "env": [],
    "mcp": []
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "antigravity-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/1",
    "verdict": "clean",
    "network": true,
    "scripts": [
      "build_plugins.mjs",
      "check_plugins.mjs"
    ],
    "notes": "The scripts read and write files under the folders you name and make no network calls. npx downloads Claude Code only to run plugin validate. The example plugin declares one MCP server (Context7, pinned to 4.4.2) that runs only when someone installs the plugin."
  },
  "featured": false,
  "deprecated": false,
  "last_checked": "2026-10-17",
  "published": "2026-10-17",
  "updated": "2026-10-17",
  "compatibility": {
    "claude-code": "native",
    "codex": "native",
    "cursor": "native",
    "gemini-cli": "native",
    "antigravity-cli": "native",
    "copilot": "native"
  },
  "counts": {
    "rules": 1,
    "skills": 1,
    "mcp": 0
  },
  "url": "https://loadout.jnw-it.com/loadouts/agent-plugin-authoring/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/agent-plugin-authoring.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-17T20:59:33Z",
    "commit": "08c3710727a4d6fc320a98ecf32bdc0a780eaa6c",
    "content_current": true,
    "agent_tests": "not-run",
    "counts": {
      "pass": 9,
      "fail": 0,
      "skip": 0,
      "not_applicable": 1
    },
    "meaning": "Level 1: automated checks on the files (parse, install paths, MCP config, safety scan, references, size, licence, starter build). No AI agent was run.",
    "checks": [
      {
        "id": "listing",
        "name": "Listing",
        "status": "pass",
        "summary": "Schema valid; 9 files declared, none missing or extra",
        "details": [
          "tested.status: untested (agent tests are separate from Level 1)"
        ]
      },
      {
        "id": "parse",
        "name": "Files parse",
        "status": "pass",
        "summary": "All 9 files parse; front matter valid",
        "details": []
      },
      {
        "id": "adapters",
        "name": "Adapters",
        "status": "pass",
        "summary": "CLAUDE.md and GEMINI.md import AGENTS.md and are up to date",
        "details": [
          "CLAUDE.md: matches the generator",
          "GEMINI.md: matches the generator"
        ]
      },
      {
        "id": "install-paths",
        "name": "Install paths",
        "status": "pass",
        "summary": "Correct paths for all 6 agents; layouts re-discovered",
        "details": [
          "Claude Code: 8 files, 1 skill in .claude/skills/",
          "Codex CLI: 7 files, 1 skill in .agents/skills/",
          "Cursor: 7 files, 1 skill in .agents/skills/",
          "Gemini CLI: 8 files, 1 skill in .agents/skills/",
          "Antigravity CLI: 7 files, 1 skill in .agents/skills/",
          "GitHub Copilot: 7 files, 1 skill in .agents/skills/"
        ]
      },
      {
        "id": "mcp",
        "name": "MCP config",
        "status": "n/a",
        "summary": "No MCP servers in this loadout",
        "details": []
      },
      {
        "id": "safety",
        "name": "Safety scan",
        "status": "pass",
        "summary": "Clean: no credentials, risky shell or hidden text",
        "details": [
          "Scanner intake-precheck/1: verdict clean; network yes (listing says yes)"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "1 reference between files resolves for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "9 files, 18.9 KB total; largest skills/build-agent-plugin/scripts/check_plugins.mjs 6.5 KB",
        "details": [
          "Limits: 30 files, 32 KB per file, 128 KB total, 500 lines per skill or rule"
        ]
      },
      {
        "id": "licence",
        "name": "Licence",
        "status": "pass",
        "summary": "MIT, by Agent Loadout; text in the repository LICENSE",
        "details": []
      },
      {
        "id": "starter-build",
        "name": "Starter build",
        "status": "pass",
        "summary": "The build-agent-plugin skill builds its example plugin for Claude Code and Antigravity, the checker passes both, and Claude Code 2.1.302's own validate --strict passes the plugin and its marketplace without signing in. A broken source fails both checkers for the right reasons.",
        "details": [
          "Applied 15 loadout files at every agent's paths",
          "✓ place the skill's scripts and example source: bash -c cp .agents/skills/build-agent-plugin/scripts/*.mjs . && cp -r .agents/skills/build-agent-plugin/references/plugin-src plugin-src && mkdir -p .home && echo placed",
          "✓ install Claude Code (exact pin, for validate only): npm ci --no-audit --no-fund",
          "✓ build both plugins: node build_plugins.mjs plugin-src dist-plugins",
          "✓ layouts match each agent's docs: bash -c for f in claude/pr-tidy/.claude-plugin/plugin.json claude/pr-tidy/.mcp.json claude/pr-tidy/skills/tidy-pr/SKILL.md claude/pr-tidy/agents/pr-reviewer.md claude/.claude-plugin/marketplace.json antigravity/pr-tidy/plugin.json antigravity/pr-tidy/mcp_config.json antigravity/pr-tidy/skills/tidy-pr/SKILL.md antigravity/pr-tidy/agents/pr-reviewer.md; do test -f dist-plugins/$f || { echo missing $f; exit 1; }; done; node -e 'const m=require(\"./dist-plugins/anti",
          "✓ checker passes the example: node check_plugins.mjs dist-plugins",
          "✓ claude plugin validate --strict (plugin): bash -c HOME=\"$PWD/.home\" node_modules/.bin/claude plugin validate dist-plugins/claude/pr-tidy --strict",
          "✓ claude plugin validate --strict (marketplace): bash -c HOME=\"$PWD/.home\" node_modules/.bin/claude plugin validate dist-plugins/claude --strict",
          "✓ broken source fails the checker: bash -c node build_plugins.mjs bad-src dist-bad >/dev/null && node check_plugins.mjs dist-bad; echo \"exit=$?\"",
          "✓ broken source fails claude plugin validate too: bash -c HOME=\"$PWD/.home\" node_modules/.bin/claude plugin validate dist-bad/claude/claude-pr-tidy --strict; echo \"exit=$?\"",
          "Covers: One source tree builds a Claude Code plugin (.claude-plugin/plugin.json, .mcp.json) and an Antigravity plugin (root plugin.json, mcp_config.json)",
          "Covers: The Antigravity manifest carries only the fields its documented schema allows",
          "Covers: claude plugin validate --strict passes the plugin and a local marketplace with no account",
          "Covers: Reserved names, unpinned npx MCP servers, http remotes, literal credentials and agents without descriptions are caught"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/build-agent-plugin/SKILL.md",
          "target": ".claude/skills/build-agent-plugin/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/build-agent-plugin/scripts/build_plugins.mjs",
          "target": ".claude/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/scripts/check_plugins.mjs",
          "target": ".claude/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/plugin.json",
          "target": ".claude/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "target": ".claude/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "target": ".claude/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/agent-plugin-authoring/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/build-agent-plugin/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/build-agent-plugin/scripts/build_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/scripts/check_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/plugin.json",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/agent-plugin-authoring/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/build-agent-plugin/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/build-agent-plugin/scripts/build_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/scripts/check_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/plugin.json",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/agent-plugin-authoring/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/build-agent-plugin/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/build-agent-plugin/scripts/build_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/scripts/check_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/plugin.json",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/agent-plugin-authoring/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/build-agent-plugin/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/build-agent-plugin/scripts/build_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/scripts/check_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/plugin.json",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/agent-plugin-authoring/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/build-agent-plugin/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/build-agent-plugin/scripts/build_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/build_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/scripts/check_plugins.mjs",
          "target": ".agents/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/scripts/check_plugins.mjs",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/plugin.json",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/plugin.json",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/skills/tidy-pr/SKILL.md",
          "role": "reference"
        },
        {
          "path": "skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "target": ".agents/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "raw_url": "https://loadout.jnw-it.com/raw/agent-plugin-authoring/1.0.0/skills/build-agent-plugin/references/plugin-src/agents/pr-reviewer.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/agent-plugin-authoring/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/agent-plugin-authoring/source.zip"
}