Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
600cbb7
feat
ADGEfficiency Apr 16, 2026
90c320b
feat
ADGEfficiency Apr 16, 2026
7af759c
feat
ADGEfficiency Apr 16, 2026
9ecac60
feat
ADGEfficiency Apr 19, 2026
5fab642
feat
ADGEfficiency Apr 25, 2026
0ca9ea0
feat
ADGEfficiency Apr 25, 2026
09cb87d
feat
ADGEfficiency Apr 25, 2026
4c32702
feat
ADGEfficiency May 1, 2026
d451cd5
feat
ADGEfficiency May 1, 2026
a82ca12
feat
ADGEfficiency May 1, 2026
6bf8690
feat
ADGEfficiency May 1, 2026
701671e
feat
ADGEfficiency May 2, 2026
ab1729c
feat
ADGEfficiency May 2, 2026
e379489
feat
ADGEfficiency May 2, 2026
efa7e21
feat
ADGEfficiency May 2, 2026
a287f8d
feat
ADGEfficiency May 9, 2026
d846bd3
feat
ADGEfficiency May 9, 2026
6fa25ae
feat
ADGEfficiency May 12, 2026
6d78d51
feat
ADGEfficiency May 12, 2026
690010d
feat
ADGEfficiency May 13, 2026
48dca41
feat
ADGEfficiency May 13, 2026
db9d566
feat
ADGEfficiency May 14, 2026
cad1d6c
feat
ADGEfficiency May 20, 2026
e5046fb
feat
ADGEfficiency May 30, 2026
91665d8
feat
ADGEfficiency May 30, 2026
0d14777
feat
ADGEfficiency May 30, 2026
d246e5e
feat
ADGEfficiency May 30, 2026
aa55e3f
feat
ADGEfficiency May 30, 2026
912994b
feat
ADGEfficiency May 30, 2026
d184324
feat
ADGEfficiency May 30, 2026
88ec855
feat
ADGEfficiency May 30, 2026
ca830ee
feat
ADGEfficiency May 30, 2026
927e65a
feat
ADGEfficiency May 30, 2026
a6d20ce
feat
ADGEfficiency May 30, 2026
38309aa
Potential fix for pull request finding
ADGEfficiency May 30, 2026
9023245
feat
ADGEfficiency May 30, 2026
d8a7f49
Merge branch 'air-2026-04-17' of github.com:ADGEfficiency/dotfiles in…
ADGEfficiency May 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ temp.*
temp
config/pi/auth.json
config/pi/sessions/
config/pi/npm
42 changes: 25 additions & 17 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,23 @@ default:
.PHONY: setup-common setup-macos setup-ubuntu setup-wsl

setup-common:
bash ./tmux/setup.sh
bash ./zsh/setup.sh
bash ./fzf/setup.sh
bash ./config/tmux/setup.sh
bash ./config/fzf/setup.sh
bash ./scripts/setup-zsh.sh
bash ./scripts/setup-pi.sh
bash ./scripts/setup-extras.sh
Comment on lines 6 to 11

setup-macos: export OS=macos
setup-macos: brew-pkgs dotfiles setup-common setup-python
bash ./macos/setup.sh
bash ./os/macos/setup.sh

setup-ubuntu: export OS=ubuntu
setup-ubuntu: brew-pkgs dotfiles setup-common
bash ./ubuntu/setup.sh
bash ./os/ubuntu/setup.sh

setup-wsl: export OS=wsl
setup-wsl: dotfiles setup-common
bash ./os/wsl/setup.sh

.PHONY: setup-stow dotfiles setup-uv setup-python

Expand All @@ -30,21 +31,28 @@ setup-stow:
dotfiles: setup-stow
stow "$(STOW_ARGS)" -d dotfiles -t "$(HOME)" "$(OS)"
stow "$(STOW_ARGS)" dotfiles
stow "$(STOW_ARGS)" yabai
stow "$(STOW_ARGS)" skhd
ln -sf ~/dotfiles/fish ~/.config/fish

# ai agent config
Comment on lines +34 to +35
mkdir -p "$(HOME)/.agents"
ln -sfn ~/dotfiles/agents/skills "$(HOME)/.agents/skills"
mkdir -p "$(HOME)/.claude"
ln -sfn ~/dotfiles/agents/skills "$(HOME)/.claude/skills"
ln -sf ~/dotfiles/config/pi/agent/AGENTS.md "$(HOME)/.claude/CLAUDE.md"

setup-uv:
bash ./python/setup-uv.sh

