diff --git a/.gitignore b/.gitignore index d20a120afc..3e585a3f3d 100644 --- a/.gitignore +++ b/.gitignore @@ -172,8 +172,10 @@ docs/superpowers/* # with HERMES_INSTALL_DIR=$HERMES_HOME or by older installers): every root-level # SQLite store (state.db, kanban.db, response_store.db, ...) with its # WAL/SHM/journal sidecars and retired-WAL capture dirs, the legacy transcripts, -# the cron job store (jobs.json) and executions ledger, gateway lock/pid/state -# files, cache/spill directories, and the profile's own config/credential/ +# the cron job store (jobs.json), its lock/heartbeat/output files and all three +# cron SQLite stores (executions/deliveries/notepad, WAL-mode like the root +# ones), gateway lock/pid/state files and per-launch markers, cache/spill +# directories, and the profile's own config/credential/ # memory/profile/pairing roots, the pre-update backups (the very copies a # swept state.db is restored from) and the secret vault are Hermes-managed # runtime state, never code changes. (`*-snapshots/` above already covers state-snapshots/.) @@ -189,13 +191,26 @@ docs/superpowers/* /gateway/discord_message_recovery.db* /sessions/ /browser-profile/ -/cron/executions.db* +/cron/*.db +/cron/*.db-wal +/cron/*.db-shm +/cron/*.db-journal +/cron/*.db.retired-wal-*/ /cron/jobs.json +/cron/.jobs.lock +/cron/ticker_heartbeat +/cron/output/ /cron.pid /gateway.lock /gateway.pid /gateway_state.json +/gateway-starts.log /processes.json +/.update_check +/.clean_shutdown +/active_profile +/.hermes_history +/slack_tokens.json /hook_outputs/ /hooks/ /cache/ diff --git a/tests/hermes_cli/test_update_flat_install_state_gitignore.py b/tests/hermes_cli/test_update_flat_install_state_gitignore.py index 8c6183beb5..188626545d 100644 --- a/tests/hermes_cli/test_update_flat_install_state_gitignore.py +++ b/tests/hermes_cli/test_update_flat_install_state_gitignore.py @@ -38,12 +38,24 @@ FLAT_INSTALL_RUNTIME_STATE = ( "cron/executions.db", "cron/executions.db-wal", "cron/executions.db-shm", + "cron/deliveries.db", + "cron/deliveries.db-wal", + "cron/notepad.db", "cron/jobs.json", + "cron/.jobs.lock", + "cron/ticker_heartbeat", + "cron/output/job1/2026-09-14T06-00-00.md", "cron.pid", "gateway.lock", "gateway.pid", "gateway_state.json", "processes.json", + "gateway-starts.log", + ".update_check", + ".clean_shutdown", + "active_profile", + ".hermes_history", + "slack_tokens.json", "hook_outputs/2026-09-14_06-00-00/tool.json", "hooks/on_session_end.sh", "cache/banner_snapshot.json", diff --git a/website/docs/getting-started/updating.md b/website/docs/getting-started/updating.md index 8543137cc8..645b623652 100644 --- a/website/docs/getting-started/updating.md +++ b/website/docs/getting-started/updating.md @@ -89,7 +89,7 @@ When the parked branch has **uncommitted changes** (dirty tree), Hermes does **n When you run `hermes update` in a terminal, Hermes stashes any uncommitted source-tree changes, pulls, then **asks** whether to restore them — exactly as it always has. Nothing changes for interactive updates. -The autostash only ever covers *source-tree* changes. On a **flat install** — where the git checkout root is also `$HERMES_HOME` (for example an install made with `HERMES_INSTALL_DIR=$HERMES_HOME`, or one created by an older installer) — the profile's runtime state (`state.db` and its WAL/SHM sidecars, `state-snapshots/`, `backups/`, `sessions/`, `cron/jobs.json`, `cron/executions.db`, `config.yaml`, `auth.json`, `memories/`, lock/pid files, …) lives inside the checkout as untracked files. Those paths are git-ignored, so the autostash never touches them and the running gateway keeps its database through the update. If you keep other untracked files in a flat install's root, move them out of the checkout or add them to `.git/info/exclude`; anything untracked and not ignored is swept into the autostash like a source edit. +The autostash only ever covers *source-tree* changes. On a **flat install** — where the git checkout root is also `$HERMES_HOME` (for example an install made with `HERMES_INSTALL_DIR=$HERMES_HOME`, or one created by an older installer) — the profile's runtime state (`state.db` and its WAL/SHM sidecars, `state-snapshots/`, `backups/`, `sessions/`, `cron/jobs.json`, the `cron/*.db` stores, `config.yaml`, `auth.json`, `memories/`, lock/pid files, …) lives inside the checkout as untracked files. Those paths are git-ignored, so the autostash never touches them and the running gateway keeps its database through the update. If you keep other untracked files in a flat install's root, move them out of the checkout or add them to `.git/info/exclude`; anything untracked and not ignored is swept into the autostash like a source edit. When the update runs **without a terminal** — from the desktop/chat app's "Update" button or a gateway-triggered update — there's no prompt to answer. The `updates.non_interactive_local_changes` setting decides what happens to your stashed changes: