Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Commands

CommandDescription
tome initInteractive wizard to configure directories
tome syncReconcile, discover, consolidate, distribute, and clean up skills
tome add <url|slug>Register a git skill repository in tome.toml
tome remove dir <name>Remove a directory entry (manifest entries transition to Unowned per LIB-04)
tome remove skill <name>Delete an Unowned skill from the library (manifest + library + distribution + lockfile + machine.toml cleanup)
tome reassign <skill> --to <directory>Reassign a skill to a different directory (accepts Owned + Unowned input per UNOWN-01)
tome fork <skill> --to <local-directory>Fork a managed skill to a local directory for customization
tome migrate-libraryConvert a v0.9-shape library (managed skills as symlinks) to v0.10 real-directory copies (idempotent on re-run)
tome statusShow library, directories, last-sync, and health summary
tome list (alias: ls)List all discovered skills with their directories (supports --json)
tome browseInteractively browse discovered skills with fuzzy search
tome doctorDiagnose and repair broken symlinks or config issues
tome lintValidate skill frontmatter and report issues
tome configShow current configuration
tome backupGit-backed backup and restore for the skill library
tome ejectRemove tome’s symlinks from all distribution directories (reversible via tome sync)
tome relocate <path>Move the skill library to a new location
tome completions <shell>Install shell completions (bash, zsh, fish, powershell)
tome versionPrint version information

Global Flags

FlagShortDescription
--config <path>Path to config file (default: ~/.tome/tome.toml)
--tome-home <path>Override tome home directory (default: ~/.tome/, or TOME_HOME env var)
--machine <path>Path to machine preferences file (default: ~/.config/tome/machine.toml)
--dry-runPreview changes without modifying filesystem
--no-inputDisable all interactive prompts (implies --no-triage for sync)
--verbose-vDetailed output
--quiet-qSuppress non-error output (conflicts with --verbose)

Command Details

tome sync

Runs the full pipeline: discover skills from configured directories, consolidate into the library, diff the lockfile to surface changes, distribute to targets, and clean up stale entries. When new or changed skills are detected, an interactive triage prompt lets you disable unwanted skills. Generates a tome.lock lockfile for reproducible snapshots.

FlagShortDescription
--force-fRecreate all symlinks even if they appear up-to-date
--no-triageSkip interactive triage of new/changed skills (for CI/scripts)

tome add