setup-python: setup-uv
cd ~ && ~/.local/bin/uv venv --python 3.11.9
~/.local/bin/uv pip install -r ./python/pyproject.toml
ln -sf ~/dotfiles/config/pi/AGENTS.md "$(HOME)/.claude/CLAUDE.md"
# PI coding agent is not configured via symlink - uses PI_CODING_AGENT_DIR

mkdir -p ~/.config
# explicit opt-in to the symlink from config into ~/.config
ln -sfn ~/dotfiles/config/fish ~/.config/fish
ln -sfn ~/dotfiles/config/nvim ~/.config/nvim
ln -sfn ~/dotfiles/config/lazygit ~/.config/lazygit
ln -sfn ~/dotfiles/config/direnv ~/.config/direnv
ln -sfn ~/dotfiles/config/mise ~/.config/mise
ln -sfn ~/dotfiles/config/fzf ~/.config/fzf
ln -sfn ~/dotfiles/config/lsd ~/.config/lsd
ln -sfn ~/dotfiles/config/kitty ~/.config/kitty

setup-python:
bash ./scripts/setup-uv.sh

.PHONY: clean-nvim setup-vim

Expand All @@ -67,4 +75,4 @@ setup-brew:
brew update; brew upgrade

brew-pkgs: setup-brew
brew bundle --file ~/dotfiles/brew/Brewfile --no-upgrade
brew bundle --file ~/dotfiles/config/brew/Brewfile --no-upgrade
51 changes: 14 additions & 37 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,19 @@

Setup and configuration for my terminal based developer workflow across three `OS` (MacOS, Ubuntu & WSL):

- **Zsh** for a shell
- **Homebrew** for shell tools
- **Zsh** shell
- **Tmux** for shell session management
- **Homebrew** for managing shell tools
- **mise** for programming language runtimes (except Python)
- **uv** for Python runtime and virtual environments
- **Neovim** for text editing
- **Makefile** for setup & maintenance
- **Stow** for dotfiles symlinking

This repo should be cloned into `$HOME` and set as `$XDG_CONFIG_HOME`. Many tools rely on setting this for the config stored in this repo to work. For other config that requires files in `$HOME` (such as `$HOME/.bashrc`) Stow is used to symlink files.
This repo should be cloned into `$HOME`. Symlinks into the right places are managed in two ways:

Different files are symlinked based on the `OS` `Makefile` variable - usually it's just getting RC files for specific OS, ie `./dotfiles/$OS/.zshrc` becomes `./dotfiles/macos/.zshrc`.
- **Stow** handles files that belong in `$HOME` (e.g. `.zshrc`, `.gitconfig`). OS-specific files live in `./dotfiles/$OS/` (e.g. `./dotfiles/macos/.zshrc`) and common files in `./dotfiles/`.
- **Explicit symlinks** (`ln -sf`) wire up individual `./config/*` directories into `~/.config/` (e.g. `./config/nvim` → `~/.config/nvim`). Only directories that are explicitly opted-in to in the `Makefile` are linked.

## Use

