feat(skills): blank-slate skills — install --no-skills + opt-out/opt-in#36228
Merged
Conversation
Add an install-time --no-skills flag so the default ~/.hermes profile can be created with zero bundled skills, matching what `hermes profile create --no-skills` already does for named profiles. The flag writes $HERMES_HOME/.no-bundled-skills and skips the install-time seed. sync_skills() now honors that marker with an early return (skipped_opt_out=True), so neither the installer, a later `hermes update`, nor a direct sync re-injects bundled skills into a profile that opted out. Previously the marker was only checked by seed_profile_skills() (named profiles); the default profile had no opt-out and `hermes update` would re-seed it every time. Tests: TestNoBundledSkillsOptOut covers marker-present (no-op) and marker-absent (normal seed) paths.
Contributor
🔎 Lint report:
|
Adds an interactive counterpart to the install-time --no-skills flag so an already-installed profile (default or named) can toggle the .no-bundled-skills marker without reinstalling. - `hermes skills opt-out` writes the marker (stop future seeding). Safe by default: nothing on disk is touched. - `hermes skills opt-out --remove` ALSO deletes already-present bundled skills, but ONLY ones that are manifest-tracked AND byte-identical to their origin hash. User-edited bundled skills, hub-installed skills, and hand-written skills are never removed. Previews + confirms before deleting (--yes to skip). - `hermes skills opt-in [--sync]` removes the marker and optionally re-seeds immediately. Core logic lives in tools/skills_sync.py (set_bundled_skills_opt_out, is_bundled_skills_opt_out, remove_pristine_bundled_skills) reusing the existing manifest origin-hash machinery for the safety check. Tests: TestOptOutToggleAndRemove covers marker toggle idempotency and proves user-modified + non-bundled skills survive --remove.
- features/skills.md: new 'Starting with a blank slate' section covering the install flag, profile-create flag, and runtime opt-out/opt-in, with a safe-by-default note. - reference/cli-commands.md: document the new skills opt-out / opt-in subcommands + examples. - reference/profile-commands.md: fix the marker filename (was .no-skills, actually .no-bundled-skills) and cross-link the runtime commands. Validated with a full docusaurus build (exit 0); the three edited pages compile clean with no new warnings.
JoeKowal
pushed a commit
to JoeKowal/hermes-agent
that referenced
this pull request
Jun 4, 2026
…in (NousResearch#36228) * feat(install): --no-skills flag for blank-slate default profile Add an install-time --no-skills flag so the default ~/.hermes profile can be created with zero bundled skills, matching what `hermes profile create --no-skills` already does for named profiles. The flag writes $HERMES_HOME/.no-bundled-skills and skips the install-time seed. sync_skills() now honors that marker with an early return (skipped_opt_out=True), so neither the installer, a later `hermes update`, nor a direct sync re-injects bundled skills into a profile that opted out. Previously the marker was only checked by seed_profile_skills() (named profiles); the default profile had no opt-out and `hermes update` would re-seed it every time. Tests: TestNoBundledSkillsOptOut covers marker-present (no-op) and marker-absent (normal seed) paths. * feat(skills): hermes skills opt-out / opt-in for existing profiles Adds an interactive counterpart to the install-time --no-skills flag so an already-installed profile (default or named) can toggle the .no-bundled-skills marker without reinstalling. - `hermes skills opt-out` writes the marker (stop future seeding). Safe by default: nothing on disk is touched. - `hermes skills opt-out --remove` ALSO deletes already-present bundled skills, but ONLY ones that are manifest-tracked AND byte-identical to their origin hash. User-edited bundled skills, hub-installed skills, and hand-written skills are never removed. Previews + confirms before deleting (--yes to skip). - `hermes skills opt-in [--sync]` removes the marker and optionally re-seeds immediately. Core logic lives in tools/skills_sync.py (set_bundled_skills_opt_out, is_bundled_skills_opt_out, remove_pristine_bundled_skills) reusing the existing manifest origin-hash machinery for the safety check. Tests: TestOptOutToggleAndRemove covers marker toggle idempotency and proves user-modified + non-bundled skills survive --remove. * docs: blank-slate skills — install --no-skills + opt-out/opt-in - features/skills.md: new 'Starting with a blank slate' section covering the install flag, profile-create flag, and runtime opt-out/opt-in, with a safe-by-default note. - reference/cli-commands.md: document the new skills opt-out / opt-in subcommands + examples. - reference/profile-commands.md: fix the marker filename (was .no-skills, actually .no-bundled-skills) and cross-link the runtime commands. Validated with a full docusaurus build (exit 0); the three edited pages compile clean with no new warnings.
1 task
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Infographic
Summary
Gives the default
~/.hermesprofile the same blank-slate opt-out that named profiles already had, and adds an interactive way to toggle it on an already-installed profile — no reinstall needed.Two parts:
1. Install-time flag — start empty from the curl install:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --no-skills2. Runtime commands — opt in/out of bundled skills on any existing profile:
Why
hermes profile create <name> --no-skillsalready gave named profiles a blank slate with a durable opt-out marker. The default profile had no equivalent, and two gaps remained:hermes updatekept injecting newly-bundled skills into the default profile every run, with no way to suppress it permanently.How
--no-skillsinstall flag writes$HERMES_HOME/.no-bundled-skillsand skips the install-time seed.sync_skills()now honors that marker with an early return (skipped_opt_out=True). This is the key fix: the marker was previously only checked byseed_profile_skills()(named profiles), so the default profile still got re-seeded on everyhermes update. Now the installer,hermes update, and any direct sync all respect it.hermes skills opt-out/opt-intoggle the marker at runtime viaset_bundled_skills_opt_out().--removecallsremove_pristine_bundled_skills(), which deletes a bundled skill only when it is manifest-tracked AND byte-identical to its recorded origin hash. User-edited bundled skills, hub-installed skills, and hand-written skills are never touched — they're reported as kept. Previews the list and confirms before deleting (--yesto skip).Net result: opting out means no bundled skills ever — not at install, not on update — until you opt back in. Removal is explicit, reversible, and never destroys your own work.
Safety
The destructive
--removepath is gated three ways: skill must be in the manifest (genuinely bundled), still present in the bundled source (hash-comparable), and unmodified vs origin hash. Anything else is skipped. Verified live (below).Tests
tests/tools/test_skills_sync.py(55 pass):TestNoBundledSkillsOptOut— marker present → no-op; absent → normal seed.TestOptOutToggleAndRemove— marker toggle idempotency;--removedeletes pristine bundled skills while a user-modified bundled skill AND a hand-written local skill both survive.Verified end-to-end against a temp
HERMES_HOME: seed 90 →opt-outkeeps all 90 →opt-out --removedeletes 89 pristine and keeps the 1 edited skill →opt-in --syncrestores to 90. Install--no-skillswrites the marker and a later update-style sync stays empty.bash -nclean oninstall.sh; both new subcommands parse and render--help.