Register a git skill repository in tome.toml. Accepts either a full git URL (https://github.com/owner/repo, git@github.com:owner/repo.git) or a bare GitHub slug (owner/repo), which is expanded to https://github.com/owner/repo (v0.8.2+). The clone is shallow and lives in ~/.tome/repos/<sha256>/.

URL forms

tome add https://github.com/user/skills           # full HTTPS URL
tome add user/skills                              # bare slug → github.com
tome add git@github.com:user/skills.git           # SSH URL
tome add user/skills/tree/main/skills             # /tree/<ref>/<subdir> shortcut (v0.13+)
tome add user/skills --subdir skills              # explicit --subdir flag (v0.13+)

The /tree/<ref>/<subdir> URL form mimics how GitHub renders navigation into a subdirectory in your browser — copy-paste from github.com/owner/repo/tree/main/skills and it just works. Extracted <ref> becomes the default branch; <subdir> becomes the discovery subdirectory. Explicit --branch / --subdir flags override URL-embedded values (with a warning).

Auto-detection of common subdirs (v0.13+)

If tome sync finds zero skills at a directory’s root AND no subdir is configured, it probes common Claude Code plugin layouts (skills/, .claude-plugin/skills/) and emits a subdir = "..." hint if any candidate has skills inside. Catches the “I added a Claude plugin repo and got zero skills” case without forcing the user to know the convention up front.

Flags

FlagDescription
URLGit repository URL or owner/repo slug (optionally with /tree/<ref>/<subdir> suffix)
--name <name>Custom directory name (default: extracted from URL)
--branch <branch>Track a specific branch (overrides URL-embedded /tree/<ref>/...)
--tag <tag>Pin to a specific tag
--rev <sha>Pin to a specific commit SHA
--subdir <path>Restrict discovery to <clone>/<path>/*/SKILL.md (v0.13+, overrides URL-embedded subdir)
--role <role>Override the type-default role (v0.14+). Validated against valid_roles() for the chosen type.

--branch, --tag, --rev are mutually exclusive.

Choosing the right role (v0.14+)

The role field decides what tome does with a configured directory:

RoleBehavior
managedRead-only upstream (package manager owns content). Discovery only.
syncedBoth discovery AND distribution — skills found here are pulled into the library, and distribution symlinks are also written back into this dir.
sourceDiscovery only. tome reads but never writes here.
targetDistribution only. tome writes symlinks here but doesn’t scan for skills.

The defaults bite if you don’t know them. When you omit --role, the directory’s role falls back to its type default:

  • claude-pluginsmanaged
  • directorysynced
  • gitsource

The directory → synced default is the one that surprises people. If you tome add a local directory owned by a package manager (e.g. ~/.pfw/skills/), the synced default writes ~170 distribution symlinks INTO that source directory — polluting it with content tome propagated from other configured directories. Use --role source or --role managed for read-only package manager directories to keep them clean.

# WRONG (default role = synced; tome writes BACK into ~/.pfw/skills/)
tome add ~/.pfw/skills

# OK — discovery only, no write-back, but library entries get
# `managed: false` (treated as a generic local source).
tome add ~/.pfw/skills --role source

# BEST (v0.15+) — Managed semantic: library entries get `managed: true`,
# so reconcile + foreign-symlink protection recognize this as an
# external-package-manager-owned source.
tome add ~/.pfw/skills --role managed

source vs managed for flat-directory package managers (v0.15+)

Both refuse to write back into the source dir, so either keeps ~/.pfw/skills/ clean. The differences are subtle but material if you care about upstream-update semantics down the line:

Aspectsourcemanaged
tome writes to the source dirNeverNever
Manifest managed: bool flagfalse (local skill)true (package-manager-owned)
Future reconcile / MarketplaceAdapter integrationNot eligibleEligible (when adapters are added per upstream)
Foreign-symlink protection treats source path as legitimate-originNot yetNot yet (separate follow-up)
Semantic accuracy for pfw / npm / etc.“It’s just a local source”“It’s owned by a specific package manager”

For today’s needs (just propagating pfw skills to your other tools), both work equivalently. For longer-term integration with pfw’s own update lifecycle, prefer managed.

The success message now echoes the resolved role so you see what you got:

✓ Added directory 'pfw' (git: https://..., role: source)
  → Source (skills discovered here, not distributed here)

tome remove

Split into two subcommands since v0.10 (Phase 14, D-API-2):

tome remove dir <name>

Remove a configured directory entry from tome.toml. Manifest entries owned by that directory transition to Unowned (per LIB-04) — library content is preserved on disk; only the source_name linkage is cleared. Aggregates partial-cleanup failures and exits non-zero with a ⚠ N operations failed summary if any cleanup step fails. For git directories, the cached clone in ~/.tome/repos/<sha256>/ is removed.

FlagDescription
NAMEDirectory name to remove (as shown in tome status)
--yes / -ySkip confirmation prompt

tome remove skill <name>

Delete an Unowned skill from the library entirely — clears the manifest entry, removes the library directory, removes downstream distribution symlinks, removes the lockfile entry, and removes any machine.toml memberships. Refuses to operate on Owned skills with a hint to run tome remove dir first (per D-B2).

FlagDescription
NAMESkill name to delete
--yes / -ySkip confirmation prompt (default: no)

tome reassign

Reassign a skill to a different directory — useful when the same skill appears under multiple sources and you want to pin which directory owns it. Accepts both Owned skills (re-anchor between configured directories) and Unowned skills (re-anchor a previously-stranded skill back to a configured directory, per UNOWN-01 / D-API-1).

FlagDescription
SKILLSkill name to reassign
--to <directory>Target directory name (required)
--forceOverwrite if the target already has a different-content skill of the same name (per D-A1)

tome fork

Fork a managed (read-only) skill into a local directory so it can be edited. The local copy supersedes the managed one in the library.

FlagDescription
SKILLSkill name to fork
--to <local-directory>Target local directory name (required)
--yesSkip confirmation prompt

tome migrate-library

One-shot migration: convert a v0.9-shape library (where managed skills lived as symlinks pointing into the package manager’s cache) to the v0.10 library-canonical model (real-directory copies). Run once after upgrading from v0.9.x; idempotent on re-run.

Shows a plan summary (skill count + per-skill disk estimate via walkdir + metadata().len()) before any conversion, then prompts for confirmation. Broken symlinks are preserved in place per Phase 11 D-04.

FlagDescription
--yes / -ySkip the confirmation prompt (bypasses the UX-02 confirm gate)
--dry-runRender the plan; make no filesystem changes

tome list

FlagDescription
--jsonOutput as JSON

tome browse

Full-screen interactive skill browser using fuzzy search. Supports sorting, grouping by source, and per-skill actions (view source, copy path, disable/enable).

tome doctor

Diagnose library state. When run interactively (no --no-input, no --dry-run), surfaces issues and offers per-category repair prompts.

Orphan-directory repair (v0.14+)

When tome doctor finds a directory in the library that has no matching manifest entry (an “orphan”), it offers four choices per orphan:

  • claim — Register the orphan in the manifest as an Unowned skill (v0.14+). Hashes the directory, writes a SkillEntry::new_unowned, and the entry distributes to your target / synced directories on the next tome sync. This is the proper fix when the orphan represents a real skill you want to keep (e.g., a directory you copied in by hand, or one whose source was removed but you want to preserve it).
  • keep — Leave the directory on disk; tome sync will re-register it IF it discovers the orphan from a configured source. Useful when you know the orphan’s source got temporarily disconnected and will come back. Note: for library-canonical orphans with no upstream source, this option is a no-op until you claim it or add a source that covers it.
  • delete — Remove the directory from disk permanently.
  • skip — Leave the orphan as-is; doctor will surface it again on the next run.

Broken-frontmatter skills (v0.16+)

tome doctor walks every manifest-tracked skill and parses its SKILL.md frontmatter. Failures surface as Library Warnings — for example:

! 'my-skill' has unparsable SKILL.md frontmatter: invalid YAML frontmatter
! 'other-skill' has no SKILL.md file

These are not auto-repairable — the user must edit the SKILL.md file (or remove the skill) by hand. Without this check, the failure was only visible as a one-line stderr warning during tome sync; it now persists in the doctor surface so broken skills get triaged. Use tome lint <PATH> for a deeper per-field frontmatter audit.

Real-dir-in-target repair (v0.16+)

If a distribution directory contains a real directory (not a symlink) whose name matches a library skill, tome doctor hash-compares the two:

  • Identical content — Surfaces as an auto-fixable Warning (real directory in target matches library content (should be a symlink)). The auto-repair pass deletes the real directory and replaces it with a symlink into the library. Typical cause: skills copied into the target dir manually before adopting tome, or by hand after the fact.
  • Diverging content — Surfaces as a no-repair Warning (real directory in target diverges from library content — reconcile manually). The user must decide whether to overwrite the local edits, fold them back into the library, or remove the target copy.
  • No matching library skill — Left alone; tome does not own un-paired directories in target dirs.

tome lint

FlagDescription
PATHSpecific skill directory to lint (default: entire library)
--format text|jsonOutput format (default: text)

Validates SKILL.md frontmatter: missing/mismatched names, description length, non-standard fields, Unicode tag codepoints. Exits with code 1 on errors (CI-friendly).

tome config

FlagDescription
--pathPrint config file path only

tome backup

Git-backed backup and restore. Subcommands:

SubcommandDescription
tome backup initInitialize git repo in the library for backup tracking
tome backup snapshot [-m MSG]Create a snapshot of the current library state
tome backup list [-n COUNT]Show backup history (default: 10 entries)
tome backup restore [REF]Restore library to a previous snapshot (default: HEAD~1)
tome backup diff [REF]Show changes since last backup (default: HEAD)

tome eject

Removes all of tome’s symlinks from distribution directories. Reversible — run tome sync to recreate them.

tome relocate

Moves the skill library to a new path, updating symlinks in all distribution directories. Detects cross-filesystem moves and warns when target symlinks need to be re-anchored.

tome completions

FlagDescription
SHELLShell to install for: bash, zsh, fish, powershell
--printPrint completions to stdout instead of installing