Plugins: hooks and slotsThe pipeline, the panels, the code view and the model pickers are all extension points. Bundled plugins ship in the alpha and writing your own is free on every tier, including Free. The marketplace opens with the public beta; Solo and up include the paid premium plugins.Hook pointsHOOKWHAT YOU CAN DOstage.transition(from, to)Take over any arrow: gate it, reroute it, run something first, or refuse with a reason on the card.agent.providerRun sessions and supply per-stage commands.llm.providerAdd models to every picker.panel.slot(view, region)Add content to the session card pane, the code-view right pane, the board header or project settings.editor.contextMenuAdd code-view right-click commands, with access to the selection, file and symbol.keymap.commandRegister commands that appear in the keymap table and the command palette.mcp.serverExpose an MCP server to sessions, with per-server permissions.sdlc.workflowRegister a whole stage set with its contracts and transitions. The seven-stage default is itself a plugin using this hook, so an alternative workflow is a peer, not an override.card.sectionAdd a required section to a stage contract, so a stage cannot be left without the data your team needs.deliver.targetOwn what Deliver means: a GitHub PR, a GitLab MR, a push, a patch on a share, or your own pipeline.file.explainSupply the code view’s goal, talks-to and per-function notes. Pick the model that writes them, including a local one.usage.reporterFeed Insights: report tokens and cost per request so spend is attributed to cards.report.redactorReplace the obfuscation rules used by problem reports with your own, for stricter environments.theme.registerShip a theme as tokens and a name. Themes are plugins; the four built-in ones are bundled that way.settings.pageContribute a top-level Settings page. MCP servers and Skills are Claude concepts, so the Claude provider contributes those pages rather than core owning them; another provider brings its own.prompt.fileExpose a prompt or template file as an editable setting, so its contents can be changed in Settings and not just the command line that calls it.
What is core, and what is a pluginThe rule: Grid Console keeps what you must be able to trust, and everything with an opinion in it ships as a plugin. Bundled plugins are installed and on by default, so the product works out of the box, and can be replaced or switched off.CORE, NOT REPLACEABLEWHYcards and stage stateThe unit of work and its history. A plugin that could rewrite this would break every guarantee above it.worktrees and rewindIsolation and undo. These have to hold when a plugin misbehaves.the code indexWhat powers callers, dependencies and the file map.attention and the glowWhere to look is the product. It is not configurable away.licence and auditChecked in core, so a plugin cannot grant itself a tier.action historyEvery command an agent ran, recorded before a plugin sees it.
Everything else is a plugin, including things you might expect to be built in:BUNDLED PLUGINWHAT IT OWNSgrid-sdlc-defaultThe seven stages, their contracts and their per-stage commands. Swap it for a four-stage trunk flow or a two-gate regulated flow and the board follows.claude-providerSessions through Claude Code, and the claude /prepare, /build, /self-review commands the default SDLC calls.github-deliverWhat Deliver does: commit, push, open the PR, report back. gitlab-deliver and azure-deliver are siblings, not special cases.grid-themesGrid dark, Dusk, Grid light and High contrast.grid-explainThe code view’s file summaries and inline notes, and which model writes them.grid-usageThe token and cost accounting behind Insights.grid-redactThe obfuscation applied to problem reports before you send one.
This is why agent-agnostic is a structural claim rather than a promise: Claude is bundled today because it is what most people have, but it sits behind the same hook a Codex or Gemini provider will use, and the pipeline that calls it is a plugin too.Plugin settings come from the manifestA plugin declares its own settings in grid-plugin.json, the way an editor extension does. Grid Console reads that block and renders the controls itself, so a plugin does not have to be loaded for its settings to be visible or changed: the values live in your workspace config, and the plugin receives them when it activates."configuration": { "commands.prepare": { "type": "string", "default": "claude /prepare {card.md}", "title": "Prepare command", "scope": "project" }, "defaultModel": { "type": "enum", "options": ["fable", "opus", "sonnet", "haiku"], "default": "sonnet" }}
Types are string, number, bool, enum, string[], path and map. scope decides where a value can be set: workspace, project, or both, with the project value winning. Secrets are never settings: a plugin asks for a credential through the keychain, which is why an API key never lands in a config file you might commit.This is how the per-stage commands are editable. claude-provider contributes commands.prepare, commands.build and commands.review (the actual prompt files live in .claude/commands/, so they diff and version like any other file), and grid-sdlc-default decides which transition calls which one. Open Settings → Workspace → Plugins, expand a plugin, and you are editing exactly that block.A plugin can also contribute a top-level Settings page through settings.page, which is how MCP servers and Skills work: both are Claude concepts, so claude-provider owns those pages and they carry its name in the sidebar. Swap the provider and the sidebar changes with it, instead of core pretending every agent speaks MCP.Command contents are editable too, not only the command line. prompt.file exposes .claude/commands/prepare.md, build.md and self-review.md as settings: open one from the plugin card and you are editing the prompt the stage actually sends, with a reset-to-default and a diff against the shipped version. The files stay on disk, so they commit and review like code.Where to find them: every plugin card shows a settings from the manifest row. The same values also appear inline on the pipeline table, next to the arrow that runs them, because that is usually where you are when you want to change one.Writing a stage hookA stage hook is a function that receives the card, the diff and the transition, and returns allow, deny with a reason, or a replacement command. Use it to require a ticket reference before Deliver, to run a security scan between Doing and Review, or to route Verify through your own pipeline.export function onStageTransition(ctx) { if (ctx.to === "deliver" && !ctx.card.sections["Ticket"]) { return { deny: "No ticket reference on the card" }; } return { allow: true };}
Panels and slotsPanels are declarative: you name a slot, return markup built from Grid Console’s tokens, and your panel inherits the theme, including High contrast. A panel can add its own section to a card contract so the data it needs is always there.MCP servers and skillsMCP servers are managed per project with explicit permissions: read only, ask to write, always ask, or off. Skills are prompt-and-code bundles with a visible source (from this repo, learned from a card, bundled, or built by you), and the skill builder writes one from a description or an existing script.Testing and packaginggrid plugin dev runs your plugin against a scratch workspace with a fake pipeline, so you can fire a transition without a real card. grid plugin pack produces the signed artefact and validates the manifest, permissions and declared network domains.