0.6.0
Update notes 0.6.0
Requires a Termux runner update (v9 → v10). Open the companion app and tap Update runner, or re-run the install command from the plugin settings. Existing single-vault setups are migrated automatically and keep their token: there is nothing to re-pair.
More than one vault on a device
The Termux side used to hold exactly one repository, so installing for a second vault silently overwrote the first, and that vault's requests were never answered again (a TIMEOUT and "Runner has written here: NO" in the bridge check, which points at the wrong suspect). Every paired vault now has a profile of its own: its own repository, its own runtime folder, its own token, mode 600, one file each.
- One runner run drains every profile, oldest request first across all of them, still one at a time. The trigger the companion sends carries no vault identity by design, so the runner looks at all the queues instead of being told which one to look at.
- A token is valid for its own profile only. A request file copied into another vault's runtime folder is rejected, and a request naming another vault's profile is rejected too. The plugin never sends a repository path; it sends an opaque profile id that the runner looks up in files only Termux can write.
- Removing or breaking one vault leaves the others working: its own queued requests are answered with the new
REPO_MISSINGerror so that vault's panel stops waiting, and the rest of the run continues. - Your existing configuration is turned into a profile on the first run of the new runner, with the same token, and the old
configis kept asconfig.legacy.
A vault inside another vault
Main/ and Main/Projects/ABCproject/ can both be vaults and both be repositories. The inner repository is excluded from the outer one through the outer repository's .git/info/exclude: device-local, never synced, and no tracked file such as .gitignore is touched. The installer prints what it wrote where; the runner re-checks it on every run, so a vault paired from the plugin is covered too.
Each side's operations are pinned to its own repository with GIT_CEILING_DIRECTORIES and a top-level check, not just by changing directory. If the inner .git disappears, the operation fails with REPO_MISSING instead of quietly acting on the repository above it.
Pairing a second vault, moving one, deleting one
- Pair this vault, in the settings and the setup guide, asks Termux for a profile without re-running the installer. The plugin leaves a pairing request in its runtime folder and wakes the runner; the token is generated in Termux and comes back. Nothing secret ever travels towards Termux, and nothing the request contains is trusted.
- A vault you moved is found again by the marker the runner leaves in its runtime folder, and keeps its profile and token.
- A vault you deleted is reported as a broken profile and is never re-pointed at some other repository.
- The bridge check now says which profile serves this vault, and "runner installed for a different vault" became "no profile for this vault", with the two ways to fix it.
Credentials per repository
Two vaults can use two accounts. The installer configures credential.helper with a credential file of this repository's own, or core.sshCommand with a separate key, locally for the repository it is configuring. As before, credentials never reach the plugin, a result file or any log.
Status panel
- The Staged and Untracked group buttons sit in the same columns as every folder row and file row below them. A header used to render only its real buttons, which parked "unstage all" and "stage all" in the file rows' open-file column and made the whole group look misaligned.
Diff, file history and conflicts
- With line wrapping on, the
+and−markers stayed in the number gutter where they belong. They were escaping into the file content whenever a line number reached three digits, because the wrapped layout guessed the gutter's width instead of measuring it. - Deleted characters are highlighted in a solid #AA1414 with white text. The translucent red before it washed out against the red row on a phone, which is exactly where the changed characters are hardest to find.
- New setting: custom colours for the diff and conflict panes, off by default. Switching it on reveals pickers for the added/deleted line backgrounds, the added/deleted character highlights and the two conflict sides, configured separately for the light and the dark theme, with a Reset per theme. While it is off the panes follow your theme exactly as before.
- Whitespace glyphs now work in the conflict pane too. A whitespace-only difference is a common reason two sides of a conflict look identical.
- Line wrapping, whitespace glyphs and the colours apply to all three file views and take effect immediately, without a Termux round trip.
- One surface per question. Every route to a diff or a history opens the panes: the command palette used to open older, plainer modals while the context menu opened the panels. The file history panel gained the one thing those modals had that it did not, a per-commit eye button showing the file as it was at that commit.
- The file history panel reloads when you open it again for the same file (it used to redisplay a stale list), hides Load more once the history is exhausted, keeps the diffs it already fetched so a colour or theme change costs no round trip, and re-measures after a rotation.
- The repository history no longer shows a blank panel while its first page loads; all four panels use the same "runner is working" indicator, the same path header and the same wording for an empty or failed diff.
Sparse checkout safety
Delete files locally, offered when the safety check blocks on files that are only new here, now moves all of them to the trash. git reports a fully untracked folder as a single dir/ line, so one entry was deleted and the rest were quietly left behind. The runner reports those files individually, the plugin expands folders file by file, names anything it could not move instead of logging it away, and re-runs the check so you can see the state is clear.
Internals
Runner v10: profiles (profiles/<id>.conf), automatic migration of the single-repo config, one run drains every profile, profileId in requests and results, REPO_MISSING, per-profile git pinning, nested-vault exclusion, relocation and self-pairing, a global single-instance lock, and git status -uall in the safety check. Reasoning and the rejected alternatives are in ADR-002; the protocol, threat model and limitations are updated in the same release. 262 unit tests, 272 e2e checks.
Full Changelog: 0.5.10...0.6.0