Changelog
Every released version of CommitBrief and what shipped in it.
Sandbox-rerun confirmation for the flaky-test detector. The static rules infer flakiness from anti-patterns; sandbox-rerun raises confidence by re-running a flagged test in isolation N times and classifying it by the observed pass/fail mix — mixed confirms flaky, all-fail is a real failure, all-pass is transient (demoted to info). Opt-in and off by default, behind a runner seam that ships no language-specific runner yet.
Added
- Sandbox-rerun confirmation for the flaky detector (ADR-0022). The static
flaky rules infer flakiness from anti-patterns; sandbox-rerun raises
confidence by actually re-running a flagged test in isolation N times and
classifying it by the observed pass/fail mix:
- a mixed pass + fail confirms the test is flaky (the finding is kept, with the empirical confirmation noted);
- all fails is a real failure — genuinely red, not quarantined as a flake;
- all passes is transient — the flake did not reproduce, so the
finding is demoted to
infoand won’t trip a commit-stage--fail-on.
- CommitBrief ships the orchestration — the N-rerun loop, the classification, and an early exit once a mixed result is proven (a flaky test usually confirms in two runs) — behind an executor seam so the core stays pure and testable. No language-specific test runner is embedded, so the feature is a transparent no-op until a runner is bound: existing behaviour is byte-identical.
- Opt-in and off by default via
--sandbox-rerun[=N](bare flag uses N=5; precedence: flag >review.sandbox_rerunconfig > 0). The verdict rides the existing finding (suggestion text + a possible demotion) — no JSON-schema change (schema stays1). New surface is additive: the--sandbox-rerunflag and thereview.sandbox_rerunconfig key. No new dependency.
Architecture-aware review. When a repo ships an `architecture.json` — the config of the sibling tool archlint, declaring layers and their allowed import edges — CommitBrief reads it and feeds a compact summary of the layers and their forbidden boundaries into the review prompt, so the reviewer can flag a diff that crosses a declared architectural boundary. A one-way read; CommitBrief never lints or enforces.
Added
-
Architecture-aware review (ADR-0030). When a repo ships an
architecture.json— the public config of the sibling tool archlint, declaringlayers(path prefixes) andrules(allowed import edges) — CommitBrief now reads it and injects a compact, deterministic summary of the layers and their allowed/forbidden boundary edges into the review prompt as a distinct<architecture_constraints>block. The reviewer can then flag a diff that crosses a declared boundary — e.g. “this addsdomain → db, which the architecture forbids”.{ "layers": { "domain": ["internal/domain"], "db": ["internal/db"] }, "rules": { "domain": [], "db": ["domain"] } } -
It is a one-way read of archlint’s config — CommitBrief never lints the import graph or enforces anything itself (run
archlint checkin CI for the deterministic gate); it only grounds the LLM so it can reason about the change. A missing or malformed file is a transparent no-op that never breaks a review. -
On by default (
review.architecture, defaulttrue); the discovery path is overridable viareview.architecture_file; opt out per-run with--no-architecture. The block folds into the system prompt, so editingarchitecture.jsoninvalidates stale cached reviews while a repo without the file keeps a byte-identical cache key — no mass invalidation. Applies toreviewanddry-run. No new dependency.
A declarative merge gate — `commitbrief guard` — caps how many findings of each severity a change may carry via an opt-in `.commitbrief/policy.yml`. Richer than the single `--fail-on` threshold and aimed at gating high-volume, often AI-authored, pull requests. Run-mode reviews the diff; `--from-json` evaluates a review you already produced without a provider call.
Added
-
Policy gate:
commitbrief guard(ADR-0029). A declarative merge gate that caps how many findings of each severity a change may carry, via an opt-in.commitbrief/policy.yml—thresholds:per severity plus an optional overalltotal:. It is richer than the single--fail-on=<severity>threshold (a per-severity budget, not one cutoff) and is aimed at gating high-volume — often AI-authored — pull requests.# .commitbrief/policy.yml version: 1 thresholds: # max findings allowed per severity (omit / ~ = unlimited) critical: 0 high: 0 medium: 5 total: 20 # optional overall cap -
Two modes. Run-mode reviews the diff (reusing the standard pipeline) and then evaluates it; consume-mode (
--from-json <file|->) evaluates a prior schema-v1 review with no provider call, so an agent’s MCP self-review can be gated cheaply. It judges the set that survives baseline + suppression (signal control) — exactly what--jsonshows. -
It exits 0 on pass, non-zero when blocked; a missing or malformed policy, or an unparseable review, also blocks — a merge gate must not pass when it cannot prove the change is within policy.
--jsonemits a machine-readable verdict ({passed, counts, total, violations}).guardcomplements--fail-on— use either or both. Rule-id-scoped allow/deny lists are deferred (findings carry no stable rule id yet).
An opt-in `commitbrief mcp` subcommand runs a Model Context Protocol server over stdio so an AI agent or host can call CommitBrief as a self-review gate before it submits code. It exposes one `review` tool that runs the exact same pipeline as `commitbrief --json` and returns the structured findings. Stdlib-only — no MCP SDK, no new dependency.
Added
- MCP server:
commitbrief mcp(ADR-0028). A new opt-in subcommand runs a Model Context Protocol server over stdio (JSON-RPC 2.0) so an AI agent or host — Claude Desktop, an agent runtime, an MCP-aware IDE — can invoke CommitBrief as a tool. The typical use is a self-review gate the agent runs before it submits code. It is stdlib-only (encoding/json+bufioline framing; no MCP SDK, no new dependency) and implementsinitialize,tools/list,tools/call, andping. - It exposes one tool,
review, that runs the same review pipeline ascommitbrief --json— diff acquisition, filtering, the pre-send guard and secret scanner, the cost preflight, the cache, the flaky-test pre-pass, and signal control — and returns the structured findings (JSON schema v1) plus a short text summary. The tool arguments expose the meaningful knobs (staged/unstaged/diff/provider/model/fail_on/min_severity/no_flaky). - A
fail_ongate is reported in the summary (the findings are still returned); a genuine failure — no repo or changes, a provider error, an aborted guard — comes back as an MCP tool error. The path reusesrunReviewrather than re-implementing the review, so there is zero behavioral drift from a terminal review. Fully additive — existing commands are unchanged.
Signal control to cut repeat noise — a user-private baseline that accepts a brownfield repo's existing findings so you only see new ones, and inline `// commitbrief-ignore` suppression with a visible reason — both true removals that are reported, never silent. Plus a `.pre-commit-hooks.yaml` for one-line pre-commit framework adoption, and three new flaky-test rules: brittle selectors, over-mocking, and wall-clock-dependent assertions.
Added
-
Signal control: baseline + inline suppression (ADR-0027). Two new ways to cut repeat noise without hiding findings from review:
- Baseline —
commitbrief --update-baselinerecords the current findings in a user-private.commitbrief/baseline.json(gitignored, never committed); subsequent runs show only new findings. It’s local convenience only — it never propagates, so CI and the next reviewer still see everything (a teammate can’t bake a bug into a shared baseline). Skip it for a run with--no-baseline; turn it off withreview.baseline: false. Findings are fingerprinted by file + severity + title (not line number, so a baselined finding survives code drift). - Inline suppression — a
// commitbrief-ignore: reason(orcommitbrief-ignore[high]: reason) comment on a finding’s line drops that finding, with the reason visible in the diff the reviewer reads. - Both are true removals — a removed finding no longer counts toward
--fail-onand no longer appears in--json findings[](unlike the display-only--min-severity). Neither is silent: additive optionalmeta.baselined/meta.suppressedcounts appear in--json(the schema stays v1) and a one-lineN baselined · M suppressedfooter prints to stderr.
- Baseline —
-
.pre-commit-hooks.yaml— pre-commit framework integration. Add CommitBrief to any repo’s.pre-commit-config.yamlin one entry. Two hook ids:commitbrief(language: golang, the framework builds and pins it for you — no separate install) andcommitbrief-system(language: system, uses an already-installedcommitbriefonPATH). Distinct from the existing git-nativeinstall-hook. -
Flaky-test detector: three new rules (ADR-0022). The deterministic, provider-free pre-pass now flags three more high-precision anti-patterns in changed test files, alongside
hard-sleepandunseeded-random:brittle-selector(JS/TS) — position-based UI/test selectors::nth-child, absolute XPath,.eq(<n>)/.nth(<n>), trailing[n]predicates. Stabledata-testid/role/text selectors are not flagged.over-mock— a test piling on an excessive number of mock setups (file-scoped, per test function), a signal the test is brittle.time-dependency— an assertion coupled to the wall clock (time.Now()/Date.now()/new Date()…) without an injected clock. All three are on by default for API providers; skip with--no-flakyorreview.flaky: false. Localized (en/tr).
A deterministic flaky-test detector flags timing-dependent and unseeded-random anti-patterns in changed tests before any model call. Plus guard hardening — user-extensible secret patterns and a prompt-injection scan of your own rules — glob support for the `--file`/`--dir` filters, and a `setup --alias` installer for a `cbr` shell shortcut.
Added
-
Deterministic flaky-test detector (ADR-0022). A static, provider-free pre-pass scans the added lines of changed test files for high-precision flakiness anti-patterns — hard-coded sleeps / fixed waits (
time.Sleep,Thread.sleep,Task.Delay,asyncio.sleep,*.waitForTimeout, numericcy.wait,usleep,sleep(<n>)) and unseeded randomness (Math.random, Pythonrandom.*, Gomath/rand). Findings merge into the structured output, so they render, count toward--fail-on, and--copylike any other finding. No model call, no JSON-schema change. On by default for API providers; skip per-run with--no-flakyor persistently withreview.flaky: false. Localized (en/tr). -
setup --alias— install a shell alias (ADR-0023).commitbrief setup --aliasskips the provider wizard and installs a shell alias (defaultcbr) into the right startup file per shell — bash, zsh, fish, PowerShell, and cmd.exe (via a DOSKEY macrofile loaded from a mergedAutoRunregistry value). The alias lives in an idempotent managed block that is replaced in place on re-run and never clobbers surrounding lines. If the name shadows an existing command you are warned first.--alias=<name>sets it without prompting. -
User-extensible secret-scan patterns (ADR-0024).
guard.secret_patternslets you add your own credential regexes on top of the built-in eight — useful for internal/company token formats. Patterns are additive: the built-ins always run and cannot be disabled or shadowed (useguard.secret_scan: falsefor that). An invalid regex aborts the review before any provider call, naming the offending entry. As with the built-ins, only the line number and pattern name are ever reported — never the matched text. -
Prompt-injection scan of your rules (ADR-0025). When you use a custom
COMMITBRIEF.mdorOUTPUT.mdtemplate, its content is scanned for prompt-injection phrasing (“ignore previous instructions”, “you are now…”, “system prompt”, …) before it joins the system prompt. On a match the CLI prints a non-blocking warning (file + line numbers) and continues — it never aborts, because it is your own file. The embedded default rules are trusted and skipped. Toggle withguard.injection_scan(default on). -
Glob support for
--file/--dir(ADR-0026). The path filters now accept gitignore-style glob patterns in addition to exact paths. A value containing*,?, or[is compiled as a glob: a slash-less pattern matches the basename at any depth (--file '*.go'), and a slash-bearing pattern is anchored to the repo root (--file 'internal/**/*.ts').--diraccepts globs too (--dir 'app/**'). Backward compatible: a value with no glob metacharacter keeps its exact pre-v1.7 behavior. An invalid pattern errors clearly instead of silently mis-filtering.
A new `summary` command explains a set of changes in plain language — a read-only digest grouped by logical area, attributed to commit hashes for a range. Plus `--lang` now drives the AI output language for any recognized language (French, German, …), independent of the CLI's own interface.
Added
summarycommand — explain a set of changes in plain language.commitbrief summaryproduces a read-only, human-readable digest of what changed (and, when the commit messages make it clear, why), grouped by logical area rather than file by file. It reuses the review infrastructure (provider selection, pre-send guards, cost preflight, cache) but emits prose, not findings. See ADR-0020.- Scope mirrors the review surface: no args ⇒ staged (default),
--unstagedfor the working tree, or positionalgit diffarguments for an arbitrary range exactly like thediffscope —commitbrief summary main...develop,commitbrief summary HEAD~3 HEAD. - For a range, the matching commit messages are ingested as context and each line is attributed to the short commit hash(es) responsible; staged / unstaged scopes (which have no commits) produce unattributed lines.
- Output is plain text;
-o/--outputwrites it to a file.--langis honoured, so--lang tryields a Turkish summary. Provider selection matches a review (--provider/--model/--cli), and--with-contextworks for CLI providers. - Emits no findings, so
--json,--markdown,--suggest-commit,--fail-on, and--min-severityare rejected with a clear message. The command never writes to git.
- Scope mirrors the review surface: no args ⇒ staged (default),
Changed
--langnow sets the AI output language independently of the interface. The output language and the CLI’s own interface language are resolved from one chain but applied separately (ADR-0021):- Any recognized language works for output.
--lang fr(orde,ja, … ~50 languages) now produces a French review; previously anything outsideen/trwas coerced to English. The CLI’s own strings still localize only foren/tr, so--lang frgives a French review with an English interface;--lang trgives Turkish for both. - The fallback chain is mistake-tolerant. Resolution is
--lang→ repooutput.lang→ useroutput.lang→ English, and an empty or invalid value at any level falls through to the next source instead of short-circuiting to English.config set output.langvalidates the value. - Breaking: the system locale (
LANGenv var) is no longer consulted for language. A setup that relied onLANG=tr_TRwith no config now defaults to English — setoutput.langor pass--langinstead.
- Any recognized language works for output.
commit’s staged-file list reads tighter. The “Detected N staged files” line no longer ends with a dangling colon, the file names below it are no longer separated by a blank line in the progress tree, and when more than 20 files are staged the names are omitted (the count alone is shown) so a large stage doesn’t flood the screen.
A new `commit` command turns a staged diff into a commit message and runs `git commit` for you, with `--type` formats and `--generate` alternatives. Plus `remote pr` no longer requests changes by default — the request-changes verdict is now opt-in.
Added
commitcommand — generate a commit message and commit.commitbrief commitreads your staged diff, asks the configured provider for a commit message, shows it for confirmation, and — on Yes (the default) or--yes— runsgit commit. This is the first path where the tool writes to git; every review path stays read-only (the PRD’s read-only rule is rescoped to the review path). See ADR-0019.--type/-tpicks the format:plain(default),conventional,conventional+body,gitmoji,subject+body.--generate/-g <N>offers N alternatives (1–10) in an arrow-key selector; a single provider call produces all N.--provider/--model/--cliselect the backend exactly as for a review. Messages are always written in English regardless of--lang.- The pre-send
.commitbrief/**guard, secret scan, and cost preflight all run on the staged diff before the call; the suggestion is cached. - With no staged changes it errors clearly; a non-TTY run without
--yeserrors (it cannot confirm).--yescommits the first suggestion and does not bypass the secret scan or cost preflight. - New config keys
commit.typeandcommit.generateset the defaults (precedence: flag > config > built-in). This complements the existing read-only--suggest-commitreview flag, which is unchanged.
Changed
remote prno longer requests changes by default. Arequest-changesverdict is now opt-in:--request-changes-ondefaults to unset instead ofcritical. Without the flag,remote prsubmitsapprove(no findings or info-only) orcomment(any non-info findings) and neverrequest-changes. Pass--request-changes-on=<critical|high|medium|low>to re-enable escalation at or above that severity. Inline-comment posting and the comment-volume cap are unchanged. Auto-requesting changes should be a deliberate choice, not the out-of-the-box behavior (ADR-0016 §5 Update). Verdict-only — no effect under--no-post.
A model-refresh release — OpenAI GPT-5 family support (including gpt-5.5-pro via the Responses API), the Gemini 3.x lineup, Claude Opus 4.8 as the new Anthropic default, and a setup wizard that no longer makes you retype an API key just to switch provider or model.
Added
-
OpenAI GPT-5 family —
gpt-5.5,gpt-5.4-mini,gpt-5.5-pro. All three are selectable incommitbrief setupwith correct context windows (1.05M / 400K / 1.05M input) and pricing. The new default OpenAI model isgpt-5.4-mini.gpt-5.5-proruns through OpenAI’s Responses API (it isn’t offered on Chat Completions) and can take several minutes per review; reasoning models get a larger default output-token budget so a findings response is never truncated by reasoning tokens. -
Gemini
gemini-3.5-flash. Added alongside the rest of the refreshed Gemini lineup below.
Changed
-
Gemini lineup refreshed to the 3.x family.
gemini-2.5-pro→gemini-3.1-pro-preview,gemini-2.5-flash→gemini-3.5-flash,gemini-1.5-flash→gemini-3.1-flash-lite. The new default Gemini model isgemini-3.5-flash. Pricing and context windows updated;gemini-3.1-pro-previewcarries tiered pricing (the ≤200K-token base tier is snapshotted). Configs pinning a removed 2.x / 1.5 model should switch to a 3.x ID. -
Anthropic:
claude-opus-4-7→claude-opus-4-8. Opus 4.8 is now the default Anthropic model, with its built-in pricing ($5 input / $25 output / $0.50 cache-read per 1M) and 1M-token context window updated to match Anthropic’s current model docs. Configs pinningclaude-opus-4-7should switch toclaude-opus-4-8. -
setupno longer forces an API-key re-entry when one already exists. Re-runningcommitbrief setupfor a provider that already has a key now lets you leave the key prompt blank to keep the stored key, so switching only the active provider or model doesn’t mean retyping credentials. First-time configuration still requires a non-empty key. For a non-interactive path,providers use <name>switches the active provider andconfig set providers.<name>.model <model>changes the model — both leave API keys untouched.
A "Trust & quality" release — `--show-prompt` to see exactly what leaves your machine, an opt-in `guard.token_preflight`, a live elapsed-time counter on the progress spinner, the first published measured-quality benchmarks, and a fix for the spinner flooding the screen on some terminals.
Added
-
--show-prompt— see exactly what gets sent. Assembles the full system + user prompt that would be sent to the model, prints it, and exits — no provider call, no cache lookup, no cost. It reflects every prompt-shaping flag (the scope,--with-context,--cli/--provider,--lang), so it’s the full-text companion todry-run(which reports only metadata). Honours--outputto write the prompt to a file. Use it to audit data egress or debug a customCOMMITBRIEF.md. -
guard.token_preflightconfig (opt-in, default off). When enabled, a review whose estimated prompt exceeds the active model’s context window prompts for confirmation (on a TTY) or aborts (non-interactively) before the paid call — a friendly catch instead of a raw provider400 context length exceeded. Off by default because the estimate is achars / 4heuristic and a false positive shouldn’t block an unguarded review. Turn it on withcommitbrief config set guard.token_preflight true. -
Live elapsed-time counter on the progress spinner. Once a stage has run for more than a second, the animated tree shows a muted timer beside it (e.g.
Thinking… 0:42), so a slow--with-contextagent call reads as working rather than frozen. -
Published measured-review-quality benchmarks. CommitBrief now ships an eval harness that scores real review output against a 23-fixture known-answer corpus (23 planted defects + 3 clean controls). The first scorecard across five models is on the Benchmarks section of the site: every Claude model recalls essentially all planted defects with zero false positives on the clean controls.
Fixed
- Progress spinner flooding the screen on some terminals. The animated
renderer redraws in place by moving the cursor up; a stage line longer
than the terminal width wrapped to multiple rows, so the cursor-up
under-counted and a line (often
Searching for changes…) repeated every frame — it looked like an infinite loop. Rendered lines are now clipped to the terminal width so they never wrap, andTERM=dumbterminals fall back to plain one-line-per-stage output. Workaround on older builds:--color neverorNO_COLOR=1.
A fourth CLI-backed provider (`codex-cli`), `--with-context` for grounding CLI reviews in the wider repo, `remote pr --no-post` for local-only PR reviews, two new `cache` subcommands (`stats`, `inspect`) with size-bounded eviction, a `command.default` config key, and an SPDX-header CI guard.
Added
-
New CLI-tool-backed provider:
codex-cli. Drives a locally installed OpenAI Codex CLI (codex) as the review engine, joiningclaude-cliandgemini-cli. Selectable via--cli codexor--provider codex-cli; no API key needed (it reuses the host CLI’s auth and billing). Driven throughcodex exec --sandbox read-only --skip-git-repo-check— headless and read-only, so a review can never modify your working tree. Like the other CLI providers it is a plain-text emitter — no structured findings, so--json/--markdownandremote pr’s posting mode don’t apply (butremote pr --no-post, below, does). Total live providers: 10 (4 API + 3 OpenAI-compatible + 3 CLI-backed). -
--with-contextflag for CLI-backed providers. Opt-in: lets the agentic host CLI (claude-cli/gemini-cli/codex-cli) read project files beyond the diff — callers, type definitions, sibling modules, conventions — to ground the review in how the change fits the wider codebase. The diff stays the subject; the rest is background. CLI providers only — an API provider has no filesystem and the flag errors there, pointing you at--cli. The host CLI runs read-only with its working directory pinned to the repo root (claude --allowedTools Read,Grep,Glob,gemini --approval-mode plan --skip-trust;codex’s read-only sandbox already permits reads). CommitBrief prints a one-line caution on every run: the agent may read files outside the diff (including untracked secrets) and the pre-send secret scan covers the diff only. Context and diff-only runs cache under distinct keys. See ADR-0017. -
remote pr --no-post— review a PR locally, no GitHub writes. Fetches the PR diff viaghand renders the review to your terminal like a local review, posting nothing to GitHub (no inline comments, no verdict). Because output is local, the flags posting mode rejects now apply:--json,--markdown,--output,--copy,--compact,--cli(CLI providers), and--fail-on(exit-code gate). No self-PR block; results are cached like a local review.--request-changes-onand--with-contextare noted-and-ignored in this mode. See ADR-0016 §Update. -
cache statssubcommand. A read-only summary of the local response cache: entry count, total size, oldest/newest entry timestamps, the configured size limit, and a per-provider/model breakdown. -
cache inspect <key>subcommand. Dumps a single cache entry’s metadata (provider, model, language, created-at, TTL + freshness, token counts, on-disk size) by its cache key — the SHA-256 shown by--verbose/dry-run, with or without the.jsonsuffix. The cached review body is shown only with--show-content. -
Size-bounded cache eviction. The
cache.max_size_mbconfig key returns as a real key: when set (>0), each cache write that pushes the directory over the limit evicts the oldest entries first until it fits; the just-written entry is never evicted. The default0keeps the cache unlimited (cache pruneremains the manual stand-in). This is a fresh key with real Put-path enforcement, not a revival of the v0.9.1-removed dead field. -
command.defaultconfig key — customize barecommitbrief. Set it to an argument string (e.g.--unstaged --cli gemini) and a barecommitbriefbehaves as if you typed those args. Empty/unset keeps the built-incommitbrief==commitbrief --staged. It applies only to the truly bare invocation — any explicit flag or subcommand bypasses it. Set viaconfig set -- command.default "…"or by editingconfig.yml. -
SPDX-header CI guard.
make spdx-check(folded intomake checkand a dedicated CI job) fails the build if any Go source — tracked or newly added — is missing its// SPDX-License-Identifier: GPL-3.0-or-laterheader, keeping the 100% coverage from regressing (ADR-0012).
Inline PR comments land on the correct diff side, reviews send line-numbered diffs for sharper finding locations, and `remote pr` / `compress` / `providers test` gain the animated progress tree.
Changed
-
Line-numbered diffs for more accurate finding locations. Every review (local and
remote pr) now sends the model a diff with each changed line prefixed by the line number a comment would anchor to (<n>| <marker><text>), so the model copies line numbers instead of counting them from the@@hunk header. This sharply reduces findings landing on the wrong line (closing braces, blank lines). The on-disk cache is rebuilt once on upgrade because the system prompt changed; the diff component of the cache key is unaffected (the numbered form is a deterministic function of the plain diff). -
remote prprints the standard review context lines. The same header (commitbrief vX · provider · cache),analyzing N files · …status line, and✓ Done in … · N findings · tokens · $costfooter the localreviewshows now surround the remote run too, so the informational lines are consistent across every review command type. They are exposed as reusablerender.HeaderLine/StatusLine/FooterLineto keep one implementation. -
Staged-tree progress display extended to
remote pr,compress, andproviders test. All long-running/stepped operations now render through the same animated tree the localreviewcommand uses (one line per stage in non-TTY/CI; suppressed by--quiet) instead of flat stderr lines —remote prshows fetch → review → post → submit. The finished tree stays on screen (it is not cleared) for these commands since no rich card output replaces it. -
remote prsuggestion lines are prefixed with💡. The remediation line in both inline comments and the review-summary fallback now starts with💡so it reads distinctly from the description. The signature was also lowercased toby #commitbrief. -
Startup banner tweaks. The footer links now point to the repo Issues page (replacing the GitHub link) and drop the Author link; the license tag reads
GNU GPL v3instead ofGNU-GPL3.0.
Fixed
commitbrief remote prno longer mis-places inline comments. Comments are now anchored to the diff side each finding’s line lives on —RIGHT(new file) for added/context lines,LEFT(old file) for removed lines — instead of unconditionally postingside=RIGHT. A finding whose line falls outside the diff (or whose POST GitHub rejects) is appended to the review summary under a “Findings that could not be attached to a specific line” heading rather than being silently dropped.
Three new providers (DeepSeek, Mistral, Cohere) bring the live count to 9, plus `--suggest-commit`, a `--min-severity` display filter, per-model pricing overrides, and a GitHub Action for CI.
Added
-
Three new providers: DeepSeek, Mistral, Cohere. Each is a standalone provider package reusing the
openai-goSDK pointed at the provider’s OpenAI-compatible endpoint — no new dependency (DeepSeekapi.deepseek.com, Mistralapi.mistral.ai/v1, Cohere’scompatibility/v1). API keys via config orDEEPSEEK_API_KEY/MISTRAL_API_KEY/COHERE_API_KEY; all three appear incommitbrief setup. Structured output is prompt-driven (noresponse_format) since these providers’ strict-JSON support varies — the retry-once-then-degrade pipeline (ADR-0014) covers non-conforming output, same as Ollama. Total live providers: 9 (4 API + these 3 + 2 CLI-backed). -
--suggest-commit. After the review, makes a second free-form provider call and prints a single Conventional Commit message for the staged diff to stdout. Read-only — it suggests, never writes git. Requires the staged scope (--stagedor the default run); rejected with--unstaged, thediffsubcommand, and--json/--markdown/--output. Works with every provider via the new additiveprovider.Request.FreeForm, which makes API providers skip their structured-output enforcement for this one call. See ADR-0015. -
--min-severity=<level>display filter. Hides findings below the given severity in the rendered output (Cards, Markdown,--copy).--jsonstays complete (machine contract) and--fail-onalways evaluates the full, unfiltered set — so CI gating is never weakened by a display filter. Acceptscritical|high|medium|low|info|none; an invalid value errors before the provider call. Complements--fail-on(which governs the exit code). -
Per-model pricing override (OQ-09).
providers.<name>.pricing.<model>in config overrides the built-in$/1M-token rate snapshot used by the cost preflight, the verbose footer, and cached-cost figures. Fields:input_per_1m,output_per_1m,cached_input_per_1m; zero/omitted fields fall back to the built-in value (partial override OK). Edited in the config file and shown bycommitbrief config show. Useful when the hard-coded snapshot drifts or for a negotiated rate. -
CI integration: the
commitbrief-actionGitHub Action. A separate repo (CommitBrief/commitbrief-action) ships a composite action that runs CommitBrief on pull requests — either posting inline review comments + a verdict (commentmode, viaremote pr) or running an exit-code gate (gatemode, viadiff --fail-on). The README’s new “Continuous integration” section documents usage; no CLI change.
Fixed
commitbrief remote prno longer requests a non-existentghJSON field.gh pr view --jsonhas nobaseRepositoryfield, so the PR fetch failed withUnknown JSON field: "baseRepository"against every realghversion. The base repository slug used for posting inline comments is now derived from the PR’surlfield (which always points at the base repo, including cross-fork PRs).
Terminal-driven GitHub PR review lands — `commitbrief remote pr <ID>` fetches a PR's diff, posts inline review comments, and submits a verdict.
Highlights
commitbrief remote pr <ID> brings the review pipeline to GitHub
pull requests (ADR-0016). It pulls a PR’s diff through the gh
CLI, runs the same review pipeline as a local run, posts each
finding as an inline review comment, and submits a verdict.
Added
-
commitbrief remote pr <ID>— terminal-driven GitHub PR review. Pulls a PR’s diff via theghCLI, runs the review pipeline, posts each finding as an inline review comment, and submits a verdict (approve / comment / request-changes). The subcommand-local--request-changes-on=<critical|high|medium|low>(defaultcritical) sets the request-changes threshold;--repo owner/repooverrides git-context repo discovery. API providers only —claude-cli/gemini-cliare refused (no structured findings).Bot-mode: the pre-send guards auto-allow with a stderr warning instead of aborting;
--fail-onis ignored (the GitHub verdict replaces the exit-code gate). Race-safe: one retry if the PR head moves during the review, then abort. GitHub-posted text is fixed English; local stderr is localized (EN/TR). Newinternal/remotepackage +remote.*catalog keys. -
Trailing blank line after review output and
----brackets around CLI-provider (claude-cli/gemini-cli) output for readability.
API freeze. CLI surface, JSON schema v1, and rules formats are now under strict semver. `claude-cli` + `gemini-cli` promoted to stable.
Highlights
v1.0.0 is the API freeze checkpoint. From here on, CLI flag
surface, JSON schema v1, the COMMITBRIEF.md / OUTPUT.md
formats, and public config keys all follow strict
semver. Breaking changes
wait for v2.x.
If you’re upgrading from anywhere on the v0.x line, the migration guide in the CLI repo collects every breaking change since v0.9.x.
Added
-
claude-cliandgemini-cliproviders promoted to stable. README documents both alongside the four API providers; the v0.9.0 “experimental” disclaimer is gone. The plain-text emit pipeline closed the last reliability gaps —--outputroutes correctly, the host CLI’s version is memoised + bounded, and the prompt transport for claude-cli switched to stdin so ARG_MAX is no longer a ceiling. -
gosec security scan +
make security-check. Static security analysis runs on every push to main and on a weekly schedule (.github/workflows/security.yml). Local devs get the same wrapper viascripts/security-scan.sh. The exclusion set (G304/G306/G301/G204/G101/G122) is documented inline with one-paragraph rationale per rule. High-confidence findings (G115 etc.) fail the scan. -
README “Stability” section. Declares the v1.0.0 API freeze scope and links to the v0.x → v1.0 migration guide.
-
BENCHMARKS.md baseline snapshot. Captures diff-pipeline and cache-hit numbers at the v1.0.0-rc.1 freeze point. Used as a regression detector — a future 2× slowdown is the trigger for an investigation.
-
make checktarget. Runs every guard CI runs, in CI order, bailing on the first failure. Single entry-point for “is this push-ready?”. -
COMMITBRIEF_CONFIGenvironment variable documented. Setting it to an absolute path replaces the default~/.commitbrief/config.ymllookup — useful for ephemeral CI environments and reproducible tests.
Changed
Diff.IsMergefield andcli.warn.merge_commitcatalog key removed. The merge-commit warning was retired with the scope- flag collapse in v0.9.0 —commitbrief diff <merge-sha>gives first-parent semantics with no special prompt (same asgit diff <merge-sha>). Library consumers reading the field need to drop it.
Fixed
-
Gemini provider hardens int→int32 conversion for max-output tokens. A value above
math.MaxInt32would silently wrap to negative; now bounded to[1, math.MaxInt32]with the default falling back to 4096. Found via gosec G115 during the v1.0.0-rc.1 security audit. -
KeyMeta.DiffHashandKeyMeta.SystemPromptHashcarry real SHA-256 digests. Pre-v1.0.0-rc.1 the diff hash stored the first 16 hex chars of the composite cache key (NOT a diff hash) and the system-prompt hash was always empty. Both fields now match what the configuration docs advertise. -
Generated git hooks embed the absolute path to commitbrief. macOS GUI git clients (Tower, GitHub Desktop, Fork, JetBrains IDEs) run hooks with a stripped
$PATHthat typically omits/opt/homebrew/bin, soexec commitbrief --staged …silently failed to launch.install-hooknow resolves the running binary viaos.Executable+filepath.EvalSymlinksand embeds the result as a single-quoted token. Survivesbrew upgrade(which swaps the keg symlink target).
CLI splash logo on every run — 16×16 half-block rendering of the CommitBrief mark, alongside wordmark and OSC 8 hyperlinks.
Added
-
CLI splash logo on every run. A 16×16 half-block rendering of the CommitBrief mark — same gradient + arrow as the favicon and web logo — shown alongside the wordmark, tagline, and OSC 8 hyperlinks to Home / Docs / GitHub / Sponsor / Author.
Printed to stderr only —
commitbrief --json | jqand--markdown > filestay uncorrupted — and gated on a TTY-capable stderr so redirected CI logs don’t fill with raw 24-bit color escapes. The wordmark line embeds the resolved build version (version.Version), so it always matches the running binary.
CLI provider polish — stdin transport for claude-cli, `compress --dry-run`, locale narrow to {en, tr}.
⚠️ Breaking
- Locale surface narrowed to
{en, tr}. Pre-v0.9.2 thelangNamesmap advertised 15 languages for which we never shipped translations —i18n.Loadsilently fell through to English, so the dry-run footer claimingLang: Deutschwas a lie.Resolvenow coerces any unsupported code (output.lang: de,--lang fr,LANG=es_ES) toenwhile preserving the originalSourcefor attribution.
Changed
-
CLI providers respect
--output. The plain-text emit path used by--cli claude/--cli gemininow routes through the sameopenOutputhelper the structured renderers use, so--cli claude --output review.mdwrites to the file instead of silently dropping the destination. -
CLI provider prompt transport switched to stdin for claude-cli. Large diffs were hitting the platform ARG_MAX limit (~128KB), surfacing as
argument list too long. claude-cli now invokesclaude -p -and pipes the prompt via stdin. gemini-cli stays on argv for now — upstream lacks a documented stdin shorthand. -
DefaultModelfor CLI providers is memoised + bounded. The cache-key path queriesDefaultModelon every review; before it re-shelled out to<cli> --versioneach time and could hang a pipeline behind a misbehaving host CLI.sync.Once+ 5-second timeout cap the cost at one short subprocess per Backend.
Added
-
--cliis mutually exclusive with--jsonand--markdown. CLI-provider output is pre-formatted plain text; combining it with a structured renderer either re-flows the formatting or parses prose as JSON. Cobra rejects the pairing before any provider call. -
dry-runnow reports output tokens, context window, and cost estimate. Mirrors the verbose footer of a real review so users can decide whether to fire the request without having to. -
commitbrief compress --dry-run. Runs the LLM compression call and prints the Result block (sizes, savings, per-review saved $) but does NOT replace COMMITBRIEF.md or write a backup. Mutually exclusive with--out.
Fixed
-
commitbrief diffaccepts pathspecs and >2 args. The subcommand used to cap at two positional args, rejecting legitimategit diff <ref> -- <pathspec>invocations.MinimumNArgs(1); everything past the first arg is forwarded verbatim. -
ui.EnableANSIis now called fromExecute. On legacy Windows consoles VT100 escape mode must be opted into before any ANSI codes are written; we shipped the helper but never invoked it at the entry point. -
Shared interactive stdin across the review pipeline. Guard, secret scanner, and cost preflight used to each instantiate their own
bufio.Scanneroveros.Stdin; the first scanner’s lookahead could swallow input meant for the next site. A single*bufio.Readeris now plumbed through all three.
Removed
- Dead i18n keys cleaned up. ~10 unreferenced keys from earlier
revisions. New CI guard (
make i18n-check) fails on the first unreferenced key so the catalog can’t grow stale again.
Safety scope narrowing — `--yes` no longer bypasses secret scanner or cost preflight.
⚠️ Breaking
-
--yesno longer bypasses the secret scanner or cost preflight. Previously,--yes(intended to auto-answer the.commitbrief/pre-send guard) also silently approved any flagged credential and any above-threshold cost estimate — a footgun for CI users wiring--yesto skip the guard prompt. Use the dedicated bypasses:--allow-secretsfor the scanner,--no-cost-checkfor the preflight. -
cache.max_size_mbconfig field removed. Defined in the struct and surfaced viaconfig get/set, but no code ever read it — cache eviction is TTL-based. Setting it now errors as an unknown field. Remove the line from your config.
Changed
-
Active provider doctor check.
commitbrief doctornow verifies that the currently selected provider has its own credentials — not just that some provider does. Closes a gap where settingprovider: openaiwhile onlyanthropic.api_keywas configured would pass doctor but fail every review. -
Localised confirm vocabulary, guard prompt, and setup wizard. Catalog drives accept-vocabulary (
y/yesin EN,e/evetin TR), the[y/N]/[e/H]suffix, the.commitbrief/guard warning, and every label incommitbrief setup.
Added
-
Rules content secret scan. The pre-send secret scanner now inspects user-authored
COMMITBRIEF.mdandOUTPUT.mdcontent in addition to the diff. Rules join the system prompt verbatim, so a credential pasted into either file would leak just as surely as one in a diff. Embedded defaults are skipped. -
cache.enabledandcache.ttl_daysare now honored. Previously defined but inert.
Fixed
-
install-hook --hook=pre-pushships a real pre-push body. Previously every hook variant got the same--stagedinvocation, which silently no-op’d at push time. The new pre-push script parses git’s per-ref stdin protocol and runscommitbrief diff <remote-sha>..<local-sha> --fail-on=criticalper ref. Push blocks on the first critical finding. -
initno longer aborts on the first existing file. Existing files are now skipped with a per-file log line and the missing sibling is still written. -
init --forceis now a real flag. Previously the docs promised it but the CLI returned “unknown flag”.
CLI-as-provider (claude-cli, gemini-cli), `commitbrief diff` subcommand, per-finding suggestions, progress UI.
⚠️ Breaking
-
Scope flags collapsed into
commitbrief diff <args...>.--commit <hash>,--branch <name>, and--pull-request <range>are gone. Replacement table:v0.x v0.9 commitbrief --commit HEAD~1commitbrief diff HEAD~1commitbrief --branch maincommitbrief diff maincommitbrief --pull-request main...xcommitbrief diff main...x--stagedand--unstagedunchanged. Thediffsubcommand forwards verbatim togit diff <args>, so any range git understands works. -
Single-path
--filescope flag replaced by the repeatable global--file/--dirfilter pair. -
Provider.ReviewStreamremoved from the provider interface. Streaming has been dead since ADR-0014 took the review path off it in v0.6.0; the plumbing is now gone. Third-party packages importingProviderneed to drop the field.
Added
-
CLI-tool-backed providers —
claude-cli,gemini-cli(experimental). Drive the user’s locally-installed Claude Code or Gemini CLI as the review backend via subprocess. No API key when the host CLI is already authenticated. Cost is whatever the user’s CLI subscription bills. Cache key includes the host CLI version so upgrades cleanly invalidate prior entries. -
Per-finding
suggestionfield — required actionable remediation. Every finding carries a 2–3 sentence concrete fix recommendation alongside title/description. Rendered in Cards (chevron-prefixed paragraph), OUTPUT.md (→ {{ .Suggestion }}block), JSON ("suggestion", required), and the--copyclipboard payload. -
commitbrief diff <args...>subcommand — git-diff passthrough for arbitrary historic ranges. Args forwarded verbatim togit diff --no-color --no-ext-diff. -
Global
--file/-fand--dir/-dflags — path filters applied post-parse, repeatable, work on any scope. -
commitbrief cache prunesubcommand. Bounded cleanup with defaults--keep-last 500 --older-than 7d; both windows must be satisfied for an entry to survive.--provider/--modelnarrow the candidate pool. -
Multi-line findings via
line_end(schema-additive). Finding payloads can carryline_endalongsidelineto mark spans; renderers showfile:start-endinstead offile:start. Backward-compatible. -
--copyflag — pushes a plain-text summary of the findings onto the system clipboard via OSC 52 escape (works over SSH) and native shellout (pbcopy / wl-copy / xclip / xsel / clip.exe). -
Progress animation during the review pipeline — four-stage tree with breathing-dot animation. Three operating modes: animated (TTY + colors), plain (CI logs), silent (
--quiet).
Changed
- Tightened snippet contract in the system prompt so findings stop showing invented code excerpts — max 6 lines, verbatim from the diff, no hunk headers, omit when not materially clarifying.
- Severity chip glyphs swapped to emoji for stronger visual
cues:
💥 CRITICAL,🚨 HIGH,⚡ MEDIUM,📌 LOW,💡 INFO. - Diff aggregate caching —
Diff.AddedLines()/DeletedLines()switched to O(1) memoized reads.
Finding card visual overhaul — per-severity themes, fixed-width panels, sign-aligned wrapping.
Changed
-
Finding card design ported verbatim from the maintainer’s
secguardreference. Replaces the v0.8.0 visual layer end-to-end. Each severity now ships its own dark theme — panel background, border, accent color, chip label:⊘ CRITICALon#1A1116/ border#602B38/ chip#ff6b8a⚠ HIGHon#1A1511/ border#603F2B/ chip#ffa86b● MEDIUMon#1A1A11/ border#5A5A2B/ chip#f0d050○ LOWon#11161A/ border#2B4760/ chip#6bb8ffℹ INFOon#11181A/ border#2B5560/ chip#6be0e0
Diff lines render as full-row strips with sign-column padding so removed/added/context lines read as colored bands.
-
Fixed inner content width of 96 columns. Long descriptions and snippets wrap to panel-bg-filled continuation rows via lipgloss
Width()instead of expanding the card past the terminal edge. Diff lines wrap with the sign-column preserved, so-/+continuation rows stay aligned. -
Border blends with panel background via
BorderBackground(bg)so the rounded corners share the severity-tinted bg — the card reads as one continuous block. -
Code-fence noise removed. Snippet rendering no longer wraps the excerpt in literal triple-backtick fences. The diff-coloured strips already mark the region as code.
Quality & diagnostics. `doctor`, `install-hook`, secret scanner, cost preflight, `--fail-on`, `--compact`.
Added
commitbrief install-hooksubcommand — one-command scaffold for a git hook runningcommitbrief --staged --fail-on=critical --quiet --no-cost-checkon every commit. Default target.git/hooks/pre-commit;--hookchoosescommit-msgorpre-push. Existing files refused unless--yes; prior content backed up to<name>.bak.<timestamp>.--uninstallremoves the hook only when the embedded marker is present.--fail-on=<severity>flag — CI-actionable exit code gate. Accepted values:critical,high,medium,low,info,any,none. The rendered review prints before the exit code is decided.commitbrief doctorsubcommand — runs ~7 health checks against the resolved environment: git binary, config schema, COMMITBRIEF.md source, OUTPUT.md template validity, active provider credentials, cache writability,.gitignoreincludes.commitbrief/. Per-check ✓/⚠/✗ glyphs; exit 1 on any failure.- Pre-send secret scanner. Eight patterns ship by default
(AWS, GitHub, GitLab, OpenAI, Anthropic, JWT, Stripe, PEM private
key). Only
+prefixed (newly added) lines are scanned; the matched substring is never echoed to stderr or any cached payload.--allow-secretsbypasses with an info notice. - Cost preflight — before each fresh provider call, estimates
cost from prompt tokens × per-model pricing. Above
cost.warn_threshold_usd(default$0.50), prompts the user on a TTY or aborts non-interactively. New--no-cost-checkflag. commitbrief listconfig summary footer — shows active provider/model, source of COMMITBRIEF.md and OUTPUT.md, and local cache footprint.--compactflag for one-line-per-finding rendering —[icon] SEVERITY • file:line — title.
Changed
- Diff-colored snippets — when a finding includes a code excerpt
with
-/+prefixed lines, the renderer colors removals red and additions green; context stays muted. - High-contrast card text — adaptive foreground (near-white on dark terminals, near-black on light) fixes legibility against severity-tinted backgrounds.
Multi-provider UX. `providers` and `config` subcommands; rich finding panel polish.
Added
commitbrief providerssubcommand for multi-provider workflows without hand-editing YAML.providers list— every configured + registered provider, marking the active one and showing model + masked API-key fingerprint (or base URL for Ollama).providers use <name>— flip the active default; preserves every API key, model, and base URL across the switch.providers test <name>— callTestConnectionand report success + latency.
commitbrief configsubcommand for one-line edits.config show— dump the merged config as YAML with API keys masked.config get <key>— read a single field by dotted path.config set <key> <value>— write a single field with type coercion and validation (booleans, integers with bounds, enums, registered providers).
Changed
- Rich finding panels — visual polish of the Cards Stage B
layout from v0.6.0:
- Rounded borders (
╭ ╮ ╰ ╯) replace square corners. - Severity-tinted backgrounds via
lipgloss.AdaptiveColor. - Severity icons prefix the badge —
‼critical,⚠high,▲medium,●low,ⓘinfo. - Bullet separator (
•) between badge andfile:line.
- Rounded borders (
--versionoutput no longer double-prints"commitbrief version commitbrief X.Y.Z"— cobra’s default template was overridden.
Fixed
commitbrief setupno longer wipes previously-configured API keys. Running setup a second time to add another provider used to overwrite the entire config from defaults; the wizard now loads the existing config and layers the new provider on top.
Structured findings JSON. OUTPUT.md becomes a Go template — breaking change.
⚠️ Breaking — OUTPUT.md semantics (ADR-0014)
COMMITBRIEF.mdusers are unaffected. Project review rules remain the user-editable system prompt.OUTPUT.mdis now a Gotext/templateconsumed locally, not a format instruction embedded in the LLM prompt. The model produces structured findings JSON under a fixed schema; the renderer applies your OUTPUT.md to those findings for--markdownand--output <file>.md. Pre-0.6.0 OUTPUT.md files written as natural-language instructions fail the pre-send validation guard.- Migration: run
commitbrief init --yesto overwrite OUTPUT.md with the new embedded default, or rewrite it intext/templatesyntax. - Severity vocabulary expanded to five levels (was three):
critical,high,medium,low,info. - Old local cache entries auto-invalidated because the system prompt SHA is part of the cache key.
Added
- Structured findings JSON contract between LLM and renderer.
Every provider uses its native structured-output mechanism:
Anthropic
tools, OpenAI strictresponse_format, GeminiResponseSchema, Ollamaformat: "json". - Retry-once + graceful degrade. Unparseable LLM output triggers one retry; second failure degrades to plain-text with a stderr warning. Cache entries record the fallback mode.
- Per-finding Cards layout (Stage B). Each finding renders as a lipgloss-bordered panel coloured by severity. Empty case shows a single green-checkmark “No findings. Looks good.” panel.
render.ValidateOutputTemplatepre-send guard — malformed templates fail with a clear error pointing at the file.
Scope expansion. Every review scope advertised in `list` works end-to-end; JSON output locked at schema v1.
Added
--commit <hash>review scope with merge-commit handling: when the requested hash has two or more parents, the diff is taken against the first parent only and a stderr warning suggests--pull-request <target>...<feature>for full branch comparison.--branch <target>and--pull-request <target>...<feature>review scopes — backend was already wired; this release adds the integration test coverage.- Mutually exclusive scope flags. Passing two scope flags at
once (
--staged --unstaged) fails before the pipeline runs. lang.SourceCLIFlag— newSourceenum value so--langoverrides are attributed correctly in dry-run output instead of being mislabeledSourceRepoConfig.- Drift-guard golden test for
--jsonoutput. Byte-exact fixture atinternal/render/testdata/json/v1.golden; any rename, type change, or removal trips the test.
Changed
- CLI user-facing strings routed through
i18n.Catalog.T(). Sixteen new keys cover the action paths (init, review, compress, setup); Turkish translations ship for every key.%werror wrappers and tabular dry-run output stay English by design. - JSON schema v1 policy documented. Additive changes are not a
version bump; renames, removals, or type changes require schema
version 2 + a CHANGELOG entry. Shape unchanged from v0.4.0:
{schema, content, findings, summary, meta}.
Fixed
- Windows golden-file test now passes regardless of
core.autocrlf—.gitattributespins text files to LF in the working tree.
First public release. Homebrew, Scoop, and `go install` ship working.
Added
commitbrief compresswith three embedded prompts (light,balanced,aggressive). Atomic apply via temp + rename, backup at.commitbrief/backups/COMMITBRIEF-<timestamp>.md, refuses to apply when the result isn’t smaller.--out <path>writes elsewhere without touching the original.
Changed
- Verbose footer relabels
Cost:toSaved:on local cache hits (no provider call was made; the figure is what would have been spent). - Token line distinguishes provider prompt cache (
provider cached: N) from CommitBrief’s local response cache (local cache hit). dry-runreports per-layer filter counts;listdocuments the three-layer filtering pipeline.- Release pipeline goes live — Homebrew tap and Scoop bucket auto-publish.
Tests
Cumulative coverage rose from 64.7% → 77.8%. ~36 new tests across compress, render, CLI integration, provider streaming, and git dispatcher paths.
Provider matrix — OpenAI, Gemini, and Ollama join Anthropic.
Added
- OpenAI provider —
gpt-4o,gpt-4o-minivia the officialgithub.com/openai/openai-goSDK. Honors automatic prompt caching at ≥1024-token prefixes; cached tokens reported viausage.prompt_tokens_details.cached_tokens. - Google Gemini provider —
gemini-2.5-pro(2 M context),gemini-2.5-flash,gemini-1.5-flashvia the unifiedgoogle.golang.org/genaiSDK.cachedContentTokenCountsurfaced. - Ollama provider — local-only HTTP client against
/api/chatand/api/tags. No SDK, no API key.TestConnectionpings/api/tagsrather than spending inference time on a real completion. commitbrief setupnow cycles through all four providers.
Changed
- Default Gemini model bumped from
gemini-1.5-protogemini-2.5-pro.
Private repository; no public artifacts.
Walking-skeleton release — Anthropic provider, staged-diff review, cache.
Added
Commands
commitbrief init— write the team-sharedCOMMITBRIEF.mdand the per-user.commitbrief/OUTPUT.mdtemplate.commitbrief setup [--local]— interactive provider + API key wizard.- Review scopes:
--staged(default),--unstaged,--file,--commit,--pull-request,--branch. commitbrief dry-run— pipeline preview without an API call.commitbrief list— markdown command reference.
Core modules
- Hybrid
go-git+gitCLI access; unified-diff parser; three-layer ignore matcher; pre-send guard for.commitbrief/**; provider abstraction with Anthropic + mock implementations; SHA-256 response cache (7-day TTL); two-tier YAML config with field-level merge; English + Turkish i18n catalogs; terminal/markdown/JSON renderers; ldflags-injected version metadata.
Known limitations
- Only the Anthropic provider is implemented; OpenAI/Gemini/Ollama land in v0.2.0.
commitbrief compressis a stub; full implementation in v0.3.0.- Reviews are returned non-streaming; streaming arrives in v0.4.0.
Private repository; no public artifacts.