Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .antigravity-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,21 @@
"displayName": "pstack",
"version": "0.15.36",
"description": "if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence.",
"author": {
"name": "Lauren Tan"
},
"homepage": "https://github.com/pstack-ports/agy-pstack",
"repository": "https://github.com/pstack-ports/agy-pstack",
"license": "MIT",
"keywords": [
"pstack",
"poteto-mode",
"workflow",
"principles",
"agent-style",
"subagents",
"unslop"
],
"logo": "assets/logo.png",
"suggestedPrompts": [
"/poteto-mode reproduce and fix this bug with runtime evidence",
Expand Down
31 changes: 14 additions & 17 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ jobs:
run: |
AGY_HOME="$(mktemp -d)"
trap 'rm -rf "$AGY_HOME"' EXIT
HOME="$AGY_HOME" agy plugin validate .
HOME="$AGY_HOME" agy plugin validate --strict .
HOME="$AGY_HOME" agy plugin install .
HOME="$AGY_HOME" agy plugin validate "$AGY_HOME/.gemini/config/plugins/pstack"
HOME="$AGY_HOME" agy plugin validate --strict "$AGY_HOME/.gemini/config/plugins/pstack"
HOME="$AGY_HOME" agy plugin list --json > "$AGY_HOME/plugins.json"
AGY_PLUGINS_JSON="$AGY_HOME/plugins.json" bun -e '
import { readdirSync, readFileSync, existsSync, statSync } from "node:fs";
Expand All @@ -73,42 +73,39 @@ jobs:
const errors = [];
const fail = (msg) => errors.push(msg);

const pluginJson = JSON.parse(readFileSync("plugin.json", "utf8"));
const agyPluginJson = JSON.parse(readFileSync(".antigravity-plugin/plugin.json", "utf8"));
if (existsSync("plugin.json")) {
fail("root plugin.json should not exist alongside .antigravity-plugin/plugin.json");
}
const pluginJson = JSON.parse(readFileSync(".antigravity-plugin/plugin.json", "utf8"));

const allowedPluginKeys = new Set([
"$schema",
"name",
"displayName",
"version",
"description",
"author",
"homepage",
"repository",
"license",
"keywords",
"extensions",
"logo",
"suggestedPrompts",
]);
for (const key of Object.keys(pluginJson)) {
if (!allowedPluginKeys.has(key)) {
fail(`plugin.json contains unsupported key "${key}"`);
fail(`.antigravity-plugin/plugin.json contains unsupported key "${key}"`);
}
}
if (pluginJson.$schema !== "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json") {
fail(`plugin.json $schema must be https://agent-plugins.org/schemas/1.0.0/plugin.schema.json`);
}
if (!/^(?!.*(?:--|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/.test(pluginJson.name ?? "")) {
fail(`plugin.json has invalid name "${pluginJson.name}"`);
fail(`.antigravity-plugin/plugin.json has invalid name "${pluginJson.name}"`);
}
for (const field of ["name", "version", "description"]) {
if (!pluginJson[field] || typeof pluginJson[field] !== "string") {
fail(`plugin.json missing string field "${field}"`);
}
if (pluginJson[field] !== agyPluginJson[field]) {
fail(`Manifest mismatch for "${field}": plugin.json="${pluginJson[field]}" vs .antigravity-plugin/plugin.json="${agyPluginJson[field]}"`);
fail(`.antigravity-plugin/plugin.json missing string field "${field}"`);
}
}
if (!agyPluginJson.logo || !existsSync(agyPluginJson.logo)) {
fail(`.antigravity-plugin/plugin.json logo "${agyPluginJson.logo}" does not exist`);
if (!pluginJson.logo || !existsSync(pluginJson.logo)) {
fail(`.antigravity-plugin/plugin.json logo "${pluginJson.logo}" does not exist`);
}

const parseFrontmatter = (filePath) => {
Expand Down
21 changes: 0 additions & 21 deletions plugin.json

This file was deleted.

Loading