Skip to content

ugudlado/shell

Repository files navigation

Modern Dotfiles

Cross-platform dotfile management using GNU Stow with Claude Code integration.

Quick Start

git clone <your-repo-url> ~/code/shell
cd ~/code/shell

# Optional — set git user info (will prompt if not set)
export GIT_USER_NAME="Your Name"
export GIT_USER_EMAIL="your.email@example.com"

make setup

Restart your shell after setup completes.

How It Works

This repo uses two strategies for managing config:

Strategy What How
GNU Stow Shell configs, git, ccstatusline src/home/ → symlinked into $HOME
Direct symlinks Claude Code config src/claude/ → symlinked into ~/.claude/

Stow handles standard dotfiles (src/home/ maps 1:1 to $HOME). Claude Code config is managed separately because ~/.claude/ contains runtime data that shouldn't be version-controlled.

Project Structure

.
├── Makefile                # Management commands
├── setup.sh                # Installation orchestrator
├── agent.yaml              # GitAgent-style manifest (documentation)
├── AGENTS.md               # Cursor / agent fallback instructions
├── RULES.md                # Hard constraints (GitAgent)
├── SOUL.md                 # Identity / tone (GitAgent)
├── DUTIES.md               # Scope boundaries (GitAgent)
├── skills/                 # GitAgent skills slot (see README inside)
├── tools/                  # Optional MCP registry examples + README
├── .cursor/
│   └── rules/              # Cursor project rules (.mdc)
├── scripts/
│   ├── setup-common.sh     # Shared functions (install/configure Claude Code + Cursor skills & rules)
│   ├── setup-macos.sh      # macOS installer
│   └── setup-linux.sh      # Linux installer
├── src/
│   ├── home/               # Stow package → $HOME
│   │   ├── .zshrc
│   │   ├── .bashrc
│   │   ├── .gitconfig
│   │   └── .config/
│   │       └── ccstatusline/settings.json
│   ├── claude/             # Claude Code config → ~/.claude/ (direct symlinks)
│   │   ├── CLAUDE.md       # Global instructions
│   │   ├── RTK.md          # Rust Token Killer config
│   │   ├── settings.json   # Hooks, plugins, permissions
│   │   ├── agents/         # Subagent definitions
│   │   ├── commands/       # Slash commands
│   │   ├── hooks/          # Event hooks
│   │   ├── skills/         # User-level skills (TDD, debugging, etc.)
│   │   ├── templates/      # Spec/task templates
│   │   └── config/         # Notification states, etc.
│   ├── .vscode/            # VS Code settings
│   └── installers/         # Platform packages (Brewfile)
└── spec/               # Spec workflow definitions

Make Commands

make help        # Show all commands
make setup       # Complete initial setup
make deploy      # Backup conflicts + stow in one step
make stow        # Apply dotfile symlinks (excludes Claude Code)
make restow      # Re-apply symlinks
make dry-run     # Preview stow changes
make diff        # Show repo vs home differences
make doctor      # Check system health and CLI tools

Cursor + GitAgent (this repo)

This repository uses a GitAgent-style layout at the repo root for tools that read AGENTS.md (Cursor, etc.):

