// changelog

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 info and 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_rerun config > 0). The verdict rides the existing finding (suggestion text + a possible demotion) — no JSON-schema change (schema stays 1). New surface is additive: the --sandbox-rerun flag and the review.sandbox_rerun config 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, declaring layers (path prefixes) and rules (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 adds domain → 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 check in 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, default true); the discovery path is overridable via review.architecture_file; opt out per-run with --no-architecture. The block folds into the system prompt, so editing architecture.json invalidates stale cached reviews while a repo without the file keeps a byte-identical cache key — no mass invalidation. Applies to review and dry-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.ymlthresholds: per severity plus an optional overall total:. 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 --json shows.

  • 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. --json emits a machine-readable verdict ({passed, counts, total, violations}). guard complements --fail-on — use either or both. Rule-id-scoped allow/deny lists are deferred (findings carry no stable rule id yet).

v1.9.0

June 20, 2026permalink ↗

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 + bufio line framing; no MCP SDK, no new dependency) and implements initialize, tools/list, tools/call, and ping.
  • It exposes one tool, review, that runs the same review pipeline as commitbrief --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_on gate 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 reuses runReview rather than re-implementing the review, so there is zero behavioral drift from a terminal review. Fully additive — existing commands are unchanged.

v1.8.0

June 20, 2026permalink ↗

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:

    • Baselinecommitbrief --update-baseline records 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 with review.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 (or commitbrief-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-on and no longer appears in --json findings[] (unlike the display-only --min-severity). Neither is silent: additive optional meta.baselined / meta.suppressed counts appear in --json (the schema stays v1) and a one-line N baselined · M suppressed footer prints to stderr.
  • .pre-commit-hooks.yaml — pre-commit framework integration. Add CommitBrief to any repo’s .pre-commit-config.yaml in one entry. Two hook ids: commitbrief (language: golang, the framework builds and pins it for you — no separate install) and commitbrief-system (language: system, uses an already-installed commitbrief on PATH). Distinct from the existing git-native install-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-sleep and unseeded-random:

    • brittle-selector (JS/TS) — position-based UI/test selectors: :nth-child, absolute XPath, .eq(<n>) / .nth(<n>), trailing [n] predicates. Stable data-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-flaky or review.flaky: false. Localized (en/tr).

v1.7.0

June 19, 2026permalink ↗

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, numeric cy.wait, usleep, sleep(<n>)) and unseeded randomness (Math.random, Python random.*, Go math/rand). Findings merge into the structured output, so they render, count toward --fail-on, and --copy like any other finding. No model call, no JSON-schema change. On by default for API providers; skip per-run with --no-flaky or persistently with review.flaky: false. Localized (en/tr).

  • setup --alias — install a shell alias (ADR-0023). commitbrief setup --alias skips the provider wizard and installs a shell alias (default cbr) into the right startup file per shell — bash, zsh, fish, PowerShell, and cmd.exe (via a DOSKEY macrofile loaded from a merged AutoRun registry 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_patterns lets 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 (use guard.secret_scan: false for 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.md or OUTPUT.md template, 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 with guard.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'). --dir accepts 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.

v1.6.0

June 13, 2026permalink ↗

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

  • summary command — explain a set of changes in plain language. commitbrief summary produces 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), --unstaged for the working tree, or positional git diff arguments for an arbitrary range exactly like the diff scope — 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/--output writes it to a file. --lang is honoured, so --lang tr yields a Turkish summary. Provider selection matches a review (--provider / --model / --cli), and --with-context works for CLI providers.
    • Emits no findings, so --json, --markdown, --suggest-commit, --fail-on, and --min-severity are rejected with a clear message. The command never writes to git.

Changed

  • --lang now 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 (or de, ja, … ~50 languages) now produces a French review; previously anything outside en/tr was coerced to English. The CLI’s own strings still localize only for en/tr, so --lang fr gives a French review with an English interface; --lang tr gives Turkish for both.
    • The fallback chain is mistake-tolerant. Resolution is --lang → repo output.lang → user output.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.lang validates the value.
    • Breaking: the system locale (LANG env var) is no longer consulted for language. A setup that relied on LANG=tr_TR with no config now defaults to English — set output.lang or pass --lang instead.
  • 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

  • commit command — generate a commit message and commit. commitbrief commit reads your staged diff, asks the configured provider for a commit message, shows it for confirmation, and — on Yes (the default) or --yes — runs git 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 / -t picks 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 / --cli select 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 --yes errors (it cannot confirm). --yes commits the first suggestion and does not bypass the secret scan or cost preflight.
    • New config keys commit.type and commit.generate set the defaults (precedence: flag > config > built-in). This complements the existing read-only --suggest-commit review flag, which is unchanged.

Changed

  • remote pr no longer requests changes by default. A request-changes verdict is now opt-in: --request-changes-on defaults to unset instead of critical. Without the flag, remote pr submits approve (no findings or info-only) or comment (any non-info findings) and never request-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 in commitbrief setup with correct context windows (1.05M / 400K / 1.05M input) and pricing. The new default OpenAI model is gpt-5.4-mini. gpt-5.5-pro runs 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-progemini-3.1-pro-preview, gemini-2.5-flashgemini-3.5-flash, gemini-1.5-flashgemini-3.1-flash-lite. The new default Gemini model is gemini-3.5-flash. Pricing and context windows updated; gemini-3.1-pro-preview carries 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-7claude-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 pinning claude-opus-4-7 should switch to claude-opus-4-8.

  • setup no longer forces an API-key re-entry when one already exists. Re-running commitbrief setup for 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 and config 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 to dry-run (which reports only metadata). Honours --output to write the prompt to a file. Use it to audit data egress or debug a custom COMMITBRIEF.md.

  • guard.token_preflight config (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 provider 400 context length exceeded. Off by default because the estimate is a chars / 4 heuristic and a false positive shouldn’t block an unguarded review. Turn it on with commitbrief 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-context agent 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, and TERM=dumb terminals fall back to plain one-line-per-stage output. Workaround on older builds: --color never or NO_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, joining claude-cli and gemini-cli. Selectable via --cli codex or --provider codex-cli; no API key needed (it reuses the host CLI’s auth and billing). Driven through codex 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 / --markdown and remote pr’s posting mode don’t apply (but remote pr --no-post, below, does). Total live providers: 10 (4 API + 3 OpenAI-compatible + 3 CLI-backed).

  • --with-context flag 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 via gh and 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-on and --with-context are noted-and-ignored in this mode. See ADR-0016 §Update.

  • cache stats subcommand. 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 .json suffix. The cached review body is shown only with --show-content.

  • Size-bounded cache eviction. The cache.max_size_mb config 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 default 0 keeps the cache unlimited (cache prune remains 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.default config key — customize bare commitbrief. Set it to an argument string (e.g. --unstaged --cli gemini) and a bare commitbrief behaves as if you typed those args. Empty/unset keeps the built-in commitbrief == commitbrief --staged. It applies only to the truly bare invocation — any explicit flag or subcommand bypasses it. Set via config set -- command.default "…" or by editing config.yml.

  • SPDX-header CI guard. make spdx-check (folded into make check and 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-later header, 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 pr prints the standard review context lines. The same header (commitbrief vX · provider · cache), analyzing N files · … status line, and ✓ Done in … · N findings · tokens · $cost footer the local review shows now surround the remote run too, so the informational lines are consistent across every review command type. They are exposed as reusable render.HeaderLine / StatusLine / FooterLine to keep one implementation.

  • Staged-tree progress display extended to remote pr, compress, and providers test. All long-running/stepped operations now render through the same animated tree the local review command uses (one line per stage in non-TTY/CI; suppressed by --quiet) instead of flat stderr lines — remote pr shows 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 pr suggestion 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 to by #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 v3 instead of GNU-GPL3.0.

Fixed

  • commitbrief remote pr no 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 posting side=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-go SDK pointed at the provider’s OpenAI-compatible endpoint — no new dependency (DeepSeek api.deepseek.com, Mistral api.mistral.ai/v1, Cohere’s compatibility/v1). API keys via config or DEEPSEEK_API_KEY / MISTRAL_API_KEY / COHERE_API_KEY; all three appear in commitbrief setup. Structured output is prompt-driven (no response_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 (--staged or the default run); rejected with --unstaged, the diff subcommand, and --json / --markdown / --output. Works with every provider via the new additive provider.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). --json stays complete (machine contract) and --fail-on always evaluates the full, unfiltered set — so CI gating is never weakened by a display filter. Accepts critical|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 by commitbrief config show. Useful when the hard-coded snapshot drifts or for a negotiated rate.

  • CI integration: the commitbrief-action GitHub Action. A separate repo (CommitBrief/commitbrief-action) ships a composite action that runs CommitBrief on pull requests — either posting inline review comments + a verdict (comment mode, via remote pr) or running an exit-code gate (gate mode, via diff --fail-on). The README’s new “Continuous integration” section documents usage; no CLI change.

Fixed

  • commitbrief remote pr no longer requests a non-existent gh JSON field. gh pr view --json has no baseRepository field, so the PR fetch failed with Unknown JSON field: "baseRepository" against every real gh version. The base repository slug used for posting inline comments is now derived from the PR’s url field (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 the gh CLI, 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> (default critical) sets the request-changes threshold; --repo owner/repo overrides git-context repo discovery. API providers only — claude-cli / gemini-cli are refused (no structured findings).

    Bot-mode: the pre-send guards auto-allow with a stderr warning instead of aborting; --fail-on is 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). New internal/remote package + 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-cli and gemini-cli providers 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 — --output routes 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 via scripts/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 check target. Runs every guard CI runs, in CI order, bailing on the first failure. Single entry-point for “is this push-ready?”.

  • COMMITBRIEF_CONFIG environment variable documented. Setting it to an absolute path replaces the default ~/.commitbrief/config.yml lookup — useful for ephemeral CI environments and reproducible tests.

Changed

  • Diff.IsMerge field and cli.warn.merge_commit catalog 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 as git 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.MaxInt32 would 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.DiffHash and KeyMeta.SystemPromptHash carry 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 $PATH that typically omits /opt/homebrew/bin, so exec commitbrief --staged … silently failed to launch. install-hook now resolves the running binary via os.Executable + filepath.EvalSymlinks and embeds the result as a single-quoted token. Survives brew 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 onlycommitbrief --json | jq and --markdown > file stay 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 the langNames map advertised 15 languages for which we never shipped translations — i18n.Load silently fell through to English, so the dry-run footer claiming Lang: Deutsch was a lie. Resolve now coerces any unsupported code (output.lang: de, --lang fr, LANG=es_ES) to en while preserving the original Source for attribution.

Changed

  • CLI providers respect --output. The plain-text emit path used by --cli claude / --cli gemini now routes through the same openOutput helper the structured renderers use, so --cli claude --output review.md writes 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 invokes claude -p - and pipes the prompt via stdin. gemini-cli stays on argv for now — upstream lacks a documented stdin shorthand.

  • DefaultModel for CLI providers is memoised + bounded. The cache-key path queries DefaultModel on every review; before it re-shelled out to <cli> --version each 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

  • --cli is mutually exclusive with --json and --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-run now 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 diff accepts pathspecs and >2 args. The subcommand used to cap at two positional args, rejecting legitimate git diff <ref> -- <pathspec> invocations. MinimumNArgs(1); everything past the first arg is forwarded verbatim.

  • ui.EnableANSI is now called from Execute. 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.Scanner over os.Stdin; the first scanner’s lookahead could swallow input meant for the next site. A single *bufio.Reader is 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

  • --yes no 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 --yes to skip the guard prompt. Use the dedicated bypasses: --allow-secrets for the scanner, --no-cost-check for the preflight.

  • cache.max_size_mb config field removed. Defined in the struct and surfaced via config 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 doctor now verifies that the currently selected provider has its own credentials — not just that some provider does. Closes a gap where setting provider: openai while only anthropic.api_key was configured would pass doctor but fail every review.

  • Localised confirm vocabulary, guard prompt, and setup wizard. Catalog drives accept-vocabulary (y/yes in EN, e/evet in TR), the [y/N] / [e/H] suffix, the .commitbrief/ guard warning, and every label in commitbrief setup.

Added

  • Rules content secret scan. The pre-send secret scanner now inspects user-authored COMMITBRIEF.md and OUTPUT.md content 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.enabled and cache.ttl_days are now honored. Previously defined but inert.

Fixed

  • install-hook --hook=pre-push ships a real pre-push body. Previously every hook variant got the same --staged invocation, which silently no-op’d at push time. The new pre-push script parses git’s per-ref stdin protocol and runs commitbrief diff <remote-sha>..<local-sha> --fail-on=critical per ref. Push blocks on the first critical finding.

  • init no 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 --force is 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~1 commitbrief diff HEAD~1
    commitbrief --branch main commitbrief diff main
    commitbrief --pull-request main...x commitbrief diff main...x

    --staged and --unstaged unchanged. The diff subcommand forwards verbatim to git diff <args>, so any range git understands works.

  • Single-path --file scope flag replaced by the repeatable global --file/--dir filter pair.

  • Provider.ReviewStream removed 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 importing Provider need 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 suggestion field — 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 --copy clipboard payload.

  • commitbrief diff <args...> subcommand — git-diff passthrough for arbitrary historic ranges. Args forwarded verbatim to git diff --no-color --no-ext-diff.

  • Global --file / -f and --dir / -d flags — path filters applied post-parse, repeatable, work on any scope.

  • commitbrief cache prune subcommand. Bounded cleanup with defaults --keep-last 500 --older-than 7d; both windows must be satisfied for an entry to survive. --provider/--model narrow the candidate pool.

  • Multi-line findings via line_end (schema-additive). Finding payloads can carry line_end alongside line to mark spans; renderers show file:start-end instead of file:start. Backward-compatible.

  • --copy flag — 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 cachingDiff.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 secguard reference. 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:

    • ⊘ CRITICAL on #1A1116 / border #602B38 / chip #ff6b8a
    • ⚠ HIGH on #1A1511 / border #603F2B / chip #ffa86b
    • ● MEDIUM on #1A1A11 / border #5A5A2B / chip #f0d050
    • ○ LOW on #11161A / border #2B4760 / chip #6bb8ff
    • ℹ INFO on #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-hook subcommand — one-command scaffold for a git hook running commitbrief --staged --fail-on=critical --quiet --no-cost-check on every commit. Default target .git/hooks/pre-commit; --hook chooses commit-msg or pre-push. Existing files refused unless --yes; prior content backed up to <name>.bak.<timestamp>. --uninstall removes 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 doctor subcommand — runs ~7 health checks against the resolved environment: git binary, config schema, COMMITBRIEF.md source, OUTPUT.md template validity, active provider credentials, cache writability, .gitignore includes .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-secrets bypasses 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-check flag.
  • commitbrief list config summary footer — shows active provider/model, source of COMMITBRIEF.md and OUTPUT.md, and local cache footprint.
  • --compact flag 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 providers subcommand 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> — call TestConnection and report success + latency.
  • commitbrief config subcommand 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 and file:line.
  • --version output no longer double-prints "commitbrief version commitbrief X.Y.Z" — cobra’s default template was overridden.

Fixed

  • commitbrief setup no 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.md users are unaffected. Project review rules remain the user-editable system prompt.
  • OUTPUT.md is now a Go text/template consumed 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 --markdown and --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 --yes to overwrite OUTPUT.md with the new embedded default, or rewrite it in text/template syntax.
  • 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 strict response_format, Gemini ResponseSchema, Ollama format: "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.ValidateOutputTemplate pre-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 — new Source enum value so --lang overrides are attributed correctly in dry-run output instead of being mislabeled SourceRepoConfig.
  • Drift-guard golden test for --json output. Byte-exact fixture at internal/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. %w error 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.gitattributes pins text files to LF in the working tree.

First public release. Homebrew, Scoop, and `go install` ship working.

Added

  • commitbrief compress with 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: to Saved: 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-run reports per-layer filter counts; list documents 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.

v0.2.0

May 17, 2026prereleasepermalink ↗

Provider matrix — OpenAI, Gemini, and Ollama join Anthropic.

Added

  • OpenAI providergpt-4o, gpt-4o-mini via the official github.com/openai/openai-go SDK. Honors automatic prompt caching at ≥1024-token prefixes; cached tokens reported via usage.prompt_tokens_details.cached_tokens.
  • Google Gemini providergemini-2.5-pro (2 M context), gemini-2.5-flash, gemini-1.5-flash via the unified google.golang.org/genai SDK. cachedContentTokenCount surfaced.
  • Ollama provider — local-only HTTP client against /api/chat and /api/tags. No SDK, no API key. TestConnection pings /api/tags rather than spending inference time on a real completion.
  • commitbrief setup now cycles through all four providers.

Changed

  • Default Gemini model bumped from gemini-1.5-pro to gemini-2.5-pro.

Private repository; no public artifacts.

v0.1.0

May 16, 2026prereleasepermalink ↗

Walking-skeleton release — Anthropic provider, staged-diff review, cache.

Added

Commands

  • commitbrief init — write the team-shared COMMITBRIEF.md and the per-user .commitbrief/OUTPUT.md template.
  • 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 + git CLI 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 compress is a stub; full implementation in v0.3.0.
  • Reviews are returned non-streaming; streaming arrives in v0.4.0.

Private repository; no public artifacts.