plugins/claude-code-hermit/skills/relogin/SKILL.md
Renew the hermit's long-lived Claude login token over the channel, before it expires. Relays a one-time sign-in link to the operator, takes the code back, installs the new token, and restarts. Activates on messages like 'relogin', 'renew my login', 'reauth', 'the login is expiring', or when doctor's credential-expiry check flags setup-token.
npx skillsauth add gtapps/claude-code-hermit reloginInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Renews this hermit's setup-token credential without anyone touching the box. The operator opens a link, signs in, sends back a code; you install the token and restart.
Use this when doctor warns that setup-token is expiring, or the operator asks to renew. If the hermit is already dead from an expired token, this skill is not the path — the watchdog runs the same flow deterministically without a model (setup-token-mint.ts relay), because a dead hermit can't run a skill.
Never run /logout. Renewal never needs it. Retiring the old .credentials.json is fine — the install does it for you (see Notes) — but /logout also resets first-launch state, after which the interactive wizard demands a login and refuses the env token. That reset is the hazard, not the credential removal.
bun ${CLAUDE_PLUGIN_ROOT}/scripts/setup-token-mint.ts status
token_mode: false → this hermit isn't on token auth. Tell the operator renewal is manual here (hermit-docker setup-token converts it), and stop.in_progress non-null → a renewal is already running. Don't start a second one.expires_at in plain language and continue.bun ${CLAUDE_PLUGIN_ROOT}/scripts/setup-token-mint.ts start
bun ${CLAUDE_PLUGIN_ROOT}/scripts/setup-token-mint.ts await-url
Send the operator the url from the second command, in your own voice — one line, the link, and what you need back. Something like: "Time to renew your Claude sign-in. Open this and send me the code it gives you: <url>".
If a maintainer_channel_id is configured for the active channel (channels.<platform>.maintainer_channel_id in config.json), send that message via the maintainer channel instead of the client chat, so the sign-in link never reaches an end-user's chat. Pipe the text on stdin:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/channel-send.ts .claude-code-hermit --tier maintainer -
The operator still pastes the code back through the primary chat (Step 2 is unchanged). When no maintainer channel is configured, keep the current in-chat/terminal path above; that remains the documented owner-recipient contract.
The link is one-time and short-lived. Don't mint it before the operator is ready to use it.
When the operator replies with the code:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/setup-token-mint.ts submit-code "<code>"
bun ${CLAUDE_PLUGIN_ROOT}/scripts/setup-token-mint.ts await-token-and-install
The install prints {ok, expires_at} and nothing else — the token itself never reaches you, by design. It goes from the mint pane straight into a 0600 file on the config volume.
If either step fails, run abort, tell the operator plainly that nothing changed, and offer to try again.
The new token only takes effect when the claude process restarts — and that restart kills the session running this skill. So:
<expires_at>, and I'll ask you then."bun ${CLAUDE_PLUGIN_ROOT}/scripts/setup-token-mint.ts finish
It fires the restart detached and returns immediately. Anything you write after it will never run — send the message first, every time.
/login credential (.credentials.json → .credentials.json.pre-token.bak). Interactive sessions prefer a stored login over the env token, so an unparked file would 401 the hermit once its old access token lapsed. The rename is restorable; nothing is deleted.state/setup-token.json — the CLI exposes no expiry surface for these tokens, so that record is the only source of truth. Doctor's credential-expiry check reads it and warns 14 days out..env, so nothing on the host has to be recreated.tools
Composes and delivers the daily fitness brief — a forward-looking morning read (readiness + today's plan) or a backward-looking evening read (today's training, or an earned-rest note, + tomorrow's setup) — in the operator's configured voice. Invoke with /claude-code-fitness-hermit:fitness-brief --morning|--evening|--slot <name>. Becomes the plugin's two daily beats — the morning Strava connectivity check and the evening activity sync, RPE binding, and Run deep-dive.
development
Synthesizes the past 7 days of archived briefs into a weekly digest — top stories, emerging vs faded themes, category activity, and per-source performance built from archive frontmatter. Delivers to the operator's configured channel and archives a weekly note. Designed as a weekly routine. Invoke with /feed-hermit:weekly-digest.
development
Manage developing story arcs tracked across briefs — add, resolve, and list active arcs in compiled/story-arcs-*.md. Arc Watch keywords drive the feed-brief arc-tagging enrichment. Invoke with /feed-hermit:story-arcs add|resolve|list.
development
Gap-driven discovery of new RSS/web sources for feed-sources.md. Interactive runs WebFetch-verify candidates and auto-add them; --scheduled runs queue unverified candidates for operator review (no WebFetch, per the domain-allowlist rule). Complements source-health (removal) with discovery (addition). Invoke with /feed-hermit:source-scout.