From 7114a6ac8a4e89d37f8661edd4a6734d6f2f51cd Mon Sep 17 00:00:00 2001 From: yg Date: Wed, 1 Jul 2026 10:28:46 +0900 Subject: [PATCH] test(codex): lock in marketplace + hooks-free manifest invariants Superpowers v6.1.0 codified two invariants in tests/codex/test-marketplace-manifest.sh after removing the plugin-installed Codex SessionStart hook. Port the same defensive checks to srepowers' multi-plugin model: - Assert .agents/plugins/marketplace.json has name, interface.displayName, and a plugins list, and that every entry's policy is installation=AVAILABLE / authentication=ON_INSTALL. - Assert every packaged Codex plugin manifest (plugins/*/.codex-plugin/plugin.json) ships no hooks field, so a SessionStart hook can never sneak back into a packaged plugin and fire on every install. These invariants already hold today; the test is a regression net. No superpowers v6.1.0 theme is otherwise applicable to srepowers: the multi-harness tool-mapping references, Gemini support, and plugin-installed Codex hook that v6.1.0 prunes were never adopted here. srepowers already ships .agents/plugins/marketplace.json (superpowers v6.0.x did not), so only the test was missing. Bump all 11 manifests 5.5.0 -> 5.6.0 (patch: test-only, no behavior change). --- .agents/plugins/marketplace.json | 8 ++++---- .claude-plugin/marketplace.json | 10 +++++----- .codex-plugin/plugin.json | 2 +- .../srepowers-core/.claude-plugin/plugin.json | 2 +- .../srepowers-core/.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../srepowers-infra/.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- tests/codex/run-skill-tests.sh | 20 +++++++++++++++++++ 12 files changed, 38 insertions(+), 18 deletions(-) diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 1550c5a..97ca67d 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -12,7 +12,7 @@ { "name": "srepowers-core", "description": "SRE workflow spine, mandatory gates, and incident response", - "version": "5.5.0", + "version": "5.6.0", "source": { "source": "local", "path": "./plugins/srepowers-core" @@ -30,7 +30,7 @@ { "name": "srepowers-domain", "description": "Software engineering domain expertise for infrastructure engineers", - "version": "5.5.0", + "version": "5.6.0", "source": { "source": "local", "path": "./plugins/srepowers-domain" @@ -48,7 +48,7 @@ { "name": "srepowers-infra", "description": "Portable Proxmox, Puppet analysis, DNS, TLS, backup, and GitLab CI/CD administration", - "version": "5.5.0", + "version": "5.6.0", "source": { "source": "local", "path": "./plugins/srepowers-infra" @@ -66,7 +66,7 @@ { "name": "srepowers-private", "description": "Site-specific Puppet, Hiera, and Ansible operational workflow skills (sanitized templates)", - "version": "5.5.0", + "version": "5.6.0", "source": { "source": "local", "path": "./plugins/srepowers-private" diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index fcf3692..bf49c9e 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -5,13 +5,13 @@ "email": "yg-codes@users.noreply.github.com" }, "metadata": { - "version": "5.5.0", + "version": "5.6.0", "description": "SRE infrastructure skills marketplace — workflow, domain expertise, and infrastructure administration plugins" }, "plugins": [ { "name": "srepowers-core", - "version": "5.5.0", + "version": "5.6.0", "description": "SRE workflow spine, mandatory gates, and incident response — verification-first operations with TDO and SDO", "source": "./plugins/srepowers-core", "author": { @@ -23,7 +23,7 @@ }, { "name": "srepowers-domain", - "version": "5.5.0", + "version": "5.6.0", "description": "Software engineering domain expertise — Go, Python, Rust, Kubernetes, Terraform, containers, networking, security, testing, and more", "source": "./plugins/srepowers-domain", "author": { @@ -35,7 +35,7 @@ }, { "name": "srepowers-infra", - "version": "5.5.0", + "version": "5.6.0", "description": "Portable infrastructure administration — Proxmox VE, Puppet code analysis, DNS, TLS/PKI, backup, change management, and GitLab CI/CD pipelines", "source": "./plugins/srepowers-infra", "author": { @@ -47,7 +47,7 @@ }, { "name": "srepowers-private", - "version": "5.5.0", + "version": "5.6.0", "description": "Site-specific operational workflows (sanitized templates) — Puppet deploy/release/MR lifecycle, Hiera debugging, and Ansible operations", "source": "./plugins/srepowers-private", "author": { diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 3526cfd..31426a4 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "srepowers", "description": "SRE infrastructure skills marketplace with 3 plugins: core (workflow + gates + incident), domain (Go, Python, Rust, K8s, Terraform, security, etc.), infra (Proxmox, Puppet, GitLab CI/CD)", - "version": "5.5.0", + "version": "5.6.0", "author": { "name": "yg-codes", "email": "yg-codes@users.noreply.github.com" diff --git a/plugins/srepowers-core/.claude-plugin/plugin.json b/plugins/srepowers-core/.claude-plugin/plugin.json index 9ffadaa..937e596 100644 --- a/plugins/srepowers-core/.claude-plugin/plugin.json +++ b/plugins/srepowers-core/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "srepowers-core", - "version": "5.5.0", + "version": "5.6.0", "description": "SRE workflow spine, mandatory gates, and incident response — verification-first operations with Test-Driven Operation and Subagent-Driven Operation", "author": { "name": "yg-codes", diff --git a/plugins/srepowers-core/.codex-plugin/plugin.json b/plugins/srepowers-core/.codex-plugin/plugin.json index 9ffadaa..937e596 100644 --- a/plugins/srepowers-core/.codex-plugin/plugin.json +++ b/plugins/srepowers-core/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "srepowers-core", - "version": "5.5.0", + "version": "5.6.0", "description": "SRE workflow spine, mandatory gates, and incident response — verification-first operations with Test-Driven Operation and Subagent-Driven Operation", "author": { "name": "yg-codes", diff --git a/plugins/srepowers-domain/.claude-plugin/plugin.json b/plugins/srepowers-domain/.claude-plugin/plugin.json index f3f649a..a144394 100644 --- a/plugins/srepowers-domain/.claude-plugin/plugin.json +++ b/plugins/srepowers-domain/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "srepowers-domain", - "version": "5.5.0", + "version": "5.6.0", "description": "Software engineering domain expertise — Go, Python, Rust, Kubernetes, Terraform, containers, networking, security, testing, and more", "author": { "name": "yg-codes", diff --git a/plugins/srepowers-domain/.codex-plugin/plugin.json b/plugins/srepowers-domain/.codex-plugin/plugin.json index f3f649a..a144394 100644 --- a/plugins/srepowers-domain/.codex-plugin/plugin.json +++ b/plugins/srepowers-domain/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "srepowers-domain", - "version": "5.5.0", + "version": "5.6.0", "description": "Software engineering domain expertise — Go, Python, Rust, Kubernetes, Terraform, containers, networking, security, testing, and more", "author": { "name": "yg-codes", diff --git a/plugins/srepowers-infra/.claude-plugin/plugin.json b/plugins/srepowers-infra/.claude-plugin/plugin.json index ae08c87..7685a4b 100644 --- a/plugins/srepowers-infra/.claude-plugin/plugin.json +++ b/plugins/srepowers-infra/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "srepowers-infra", - "version": "5.5.0", + "version": "5.6.0", "description": "Portable infrastructure administration — Proxmox VE, Puppet code analysis, PuppetDB queries, DNS, TLS/PKI, backup, change management, and GitLab CI/CD pipelines", "author": { "name": "yg-codes", diff --git a/plugins/srepowers-infra/.codex-plugin/plugin.json b/plugins/srepowers-infra/.codex-plugin/plugin.json index 29dd3a8..f45e69d 100644 --- a/plugins/srepowers-infra/.codex-plugin/plugin.json +++ b/plugins/srepowers-infra/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "srepowers-infra", - "version": "5.5.0", + "version": "5.6.0", "description": "Portable infrastructure administration — Proxmox VE, Puppet code analysis, DNS, TLS/PKI, backup, change management, and GitLab CI/CD pipelines", "author": { "name": "yg-codes", diff --git a/plugins/srepowers-private/.claude-plugin/plugin.json b/plugins/srepowers-private/.claude-plugin/plugin.json index 22da4f2..33d75a6 100644 --- a/plugins/srepowers-private/.claude-plugin/plugin.json +++ b/plugins/srepowers-private/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "srepowers-private", - "version": "5.5.0", + "version": "5.6.0", "description": "Site-specific operational workflows — Puppet deploy/release/MR lifecycle, Hiera debugging, and Ansible operations. Sanitized templates: replace placeholders with your environment's values.", "author": { "name": "yg-codes", diff --git a/plugins/srepowers-private/.codex-plugin/plugin.json b/plugins/srepowers-private/.codex-plugin/plugin.json index 22da4f2..33d75a6 100644 --- a/plugins/srepowers-private/.codex-plugin/plugin.json +++ b/plugins/srepowers-private/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "srepowers-private", - "version": "5.5.0", + "version": "5.6.0", "description": "Site-specific operational workflows — Puppet deploy/release/MR lifecycle, Hiera debugging, and Ansible operations. Sanitized templates: replace placeholders with your environment's values.", "author": { "name": "yg-codes", diff --git a/tests/codex/run-skill-tests.sh b/tests/codex/run-skill-tests.sh index bbd30f0..f15b9df 100755 --- a/tests/codex/run-skill-tests.sh +++ b/tests/codex/run-skill-tests.sh @@ -49,6 +49,17 @@ plugins = ( ) marketplace = json.loads(Path(".agents/plugins/marketplace.json").read_text()) + +# v5.6.0 invariant (superpowers v6.1.0 parity): the Codex marketplace manifest +# must be installable — it needs a name, an interface.displayName, and a list +# of plugin entries, each pointing at a packaged plugin under ./plugins/. +if not isinstance(marketplace.get("plugins"), list): + raise SystemExit(".agents/plugins/marketplace.json plugins must be a list") +if not marketplace.get("name"): + raise SystemExit(".agents/plugins/marketplace.json missing name") +if not marketplace.get("interface", {}).get("displayName"): + raise SystemExit(".agents/plugins/marketplace.json missing interface.displayName") + entries = {entry["name"]: entry for entry in marketplace["plugins"]} root_manifest = json.loads(Path(".codex-plugin/plugin.json").read_text()) versions = {root_manifest["version"]} @@ -82,6 +93,12 @@ for plugin in plugins: raise SystemExit(f"{codex_manifest} name mismatch") if manifest.get("skills") != "./skills/": raise SystemExit(f"{codex_manifest} skills path must be ./skills/") + # v5.6.0 invariant (superpowers v6.1.0 parity): packaged Codex plugins ship + # no SessionStart hook. The bootstrap hook lives at repo-root .codex/hooks.json + # for repo-dev convenience only — it must not appear in a packaged plugin + # manifest, where it would fire on every install. + if manifest.get("hooks") is not None: + raise SystemExit(f"{codex_manifest} must not declare a hooks field") skills = sorted(path.parent.name for path in skills_dir.glob("*/SKILL.md")) commands = sorted(path.stem for path in commands_dir.glob("*.md")) @@ -105,6 +122,9 @@ for plugin in plugins: raise SystemExit(f"{plugin} marketplace source.path mismatch") if entry.get("category") != "Engineering": raise SystemExit(f"{plugin} marketplace category must be Engineering") + policy = entry.get("policy") + if policy != {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}: + raise SystemExit(f"{plugin} marketplace policy must be installation=AVAILABLE, authentication=ON_INSTALL") if len(versions) != 1: raise SystemExit(f"Codex marketplace and plugin versions differ: {sorted(versions)}")