Skip to content

Release: extension 1.17.0, desktop 2.4.0, Merge Studio 1.2.0 - #63

Merged
antonarnaudov merged 34 commits into
mainfrom
release/ext-1.17-app-2.4-ms-1.2
Sep 30, 2026
Merged

antonarnaudov merged 34 commits into
mainfrom
release/ext-1.17-app-2.4-ms-1.2

Conversation

@antonarnaudov

Copy link
Copy Markdown
Contributor

Stacked on #62, which is stacked on #59. It lands after both, and is tagged only on the owner's go.

  • Versions: 1.17.0, 2.4.0, 1.2.0, plus the lockfile's workspace entries.
  • Changelogs: the Unreleased headings become the version, dated 2026-09-29.
  • Release notes: docs/releases/ext-v1.17.0.md and app-v2.4.0.md.
  • READMEs:
    • the extension's privacy section said crash reports were "the one thing it sends"; now it lists everything, with the new gitstudio.avatars.gravatar in the settings table;
    • the desktop's privacy section lists everything;
    • Merge Studio's links SECURITY.md and PRIVACY.md;
    • the root README no longer says AI keys live in SecretStorage (they've been in GitStudio's own encrypted store since 1.4.0) and links the code of conduct, SECURITY.md and the three PRIVACY.md files.

Tests: merge-studio export 54/54, Merge Studio 62/62, the extension's README/CHANGELOG tests 163/163.

🤖 Generated with Claude Code

@antonarnaudov
antonarnaudov force-pushed the release/ext-1.17-app-2.4-ms-1.2 branch from 6570594 to f4c7169 Compare September 29, 2026 11:07
antonarnaudov and others added 3 commits September 29, 2026 15:12
- Git: disposing a git that failed to spawn signalled pid 0, the whole
  process group, which is the extension host (it killed the test runner).
  Every kill now needs a real pid.
- Desktop: a chat cancelled just before its message went out wrote to the
  stdin it had just ended, an uncaught 'error' in the main process.
- Desktop: the AI settings started as a shallow copy of a shared constant,
  so the first connection added before any settings file existed was
  pushed into @gitstudio/ai's EMPTY_AI_SETTINGS.
- AI: an Azure base URL ending in "/" before its ?api-version query
  produced ".../gpt//chat/completions".
- Refs: annotated tags (most releases) came back with no date, because
  %(committerdate) is empty for a tag object; %(creatordate) is the
  commit's date for a commit and the tagger's for a tag.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…renderer

Tests written against real temp repositories, a local bare remote and fakes
for GitHub, the AI providers and the CLI — never the network. Every test
asserts behaviour: the git state left behind, what a page is sent, what the
person is asked and told. Bugs they found and that are not fixed yet are
marked test.todo / skip with the correct behaviour written down.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A single c8 run over the whole repo merges V8's raw coverage by script URL
and assumes every process ran the same code. A package's source is
transpiled once for its own tests and differently again when an app's tests
load it through the workspace link, so shared files were read against the
wrong text: host-bridge's scrubber reported 13% with every line tested.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@antonarnaudov
antonarnaudov changed the base branch from chore/launch-hygiene to main September 29, 2026 12:15
antonarnaudov and others added 7 commits September 29, 2026 19:33
…ct" too

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Push re-created a branch deleted on the remote: with its tracking config
  left behind and the remote-tracking ref pruned, a bare `git push` published
  it again. Push (and push-by-name, its twin) now refuses and says the branch
  it tracks is gone — while a single-branch clone, where @{u} never resolves,
  still pushes.
- A reword's "#" lines were deleted after the rebase paused: the chosen
  comment character stayed in .git while the queue moved into rebase-merge/.
- A rebase git refused up front (autostash over unresolved conflicts) was
  reported as a rebase stopped on conflicts. It is now refused before
  anything runs, with the reason.
- Stash & Retry was offered for a rebase onto, or a pick/revert of, a name
  git cannot resolve — git refuses the name before it looks at the tree.
- An unreadable repository (a .git file pointing nowhere) read as a detached
  HEAD, so the push review said "HEAD is detached". It now says git's error.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- A conflict both sides inserted between two lines was written after the
  next line when only that next line had been edited (a, c2, <markers>
  instead of a, <markers>, c2).
- An add/add conflict (no common base) wrote each side with an extra blank
  line inside the markers, and lost the file's last line break; resolving by
  hand left a stray blank line. Untouched, the file is now byte-for-byte
  what git writes.

Checked by fuzzing the old and new writer over 450k random merges: every
other difference was the first bug being fixed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Extension: File History, Line History, Open Changes and the Timeline
  compared paths with "/" — on Windows no file was ever inside its
  repository. They use the shared separator- and case-aware check now.
- Extension: Sync's "upstream no longer exists" question named no upstream;
  it reads the configured one now ("tracks origin/topic").
- Desktop: a repository with no commits yet showed "Couldn't load history"
  instead of its "No commits yet" tile.
- Desktop: a failed clone showed git's last line — often a fragment like
  "and the repository exists." — instead of the reason.
- Desktop: on Windows, repositories were grouped outside the folders they
  sit in (backslashes from the folder picker against "/" comparisons).
- Crash reports: a path with a space scrubbed differently the second time,
  so the same crash could fingerprint twice.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Versions, changelog headings (29 Sep 2026) and release notes for what the
nightly batch merged: ways to support GitStudio, the launch screen, tabs
that survive a quit, the no-Git screen, honest PRIVACY.md files and a Gravatar
switch, SECURITY.md and issue forms, the macOS 12 guard, and the security
fixes. The READMEs now say everything each product sends (the extension's
said crash reports were "the one thing"), the root README no longer says AI
keys live in SecretStorage, and it links the privacy and security docs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ase notes

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@antonarnaudov
antonarnaudov force-pushed the release/ext-1.17-app-2.4-ms-1.2 branch from f4c7169 to 392e8e9 Compare September 29, 2026 16:56
Comment thread apps/desktop/test/ghFakeApi.ts Fixed
antonarnaudov and others added 16 commits September 29, 2026 21:02
… outran

The updater flow waited 20 event-loop turns for electron-updater to load, and
the rebase panel read its banner right after a keypress. Both now wait for
what they assert, capped by wall time.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…n Windows

Killing git.exe left the ssh it had started running and holding the clone's
pipes, so the clone never reported that it ended — the test for it hung a
Windows CI runner for four hours. taskkill /T takes the tree. The test is
capped at 30s, and the desktop, extension and git-service suites now fail a
test after five minutes instead of waiting forever.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Push re-created a branch deleted on the remote: with its tracking config
  left behind and the remote-tracking ref pruned, a bare `git push` published
  it again. Push (and push-by-name, its twin) now refuses and says the branch
  it tracks is gone — while a single-branch clone, where @{u} never resolves,
  still pushes.
- A reword's "#" lines were deleted after the rebase paused: the chosen
  comment character stayed in .git while the queue moved into rebase-merge/.
- A rebase git refused up front (autostash over unresolved conflicts) was
  reported as a rebase stopped on conflicts. It is now refused before
  anything runs, with the reason.
- Stash & Retry was offered for a rebase onto, or a pick/revert of, a name
  git cannot resolve — git refuses the name before it looks at the tree.
- An unreadable repository (a .git file pointing nowhere) read as a detached
  HEAD, so the push review said "HEAD is detached". It now says git's error.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- A conflict both sides inserted between two lines was written after the
  next line when only that next line had been edited (a, c2, <markers>
  instead of a, <markers>, c2).
- An add/add conflict (no common base) wrote each side with an extra blank
  line inside the markers, and lost the file's last line break; resolving by
  hand left a stray blank line. Untouched, the file is now byte-for-byte
  what git writes.

Checked by fuzzing the old and new writer over 450k random merges: every
other difference was the first bug being fixed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Extension: File History, Line History, Open Changes and the Timeline
  compared paths with "/" — on Windows no file was ever inside its
  repository. They use the shared separator- and case-aware check now.
- Extension: Sync's "upstream no longer exists" question named no upstream;
  it reads the configured one now ("tracks origin/topic").
