Windmill Trigger Type Checklist
windmill-labs/windmill
Checklist of every backend, frontend, CLI and capture change needed to add a new TriggerCrud-based trigger type, such as Azure, GCP or Kafka, to Windmill.
Create new sidecar plugins implementing the plugin.Plugin interface, rendering views with Bubble Tea, handling keyboard input via keymap contexts, and integrating with the app shell (footer hints…
$ npx skills add marcus/sidecar --skill create-plugin -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install marcus/sidecar create-plugin --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/marcus/sidecar.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/create-plugin .claude/skills/create-plugin && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "create-plugin" agent skill from https://github.com/marcus/sidecar/tree/main/.claude/skills/create-plugin into .claude/skills/create-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-plugin", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/marcus/sidecar/tree/main/.claude/skills/create-pluginType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add marcus/sidecar --skill create-plugin -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install marcus/sidecar create-plugin --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/marcus/sidecar.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/create-plugin .agents/skills/create-plugin && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "create-plugin" agent skill from https://github.com/marcus/sidecar/tree/main/.claude/skills/create-plugin into .agents/skills/create-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-plugin", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add marcus/sidecar --skill create-plugin -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install marcus/sidecar create-plugin --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/marcus/sidecar.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/create-plugin .cursor/skills/create-plugin && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "create-plugin" agent skill from https://github.com/marcus/sidecar/tree/main/.claude/skills/create-plugin into .cursor/skills/create-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-plugin", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/marcus/sidecar.git --path .claude/skills/create-plugin--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add marcus/sidecar --skill create-plugin -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install marcus/sidecar create-plugin --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/marcus/sidecar.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/create-plugin .gemini/skills/create-plugin && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "create-plugin" agent skill from https://github.com/marcus/sidecar/tree/main/.claude/skills/create-plugin into .gemini/skills/create-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-plugin", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install marcus/sidecar create-pluginInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add marcus/sidecar --skill create-plugin -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/marcus/sidecar.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/create-plugin .github/skills/create-plugin && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "create-plugin" agent skill from https://github.com/marcus/sidecar/tree/main/.claude/skills/create-plugin into .github/skills/create-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-plugin", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add marcus/sidecar --skill create-plugin -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install marcus/sidecar create-plugin --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/marcus/sidecar.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/create-plugin .opencode/skills/create-plugin && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "create-plugin" agent skill from https://github.com/marcus/sidecar/tree/main/.claude/skills/create-plugin into .opencode/skills/create-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-plugin", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
create-pluginCreate new sidecar plugins implementing the plugin.Plugin interface, rendering views with Bubble Tea, handling keyboard input via keymap contexts, and integrating with the app shell (footer hints…
Create Plugin is an agent skill from marcus/sidecar. Create new sidecar plugins implementing the plugin.Plugin interface, rendering views with Bubble Tea, handling keyboard input via keymap contexts, and integrating with the app shell (footer hints, event bus, adapters). Use when creating a new plugin, modifying plugin architecture, or debugging plugin rendering/lifecycle issues. See references/ for sidebar list and fixed footer layout details.
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/fixed-footer-layout-guide.md` and `references/sidebar-list-guide.md`).
It sits in Backend & APIs, covering Event-driven systems. The repository describes itself as: Use sidecar next to CLI agents for diffs, file trees, conversation history, and task management with td. The licence is MIT.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 3792a4e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are go).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Create Plugin loads about 2.3k tokens when it runs, and up to ~3.8k if it reads all its reference files. Until then it costs about 102 tokens; SKILL.md has 757 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from marcus/sidecar at commit 3792a4e, republished under its MIT licence (© marcus). 757 words, ~2,333 tokens.
.claude/skills/create-plugin/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.This skill is the embedded class: a Go package compiled into Sidecar with its own Bubble Tea UI. If what you want is a tool's data in Sidecar — a searchable tab, rows that open into documents, panes beside a terminal — you almost certainly want a protocol plugin instead: an executable in any language answering five JSON methods, which Sidecar renders itself and which ships as a config entry rather than a Sidecar release. Read docs/guides/active/creating-plugins.md and stop here. Come back only when the screen itself is the point — a board, a queue, a layout the collection-and-document vocabulary cannot express — because everything below costs a release, a keymap pass, and a permanent place in the repository.
internal/app/model.go owns the active plugin index, dispatches key events, renders plugin views.internal/plugin/registry.go stores plugins, handles lifecycle with panic protection, keeps an unavailable map when Init fails (silent degradation).internal/plugin/plugin.go defines the interface every plugin must satisfy.internal/plugin/context.go provides WorkDir, ConfigDir, Adapters, EventBus, Logger, Epoch, and Keymap.internal/keymap maps keys to command IDs. Footer/help reads bindings by context using Plugin.Commands() + Plugin.FocusContext().Every plugin must implement all of these methods:
ID() string // Stable kebab-case identifier
Name() string // Short human label for headers/help
Icon() string // Single-character glyph for tab strip
Init(ctx *Context) error // Lightweight setup; return error to degrade gracefully
Start() tea.Cmd // Kick off async work (non-blocking)
Update(msg tea.Msg) (Plugin, tea.Cmd) // Pure state transition
View(width, height int) string // Render within provided dimensions
IsFocused() bool // Check focus state
SetFocused(bool) // App calls this on tab switch
Commands() []plugin.Command // Footer hints per context
FocusContext() string // Current context name for keymap
Stop() // Idempotent cleanupOptional: implement Diagnostics() []plugin.Diagnostic for the diagnostics overlay.
cmd/sidecar/main.go): registry.Register(myplugin.New()). No work here.ctx.Logger for warnings. Return error to degrade gracefully.tea.Batch. Never block.Msg types and tea.KeyMsg. Keep I/O in commands, not directly in Update.width/height.SetFocused called on tab switch. Pause expensive work when unfocused.sync.Once/flags.When switching projects/worktrees, async operations may deliver stale data. Use the epoch pattern:
type MyDataLoadedMsg struct {
Epoch uint64
Data string
Err error
}
func (m MyDataLoadedMsg) GetEpoch() uint64 { return m.Epoch }func (p *Plugin) loadData() tea.Cmd {
epoch := p.ctx.Epoch // Capture synchronously before closure
return func() tea.Msg {
data, err := fetchData()
return MyDataLoadedMsg{Epoch: epoch, Data: data, Err: err}
}
}case MyDataLoadedMsg:
if plugin.IsStale(p.ctx, msg) {
return p, nil // Discard stale message
}
p.data = msg.DataApply this to any async message that fetches data from filesystem/external sources or updates project-specific state.
git-status, git-diff). Return the active one from FocusContext().Commands(). These power footer hints and help overlay.internal/keymap/bindings.go.open-file, toggle-diff-mode).plugin.Command{
ID: "stage-file",
Name: "Stage", // Keep 1-2 words max
Category: plugin.CategoryGit,
Priority: 10, // Lower = higher priority; 0 treated as 99
Context: "git-status",
}Categories: CategoryNavigation, CategoryActions, CategoryView, CategorySearch, CategoryEdit, CategoryGit, CategorySystem
plugin-name for main viewplugin-name-detail for detail/previewplugin-name-modal for modalsplugin-name-search for search modesfunc (p *Plugin) Init(ctx *plugin.Context) error {
if ctx.Keymap != nil {
ctx.Keymap.RegisterPluginBinding("g g", "go-to-top", "my-context")
}
return nil
}ch := ctx.EventBus.Subscribe("topic") in Start(), forward messages into Update.ctx.EventBus.Publish("topic", event.NewEvent(event.TypeRefreshNeeded, "topic", payload)).App-level messages (internal/app/commands.go):
FocusPluginByIDMsg{PluginID} / app.FocusPlugin(id)File browser messages (internal/plugins/filebrowser/plugin.go):
NavigateToFileMsg{Path} - navigate to and preview a filePattern for cross-plugin navigation:
func (p *Plugin) openInFileBrowser(path string) tea.Cmd {
return tea.Batch(
app.FocusPlugin("file-browser"),
func() tea.Msg { return filebrowser.NavigateToFileMsg{Path: path} },
)
}PluginFocusedMsg (from internal/app): sent when your plugin becomes active tab. Use to refresh data only needed when visible:
case app.PluginFocusedMsg:
if p.pendingRefresh {
p.pendingRefresh = false
return p, p.refresh()
}func (p *Plugin) openFile(path string, lineNo int) tea.Cmd {
editor := p.ctx.Config.EditorCommand
return func() tea.Msg {
return plugin.OpenFileMsg{Editor: editor, Path: path, LineNo: lineNo}
}
}CRITICAL: Always constrain plugin output height. The app header/footer are always visible. Plugins must not exceed allocated height.
lipgloss.NewStyle().Width(width).Height(height).MaxHeight(height).Render(content)Do NOT render footers in plugin View(). The app renders footer using Commands() and keymap bindings.
Additional rendering rules:
View deterministic; drive dynamic data through state in Update.width/height in plugin state.\t to spaces before width checks.ansi.Truncate, lipgloss.Width) for content with escape codes.See references/sidebar-list-guide.md for scrollable list implementation patterns.
See references/fixed-footer-layout-guide.md for footer and layout math details.
Use internal/state to persist layout preferences across restarts:
state.State struct with getter/setter.Init(): if saved := state.GetMyPaneWidth(); saved > 0 { p.paneWidth = saved }_ = state.SetMyPaneWidth(p.paneWidth)ctx.Adapters holds integrations. Check capability in Init before using.Update.Init; registry records them without crashing.ctx.Logger with structured fields.internal/plugins/<id>/ with plugin.go plus supporting files.plugin.Plugin interface; consider DiagnosticProvider.cmd/sidecar/main.go.internal/keymap/bindings.go.Commands() covers every binding so hints/help work.Init; degrade gracefully.Stop; keep Start/Update non-blocking.type RefreshMsg struct{}) to keep Update readable.--debug for verbose logs from registry and plugins.© marcus, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in .claude/skills/create-plugin of marcus/sidecar.
Open the folder on GitHubat commit 3792a4e
Create Plugin next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Create Plugin this skillmarcus/sidecar | 1.1k | — | ~2.3k | Automated safety check: Pass | MIT | |
| Windmill Trigger Type Checklistwindmill-labs/windmill | 18k | — | ~4.7k | Automated safety check: Pass | Custom licence | |
| Dynamic Consistency BoundariesAxonIQ/AxonFramework | 3.6k | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Opensource Guide Coachcalf-ai/calfkit-sdk | 149 | 1 repos | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| NestJS Modular Monolith Architecttech-leads-club/agent-skills | 7k | — | ~3.9k | Automated safety check: Pass | CC-BY-4.0 | |
| Adobe App Builder Action Scaffolderadobe/skills | 195 | — | ~3.1k | Automated safety check: Pass | Apache-2.0 |
windmill-labs/windmill
Checklist of every backend, frontend, CLI and capture change needed to add a new TriggerCrud-based trigger type, such as Azure, GCP or Kafka, to Windmill.
AxonIQ/AxonFramework
Explain and reason about Dynamic Consistency Boundaries (DCB) and how Axon Framework 5 and Axon Server implement them.
calf-ai/calfkit-sdk
A skill your agent uses when a user wants guidance on starting, contributing to, growing, governing, funding, securing, or sustaining an open source project, or asks about contributor onboarding…
tech-leads-club/agent-skills
Designs scalable NestJS modular monoliths with domain-driven design, Clean Architecture layers and optional CQRS, defining bounded contexts and strict module boundaries.
adobe/skills
Scaffolds, implements, deploys and debugs Adobe Runtime actions in App Builder projects, with templates for webhooks, events, database CRUD, sequences and Asset Compute workers.
fullstackhero/dotnet-starter-kit
CQRS interface reference for FSH. An agent skill from fullstackhero/dotnet-starter-kit.
marcus/sidecar
Create conversation adapters for importing AI chat history from different tools (Claude Code, Cursor, Warp, Codex, etc.).
marcus/sidecar
Create declarative modals using the modal library API. An agent skill from marcus/sidecar.
marcus/sidecar
Project switching implementation in sidecar: project discovery, state management, UI flow, modal rendering, filtering, theme preview, and plugin reinitialization.
marcus/sidecar
Interactive shell/TTY integration with tmux session management, shell command execution, control-mode output capture with polling fallback, native cursor rendering, lazy scrollback, selection, paste…
marcus/sidecar
Writing and maintaining the Sidecar Docusaurus documentation site, including page structure, doc authoring, blog posts, styling, images, and deployment workflow.
marcus/sidecar
Implementing UI/UX features in sidecar including modals (internal/modal library), keyboard shortcuts, mouse support, scrolling, pill/tab rendering, and pane resizing.
Categories
Create new sidecar plugins implementing the plugin.Plugin interface, rendering views with Bubble Tea, handling keyboard input via keymap contexts, and integrating with the app shell (footer hints…. Create Plugin is an agent skill from marcus/sidecar.Plugin interface, rendering views with Bubble Tea, handling keyboard input via keymap contexts, and integrating with the app shell (footer hints, event bus, adapters).
Create Plugin fits situations like: creating a new plugin; modifying plugin architecture; debugging plugin rendering/lifecycle issues.
Run `npx skills add marcus/sidecar --skill create-plugin -a claude-code`. Or copy the skill folder (.claude/skills/create-plugin in marcus/sidecar) into .claude/skills/create-plugin in your project. Claude Code loads it when a task matches its description.
Run `npx skills add marcus/sidecar --skill create-plugin -a codex`. Or copy the skill folder (.claude/skills/create-plugin in marcus/sidecar) into .agents/skills/create-plugin in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add marcus/sidecar --skill create-plugin -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/create-plugin, .gemini/skills/create-plugin, .github/skills/create-plugin and .opencode/skills/create-plugin in your project.
SKILL.md names no scripts, command-line tools or credentials: Create Plugin is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Create Plugin is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.3k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Create Plugin: Windmill Trigger Type Checklist (windmill-labs/windmill, 18k stars), Dynamic Consistency Boundaries (AxonIQ/AxonFramework, 3.6k stars), Opensource Guide Coach (calf-ai/calfkit-sdk, 149 stars) and NestJS Modular Monolith Architect (tech-leads-club/agent-skills, 7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
marcus (a GitHub user) maintains it in marcus/sidecar, which has 1,085 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 5, 2026.
Source: marcus/sidecar on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.