Expand Down Expand Up @@ -97,47 +99,22 @@ mise is used for managing programming language runtime versions (Python, Node.js

### Neovim

Neovim config is in `./nvim`. To use the Neovim setup alone, put the `nvim` folder into `$XDG_CONFIG_HOME`.
Neovim config is in `./config/nvim`. To use the Neovim setup alone, put the `nvim` folder into `$XDG_CONFIG_HOME` (commonly `~/.config`).

I use Lazy for package management in Neovim - it will install packages when you first open the editor.

### Shell Customization
### `s`

The `s` command opens a fuzzy file finder (fzf) to search and open files in `$EDITOR`. Run `s` in any directory, or pass a path like `s ~/projects`. Supports multi-select with Tab.

Lot's of aliases - see `./scripts/aliases.sh`. Some small interactive shell helper functions in `./scripts/funcs.sh`.

### Getting Kitty to Play Nice on macOS

Had weird issue with the first execution of Kitty not loading the `kitty.conf` correctly - fixed with:
### Aliases

```
# ~/Library/LaunchAgents/setenv.XDG_CONFIG_HOME.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>setenv.XDG_CONFIG_HOME</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>launchctl setenv XDG_CONFIG_HOME $HOME/dotfiles</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

$ launchctl load ~/Library/LaunchAgents/setenv.XDG_CONFIG_HOME.plist
```
Lot's of aliases - see `./scripts/aliases.sh`. Some small interactive shell helper functions in `./scripts/funcs.sh`.

## Agent Configuration
## AI Agent Configuration

PI_CODING_AGENT_DIR in dotfiles/common/env.sh points pi's config to ~/dotfiles/config/pi/, which contains agent/AGENTS.md (agent instructions), settings.json, themes, and sessions.
`PI_CODING_AGENT_DIR` in dotfiles/common/env.sh points pi's config to `~/dotfiles/config/pi/`.

CLAUDE.md at the repo root serves the same purpose for Claude Code.
`CLAUDE.md` at the repo root serves the same purpose for Claude Code.

Skills are defined once in agents/skills/ and symlinked by make dotfiles to both ~/.agents/skills (pi) and ~/.claude/skills (Claude Code).
Skills are defined once in `.agents/skills/` and symlinked by `make dotfiles` to both `~/.agents/skills` (for Pi) and `~/.claude/skills` (for Claude Code).
19 changes: 0 additions & 19 deletions agents/skills/summarization/SKILL.md

This file was deleted.

3 changes: 3 additions & 0 deletions brew/Brewfile → config/brew/Brewfile
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ cask "amethyst"
cask "claude-code"
cask "darktable"
cask "dockdoor"
cask "font-fira-code"
cask "font-fira-code-nerd-font"
cask "font-hack-nerd-font"
cask "mactex"
Expand All @@ -113,3 +114,5 @@ brew "markdownlint-cli"
cask "copilot-cli"
brew "git-delta"
cask "keycastr"
brew "marp-cli"
brew "btop"
1 change: 1 addition & 0 deletions config/direnv/direnv
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
1 change: 1 addition & 0 deletions config/fish/fish
1 change: 1 addition & 0 deletions config/fish/nvim
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion kitty/kitty.conf → config/kitty/kitty.conf
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ hide_window_decorations no
map ctrl+enter toggle_fullscreen
open_url_with default
confirm_os_window_close 0
include ~/dotfiles/kitty/current-theme.conf
include ~/dotfiles/config/kitty/current-theme.conf
macos_titlebar_color #282A36
map ctrl+shift+h show_scrollback
File renamed without changes.
File renamed without changes.
File renamed without changes.
2 changes: 2 additions & 0 deletions config/nvim/after/ftplugin/markdown.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
vim.opt_local.foldenable = true
vim.opt_local.foldlevel = 6
File renamed without changes.
58 changes: 58 additions & 0 deletions config/nvim/lazy-lock.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"Vim-Jinja2-Syntax": { "branch": "master", "commit": "2c17843b074b06a835f88587e1023ceff7e2c7d1" },
"barbar.nvim": { "branch": "master", "commit": "a4bef5b4fc1f064f2f673172252028eae18191c9" },
"blink-cmp-copilot": { "branch": "main", "commit": "439cff78780c033aa23cf061d7315314b347e3c1" },
"blink-cmp-dictionary": { "branch": "master", "commit": "17ea03ba5c296310b9f74587b52fde1b04d84c1a" },
"blink-cmp-env": { "branch": "main", "commit": "6b147eca6fa5975d29f5508aff24e9a9acb6a1f5" },
"blink-emoji.nvim": { "branch": "master", "commit": "dff709139ad5389fb55ebab026e75278a12b325a" },
"blink-ripgrep.nvim": { "branch": "main", "commit": "851610e1689a9b3bbba99fbe9242b098e7b5f40f" },
"blink.cmp": { "branch": "main", "commit": "78336bc89ee5365633bcf754d93df01678b5c08f" },
"blink.compat": { "branch": "main", "commit": "2ed6d9a28b07fa6f3bface818470605f8896408c" },
"bullets.vim": { "branch": "master", "commit": "28c22791153a90bb61a86fbeeae0f812e048ade7" },
"codecompanion.nvim": { "branch": "main", "commit": "60d031862715a77b3655eac724e8926965e47b86" },
"conform.nvim": { "branch": "master", "commit": "24c70347f6b2128679f47d2eb765156ef34bf9e0" },
"copilot-lsp": { "branch": "main", "commit": "1b6d8273594643f51bb4c0c1d819bdb21b42159d" },
"copilot.lua": { "branch": "master", "commit": "7b89909d0647c89298de880255b287b01b7e5d34" },
"dbtpal": { "branch": "main", "commit": "981eab51609362712c64e3cf3fb773fe11f859b9" },
"diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" },
"emmet-vim": { "branch": "master", "commit": "92ef2f74f4093edc99db5e9e4cf7e40116a85bd6" },
"gitsigns.nvim": { "branch": "main", "commit": "dd3f588bacbeb041be6facf1742e42097f62165d" },
"indent-blankline.nvim": { "branch": "master", "commit": "d28a3f70721c79e3c5f6693057ae929f3d9c0a03" },
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
"lualine.nvim": { "branch": "master", "commit": "131a558e13f9f28b15cd235557150ccb23f89286" },
"markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" },
"mini.icons": { "branch": "main", "commit": "520995f1d75da0e4cc901ee95080b1ff2bc46b94" },
"mini.nvim": { "branch": "main", "commit": "44657837c7338e52727facc85c1d95bec1f6bd7c" },
"nvim-autopairs": { "branch": "master", "commit": "7b9923abad60b903ece7c52940e1321d39eccc79" },
"nvim-bqf": { "branch": "main", "commit": "c282a62bec6c0621a1ef5132aa3f4c9fc4dcc2c7" },
"nvim-colorizer.lua": { "branch": "master", "commit": "5cfe7fffbd01e17b3c1e14af85d5febdef88bd8c" },
"nvim-lint": { "branch": "master", "commit": "d48f3a76189d03b2239f6df1b2f7e3fa8353743b" },
"nvim-lspconfig": { "branch": "master", "commit": "a4ed4e761c400849e8c9f8bda33e5083f890268c" },
"nvim-treesitter": { "branch": "master", "commit": "cf12346a3414fa1b06af75c79faebe7f76df080a" },
"nvim-treesitter-context": { "branch": "master", "commit": "b311b30818951d01f7b4bf650521b868b3fece16" },
"nvim-treesitter-textobjects": { "branch": "master", "commit": "5ca4aaa6efdcc59be46b95a3e876300cfead05ef" },
"nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" },
"nvim-web-devicons": { "branch": "master", "commit": "0d7d35fa946837b8738b17c18d1faa1ac351e7f9" },
"obsidian.nvim": { "branch": "main", "commit": "ae1f76a75c7ce36866e1d9342a8f6f5b9c2caf9b" },
"oil.nvim": { "branch": "master", "commit": "21c669e7bfeb1546ae988b52813138e4d674bbf5" },
"peek.nvim": { "branch": "master", "commit": "5820d937d5414baea5f586dc2a3d912a74636e5b" },
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
"render-markdown.nvim": { "branch": "main", "commit": "629eb9533ec989d9d5c6cab8f3ad5372422c24e0" },
"telescope-fzf-native.nvim": { "branch": "main", "commit": "b25b749b9db64d375d782094e2b9dce53ad53a40" },
"telescope-git-file-history.nvim": { "branch": "master", "commit": "4442114f9257e682e60a8cb6de14cf988e26055c" },
"telescope-makefile": { "branch": "master", "commit": "f35425d7d53d92a04215c3714a5819811d2842c3" },
"telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" },
"telescope.nvim": { "branch": "master", "commit": "7d324792b7943e4aa16ad007212e6acc6f9fe335" },
"trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" },
"undotree": { "branch": "master", "commit": "6fa6b57cda8459e1e4b2ca34df702f55242f4e4d" },
"vim": { "branch": "master", "commit": "e7b91facff94bdf3a248df9b683119b84672256a" },
"vim-argwrap": { "branch": "master", "commit": "03615d1eed248408567bc8fa6a5a8c94ef3cd170" },
"vim-fugitive": { "branch": "master", "commit": "3b753cf8c6a4dcde6edee8827d464ba9b8c4a6f0" },
"vim-markdown": { "branch": "master", "commit": "1bc9d0cd8e1cc3e901b0a49c2b50a843f1c89397" },
"vim-markdown-toc": { "branch": "master", "commit": "66026b323379c9a712c6169cd43153216acef090" },
"vim-one": { "branch": "master", "commit": "187f5c85b682c1933f8780d4d419c55d26a82e24" },
"vim-python-pep8-indent": { "branch": "master", "commit": "60ba5e11a61618c0344e2db190210145083c91f8" },
"vim-table-mode": { "branch": "master", "commit": "bb025308a45c67c7c8f0763ba37bc2ee3f534df0" },
"winresizer": { "branch": "master", "commit": "299076f7f79e2e2f7706b2dfacbb3c074ce53257" },
"zen-mode.nvim": { "branch": "main", "commit": "8564ce6d29ec7554eb9df578efa882d33b3c23a7" }
}
File renamed without changes.
File renamed without changes.
89 changes: 89 additions & 0 deletions config/nvim/lua/config/codecompanion_spinner.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
local M = {
processing = false,
spinner_index = 1,
namespace_id = nil,
timer = nil,
spinner_symbols = { "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏" },
filetype = "codecompanion",
}

