Skip to content

feat(skills): blank-slate skills — install --no-skills + opt-out/opt-in#36228

Merged
teknium1 merged 3 commits into
mainfrom
feat/install-no-skills
Jun 1, 2026
Merged

feat(skills): blank-slate skills — install --no-skills + opt-out/opt-in#36228
teknium1 merged 3 commits into
mainfrom
feat/install-no-skills

Conversation

@teknium1

@teknium1 teknium1 commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Infographic

Blank slate skills infographic

Summary

Gives the default ~/.hermes profile 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-skills

2. Runtime commands — opt in/out of bundled skills on any existing profile:

hermes skills opt-out            # stop future seeding (touches nothing on disk)
hermes skills opt-out --remove   # also delete UNMODIFIED bundled skills (with confirm)
hermes skills opt-in --sync      # undo: remove marker and re-seed now

Why

hermes profile create <name> --no-skills already gave named profiles a blank slate with a durable opt-out marker. The default profile had no equivalent, and two gaps remained:

  1. No way to do a fresh-install blank slate without creating a named profile.
  2. hermes update kept injecting newly-bundled skills into the default profile every run, with no way to suppress it permanently.

How

  • New --no-skills install 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). This is the key fix: the marker was previously only checked by seed_profile_skills() (named profiles), so the default profile still got re-seeded on every hermes update. Now the installer, hermes update, and any direct sync all respect it.
  • hermes skills opt-out / opt-in toggle the marker at runtime via set_bundled_skills_opt_out().
  • --remove calls remove_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 (--yes to 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 --remove path 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; --remove deletes 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-out keeps all 90 → opt-out --remove deletes 89 pristine and keeps the 1 edited skill → opt-in --sync restores to 90. Install --no-skills writes the marker and a later update-style sync stays empty. bash -n clean on install.sh; both new subcommands parse and render --help.

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.
@github-actions

github-actions Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

🔎 Lint report: feat/install-no-skills vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 9577 on HEAD, 9577 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 4962 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.

@alt-glitch alt-glitch added type/feature New feature or request P3 Low — cosmetic, nice to have tool/skills Skills system (list, view, manage) comp/cli CLI entry point, hermes_cli/, setup wizard labels Jun 1, 2026
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.
@teknium1 teknium1 changed the title feat(install): --no-skills flag for blank-slate default profile feat(skills): blank-slate skills — install --no-skills + opt-out/opt-in Jun 1, 2026
- 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.
@teknium1 teknium1 merged commit 2ed9637 into main Jun 1, 2026
24 checks passed
@teknium1 teknium1 deleted the feat/install-no-skills branch June 1, 2026 09:58
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/cli CLI entry point, hermes_cli/, setup wizard P3 Low — cosmetic, nice to have tool/skills Skills system (list, view, manage) type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants