Compare commits

...

20 Commits

Author SHA1 Message Date
57b686cab5 feat: add atuin shell history integration for Fish
Initialize atuin in Fish shell for synced fuzzy history search with CTRL+R.
2025-11-25 15:22:32 -06:00
8f9565d0e0 feat: add Cursor Linux settings and expand Claude Code permissions
- Add comprehensive Cursor settings for Linux platform
- Expand Claude Code allowed bash commands (control flow, tooling)
- Enable KiTTy command finish notification suppression
- Add JVM languages plugin to Claude Code workflows
- Set default model to Sonnet in Claude settings
2025-11-25 15:08:42 -06:00
075810965a feat: add SDKMAN integration and improve mise/tool configuration
- Add SDKMAN initialization to bashrc for Java SDK management
- Create Fish shell wrapper function for SDKMAN commands
- Switch from lazy-loading to automatic mise activation in Fish
- Clean up fish_plugins comments for clarity
- Add pnpm to mise tool-versions
- Enable Shift+Enter in Kitty for Claude Code multi-line prompts
- Make update_pre.ts hook executable
2025-11-24 00:25:02 -06:00
Ryan Walters
262da2f114 fix: use portable file timestamp comparison in fish brew cache check
Replace fish's `-nt` test operator (not available in fish) with explicit stat-based timestamp comparison for cross-shell compatibility.
2025-11-07 11:35:10 -06:00
26f332e1a4 fix: KiTTy not using MesloLGS nerd font 2025-11-07 11:30:15 -06:00
1c87ddfa96 chore: use custom atuin self host, disable enter to accept, disable up arrow keybind in zshrc init 2025-11-07 11:30:06 -06:00
05257607d3 feat: use micro as preferred ssh editor, add Atuin PATH amendment line 2025-11-07 11:29:50 -06:00
8a5c83bdf7 feat: add atuin.sh config 2025-11-07 11:29:41 -06:00
Ryan Walters
3c1ebfe086 refactor: reorganize Claude settings for better readability
Restructure claude-settings.json by moving permissions (allow/deny/ask) before enabledPlugins section for improved logical grouping and readability.
2025-11-06 09:50:26 -06:00
Ryan Walters
4d20cbbacd docs: improve template system documentation with context parameter clarification
- Distinguish between regular templates and partials for variable access
- Document how partials receive context via explicit parameters
- Add examples for both template types with correct syntax
- Templatize global CLAUDE.md for platform-specific shell environment sections
- Add conditional rendering for Windows, WSL, and Linux environments
2025-11-04 11:35:53 -06:00
Ryan Walters
1e55b4862f feat: add Claude settings symlink management
- Add claude-settings.json as source file in chezmoi repo
- Create symlink template for .claude/settings.json
- Update .chezmoiignore to prevent recursion
- Update TODO.md to track Claude configuration progress
2025-11-03 17:04:49 -06:00
Ryan Walters
e5279d9388 feat: add global Claude configuration and update Cursor settings
- Add global CLAUDE.md with comprehensive AI assistant guidelines
- Fix Cursor terminal Shift+Enter keybinding to send escape sequence
- Remove duplicate dark color theme preference in Cursor settings
2025-11-03 16:19:21 -06:00
Ryan Walters
9fb2c304f3 feat: add Windows Terminal helper function across all shells
Add `wt` function to launch Windows Terminal with WSL in current directory across Bash, Fish, Nushell, and PowerShell. The function supports passing additional arguments while maintaining the current working directory context.
2025-11-01 11:08:32 -05:00
Ryan Walters
f4a4800af0 feat: add Cursor and Zed editor CLI integration for WSL
Add PATH configuration for Cursor IDE and Zed editor Windows installations, making their CLI tools accessible from WSL environments. Both editors are now available via command line when installed in their default Windows locations.
2025-10-31 21:49:20 -05:00
Ryan Walters
625cf3c3ae fix: correct WSL detection and improve platform-specific configuration
- Set WSL detection to false by default for proper conditional evaluation
- Add delta as diff pager for improved git diff output
- Change Windows cd command from nu to powershell.exe with -NoLogo flag
- Refactor .chezmoiignore to use clearer platform-specific sections
- Fix WSL-only files to be properly excluded on non-WSL systems
- Separate Linux/Unix and Windows file exclusions for better clarity
- Remove zsh profile from Cursor settings (migrated to Fish shell)
2025-10-27 20:01:56 -05:00
Ryan Walters
751efbc719 feat: add IDE and lazygit configuration management with cross-platform symlinks
Adds comprehensive IDE configuration tracking with platform-specific symlink templates for VS Code, Cursor, and lazygit. Windows configurations stored in AppData paths, Linux configs in .config directories, with conditional templating based on OS detection.
2025-10-27 16:44:18 -05:00
Ryan Walters
f8f0e0e615 perf: optimize shell startup with batched PATH operations and Homebrew caching
- Batch Fish PATH additions into single operation (reduces startup by ~13ms)
- Cache Homebrew shellenv output for 7 days (reduces startup by ~14ms)
- Update CLAUDE.md with TODO list update workflow guidelines
- Change default chezmoi cd shell from bash to fish
- Remove redundant bun completion sourcing in bash

Performance improvements measured through shell startup profiling.
2025-10-27 15:51:07 -05:00
d031952070 docs: update TODO.md with completed configuration tasks
Mark several completed items in TODO.md:
- Hook system documentation
- Authentication token migration to Doppler
- WSL GPG integration documentation
- mise shell integration
- Windows Terminal settings template
- Global CLAUDE.md addition
- Git configuration expansion (aliases, diff tools, signing)
- GPG configuration setup
- README.md comprehensive refactor
- Deprecated hook migration to TypeScript
- File cleanup/template conversion

Update Git identity configurations:
- Switch Ryan identity to new GPG key (301511AAD64FA365)
- Disable GPG signing for Xevion identity (no key available)
- Add WSL-specific GPG configuration using Windows GPG symlink
- Consolidate Windows/WSL config blocks in dot_gitconfig.tmpl
2025-10-27 15:26:58 -05:00
b71c320ea5 feat: add WSL GPG integration with Windows pinentry support
Configure chezmoi to automatically set up WSL to use Windows GPG for native
Qt5 GUI passphrase prompts during git commit signing:

- Add symlink_dot_gnupg.tmpl to link ~/.gnupg to Windows GPG directory
- Add run_onchange_before_setup-wsl-gpg.sh.tmpl for system GPG symlink
- Update .chezmoiignore to handle .gnupg appropriately per platform
- Document GPG configuration in CLAUDE.md and ONBOARDING.md

This enables seamless git commit signing in WSL environments (including
Claude Code) without passphrase prompt issues, while maintaining platform
independence for regular Linux installations.
2025-10-27 15:17:17 -05:00
4d914f1e2f feat: migrate from Zsh to Fish shell with comprehensive configuration
Major shell migration replacing Zsh/Oh-My-Zsh with Fish shell:

- Remove all Zsh configurations (dot_zshrc.tmpl, dot_p10k.zsh)
- Remove Oh-My-Zsh external dependencies from .chezmoiexternal.toml
- Add complete Fish shell setup with config.fish.tmpl and abbr.fish.tmpl
- Implement Fish-native functions for lazy-loading tools (mise, pyenv, zoxide, etc.)
- Create commonrc.fish.tmpl for cross-shell compatibility
- Add Fish plugin management via Fisher (tide prompt, fzf.fish)
- Update documentation (CLAUDE.md, TODO.md, ONBOARDING.md) to reflect Fish
- Add .fish.tmpl file association to VS Code settings
- Enhance PowerShell profile with lsd aliases
- Configure git delta pager and zdiff3 merge conflict style
- Update WSL keychain integration for Fish shell

This migration maintains all existing tool integrations while improving
startup performance through lazy-loading and Fish's native features.
2025-10-27 14:45:37 -05:00
64 changed files with 2651 additions and 1906 deletions

View File

@@ -10,6 +10,7 @@
"*.toml.tmpl": "toml",
"*.yaml.tmpl": "yaml",
"*.cfg.tmpl": "ini",
"*.fish.tmpl": "fish",
"*bash_aliases*": "shellscript",
"*dot_profile*": "shellscript",
"*dot_gitconfig*": "ini"

View File

@@ -20,7 +20,14 @@ This is a **chezmoi source directory** for managing dotfiles across multiple mac
**Template System:**
- Uses Go templates with platform detection
- Variables: `.chezmoi.os`, `.chezmoi.homeDir`, `.data.*`
- Two types of templates with different variable access patterns:
- **Regular templates** (e.g., `home/dot_bashrc.tmpl`): Direct access to Chezmoi context
- Built-in: `.chezmoi.os`, `.chezmoi.homeDir`
- Custom data: `.wsl`, `.chassis`
- **Partials** (reusable templates in `home/.chezmoitemplates/`): Must receive context via explicit parameter
- Partials don't have automatic access to Chezmoi's context
- Context passed as parameter (commonly `data`) when calling the partial
- Access everything through parameter: `.data.chezmoi.os`, `.data.wsl`, `.data.chassis`
- Conditional rendering for Windows/Linux/macOS/WSL
**Secret Management:**
@@ -33,6 +40,12 @@ This is a **chezmoi source directory** for managing dotfiles across multiple mac
- Bootstrap encryption key from Doppler before apply
- Handle `chezmoi init` and `chezmoi update --init`
**GPG Configuration (WSL-only):**
- `~/.gnupg` → Symlink to Windows GPG directory (`C:\Users\Xevion\AppData\Roaming\gnupg`)
- `/usr/local/bin/gpg` → Symlink to Windows `gpg.exe` (via `run_onchange_before_setup-wsl-gpg.sh.tmpl`)
- Enables native Windows Qt5 pinentry GUI for passphrase prompts
- Automatic setup on WSL; ignored on regular Linux
## Critical Restrictions
### NEVER Do These Actions
@@ -76,9 +89,22 @@ This is a **chezmoi source directory** for managing dotfiles across multiple mac
- `chezmoi status` - see what's changed
4. **Use templates correctly**
- Platform detection: `.chezmoi.os`, `.data.wsl`, `.data.chassis`
- Platform detection in regular templates: `.chezmoi.os`, `.wsl`, `.chassis`
- Platform detection in partials: `.data.chezmoi.os`, `.data.wsl`, `.data.chassis`
- Doppler secrets: `{{ dopplerProjectJson.SECRET_NAME }}`
- Conditional logic: `{{ if }}...{{ else }}...{{ end }}`
- Example partial call: `{{ template "commonrc.sh.tmpl" . }}` (passes entire context as `data`)
5. **Suggest TODO list updates** (but DO NOT modify automatically)
- When a task is completed, check if `TODO.md` exists in the repository
- If the completed task relates to items in TODO.md, **suggest** updating the file
- Examples of suggestions:
- "I've completed [task]. Would you like me to update TODO.md to mark this item as complete?"
- "This work relates to items in TODO.md. Should I update the relevant checkboxes?"
- **NEVER** modify TODO.md without explicit user approval
- User must explicitly approve (even if not specifically) before making changes
- Acceptable approvals: "yes", "go ahead", "update it", "sure", etc.
- If unclear, ask: "Should I update TODO.md to reflect this completion?"
## Common Tasks
@@ -104,7 +130,7 @@ chezmoi add --encrypt ~/.ssh/config
## Platform Coverage
- **OS**: Windows, Linux (WSL/native), macOS
- **Shells**: bash, zsh, nushell, PowerShell
- **Shells**: bash, fish, nushell, PowerShell
- **Tools**: 30+ development tools configured (pyenv, bun, cargo, etc.)
- **Secrets**: Doppler + age encryption

View File

@@ -10,8 +10,10 @@ When **bolded**, this application won't be installed automatically. It implies t
- [ ] bw
- Semi-required applications
- [ ] **hishtory**
- [ ] **zsh**
- [ ] **oh-my-zsh**
- Preferred applications
- [ ] kitty
- [ ] micro
- WSL-specific requirements
- [ ] **GPG4win** (Windows) - Required for Git commit signing with GUI pinentry
- Install via: `scoop install gpg4win`
- WSL will automatically link to Windows GPG for native passphrase dialogs

37
TODO.md
View File

