All checks were successful
Reindex Knowledge Base / reindex (push) Successful in 3s
Adds title, description, type, domain, and tags frontmatter to every doc for improved KB semantic search. The description field is prepended to every search chunk, and domain/type/tags enable filtered queries. Type values: context, guide, runbook, reference, troubleshooting Domain values match directory structure (networking, docker, etc.) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
122 lines
5.2 KiB
Markdown
122 lines
5.2 KiB
Markdown
---
|
|
title: "Workstation Configuration"
|
|
description: "Workstation dotfiles management via symlinks, fish shell setup with custom functions and tmux helpers, systemd user timers, and Claude Code integration overview."
|
|
type: context
|
|
domain: workstation
|
|
tags: [dotfiles, fish, starship, tmux, symlink, systemd, claude-code, workstation]
|
|
---
|
|
|
|
# Workstation Configuration
|
|
|
|
## Dotfiles Repository
|
|
|
|
- **Repo**: `cal/dotfiles` (private) on `git.manticorum.com`
|
|
- **Local path**: `~/dotfiles/`
|
|
- **Strategy**: Symlink — configs live in the repo, symlinked to their expected system paths
|
|
|
|
### What's tracked
|
|
|
|
| Category | Repo path | System path |
|
|
|----------|-----------|-------------|
|
|
| Fish shell | `fish/config.fish` | `~/.config/fish/config.fish` |
|
|
| Starship prompt | `starship.toml` | `~/.config/starship.toml` |
|
|
| Git config | `git/.gitconfig` | `~/.gitconfig` |
|
|
| Git global ignore | `git/ignore` | `~/.config/git/ignore` |
|
|
| SSH config | `ssh/config` | `~/.ssh/config` |
|
|
| Bash | `shell/.bashrc`, `shell/.bash_profile` | `~/.bashrc`, `~/.bash_profile` |
|
|
| Zsh | `shell/.zshrc`, `shell/.zshenv` | `~/.zshrc`, `~/.zshenv` |
|
|
| MangoHud | `mangohud/MangoHud.conf` | `~/.config/MangoHud/MangoHud.conf` |
|
|
| Zed editor | `zed/settings.json` | `~/.config/zed/settings.json` |
|
|
| Restic excludes | `restic/excludes.txt` | `~/.config/restic/excludes.txt` |
|
|
| VS Code | `vscode/settings.json`, `vscode/keybindings.json` | `~/.config/Code/User/` |
|
|
| Tmux | `tmux/.tmux.conf` | `~/.tmux.conf` |
|
|
|
|
### Secrets handling
|
|
|
|
API keys and tokens are **never** committed. Shell configs source secrets from separate untracked files:
|
|
- Bash: `~/.bash_secrets` (chmod 600)
|
|
- Zsh: `~/.zsh_secrets`
|
|
|
|
### Install / Uninstall
|
|
|
|
```bash
|
|
cd ~/dotfiles
|
|
./install.sh # Backs up originals to ~/.dotfiles-backup/, creates symlinks
|
|
./uninstall.sh # Replaces symlinks with standalone copies
|
|
```
|
|
|
|
Both scripts are idempotent.
|
|
|
|
### Adding a new config
|
|
|
|
1. Copy the file into the appropriate directory in `~/dotfiles/`
|
|
2. Add the mapping to the `LINKS` associative array in both `install.sh` and `uninstall.sh`
|
|
3. Run `./install.sh` to replace the original with a symlink
|
|
4. Commit and push
|
|
|
|
### Shell setup
|
|
|
|
Cal migrated from zsh to **fish + starship** (Feb 2026). Bash and zsh configs are retained for compatibility but fish is the primary interactive shell.
|
|
|
|
## Fish Functions & Aliases
|
|
|
|
Custom fish functions live in `~/dotfiles/fish/functions/` and are symlinked into `~/.config/fish/functions/`. Completions in `~/dotfiles/fish/completions/` → `~/.config/fish/completions/`.
|
|
|
|
### Config file (`~/.config/fish/config.fish`)
|
|
|
|
Abbreviations defined in `config.fish` (loaded interactively):
|
|
- `yolo` → `claude --dangerously-skip-permissions`
|
|
- `cddev` → `cd /mnt/NV2/Development`
|
|
|
|
### Tmux helpers
|
|
|
|
| Function | Usage | What it does |
|
|
|----------|-------|-------------|
|
|
| `tls` | `tls` | List tmux sessions (friendly "no sessions" message if none) |
|
|
| `tma` | `tma [name]` | Smart attach — auto-attaches if 1 session, lists if multiple, attaches to named session. Has tab completions for session names. |
|
|
| `tmn` | `tmn [name]` | Create new named session (defaults to current directory name) |
|
|
| `cc` | `cc [name]` | Launch Claude Code in a tmux session (named after directory). If already in tmux, creates/switches to a detached session. |
|
|
|
|
### Adding a new fish function
|
|
|
|
1. Create the function file in `~/dotfiles/fish/functions/`
|
|
2. Symlink it: `ln -s ~/dotfiles/fish/functions/myfunc.fish ~/.config/fish/functions/myfunc.fish`
|
|
3. Optionally add completions in `~/dotfiles/fish/completions/`
|
|
4. Commit and push the dotfiles repo
|
|
|
|
## Systemd User Timers
|
|
|
|
Timers running under `systemctl --user` on the workstation. Not tracked in dotfiles — managed by their respective projects.
|
|
|
|
### Cognitive Memory Maintenance
|
|
Source: `/mnt/NV2/Development/cognitive-memory/systemd/`
|
|
|
|
| Timer | Schedule | Purpose |
|
|
|-------|----------|---------|
|
|
| `cognitive-memory-embed.timer` | Hourly | Refresh embeddings (skips if unchanged) |
|
|
| `cognitive-memory-daily.timer` | Daily midnight | Decay scores + regenerate CORE.md + git sync |
|
|
| `cognitive-memory-weekly.timer` | Sun 02:00 | Reflect on recent memories |
|
|
|
|
### Claude Scheduled Tasks
|
|
Config: `~/.config/claude-scheduled/` | Skill: `~/.claude/skills/create-scheduled-task/SKILL.md`
|
|
|
|
| Timer | Schedule | Purpose |
|
|
|-------|----------|---------|
|
|
| `claude-scheduled@backlog-triage.timer` | Weekdays 09:15 | Triage open Gitea issues, prioritize, suggest focus |
|
|
|
|
Uses `claude-scheduled@.service` template unit. Add new tasks by creating a directory under `~/.config/claude-scheduled/tasks/` and a corresponding timer. See the skill for full instructions.
|
|
|
|
## Claude Code
|
|
|
|
See [claude-code-config.md](claude-code-config.md) for full details on config file locations, MCP server setup, hooks, and permissions.
|
|
|
|
Key files:
|
|
- `~/.claude.json` — MCP servers (cognitive-memory, n8n-mcp, gitea-mcp, tui-driver, kb-search)
|
|
- `~/.claude/settings.json` — permissions, hooks, env vars, plugins
|
|
- `~/.claude/skills/` — custom skill definitions
|
|
- `~/.claude/hooks/` — hook scripts (format-code.sh, notify-subagent-done.sh)
|
|
|
|
## Backups
|
|
|
|
Original files are backed up by `install.sh` to `~/.dotfiles-backup/<timestamp>/` before being replaced with symlinks. Multiple runs create separate timestamped backup dirs. Old backups can be cleaned up manually.
|