Lightweight Git and Graphite controls for the OpenCode TUI sidebar: review your working tree, stage and unstage files, generate commit messages with an LLM, commit, and submit/push without leaving OpenCode.
Inspired by lazygit.
gitgud-demo.mov
graphite-gitgud-1.mp4
graphite-gitgud-2.mp4
Install from the CLI:
opencode plugin oc-plugin-gitgudOr from OpenCode commands:
- Press
Ctrl+P - Select
Install Plugin - Enter
oc-plugin-gitgud
Plugin options can be configured via the tui.json config file.
enabled(boolean, defaulttrue)workflow("auto" | "git" | "graphite", default"auto") chooses the GitGud workflow.autouses Graphite controls when thegtCLI can read the current stack; otherwise it keeps the standard Git controls.replace_sidebar_files(boolean, defaultfalse) disables OpenCode's default Modified Files sidebar cardconfirm_push(boolean, defaulttrue)confirm_stage_all_on_commit(boolean, defaulttrue) asks before committing all changed files when Commit or Graphite Modify is selected with changed files but no staged filescommit_agent(string, optional) overrides the agent used for generated commit messages. When unset, OpenCode uses its normal default for the generated session.commit_model(string, optional) overrides the model for generated commit messages usingprovider/modelformat, for exampleopencode-go/kimi-k2.6commit_system_instructions(string, optional) appends extra style guidance to GitGud's default commit-message system promptkeybinds(object) overrides GitGud's OpenCode command keybinds. Set a keybind tofalse,null, an empty string, or"none"to disable it.
For example:
{
"commit_model": "opencode-go/kimi-k2.6",
"commit_system_instructions": "Prefer short conventional commits. Mention issue IDs when present."
}Default keybinds use OpenCode leader sequences to avoid common terminal, macOS, and window-manager shortcuts. Mutating actions use uppercase shifted leader chords to reduce accidental collisions with OpenCode's lowercase leader defaults:
{
"keybinds": {
"open_status": "<leader>v",
"stage_all": "<leader>A",
"unstage_all": "<leader>U",
"commit": "<leader>C",
"push": "<leader>P",
"graphite_create": "none",
"graphite_modify": "none",
"graphite_submit_stack": "none",
"graphite_sync": "none",
"graphite_up": "none",
"graphite_down": "none",
"refresh": "f5"
}
}Commit generates an editable commit message for staged changes, then commits after confirmation. If no
files are staged and confirm_stage_all_on_commit is enabled, GitGud asks before generating a message
for all changed files; it stages and commits those changes only after you accept the final commit prompt.
When workflow is "graphite", or "auto" detects a usable Graphite
CLI stack, GitGud keeps the same simple working-tree controls but swaps commit/push for stacked-diff
actions using Graphite's canonical commands:
- Create Graphite branch: prompts for a branch name, then runs
gt create <branch> --no-interactivewithout staging or committing changes. If files are staged, GitGud asks you to unstage them first to avoid Graphite committing staged changes. - Modify current diff: generates an editable commit message for staged changes, then runs
gt modify --commit --message "message"(gt m -cm "message"). If no files are staged andconfirm_stage_all_on_commitis enabled, GitGud asks before generating a message for all changed files and runsgt modify --commit --all --message "message"(gt m -cam "message") after final confirmation. - Submit stack:
gt submit --stack(gt ss) - Sync stack:
gt sync - Move up/down stack:
gt up/gt down
GitGud: Stage allGitGud: Unstage allGitGud: Open Git StatusGitGud: Commit(generates an editable commit message before committing)GitGud: PushGitGud: Create Graphite branchGitGud: Modify current diffGitGud: Submit stackGitGud: Sync stackGitGud: Move up stackGitGud: Move down stackGitGud: Refresh