- Desktop: a repository with no commits yet showed "Couldn't load history"
  instead of its "No commits yet" tile.
- Desktop: a failed clone showed git's last line — often a fragment like
  "and the repository exists." — instead of the reason.
- Desktop: on Windows, repositories were grouped outside the folders they
  sit in (backslashes from the folder picker against "/" comparisons).
- Crash reports: a path with a space scrubbed differently the second time,
  so the same crash could fingerprint twice.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… outran

The updater flow waited 20 event-loop turns for electron-updater to load, and
the rebase panel read its banner right after a keypress. Both now wait for
what they assert, capped by wall time.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Push re-created a branch deleted on the remote: with its tracking config
  left behind and the remote-tracking ref pruned, a bare `git push` published
  it again. Push (and push-by-name, its twin) now refuses and says the branch
  it tracks is gone — while a single-branch clone, where @{u} never resolves,
  still pushes.
- A reword's "#" lines were deleted after the rebase paused: the chosen
  comment character stayed in .git while the queue moved into rebase-merge/.
- A rebase git refused up front (autostash over unresolved conflicts) was
  reported as a rebase stopped on conflicts. It is now refused before
  anything runs, with the reason.
- Stash & Retry was offered for a rebase onto, or a pick/revert of, a name
  git cannot resolve — git refuses the name before it looks at the tree.
- An unreadable repository (a .git file pointing nowhere) read as a detached
  HEAD, so the push review said "HEAD is detached". It now says git's error.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- A conflict both sides inserted between two lines was written after the
  next line when only that next line had been edited (a, c2, <markers>
  instead of a, <markers>, c2).
- An add/add conflict (no common base) wrote each side with an extra blank
  line inside the markers, and lost the file's last line break; resolving by
  hand left a stray blank line. Untouched, the file is now byte-for-byte
  what git writes.

Checked by fuzzing the old and new writer over 450k random merges: every
other difference was the first bug being fixed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Extension: File History, Line History, Open Changes and the Timeline
  compared paths with "/" — on Windows no file was ever inside its
  repository. They use the shared separator- and case-aware check now.
- Extension: Sync's "upstream no longer exists" question named no upstream;
  it reads the configured one now ("tracks origin/topic").
- Desktop: a repository with no commits yet showed "Couldn't load history"
  instead of its "No commits yet" tile.
- Desktop: a failed clone showed git's last line — often a fragment like
  "and the repository exists." — instead of the reason.
- Desktop: on Windows, repositories were grouped outside the folders they
  sit in (backslashes from the folder picker against "/" comparisons).
- Crash reports: a path with a space scrubbed differently the second time,
  so the same crash could fingerprint twice.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… outran

The updater flow waited 20 event-loop turns for electron-updater to load, and
the rebase panel read its banner right after a keypress. Both now wait for
what they assert, capped by wall time.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…not only dots

Closes the two open code-scanning alerts (js/incomplete-sanitization).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…duct name

User-visible text, prompts, identifiers, file names, comments and past
release notes. No setting key, command id or context key ever carried it,
so nothing changes for anyone's configuration.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…w and the Dock icon

Settings ▸ Appearance ▸ Dark style. Graphite (the default) is today's dark
palette, and the running app no longer swaps the Dock icon: it keeps the one
macOS shows while GitStudio is closed, so opening and quitting no longer
changes it. Neon is a near-black ground with more violet, and the neon Dock
icon while GitStudio runs. The launch screen paints the chosen style from
its first frame. The macOS 11–15 icns is now the Graphite tile, matching the
macOS 26 icon.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comment thread apps/desktop/test/darkStyle.test.ts Fixed
antonarnaudov and others added 7 commits September 30, 2026 01:14
…t only dots

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Windows joins the renderer folder with a backslash, so the basename
the test compared kept a '\r\' prefix.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…2.4-ms-1.2

# Conflicts:
#	apps/extension/test/commitView.commit.cov.test.ts
#	apps/extension/test/commitViewCovKit.ts
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@antonarnaudov
antonarnaudov merged commit 39e018c into main Sep 30, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants