← ClaudeAtlas

create-agent-pluginlisted

Build a new Gallager sidecar plugin from scratch — a standalone executable that teaches the Gallager macOS app to monitor a coding agent (track session state, raise attention badges, fire notifications, push text into panes). Use this skill whenever someone wants to add support for a coding agent that Gallager doesn't already handle (anything beyond the built-in Claude Code and Codex), wire an agent's hooks into Gallager, write or debug a "sidecar plugin", build a Gallager plugin, or distribute one via URL. Trigger on phrases like "make a Gallager plugin for <agent>", "I want Gallager to track my <CLI/agent> sessions", "add <agent> support to Gallager", "write a sidecar plugin", "create an agent plugin", or "how do I get my agent's hooks into Gallager".
gpambrozio/Gallager · ★ 3 · AI & Automation · score 66
Install: claude install-skill gpambrozio/Gallager
# Create a Gallager Agent (Sidecar) Plugin A **sidecar plugin** is a standalone executable Gallager spawns as a child process and talks to over stdin/stdout using JSON-RPC. It lets a third party add a brand-new coding agent to Gallager — out of process, crash-isolated, no changes to the app. Your plugin's job: turn your agent's hook events into the agent-blind `PluginEvent` shape Gallager understands (session working / done / needs-attention, notifications, project name), and optionally push text or keys back into the pane. This skill ships a runnable Python starter and the full protocol contract. Lean on them — don't hand-write the framing from memory. ## Two silent-drop traps to internalize first Both make a plugin that "loads but does nothing", and neither logs an error anywhere you'll see. Get these right before anything else. **1. Three JSON places, two casings.** Gallager speaks JSON in three places: - **`plugin.json` manifest** → snake_case (`schema_version`, `display_name`, `short_name`) - **Ingress *socket* frame** (your hook → app) → snake_case (`plugin_id`, `context`, `payload`) - **Stdio *transport* RPC** (app ↔ your sidecar) → **camelCase** (`pluginID`, `sessionID`, `tmuxPane`, `pluginRoot`) So the `translate_event` params you read and the `PluginEvent` you write back over stdio are **camelCase**. A `plugin_id` key in a `translate_event` reply is silently dropped. (Reference §1.) **2. `appActions` is required on every `PluginEvent`.** It is non-Optional i