Compare commits

...

14 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
22 changed files with 1160 additions and 27 deletions

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:**
@@ -82,9 +89,11 @@ 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

View File

@@ -18,6 +18,7 @@
- [ ] 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
@@ -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

@@ -1,5 +1,6 @@
hooks
tool-versions
claude-settings.json
{{/* WSL Only Files */}}
{{ if (not .wsl) }}
@@ -35,4 +36,4 @@ key.txt
Documents/
AppData/
{{ end }}
{{ 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

@@ -46,7 +46,7 @@ if test -f /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 "$brew_bin" -nt "$brew_cache"
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
@@ -98,4 +98,26 @@ end
## 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

@@ -95,16 +95,48 @@ fi
. $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
export DOTNET_ROOT="$HOME/.dotnet"
export PATH="$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools"
fi
# atuin
if [ -d "$HOME/.atuin" ]; then
. "$HOME/.atuin/bin/env"
fi

View File

@@ -149,7 +149,7 @@
"key": "shift+enter",
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "\\\r\n"
"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

@@ -12,7 +12,6 @@
// Workbench Settings
"workbench.startupEditor": "none",
"workbench.tree.indent": 24,
"workbench.preferredDarkColorTheme": "Default Light Modern",
"workbench.preferredLightColorTheme": "Cursor Light",
"workbench.iconTheme": "material-icon-theme",

View File

@@ -39,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,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,4 @@
# Activate mise automatically on shell startup
if command -q mise
mise activate fish | source
end

View File

@@ -1,10 +1,4 @@
# Fish shell plugins managed by Fisher
# https://github.com/jorgebucaran/fisher
#
# To install all plugins: fisher update
# To add a plugin: fisher install <plugin>
# To remove a plugin: fisher remove <plugin>
jorgebucaran/fisher
ilancosman/tide@v6
patrickf1/fzf.fish

View File

@@ -1,11 +0,0 @@
# Lazy-load mise on first use
function mise --wraps mise
# Initialize mise only once
if not set -q __mise_initialized
set -g __mise_initialized 1
command mise activate fish | source
end
# Execute the actual mise command
command mise $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

@@ -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

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

View File

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