Install
The CLI is a single Node binary. From a clean shell to a paired device emitting signed attestations takes about thirty seconds.
## requirements
- Node 20+ — the agent uses native
fetchwithAbortSignal, available since 18 but stable since 20. - git on
$PATH— every project the agent touches must be a real git working tree. - OS keychain — Keychain Access (macOS),
libsecret(Linux), or Credential Manager (Windows via WSL). Required for storing the GitHub token and Ed25519 key. - For the daemon:
launchctlon macOS, orsystemd --useron Linux. Both ship by default on supported systems.
## install
npm i -g commitly-agent
commitly-agent --helpIf commitly-agent --help prints a list of commands, you're good. If it prints command not found, your npm global bin directory isn't on $PATH; add it and re-source your shell.
## first login
This pairs the machine. The browser handles OAuth; the CLI mints an Ed25519 keypair, stores the private half in your OS keychain, and registers the public half with the dashboard so future attestations from this machine are verifiable.
$ commitly-agent login → Open this URL in your browser to log in: https://commitly.dev/auth/cli?session=8f3a… Waiting for authentication (times out in 5 minutes)... ✓ Authenticated. Credentials stored in OS keychain. ✓ Device paired. This machine can now emit signed timestamp attestations.
## verify
Run status against any git repo to confirm the agent can talk to the dashboard with the credentials it just stored.
$ commitly-agent status No daemon is currently running.
That's the expected output before you start a daemon. You're ready to pick a mode — read the command reference to see all eleven, or jump to Daemon mode for unattended operation.
## upgrade
npm i -g commitly-agent@latest
commitly-agent stop && commitly-agent start <projectPath>Stop and restart the daemon after each upgrade so the new binary path is baked into the unit file.
## uninstall
commitly-agent stop
commitly-agent logout
npm uninstall -g commitly-agent
rm -rf ~/.commitlyThat removes the daemon, the credentials, the binary, and the local spool. To delete the device record server-side as well, revoke it from the dashboard's Devices page.