Repository navigation
Releases
git-strata v0.2.1
git-strata 0.2.1 — session marks and safe auto-close
Upgrade first: store migration v6 → v7 (irreversible)
The first 0.2.1 daemon start upgrades <root>/store/store.db from schema v6
to v7, adding session marks. It makes a durable, verified pre-migration backup
in store/backups/ and prints its path. 0.2.0 cannot open a v7 store.
Upgrade the CLI, daemon and hook callers together; a mixed installation is not
supported. No config edits are required.
Before upgrading, check git-strata status and git-strata daemon status:
no publishing and no holders. Back up the store and its sidecars, config.toml,
pins.json and the LaunchAgent plist. Upgrade the Homebrew formula (and the
desktop cask if installed), restart the existing LaunchAgent with
launchctl kickstart -k gui/$(id -u)/com.gwd.git-stratad, then verify daemon
status and git-strata ls. Never start a second daemon with brew services.
Refresh the installed skill: npx skills update git-strata -g.
To downgrade, stop the daemon, preserve the current store and sidecars together,
restore the verified v6 backup as store/store.db (without the v7 sidecars),
and install the matching 0.2.0 CLI and daemon before restarting. Restoring the
backup loses metadata recorded after migration; preserve and reconcile session
directories before further work. Git commits and refs remain. Earlier-schema
upgrades must restore the backup compatible with their old binaries; see
store recovery.
Session marks
git-strata mark --session S donerecords completion intent, with an optional
note;mark --session S activeclears it. Marking never discards work.- The desktop app displays done badges and supports filtering by mark.
- Marking requires the daemon feature
session.mark; upgrade the daemon as well
as the CLI. A done mark allows later automatic closure, so clear it before
resuming work in that session.
Safe automatic closure after publish
- Automatic closure defaults to enabled, with global
[publish].auto_closeand
per-repopublish.auto_closeoverrides. - After publish has fully landed the session in main, safe eligible sessions
are moved to trash using non-discard checks. Unpublished work is never thrown
away: the session remains open, with a safe done mark where allowed. - Inspect
data.auto_close.sessions[<session id>]in the publish reply for the
closure result, mark outcome and reasons. Disabled, busy or changed sessions
are not treated as safely closed. Follow the updated skill's reason-specific
guidance rather than forcing removal.
Validation note
The landed batch passed review. The full workspace test run encountered the
existing parallel interference in strata-deps/tests/open_files.rs; its serial
rerun passed all six tests. That file is unchanged in this 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 appIf macOS blocks the app: System Settings > Privacy & Security > Open Anyway, or
sudo xattr -dr com.apple.quarantine "/Applications/GIT STRATA.app".
Full Changelog: v0.2.0...v0.2.1
git-strata v0.2.0
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:
- Check nothing is publishing (
git-strata status,daemon statusholders[]). - Back up
store/store.db*, config.toml, pins.json and the LaunchAgent plist. - 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. - Restart the LaunchAgent daemon (
launchctl kickstart -k gui/$(id -u)/com.gwd.git-stratad),
then checkdaemon statusandgit-strata ls. 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
-mand 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 --baseparks selected workspaces at local commits at/ahead of main.
Publish refuses withInvalidInput base_not_on_mainwhen 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:
- Stop the daemon and ensure it has stopped.
- Move
store/store.dband its-wal,-shm, and-tshmsidecars aside and
keep them together for recovery. - Copy the verified
store/backups/store-v5-<ns>.dbbackup into
store/store.db. If upgrading directly from an earlier schema, restore
the actualstore-v<from>-<ns>.dbbackup compatible with the old binaries. - Install the matching old CLI and daemon together. Remove
rebase.quiet_skip
fromconfig.toml; 0.1.2 cannot parse it. Downgrades further back must also
follow the older config/pin cleanup in store recovery. - 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 appIf 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
git-strata v0.1.2
git-strata 0.1.2 — main-sync
Upgrade first: read this before installing
Store migration v3 → v5 (irreversible). The first 0.1.2 daemon start migrates
<root>/store/store.db from schema v3 to v5. Before migrating it writes a verified
copy to <root>/store/backups/store-v3-<ns>.db and logs
git-strata: store schema migrated 3 -> 5; a copy of the v3 store is at … to stderr
(daemon.err.log under the LaunchAgent). 0.1.1 refuses a v5 store (Corrupt,
user_version), and refuses config.toml [repo.<name>.sync] tables and pins.json entries
containing sync_deps. There is no downgrade path other than restoring the backup, which
loses everything recorded after it. If a process still holds the old store's WAL the
migration refuses with Busy (migration_backup) and changes nothing; stop that reader and
start again.
Stores already at v5 from an unreleased main build (between the main-sync merge and this
release) are refused at open (Corrupt, "schema differs"): the v5 guard text changed before
release. Restore that store's store-v3-<ns>.db backup and let 0.1.2 migrate it again.
Stores from 0.1.0/0.1.1 (v3) are not affected.
Upgrade order:
git-strata daemon stop(wait for it; nothing publishing:daemon statusholders[]).- Back up
store/store.db*, config.toml, pins.json and the LaunchAgent plist. - Upgrade the CLI and daemon together, and the desktop app:
brew upgrade dickwu/tap/git-strata && brew upgrade --cask dickwu/tap/git-strata-desktop. - Add
[repo.<name>.sync]tables to config.toml (below) — before the first start. git-strata daemon start, then checkdaemon statusandgit-strata ls.
Never brew services start git-strata alongside your LaunchAgent (two daemons, one socket).
New: main-sync
Sessions can now keep up with origin/<default_branch>:
- Following main. The daemon fetches periodically (staging ref, compare-and-swap) and moves
idle sessions onto the new main tree with the same safety rules as auto-rebase after publish
(no open files, quiet period, conflict-free projection; otherwise deferred, never forced). git-strata sync.--checkreports local upstream state;--repo Rfetches and moves now;
conflicts produce a saved report resolved with--resolved/--keep PATH --target T --generation G;
legacy workspace conflicts can be acknowledged without a binding;--check --hookis a
cache-only Stop hook for agents.- Dependency rollouts. When main changes install inputs, the new dependency set is applied
automatically (deps = "apply") or waits forgit-strata deps approve(deps = "confirm").
deps listshows each proposal's effectivemodeand a package-change summary
(credentials in URLs are redacted). - Status / GUI / tray.
statuscarries anupstreamobject per repo (behind/ahead,
following, state, fix); the desktop app and tray show it, and only confirm-mode proposals
appear as waiting for a human.
New config: [repo.<name>.sync]
[repo.web.sync]
follow_main = true # default: publish.branch == default_branch; split-branch repos cannot enable it
deps = "apply" # default "apply"; "confirm" keeps human approval of dependency rollouts
fetch_secs = 900 # default 900; 0 disables periodic fetch; otherwise 60..=86400follow_main = false on a non-split repo requires deps = "confirm" (V16). deps is pinned
in pins.json as sync_deps: an existing pin adopts the configured value at the first 0.1.2
start; afterwards apply → confirm takes effect at the next start, while confirm → apply
needs git-strata config relax REPO (TTY + Touch ID). Without a table every non-split repo
follows main with deps = "apply", so existing Pending proposals can auto-apply on the first
start. For exactly the 0.1.1 behaviour, add follow_main = false and deps = "confirm" for
each repo before starting.
Rollback
Stop the daemon; move store/store.db and its -wal/-shm/-tshm aside (keep them); copy
store/backups/store-v3-<ns>.db (or your own copy) to store/store.db; reinstall the 0.1.1 CLI
and daemon together; remove the [repo.*.sync] tables and each pin's sync_deps; start.
See docs/config.md and docs/modules/store.md.
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 appIf 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.1...v0.1.2
git-strata v0.1.1
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 appIf 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.0...v0.1.1