hermes-agent/hermes_cli/subcommands
ethernet 694bd9ab2e feat(update): install manifest, release channels, and eject
.hermes-install.json marks a checkout as source-managed or
desktop-bundled and records its update channel. A missing file means
source mode on the main channel, so no existing install changes.

`hermes update` reads the manifest:
- On a bundled install it refuses and points at the in-app updater.
- On the stable channel it fast-forwards the checkout to the newest
  final release tag (vX.Y.Z, three-digit major cap so legacy CalVer
  tags never match) instead of origin/main. The ZIP fallback resolves
  the tag through the GitHub API because that path runs when git file
  I/O is broken.
- `update.channel` in config.yaml overrides the channel for source
  installs. "auto" defers to the manifest.

`hermes update --eject` is the exit from desktop management. On a
bundled install it downloads Hermes Setup and launches it pinned to
the exact commit the bundle was built from; the installer creates a
normal source checkout at ~/.hermes/hermes-agent. Hermes Setup accepts
the new `--pin-commit <sha>` argument for this flow. On a
source-managed install, --eject with --channel only switches the
channel. The "ejected" manageStyle is the permanent opt-out that stops
future auto-adoption.
2026-08-10 02:34:50 -04:00
..
__init__.py
…
_shared.py
…
acp.py
…
approvals.py
…
auth.py
…
backup.py
…
claw.py
…
config.py
…
console.py
…
cron.py
…
dashboard.py
…
debug.py
…
doctor.py
…
dump.py
…
gateway.py
…
gui.py
…
hooks.py
…
import_agent.py
…
import_cmd.py
…
insights.py
…
login.py
…
logout.py
…
logs.py
…
mcp.py
…
memory.py
…
model.py
…
monitoring.py
…
pairing.py
…
pause.py
…
plugins.py
…
profile.py
…
prompt_size.py
…
security.py
…
setup.py
…
skills.py
…
skin.py
…
slack.py
…
status.py
…
sync.py
…
tools.py
…
uninstall.py
…
update.py
…
verify.py
…
version.py
…
webhook.py
…
whatsapp.py
…