@@ -12,12 +12,13 @@
- [ ] Document bootstrap process for WSL installations
- [ ] Document bootstrap process for Windows (including Bun requirement)
- [ ] Create pre-flight checklist (required tools: Bun, age encryption, chezmoi, etc.)
- [ ] Document hook system (`.init_pre.ts`, `.update_pre.ts`) and when they execute
- [x] Document hook system (`.init_pre.ts`, `.update_pre.ts`) and when they execute
- [ ] Add troubleshooting guide for common installation issues
- [ ] Document the relationship between source directory and target directory
- [ ] Add step-by-step first-time setup guide
- [ ] Document Doppler setup requirements
- [ ] Create quick reference card for emergency recovery
- [ ] Document proper process of adding symlinks (mention updating chemzoiignore, etc.)
### 2. Standardize Encryption & Authentication Workflow
@@ -25,7 +26,7 @@
- [ ] Create guide for Doppler integration (project setup, config selection)
- [ ] Document secret rotation process and schedule
- [ ] Create checklist for adding new encrypted values
- [ ] Consolidate all authentication tokens/keys into Doppler or age-encrypted files
- [x] Consolidate all authentication tokens/keys into Doppler or age-encrypted files (R2 and private domain migrated)
- [ ] Document age recipient key storage and backup strategy
- [ ] Add encryption troubleshooting guide
- [ ] Create template for encrypted file naming conventions
@@ -41,7 +42,7 @@
- [ ] Document how to handle tools that exist on both platforms
- [ ] Define file path conventions for cross-platform compatibility
- [ ] Create testing strategy for multi-platform templates
- [ ] Document Windows-specific quirks and workarounds
- [x] Document Windows-specific quirks and workarounds (WSL GPG integration documented)
---
@@ -54,7 +55,7 @@
- [ ] Consolidate PATH modifications into single, organized section in `commonrc.sh.tmpl`
- [ ] Create modular PATH loading system (one block per tool with conditional checks)
- [ ] Separate PATH, environment variables, and shell completions into logical sections
- [ ] Document load order (`.bashrc` `.zshrc` `commonrc.sh``.bash_aliases`)
- [ ] Document load order (`.bashrc``commonrc.sh``.bash_aliases`)
- [ ] Add comments explaining each tool's PATH modification
- [ ] Eliminate duplicate PATH additions
- [ ] Create standard pattern for conditional tool loading
@@ -69,7 +70,7 @@
- [ ] Move completions to dedicated section (after PATH, before aliases)
- [ ] Add error handling for missing completion files
- [ ] Document which tools provide completions
- [ ] Test completions on bash and zsh
- [ ] Test completions on bash
- [ ] Add completion loading performance optimization
- [ ] Document how to add new tool completions
@@ -89,7 +90,7 @@
**mise (development environment manager):**
- [ ] Add mise configuration file (`.mise.toml` or per-project configs)
- [ ] Document mise setup and installation
- [ ] Integrate mise activation with shell configs
- [x] Integrate mise activation with shell configs
- [ ] Document tool version management strategy
- [ ] Add mise to installation checklist
@@ -101,7 +102,7 @@
- [ ] Test bun hooks (`.init_pre.ts`, `.update_pre.ts`) on all platforms
**Windows Terminal:**
- [ ] Add `settings.json` template to dotfiles
- [x] Add `settings.json` template to dotfiles
- [ ] Document theme/color scheme customization
- [ ] Add font configuration (Cascadia Code, Nerd Fonts, etc.)
- [ ] Configure profiles for PowerShell, WSL, cmd
@@ -110,7 +111,7 @@
**Claude (AI assistant):**
- [ ] Document Claude configuration location
- [ ] Add API key management strategy (Doppler?)
- [ ] Add global CLAUDE.md to dotfiles
- [x] Add global CLAUDE.md to dotfiles
- [ ] Create project-specific CLAUDE.md templates
- [ ] Document sync strategy across machines
@@ -165,10 +166,10 @@
### 10. Development Tool Configurations
**Git:**
- [ ] Expand `.gitconfig.tmpl` (currently at `home/dot_config/git/config-ryan.tmpl`)
- [ ] Add git aliases and shortcuts
- [ ] Configure diff and merge tools
- [ ] Add commit signing configuration
- [x] Expand `.gitconfig.tmpl` (currently at `home/dot_config/git/config-ryan.tmpl`)
- [x] Add git aliases and shortcuts
- [x] Configure diff and merge tools
- [x] Add commit signing configuration
- [ ] Configure git credential helpers
- [ ] Add git hooks templates
@@ -190,7 +191,7 @@
- [ ] Add tmux configuration
- [ ] Add vim/neovim basic config
- [ ] Add SSH config template
- [ ] Add GPG configuration
- [x] Add GPG configuration
### 11. Package Management Strategy
@@ -213,7 +214,7 @@
### 12. Enhanced Documentation
- [ ] Expand README.md with comprehensive sections
- [x] Expand README.md with comprehensive sections (Major refactor completed)
- [ ] Add ARCHITECTURE.md explaining repo structure
- [ ] Create CONTRIBUTING.md for your future self
- [ ] Add inline comments to all template files
@@ -263,12 +264,12 @@
### 16. Cleanup & Maintenance
- [ ] Commit deletion of removed files (nushell/env.nu, dot_gitconfig, etc.)
- [x] Commit deletion of removed files (nushell/env.nu, dot_gitconfig, etc.) - Converted to templates instead
- [ ] Clean up commented-out code in commonrc.sh.tmpl (lines 122-130)
- [ ] Review and update `.chezmoiignore` patterns
- [ ] Audit and remove unused templates
- [ ] Standardize file naming conventions across repo
- [ ] Remove deprecated hooks (old shell-based hooks if fully migrated to TS)
- [x] Remove deprecated hooks (old shell-based hooks if fully migrated to TS) - Migrated to TypeScript
- [ ] Archive old/unused configuration files
- [ ] Update .gitattributes for proper file type detection
- [ ] Clean up temporary/test files
@@ -284,7 +285,7 @@ These items were in the original TODO.md and need to be categorized/completed:
- [ ] **rbw executable needs better configuration** - Related to Priority 4, Item 14 (rbw auto-lock)
- [ ] **rbw config not tracked** - Add rbw config to dotfiles
- [ ] **hishtory executable not available on init** - Add to installation checklist
- [ ] **add GPG key to bw** - Add to Priority 1, Item 2 (authentication workflow)
- [x] **add GPG key to bw** - GPG configuration completed with WSL integration
- [ ] **dracula theme tracking, kitty/micro** - Add to Priority 3, Item 10 (dev tools)
- [ ] **lazygit fix difftool** - Add lazygit config to dotfiles
- [ ] **testing in github codespaces** - Add to Priority 4, Item 15 (testing)
@@ -297,4 +298,4 @@ These items were in the original TODO.md and need to be categorized/completed:
- Some items have dependencies (e.g., documentation should reflect implemented changes)
- Use `chezmoi cd` to navigate to source directory when working on configs
- Test changes in WSL/Linux before applying to Windows (or vice versa)
- Keep encrypted secrets out of git history - use age encryption or Doppler
- Keep encrypted secrets out of git history - use age encryption or Doppler

View File

@@ -28,7 +28,7 @@
{{- end -}}
{{- /* Detect if running in WSL */ -}}
{{- $wsl := true -}}
{{- $wsl := false -}}
{{- if eq .chezmoi.os "linux" -}}
{{- $wsl = (.chezmoi.kernel.osrelease | lower | contains "microsoft") -}}
{{- end -}}
@@ -47,6 +47,7 @@ args = [
wsl = {{ $wsl }}
[diff]
pager = "delta"
scriptContents = false
[data.cpu]
@@ -70,8 +71,9 @@ args = [
{{ if eq .chezmoi.os "windows" }}
[cd]
command = "nu"
command = "powershell.exe"
args = ["-NoLogo"]
{{ else }}
[cd]
command = "bash"
command = "fish"
{{ end }}

View File

@@ -1,46 +1,2 @@
[".asdf"]
type = "archive"
url = "https://github.com/asdf-vm/asdf/archive/v0.14.1.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "168h"
[".oh-my-zsh"]
type = "archive"
url = "https://github.com/ohmyzsh/ohmyzsh/archive/master.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "72h"
exclude = [
"*/.*",
"*/templates",
"*/themes",
]
[".oh-my-zsh/custom/themes/powerlevel10k"]
type = "archive"
url = "https://github.com/romkatv/powerlevel10k/archive/{{ (gitHubLatestRelease "romkatv/powerlevel10k").TagName }}.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "72h"
[".oh-my-zsh/custom/plugins/zsh-autosuggestions"]
type = "archive"
url = "https://github.com/zsh-users/zsh-autosuggestions/archive/master.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "168h"
[".oh-my-zsh/custom/plugins/F-Sy-H"]
type = "archive"
url = "https://github.com/z-shell/F-Sy-H/archive/master.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "168h"
[".oh-my-zsh/custom/plugins/zoxide"]
type = "archive"
url = "https://github.com/ajeetdsouza/zoxide/archive/master.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "168h"
# External repositories managed by chezmoi
# https://www.chezmoi.io/reference/special-files-and-directories/chezmoiexternal-format/

View File

@@ -1,26 +1,20 @@
hooks
tool-versions
claude-settings.json
{{/* generated files, cached files, anything that might change unnecessarily */}}
.oh-my-zsh/cache/**
.oh-my-zsh/plugins/**
.oh-my-zsh/templates/**
.oh-my-zsh/custom/themes/powerlevel10k/**/*.zwc
.asdf/downloads/**
.asdf/installs/**
.asdf/plugins/**
.asdf/shims/**
.asdf/tmp/**
.asdf/repository/**
{{/* WSL Only Files */}}
{{ if (not .wsl) }}
{{ if eq .chezmoi.os "windows" }}
{{/* Ignore Linux/Unix-only files on Windows */}}
setup-wsl-gpg.sh
.gnupg/**
{{ end }}
{{/* Linux/Unix Only Files */}}
{{ if (not (eq .chezmoi.os "linux")) }}
# Shell configs (Linux-only)
.oh-my-zsh
.scripts
*.zsh
.zshrc
.bashrc
.profile
.bash_aliases
@@ -29,11 +23,17 @@ key.txt
# Linux-only config directories
.config/kitty
{{ else }}
{{/* Ignore Windows-only files on Linux/macOS */}}
# Windows-only
Documents/PowerShell
.config/fish
.config/Code
.config/Cursor
.config/lazygit
{{ end }}
{{/* Windows Only Files */}}
{{ if (not (eq .chezmoi.os "windows")) }}
Documents/
AppData/
{{ end }}

View File

@@ -1044,4 +1044,15 @@ def maestroOn [] {
bluetoothctl unblock "AC:BF:71:66:FE:B2"
bluetoothctl connect "AC:BF:71:66:FE:B2"
}
{{ end }}
{{ end }}
{{- if .wsl }}
# Launch Windows Terminal in current directory
def wt [...args: string] {
if ($args | is-empty) {
^wt.exe -w 0 sp wsl --cd (pwd)
} else {
^wt.exe -w 0 ...$args wsl --cd (pwd)
}
}
{{- end }}

View File

@@ -0,0 +1,123 @@
# Fish shell common configuration
# This template provides environment setup for Fish shell
# General configuration
set -gx EDITOR "micro"
set -gx GPG_TTY (tty)
set -gx MICRO_TRUECOLOR 1
set -gx TERM xterm-256color # fixes terminal colors when ssh'ing into laptop
# Authentication
set -gx OPENAI_API_KEY "{{ dopplerProjectJson.OPENAI_CHATGPT_CLI }}"
# PATH setup (batched for performance - reduces startup time by ~13ms)
set -l paths_to_add
# Collect paths with conditional checks
test -d $HOME/.hishtory && set -a paths_to_add $HOME/.hishtory
test -d $HOME/bin && set -a paths_to_add $HOME/bin
set -a paths_to_add /usr/local/bin $HOME/.local/bin
test -d /usr/local/go/bin && set -a paths_to_add /usr/local/go/bin # Go
test -d $HOME/go/bin && set -a paths_to_add $HOME/go/bin # Go-installed tools
test -d $HOME/.local/share/bob/nvim-bin && set -a paths_to_add $HOME/.local/share/bob/nvim-bin # Bob, Neovim package manager
# Deno (conditionally source env file or add to path list)
if test -d $HOME/.deno
if not source $HOME/.deno/env.fish 2>/dev/null
set -gx DENO_INSTALL $HOME/.deno
set -a paths_to_add $DENO_INSTALL/bin
end
end
# Rust/Cargo (source env file or add to path list)
if test -f $HOME/.cargo/env.fish
source $HOME/.cargo/env.fish
else if test -f $HOME/.cargo/env
# Fallback: parse bash env file
set -gx CARGO_HOME $HOME/.cargo
set -a paths_to_add $CARGO_HOME/bin
end
# Homebrew (cached for performance - reduces startup time by ~14ms)
if test -f /home/linuxbrew/.linuxbrew/bin/brew
set -l brew_cache "$HOME/.cache/brew_env.fish"
set -l brew_bin "/home/linuxbrew/.linuxbrew/bin/brew"
# Regenerate cache if: doesn't exist, >7 days old, or brew binary is newer
if not test -f "$brew_cache"; \
or test (math (date +%s) - (stat -c %Y "$brew_cache" 2>/dev/null || echo 0)) -gt 604800; \
or test (stat -c %Y "$brew_bin" 2>/dev/null || echo 0) -gt (stat -c %Y "$brew_cache" 2>/dev/null || echo 0)
mkdir -p (dirname "$brew_cache")
$brew_bin shellenv > "$brew_cache" 2>/dev/null
end
test -f "$brew_cache" && source "$brew_cache"
end
set -gx PYENV_ROOT $HOME/.pyenv
# bun
set -gx BUN_INSTALL $HOME/.bun
set -a paths_to_add $BUN_INSTALL/bin
# Note: Bun's _bun file is bash-specific, Fish completions handled separately
# jenv (add to path list for later batch add)
if test -d $HOME/.jenv/bin
set -a paths_to_add $HOME/.jenv/bin
end
# pnpm
set -gx PNPM_HOME $HOME/.local/share/pnpm
set -a paths_to_add $PNPM_HOME
# spicetify
test -d $HOME/.spicetify && set -a paths_to_add $HOME/.spicetify
# pulumi
test -d $HOME/.pulumi/bin && set -a paths_to_add $HOME/.pulumi/bin
# dotnet
if test -d $HOME/.dotnet
set -gx DOTNET_ROOT $HOME/.dotnet
set -a paths_to_add $DOTNET_ROOT $DOTNET_ROOT/tools
end
# Batch add all collected paths (single PATH reconstruction instead of 17+ calls)
test -n "$paths_to_add[1]" && fish_add_path $paths_to_add
# Post-PATH initialization for tools that need commands available
if test -d $HOME/.jenv/bin; and command -q jenv
jenv init - fish | source
end
# Note: Aliases are defined in Fish-native format in ~/.config/fish/conf.d/abbr.fish
# The bash_aliases file contains bash-specific syntax and is not sourced here
{{- /* WSL-specific settings */ -}}
{{- if .data.wsl }}
## Ensures CLI apps open URLs in the default Windows browser
set -gx BROWSER 'powershell.exe /c start'
# Cursor IDE CLI (Windows installation accessible from WSL)
test -x /mnt/c/Users/Xevion/AppData/Local/Programs/cursor/resources/app/bin/cursor && \
fish_add_path /mnt/c/Users/Xevion/AppData/Local/Programs/cursor/resources/app/bin
# Zed Editor CLI (Windows installation accessible from WSL)
test -x /mnt/c/Users/Xevion/AppData/Local/Programs/Zed/bin/zed && \
fish_add_path /mnt/c/Users/Xevion/AppData/Local/Programs/Zed/bin
# Launch Windows Terminal in current directory
function wt
if test (count $argv) -eq 0
wt.exe -w 0 sp wsl --cd (pwd)
else
wt.exe -w 0 $argv wsl --cd (pwd)
end
end
{{- end }}
# atuin (magical shell history)
if command -q atuin
atuin init fish | source
end

View File

@@ -1,4 +1,4 @@
# This template's argument is the shell as a string (bash, zsh).
# This template's argument is the shell as a string (bash, ...).
# general configuration
export EDITOR="micro"
@@ -13,9 +13,7 @@ export OPENAI_API_KEY="{{ dopplerProjectJson.OPENAI_CHATGPT_CLI }}"
# hishtory
export HISHTORY_SERVER="https://hsh.{{ dopplerProjectJson.PRIVATE_DOMAIN }}"
export PATH="$PATH:$HOME/.hishtory"
{{ if eq .shell "zsh" -}}
source $HOME/.hishtory/config.zsh
{{ else if eq .shell "bash" -}}
{{ if eq .shell "bash" -}}
source $HOME/.hishtory/config.sh
{{- else -}}
{{ fail "Unexpected shell." }}
@@ -30,7 +28,23 @@ if [ -d "$HOME/.deno" ]; then
. "$HOME/.deno/env" # Deno
fi
. "$HOME/.cargo/env" # Rustup + Cargo + Cargo-installed tools
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" # Brew
# Homebrew (cached for performance - reduces startup time by ~14ms)
if [ -f /home/linuxbrew/.linuxbrew/bin/brew ]; then
BREW_CACHE="$HOME/.cache/brew_env.sh"
BREW_BIN="/home/linuxbrew/.linuxbrew/bin/brew"
# Regenerate cache if: doesn't exist, >7 days old, or brew binary is newer
if [ ! -f "$BREW_CACHE" ] || \
[ $(( $(date +%s) - $(stat -c %Y "$BREW_CACHE" 2>/dev/null || echo 0) )) -gt 604800 ] || \
[ "$BREW_BIN" -nt "$BREW_CACHE" ]; then
mkdir -p "$(dirname "$BREW_CACHE")"
"$BREW_BIN" shellenv > "$BREW_CACHE" 2>/dev/null
fi
[ -f "$BREW_CACHE" ] && . "$BREW_CACHE"
fi
command -v rbenv &> /dev/null && eval "$(rbenv init -)" # rbenv for Ruby
command -v chatgpt &> /dev/null && . <(chatgpt --set-completions {{ .shell -}}) # chatgpt completions
{{ if eq .shell "bash" -}}
@@ -52,7 +66,6 @@ fi
# bun
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
[ -s "$HOME/.bun/_bun" ] && source "$HOME/.bun/_bun"
# java version manager
if [ -d $HOME/.jenv/bin ]; then
@@ -63,19 +76,6 @@ if [ -d $HOME/.jenv/bin ]; then
fi
fi
if command -v hass-cli &> /dev/null; then
export HASS_SERVER={{ dopplerProjectJson.HASS_SERVER_URL }}
export HASS_TOKEN={{ dopplerProjectJson.HASS_SERVER_TOKEN }}
{{ if eq .shell "bash" -}}
source <(_HASS_CLI_COMPLETE=bash_source hass-cli)
{{ else if eq .shell "zsh" -}}
source <(_HASS_CLI_COMPLETE=zsh_source hass-cli)
{{ else if eq .shell "fish" -}}
eval (_HASS_CLI_COMPLETE=fish_source hass-cli)
{{ end }}
fi
# pnpm
export PNPM_HOME="$HOME/.local/share/pnpm"
case ":$PATH:" in
@@ -93,16 +93,42 @@ if [ -d "$HOME/.pulumi/bin" ]; then
export PATH=$PATH:$HOME/.pulumi/bin
fi
# load aliases (note: omz aliases are supposed to be placed in ZSH_CUSTOM?)
. $HOME/.bash_aliases
# disable screen blanking
# source $(brew --prefix)/share/zsh/site-functions/_todoist_peco
# xset s off && xset -dpms
# Always use `micro` as the preferred editor when connected via SSH
if [[ -n $SSH_CONNECTION ]]; then
export EDITOR='micro'
fi
{{- /* WSL-specific settings */ -}}
{{- if .data.wsl }}
## Ensures CLI apps open URLs in the default Windows browser (Chrome/Firefox/etc) instead of a CLI browser
export BROWSER='powershell.exe /c start'
{{- end }}
# Cursor IDE CLI (Windows installation accessible from WSL)
[ -x /mnt/c/Users/Xevion/AppData/Local/Programs/cursor/resources/app/bin/cursor ] && \
export PATH="$PATH:/mnt/c/Users/Xevion/AppData/Local/Programs/cursor/resources/app/bin"
# Zed Editor CLI (Windows installation accessible from WSL)
[ -x /mnt/c/Users/Xevion/AppData/Local/Programs/Zed/bin/zed ] && \
export PATH="$PATH:/mnt/c/Users/Xevion/AppData/Local/Programs/Zed/bin"
# Launch Windows Terminal in current directory
wt() {
if [ $# -eq 0 ]; then
wt.exe -w 0 sp wsl --cd "$(pwd)"
else
wt.exe -w 0 "$@" wsl --cd "$(pwd)"
fi
}
eval `keychain --quiet --eval --agents ssh ~/.ssh/id_rsa`
{{ end }}
# dotnet
if [ -d "$HOME/.dotnet" ]; then
@@ -110,12 +136,7 @@ if [ -d "$HOME/.dotnet" ]; then
export PATH="$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools"
fi
# disable screen blanking
# source $(brew --prefix)/share/zsh/site-functions/_todoist_peco
# xset s off && xset -dpms
# Preferred editor for local and remote sessions
# if [[ -n $SSH_CONNECTION ]]; then
# export EDITOR='micro'
# else
# export EDITOR='nvim'
# fi
# atuin
if [ -d "$HOME/.atuin" ]; then
. "$HOME/.atuin/bin/env"
fi

View File

@@ -0,0 +1,156 @@
// Place your key bindings in this file to override the defaultsauto[]
[
{
"key": "ctrl+shift+=",
"command": "-workbench.action.zoomIn"
},
{
"key": "ctrl+shift+=",
"command": "workbench.action.zoomIn"
},
{
"key": "ctrl+=",
"command": "-workbench.action.zoomIn"
},
{
"key": "ctrl+-",
"command": "-workbench.action.zoomOut"
},
{
"key": "ctrl+=",
"command": "editor.action.fontZoomIn"
},
{
"key": "ctrl+-",
"command": "editor.action.fontZoomOut"
},
{
"key": "ctrl+shift+tab",
"command": "-workbench.action.quickOpenLeastRecentlyUsedEditorInGroup",
"when": "!activeEditorGroupEmpty"
},
{
"key": "ctrl+tab",
"command": "-workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup",
"when": "!activeEditorGroupEmpty"
},
{
"key": "ctrl+tab",
"command": "workbench.action.nextEditor"
},
{
"key": "ctrl+pagedown",
"command": "-workbench.action.nextEditor"
},
{
"key": "ctrl+shift+tab",
"command": "workbench.action.previousEditor"
},
{
"key": "ctrl+pageup",
"command": "-workbench.action.previousEditor"
},
// Swap focus between terminal & active editor
{
"key": "ctrl+`",
"command": "workbench.action.terminal.focus"
},
{
"key": "ctrl+`",
"command": "workbench.action.focusActiveEditorGroup",
"when": "terminalFocus"
},
{
"key": "ctrl+W",
"command": "workbench.action.togglePanel",
"when": "terminalFocus"
},
{
"key": "ctrl+shift+space",
"command": "editor.action.showDefinitionPreviewHover"
},
{
"key": "ctrl+shift+alt+`",
"command": "workbench.action.createTerminalEditor"
},
{
"key": "ctrl+shift+/",
"command": "editor.action.blockComment",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "shift+alt+a",
"command": "-editor.action.blockComment",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "shift+alt+d",
"command": "editor.action.deleteLines",
"when": "textInputFocus && !editorReadonly"
},
{
"key": "ctrl+shift+k",
"command": "-editor.action.deleteLines",
"when": "textInputFocus && !editorReadonly"
},
{
"key": "ctrl+alt+d",
"command": "editor.detectLanguage",
"when": "editorTextFocus && !notebookEditable"
},
{
"key": "shift+alt+d",
"command": "-editor.detectLanguage",
"when": "editorTextFocus && !notebookEditable"
},
{
"key": "ctrl+alt+d",
"command": "notebook.cell.detectLanguage",
"when": "notebookCellEditable && notebookEditable"
},
{
"key": "shift+alt+d",
"command": "-notebook.cell.detectLanguage",
"when": "notebookCellEditable && notebookEditable"
},
{
"key": "alt+a",
"command": "composerMode.agent"
},
{
"key": "alt+g",
"command": "composerMode.chat"
},
{
"key": "ctrl+shift+n",
"command": "editor.action.inlineDiffs.rejectPartialEdit",
"when": "editorHasPromptBar && editorPromptBarFocused"
},
{
"key": "ctrl+n",
"command": "-editor.action.inlineDiffs.rejectPartialEdit",
"when": "editorHasPromptBar && editorPromptBarFocused"
},
{
"key": "ctrl+shift+n",
"command": "editor.action.inlineDiffs.rejectPartialEdit",
"when": "editorTextFocus && @inlineDiffs.rejectPartialEdit.isActiveEditorWithDiffs"
},
{
"key": "ctrl+n",
"command": "-editor.action.inlineDiffs.rejectPartialEdit",
"when": "editorTextFocus && @inlineDiffs.rejectPartialEdit.isActiveEditorWithDiffs"
},
{
"key": "ctrl+g",
"command": "-workbench.action.terminal.goToRecentDirectory"
},
{
"key": "shift+enter",
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "\u001b\r"
},
"when": "terminalFocus"
}
]

View File

@@ -0,0 +1,335 @@
{
// Editor Settings
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.fontFamily": "Iosevka",
"editor.inlineSuggest.enabled": true,
"editor.linkedEditing": true,
"editor.minimap.showSlider": "always",
"diffEditor.renderSideBySide": false,
"cursor.diffs.useCharacterLevelDiffs": true,
// Workbench Settings
"workbench.startupEditor": "none",
"workbench.tree.indent": 24,
"workbench.preferredLightColorTheme": "Cursor Light",
"workbench.iconTheme": "material-icon-theme",
// Window Settings
"window.autoDetectHighContrast": false,
"window.autoDetectColorScheme": true,
// Terminal Settings
"terminal.integrated.commandsToSkipShell": [
"-workbench.action.quickOpenView"
],
"terminal.integrated.fontFamily": "Iosevka Nerd Font Mono",
"terminal.integrated.enablePersistentSessions": false,
"terminal.integrated.defaultProfile.windows": "PowerShell",
"terminal.integrated.defaultProfile.linux": "zsh",
"terminal.external.windowsExec": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
"terminal.integrated.profiles.linux": {
"bash": {
"path": "bash",
"icon": "terminal-bash"
},
"fish": {
"path": "fish"
},
"tmux": {
"path": "tmux",
"icon": "terminal-tmux"
},
"pwsh": {
"path": "pwsh",
"icon": "terminal-powershell"
}
},
// File Explorer Settings
"explorer.confirmDragAndDrop": false,
"explorer.confirmDelete": false,
"files.associations": {
"*.dialogue": "plaintext"
},
// Git Settings
"git.autofetch": true,
"git.confirmSync": false,
"git.openRepositoryInParentFolders": "always",
// Security Settings
"security.workspace.trust.untrustedFiles": "open",
"security.allowedUNCHosts": ["ROMAN"],
"security.restrictUNCAccess": false,
// Language-specific Formatters
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[python]": {
"editor.formatOnType": true,
"editor.defaultFormatter": "anysphere.cursorpyright"
},
"[go]": {
"editor.defaultFormatter": "golang.go"
},
"[rust]": {
"editor.defaultFormatter": "rust-lang.rust-analyzer"
},
"[astro]": {
"editor.defaultFormatter": "astro-build.astro-vscode"
},
"[caddyfile]": {
"editor.defaultFormatter": "matthewpi.caddyfile-support"
},
"[shellscript]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[github-actions-workflow]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[ignore]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[dotenv]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[xml]": {
"editor.defaultFormatter": "redhat.vscode-xml"
},
"[properties]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[gdscript]": {
"editor.defaultFormatter": "geequlim.godot-tools"
},
"[powershell]": {
"editor.defaultFormatter": "ms-vscode.powershell"
},
"[lua]": {
"editor.defaultFormatter": "sumneko.lua"
},
"[prisma]": {
"editor.defaultFormatter": "Prisma.prisma"
},
// Language-specific Settings
"typescript.preferences.importModuleSpecifier": "non-relative",
"typescript.updateImportsOnFileMove.enabled": "always",
"typescript.preferGoToSourceDefinition": true,
"javascript.updateImportsOnFileMove.enabled": "never",
"javascript.preferGoToSourceDefinition": true,
"python.analysis.autoImportCompletions": true,
"python.analysis.supportDocstringTemplate": true,
"go.inlayHints.parameterNames": true,
"go.buildTags": "real",
"go.toolsManagement.autoUpdate": true,
"go.lintTool": "revive",
"dotnet.server.useOmnisharp": true,
"dotnet.formatting.organizeImportsOnFormat": true,
// Extension Settings
"markdown-preview-enhanced.previewTheme": "github-light.css",
"colorize.include": [
"**/*.css",
"**/*.tsx",
"**/*.scss",
"**/*.sass",
"**/*.less",
"**/*.styl"
],
"colorize.languages": [
"javascript",
"css",
"sass",
"scss",
"less",
"postcss",
"sss",
"stylus",
"xml",
"svg",
"typescriptreact"
],
"quokka.showStartViewOnFeatureRelease": false,
"prisma.showPrismaDataPlatformNotification": false,
"poshProTools.showUpgradeNotification": false,
"poshProTools.disableNewsNotification": true,
"csharpier.enableDiagnostics": false,
"powershell.promptToUpdatePowerShell": false,
"autoimport.autoComplete": false,
"notebook.output.scrolling": true,
"json.schemaDownload.enable": true,
"evenBetterToml.schema.links": true,
// GitHub Copilot Settings
"github.copilot.enable": {
"*": true,
"plaintext": true,
"markdown": true,
"scminput": false,
"yaml": false
},
"github.copilot.editor.enableAutoCompletions": true,
"github.copilot.nextEditSuggestions.enabled": true,
// GitLens Settings
"gitlens.ai.experimental.model": "vscode",
"gitlens.ai.experimental.vscode.model": "copilot:gpt-4o",
"gitlens.ai.model": "gitkraken",
"gitlens.ai.gitkraken.model": "gemini:gemini-2.0-flash",
// Cursor-specific Settings
"cursor.cpp.disabledLanguages": ["scminput"],
"cursor.composer.usageSummaryDisplay": "always",
// VSCord Settings
"vscord.status.image.small.viewing.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/vscode.png",
// Coverage Settings
"coverage-gutters.ignoredPathGlobs": "**/{node_modules,venv,.venv,vendor,target,dist,emsdk}/**",
"coverage-gutters.manualCoverageFilePaths": [
"C:/Users/Xevion/projects/Pac-Man/lcov.info"
],
// Task Settings
"task.allowAutomaticTasks": "on",
// Remote Settings
"remote.SSH.remotePlatform": {
"aws": "linux"
},
// Flutter/Dart Settings
"dart.flutterSdkPath": "C:\\Users\\Xevion\\.flutter\\flutter",
// Harper LS Settings
"harper-ls.diagnosticSeverity": "hint",
// Todo Tree Settings
"todo-tree.highlights.foregroundColourScheme": [],
// Spell Check Settings
"cSpell.ignorePaths": [
"package-lock.json",
"node_modules",
"vscode-extension",
".git/{info,lfs,logs,refs,objects}/**",
".git/{index,*refs,*HEAD}",
".vscode",
".vscode-insiders",
"C:/Users/*/AppData/Roaming/**"
],
"cSpell.userWords": [
"asgi",
"astro",
"automations",
"autoprefixer",
"Behaviour",
"Boids",
"Caddyfile",
"coloors",
"Colour",
"Debugw",
"dotenv",
"Errorw",
"esbuild",
"factorio",
"fastapi",
"gnueabihf",
"groq",
"Hackathon",
"hypercorn",
"imfucked",
"jsdoc",
"jsdom",
"Lerp",
"logfile",
"Mathf",
"microcontroller",
"nodelib",
"openrgb",
"pickone",
"pipx",
"pkgjs",
"plasteel",
"proxying",
"psycopg",
"pydantic",
"pyenv",
"rdap",
"rehype",
"resliced",
"RFID",
"Runnerspace",
"Tauri",
"undelete",
"uvicorn",
"vite",
"vitejs",
"wakatime",
"Xevion"
],
"files.exclude": {
"**/.trunk/*actions/": true,
"**/.trunk/*logs/": true,
"**/.trunk/*notifications/": true,
"**/.trunk/*out/": true,
"**/.trunk/*plugins/": true
},
"files.watcherExclude": {
"**/.trunk/*actions/": true,
"**/.trunk/*logs/": true,
"**/.trunk/*notifications/": true,
"**/.trunk/*out/": true,
"**/.trunk/*plugins/": true
},
"trunk.showPreexistingIssues": true,
"cursor.composer.shouldAllowCustomModes": true,
"[toml]": {
"editor.defaultFormatter": "tamasfe.even-better-toml"
},
"diffEditor.experimental.showMoves": true,
"vscord.status.image.small.editing.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/vscode.png",
"vscord.status.image.large.notInFile.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/idle-vscode.png",
"vscord.status.image.large.idle.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/idle-vscode.png",
"vscord.status.details.text.notInFile": "",
"vscord.ignore.organizations": ["Invidae"],
"git.blame.editorDecoration.enabled": true,
"zig.zls.enabled": "on",
"vscord.ignore.workspaces": [".cursor"],
"markdownlint.lintWorkspaceGlobs": [
"**/*.{md,mkd,mdwn,mdown,markdown,markdn,mdtxt,mdtext,workbook}",
"!**/*.code-search",
"!**/bower_components",
"!**/node_modules",
"!**/.git",
"!**/vendor",
"!**/.cursor/rules"
],
"diffEditor.ignoreTrimWhitespace": true,
"diffEditor.hideUnchangedRegions.enabled": true,
"lldb.suppressUpdateNotifications": true,
"prettier.enableDebugLogs": true,
"scm.diffDecorationsGutterPattern": {
"added": true
},
"claudeCode.selectedModel": "default",
"files.simpleDialog.enable": true,
"cursor.terminal.usePreviewBox": true,
"java.trace.server": "verbose",
"java.server.launchMode": "Standard"
}

View File

@@ -0,0 +1,332 @@
{
// Editor Settings
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.fontFamily": "Iosevka",
"editor.inlineSuggest.enabled": true,
"editor.linkedEditing": true,
"editor.minimap.showSlider": "always",
"diffEditor.renderSideBySide": false,
"cursor.diffs.useCharacterLevelDiffs": true,
// Workbench Settings
"workbench.startupEditor": "none",
"workbench.tree.indent": 24,
"workbench.preferredLightColorTheme": "Cursor Light",
"workbench.iconTheme": "material-icon-theme",
// Window Settings
"window.autoDetectHighContrast": false,
"window.autoDetectColorScheme": true,
// Terminal Settings
"terminal.integrated.commandsToSkipShell": [
"-workbench.action.quickOpenView"
],
"terminal.integrated.fontFamily": "Iosevka Nerd Font Mono",
"terminal.integrated.enablePersistentSessions": false,
"terminal.integrated.defaultProfile.windows": "PowerShell",
"terminal.integrated.defaultProfile.linux": "zsh",
"terminal.external.windowsExec": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
"terminal.integrated.profiles.linux": {
"bash": {
"path": "bash",
"icon": "terminal-bash"
},
"fish": {
"path": "fish"
},
"tmux": {
"path": "tmux",
"icon": "terminal-tmux"
},
"pwsh": {
"path": "pwsh",
"icon": "terminal-powershell"
}
},
// File Explorer Settings
"explorer.confirmDragAndDrop": false,
"explorer.confirmDelete": false,
"files.associations": {
"*.dialogue": "plaintext"
},
// Git Settings
"git.autofetch": true,
"git.confirmSync": false,
"git.openRepositoryInParentFolders": "always",
// Security Settings
"security.workspace.trust.untrustedFiles": "open",
"security.allowedUNCHosts": ["ROMAN"],
"security.restrictUNCAccess": false,
// Language-specific Formatters
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[python]": {
"editor.formatOnType": true,
"editor.defaultFormatter": "anysphere.cursorpyright"
},
"[go]": {
"editor.defaultFormatter": "golang.go"
},
"[rust]": {
"editor.defaultFormatter": "rust-lang.rust-analyzer"
},
"[astro]": {
"editor.defaultFormatter": "astro-build.astro-vscode"
},
"[caddyfile]": {
"editor.defaultFormatter": "matthewpi.caddyfile-support"
},
"[shellscript]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[github-actions-workflow]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[ignore]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[dotenv]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[xml]": {
"editor.defaultFormatter": "redhat.vscode-xml"
},
"[properties]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[gdscript]": {
"editor.defaultFormatter": "geequlim.godot-tools"
},
"[powershell]": {
"editor.defaultFormatter": "ms-vscode.powershell"
},
"[lua]": {
"editor.defaultFormatter": "sumneko.lua"
},
"[prisma]": {
"editor.defaultFormatter": "Prisma.prisma"
},
// Language-specific Settings
"typescript.preferences.importModuleSpecifier": "non-relative",
"typescript.updateImportsOnFileMove.enabled": "always",
"typescript.preferGoToSourceDefinition": true,
"javascript.updateImportsOnFileMove.enabled": "never",
"javascript.preferGoToSourceDefinition": true,
"python.analysis.autoImportCompletions": true,
"python.analysis.supportDocstringTemplate": true,
"go.inlayHints.parameterNames": true,
"go.buildTags": "real",
"go.toolsManagement.autoUpdate": true,
"go.lintTool": "revive",
"dotnet.server.useOmnisharp": true,
"dotnet.formatting.organizeImportsOnFormat": true,
// Extension Settings
"markdown-preview-enhanced.previewTheme": "github-light.css",
"colorize.include": [
"**/*.css",
"**/*.tsx",
"**/*.scss",
"**/*.sass",
"**/*.less",
"**/*.styl"
],
"colorize.languages": [
"javascript",
"css",
"sass",
"scss",
"less",
"postcss",
"sss",
"stylus",
"xml",
"svg",
"typescriptreact"
],
"quokka.showStartViewOnFeatureRelease": false,
"prisma.showPrismaDataPlatformNotification": false,
"poshProTools.showUpgradeNotification": false,
"poshProTools.disableNewsNotification": true,
"csharpier.enableDiagnostics": false,
"powershell.promptToUpdatePowerShell": false,
"autoimport.autoComplete": false,
"notebook.output.scrolling": true,
"json.schemaDownload.enable": true,
"evenBetterToml.schema.links": true,
// GitHub Copilot Settings
"github.copilot.enable": {
"*": true,
"plaintext": true,
"markdown": true,
"scminput": false,
"yaml": false
},
"github.copilot.editor.enableAutoCompletions": true,
"github.copilot.nextEditSuggestions.enabled": true,
// GitLens Settings
"gitlens.ai.experimental.model": "vscode",
"gitlens.ai.experimental.vscode.model": "copilot:gpt-4o",
"gitlens.ai.model": "gitkraken",
"gitlens.ai.gitkraken.model": "gemini:gemini-2.0-flash",
// Cursor-specific Settings
"cursor.cpp.disabledLanguages": ["scminput"],
"cursor.composer.usageSummaryDisplay": "always",
// VSCord Settings
"vscord.status.image.small.viewing.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/vscode.png",
// Coverage Settings
"coverage-gutters.ignoredPathGlobs": "**/{node_modules,venv,.venv,vendor,target,dist,emsdk}/**",
"coverage-gutters.manualCoverageFilePaths": [
"C:/Users/Xevion/projects/Pac-Man/lcov.info"
],
// Task Settings
"task.allowAutomaticTasks": "on",
// Remote Settings
"remote.SSH.remotePlatform": {
"aws": "linux"
},
// Flutter/Dart Settings
"dart.flutterSdkPath": "C:\\Users\\Xevion\\.flutter\\flutter",
// Harper LS Settings
"harper-ls.diagnosticSeverity": "hint",
// Todo Tree Settings
"todo-tree.highlights.foregroundColourScheme": [],
// Spell Check Settings
"cSpell.ignorePaths": [
"package-lock.json",
"node_modules",
"vscode-extension",
".git/{info,lfs,logs,refs,objects}/**",
".git/{index,*refs,*HEAD}",
".vscode",
".vscode-insiders",
"C:/Users/*/AppData/Roaming/**"
],
"cSpell.userWords": [
"asgi",
"astro",
"automations",
"autoprefixer",
"Behaviour",
"Boids",
"Caddyfile",
"coloors",
"Colour",
"Debugw",
"dotenv",
"Errorw",
"esbuild",
"factorio",
"fastapi",
"gnueabihf",
"groq",
"Hackathon",
"hypercorn",
"imfucked",
"jsdoc",
"jsdom",
"Lerp",
"logfile",
"Mathf",
"microcontroller",
"nodelib",
"openrgb",
"pickone",
"pipx",
"pkgjs",
"plasteel",
"proxying",
"psycopg",
"pydantic",
"pyenv",
"rdap",
"rehype",
"resliced",
"RFID",
"Runnerspace",
"Tauri",
"undelete",
"uvicorn",
"vite",
"vitejs",
"wakatime",
"Xevion"
],
"files.exclude": {
"**/.trunk/*actions/": true,
"**/.trunk/*logs/": true,
"**/.trunk/*notifications/": true,
"**/.trunk/*out/": true,
"**/.trunk/*plugins/": true
},
"files.watcherExclude": {
"**/.trunk/*actions/": true,
"**/.trunk/*logs/": true,
"**/.trunk/*notifications/": true,
"**/.trunk/*out/": true,
"**/.trunk/*plugins/": true
},
"trunk.showPreexistingIssues": true,
"cursor.composer.shouldAllowCustomModes": true,
"[toml]": {
"editor.defaultFormatter": "tamasfe.even-better-toml"
},
"diffEditor.experimental.showMoves": true,
"vscord.status.image.small.editing.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/vscode.png",
"vscord.status.image.large.notInFile.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/idle-vscode.png",
"vscord.status.image.large.idle.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/idle-vscode.png",
"vscord.status.details.text.notInFile": "",
"vscord.ignore.organizations": ["Invidae"],
"git.blame.editorDecoration.enabled": true,
"zig.zls.enabled": "on",
"vscord.ignore.workspaces": [".cursor"],
"markdownlint.lintWorkspaceGlobs": [
"**/*.{md,mkd,mdwn,mdown,markdown,markdn,mdtxt,mdtext,workbook}",
"!**/*.code-search",
"!**/bower_components",
"!**/node_modules",
"!**/.git",
"!**/vendor",
"!**/.cursor/rules"
],
"diffEditor.ignoreTrimWhitespace": true,
"diffEditor.hideUnchangedRegions.enabled": true,
"lldb.suppressUpdateNotifications": true,
"prettier.enableDebugLogs": true,
"scm.diffDecorationsGutterPattern": {
"added": true
},
"claudeCode.selectedModel": "default",
"files.simpleDialog.enable": true
}

View File

@@ -0,0 +1,23 @@
gui:
theme:
activeBorderColor:
- "#E97387"
- bold
inactiveBorderColor:
- "#a5adce"
optionsTextColor:
- "#8caaee"
selectedLineBgColor:
- "#ECCFD3"
cherryPickedCommitBgColor:
- "#51576d"
cherryPickedCommitFgColor:
- "#CFF2E2"
unstagedChangesColor:
- "#E97387"
defaultFgColor:
- "#6B6B6B"
searchingActiveBorderColor:
- "#e5c890"
authorColors:
"*": "#babbf1"

View File

