Repository navigation
v1.5.4
Git sync that survives two machines, a Clone from Git that actually lands,
and updates that download in the background and ask only when they are ready.
-
Git sync across machines (issues #132, #133, #130, #127): the RC test
round drove the whole flow on two computers — branch, merge, push, pull — and
found that it did not converge. Pull only merged the checked-out branch, so a
merge a teammate pushed tomainnever reached your localmainwhile you
sat on a feature branch; and aftergit mergethe database still held the
pre-merge state, which the next Push exported over the merged file and
shipped — the merge vanished from the remote even when done in the right
order. Pull now syncs the project (every local branch fast-forwards to its
remote counterpart), switching to a branch a teammate advanced fast-forwards
it, and switch / merge write the database to the checkout first and read the
result back afterwards. The project file is a set of rows, not a document, so
two branches that each added a request no longer end in a text-level
conflict whose only resolution threw one side away: conflicted project files
are merged by row (additions kept, one-sided changes taken, both-sided
changes decided by the newer edit, a change beats a stale delete) and only a
file the merge cannot read still reaches the mine / theirs dialog. Deletions
finally propagate — a request removed on one machine no longer comes back on
the other's Pull, and its Push no longer resurrects it. A project rename now
travels with the repository, so both machines keep writing the same file;
before, each wrote its own<name>.jsonand read only its own. Clone from
Git landed the remote's rows under the wrong project id on the second
machine (issue #130), and on the same machine refused with a message naming
the internal project name — "My Project", which no screen shows (issue
#133). Rows are bound to the importing project; the one-repository-per-local-
project rule is checked before a project is created and names the project
the way the Hub does. A wrong PAT no longer leaves a poisoned empty
repository behind, the token never enters a URL or.git/config, and Push
fails with a clear message instead of "Invalid username or token" (issue
#127). -
Git edge cases found on a real remote: a first Push to an empty
repository, a repository created withmasterwhile the project saysmain,
a Pull before anyone has pushed, a repository whose default branch no longer
exists, and a checkout folder that only holdsdesktop.iniall reach the same
state as a clean clone. Push used to retire every other tracked.jsonin
the folder — a second project sharing the repository, a team'snotes.json—
and now retires only this project's own previous file. Renaming the project
made Push commit nothing while reporting success; it commits. -
Updates download in the background (issue #134): the update dialog used
to appear the moment a newer version was merely available, before anything
was downloaded, and background download was off — every check interrupted
you and still needed a click. Updates now download silently; when one is
ready, Testnizer comes forward and a small card in the corner asks Restart
& install, Install on quit, or Skip this version. Nothing is modal;
closing the card means "on quit". A skipped version is neither downloaded nor
offered again in the background (Settings → Check for Updates can still
install it), and — the part that mattered — it is no longer installed on the
next quit behind your back. A failed install brings up the dialog with the
error and a manual-download link rather than staying silent. -
Saved responses become examples (issue #125): Save response now stores
the request that produced it — both the editor template with{{variables}}
intact and the resolved request that went over the wire, with credential
headers masked — and lists the example under its request in the APIs tree.
An example opens in its own read-only tab (Sent / Original toggle, the saved
response below); rename and delete work from the tree and from the Saved tab
alike; examples travel through export, import and Git. -
Editing and saving (issues #122, #124, #126, #123): Cmd/Ctrl+S refreshes
the APIs tree, so a method change shows on the request's badge without
reopening anything; the Save button next to Send takes the same path and now
keeps SOAP, WebSocket, gRPC and GraphQL metadata like Ctrl+S already did. A
manual SOAP request no longer reopens with empty URL, operation and body
after Save (Send had been using the saved values all along), and the Runner
sends manual SOAP with the rightContent-Type/SOAPAction. The project
root can be renamed from the tree. The search box and folder state of the
APIs panel are no longer shared between project tabs. Apm.variables.set
in a pre-request script now resolves on Send exactly as it does on Run. -
AI Chat (issues #120, #121): user-defined HTTP headers are supported and
validated (an invalid one is named, its value never shown), and the Send
button no longer demands an API key for providers that do not use one.
Tests: the suite grew to 3867 across 320 files. The git work is covered by
two suites that run against a real bare repository with real git, one
in-memory database per "machine" and no mocks — the reporter's nine-step
two-device flow verbatim, the other merge order, switch without Pull, deletion
propagation, unpushed rows surviving a Pull, push-rejected → Pull → Push,
fresh-machine clone, same-machine refusal, empty and master-only remotes,
create / delete / remote-only branches, a conflict the row merge declines
(ours, theirs, abort), rename propagation, the wizard's inspection step and
the Save dialog's push / pull sharing a remote with the checkout. The row
merge has its own unit suite. The background update flow is covered in the
store, in the main-process install-on-quit switch, and by an e2e spec that
injects the updater events into the built app and checks that the card, not a
dialog, appears — and only once the download is done.
Still deferred: main-process git error strings are Turkish regardless of
UI language (main has no i18n); the Save dialog's own Pull still imports
additively; installing the update at quit time is exercised by unit tests
only, since tests have no update server.