Plugins y marketplace: cómo Google empaqueta y distribuye
Plugins y marketplace: cómo Google empaqueta y distribuye
Los diez capítulos anteriores recorrieron los 103 SKILL.md del catálogo. Este capítulo trata de la otra mitad del repositorio: los archivos que no enseñan nada al agente, sino que le dicen a un harness de dónde bajar cosas y en qué versión.
Son cuatro piezas, todas en la raíz o cerca de ella:
.claude-plugin/marketplace.json— el manifiesto que consumen Claude Code y Codex..agents/plugins/marketplace.json— un manifiesto paralelo, con otro esquema, para harnesses genéricos.plugins/cloud/data-agent-kit/— un directorio con 16 submódulos de git y unREADME.md..gitmodules— los punteros de esos 16 submódulos.
Y hay un hallazgo que conviene adelantar, porque reordena todo lo demás: en el clon del repositorio no existe ni un solo plugin.json ni un solo mcp.json. Verificado con find . -name "plugin.json" -o -name "mcp.json": cero resultados fuera de .git/. google/skills no contiene plugins. Contiene punteros a plugins que viven en otros repositorios.
Recordatorio del propio README: “This repository is under active development”. Las versiones pinneadas y la forma de los manifiestos que se documentan aquí son las del clon analizado y cambian con frecuencia.
Dos artefactos que se confunden: skill y plugin
Antes de abrir ningún JSON, hay que separar dos cosas que el repositorio mezcla en un mismo árbol.
Un skill es un directorio con un SKILL.md. Se instala con npx skills add google/skills, y lo único que aporta es texto: instrucciones, references/, scripts/, assets/. No arranca procesos ni abre conexiones.
Un plugin es un paquete distribuible que puede traer skills y además servidores MCP. El README.md del directorio de plugins lo dice literal: “These plugins package product-specific Skills and (where applicable) MCP servers for their product’s common user journeys.”
flowchart TB
subgraph repo["repositorio google/skills"]
S["skills/ - 103 SKILL.md<br/>contenido real, versionado aqui"]
M1[".claude-plugin/marketplace.json<br/>16 punteros"]
M2[".agents/plugins/marketplace.json<br/>15 punteros"]
G[".gitmodules<br/>16 submodulos"]
P["plugins/cloud/data-agent-kit/<br/>16 directorios vacios + README"]
end
UP["repos upstream<br/>gemini-cli-extensions y GoogleCloudPlatform<br/>aqui viven los plugin.json y mcp.json reales"]
M1 --> UP
M2 --> UP
G --> P
P -.-> UP
El catálogo de skills es contenido. El bloque de plugins es distribución. Son dos mecanismos independientes que conviven en el mismo repositorio y se instalan con comandos distintos.
.claude-plugin/marketplace.json campo por campo
157 líneas. La estructura de nivel superior tiene cuatro claves:
{
"name": "google-plugins",
"owner": {
"name": "Google LLC"
},
"metadata": {
"version": "0.0.1",
"description": "A central repository of official skills and prescriptive plugins designed to provide a high-performance experience for building and deploying agentic applications across Google products and technologies."
},
"plugins": [ ]
}
Cada campo hace una cosa concreta:
name: "google-plugins"— es el identificador del marketplace, no del repositorio. Es exactamente el sufijo que se escribe al instalar:claude plugin install <plugin>@google-plugins. Si este valor cambiara, cambiarían todos los comandos de instalación documentados.owner.name— atribución."Google LLC", sinemailniurl.metadata.version: "0.0.1"— versión del catálogo, no de los plugins. Sigue en0.0.1mientras los plugins que indexa van por1.2.0,0.6.1ov0.4.0. Es un número de catálogo, no un contrato.metadata.description— el texto que un harness muestra al listar marketplaces disponibles.plugins— el array, con 16 entradas.
Anatomía de una entrada
La forma estándar, textual del archivo:
{
"name": "alloydb",
"source": {
"source": "github",
"repo": "gemini-cli-extensions/alloydb",
"ref": "0.2.0"
},
"description": "Create, connect, and interact with an AlloyDB for PostgreSQL database and data."
}
Tres campos por entrada: name, source, description. El objeto source tiene a su vez una clave source anidada que declara el método de obtención, y luego los campos que ese método exige. En el caso "github": repo en formato org/repo y ref con la etiqueta de release.
Nótese lo que no hay: ni version del plugin, ni license, ni keywords, ni category. El manifiesto es deliberadamente delgado; toda esa metadata vive en el plugin.json del repositorio de destino.
Las 16 entradas
name | source.repo o url | ref | método |
|---|---|---|---|
alloydb | gemini-cli-extensions/alloydb | 0.2.0 | github |
alloydb-omni | gemini-cli-extensions/alloydb-omni | 0.2.1 | github |
bigtable | GoogleCloudPlatform/cloud-bigtable-ecosystem | v0.4.0 | github |
cloud-sql-mysql | gemini-cli-extensions/cloud-sql-mysql | 0.2.0 | github |
cloud-sql-postgresql | gemini-cli-extensions/cloud-sql-postgresql | 0.4.0 | github |
cloud-sql-sqlserver | gemini-cli-extensions/cloud-sql-sqlserver | 0.2.0 | github |
firestore-native | gemini-cli-extensions/firestore-native | 0.3.1 | github |
data-agent-kit-starter-pack | gemini-cli-extensions/data-agent-kit-starter-pack | 0.6.1 | github |
google-cloud-storage | gemini-cli-extensions/google-cloud-storage | 1.2.0 | github |
looker | gemini-cli-extensions/looker | 0.3.5 | github |
oracledb | gemini-cli-extensions/oracledb | 0.2.3 | github |
spanner | gemini-cli-extensions/spanner | 0.3.1 | github |
knowledge-catalog | gemini-cli-extensions/knowledge-catalog | 0.5.2 | github |
dataproc | gemini-cli-extensions/dataproc | 0.1.0 | github |
bigquery | gemini-cli-extensions/bigquery-data-analytics | 0.2.1 | github |
db-context-engineering | GoogleCloudPlatform/db-context-enrichment | v0.6.0 | git-subdir |
Dos observaciones que se pierden si se lee el archivo en diagonal:
El nombre del plugin no siempre es el nombre del repositorio. Tres casos: bigtable viene de cloud-bigtable-ecosystem, bigquery de bigquery-data-analytics, y db-context-engineering de db-context-enrichment. El manifiesto está renombrando para el usuario final. Si buscas el repo por el nombre del plugin, no lo encuentras.
Las etiquetas no tienen formato uniforme. La mayoría usa 0.2.0 sin prefijo; los dos repositorios bajo la organización GoogleCloudPlatform usan v0.4.0 y v0.6.0 con v. El manifiesto no normaliza: copia la etiqueta tal cual la publica cada upstream.
La excepción: git-subdir
La última entrada es la única que rompe la forma:
{
"name": "db-context-engineering",
"source": {
"source": "git-subdir",
"url": "GoogleCloudPlatform/db-context-enrichment",
"path": "plugin",
"ref": "v0.6.0"
},
"description": "Context Engineering Agent for generating and maintaining QueryData / Conversational Analytics API context sets (templates, facets, value searches) for natural language to SQL tasks. Works with AlloyDB, Cloud SQL for MySQL, Cloud SQL for PostgreSQL, and Spanner."
}
Tres diferencias respecto de las otras quince: source.source es "git-subdir" en vez de "github", la clave se llama url en vez de repo, y aparece un campo path.
El motivo es estructural. Los quince repositorios de gemini-cli-extensions son el plugin: su raíz es la raíz del paquete. db-context-enrichment es un repositorio de proyecto en el que el plugin es solo un subdirectorio llamado plugin/. git-subdir existe para poder apuntar dentro de un repositorio sin exigir que el upstream se reorganice.
Es un detalle menor y muy revelador: el formato del marketplace tuvo que crecer un método de obtención adicional el día que alguien quiso publicar un plugin que no vivía en la raíz de su repo.
El manifiesto paralelo: .agents/plugins/marketplace.json
El directorio .agents/ contiene un solo archivo: plugins/marketplace.json, de 218 líneas. Mismo name: "google-plugins", esquema distinto:
{
"name": "google-plugins",
"interface": {
"displayName": "Google Plugins"
},
"plugins": [ ]
}
Y una entrada tipo:
{
"name": "alloydb",
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/alloydb.git",
"ref": "0.2.0"
},
"description": "Create, connect, and interact with an AlloyDB for PostgreSQL database and data.",
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Databases"
}
Comparación directa de los dos manifiestos:
| Aspecto | .claude-plugin/marketplace.json | .agents/plugins/marketplace.json |
|---|---|---|
| Metadatos del catálogo | owner.name, metadata.version, metadata.description | interface.displayName |
| Nº de plugins | 16 | 15 |
| Plugin ausente | — | falta db-context-engineering |
Forma de source | source: "github" + repo + ref | source: "url" + url completa con .git + ref |
| Campos extra por entrada | ninguno | policy y category |
Los dos campos extra merecen atención porque no tienen equivalente en el otro archivo.
policy es idéntico en las quince entradas: installation: "AVAILABLE" y authentication: "ON_INSTALL". Declara que el plugin se puede instalar y que el harness debe disparar el flujo de autenticación en el momento de instalar, no al primer uso. Tiene sentido para plugins de bases de datos: sin credenciales, un servidor MCP de Spanner no puede ni listar instancias.
category introduce una tercera taxonomía en el mismo repositorio, distinta de la del README y distinta de la de metadata.category de los skills que vimos en el capítulo 3:
category | Plugins |
|---|---|
Databases | alloydb, alloydb-omni, bigtable, cloud-sql-mysql, cloud-sql-postgresql, cloud-sql-sqlserver, firestore-native, data-agent-kit-starter-pack, oracledb, spanner |
Storage | google-cloud-storage |
Business Intelligence & Analytics | looker |
Data Governance & Management | knowledge-catalog |
Data Processing & ETL | dataproc |
Data Warehousing & Data Lakes | bigquery |
Ninguna de estas etiquetas aparece en el frontmatter de ningún skill. Son categorías de producto de datos, con espacios y ampersands, pensadas para pintar una interfaz de navegación.
Un último detalle sobre .agents/: el .gitignore del repositorio incluye la línea .agents/cache/ bajo el comentario # Agent / skill local artifacts. Es decir, .agents/ no es solo un directorio de manifiestos versionados: se espera que los harnesses escriban estado local ahí y que ese estado no se comitee.
plugins/cloud/data-agent-kit/: un directorio de dieciséis huecos
Este es el árbol real, tal cual sale de un clon sin inicializar submódulos:
plugins/cloud/data-agent-kit/
├── README.md <-- unico archivo real
├── alloydb/ (submodulo, vacio)
├── alloydb-omni/ (submodulo, vacio)
├── bigquery-data-analytics/ (submodulo, vacio)
├── cloud-bigtable-ecosystem/ (submodulo, vacio)
├── cloud-sql-mysql/ (submodulo, vacio)
├── cloud-sql-postgresql/ (submodulo, vacio)
├── cloud-sql-sqlserver/ (submodulo, vacio)
├── data-agent-kit-starter-pack/ (submodulo, vacio)
├── dataproc/ (submodulo, vacio)
├── db-context-enrichment/ (submodulo, vacio)
├── firestore-native/ (submodulo, vacio)
├── google-cloud-storage/ (submodulo, vacio)
├── knowledge-catalog/ (submodulo, vacio)
├── looker/ (submodulo, vacio)
├── oracledb/ (submodulo, vacio)
└── spanner/ (submodulo, vacio)
find plugins -type f devuelve un archivo: el README.md. Los 16 directorios están vacíos hasta que se ejecuta git submodule update --init desde la raíz. Y aun después de materializarlos, sus plugin.json y mcp.json pertenecen al repositorio de origen, no a google/skills.
El propio README.md lo declara sin ambigüedad:
“This directory vendors the Google Data Cloud plugins as git submodules, so they can be discovered and installed through the central
google/skillsrepository. Each submodule pins to a specific release tag of its upstream plugin repository, which remains the source of truth for that plugin’s skills and MCP server definition.”
Es decir: aquí no hay configuración MCP. La hay en cada upstream. Este directorio es un índice de versiones, no un paquete.
Por qué submódulos y no solo el manifiesto
La justificación está escrita, y es puramente táctica:
“Submodules are used here because Antigravity CLI does not yet support a marketplace manifest (as Claude Code and Codex do). Once marketplace support lands for
agy, these submodules can be retired in favor of the shared manifest.”
Antigravity CLI instala apuntando a una ruta de repositorio, no a una entrada de catálogo:
agy plugin install https://github.com/google/skills/plugins/cloud/data-agent-kit/alloydb
agy plugin install https://github.com/google/skills/plugins/cloud/data-agent-kit/spanner
Para que esa URL resuelva a algo, el directorio tiene que existir en el árbol de google/skills. De ahí los submódulos: son el adaptador que permite que un cliente sin soporte de marketplace instale desde el mismo repositorio central. El README los marca explícitamente como deuda temporal, retirable el día que agy soporte manifiestos.
.gitmodules: 16 submódulos y un abuso deliberado de branch
[submodule "alloydb"]
path = plugins/cloud/data-agent-kit/alloydb
url = https://github.com/gemini-cli-extensions/alloydb
branch = 0.2.0
[submodule "alloydb-omni"]
path = plugins/cloud/data-agent-kit/alloydb-omni
url = https://github.com/gemini-cli-extensions/alloydb-omni
branch = 0.2.1
Los 16 bloques tienen path bajo plugins/cloud/data-agent-kit/ y usan la clave branch para guardar una etiqueta de release, no una rama. Es una convención habitual: branch es lo que lee git submodule update --remote, y ponerle un tag inmoviliza el submódulo en esa versión en vez de seguir la cabecera móvil de una rama.
Dos nombres de submódulo no coinciden con el nombre del plugin en el marketplace, por la misma razón que ya vimos: el submódulo se llama como el repositorio (bigquery-data-analytics, cloud-bigtable-ecosystem, db-context-enrichment), el plugin se llama como el producto (bigquery, bigtable, db-context-engineering).
Tres copias de la misma matriz de versiones
Aquí está la consecuencia operativa de todo lo anterior. La versión de cada plugin está escrita en tres sitios distintos, sincronizados a mano:
flowchart LR
V["version de un plugin<br/>ejemplo alloydb 0.2.0"]
A[".gitmodules<br/>branch = 0.2.0"]
B[".claude-plugin/marketplace.json<br/>ref 0.2.0"]
C["plugins/cloud/data-agent-kit/README.md<br/>columna Version"]
D[".agents/plugins/marketplace.json<br/>ref 0.2.0"]
V --> A
V --> B
V --> C
V --> D
En el clon analizado las 16 versiones de .gitmodules coinciden exactamente con los ref de .claude-plugin/marketplace.json y con la columna Version de la tabla del README. La cuarta copia, .agents/plugins/marketplace.json, coincide en los 15 plugins que sí lista.
El README documenta el procedimiento de subida de versión, que toca dos de esos sitios:
cd plugins/cloud/data-agent-kit/<plugin>
git fetch --tags
git checkout <new-version>
cd -
git config -f .gitmodules submodule.<plugin>.branch <new-version>
git add .gitmodules plugins/cloud/data-agent-kit/<plugin>
git commit -m "feat(<plugin>): bump to <new-version>"
Los otros dos —los dos marketplace.json y la tabla del README— quedan fuera del procedimiento escrito. Es exactamente el tipo de duplicación que se desincroniza sola; conviene comprobar el ref real antes de fiarse de la tabla de un README.
Cómo se instala desde cada harness
Los comandos exactos, tal como los publica el README.md de la raíz:
| Agent harness | Instalación |
|---|---|
| Claude Code | claude plugin marketplace add google/skills, y luego claude plugin install <plugin>@google-plugins |
| Codex | codex plugin marketplace add google/skills, y luego instalar desde el navegador /plugins |
| Antigravity CLI | agy plugin install https://github.com/google/skills/<plugin-path> |
Y aparte, para los skills sueltos —que es otro mecanismo distinto, visto en el capítulo 2:
npx skills add google/skills
flowchart TB
U["quieres instalar algo de google/skills"]
Q1{"skill suelto<br/>o plugin de producto de datos"}
U --> Q1
Q1 -->|skill| SK["npx skills add google/skills<br/>y eliges de la lista"]
Q1 -->|plugin| Q2{"que harness usas"}
Q2 -->|Claude Code| CC["claude plugin marketplace add<br/>luego claude plugin install"]
Q2 -->|Codex| CX["codex plugin marketplace add<br/>luego navegador /plugins"]
Q2 -->|Antigravity| AG["agy plugin install<br/>con la URL del subdirectorio"]
CC --> R["el harness clona el repo upstream en el ref pinneado"]
CX --> R
AG --> R
Fíjate en el final del diagrama: en los tres caminos de plugin, lo que acaba en tu máquina no es código de google/skills, sino un clon del repositorio upstream en la etiqueta que el manifiesto declaró.
Dónde termina el estándar y empieza la convención de producto
Esta es la parte donde conviene ser preciso, porque es fácil confundir lo que define la Agent Plugins Specification 1.0.0 con lo que Google decidió por su cuenta.
Lo tratamos en detalle en el curso hermano Agent Plugins Spec, pero resumido: APS 1.0.0 es una especificación de formato de paquete. Define exactamente esto:
- Un plugin es un directorio con un manifiesto obligatorio en
plugin.jsonen la raíz. - El manifiesto tiene un esquema cerrado: solo
$schema,name,version,description,author,homepage,repository,license,keywordsyextensions. Cualquier otro campo de nivel superior debe reportarse e ignorarse. - Hay exactamente dos tipos de componente: skills y servidores MCP.
- Sus ubicaciones son fijas y
plugin.jsonno puede cambiarlas: los skills enskills/(cada subdirectorio inmediato con unSKILL.md, sin búsqueda recursiva más profunda), los servidores MCP enmcp.jsonen la raíz. - Los skills deben ajustarse a la Agent Skills specification. La spec de plugins define cómo se descubren, no cómo se escriben; eso es el territorio del curso Agent Skills.
- Los datos específicos de cada cliente van bajo
extensions, con claves en notación de dominio inverso, y sus archivos en un directorio de nivel superior con ese mismo nombre. - Un cliente que lanza subprocesos debe proveer
PLUGIN_ROOTyPLUGIN_DATAy expandir esos dos marcadores enargs,envycwd.
Ahora, la lista de lo que APS 1.0.0 no define. Es corta y es la clave del capítulo:
No define marketplaces. La palabra marketplace no aparece ni una vez en el texto de la especificación 1.0.0. Ni catálogos, ni índices, ni un formato de descubrimiento remoto. La spec empieza en “un plugin es un directorio en el sistema de archivos” y termina ahí; cómo llega ese directorio a tu disco queda completamente fuera de alcance.
De modo que:
| Artefacto | ¿Estándar APS? | Qué es realmente |
|---|---|---|
plugin.json | Sí, normativo, obligatorio | Manifiesto del paquete |
skills/<nombre>/SKILL.md | Sí, ubicación fija | Componente skill |
mcp.json | Sí, ubicación fija | Componente servidor MCP |
.claude-plugin/marketplace.json | No | Convención de producto de Claude Code y Codex |
.agents/plugins/marketplace.json | No | Convención de otro harness |
policy y category en las entradas | No | Campos propios del segundo manifiesto |
Submódulos en plugins/cloud/data-agent-kit/ | No | Truco de fontanería para Antigravity CLI |
Esto explica sin misterio por qué google/skills no tiene ningún plugin.json: no es un plugin. Es un catálogo de distribución. Los paquetes conformes a APS son los dieciséis repositorios de destino, cada uno con su plugin.json, sus skills/ y —donde aplique— su mcp.json.
Hay un guiño de nomenclatura que vale la pena señalar sin sobreinterpretarlo. La especificación, al ilustrar PLUGIN_ROOT y PLUGIN_DATA, usa este ejemplo:
PLUGIN_ROOT=/home/alex/.agents/plugins/devtools
PLUGIN_DATA=/home/alex/.agents/plugins/data/devtools
Es la misma ruta .agents/plugins/ que usa el repositorio de Google. En la spec es un ejemplo no normativo de dónde un cliente podría instalar plugins en el HOME del usuario; en google/skills es un directorio versionado en la raíz del repositorio con un manifiesto dentro. Coincide la convención de nombre, no el rol. Confundir ambas cosas es el error clásico al leer este repositorio.
Cómo se complementan
Nada de esto es una crítica al diseño de Google: el hueco de la spec es real y alguien tenía que rellenarlo.
flowchart TB
APS["Agent Plugins Specification 1.0.0<br/>define el formato del paquete"]
GAP["hueco: no define distribucion ni descubrimiento"]
MP["convenciones de marketplace<br/>una por harness"]
PKG["paquetes conformes<br/>plugin.json + skills/ + mcp.json"]
APS --> PKG
APS --> GAP
GAP --> MP
MP --> PKG
El marketplace resuelve cuál paquete y en qué versión. La spec resuelve qué hay dentro de ese paquete y cómo cargarlo. Que hoy hagan falta dos manifiestos con esquemas distintos para el mismo conjunto de plugins es la medida exacta de lo que aún no está estandarizado.
El solapamiento entre skills y plugins
Vale la pena mirar dónde se cruzan las dos mitades del repositorio, porque hay productos que aparecen en ambas.
En el catálogo de skills existen, verificados en skills/cloud/: alloydb-basics, bigquery-basics, bigquery-ai-ml, bigquery-bigframes, bigtable-basics, cloud-sql-basics, spanner-basics y google-cloud-storage-basics. Todos ellos tienen además un plugin homónimo en el marketplace (alloydb, bigquery, bigtable, cloud-sql-*, spanner, google-cloud-storage).
La diferencia práctica: el skill bigquery-basics te da conocimiento y comandos bq/gcloud; el plugin bigquery te da además, si el upstream lo trae, un servidor MCP con herramientas tipadas contra la API. Uno instruye, el otro conecta. Los revisamos por separado en el capítulo 9.
Y hay productos que solo existen como plugin: looker, dataproc, knowledge-catalog, firestore-native, oracledb. Ninguno tiene un skill propio en skills/cloud/ —verificable con ls skills/cloud | grep -Ei "looker|dataproc|firestore|knowledge|oracle", que solo devuelve google-cloud-solution-agentic-analytics-spark-knowledge-catalog, un skill de solución que usa Knowledge Catalog pero no es el plugin del producto.
La dirección contraria también existe. skills/ads/google-ads-api-mcp-setup es un skill del catálogo cuyo trabajo es precisamente instalar un servidor MCP a mano. Su description real:
“Guides developers through downloading, configuring, and installing the official open-source Google Ads MCP Server. Use this skill when a user wants to connect their AI assistant (such as Gemini, Claude Code, or Cursor) to their Google Ads account to query campaigns or retrieve reporting metrics using natural language.”
Es un skill haciendo el trabajo que en el mundo de los plugins haría un mcp.json: instrucciones en prosa para que el agente edite tu configuración, exporte variables como GOOGLE_ADS_DEVELOPER_TOKEN y arranque el servidor. Lo detallamos en el capítulo 10. Es la mejor ilustración de la frontera: cuando no hay plugin empaquetado, el skill suple con texto lo que el formato haría con un archivo.
Qué llevarse a la práctica
Tres cosas concretas si vas a trabajar con este repositorio.
Verifica siempre el ref, no la tabla. Las versiones están duplicadas en cuatro lugares y solo dos entran en el procedimiento documentado de subida. La fuente más fiable es .gitmodules más el ref del marketplace.json; el README es el más propenso a quedarse atrás.
No busques configuración MCP dentro de google/skills. No la hay. Si necesitas saber qué herramientas expone el plugin spanner, hay que ir al mcp.json de gemini-cli-extensions/spanner en la etiqueta 0.3.1.
Y si vas a publicar tu propio catálogo, la lección del repositorio de Google es que el paquete lo estandariza APS y el índice lo decides tú —hoy, una vez por cada harness al que quieras llegar. Cómo empaquetar tus propios skills siguiendo el mismo patrón es el tema del capítulo final.
Resumen
google/skillsno contiene ningún plugin: no hay un soloplugin.jsonnimcp.jsonen el árbol. Contiene punteros a 16 plugins que viven en repositorios upstream, principalmente bajogemini-cli-extensions..claude-plugin/marketplace.jsondeclaraname: "google-plugins"—el sufijo literal declaude plugin install <plugin>@google-plugins—,owner.name: "Google LLC",metadata.version: "0.0.1"y 16 entradas de tres campos:name,sourceydescription.- Quince entradas usan
source: "github"conrepoyref; solodb-context-engineeringusagit-subdirconurlypath: "plugin", porque su plugin es un subdirectorio de un repositorio mayor. - Tres nombres de plugin no coinciden con su repositorio:
bigtable,bigqueryydb-context-engineering. .agents/plugins/marketplace.jsones un manifiesto paralelo con otro esquema:interface.displayNameen vez deowner/metadata,source: "url"con la URL.gitcompleta, 15 entradas en vez de 16, y dos campos extra por entrada —policyconinstallation: "AVAILABLE"yauthentication: "ON_INSTALL", ycategorycon una tercera taxonomía distinta a la de los skills.plugins/cloud/data-agent-kit/tiene un solo archivo real, elREADME.md; sus 16 directorios son submódulos vacíos hastagit submodule update --init. Existen porque Antigravity CLI aún no soporta manifiestos de marketplace, y el propio README los declara retirables cuando lo soporte..gitmodulespinnea cada submódulo conbranch = <tag>, usando la clave de rama para inmovilizar una etiqueta de release.- La Agent Plugins Specification 1.0.0 define
plugin.json, la ubicación fijaskills/, la ubicación fijamcp.json, el campoextensionsy las variablesPLUGIN_ROOTyPLUGIN_DATA. No menciona marketplaces ni una sola vez. Todo lo de este capítulo es convención de producto rellenando ese hueco.