@@ -0,0 +1,86 @@
// Place your key bindings in this file to override the defaultsauto[]
[
{
"key": "ctrl+shift+=",
"command": "-workbench.action.zoomIn"
},
{
"key": "ctrl+shift+=",
"command": "workbench.action.zoomIn"
},
{
"key": "ctrl+=",
"command": "-workbench.action.zoomIn"
},
{
"key": "ctrl+-",
"command": "-workbench.action.zoomOut"
},
{
"key": "ctrl+=",
"command": "editor.action.fontZoomIn"
},
{
"key": "ctrl+-",
"command": "editor.action.fontZoomOut"
},
{
"key": "ctrl+shift+tab",
"command": "-workbench.action.quickOpenLeastRecentlyUsedEditorInGroup",
"when": "!activeEditorGroupEmpty"
},
{
"key": "ctrl+tab",
"command": "-workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup",
"when": "!activeEditorGroupEmpty"
},
{
"key": "ctrl+tab",
"command": "workbench.action.nextEditor"
},
{
"key": "ctrl+pagedown",
"command": "-workbench.action.nextEditor"
},
{
"key": "ctrl+shift+tab",
"command": "workbench.action.previousEditor"
},
{
"key": "ctrl+pageup",
"command": "-workbench.action.previousEditor"
},
// Swap focus between terminal & active editor
{
"key": "ctrl+`",
"command": "workbench.action.terminal.focus"
},
{
"key": "ctrl+`",
"command": "workbench.action.focusActiveEditorGroup",
"when": "terminalFocus"
},
{
"key": "ctrl+W",
"command": "workbench.action.togglePanel",
"when": "terminalFocus"
},
{
"key": "ctrl+shift+space",
"command": "editor.action.showDefinitionPreviewHover"
},
{
"key": "ctrl+shift+alt+`",
"command": "workbench.action.createTerminalEditor"
},
{
"key": "ctrl+shift+/",
"command": "editor.action.blockComment",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "shift+alt+a",
"command": "-editor.action.blockComment",
"when": "editorTextFocus && !editorReadonly"
}
]

View File