function M:get_buf()
for _, buf in ipairs(vim.api.nvim_list_bufs()) do
if vim.api.nvim_buf_is_valid(buf) and vim.bo[buf].filetype == self.filetype then
return buf
end
end
return nil
end

function M:update_spinner()
if not self.processing then
self:stop_spinner()
return
end

self.spinner_index = (self.spinner_index % #self.spinner_symbols) + 1

local buf = self:get_buf()
if buf == nil then
return
end

vim.api.nvim_buf_clear_namespace(buf, self.namespace_id, 0, -1)

local last_line = vim.api.nvim_buf_line_count(buf) - 1
vim.api.nvim_buf_set_extmark(buf, self.namespace_id, last_line, 0, {
virt_lines = { { { self.spinner_symbols[self.spinner_index] .. " Processing...", "Comment" } } },
virt_lines_above = true,
})
end

function M:start_spinner()
self.processing = true
self.spinner_index = 0

if self.timer then
self.timer:stop()
self.timer:close()
self.timer = nil
end

self.timer = vim.loop.new_timer()
self.timer:start(0, 100, vim.schedule_wrap(function()
self:update_spinner()
end))
end

function M:stop_spinner()
self.processing = false

if self.timer then
self.timer:stop()
self.timer:close()
self.timer = nil
end

local buf = self:get_buf()
if buf ~= nil then
vim.api.nvim_buf_clear_namespace(buf, self.namespace_id, 0, -1)
end
end

function M:init()
self.namespace_id = vim.api.nvim_create_namespace("CodeCompanionSpinner")

local group = vim.api.nvim_create_augroup("CodeCompanionSpinnerHooks", { clear = true })
vim.api.nvim_create_autocmd("User", {
pattern = "CodeCompanionRequest*",
group = group,
callback = function(request)
if request.match == "CodeCompanionRequestStarted" then
self:start_spinner()
elseif request.match == "CodeCompanionRequestFinished" then
self:stop_spinner()
end
end,
})
end

return M
File renamed without changes.
11 changes: 8 additions & 3 deletions nvim/lua/config/keymap.lua → config/nvim/lua/config/keymap.lua
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,6 @@ vim.keymap.set("n", "<leader>t", vim.cmd.UndotreeToggle)
km("n", "<leader>w", ":WinResizerStartResize<cr>", opts)
km("v", "<leader>ll", ":Noice dismiss", opts)

-- Open grepper and search for current word
km("n", "<leader>g", ":Grepper -tool rg -noprompt -cword <CR>", opts)

-- Telescope
-- Search diagnostics
km("n", "<leader>rd", ":lua require'telescope.builtin'.diagnostics(require('telescope.themes').get_ivy({}))<cr>", opts)
Expand All @@ -97,12 +94,20 @@ km(
-- Search for files in cwd
km("n", "<leader>j", ":lua require'telescope.builtin'.find_files(require('telescope.themes').get_ivy({}))<cr>", opts)
--- Search through recent files
km("n", "<leader>'", ":lua require'telescope.builtin'.oldfiles(require('telescope.themes').get_ivy({}))<cr>", opts)
km("n", "<leader>ro", ":lua require'telescope.builtin'.oldfiles(require('telescope.themes').get_ivy({}))<cr>", opts)
km("n", "<leader>rr", ":lua require'telescope.builtin'.oldfiles(require('telescope.themes').get_ivy({}))<cr>", opts)
-- Search for a string
km("n", "<leader>rg", ":lua require'telescope.builtin'.live_grep(require('telescope.themes').get_ivy({}))<cr>", opts)
-- Search for a string under cursor
km("n", "<leader>rc", ":lua require'telescope.builtin'.grep_string(require('telescope.themes').get_ivy({}))<cr>", opts)
-- Search for current word
vim.keymap.set("n", "<leader>g", function()
require("telescope.builtin").grep_string(require("telescope.themes").get_ivy({ hidden = true }))
end, opts)
vim.keymap.set("n", "<leader>.", function()
require("telescope.builtin").grep_string(require("telescope.themes").get_ivy({ hidden = true }))
end, opts)

-- Oil
vim.keymap.set("n", "<leader>o", "<CMD>split | Oil<CR>")
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading
Loading