Skip to content

Releases

git-strata v0.2.1

Choose a tag to compare

@github-actions github-actions released this 07 Nov 01:08

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 done records completion intent, with an optional
    note; mark --session S active clears 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_close and
    per-repo publish.auto_close overrides.
  • 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 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.2.0...v0.2.1

git-strata v0.2.0

Choose a tag to compare

@github-actions github-actions released this 04 Nov 14:19

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

git-strata v0.1.2

Choose a tag to compare

@github-actions github-actions released this 03 Nov 01:29

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:

  1. git-strata daemon stop (wait for it; nothing publishing: daemon status holders []).
  2. Back up store/store.db*, config.toml, pins.json and the LaunchAgent plist.
  3. Upgrade the CLI and daemon together, and the desktop app:
    brew upgrade dickwu/tap/git-strata && brew upgrade --cask dickwu/tap/git-strata-desktop.
  4. Add [repo.<name>.sync] tables to config.toml (below) — before the first start.
  5. git-strata daemon start, then check daemon status and git-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. --check reports local upstream state; --repo R fetches 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 --hook is 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 for git-strata deps approve (deps = "confirm").
    deps list shows each proposal's effective mode and a package-change summary
    (credentials in URLs are redacted).
  • Status / GUI / tray. status carries an upstream object 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..=86400

follow_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 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.1...v0.1.2

git-strata v0.1.1

Choose a tag to compare

@github-actions github-actions released this 30 Oct 21:21

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.0...v0.1.1