Skip to content

git-strata v0.2.0

Choose a tag to compare

@github-actions github-actions released this 04 Nov 14:19
· 10 commits to main since this release

git-strata 0.2.0 — r2

Upgrade first: read this before installing

Store migration v5 → v6 (irreversible). The first 0.2.0 daemon start migrates
<root>/store/store.db to schema v6 and prints the verified pre-migration backup path
(store/backups/store-v5-<ns>.db). The 0.1.2 CLI is unusable on a v6 store: upgrade the
CLI, daemon and hook callers together. Downgrade procedure: see "R2 core" below.

Upgrade order:

  1. Check nothing is publishing (git-strata status, daemon status holders []).
  2. Back up store/store.db*, config.toml, pins.json and the LaunchAgent plist.
  3. Make any config.toml edits now (none are required for 0.2.0), then upgrade together:
    brew upgrade dickwu/tap/git-strata && brew upgrade --cask dickwu/tap/git-strata-desktop.
  4. Restart the LaunchAgent daemon (launchctl kickstart -k gui/$(id -u)/com.gwd.git-stratad),
    then check daemon status and git-strata ls.
  5. npx skills update git-strata -g.

Never brew services start git-strata alongside your LaunchAgent (two daemons, one socket).

Config hot reload

git-strata config reload applies config.toml edits without a daemon restart (hot-added
repos, loosening via config relax); restart-only fields still need a restart. Exit codes,
rejection reasons and the invariant table: config.md.
The desktop app shows reload / relax state.

R2 core

  • Publish accepts repeated -m and per-repo --message-for. Without flags, manual
    checkpoint messages supply subjects; tool-call IDs do not. No-change manual
    checkpoints still record no new message. Commits carry recovery trailers.
    Preview and execution exclude messages consumed by crash-recovered commits,
    even when startup left the publish outcome empty.
  • new --base parks selected workspaces at local commits at/ahead of main.
    Publish refuses with InvalidInput base_not_on_main when the workspace base
    is on neither the publish target nor main. Existing rewound-chain sessions
    that used to publish while silently dropping base-only commits are now
    refused until the human lands or recovers those commits.
    Dependency approval cannot silently drop their commits. Publish lines are
    excluded from this release.
  • Automatic moves ignore dependency/cache writes only where content is not
    carried. Nested seed caches and tracked files remain protected. Eligible
    stuck rows name holders and hand control back once through the Stop hook.
  • Pin timestamps are in a separate audit sidecar; warnings gain timestamps
    without changing their existing wire representation.
  • Successful non-discard rm reports its landed verdict in upstream metadata.

Store schema v6 is forward-only. The 0.1.2 CLI is unusable on a v6 store.
Upgrade the CLI and daemon together. Commands that open the store directly
include add, restore, diff, deps propose, rm, resolve, assign,
publish, devports (session ports / session exec), checkpoint (including
the PostToolUse checkpoint hook), grep, and files. An old checkpoint hook
fails on every tool call after the migration. A few RPC-only commands still
answer, which does not make a mixed installation supported.

A 0.1.2 Stop hook can consume the daemon's stuck-episode latch while ignoring
the new hand-back field, so that episode's hand-back is lost; the
AutoRebaseStuck warning remains. Upgrade hook callers together with the CLI.
The latch is in memory, so a daemon restart can repeat a hand-back for a
still-stuck episode.

Startup prints the verified pre-migration backup path. To downgrade from v6
to the v5 store used by 0.1.2, the human must:

  1. Stop the daemon and ensure it has stopped.
  2. Move store/store.db and its -wal, -shm, and -tshm sidecars aside and
    keep them together for recovery.
  3. Copy the verified store/backups/store-v5-<ns>.db backup into
    store/store.db. If upgrading directly from an earlier schema, restore
    the actual store-v<from>-<ns>.db backup compatible with the old binaries.
  4. Install the matching old CLI and daemon together. Remove rebase.quiet_skip
    from config.toml; 0.1.2 cannot parse it. Downgrades further back must also
    follow the older config/pin cleanup in store recovery.
  5. Start the matching old daemon only after restoring the store and config.

Restoring the backup loses store metadata recorded since migration, including
later session and checkpoint records. Session directories may remain on disk;
preserve and reconcile them before further work. Git commits and refs remain.
The backup is a rollback, not a way to merge newer metadata into an older store.

Refresh the installed skill with npx skills update git-strata -g so baseline
and human hand-off guidance match the upgraded binary.

Menu-bar state and freshness

The menu-bar icon now combines a neutral workspace fork with a distinct colored shape:
red slash (Down), red triangle (Alert), dim ellipsis (Checking), amber dot (Waiting),
violet diamond (Conflict), teal ring (Syncing), or the neutral glyph (Normal). There is
no animation or count beside the icon. Colors adapt to the drawing appearance independently
of the app theme; inactive-display dimming is intentionally not retained.

  • The native poller continues while the window is hidden or visible. Stale/missing inputs
    show Checking; slow session/dependency reads do not imply the daemon is down.
  • NotResponding requires two counted health timeouts and 20 seconds since its last Ok.
    File-handle shed replies now reach the client as Busy/too_many_open_files, not rpc_id.
  • Home and the tray show long non-conflict deferrals and pending config relax requests.
    Conflicts are counted separately as agent work. Daemon shows warning variant names.
  • To clear a persistent red warning, address its cause, then restart the daemon. Waiting
    items remain available, with age captions when retained data is stale. No acknowledge/snooze.
  • On older daemons without fds, hidden polling uses only one health read every 30 seconds.
    A hung daemon can take about 45 seconds to show Down ("isn't responding"),
    compared with about 25 seconds on the normal cadence; polling phase can change the delay.
    Deps age out after 90 seconds and the icon becomes Checking until reopening or upgrading.
    The pre-fd-fix build still leaks roughly two descriptors per minute under this gentle plan;
    upgrade the daemon to remove that limitation.
  • Missing session-level upstream detail can keep Checking indefinitely; Home lists those
    sessions without guessing the cause. Existing daemon RPC params/features remain compatible.

Automated tests and offline color/grayscale previews cover the implementation. Live replicas,
VoiceOver, menu highlight and the 30-minute hidden-window test remain manual acceptance gaps;
this note does not claim those checks or a published release.


Apple silicon (arm64), macOS 13+. Signing: adhoc (see docs/release.md).

brew install dickwu/tap/git-strata                 # CLI + daemon
brew install --cask dickwu/tap/git-strata-desktop  # desktop app

If macOS blocks the app: System Settings > Privacy & Security > Open Anyway, or
sudo xattr -dr com.apple.quarantine "/Applications/GIT STRATA.app".

Full Changelog: v0.1.2...v0.2.0