@@ -0,0 +1,232 @@
{
"workbench.colorTheme": "GitHub Light",
"liquid.format": true,
"markdown-preview-enhanced.previewTheme": "github-light.css",
"terminal.integrated.commandsToSkipShell": [
"-workbench.action.quickOpenView"
],
"cSpell.ignorePaths": [
"package-lock.json",
"node_modules",
"vscode-extension",
".git/{info,lfs,logs,refs,objects}/**",
".git/{index,*refs,*HEAD}",
".vscode",
".vscode-insiders",
"C:/Users/*/AppData/Roaming/**"
],
"cSpell.userWords": [
"asgi",
"astro",
"automations",
"autoprefixer",
"Behaviour",
"Boids",
"Caddyfile",
"coloors",
"Colour",
"Debugw",
"dotenv",
"Errorw",
"esbuild",
"factorio",
"fastapi",
"gnueabihf",
"groq",
"Hackathon",
"hypercorn",
"imfucked",
"jsdoc",
"jsdom",
"Lerp",
"logfile",
"Mathf",
"microcontroller",
"nodelib",
"openrgb",
"pickone",
"pipx",
"pkgjs",
"plasteel",
"proxying",
"psycopg",
"pydantic",
"pyenv",
"rdap",
"rehype",
"resliced",
"RFID",
"Runnerspace",
"Tauri",
"undelete",
"uvicorn",
"vite",
"vitejs",
"wakatime",
"Xevion"
],
"[scss]": {
"editor.defaultFormatter": "sibiraj-s.vscode-scss-formatter"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"explorer.confirmDragAndDrop": false,
"explorer.confirmDelete": false,
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"security.workspace.trust.untrustedFiles": "open",
"workbench.tree.indent": 24,
"editor.linkedEditing": true,
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"workbench.startupEditor": "none",
"quokka.showStartViewOnFeatureRelease": false,
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"colorize.include": [
"**/*.css",
"**/*.tsx",
"**/*.scss",
"**/*.sass",
"**/*.less",
"**/*.styl"
],
"colorize.languages": [
"javascript",
"css",
"sass",
"scss",
"less",
"postcss",
"sss",
"stylus",
"xml",
"svg",
"typescriptreact"
],
"git.autofetch": true,
"git.confirmSync": false,
"editor.minimap.showSlider": "always",
"[astro]": {
"editor.defaultFormatter": "astro-build.astro-vscode"
},
"editor.inlineSuggest.enabled": true,
"github.copilot.enable": {
"*": true,
"plaintext": true,
"markdown": true,
"scminput": false,
"yaml": true
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[python]": {
"editor.formatOnType": true,
"editor.defaultFormatter": "ms-python.black-formatter"
},
"[go]": {
"editor.defaultFormatter": "golang.go"
},
"security.allowedUNCHosts": ["ROMAN"],
"security.restrictUNCAccess": false,
"[rust]": {
"editor.defaultFormatter": "rust-lang.rust-analyzer"
},
"logViewer.watch": ["*.log"],
"logViewer.options": {
"fileCheckInterval": 500
},
"prisma.showPrismaDataPlatformNotification": false,
"github.copilot.editor.enableAutoCompletions": true,
"[caddyfile]": {
"editor.defaultFormatter": "matthewpi.caddyfile-support"
},
"workbench.preferredDarkColorTheme": "Copilot Theme - Higher Contrast",
"window.autoDetectHighContrast": false,
"window.autoDetectColorScheme": true,
"workbench.preferredLightColorTheme": "GitHub Light Default",
"workbench.iconTheme": "material-icon-theme",
"workbench.preferredHighContrastLightColorTheme": "GitHub Light",
"workbench.preferredHighContrastColorTheme": "Catppuccin Macchiato",
"[shellscript]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[github-actions-workflow]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"terminal.integrated.fontFamily": "Iosevka Nerd Font Mono",
"[ignore]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[dotenv]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[sql]": {
"editor.defaultFormatter": "inferrinizzard.prettier-sql-vscode"
},
"go.inlayHints.parameterNames": true,
"editor.formatOnSave": true,
"python.analysis.autoImportCompletions": true,
"task.allowAutomaticTasks": "on",
"python.analysis.supportDocstringTemplate": true,
"[xml]": {
"editor.defaultFormatter": "redhat.vscode-xml"
},
"gitlens.ai.experimental.model": "vscode",
"gitlens.ai.experimental.vscode.model": "copilot:gpt-4o",
"[csharp]": {
"editor.defaultFormatter": "ms-dotnettools.csharp"
},
"[properties]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"terminal.integrated.enablePersistentSessions": false,
"[xaml]": {
"editor.defaultFormatter": "ms-dotnettools.csharp"
},
"git.openRepositoryInParentFolders": "always",
"go.buildTags": "real",
"typescript.preferences.importModuleSpecifier": "non-relative",
"[dockerfile]": {
"editor.defaultFormatter": "ms-azuretools.vscode-docker"
},
"harper-ls.diagnosticSeverity": "hint",
"[gdscript]": {
"editor.defaultFormatter": "geequlim.godot-tools"
},
"[powershell]": {
"editor.defaultFormatter": "ms-vscode.powershell"
},
"files.associations": {
"*.dialogue": "plaintext"
},
"poshProTools.showUpgradeNotification": false,
"poshProTools.disableNewsNotification": true,
"dotnet.server.useOmnisharp": true,
"csharpier.enableDiagnostics": false,
"powershell.promptToUpdatePowerShell": false,
"dotnet.formatting.organizeImportsOnFormat": true,
"editor.fontFamily": "Noto Sans, Iosevka Slab, Iosevka",
"remote.SSH.remotePlatform": {
"aws": "linux"
},
"autoimport.autoComplete": false,
"[lua]": {
"editor.defaultFormatter": "sumneko.lua"
},
"javascript.updateImportsOnFileMove.enabled": "never",
"javascript.preferGoToSourceDefinition": true,
"typescript.preferGoToSourceDefinition": true,
"[prisma]": {
"editor.defaultFormatter": "Prisma.prisma"
},
"notebook.output.scrolling": true,
"github.copilot.nextEditSuggestions.enabled": true,
"docker.extension.enableComposeLanguageServer": false
}

View File

@@ -0,0 +1 @@
{{ .chezmoi.sourceDir }}/.config-source/lazygit/config.yml

View File

@@ -0,0 +1,4 @@
{{/* Windows only*/}}
{{ if eq .chezmoi.os "windows" }}
{{ .chezmoi.sourceDir }}/.config-source/vscode/keybindings.windows.json
{{ end }}

View File

@@ -0,0 +1,4 @@
{{/* Windows only*/}}
{{ if eq .chezmoi.os "windows" }}
{{ .chezmoi.sourceDir }}/.config-source/vscode/settings.windows.json
{{ end }}

View File

@@ -0,0 +1,4 @@
{{/* Windows only*/}}
{{ if eq .chezmoi.os "windows" }}
{{ .chezmoi.sourceDir }}/.config-source/cursor/keybindings.windows.json
{{ end }}

View File

@@ -0,0 +1,4 @@
{{/* Windows only*/}}
{{ if eq .chezmoi.os "windows" }}
{{ .chezmoi.sourceDir }}/.config-source/cursor/settings.windows.json
{{ end }}

View File

@@ -21,10 +21,13 @@ Set-Alias -Name nano -Value micro
Set-Alias -Name vim -Value nvim
Set-Alias -Name lg -Value lazygit
# Directory listing
function ll { Get-ChildItem -Force | Format-Table -AutoSize }
function la { Get-ChildItem -Force }
function l { Get-ChildItem }
# Directory listing - lsd (modern ls replacement)
function ls { lsd $args }
function l { lsd -l $args }
function la { lsd -a $args }
function lla { lsd -la $args }
function lt { lsd --tree $args }
function ll { lsd -AlFh $args }
# Reload shell profile
function es { & $PROFILE }
@@ -36,6 +39,18 @@ Set-Alias -Name ch -Value chezmoi
function cha { chezmoi apply --interactive }
function chlg { lazygit --path {{ .chezmoi.config.sourceDir }} }
# ----------------------
# Windows Terminal
# ----------------------
# Launch Windows Terminal in current directory
function wt {
if ($args.Count -eq 0) {
wt.exe -w 0 sp wsl --cd $PWD.Path
} else {
wt.exe -w 0 $args wsl --cd $PWD.Path
}
}
# ----------------------
# Git Aliases
# ----------------------

232
home/claude-settings.json Normal file
View File

@@ -0,0 +1,232 @@
{
"includeCoAuthoredBy": false,
"permissions": {
"allow": [
"WebSearch",
"WebFetch(domain:github.com)",
"WebFetch(domain:raw.githubusercontent.com)",
"WebFetch(domain:gitlab.com)",
"WebFetch(domain:docs.rs)",
"WebFetch(domain:lib.rs)",
"WebFetch(domain:crates.io)",
"WebFetch(domain:npmjs.com)",
"WebFetch(domain:pypi.org)",
"WebFetch(domain:typst.app)",
"WebFetch(domain:pixijs.com)",
"WebFetch(domain:developers.cloudflare.com)",
"WebFetch(domain:aws.amazon.com)",
"WebFetch(domain:cloud.google.com)",
"WebFetch(domain:azure.microsoft.com)",
"WebFetch(domain:learn.microsoft.com)",
"WebFetch(domain:devblogs.microsoft.com)",
"WebFetch(domain:slowli.github.io)",
"mcp__context7__resolve-library-id",
"mcp__context7__get-library-docs",
"mcp__linear-server__list_issues",
"mcp__linear-server__list_issue_labels",
"mcp__linear-server__create_issue_label",
"mcp__linear-server__update_issue",
"mcp__linear-server__list_teams",
"mcp__linear-server__list_projects",
"Bash(cargo --version:*)",
"Bash(cargo build:*)",
"Bash(cargo check:*)",
"Bash(cargo clippy:*)",
"Bash(cargo test:*)",
"Bash(cargo nextest run:*)",
"Bash(cargo tree:*)",
"Bash(cargo doc:*)",
"Bash(cargo llvm-cov:*)",
"Bash(cargo add:*)",
"Bash(cargo machete:*)",
"Bash(cargo udeps:*)",
"Bash(cargo audit:*)",
"Bash(cargo deny:*)",
"Bash(cargo outdated:*)",
"Bash(rustc --version:*)",
"Bash(sccache --version:*)",
"Bash(node --version:*)",
"Bash(npm --version:*)",
"Bash(npm run:*)",
"Bash(npm audit:*)",
"Bash(pnpm --version:*)",
"Bash(pnpm run:*)",
"Bash(pnpm list:*)",
"Bash(pnpm exec:*)",
"Bash(pnpm audit:*)",
"Bash(pnpm outdated:*)",
"Bash(bun --version:*)",
"Bash(bun run:*)",
"Bash(bun:*)",
"Bash(just --version:*)",
"Bash(just:*)",
"Bash(make --version:*)",
"Bash(make run:*)",
"Bash(make build:*)",
"Bash(git --version:*)",
"Bash(git status:*)",
"Bash(git log:*)",
"Bash(git show:*)",
"Bash(git diff:*)",
"Bash(git fetch:*)",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(git rm:*)",
"Bash(git mv:*)",
"Bash(gh --version:*)",
"Bash(gh run list:*)",
"Bash(gh run view:*)",
"Bash(gh pr list:*)",
"Bash(gh api:*)",
"Bash(docker --version:*)",
"Bash(docker ps:*)",
"Bash(docker logs:*)",
"Bash(docker inspect:*)",
"Bash(docker exec:*)",
"Bash(docker port:*)",
"Bash(docker build:*)",
"Bash(wrangler --version:*)",
"Bash(ls:*)",
"Bash(tree:*)",
"Bash(cat:*)",
"Bash(rg:*)",
"Bash(find:*)",
"Bash(mkdir:*)",
"Bash(cloc:*)",
"Bash(tokei:*)",
"Bash(curl:*)",
"Bash(netstat:*)",
"Bash(awk:*)",
"Bash(timeout:*)",
"Bash(wsl --list --verbose:*)",
"Bash(wsl dpkg:*)",
"Bash(wsl which:*)",
"Bash(wsl ps:*)",
"Bash(wsl find:*)",
"Bash(wsl ls:*)",
"Bash(wsl:*)",
"Bash(tasklist:*)",
"Bash(Select-String:*)",
"Bash(Select-Object:*)",
"Bash(findstr:*)",
"Bash(dir:*)",
"Bash(do)",
"Bash(then)",
"Bash(echo:*)",
"Bash(else)",
"Bash(fi)",
"Bash(done)",
"Bash(mise exec actionlint:*)",
"mcp__linear-server__create_issue"
],
"deny": [
"Bash(git push --force:*)",
"Bash(git push -f:*)",
"Bash(git push --force-with-lease:*)",
"Bash(git reset --hard:*)",
"Bash(git branch -D:*)",
"Bash(git clean -fd:*)",
"Bash(git clean -f:*)",
"Bash(git filter-branch:*)",
"Bash(git push --delete:*)",
"Bash(git push origin --delete:*)",
"Bash(git push origin :*)",
"Bash(gh repo delete:*)",
"Bash(gh repo archive:*)",
"Bash(gh secret delete:*)",
"Bash(gh release delete:*)",
"Bash(cargo clean:*)",
"Bash(cargo yank:*)",
"Bash(cargo uninstall --all:*)",
"Bash(wrangler delete:*)",
"Bash(wrangler secret delete:*)",
"Bash(rm -rf:*)",
"Bash(rmdir /s:*)",
"Bash(rd /s:*)",
"Bash(Remove-Item -Recurse -Force:*)",
"Bash(del /s:*)"
],
"ask": [
"Bash(cargo uninstall:*)",
"Bash(cargo update:*)",
"Bash(npm install:*)",
"Bash(npm update:*)",
"Bash(pnpm install:*)",
"Bash(pnpm add:*)",
"Bash(pnpm remove:*)",
"Bash(pnpm uninstall:*)",
"Bash(pnpm update:*)",
"Bash(pnpm store prune:*)",
"Bash(bun install:*)",
"Bash(bun add:*)",
"Bash(bun remove:*)",
"Bash(git checkout:*)",
"Bash(git pull:*)",
"Bash(git merge:*)",
"Bash(git merge --squash:*)",
"Bash(git branch -d:*)",
"Bash(git rebase:*)",
"Bash(git push:*)",
"Bash(gh pr close:*)",
"Bash(gh issue close:*)",
"Bash(gh run cancel:*)",
"Bash(wrangler publish:*)",
"Bash(wrangler deploy:*)",
"Bash(pnpm run deploy:*)",
"Bash(pnpm run build --production:*)",
"Bash(npm run deploy:*)",
"Bash(bun run deploy:*)",
"Bash(mv:*)",
"Bash(Move-Item:*)",
"Bash(rm:*)",
"Bash(del:*)"
],
"defaultMode": "default"
},
"model": "sonnet",
"statusLine": {
"type": "command",
"command": "bunx -y ccstatusline@latest",
"padding": 0
},
"enabledPlugins": {
"backend-development@claude-code-workflows": true,
"javascript-typescript@claude-code-workflows": true,
"security-guidance@claude-code-plugins": true,
"commit-commands@claude-code-plugins": true,
"feature-dev@claude-code-plugins": true,
"code-documentation@claude-code-workflows": true,
"debugging-toolkit@claude-code-workflows": true,
"git-pr-workflows@claude-code-workflows": true,
"full-stack-orchestration@claude-code-workflows": true,
"unit-testing@claude-code-workflows": true,
"tdd-workflows@claude-code-workflows": true,
"code-review-ai@claude-code-workflows": true,
"code-refactoring@claude-code-workflows": true,
"dependency-management@claude-code-workflows": true,
"error-debugging@claude-code-workflows": true,
"error-diagnostics@claude-code-workflows": true,
"deployment-strategies@claude-code-workflows": true,
"deployment-validation@claude-code-workflows": true,
"cicd-automation@claude-code-workflows": true,
"application-performance@claude-code-workflows": true,
"comprehensive-review@claude-code-workflows": true,
"performance-testing-review@claude-code-workflows": true,
"framework-migration@claude-code-workflows": true,
"codebase-cleanup@claude-code-workflows": true,
"database-design@claude-code-workflows": true,
"data-validation-suite@claude-code-workflows": true,
"api-scaffolding@claude-code-workflows": true,
"api-testing-observability@claude-code-workflows": true,
"documentation-generation@claude-code-workflows": true,
"game-development@claude-code-workflows": true,
"accessibility-compliance@claude-code-workflows": true,
"systems-programming@claude-code-workflows": true,
"functional-programming@claude-code-workflows": true,
"shell-scripting@claude-code-workflows": true,
"observability-monitoring@claude-code-workflows": true,
"database-cloud-optimization@claude-code-workflows": true,
"jvm-languages@claude-code-workflows": true
},
"alwaysThinkingEnabled": true
}

View File

@@ -113,4 +113,8 @@ fi
# If WSL, add SSH key on startup (once per WSL start)
{{- if .wsl }}
eval `keychain --quiet --eval --agents ssh ~/.ssh/id_rsa`
{{ end }}
{{ end }}
# SDKMAN initialization
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

View File

@@ -0,0 +1,208 @@
**Note**: Project-specific CLAUDE.md files take precedence for project-specific patterns.
{{- if and (eq .chezmoi.os "windows") (not .wsl) }}
## Shell Environment (Windows)
- **You are in Bash on Windows** (Git Bash / MSYS2)
- ❌ Do NOT use PowerShell commands (`Get-ChildItem`, `Select-Object`, `Move-Item`)
- ❌ Do NOT use CMD commands (`dir`, `copy`, `del`)
- ✅ Use standard Bash/Unix commands (`ls`, `cp`, `mv`, `rm`, `grep`)
- Prefer relative paths for simplicity
{{- else if .wsl }}
## Shell Environment (WSL)
- **You are in WSL (Windows Subsystem for Linux)**
- ✅ Use standard Linux/Bash commands (`ls`, `cp`, `mv`, `rm`, `grep`)
- ✅ Full access to Linux tooling and package managers
- ⚠️ Can access Windows filesystem via `/mnt/c/`, but prefer Linux paths
- ⚠️ Can call Windows executables (`.exe`), but prefer native Linux tools
- Prefer relative paths for simplicity
{{- else if eq .chezmoi.os "linux" }}
## Shell Environment (Linux)
- **You are in a standard Linux environment**
- ✅ Use standard Bash/Unix commands (`ls`, `cp`, `mv`, `rm`, `grep`)
- ✅ Full access to Linux tooling and package managers
- Prefer relative paths for simplicity
{{- end }}
## Build & Package Management
### General Principles
- **NEVER invoke `cargo clean`** - rarely necessary and wastes time
- **Avoid running full builds unless necessary** - prefer type checking and linting
- Run cargo build or any build commands with lots of output in 'quiet' mode, unless you require access to stacktrace/warnings/etc
- Alternatively, avoid running the command and stop the prompt there if you simply want the user to test and report back
### Dependency Management
- **Always use package manager commands** over manually editing manifest files:
- Rust: `cargo add`, `cargo remove`
- Node.js: `pnpm add`, `pnpm remove` (or npm/yarn as appropriate)
- This ensures lockfiles are updated correctly and consistently
- **Get the latest compatible version** unless there's a specific reason not to
- You can specify versions, but prefer letting the tool grab the latest
- Your knowledge cutoff means you often don't know the latest versions
### Check Commands
- Look for project-specific commands first (`just check`, `just test`, etc.)
- Always prefer project-specific check commands over raw `cargo` or `npm` commands
## Testing
### Test Organization
- **Integration/feature tests**: Place in `tests/` directory
- **Unit tests**: Place alongside the code they test directly (in same file or adjacent `tests.rs`)
- Always check project conventions before adding tests
### Running Tests
- Use project-specific test commands (e.g., `just test`) over raw `cargo test`
- Prefer `cargo nextest run` for executing tests (unless `just test` is available, regardless of what it invokes)
- Run tests after making changes to verify functionality
### Assertion Style (Rust)
When a project uses `assert2`:
- Use `assert2::assert!()` instead of `assert_eq!()`
- Use `assert2::let_assert!()` for pattern matching
- Use `assert2::check!()` for non-fatal assertions
## Code Style
### Rust
- Prefer direct imports when heavily used: `use glam::U16Vec2;` then `U16Vec2::new()`
- Prefer iterators and combinators over for loops when idiomatic
- Prefer slices (`&[T]`) for read-only parameters over `&Vec<T>`
- Use `#[inline]` for hot-path functions
### TypeScript
- **Prefer absolute imports** (`@/...`) over relative imports when available
- Not always necessary or possible - use judgment
- Clearer and easier to refactor when the pattern exists in the project
- Prefer functional programming patterns (map, filter, reduce) over for loops when idiomatic
### General Pattern
- **Write idiomatic code for the language**:
- Rust: iterators, combinators, Option/Result patterns
- TypeScript: functional patterns, modern ES6+ features
- Check existing code patterns before implementing
## Comments & Documentation
- Write comments that explain **WHY**, not **WHAT**
- **Never reference old implementations, migrations, or refactoring history**
- **Never add banner comments** (`===`, `-----`, etc.)
- Update project CLAUDE.md when making architectural decisions
- Examples of bad comments to avoid:
- "Refactored from previous version that used X approach." (never mention past implementations)
- "This function was changed to improve performance." (utterly useless, belongs in a commit message potentially, but not code!)
- "Logging removed for cleaner output." (also useless, belongs in commit message if anything)
## Git Commits
### Safety & Best Practices
- **Do NOT add co-authoring or attribution to Claude Code/AI**
- **Be very careful with commit history**:
- Avoid rewriting history unless explicitly prompted by user
- **Check if commits actually went through** when hooks fail
- **Never accidentally amend previous commits** when user meant to create new one
- If pre-commit or hooks fail, verify the commit status before retrying
- Write concise commit messages focusing on "why" rather than "what"
- If writing the first commit, assume conventional commit style unless user specifies otherwise.
- For subsequent commits, follow the project's existing commit style.
- Scale the length and detail of the commit message to the impact of the changes.
- A simple rename of a function or type may interact with many files, but it does not deserve a length message.
- A complex feature addition or refactor deserves a more detailed message explaining the reasoning. Still, keep things concise.
- Never include details like "All tests pass, 92% coverage. A few warnings."
## AI Development Workflow
### Standard Workflow
`modify code → check → test → hand off to user`
1. Make code changes
2. Run project-specific check commands
3. Run tests if applicable
4. **Hand off to user** - do NOT run dev servers or long-running processes
5. Wait for user feedback
### Codebase Exploration
- **Avoid super complex bash/sed/awk commands** when exploring
- Use existing tools (Read, Glob, Grep) to manually explore instead
- Check for existing libraries, frameworks, and code patterns before creating new utilities/APIs
### Question Tool Usage
- **Use for complex tasks and design decisions**:
- Architectural choices
- Multiple implementation approaches
- Feature design options
- Clarifying & confirming important requirements, especially vague or conflicting ones
- **Do NOT use for trivial details**:
- Variable naming
- Minor formatting choices
- **Prefer multi-select when appropriate**, single-select when mutually exclusive
- User appreciates being consulted on larger, more abstract decisions
### When NOT to Build/Run
- ❌ After type checking passes - building is unnecessary
- ❌ Dev servers (`pnpm dev`, `cargo run`, etc.)
- ❌ Long-running processes or interactive tools
- ✅ Only build when user explicitly requests or verifying build config
## Tool Usage
### Prefer Specialized Tools Over Bash
- Read tool for reading files (not `cat`, `head`, `tail`)
- Edit tool for editing files (not `sed`, `awk`)
- Write tool for creating files (not `echo >`)
- Glob tool for finding files (not `find`, `ls`)
- Grep tool for searching (not `grep`, `rg`)
- Bash ONLY for actual system commands and terminal operations
## Security & Error Handling
- Watch for security vulnerabilities: command injection, XSS, SQL injection, OWASP Top 10
- If you write insecure code, **immediately fix it**
- Validate all external inputs
- Use appropriate error types for the language
## Quick Reference
### After Making Changes
```bash
# 1. Check (find project-specific command)
just check # or equivalent
# 2. Run tests (if applicable)
just test # or equivalent
# 3. STOP - hand off to user for testing
```
### What to Avoid
- Don't run dev servers, builds, or interactive processes yourself
- Don't use complex bash pipelines when simpler tools exist
- Don't manually edit manifests when package manager commands exist
- Don't assume commits went through when hooks fail
---
**Remember**: Check for project-specific CLAUDE.md files that override these global guidelines.

View File

@@ -0,0 +1 @@
{{ .chezmoi.sourceDir }}/claude-settings.json

View File

@@ -0,0 +1,3 @@
{{ if (and (eq .chezmoi.os "linux") (not .wsl)) }}
{{ .chezmoi.sourceDir }}/.config-source/vscode/keybindings.linux.json
{{ end }}

View File

@@ -0,0 +1,3 @@
{{ if (and (eq .chezmoi.os "linux") (not .wsl)) }}
{{ .chezmoi.sourceDir }}/.config-source/vscode/settings.linux.json
{{ end }}

View File

@@ -0,0 +1,3 @@
{{ if (and (eq .chezmoi.os "linux") (not .wsl)) }}
{{ .chezmoi.sourceDir }}/.config-source/cursor/keybindings.linux.json
{{ end }}

View File

@@ -0,0 +1,3 @@
{{ if (and (eq .chezmoi.os "linux") (not .wsl)) }}
{{ .chezmoi.sourceDir }}/.config-source/cursor/settings.linux.json
{{ end }}

View File

@@ -0,0 +1,267 @@
## where to store your database, default is your system data directory
## linux/mac: ~/.local/share/atuin/history.db
## windows: %USERPROFILE%/.local/share/atuin/history.db
# db_path = "~/.history.db"
## where to store your encryption key, default is your system data directory
## linux/mac: ~/.local/share/atuin/key
## windows: %USERPROFILE%/.local/share/atuin/key
# key_path = "~/.key"
## where to store your auth session token, default is your system data directory
## linux/mac: ~/.local/share/atuin/session
## windows: %USERPROFILE%/.local/share/atuin/session
# session_path = "~/.session"
## date format used, either "us" or "uk"
# dialect = "us"
## default timezone to use when displaying time
## either "l", "local" to use the system's current local timezone, or an offset
## from UTC in the format of "<+|->H[H][:M[M][:S[S]]]"
## for example: "+9", "-05", "+03:30", "-01:23:45", etc.
# timezone = "local"
## enable or disable automatic sync
auto_sync = true
## enable or disable automatic update checks
# update_check = true
## address of the sync server
sync_address = "https://atuin.imfucked.lol"
## how often to sync history. note that this is only triggered when a command
## is ran, so sync intervals may well be longer
## set it to 0 to sync after every command
# sync_frequency = "10m"
## which search mode to use
## possible values: prefix, fulltext, fuzzy, skim
# search_mode = "fuzzy"
## which filter mode to use by default
## possible values: "global", "host", "session", "directory", "workspace"
## consider using search.filters to customize the enablement and order of filter modes
# filter_mode = "global"
## With workspace filtering enabled, Atuin will filter for commands executed
## in any directory within a git repository tree (default: false).
##
## To use workspace mode by default when available, set this to true and
## set filter_mode to "workspace" or leave it unspecified and
## set search.filters to include "workspace" before other filter modes.
# workspaces = false
## which filter mode to use when atuin is invoked from a shell up-key binding
## the accepted values are identical to those of "filter_mode"
## leave unspecified to use same mode set in "filter_mode"
# filter_mode_shell_up_key_binding = "global"
## which search mode to use when atuin is invoked from a shell up-key binding
## the accepted values are identical to those of "search_mode"
## leave unspecified to use same mode set in "search_mode"
# search_mode_shell_up_key_binding = "fuzzy"
## which style to use
## possible values: auto, full, compact
# style = "auto"
## the maximum number of lines the interface should take up
## set it to 0 to always go full screen
# inline_height = 0
## Invert the UI - put the search bar at the top , Default to `false`
# invert = false
## enable or disable showing a preview of the selected command
## useful when the command is longer than the terminal width and is cut off
# show_preview = true
## what to do when the escape key is pressed when searching
## possible values: return-original, return-query
# exit_mode = "return-original"
## possible values: emacs, subl
# word_jump_mode = "emacs"
## characters that count as a part of a word
# word_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
## number of context lines to show when scrolling by pages
# scroll_context_lines = 1
## use ctrl instead of alt as the shortcut modifier key for numerical UI shortcuts
## alt-0 .. alt-9
# ctrl_n_shortcuts = false
## default history list format - can also be specified with the --format arg
# history_format = "{time}\t{command}\t{duration}"
## prevent commands matching any of these regexes from being written to history.
## Note that these regular expressions are unanchored, i.e. if they don't start
## with ^ or end with $, they'll match anywhere in the command.
## For details on the supported regular expression syntax, see
## https://docs.rs/regex/latest/regex/#syntax
# history_filter = [
# "^secret-cmd",
# "^innocuous-cmd .*--secret=.+",
# ]
## prevent commands run with cwd matching any of these regexes from being written
## to history. Note that these regular expressions are unanchored, i.e. if they don't
## start with ^ or end with $, they'll match anywhere in CWD.
## For details on the supported regular expression syntax, see
## https://docs.rs/regex/latest/regex/#syntax
# cwd_filter = [
# "^/very/secret/area",
# ]
## Configure the maximum height of the preview to show.
## Useful when you have long scripts in your history that you want to distinguish
## by more than the first few lines.
# max_preview_height = 4
## Configure whether or not to show the help row, which includes the current Atuin
## version (and whether an update is available), a keymap hint, and the total
## amount of commands in your history.
# show_help = true
## Configure whether or not to show tabs for search and inspect
# show_tabs = true
## Configure whether or not the tabs row may be auto-hidden, which includes the current Atuin
## tab, such as Search or Inspector, and other tabs you may wish to see. This will
## only be hidden if there are fewer than this count of lines available, and does not affect the use
## of keyboard shortcuts to switch tab. 0 to never auto-hide, default is 8 (lines).
## This is ignored except in `compact` mode.
# auto_hide_height = 8
## Defaults to true. This matches history against a set of default regex, and will not save it if we get a match. Defaults include
## 1. AWS key id
## 2. Github pat (old and new)
## 3. Slack oauth tokens (bot, user)
## 4. Slack webhooks
## 5. Stripe live/test keys
# secrets_filter = true
## Defaults to true. If enabled, upon hitting enter Atuin will immediately execute the command. Press tab to return to the shell and edit.
# This applies for new installs. Old installs will keep the old behaviour unless configured otherwise.
enter_accept = false
## Defaults to "emacs". This specifies the keymap on the startup of `atuin
## search`. If this is set to "auto", the startup keymap mode in the Atuin
## search is automatically selected based on the shell's keymap where the
## keybinding is defined. If this is set to "emacs", "vim-insert", or
## "vim-normal", the startup keymap mode in the Atuin search is forced to be
## the specified one.
# keymap_mode = "auto"
## Cursor style in each keymap mode. If specified, the cursor style is changed
## in entering the cursor shape. Available values are "default" and
## "{blink,steady}-{block,underline,bar}".
# keymap_cursor = { emacs = "blink-block", vim_insert = "blink-block", vim_normal = "steady-block" }
# network_connect_timeout = 5
# network_timeout = 5
## Timeout (in seconds) for acquiring a local database connection (sqlite)
# local_timeout = 5
## Set this to true and Atuin will minimize motion in the UI - timers will not update live, etc.
## Alternatively, set env NO_MOTION=true
# prefers_reduced_motion = false
[stats]
## Set commands where we should consider the subcommand for statistics. Eg, kubectl get vs just kubectl
# common_subcommands = [
# "apt",
# "cargo",
# "composer",
# "dnf",
# "docker",
# "git",
# "go",
# "ip",
# "kubectl",
# "nix",
# "nmcli",
# "npm",
# "pecl",
# "pnpm",
# "podman",
# "port",
# "systemctl",
# "tmux",
# "yarn",
# ]
## Set commands that should be totally stripped and ignored from stats
# common_prefix = ["sudo"]
## Set commands that will be completely ignored from stats
# ignored_commands = [
# "cd",
# "ls",
# "vi"
# ]
[keys]
# Defaults to true. If disabled, using the up/down key won't exit the TUI when scrolled past the first/last entry.
# scroll_exits = true
[sync]
# Enable sync v2 by default
# This ensures that sync v2 is enabled for new installs only
# In a later release it will become the default across the board
records = true
[preview]
## which preview strategy to use to calculate the preview height (respects max_preview_height).
## possible values: auto, static
## auto: length of the selected command.
## static: length of the longest command stored in the history.
## fixed: use max_preview_height as fixed height.
# strategy = "auto"
[daemon]
## Enables using the daemon to sync. Requires the daemon to be running in the background. Start it with `atuin daemon`
# enabled = false
## How often the daemon should sync in seconds
# sync_frequency = 300
## The path to the unix socket used by the daemon (on unix systems)
## linux/mac: ~/.local/share/atuin/atuin.sock
## windows: Not Supported
# socket_path = "~/.local/share/atuin/atuin.sock"
## Use systemd socket activation rather than opening the given path (the path must still be correct for the client)
## linux: false
## mac/windows: Not Supported
# systemd_socket = false
## The port that should be used for TCP on non unix systems
# tcp_port = 8889
# [theme]
## Color theme to use for rendering in the terminal.
## There are some built-in themes, including the base theme ("default"),
## "autumn" and "marine". You can add your own themes to the "./themes" subdirectory of your
## Atuin config (or ATUIN_THEME_DIR, if provided) as TOML files whose keys should be one or
## more of AlertInfo, AlertWarn, AlertError, Annotation, Base, Guidance, Important, and
## the string values as lowercase entries from this list:
## https://ogeon.github.io/docs/palette/master/palette/named/index.html
## If you provide a custom theme file, it should be called "NAME.toml" and the theme below
## should be the stem, i.e. `theme = "NAME"` for your chosen NAME.
# name = "autumn"
## Whether the theme manager should output normal or extra information to help fix themes.
## Boolean, true or false. If unset, left up to the theme manager.
# debug = true
[search]
## The list of enabled filter modes, in order of priority.
## The "workspace" mode is skipped when not in a workspace or workspaces = false.
## Default filter mode can be overridden with the filter_mode setting.
# filters = [ "global", "host", "session", "workspace", "directory" ]

View File

@@ -0,0 +1,92 @@
# Fish abbreviations (aliases that expand in place)
# Managed by chezmoi
# System
abbr -a sctl 'systemctl'
abbr -a sctlu 'systemctl --user'
abbr -a jctl 'journalctl'
# Core aliases - lsd (modern ls replacement)
abbr -a ls 'lsd'
abbr -a l 'lsd -l'
abbr -a la 'lsd -a'
abbr -a lla 'lsd -la'
abbr -a lt 'lsd --tree'
abbr -a ll 'lsd -AlFh'
abbr -a nano 'micro'
abbr -a lg 'lazygit'
abbr -a vim 'nvim'
abbr -a chlg 'lazygit --path ~/.local/share/chezmoi'
abbr -a es 'exec fish'
# Chezmoi
abbr -a cha 'chezmoi apply --interactive'
abbr -a ch 'chezmoi'
# Remote Management
abbr -a romanlog "ssh roman 'tail -F /var/log/syslog' --lines 100"
# Other aliases
abbr -a gpt 'chatgpt'
abbr -a copilot 'gh copilot'
abbr -a suggest 'gh copilot suggest -t shell'
abbr -a spt 'spotify_player'
abbr -a gitalias 'alias | grep "git "'
abbr -a mousefix 'sudo udevadm trigger'
abbr -a bw_login 'set -gx BW_SESSION (bw unlock --raw)'
# Clipboard aliases
{{ if not .wsl -}}
abbr -a copy 'xsel -ib'
abbr -a paste 'xsel -b'
abbr -a cdp 'cd (xsel -b)'
{{- else -}}
abbr -a copy 'clip.exe'
abbr -a paste 'powershell.exe -noprofile Get-Clipboard'
abbr -a cdp 'cd (xsel -b)'
{{- end }}
# Bluetooth device aliases
abbr -a budsOff 'bluetoothctl block 60:3A:AF:75:61:80'
abbr -a budsOn 'bluetoothctl unblock 60:3A:AF:75:61:80 && bluetoothctl connect 60:3A:AF:75:61:80'
abbr -a maestroOff 'bluetoothctl block AC:BF:71:66:FE:B2'
abbr -a maestroOn 'bluetoothctl unblock AC:BF:71:66:FE:B2 && bluetoothctl connect AC:BF:71:66:FE:B2'
# Git Aliases
abbr -a ga 'git add'
abbr -a gaa 'git add .'
abbr -a gaaa 'git add --all'
abbr -a gau 'git add --update'
abbr -a gb 'git branch'
abbr -a gbd 'git branch --delete'
abbr -a gc 'git commit'
abbr -a gcm 'git commit --message'
abbr -a gcf 'git commit --fixup'
abbr -a gco 'git checkout'
abbr -a gcob 'git checkout -b'
abbr -a gcom 'git checkout master'
abbr -a gcos 'git checkout staging'
abbr -a gcod 'git checkout develop'
abbr -a gd 'git diff'
abbr -a gda 'git diff HEAD'
abbr -a glg 'git log --graph --oneline --decorate --all'
abbr -a gld 'git log --pretty=format:"%h %ad %s" --date=short --all'
abbr -a gm 'git merge --no-ff'
abbr -a gma 'git merge --abort'
abbr -a gmc 'git merge --continue'
abbr -a gp 'git pull'
abbr -a gpr 'git pull --rebase'
abbr -a gr 'git rebase'
abbr -a gs 'git status'
abbr -a gss 'git status --short'
abbr -a gst 'git stash'
abbr -a gsta 'git stash apply'
abbr -a gstd 'git stash drop'
abbr -a gstl 'git stash list'
abbr -a gstp 'git stash pop'
abbr -a gsts 'git stash save'
# KiTTY SSH kitten
if test "$TERM" = "xterm-kitty"
abbr -a ssh 'kitty +kitten ssh'
end

View File

View File

@@ -0,0 +1,4 @@
# Activate mise automatically on shell startup
if command -q mise
mise activate fish | source
end

View File

@@ -0,0 +1,38 @@
# Fish shell configuration
# Managed by chezmoi
# Disable greeting
set -g fish_greeting
{{- if .wsl }}
if status is-login
and status is-interactive
keychain --quiet --agents ssh --eval ~/.ssh/id_rsa | source
end
{{- end }}
# Common shared configuration (environment variables, PATH, tool setup)
{{ template "scripts/commonrc.fish.tmpl" dict "data" . }}
# Chezmoi shell completion
{{ completion "fish" }}
# VS Code / Cursor shell integration
if test "$TERM_PROGRAM" = "vscode"
if command -q code
string replace -r '^' '' (code --locate-shell-integration-path fish) | source
else if command -q cursor
string replace -r '^' '' (cursor --locate-shell-integration-path fish) | source
end
end
# fzf key bindings (if fzf.fish plugin installed via Fisher)
# Note: This is handled automatically by Fisher plugin
# Load custom functions from ~/.config/fish/functions/
# (Fish does this automatically, no explicit sourcing needed)
# Load abbreviations
if test -f ~/.config/fish/conf.d/abbr.fish
source ~/.config/fish/conf.d/abbr.fish
end

View File

@@ -0,0 +1,4 @@
#
jorgebucaran/fisher
ilancosman/tide@v6
patrickf1/fzf.fish

View File

@@ -0,0 +1,12 @@
# Defer hishtory initialization to first prompt
# This runs after startup but before user interaction
function __init_hishtory --on-event fish_prompt
# Remove this function after first run
functions --erase __init_hishtory
# Only initialize if hishtory config exists
if test -f $HOME/.hishtory/config.fish
set -gx HISHTORY_SERVER "https://hsh.{{ dopplerProjectJson.PRIVATE_DOMAIN }}"
source $HOME/.hishtory/config.fish
end
end

View File

@@ -0,0 +1,18 @@
# Lazy-load chatgpt completions on first use
function chatgpt --wraps chatgpt
# Initialize chatgpt completions only once
if not set -q __chatgpt_initialized
set -g __chatgpt_initialized 1
# Generate and source completions
if command -q chatgpt
command chatgpt --set-completions fish | source
else
echo "chatgpt is not installed" >&2
return 1
end
end
# Execute the actual chatgpt command
command chatgpt $argv
end

View File

@@ -0,0 +1,24 @@
function chcode --description "Edit chezmoi files in VS Code"
set -gx EDITOR "code --wait"
# Check if --watch is in arguments
set -l has_watch false
set -l has_file false
for arg in $argv
if test "$arg" = "--watch"
set has_watch true
else if not string match -q -- '-*' $arg
set has_file true
end
end
# If --watch is provided but no file, show error
if test $has_watch = true -a $has_file = false
echo "--watch requires a file to be provided, directories aren't supported with watch mode"
return 1
end
# Execute chezmoi edit with all arguments
chezmoi edit $argv
end

View File

@@ -0,0 +1,12 @@
function chfix --description "chmod +x the last command (if it's a file)"
# Get the last command from Fish history
set -l last_command (history --max 1 | string trim)
if test -f "$last_command"
chmod +x "$last_command"
echo "Made executable: $last_command"
else
echo "Error: $last_command is not a valid file"
return 1
end
end

View File

@@ -0,0 +1,6 @@
function chshow --description "Show rendered chezmoi template via fzf"
set -l target (find {{ .chezmoi.sourceDir | quote }} -name "*.tmpl" -type f | fzf)
if test -n "$target"
cat $target | chezmoi execute-template
end
end

View File

@@ -0,0 +1,19 @@
# Lazy-load thefuck on first use
function fuck --description "Correct your previous console command"
# Initialize thefuck only once
if not set -q __thefuck_initialized
set -g __thefuck_initialized 1
# Run thefuck alias generation
if command -q thefuck
thefuck --alias | source
else
echo "thefuck is not installed" >&2
return 1
end
end
# Execute the fuck command (which thefuck creates)
# After initialization, the actual fuck function will be defined
fuck $argv
end

View File

@@ -0,0 +1,3 @@
function gi --description "Generate .gitignore from gitignore.io"
curl -sL https://www.toptal.com/developers/gitignore/api/$argv
end

View File

@@ -0,0 +1,3 @@
function glf --description "Git log find by commit message"
git log --all --grep="$argv"
end

View File

@@ -0,0 +1,18 @@
# Lazy-load just completions on first use
function just --wraps just
# Initialize just completions only once
if not set -q __just_initialized
set -g __just_initialized 1
# Generate and source completions
if command -q just
command just --completions fish | source
else
echo "just is not installed" >&2
return 1
end
end
# Execute the actual just command
command just $argv
end

View File

@@ -0,0 +1,7 @@
function lastRuns --description "Show last N GitHub Actions runs"
set -l runs 10
if test (count $argv) -gt 0
set runs $argv[1]
end
gh run list -L $runs --json name,url | jq -c '.[] | [.name, .url] | join(" ")' -r
end

View File

@@ -0,0 +1,4 @@
function mktouch --description "Touch a file while creating parent directories"
mkdir -p (dirname $argv[1])
touch $argv[1]
end

View File

@@ -0,0 +1,23 @@
# Lazy-load pyenv on first use
function pyenv --wraps pyenv
# Initialize pyenv only once
if not set -q __pyenv_initialized
set -g __pyenv_initialized 1
# Add to PATH if not already there
if test -d $PYENV_ROOT/bin; and not contains $PYENV_ROOT/bin $PATH
set -gx PATH $PYENV_ROOT/bin $PATH
end
# Run pyenv init
command pyenv init - fish | source
# pyenv-virtualenv if available
if command -q pyenv-virtualenv-init
command pyenv virtualenv-init - fish | source
end
end
# Execute the actual pyenv command
command pyenv $argv
end

View File

@@ -0,0 +1,4 @@
function sdk --description 'SDKMAN wrapper for Fish shell'
# Run sdk commands in a Bash subshell
bash -c "source '$HOME/.sdkman/bin/sdkman-init.sh' && sdk $argv"
end

View File

@@ -0,0 +1,13 @@
function tempCode --description "Create a temporary file and open in VS Code"
if test (count $argv) -eq 0
echo "Must provide filetype argument (ex: py, .xml, html)"
return 1
end
# Remove preceding dot, then re-add to support both '.py' and 'py' as arguments
set -l extension (string replace -r '^\.' '' $argv[1])
set -l temp_file (mktemp /tmp/XXXXXXXXXXXX_(uuidgen).$extension)
echo "Temporary $argv[1] file created at $temp_file"
code --file-uri "file://$temp_file"
end

View File

@@ -0,0 +1,18 @@
# Lazy-load zoxide on first use of z command
function z --description "zoxide smart cd"
# Initialize zoxide only once
if not set -q __zoxide_initialized
set -g __zoxide_initialized 1
# Run zoxide init
if command -q zoxide
zoxide init fish | source
else
echo "zoxide is not installed" >&2
return 1
end
end
# Execute the actual z command (defined by zoxide init)
__zoxide_z $argv
end

View File

@@ -0,0 +1,18 @@
# Lazy-load zoxide on first use of zi command
function zi --description "zoxide interactive smart cd"
# Initialize zoxide only once (shared flag with z.fish)
if not set -q __zoxide_initialized
set -g __zoxide_initialized 1
# Run zoxide init
if command -q zoxide
zoxide init fish | source
else
echo "zoxide is not installed" >&2
return 1
end
end
# Execute the actual zi command (defined by zoxide init)
__zoxide_zi $argv
end

View File

@@ -7,7 +7,7 @@
[user]
name = Ryan Walters
email = ryan@walters.to
signingkey = 39538EC79ACF2597
signingkey = 301511AAD64FA365
{{ if eq .chezmoi.os "windows" }}
{{ else }}
{{ end }}

View File

@@ -7,7 +7,7 @@
[user]
name = Xevion
email = xevion@xevion.dev
signingkey = C217005CF3C00672
# No GPG key available for this email - signing disabled
{{ if eq .chezmoi.os "windows" }}
{{ else }}
{{ end }}

View File

@@ -4,3 +4,10 @@ include current-theme.conf
# END_KITTY_THEME
enable_audio_bell no
font_family MesloLGS NF
# Disable command finish notifications (fixes cryptic "4;0;0" notifications)
notify_on_cmd_finish never
# Claude Code: Enable Shift+Enter for multi-line prompts
map shift+enter send_text all \n

View File

@@ -0,0 +1 @@
{{ .chezmoi.sourceDir }}/.config-source/lazygit/config.yml

View File

@@ -1,16 +1,18 @@
# Git Configuration - Platform-aware
# Managed by chezmoi
{{ if eq .chezmoi.os "windows" }}
# Windows Configuration
{{ if or (eq .chezmoi.os "windows") .wsl }}
# Windows/WSL Configuration - Ryan Walters (Professional)
[user]
name = Ryan Walters
email = ryan@walters.to
signingkey = 39538EC79ACF2597
signingkey = 301511AAD64FA365
[commit]
gpgsign = true
{{ if eq .chezmoi.os "windows" }}
# Windows-specific: Use GPG4win
[gpg]
program = C:\\Users\\Xevion\\scoop\\apps\\gpg4win\\current\\GnuPG\\bin\\gpg.exe
@@ -21,16 +23,26 @@
[credential "https://gist.github.com"]
helper =
helper = !'C:\\Program Files\\GitHub CLI\\gh.exe' auth git-credential
{{ else }}
# WSL-specific: Use Windows GPG via symlink
[gpg]
program = /usr/local/bin/gpg
[credential "https://github.com"]
helper =
helper = !/usr/bin/gh auth git-credential
[credential "https://gist.github.com"]
helper =
helper = !/usr/bin/gh auth git-credential
{{ end }}
{{ else }}
# Linux/macOS Configuration
# Native Linux/macOS Configuration - Xevion (Personal)
[user]
name = Xevion
email = xevion@xevion.dev
signingkey = C217005CF3C00672
[commit]
gpgsign = true
# No GPG signing - no key available for this identity
[credential "https://github.com"]
helper =
@@ -45,6 +57,16 @@
# Common configuration for all platforms
[core]
editor = micro
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true # use n and N to move between diff sections
[merge]
conflictStyle = zdiff3
[init]
defaultBranch = master

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,54 +0,0 @@
# If WSL, add SSH key on startup (once per WSL start)
{{- if .wsl }}
eval `keychain --quiet --eval --agents ssh ~/.ssh/id_rsa`
{{ end }}
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n] confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
export ZSH_COMPDUMP=$ZSH/cache/.zcompdump-$HOST
export ZSH="$HOME/.oh-my-zsh"
# zstyle ':omz:update' mode auto # update automatically without asking
# zstyle ':omz:update' frequency 7
DISABLE_AUTO_UPDATE="true" # required for chezmoi external management
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )
# CASE_SENSITIVE="true"
# HYPHEN_INSENSITIVE="true"
# DISABLE_MAGIC_FUNCTIONS="true"
# DISABLE_LS_COLORS="true"
# DISABLE_AUTO_TITLE="true"
# ENABLE_CORRECTION="true"
# COMPLETION_WAITING_DOTS="true"
# DISABLE_UNTRACKED_FILES_DIRTY="true"
# HIST_STAMPS="mm/dd/yyyy"
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="powerlevel10k/powerlevel10k"
# TODO: Switch from 'asdf' to 'mise'
plugins=(
git gh fzf docker-compose docker deno chezmoi asdf yarn golang sudo zoxide bun npm brew zsh-autosuggestions F-Sy-H thefuck
{{- if .wsl -}}
{{ " kitty" }}
{{- end}}
)
source $ZSH/oh-my-zsh.sh
[[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh # configure with `p10k configure`
# {{ if lookPath "bw" -}} eval "$(bw completion --shell zsh); compdef _bw bw;" {{ end }}
{{/* Common shared aliases, scripts, & shell setup details. */ -}}
{{ template "scripts/commonrc.sh.tmpl" dict "data" . "shell" "zsh" }}
{{/* Chezmoi's shell completion */ -}}
{{ completion "zsh" }}
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"

0
home/hooks/.update_pre.ts Normal file → Executable file
View File

View File

@@ -0,0 +1,38 @@
{{- if .wsl -}}
#!/bin/bash
set -eu
# WSL GPG Setup - Link to Windows GPG for native pinentry support
# This script creates a system-level symlink from /usr/local/bin/gpg to Windows gpg.exe
# This allows WSL to use Windows' native Qt5 pinentry GUI for passphrase prompts
GPG_WINDOWS="/mnt/c/Users/{{ .chezmoi.username }}/scoop/apps/gpg4win/current/GnuPG/bin/gpg.exe"
GPG_LINK="/usr/local/bin/gpg"
# Check if Windows GPG exists
if [ ! -f "$GPG_WINDOWS" ]; then
echo "WARNING: Windows GPG not found at $GPG_WINDOWS"
echo " Skipping GPG symlink setup"
exit 0
fi
# Check if symlink already exists and is correct
if [ -L "$GPG_LINK" ]; then
CURRENT_TARGET=$(readlink "$GPG_LINK")
if [ "$CURRENT_TARGET" = "$GPG_WINDOWS" ]; then
echo "GPG symlink already configured correctly"
exit 0
else
echo "Updating GPG symlink (was pointing to: $CURRENT_TARGET)"
fi
else
echo "Creating GPG symlink to Windows GPG"
fi
# Create/update the symlink (requires sudo)
echo "Note: This requires sudo to create a symlink in /usr/local/bin"
sudo ln -sf "$GPG_WINDOWS" "$GPG_LINK"
echo "✓ GPG symlink configured: $GPG_LINK -> $GPG_WINDOWS"
echo " WSL will now use Windows GPG with native GUI pinentry"
{{- end -}}

View File

@@ -14,9 +14,18 @@ sudo apt install -y xclip xsel
{{ end }}
{{/* TODO: Add basic yes/no prompts before installing packages */ -}}
if ! type -P zsh; then
echo "chezmoi: Installing zsh"
sudo apt install zsh
# Install Fisher (Fish plugin manager) and plugins from fish_plugins file
if type -P fish; then
if [ ! -f ~/.config/fish/functions/fisher.fish ]; then
echo "chezmoi: Installing Fisher (Fish plugin manager)"
fish -c "curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher"
fi
# Update plugins from fish_plugins file
if [ -f ~/.config/fish/fish_plugins ]; then
echo "chezmoi: Updating Fish plugins from fish_plugins file"
fish -c "fisher update"
fi
fi
# Install micro (+ register as text editor)
@@ -27,9 +36,8 @@ if ! type -P micro; then
sudo mv ./micro /usr/bin/micro
fi
{{/* libpq-dev libssh-dev libsqlite3-dev */ -}}
echo "chezmoi: Installing apt packages"
PACKAGES='git fzf zsh fish sqlite curl ripgrep jq' # Install and/or update
PACKAGES='git fzf fish sqlite curl ripgrep jq' # Install and/or update
sudo apt install -y $PACKAGES
INSTALL_ONLY_PACKAGES='iperf3 unzip p7zip-full nmap reptyr btop' # Install only if missing
@@ -75,6 +83,27 @@ if ! type -P chatgpt; then
sudo mv chatgpt /usr/local/bin/
fi
# Set Fish as default shell
if type -P fish; then
FISH_PATH=$(which fish)
CURRENT_SHELL=$(getent passwd "$USER" | cut -d: -f7)
if [ "$CURRENT_SHELL" != "$FISH_PATH" ]; then
echo "chezmoi: Setting Fish as default shell"
# Add fish to /etc/shells if not already present
if ! grep -q "^$FISH_PATH$" /etc/shells; then
echo "$FISH_PATH" | sudo tee -a /etc/shells
fi
# Change default shell
sudo chsh -s "$FISH_PATH" "$USER"
echo "chezmoi: Default shell changed to Fish. Please log out and back in for changes to take effect."
else
echo "chezmoi: Fish is already the default shell"
fi
fi
{{- else if eq .chezmoi.os "darwin" -}}
#!/bin/sh
brew install ripgrep

View File

@@ -0,0 +1,3 @@
{{- if .wsl -}}
/mnt/c/Users/Xevion/AppData/Roaming/gnupg
{{- end -}}

View File

@@ -1,3 +1,4 @@
nodejs 22.11.0
nodejs latest
pnpm latest
zoxide 0.9.6
deno 2.2.2
deno 2.2.2