Workspace Configuration
SkillAI & modelsConfigures workspaces for agent-assisted development. Manages agent skills (untracked symlinks), workspace tool permissions (allow/deny/ask rules for Claude Code and Antigravity), git hook profiles, and .envrc configurations. Use when configuring a workspace, discovering or installing skills, setting tool permissions, managing git hooks, or updating .envrc configuration blocks.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Workspace Configuration skill
What this skill tells your AI
The instructions your AI receives, as published by ithinkihaveacat/dotfiles in skills/workspace-config/SKILL.md and read by ahel’s review.
This skill configures a workspace for agent-assisted development without version control ever seeing the configuration. It consists of three tools:
hook: The git hook manager. Synchronizes git hooks to matchAGENT_REQUIRED_HOOKS(profilesagent,node,gerrit), managing them via trampoline stubs in.git/hooks/.skill: The workspace manager. Installs and tracks skills as untracked symlinks, automatically adapting to the environment (Git, Perforce, or unmanaged directories; more via plugins). Also provides advisory LLM-based skill recommendations (skill suggest) and manages remote plugin caching.permission: The permission manager. Maintains allow/deny/ask rules for every detected local agent (workspace-local for Claude Code, user-wide for Antigravity), including pre-approving the safe commands declared by installed skills.
For Git repositories, hook apply, skill apply, and permission apply run
automatically on git clone via the global template's post-checkout hook.
Managing Skills (skill)
The skill tool (symlinked in bin/) manages agent skills as untracked
symlinks in your workspace. It automatically detects your environment and
applies the correct tracking and ignoring mechanism.
skill <command> [arguments]
Supported Environments
- Git Repositories: Links skills under
.agents/skills/and.claude/skills/. A marker block in.git/info/excludeis dynamically generated to keepgit statusclean without dirtying the shared.gitignore. If another tool rewrites the exclude file,skill doctordetects the drift, and runningskill applyresolves it. - Unmanaged Directories: Works in plain directories without VCS, symlinking skills under local destination folders.
- Plugins: Additional workspace types can be registered by dropping a Python
file into
~/.config/skill/plugins/that definesregister(api)and callsapi.register_workspace(cls)with a subclass ofapi.Workspace(see alsoapi.FileStateMixin) implementing adetect()classmethod. Plugin detectors run before the built-in ones, in sorted filename order.
Commands
apply: Synchronize workspace symlinks to matchAGENT_REQUIRED_SKILLS(local-only, fast, and deterministic).bundle [SPEC...]: Package skills into an archive (.zip,.tar.gz) or directory without installing them (-w/--workspacefor workspace skills).suggest: Print recommendations without installing them (implements advisory LLM skill recommendations).add SPEC...: Add a skill (a local path or a plugin-provided catalog entry).remove NAME...(alias:rm): Remove a managed skill.list [--json]: List skills currently managed in this workspace.update SPEC...: Re-fetch a plugin-provided catalog entry (--allfor all,--catalogfor the catalog index).clean: Remove all managed skills and clear tracking records.doctor: Diagnose mismatch between desired and on-disk skills (read-only). Shares a unified reconciliation planner withapplyto audit symlinks, exclusions, and catalog specs, and warns whenAGENT_REQUIRED_SKILLSlooks stale relative to.envrc(fix:direnv reload).catalog: List all plugin-provided skills and their sources.resolve NAME: Print the source path a skill name would resolve to.
Environment
Variable names follow a two-tier rule: AGENT_* variables are policy a
human sets (what agents should do in this workspace); SKILL_* variables are
plumbing for this tool (how it finds and links things, rarely touched).
AGENT_REQUIRED_SKILLS: Space-separated skill names this workspace requires; prefix a name with-or!to exclude a globally required skill. Managed per-workspace viaenvrc add skills/envrc remove skills(.envrc).AGENT_PREFLIGHT_SKIP: When set,skill preflightpasses without checking — bypass the agent launch gate once withAGENT_PREFLIGHT_SKIP=1 claude. (The legacy spelling_agent_preflight_skipis still honored.)SKILL_SOURCE_DIRS: Optional colon-separated environment variable override searched for skills by name (by default, local skills are discovered automatically from standard workspace and configuration directories via the05_local.pyplugin).SKILL_DEST_DIRS: Colon-separated link destinations relative to the workspace root (default:.claude/skills:.agents/skills).SKILL_CACHE_DIR: This tool's cache directory for remote skills and catalog metadata (default:${XDG_CACHE_HOME:-$HOME/.cache}/skill).SKILL_OFFLINE/AGENT_OFFLINE: Set to1to serve remote skills from that cache instead of fetching them — what a CI job or a network-denied agent sandbox needs, sopreflightdoes not gate an agent launch on GitHub being reachable. A skill that has never been fetched is a clear error rather than a silent omission. Per-tool variable wins; see local workspace caching guidelines.
For the underlying model — what apply touches, the invariants doctor audits,
and the one place doctor and preflight deliberately differ — see
The workspace-config model.
Managing Git Hooks (hook)
The hook tool (symlinked in bin/) manages Git hooks in your repository as
lightweight trampolines pointing into source scripts under etc/git/hooks/,
allowing hook updates in the dotfiles repository to propagate instantly to all
configured workspaces.
hook <command> [arguments]
Profiles
agent: Re-wraps commit message body text, bullet lists, and blockquotes to fit 72 characters, strips dropped trailers (Co-Authored-By:,TAG=,CONV=), and enforces Conventional Commits formatting rules (commit-msg).markdown: Verifies that staged Markdown files are formatted according tomarkdown-formatin--checkmode, rejecting commits if formatting errors are found (pre-commit).node: Formats staged TypeScript and Markdown files via Prettier prior to committing (pre-commit).gerrit: Downloads and installs the GerritChange-Idcommit-msg hook (commit-msg).
Commands
apply: Synchronize.git/hooks/to matchAGENT_REQUIRED_HOOKS(default:agent).add PROFILE...: Install one or more hook profiles in the current repository.remove PROFILE...(alias:rm): Remove managed hook profiles.list(alias:ls): List currently installed hook profiles in this repository.catalog: List all available hook profiles and their descriptions.doctor: Audit.git/hooks/for missing, drifted, or unmanaged hooks (read-only).clean: Remove all managed hooks and restore legacy/original hooks.
Environment Variables
AGENT_REQUIRED_HOOKS: Space-separated hook profile names required by this workspace (default:agent).
Managing Workspace Permissions (permission)
The permission tool (symlinked in bin/) manages agent tool permissions.
Rules are written as clean command patterns (e.g. "git show"); each agent
backend translates them to its native syntax and scope:
claude(Claude Code):Bash(pattern:*)rules in the workspace's.claude/settings.local.json(workspace-local personal settings; the tool ensures the file is git-ignored). Claude Code picks these up without a restart.agy(Antigravity CLI):command(...)rules in~/.gemini/antigravity-cli/settings.json(user-wide configuration; Antigravity CLI evaluates permissions from global settings).
By default every command operates on all detected agents; use --agent NAME to
scope to one.
permission <command> [arguments] [options]
Commands
add PATTERN...: Add rule patterns to the allowlist (--denyfor the denylist,--askfor the always-prompt list).add -reads one pattern per line from stdin.remove PATTERN...(alias:rm): Remove patterns from all lists.list(alias:ls): List rules per agent, as clean patterns.apply: Pre-approve the safe commands declared by this workspace's installed skills (idempotent; see below).clean: Clear all permission rules for detected agents.doctor: Report rules thatapplywould add but that are missing (read-only; exits non-zero on problems).
Safe-Command Declarations (permissions/unsafe)
permission apply walks the workspace's installed skills (via
skill list --json) and pre-approves every executable in each skill's
scripts/ directory, except entries listed in that skill's optional
permissions/unsafe file (one pattern per line, # comments):
- A bare script name (e.g.
adb-settings-theme) is never pre-approved; the command prompts normally. - A
script subcommandline (e.g.packagename uninstall) keeps the blanket allow for the script but guards that subcommand with anaskrule.
New scripts added to a skill are therefore pre-approved by default; only the
exceptions need maintaining. The permission tool's own mutating subcommands
(add, remove, clean) are declared unsafe so an agent can never edit its
own allowlist unprompted.
Plugins
Extra workspace-root markers (beyond .git, .hg, .svn) can be registered by
dropping a Python file into ~/.config/permission/plugins/ that defines
register(api) and calls api.register_root_marker(".marker").
See the Command Index for full help details.
Managing .envrc (envrc)
The envrc tool (symlinked in bin/) is the single write path for .envrc
files: it manages marker-delimited configuration blocks so multiple
configurations co-exist safely and other tools never edit .envrc directly.
create <type> [args...]/delete <type>/show <type>: Create, delete, or print a typed block (node,ruby,uv,firebase,appengine,skills, or a rawblock NAMEwhose content is read from stdin).add skills NAME.../remove skills NAME.../list [skills]: Edit the workspace's required-skills declaration item-by-item (see Managing Skills (skill)).set VAR VALUE/unset VAR/get VAR: Manage individual environment variables in a managedenvblock. Values are written single-quoted, so they are always literal data — shell syntax is never evaluated when direnv loads the file — andgetreads the file statically without executing any shell.
Because envrc create block writes arbitrary stdin content that direnv later
executes, it is declared unsafe (see permissions/unsafe) and always prompts.
See the Command Index for full help details.
Usage Examples
Default Discovery & Apply (Recommended for new workspaces)
Analyze the current directory, install the required hooks and skills, and pre-approve their safe commands:
hook apply
skill apply
permission apply
Targeted Discovery (With Context)
If you have a specific task or hit a roadblock, ask for recommendations based on your situation:
skill suggest --context "Goal: Implement a Wear OS tile in Kotlin. Emulator keeps crashing with OAuth errors."
Bundling Skills for Portability
Package skills into a self-contained zip file or directory without installing:
skill bundle coding-standards personal-network -o skills.zip
skill bundle --workspace -o /tmp/project-skills/
Manually Adding a Skill
Add a specific skill from the catalog or a local path:
skill add coding-standards
skill add /path/to/custom-skill
An ad-hoc skill add is pruned by the next skill apply unless the skill is
also declared in AGENT_REQUIRED_SKILLS. To persist it, record it in the
workspace's .envrc (the envrc command manages the declaration):
envrc add skills coding-standards
Managing Permissions by Hand
permission add "git show" "git log" # allow on every detected agent
permission add --deny "rm -rf" # block outright
permission add --ask "adb-tile-add" --agent claude
permission list
Health Checks
skill doctor # symlink/exclude drift (read-only)
permission doctor # missing pre-approvals (read-only)
skill apply # synchronize and repair the workspace configuration
Cleaning Up
Remove all installed skills and permission rules, restoring the workspace to its original state:
skill clean
permission clean
Reference Material
- Command Index — Detailed synopsis, options,
and examples for
hook,skill,permission, andenvrc. - Workspace Config Model — Architecture, state invariants, directory layouts, and doctor/preflight auditing models.
Signals
- GitHub stars
- 48
- Forks
- 10
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
workspace-config- Source
- github.com/ithinkihaveacat/dotfiles