feat(codex): Add repo-local plugin marketplace support

Add Codex marketplace metadata and a repo-local plugin scaffold so the repository can be installed as a Codex plugin without duplicating the skills catalog.

Document the new integration path and cover it with a regression test to keep the marketplace entry and plugin manifest in sync.
This commit is contained in:
sickn33
2026-03-27 04:10:20 +01:00
parent 367c4e0915
commit 57e90d0f83
7 changed files with 132 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
{
"name": "antigravity-awesome-skills",
"interface": {
"displayName": "Antigravity Awesome Skills"
},
"plugins": [
{
"name": "antigravity-awesome-skills",
"source": {
"source": "local",
"path": "./plugins/antigravity-awesome-skills"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}
]
}

View File

@@ -211,6 +211,15 @@ If you use Claude Code and prefer the plugin marketplace flow, this repository n
This installs the same repository-backed skill library through Claude Code's plugin marketplace entrypoint.
### Option C: Codex plugin marketplace metadata
If you use Codex and prefer a marketplace-style plugin source instead of copying skills into `.codex/skills/`, this repository now ships:
- `.agents/plugins/marketplace.json`
- `plugins/antigravity-awesome-skills/.codex-plugin/plugin.json`
The Codex plugin points at the same curated `skills/` tree through a repo-local plugin entry, so the library can be exposed as an installable Codex plugin source without duplicating the catalog.
## Choose Your Tool
| Tool | Install | First Use |

View File

@@ -25,6 +25,8 @@ Install the library into your Codex path, then invoke focused skills directly in
npx antigravity-awesome-skills --codex
```
If you prefer a plugin-style Codex integration, this repository also ships repo-local plugin metadata in `.agents/plugins/marketplace.json` and `plugins/antigravity-awesome-skills/.codex-plugin/plugin.json`.
### Verify the install
```bash

View File

@@ -0,0 +1,38 @@
{
"name": "antigravity-awesome-skills",
"version": "8.10.0",
"description": "Repository-backed Codex plugin for the Antigravity Awesome Skills library.",
"author": {
"name": "sickn33 and contributors",
"url": "https://github.com/sickn33/antigravity-awesome-skills"
},
"homepage": "https://github.com/sickn33/antigravity-awesome-skills",
"repository": "https://github.com/sickn33/antigravity-awesome-skills",
"license": "MIT",
"keywords": [
"codex",
"skills",
"agentic-skills",
"developer-tools",
"productivity"
],
"skills": "./skills/",
"interface": {
"displayName": "Antigravity Awesome Skills",
"shortDescription": "1,328+ reusable skills for coding, security, product, and ops workflows.",
"longDescription": "Install the Antigravity Awesome Skills catalog as a Codex plugin and expose the repository's curated skills library through a single marketplace entry.",
"developerName": "sickn33 and contributors",
"category": "Productivity",
"capabilities": [
"Interactive",
"Write"
],
"websiteURL": "https://github.com/sickn33/antigravity-awesome-skills",
"defaultPrompt": [
"Use @brainstorming to plan a new feature.",
"Use @test-driven-development to fix a bug safely.",
"Use @lint-and-validate to verify this branch."
],
"brandColor": "#111827"
}
}

View File

@@ -0,0 +1 @@
../../skills

View File

@@ -0,0 +1,61 @@
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const { findProjectRoot } = require("../../lib/project-root");
const projectRoot = findProjectRoot(__dirname);
const marketplacePath = path.join(projectRoot, ".agents", "plugins", "marketplace.json");
const marketplace = JSON.parse(fs.readFileSync(marketplacePath, "utf8"));
assert.strictEqual(
marketplace.name,
"antigravity-awesome-skills",
"Codex marketplace name should match the repository plugin name",
);
assert.strictEqual(
marketplace.interface?.displayName,
"Antigravity Awesome Skills",
"Codex marketplace display name should be present",
);
assert.ok(Array.isArray(marketplace.plugins), "marketplace.json must define a plugins array");
assert.ok(marketplace.plugins.length > 0, "marketplace.json must contain at least one plugin");
const pluginEntry = marketplace.plugins.find((plugin) => plugin.name === "antigravity-awesome-skills");
assert.ok(pluginEntry, "marketplace.json must include the antigravity-awesome-skills plugin entry");
assert.deepStrictEqual(
pluginEntry.source,
{
source: "local",
path: "./plugins/antigravity-awesome-skills",
},
"Codex plugin entry should resolve to the repo-local plugin directory",
);
assert.strictEqual(
pluginEntry.policy?.installation,
"AVAILABLE",
"Codex plugin entry must include policy.installation",
);
assert.strictEqual(
pluginEntry.policy?.authentication,
"ON_INSTALL",
"Codex plugin entry must include policy.authentication",
);
assert.strictEqual(
pluginEntry.category,
"Productivity",
"Codex plugin entry must include a category",
);
const pluginRoot = path.join(projectRoot, "plugins", "antigravity-awesome-skills");
const pluginManifestPath = path.join(pluginRoot, ".codex-plugin", "plugin.json");
const pluginManifest = JSON.parse(fs.readFileSync(pluginManifestPath, "utf8"));
assert.strictEqual(pluginManifest.name, "antigravity-awesome-skills");
assert.strictEqual(pluginManifest.version, "8.10.0");
assert.strictEqual(pluginManifest.skills, "./skills/");
const pluginSkillsPath = path.join(pluginRoot, "skills");
assert.ok(fs.existsSync(pluginSkillsPath), "Codex plugin skills path must exist");
assert.ok(fs.statSync(pluginSkillsPath).isDirectory(), "Codex plugin skills path must be a directory");
console.log("ok");

View File

@@ -14,6 +14,7 @@ const LOCAL_TEST_COMMANDS = [
[path.join(TOOL_TESTS, "apply_skill_optimization_security.test.js")],
[path.join(TOOL_TESTS, "build_catalog_bundles.test.js")],
[path.join(TOOL_TESTS, "claude_plugin_marketplace.test.js")],
[path.join(TOOL_TESTS, "codex_plugin_marketplace.test.js")],
[path.join(TOOL_TESTS, "installer_antigravity_guidance.test.js")],
[path.join(TOOL_TESTS, "jetski_gemini_loader.test.cjs")],
[path.join(TOOL_TESTS, "npm_package_contents.test.js")],