Reported issues for git-courer
Pod holds 20 of 34 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.
Back to git-courer.
Most discussed
installer: inject prompt rules into CLI agents to prefer MCP tools over bash
Problem
CLI agents (OpenCode, Claude Code, Codex, Gemini) have git-courer MCP tools available, but they often fall back to bash for git operations because no instruction tells them to prefer MCP tools. The result: structured output is lost, safety features (backups, conflict detection) are bypassed, and the user gets worse results.
What to do
- Create a
GIT_COURER.mdfile (~8 lines) with golden rules for using git-courer tools - On
git-courer mcp setup, place this file in each CLI
Read the thread · 2026-06-18 · closed · 3 comments
feat(core): LLM Infrastructure Decoupling (Backend-Agnostic Layer)
Summary
Abstract LLM interactions into a provider-agnostic port, isolate Ollama-specific logic into a dedicated adapter, and implement a factory pattern for dynamic backend selection via configuration.
Problem
The current LLM implementation is tightly coupled with the Ollama API, with infrastructure-specific logic leaking into the core domain. To support multiple backends (e.g., llama.cpp, LM Studio, OpenAI), we must decouple the LLM port from any specific provider.
Current issues:
- P
Read the thread · 2026-04-27 · closed · 1 comment
Model selection per operation - different models for different tasks
Problem
Currently git-courer uses a single model for all operations. This is inefficient because:
- Simple operations (branch, merge, tag) only need to interpret what the user wants → small model (7b)
- Complex operations (changelog, release) need better reasoning → large model
Proposed Solution
Allow configuring different models per operation in config.yaml:
ollama:
default_model: gemma4:26b
operations:
commit: gemma4:26b
release: gemma4:26b
branch: qwen 7b
[Read the thread](https://github.com/blak0p/git-courer/issues/2) · 2026-04-19 · closed · 1 comment
### bug: release flow does not create GitHub release
## Description
The `RELEASE_START`/`RELEASE_APPLY` flow creates the local git tag but does NOT execute `gh release create` — the release never appears on GitHub.
## Steps to Reproduce
1. Run `RELEASE_START` with a version instruction
2. Run `RELEASE_APPLY`
3. Tag is created locally ✅
4. GitHub release is NOT created ❌
## Expected Behavior
After `RELEASE_APPLY`, a GitHub release should be created automatically with the generated changelog as the release notes.
## Actual Behavior
Only the l
[Read the thread](https://github.com/blak0p/git-courer/issues/1) · 2026-04-12 · closed · 1 comment
### feature: group commit metadata by workspace instead of branch for changelog
### Problem statement
The release changelog fragments commits from the same feature when using chained PRs. Each branch is grouped separately, so the LLM writing the changelog sees fragments instead of the full feature context. A feature spread across 3 chained PRs produces 3 separate changelog entries instead of one coherent group.
### Impact — why do you want this?
This happens every time a feature requires multiple PRs (chained/stacked). The changelog becomes harder to read and the LLM los
[Read the thread](https://github.com/blak0p/git-courer/issues/215) · 2026-07-02 · closed · 0 comments
### git-courer — graph-clustering
## Graph Clustering
### What you build here
Replace the BFS clustering algorithm in `UnifiedASTPass.createClusters()` with Louvain community detection, using the graph from `buildGraph()` to group files by semantic community instead of directory transitivity.
### Scope
- `createClusters()`: replace BFS with Louvain
- `bfsCluster()`: remove (replaced by Louvain)
- `calculateForce()`: unchanged, graph stays the same
- `buildGraph()`: unchanged
- `Process()`: unchanged, only clustering changes
[Read the thread](https://github.com/blak0p/git-courer/issues/208) · 2026-07-01 · closed · 0 comments
### git-courer — chunker-prompt-quality
## Chunker Prompt Quality
### What you build here
Change the input format the local LLM receives for commit message generation: from plain text to structured JSON, with enriched annotated_diff (before/after per symbol), call_graph, and CFG (control flow graph). No emojis.
### Scope
- `MessageParams` struct: add `CallGraph`, `CFGSummary` fields, change `AnnotatedDiff` from string to `[]AnnotatedEntry`
- New `AnnotatedEntry` struct: `{file, symbol, type, breaking, line, calls, before, after}`
[Read the thread](https://github.com/blak0p/git-courer/issues/206) · 2026-07-01 · closed · 0 comments
### git-courer — hooks-multi-agente v2: deny granular + backup selectivo
## Problem
Currently git-courer blocks ALL raw git commands in every agent. This is too aggressive — some git commands aren't covered by the 13 MCP tools but are still legitimate (e.g., `git init`, `git config`, `git tag`). Users should be able to run those, with safety where it matters.
## Scope
1. **23 covered subcommands** → **deny** in all 5 clients, with message pointing to the equivalent MCP tool
2. **OpenCode**: `opencode.json` with deny for covered + ask for uncovered + allow for non-
[Read the thread](https://github.com/blak0p/git-courer/issues/205) · 2026-07-01 · closed · 0 comments
## Most recent
### git-courer — unborn-first-commit: fix first commit in new repo
## Problem
git-courer fails on the first commit in a freshly initialized Git repo (unborn branch). The plumbing pipeline (`applyPlumbing`) calls `git.Head()` which fails because `HEAD` doesn't resolve to any commit yet, and `CommitTree` always passes `-p <parent>` even when there is no parent commit.
## Scope
1. **Status**: detect unborn branch (HEAD without commits), add `is_unborn: true` to JSON, make ahead/behind null
2. **CommitTree adapter**: omit `-p` when parentHash is empty (root comm
[Read the thread](https://github.com/blak0p/git-courer/issues/204) · 2026-07-01 · closed · 0 comments
### bug: DiffResultJSON emits redundant raw diff when annotated diff is present
## Summary
`DiffResultJSON` always emits the raw `diff` field even when the annotated diff (`annotated`) is present. Since the annotated diff already contains the full diff content plus AST labels (`[NEW_FUNC]`, `[MOD_SIG ⚠BREAKING]`, `[DEPS]`, `[DEL]`), the raw `diff` field is pure duplication. In cloud/agent mode this wastes tokens and adds noise to every diff response.
## Steps to reproduce
1. Call `git-courer_diff` on any file with changes.
2. The response includes both `diff` (raw text)
[Read the thread](https://github.com/blak0p/git-courer/issues/200) · 2026-06-30 · closed · 0 comments
### bug: hooks only enforce on Codex — Claude Code and Antigravity silently pass through raw git
## Summary
`internal/delivery/cli/hook_check.go::runStdinMode` only parses the Codex stdin JSON shape. For Claude Code and Antigravity the parser silently fails and the hook exits 0 with no output, so `git *` commands are never blocked or even suggested-redirected to the MCP tools on those agents. The brief's intended behavior (`deny` + per-agent JSON shape) is not implemented.
## Steps to reproduce
1. Configure the hook for **Claude Code** to call `git-courer hook-check` on `PreToolUse:Bash`
[Read the thread](https://github.com/blak0p/git-courer/issues/199) · 2026-06-30 · closed · 0 comments
### docs: recover/restore lost SDD Brief for git-courer Global Agent Policy (hooks multi-agente)
## Summary
The SDD Brief for the **Global Agent Policy** change (`git-courer-v2.6.0`, including the `hooks-multi-agente` work) was lost between sessions. The vault note path is unknown, and the only recoverable artifact is a partial reconstruction in Engram memory (#1895) that summarizes the *confusion* the brief was meant to prevent, not the brief itself.
## What was in the brief
The original brief covered three distinct configuration paths in `git-courer` and the rules for each:
1. **TUI w
[Read the thread](https://github.com/blak0p/git-courer/issues/198) · 2026-06-30 · closed · 0 comments
### bug: session discard leaves MCP server in unusable state (chdir to non-existent worktree)
## Summary
`git-courer_session discard` removes the worktree from disk but does **not** reset the MCP server's internal "current worktree" pointer. Every subsequent MCP tool call (`status`, `diff`, `session start`, etc.) fails with `chdir ../git-courer-worktrees/<id>: no such file or directory` until the MCP server process is restarted.
This makes `session discard` a destructive, unrecoverable action in any orchestrator workflow.
## Steps to reproduce
1. Create a worktree:
git-cour
Read the thread · 2026-06-30 · closed · 0 comments
docs: update and align documentation with the codebase
Align documentation files (README, architecture, commands, config, clients, models, security, testing, troubleshooting, and contributing guides) with the Go codebase to resolve codebase discrepancies.
Read the thread · 2026-06-28 · closed · 0 comments
git-courer — Backup Auto-Prune
What
Automatic pruning of git-courer backup refs: when more than 20 refs/git-courer/backup/* accumulate, prune them before creating a new one. Pruning deletes only backups whose commit is already reachable from HEAD, preserving the valuable ones (pre-AMEND, pre-HARD, etc.).
Scope
- Change
PruneBackupsfrom time-based to reachability-based (git merge-base --is-ancestor) - Add auto-prune in
CreateBackup: if >= 20 backups, runPruneBackupsbefore creating the new one - Hardcoded:
Read the thread · 2026-06-27 · closed · 0 comments
git-courer — session-identity
Summary
Improve git-courer session system so session IDs are human-readable (user-chosen), branches have meaningful names, and session status can list and resume active sessions.
Scope
- Explicit Session ID:
session start <id>where<id>is chosen by the user (e.g.fix-auth,dark-mode). Nocourer/prefix, no hash. - Optional
branchparameter: if provided, the branch is named exactly that value. If omitted, it defaults to theid. - Improved
session status: lis
Read the thread · 2026-06-27 · closed · 0 comments
fix: release wizard regenerate (r) and edit (e) actions lose state
Problem
The interactive release wizard's r (regenerate) and e (edit) actions have two bugs:
r(regenerate): CallsSetCustomMessage(feedback)thencontinue, which re-asks for tag and message and regenerates the changelog from scratch — losing the previous changelog context entirely.e(edit): Opens the editor onrelease_changelog.md(relative path, no metadata dir), then reads back viasvc.LoadChangelog()which may not return the same file that was just edited.
Read the thread · 2026-06-25 · closed · 0 comments
fix: Codex config.toml written as JSON instead of TOML
Problem
ConfigureMCP writes JSON for all clients, but Codex expects TOML (config.toml). Running codex after git-courer mcp setup fails with:
Error loading config.toml:
.../config.toml:1:1: invalid key-value pair, expected key
Fix
- Added
ConfigFormatfield toMCPClientstruct ("json"default,"toml"for Codex) - New
configureTomlFormat()function that writes valid TOML with[mcpServers.git-courer]section - Codex client now uses
ConfigFormat: "toml" - Exis
Read the thread · 2026-06-24 · closed · 0 comments
feat: SDD 2 PR 2 — Uninstall cleanup + restore CLI + TUI restore screen
Problem
PR 2 of SDD 2 (Codex CLI PreToolUse Hook + Permissions) completes the remaining 3 phases: uninstall cleanup, restore CLI subcommand, and TUI restore screen.
What
Phase 5: Uninstall cleanup
RunUninstallnow callsremoveHook(client)for clients withHooksConfigRunUninstallremovesGIT_COURER.mdfrom each client's config directory- Then restores .bak backups (existing behavior preserved)
Phase 6: Restore CLI (git-courer restore)
- New
RunRestore()funct
Read the thread · 2026-06-24 · closed · 0 comments
feat: SDD 2 PR 1 — Codex CLI PreToolUse hook infra + stdin mode + Doctor real status
Problem
SDD 2 of the Global Agent Policy (v2.6.0) requires Codex CLI PreToolUse hooks that intercept Bash commands and redirect git to git-courer MCP tools. This PR implements the first 4 phases of SDD 2.
What
Phase 1: Hooks infra (hooks.go)
installHook— creates/merges hooks.json with PreToolUse entry, idempotentremoveHook— strips git-courer entry, deletes file if emptyhooksStatus— reports "installed" or "not_installed"
Phase 2: hook-check stdin mode
- `HookChe
Read the thread · 2026-06-24 · closed · 0 comments
The remaining reports are on the project's issue tracker.