Problem or Use Case
Currently hermes update output is too terse — it hides critical information behind aggregate counts:
→ Syncing bundled skills...
~ 2 user-modified (kept)
✓ Skills are up to date
→ Syncing bundled skills to other profiles...
default: ~1 user-modified
Config version: 22 → 23
As a user, I can't tell:
-
Which skills changed — only counts are shown (+3 new, ↑2 updated, ~2 user-modified), not names. I have to manually diff manifests to find which skills were affected.
-
Whether to follow upstream for user-modified skills — when the bundled version has improvements but my local copy is "kept", I'm never asked whether I want to discard my changes to get upstream updates. The current behavior silently skips forever.
-
What config changed — when Config version: 22 → 23 appears, I get zero information about what was added, removed, or changed. I have to read the source code (hermes_cli/config.py: migrate_config) to understand the migration.
This matters more with multiple profiles — each profile may have different user-modified skills, and the single-line default: ~1 user-modified aggregates away the per-profile details.
Proposed Solution
Three improvements to hermes update output:
1. Show skill names, not just counts
→ Syncing bundled skills...
+ 3 new: skill-a, skill-b, skill-c
↑ 2 updated: github-pr-workflow, systematic-debugging
~ 2 user-modified (kept): hermes-agent, debugging-hermes-tui-commands
The names should be shown by default — there are rarely more than a handful per category. If a category has >10 items, truncate with …and N more.
2. Offer to discard local changes for user-modified skills (with "no" as default)
After showing user-modified skills:
~ 2 user-modified (kept): hermes-agent, debugging-hermes-tui-commands
Some of these skills have upstream updates. Review changes?
[1] Keep all (default)
[2] Show what changed for each skill
[3] Reset specific skills to bundled versions
[4] Reset all to bundled versions
Default (Enter / timeout) = keep all (current behavior). This should be interactive only when running in a terminal; in non-interactive mode, silently keep (as now).
3. Config version migration changelog
When config version increases, show what the migration did:
Config version: 22 → 23
+ curator (new section: enabled, interval_hours, stale_after_days, archive_after_days)
+ auxiliary.curator (new aux task slot: provider, model, base_url, timeout)
+ logs/curator/ (new directory for curator logs)
The migrate_config() function already collects results["config_added"] and results["env_added"] — this data should be surfaced to the user during update, not discarded. Each entry should show:
- Added: new keys/sections with their key names
- Changed: enum value changes or default value changes for existing keys
- Removed: keys that were deprecated
Per-profile display
Profile sync output should be consistent with the main profile output:
→ Syncing bundled skills to other profiles...
default: +0 new, ↑0 updated, ~1 user-modified (hermes-agent)
other-profile: +2 new (skill-x, skill-y)
Alternatives Considered
-
hermes update --verbose flag — add a flag to show names. Rejected because the current output is already too sparse; showing names is basic UX, not extra verbosity. A quiet mode (--quiet) could suppress names for scripting.
-
Separate hermes skills diff command — punt the problem to a separate command. Rejected because the relevant information exists at update time; forcing users to run two commands adds friction.
-
Config changelog as a separate doc — publish a changelog file. Rejected because the migration code already has the information; duplicating it in a manual doc adds maintenance burden and drift risk.
Feature Type
CLI improvement
Scope
Medium (few files, < 300 lines) — primarily hermes_cli/main.py (update output formatting) and tools/skills_sync.py (return structured data for display).
Additional Context
Related existing issues:
Problem or Use Case
Currently
hermes updateoutput is too terse — it hides critical information behind aggregate counts:As a user, I can't tell:
Which skills changed — only counts are shown (
+3 new,↑2 updated,~2 user-modified), not names. I have to manually diff manifests to find which skills were affected.Whether to follow upstream for user-modified skills — when the bundled version has improvements but my local copy is "kept", I'm never asked whether I want to discard my changes to get upstream updates. The current behavior silently skips forever.
What config changed — when
Config version: 22 → 23appears, I get zero information about what was added, removed, or changed. I have to read the source code (hermes_cli/config.py: migrate_config) to understand the migration.This matters more with multiple profiles — each profile may have different user-modified skills, and the single-line
default: ~1 user-modifiedaggregates away the per-profile details.Proposed Solution
Three improvements to
hermes updateoutput:1. Show skill names, not just counts
The names should be shown by default — there are rarely more than a handful per category. If a category has >10 items, truncate with
…and N more.2. Offer to discard local changes for user-modified skills (with "no" as default)
After showing user-modified skills:
Default (Enter / timeout) = keep all (current behavior). This should be interactive only when running in a terminal; in non-interactive mode, silently keep (as now).
3. Config version migration changelog
When config version increases, show what the migration did:
The
migrate_config()function already collectsresults["config_added"]andresults["env_added"]— this data should be surfaced to the user during update, not discarded. Each entry should show:Per-profile display
Profile sync output should be consistent with the main profile output:
Alternatives Considered
hermes update --verboseflag — add a flag to show names. Rejected because the current output is already too sparse; showing names is basic UX, not extra verbosity. A quiet mode (--quiet) could suppress names for scripting.Separate
hermes skills diffcommand — punt the problem to a separate command. Rejected because the relevant information exists at update time; forcing users to run two commands adds friction.Config changelog as a separate doc — publish a changelog file. Rejected because the migration code already has the information; duplicating it in a manual doc adds maintenance burden and drift risk.
Feature Type
CLI improvement
Scope
Medium (few files, < 300 lines) — primarily
hermes_cli/main.py(update output formatting) andtools/skills_sync.py(return structured data for display).Additional Context
Related existing issues:
hermes updateskips bundled skill sync for the active profile #16176 — "hermes update skips bundled skill sync for the active profile" (separate bug)