Skip to content

Commit ff5aefe

Browse files
committed
docs: changelog + roadmap for #259-#265 merged on main, unreleased
1 parent cb69a72 commit ff5aefe

2 files changed

Lines changed: 14 additions & 8 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Added
1111
- **Act on PR comments from the PR detail view (#257).** On GitHub, you can reply to a review thread, edit or delete your own comments, resolve or unresolve a conversation, and copy a comment's link. Deleting the comment that starts a thread keeps its replies, and edits and replies are saved exactly as typed.
1212
- **A Force software rendering setting on Linux (#257).** Settings → General can turn GPU rendering off for systems where GitWand does not start. It applies at the next launch.
13+
- **Reset --keep (#263).** The Git Tree reset submenu and the reset dialog offer a fourth mode, **Keep**, beside soft, mixed and hard. It drops the commits like hard but keeps uncommitted edits; if one of them would be overwritten, git refuses, nothing changes, and the message names the files. An unknown reset mode is now an error instead of silently becoming `--mixed`.
14+
- **Warning for tracked files that match `.gitignore` (#264).** The sidebar lists tracked paths that an ignore rule now covers (`git ls-files -ci --exclude-standard`) and offers to untrack the selected ones or all of them (`git rm --cached`: files stay on disk and the removal is staged, to commit), with a per-repo dismissal. Edits to `.gitignore` or `.git/info/exclude` refresh it.
15+
- **Opt-in auto fast-forward after fetch (#265).** With the *Auto fast-forward* setting on (off by default), the periodic fetch fast-forwards the current branch when it is purely behind its upstream: no local commits, no tracked edits, no conflict, HEAD not detached, no operation in progress. It never merges or rebases, re-checks every condition under the repo write lock, and when blocked the sync button's tooltip names the reason. The tooltip is computed from the already-loaded status, without spawning git.
1316

1417
### Changed
1518
- **Markdown is rendered by GitWand itself (#257).** markdown-it is replaced by an in-house renderer (`utils/markdown.ts`), still sanitized by DOMPurify. READMEs, PR descriptions and comments scroll noticeably faster. HTML comments stay hidden even when they span blank lines or sit inside a list item. A package version such as `vue@3.5.42` is no longer turned into an email link.
@@ -18,7 +21,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1821
### Fixed
1922
- **The AI review summary is generated once per PR head (#257).** Concurrent requests for the same PR used to start one generation each; they now share it.
2023
- **GitWand starts even when its global shortcut is taken (#256).** If another app already owned Cmd/Ctrl+Shift+G, GitWand aborted during startup. It now starts without the shortcut and logs why.
21-
- **`non_overlapping` no longer writes lines twice when both branches added them.** With `diff3` markers — what `git merge-file --diff3`, the desktop merge preview and the benchmark produce — lines added identically on both sides sat inside the hunk on each side, and the merge kept both copies, auto-applied. Lines identical at the start and end of both sides are now taken out of the merge, as `zdiff3` does, and an insertion that repeats lines of the neighbouring edit from the other branch is left for review.
24+
- **`non_overlapping` no longer writes lines twice when both branches added them (#259).** With `diff3` markers — what `git merge-file --diff3`, the desktop merge preview and the benchmark produce — lines added identically on both sides sat inside the hunk on each side, and the merge kept both copies, auto-applied. Lines identical at the start and end of both sides are now taken out of the merge, as `zdiff3` does, and an insertion that repeats lines of the neighbouring edit from the other branch is left for review.
25+
- **`gitwand_resolve_hunk_llm` accepts valid answers in files with several conflicts (#260).** The residual-marker check scanned the whole file, so the other, still unresolved hunks made every answer fail. It now checks the model's answer only, and the JSON syntax check is skipped (and reported as skipped) while other conflicts remain.
26+
- **The Bitbucket PR list returns the requested window for any offset (#261).** The server skips `(page - 1) × pagelen`, but the request inflated the page size and then skipped locally, so an offset that was not a multiple of the limit returned the wrong PRs (offset 25, limit 10 gave items 35–45). The page size is now constant across the requests of one window, and a failing page past the end no longer drops the PRs already fetched.
27+
- **PR write actions target the right PR on a fork (#262).** Mark ready, merge, auto-merge and request reviewers resolved the PR number in `origin` first, so on a fork with a same-numbered PR they acted on the fork's PR. They now use the base repo's PR, and `gh pr ready` gets `--repo`. After a merge, the head branch is deleted only for a same-repo PR, as `gh pr merge --delete-branch` does; a fork's branch is left alone.
2228

2329
## [3.12.2] - 2026-10-11
2430

‎ROADMAP.md‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ _Ordered by priority, last verified 2026-10-10 (v3.12.1 shipped 2026-10-10 with
1919

2020
_v3.12.2 (AI context for PRs and release notes, AI branch creation, AI language and model fixes), v3.12.1 (merge-back no longer loses data, security hardening, full-screen Settings, WIP as a Git Tree row, per-project identity), v3.12.0 (built-in terminal renderer, WIP in the Git Tree), v3.11.2 (Finder-like folder navigation), v3.11.1 (History-aware LLM fallback) and v3.11.0 (Merge preview-to-apply) shipped; see [Shipped](#shipped) below and the full detail in [CHANGELOG.md](./CHANGELOG.md)._
2121

22-
_On `main`, not released yet (merged 2026-10-13, entry under Unreleased in `CHANGELOG.md`): **in-house markdown renderer** replacing markdown-it, **PR comment actions** on GitHub (reply, edit, delete, resolve, copy link), and **GPU rendering by default on Linux** with an automatic software fallback after a failed launch plus a Settings toggle (#257)._
22+
_On `main`, not released yet (entries under Unreleased in `CHANGELOG.md`): merged 2026-10-13, **in-house markdown renderer** replacing markdown-it, **PR comment actions** on GitHub (reply, edit, delete, resolve, copy link), and **GPU rendering by default on Linux** with an automatic software fallback after a failed launch plus a Settings toggle (#257); `non_overlapping` no longer duplicates lines both branches added under `diff3` (#259). Merged 2026-10-14: **reset `--keep`** (#263), **tracked-but-ignored warning** with untrack (#264), **opt-in auto fast-forward after fetch** (#265), plus fixes for the MCP residual-marker check (#260), Bitbucket PR-list pagination (#261) and PR write actions on forks (#262)._
2323

2424
---
2525

@@ -181,7 +181,6 @@ _Synthesis: none of the three addresses structured conflict-resolution AI (Stran
181181

182182
- **Follow-ups from the #234–#239 reviews** (2026-10-09):
183183
- `commandRegistry.test.ts` scans `backend.ts`, `backend-core.ts` and `backend-ai.ts` only: the commands wrapped in `backend-pr.ts`, `backend-gitlab.ts`, `backend-bitbucket.ts` and `backend-gitea.ts` (including the new `*_pr_edit`) have no registry entry and no dev-server route — extend the scan and add the entries (or `GAP:` reasons) (#258)
184-
- `rest_pr_ready` (`github_api.rs`) still resolves the PR via `get_pr_json`, origin first: on a fork with a same-numbered PR it marks the wrong one ready — resolve through `base_owner_repo` like `rest_pr_edit` now does
185184
- explicit force pushes (reset, rebase, undo, the Force Push menu item) still use a bare `--force-with-lease`, which the 30 s background fetch defeats — pass the expected sha as the #239 auto path does
186185
- #239 treats a pull later undone by a local reset as a local rewrite (the collaborator's commit was once a local tip), so Force Push is offered and would drop it; and with `push.default=upstream` + a differently named upstream the auto force push can never succeed — judge against `@{push}` and lease that ref
187186
- #234: on Windows, `gh`/`glab` receive the PR body on the command line (≈32K limit) — send JSON on stdin (`--input -`); a background revalidation racing a save can briefly show the old title/body
@@ -200,12 +199,15 @@ _Synthesis: none of the three addresses structured conflict-resolution AI (Stran
200199
- `usePrPanel-cli-missing.test.ts` fails on a machine whose locale is not English (asserts the English timeout string) — pin the locale in the test
201200
- **SHA-256 / reftable repositories** (2026-10-08 scan: GitButler 0.19.10, Sublime Merge 2130, Zed) — git handles them, but a few GitWand parsers assume 40-hex ids (`git/libgit2.rs:754`, `dev-server.mjs:4165`). Audit every such assumption and add a SHA-256 fixture repo to the parity tests.
202201
- **Guided bisect** (Gitoryx) — `bisect` exists only as an in-progress operation GitWand can abort (`ops.rs`). Add a start flow (pick good/bad from the Git Tree), Good / Bad / Skip on the current commit, remaining-steps counter, culprit commit opened at the end; optional `bisect run` with a user command.
203-
- **Tracked files matching `.gitignore`** (Gitoryx 0.0.43) — warn when tracked paths match an ignore rule (`git ls-files -ci --exclude-standard`) and offer to untrack them (`git rm --cached`, files kept on disk).
204-
- **Reset keeping local changes** (Sublime Merge 2132) — `git reset --keep` as a third mode beside soft/hard, refusing instead of discarding when a local edit would be overwritten.
205202
- **Per-project identity everywhere** (from the #246 review) — the project's identity (`commitIdentityFor`) reaches plain commits and custom automations only; amend, split, `--no-ff` merge, revert and cherry-pick still use git's config, so the committer (and for merge/revert/cherry-pick the author) can differ inside one project. Route every commit-creating command through it. Also key `identityOverrideByRepo` on a canonical path (case-folded on case-insensitive filesystems, worktrees resolved to their main repo), so the same project opened through another spelling or a linked worktree keeps its identity
206203
- **SSH routing on identity profiles + wrong-account guard** (from the 2026-10-08 Multi-Git scan) — the v2.12 profiles (`useIdentity.ts`) only inject `user.name`/`user.email` at commit time; authentication still goes through the global SSH config. Add an optional SSH key per profile, routed per operation via `GIT_SSH_COMMAND` (fetch/pull/push/clone), auto-select rules on the origin URL (`github.com/acme/` → Pro), and a pre-push check: the account the key actually signs in as (`ssh -T`, remembered per key) vs. the one the remote expects; on mismatch, block with an explicit override, force-push included. Real pain for anyone juggling work and personal accounts, and author + key always switch together, so a repo can no longer push as one account and commit as another.
207-
- **Opt-in auto fast-forward after fetch** (from the 2026-10-08 Multi-Git scan) — the 30 s periodic fetch (`useRepoPoller`) would fast-forward the current branch only when it is purely behind: an upstream exists, no local commits, no tracked edits, HEAD not detached, no merge or rebase in progress. Off by default, never merges or rebases; when it is on but blocked, the toolbar tooltip names the one condition holding it back. Reuses the v3.6.0 "Update branch" logic minus the stash.
208204

205+
- **Follow-ups from #260–#265** (2026-10-14):
206+
- #262: PR reads (detail, review threads, comments, reviews) and comment/review writes still resolve the PR via `get_pr_json`, origin first — on a fork with a same-numbered PR they act on the fork's PR. Moving `get_pr_json` itself to the base repo fixes every caller at once
207+
- #262: the tokenless merge (`gh pr merge`, `gh_merge_pr_inner`) passes no `--repo`, unlike `gh pr ready`
208+
- #265: a bisect in progress is invisible to the status, so the tooltip shows it only after a fast-forward attempt; a stale block reason can linger up to one fetch tick (30 s); a branch literally named `HEAD` or `unknown` is treated as detached
209+
- #264: `git_untrack_paths` needs git ≥ 2.25 (`--pathspec-from-file`)
210+
- #263: the fr/es/pt-BR/zh-CN strings for the Keep mode were not read by a native speaker
209211
- **Follow-ups from #257 (GPU-first rendering on Linux)** (2026-10-13):
210212
- the software fallback is untested on the setups it is for: only the #135 (Ubuntu 26.04, native Wayland) and #139 (Mint 22 `.deb`) reporters can confirm that the second launch recovers. Ask them once it ships
211213
- the first launch that hits the EGL abort still shows nothing; only the next one switches to software. A launch that hangs without aborting is not detected
@@ -235,9 +237,7 @@ _Synthesis: none of the three addresses structured conflict-resolution AI (Stran
235237
- **Commit Review coverage on a content-only restage** — v3.7.0's staged-set watcher fingerprints staged file paths + statuses, not content, so editing an already-staged file's content without changing which files are staged doesn't retrigger a coverage/finding recompute automatically (the pre-commit gate still recomputes coverage honestly right before the trailer is written, so the record itself stays accurate — this is a UI-staleness gap between review passes, not a data-integrity one).
236238
- **Retire the frontend's "default to GitHub" forge fallback** (follow-up to the v3.7.3 self-hosted-GitLab fix, #168): `useForge.ts`'s `getProviderByUrl`/`usePrPanel.ts`'s pre-resolution `forge` computed still assume `githubProvider` whenever detection hasn't resolved yet (no remote, `dev:web` mode, or a genuinely unrecognized forge) — a deliberate, documented backward-compat default, not an oversight. The Rust-side detection is now forge-agnostic end to end (URL match → `glab`/`gh auth status --hostname` probe), so the one remaining non-deterministic step is this UI default. Precedent exists for the alternative: Cursor Origin (#165) shows an honest "unsupported forge" state instead of guessing. Doing the same here would need the brief pre-resolution window (before `gitRemoteInfo()` returns) to render a neutral/loading state instead of an optimistic GitHub guess — deferred until there's a concrete report of it mattering, since today it never surfaces the wrong forge for supported CLIs.
237239
- **Gitea follow-ups** (deferred from the v3.11.0 Gitea lot, issue #193): forge-side auto-merge via the merge endpoint's `merge_when_checks_succeed`, which Gitea does support; submitting and dismissing reviews (reading them is implemented), check annotations, per-file review history, cross-fork PR creation, and Gitea Actions logs; exact PR counts, since `gitea_pr_count` is bounded at 300 because Gitea's real total lives in the `X-Total-Count` response header and `curl_with_status` captures no headers at all, so an exact count needs a shared-transport change that would touch every forge; `SettingsAccountsTab.vue` has no test file, so the account form's Gitea branch and the two-entry keychain removal are covered only by hand-reading, which is where the frontend-to-Rust join already broke once and would break silently again; and an old Gitea that silently ignores an unrecognised merge field and merges with its own default (HTTP 200) never triggers the legacy-field retry, with nothing in the status code to distinguish that case. Also, from the final review fix wave (2026-09-16): commit links force `https` and drop the port, because the frontend-only `forgeCommitUrl` builder cannot see the account's base URL, which lives in the keychain, Rust-side only; `App.vue`'s `openOnForge` sends a Gitea repo to github.com, a pre-existing gap it now shares with azure and cursor; the account form can carry a stale username when the forge select is switched mid-form without clearing it; and the dev-server's `gitea-pr-count` route uses the list ceiling where the Rust command uses a dedicated count ceiling, and surfaces an HTTP error where the Rust command degrades to `0`.
238-
- **`bb_list_prs` has the same pagination defect fixed in the Gitea list command** (not a Gitea item: found while reviewing the Gitea copy of the same code, in `commands/bitbucket.rs`). It inflates the requested `limit` to `per_page + extra` and then skips locally, but the server's skip is `(page - 1) * limit_sent`, so any offset that is not an exact multiple of the limit returns the wrong window (offset 25 limit 10 returns items 35 to 45). Left alone because fixing it belongs to a Bitbucket change, not a Gitea lot.
239240
- **History-aware prompts for the MCP** — align `buildResolveHunkPrompt` / `gitwand_resolve_hunk_llm` with the v3.11.1 history context (`collectHunkHistory` is already exported from `@gitwand/core`).
240-
- **MCP residual-marker check** — `toolResolvHunkLlm` scans the whole file for markers (`packages/mcp/src/tools/index.ts:1155`), so it rejects valid answers in multi-conflict files. Needs its own issue.
241241
- **Rename-aware history** — `blame -M -C` / `log --follow` for the v3.11.1 history context.
242242
- **Dedicated `git_conflict_history` Rust command** — one IPC round-trip and a real process timeout, if the `gitExec` round-trips of v3.11.1 prove slow.
243243
- **Honor `.gitwandrc` `llmFallback.model` / `maxTokens` on the desktop** — ignored today in favour of the app's AI settings.

0 commit comments

Comments
 (0)