ruflo-swarm's hooks/hooks.json declares a Claude Code function-hook
module (modules: ["./register.ts"]) for the live swarm pane. Codex's
native plugin hook-manifest loader accepts only description and hooks
at the top level and hard-fails with `unknown field "modules"`,
dropping the plugin's hook registration entirely (#3688).
Add plugins/ruflo-swarm/.codex-plugin/plugin.json, the native override
Codex already prefers over .claude-plugin/plugin.json (same convention
used by ruflo-adr/ruflo-ddd/ruflo-sparc), pointing at a new
hooks/codex-hooks.json with an explicit no-op (`hooks: {}`). ruflo-swarm's
function hooks are a pure UI pane with no guard/security logic to port,
so an explicit no-op — not invented command hooks — is the correct
fix, matching the issue's own proposed resolution.
The Claude Code manifest and register.ts module are untouched.
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_01QFyyphjiSXRE1TS2rRnEwU