Path Role
AGENTS.md Repo-level agent instructions for Cursor
RULES.md / SOUL.md / DUTIES.md Split constraints, tone, and scope
agent.yaml Manifest pointer (not read natively by editors)
.cursor/rules/*.mdc Always-on / scoped Cursor rules
skills/README.md Notes; canonical skills live in src/claude/skills/
tools/ Optional MCP registry example + scripts/generate-mcp-config.sh stub

Dual source: Claude Code still uses src/claude/CLAUDE.md~/.claude/CLAUDE.md. That file is not auto-linked from AGENTS.md; keep policies in sync manually when they should match.

Cursor user rules (~/.cursor/rules)

configure_cursor() also symlinks files from .cursor/rules/*.md and *.mdc into ~/.cursor/rules/, using the same basename when it already starts with dotfiles-, otherwise prefixing dotfiles- (so you can tell dotfiles-owned rules apart from hand-made ones).

On current Cursor builds, Agent (chat) often loads rules from that directory in addition to Cursor Settings → Rules, Commands. After make setup, open Settings → Rules and confirm your symlinked rules show up; if they do not, paste the same content into User Rules or use a Remote rule from this repo — Cursor’s storage model has shifted across versions.

Note: Rules under ~/.cursor/rules apply across workspaces; project .cursor/rules in other repos still apply when those folders are open.

Claude Code Setup

make setup runs Claude Code install/configure and Cursor skill symlinks:

  1. install_claude_code() — verifies the claude binary and creates a ~/.local/bin/claude symlink
  2. configure_claude_code() — creates symlinks from src/claude/ into ~/.claude/ and pre-caches ccstatusline
  3. configure_cursor() — symlinks src/claude/skills/*~/.cursor/skills-cursor/, and .cursor/rules/*.md(c)~/.cursor/rules/ (user-wide rules; see note below)

What Gets Symlinked

Source Target Type
src/claude/CLAUDE.md ~/.claude/CLAUDE.md File
src/claude/RTK.md ~/.claude/RTK.md File
src/claude/settings.json ~/.claude/settings.json File
src/claude/hookify.*.local.md ~/.claude/hookify.*.local.md Files
src/claude/agents/ ~/.claude/agents/ Directory
src/claude/hooks/ ~/.claude/hooks/ Directory
src/claude/skills/ ~/.claude/skills/ Directory
src/claude/skills/* ~/.cursor/skills-cursor/* Per-skill dir (via configure_cursor())
.cursor/rules/*.md(c) ~/.cursor/rules/* User-wide rule symlinks (dotfiles- prefix unless name already starts with dotfiles-)
src/claude/templates/ ~/.claude/templates/ Directory
src/claude/config/ ~/.claude/config/ Directory

Hooks

Event Hook Purpose
PreToolUse (Bash) bash-safety-guard.sh, spec-adherence-check.sh, rtk-rewrite.sh Safety + RTK token savings
PreToolUse (Write|Edit) worktree-boundary.sh, protected-files.sh Boundary enforcement
PostToolUse (Write|Edit) auto-format.sh Prettier + typecheck
Notification smart-notify.sh macOS notifications
Stop loop-detector.sh Loop detection
SubagentStart subagent-task-context.sh Context injection
SubagentStop subagent-gate.sh Output validation
SessionEnd session-reflect.sh Post-session reflection

Commands

Command Purpose
/specify <description> Create Spec change + worktree + Linear ticket
/implement <feature-id> Execute tasks with auto-commit per phase
/complete-feature <feature-id> Archive + merge to main + cleanup
/continue-feature <feature-id> Load Spec context into session
/commit-group Create commits in logical groups
/release-prep Prepare release with changelog and git tag
/diagnose Analyze error patterns
/reflect Review session mistakes and extract learnings
/diagram Generate visual diagrams via draw.io
/telemetry Show session telemetry and workflow health
/opsx:propose /opsx:apply /opsx:archive /opsx:explore Spec workflow

Statusline

ccstatusline provides a two-line status bar:

  • Line 1: Model | Context bar | Reset timer | Session usage | Output style
  • Line 2: CWD | Git branch | Git changes

Widget config: src/home/.config/ccstatusline/settings.json (stowed to ~/.config/ccstatusline/)

Development Tools

Installed via Brewfile (src/installers/mac/Brewfile):

  • Shell: zsh + oh-my-zsh + starship prompt
  • Editor: VS Code with project-based extensions
  • CLI: eza, bat, ripgrep, fd, fzf, zoxide, jq, glow, fx
  • Git: git-delta for diffs
  • AI: Claude Code CLI, Claude Desktop

Troubleshooting

Run make doctor to check system health. See TROUBLESHOOTING.md for common issues.

Resources

About

shell setup for new dev system

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors