Compare commits

...

51 Commits

Author SHA1 Message Date
Jim Myhrberg
919c5d48de feat(bin): add ollama-for-gitbutler wrapper script
Run a dedicated ollama instance for GitButler on a separate port
(11435) with permissive origins and long keep-alive, avoiding
conflicts with any primary ollama server.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 10:13:21 +00:00
d3ef296e84 feat(mise/tools): add convex CLI
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 23:29:33 +00:00
39f2d3094c feat(hammerspoon/noct): add ChatGPT toggle on Cmd+Ctrl+4
Move ChatGPT binding inline with other numbered hotkeys for
consistent ordering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 23:28:54 +00:00
e2d2e4ec13 feat(install): add agentic repo clone command
Clone jimeh/agentic repo to ~/.config/agentic, following the same
pattern as the private dotfiles clone.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 23:28:12 +00:00
Jim Myhrberg
9bf0ffd5d7 chore(gitignore): add .claude/worktrees/ pattern
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 09:43:54 +00:00
Jim Myhrberg
ae207e49bd feat(zshenv): add ToolHive bin to PATH 2026-02-11 15:28:47 +00:00
a76c67542f chore(gitignore): add .vscode/settings.local.json pattern
Ignore VS Code local settings files across all projects, consistent
with the existing settings.json ignore pattern.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 09:25:44 +00:00
6900c31b3a feat(hammerspoon/noct): add Conductor app toggle on Cmd+Ctrl+3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 22:42:54 +00:00
Jim Myhrberg
83d043f186 feat(hammerspoon/hosts): update app toggle keybindings for improved access
Added keybinding for Codex and updated bindings for Conductor and ChatGPT Atlas. This enhances the app toggle functionality for better user experience.
2026-02-09 20:34:58 +00:00
eb3ecdce75 feat(hammerspoon/noct): prioritize VS Code over Insiders for Cmd+Ctrl+W
Switched to using regular VS Code as the primary app, with Insiders as
the fallback. Reflects shift to stable VS Code as primary editor.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 19:34:57 +00:00
9e5784d741 feat(mise/tools): add skills CLI tool
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 17:48:14 +00:00
051731d110 feat(zsh): add iTerm2 shell integration support
Source iTerm2 shell integration script when available, enabling
features like marks, badges, and status bar integration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 17:47:44 +00:00
c83cd5e62b chore(hammerspoon): remove window management margins
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:40:24 +00:00
54fac673e0 feat(hammerspoon/noct): add Codex app toggle keybinding
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:39:58 +00:00
e542560a67 feat(mise/tools): add oxfmt, oxlint, and opencode
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:38:49 +00:00
ca42166e11 chore(mise/ruby): remove ruby-install backend setting
No longer needed; default ruby-build backend is sufficient.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:38:24 +00:00
9c2e3b7343 feat(mise/tools): rename 1password-cli to 1password, add lua-language-server
The 1password-cli tool was renamed to 1password in mise registry.
Also add lua-language-server for Lua LSP support.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 18:46:37 +00:00
Jim Myhrberg
f5245da82a chore(gitignore): add ignore patterns for review directories in .agents and .claude 2026-01-30 17:47:01 +00:00
Jim Myhrberg
cc3dd3fe0e chore(gitignore): expand ignore patterns to include additional draft and plan directories 2026-01-30 15:15:05 +00:00
Jim Myhrberg
1c0f58ef55 feat(mise/tools): add 'riffdiff' dependency and rename '1password-cli' to '1password' 2026-01-27 16:58:07 +00:00
Jim Myhrberg
220461bd9a feat(zsh/rust): add alias for 'batdiff' as 'biff' if available 2026-01-27 16:57:38 +00:00
Jim Myhrberg
e34efe233e chore(hammerspoon/hati): move 'Cursor' key binding for app toggle definition 2026-01-27 16:57:05 +00:00
Jim Myhrberg
3a14e2302f chore(gitignore): update ignore patterns to exclude additional configuration and log files
Added new entries to .gitignore for various configuration files and log formats to prevent unnecessary files from being tracked.
2026-01-27 09:20:26 +00:00
7911beee79 feat(mise/tools): add 'zig' and 'zls' dependencies 2026-01-26 09:35:20 +00:00
c4924a8cfc feat(docs): add CLAUDE.md for repository guidance and configuration details 2026-01-26 09:34:55 +00:00
e38a4f6b73 chore(gitignore): add .claude/plans/ to .gitignore to exclude plan files from version control 2026-01-26 09:34:47 +00:00
Jim Myhrberg
f3bb188938 fix(zoxide): guard cd/cdi definitions with function existence checks
Prevent errors if zoxide fails to initialize by checking that
__zoxide_z and __zoxide_zi functions exist before defining wrappers.
2026-01-21 19:48:43 +00:00
Jim Myhrberg
f1901b81ad fix(zshrc): clean stale paths from PATH before loading zinit and mise
Remove any stale zinit plugin paths and mise install paths from PATH
before loading/activating them. This prevents issues when shell sessions
inherit cached environment variables from tools like direnv in VSCode.
2026-01-21 19:48:39 +00:00
Jim Myhrberg
ab9042fbae feat(zshrc): skip interactive shell setup for Claude Code sessions
Add CLAUDECODE=1 environment variable check to bail early from full
interactive shell setup, matching behavior for Cursor and VSCode.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 16:21:30 +00:00
Jim Myhrberg
c0694b0494 fix(hammerspoon/hati): swap key bindings for Claude and Open WebUI 2026-01-19 19:26:54 +00:00
cb72a6e190 feat(markdownlint): update line length settings for code blocks in markdownlint configuration 2026-01-18 22:02:30 +00:00
b38ab73624 chore(mise/config): remove 'claude' dependency from configuration 2026-01-18 22:02:18 +00:00
6dc701a4f7 feat(mise/config): add 'claude-plugins' dependency to configuration 2026-01-15 21:19:51 +00:00
3ef428c5ea fix(hammerspoon/noct): swap Claude and ChatGPT key bindings 2026-01-15 21:19:51 +00:00
a6af299d8d feat(nix): add initial Nix flake configuration and lock file for package management 2026-01-15 21:19:50 +00:00
Jim Myhrberg
a954f2b588 feat(zshenv): add pnpm setup to environment configuration 2026-01-15 21:11:31 +00:00
Jim Myhrberg
4f831ccd2e feat(ruby): add 'steep' to global Ruby packages installation 2026-01-15 21:10:47 +00:00
Jim Myhrberg
b72042cd1f feat(mise/config): add 'gemini' dependency to configuration 2026-01-15 21:10:34 +00:00
Jim Myhrberg
75116ac623 chore(gitignore): add settings.local.json to ignore list 2026-01-15 21:09:45 +00:00
f92e4b9646 feat(mise/config): add new dependencies for miniserve, http-server, svgo, toml-sort, and cloudflared 2026-01-13 19:30:37 +00:00
Jim Myhrberg
f7dd4b41fd fix(mise/config): rename 'claude-code' to 'claude' in configuration 2026-01-13 17:40:53 +00:00
4909c6a779 feat(userscripts): add DuckDuckGo Old School Blue userscript
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 10:29:13 +00:00
eed33bf54c feat(userstyles): remove old DuckDuckGo custom styles and add new Old School Blue theme 2026-01-06 09:10:12 +00:00
711b8f7678 feat(userstyles): add custom DuckDuckGo styles for enhanced dark theme support 2026-01-01 22:06:07 +00:00
1822f82401 chore(gitignore): add .envrc to ignore list 2025-12-30 13:54:06 +00:00
7c04e49858 fix(zshrc): improve installation prompts for mise and starship 2025-12-30 13:53:42 +00:00
3bb36f8b32 feat(zshenv): add Antigravity setup to zsh environment 2025-12-30 13:53:20 +00:00
4756212c32 feat(zsh/cursor): set cursor as default editor and update alias for cursor command 2025-12-30 13:52:47 +00:00
de6bb30eae chore(mise/config): clean up npm dependencies and update package versions to latest 2025-12-30 13:51:43 +00:00
079ec5177f feat(mise/config): enhance Ruby installation settings and clean up tool dependencies 2025-12-26 19:19:19 +00:00
666c60b89d feat(starship): update configuration to version 0.5.0
Adds config for a few new modules from recent starship updates.
2025-12-26 19:17:57 +00:00
22 changed files with 920 additions and 54 deletions

61
CLAUDE.md Normal file
View File

@@ -0,0 +1,61 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with
code in this repository.
## Overview
Personal dotfiles repository for macOS and Linux. Configuration files are
symlinked to `$HOME` with a `.` prefix (e.g., `zshrc` becomes `~/.zshrc`).
## Commands
### Installation
```sh
./install.sh # Install symlinks and initialize shell
./install.sh symlinks # Only install symlinks
./install.sh terminfo # Install terminfo entries
./install.sh launch-agents # Install macOS LaunchAgents
```
### Nix packages
```sh
nix-env -if ~/.dotfiles/default.nix # Install/update global Nix packages
nix flake update # Update nixpkgs lock
```
### Hammerspoon
```sh
cd hammerspoon && make install # Fetch Spoons and dependencies
cd hammerspoon && make update # Update all dependencies
```
## Structure
- `install.sh` - Main installer, manages symlinks to `$HOME`
- `flake.nix` / `default.nix` - Nix package management (nixfmt, nil LSP)
- `zshrc` / `zshenv` / `zprofile` - ZSH configuration entry points
- `zsh/` - Modular ZSH configs loaded by topic (aliases, kubernetes, golang,
etc.)
- `zsh/zshrc.funcs.zsh` - Helper functions used throughout ZSH config
- `bin/` - Personal scripts added to PATH
- `config/` - XDG config files (ghostty, kitty, mise, starship, etc.)
- `hammerspoon/` - macOS automation with Hammerspoon
- `tmux/` - Tmux config and plugins (git submodules)
- `private/` - Private dotfiles (separate repo, gitignored)
## Shell Setup
- Uses [zinit](https://github.com/zdharma-continuum/zinit) for ZSH plugin
management
- Uses [mise](https://mise.jdx.dev/) for runtime version management
- Uses [starship](https://starship.rs/) for prompt
- PATH construction happens in `zshenv`, interactive setup in `zshrc`
## Code Style
Shell scripts: 2-space indent, bash-style (see `.editorconfig` for shfmt
settings).

60
bin/ollama-for-gitbutler Executable file
View File

@@ -0,0 +1,60 @@
#!/usr/bin/env bash
# Defaults
DEFAULT_BIND="127.0.0.1"
DEFAULT_PORT="11435"
DEFAULT_ORIGINS="*"
DEFAULT_KEEP_ALIVE="6h"
print-help() {
cat <<EOF
Usage: ollama-for-gitbutler [options]
Options:
-b, --bind <addr> The address to bind to (default: "${DEFAULT_BIND}")
-p, --port <port> The port to listen on (default: "${DEFAULT_PORT}")
-m, --models <dir> Override ollama's default models directory
-k, --keep-alive <duration> The duration that models stay loaded in memory (default: "${DEFAULT_KEEP_ALIVE}")
-h, --help Print this help message
EOF
}
BIND="${DEFAULT_BIND}"
PORT="${DEFAULT_PORT}"
KEEP_ALIVE="${DEFAULT_KEEP_ALIVE}"
while [[ $# -gt 0 ]]; do
case "$1" in
-b | --bind)
BIND="$2"
shift 2
;;
-p | --port)
PORT="$2"
shift 2
;;
-m | --models)
export OLLAMA_MODELS="$2"
shift 2
;;
-k | --keep-alive)
KEEP_ALIVE="$2"
shift 2
;;
-h | --help)
print-help
exit 0
;;
*)
echo "Unknown option: $1" >&2
print-help >&2
exit 1
;;
esac
done
export OLLAMA_HOST="${BIND}:${PORT}"
export OLLAMA_KEEP_ALIVE="${KEEP_ALIVE}"
export OLLAMA_ORIGINS="${DEFAULT_ORIGINS}"
exec ollama serve "$@"

View File

@@ -24,10 +24,12 @@ bun = true
uvx = true
[settings.ruby]
ruby_install = true
# Precompiled binaries causes issues with Ruby LSP.
compile = true
[tools]
"aqua:AlexanderGrooff/mermaid-ascii" = "latest"
"aqua:svenstaro/miniserve" = "latest"
"aqua:tldr-pages/tlrc" = "latest"
"cargo:bacon" = "latest"
"cargo:cargo-audit" = "latest"
@@ -43,36 +45,39 @@ ruby_install = true
"cargo:paper-terminal" = "latest"
"cargo:parallel-disk-usage" = { version = "latest", bin = "pdu" }
"cargo:pastel" = "latest"
"github:spinel-coop/rv" = "latest"
"cargo:riffdiff" = "latest"
"github:stacklok/toolhive" = "latest"
"go:github.com/rakyll/hey" = "latest"
"go:google.golang.org/grpc/cmd/protoc-gen-go-grpc" = "latest"
"go:google.golang.org/protobuf/cmd/protoc-gen-go" = "latest"
"npm:@github/copilot-language-server" = "latest"
"npm:@mermaid-js/mermaid-cli" = "latest"
"npm:@modelcontextprotocol/server-memory" = "latest"
"npm:@modelcontextprotocol/server-sequential-thinking" = "latest"
"npm:@openai/codex" = "latest"
"npm:@prettier/plugin-php" = "latest"
"npm:@upstash/context7-mcp" = "latest"
"npm:claude-plugins" = "latest"
"npm:convex" = "latest"
"npm:dockerfile-language-server-nodejs" = "latest"
"npm:eslint" = "latest"
"npm:eslint-config-prettier" = "latest"
"npm:eslint-plugin-prettier" = "latest"
"npm:eslint_d" = "latest"
"npm:htmllint-cli" = "latest"
"npm:http-server" = "latest"
"npm:httpsnippet" = "latest"
"npm:jsonlint" = "latest"
"npm:localtunnel" = "latest"
"npm:markdown-it" = "latest"
"npm:oxfmt" = "latest"
"npm:oxlint" = "latest"
"npm:prettier" = "latest"
"npm:prettier-plugin-toml" = "latest"
"npm:prettier-pnp" = "latest"
"npm:skills" = "latest"
"npm:stylelint" = "latest"
"npm:svgo" = "latest"
"npm:typescript" = "latest"
"npm:typescript-formatter" = "latest"
"npm:typescript-language-server" = "latest"
"npm:vibe-kanban" = "latest"
"npm:vscode-css-languageserver-bin" = "latest"
"npm:vscode-json-languageserver" = "latest"
"npm:yaml-language-server" = "latest"
@@ -81,9 +86,9 @@ ruby_install = true
"pipx:dmgbuild" = "latest"
"pipx:fonttools" = "latest"
"pipx:pipx" = "latest"
"pipx:toml-sort" = "latest"
"pipx:yamllint" = "latest"
"ubi:rails/rails-new" = "latest"
1password-cli = "latest"
1password = "latest"
actionlint = "latest"
argo-rollouts = "latest"
argocd = "latest"
@@ -94,7 +99,7 @@ bat-extras = "latest"
buf = "latest"
bun = "latest"
cargo-binstall = "latest"
claude-code = "latest"
cloudflared = "latest"
crane = "latest"
ctop = "latest"
difftastic = "latest"
@@ -104,6 +109,7 @@ dust = "latest"
evans = "latest"
fd = "latest"
fzf = "latest"
gemini = "latest"
gh = "latest"
gitu = "latest"
go = "latest"
@@ -118,8 +124,7 @@ helm = "latest"
helmfile = "latest"
hexyl = "latest"
hivemind = "latest"
hugo-extended = "latest"
hwatch = "0.3.18"
hwatch = "latest"
jq = "latest"
jwt = "latest"
jwtui = "latest"
@@ -132,13 +137,15 @@ kubelogin = "latest"
kubens = "latest"
kustomize = "latest"
lua = "latest"
lua-language-server = "latest"
markdownlint-cli2 = "latest"
node = "lts"
opencode = "latest"
opentofu = "latest"
pnpm = "latest"
python = "latest"
rclone = "latest"
restish = "0.20.0"
restish = "latest"
ripgrep = "latest"
ruby = "latest"
rust = { version = "latest", components = "rust-analyzer,rust-src" }
@@ -161,6 +168,8 @@ uv = "latest"
watchexec = "latest"
yj = "latest"
yq = "latest"
zig = "latest"
zls = "latest"
zoxide = "latest"
# Install ansible with passlib and bcrypt<4.1, as passlib is not compatible with

View File

@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------
# jimeh's Starship Config
# ------------------------------------------------------------------------------
# Version: 0.4.0
# Version: 0.5.0
# URL: https://github.com/jimeh/dotfiles/blob/main/config/starship.toml
# ------------------------------------------------------------------------------
# This is minimalistic Starship (https://starship.rs/) prompt setup with most
@@ -9,7 +9,12 @@
# picking of specific features to enable.
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# MARK: Format
# ------------------------------------------------------------------------------
add_newline = false
format = """
$username\
$hostname\
@@ -20,15 +25,18 @@ $git_state\
$git_metrics\
$git_status\
$hg_branch\
$fossil_branch\
$fossil_metrics\
$hg_state\
$line_break\
$character"""
right_format = """
$localip\
$shlvl\
$singularity\
$kubernetes\
$vcsh\
$fossil_branch\
$pijul_channel\
$docker_context\
$package\
@@ -43,6 +51,7 @@ $elixir\
$elm\
$erlang\
$fennel\
$fortran\
$gleam\
$golang\
$guix_shell\
@@ -63,14 +72,17 @@ $php\
$pulumi\
$purescript\
$python\
$quarto\
$raku\
$rlang\
$red\
$ruby\
$rust\
$scala\
$solidity\
$swift\
$terraform\
$typst\
$vlang\
$vagrant\
$zig\
@@ -90,8 +102,11 @@ $custom\
$cmd_duration\
$status\
$line_break\
$direnv
$direnv\
$mise\
$nats\
$jobs\
$netns\
$shell\
$sudo\
$battery\
@@ -101,7 +116,7 @@ $container\
$time"""
# ------------------------------------------------------------------------------
# Main left prompt components
# MARK: Left prompt
# ------------------------------------------------------------------------------
[username]
@@ -129,12 +144,12 @@ disabled = true
[character]
success_symbol = '[](bold fg:118)'
error_symbol = '[](bold fg:46)'
vicmd_symbol = '[](bold fg:46)'
vimcmd_symbol = '[](bold fg:46)'
# ------------------------------------------------------------------------------
# Source Control
# MARK: Source Control
# ------------------------------------------------------------------------------
#
[git_branch]
format = '([$symbol$branch]($style))'
style = 'fg:51'
@@ -176,9 +191,9 @@ symbol = ''
truncation_length = 24
# ------------------------------------------------------------------------------
# Right prompt "status" components
# MARK: Right prompt
# ------------------------------------------------------------------------------
#
[shlvl]
symbol = ' '
format = '( [$symbol$shlvl]($style))'
@@ -254,16 +269,18 @@ style = "bold fg:239"
disabled = false
# ------------------------------------------------------------------------------
# Languages
# MARK: Languages
# ------------------------------------------------------------------------------
#
[buf]
symbol = ' '
format = '( [$symbol($version)]($style))'
disabled = false
[bun]
symbol = ' '
format = '( [$symbol$version]($style))'
style = 'bold blue'
disabled = false
[c]
@@ -294,7 +311,7 @@ disabled = false
[deno]
format = '( [$symbol$version]($style))'
disabled = true
disabled = false
[dotnet]
symbol = '󰪮 '
@@ -320,6 +337,10 @@ disabled = true
format = '( [$symbol($version)]($style))'
disabled = true
[fortran]
format = '( [$symbol$version]($style))'
disabled = true
[gleam]
format = '( [$symbol($version)]($style))'
disabled = false
@@ -420,6 +441,10 @@ symbol = ' '
format = '( [$symbol$version]($style))'
disabled = true
[solidity]
format = '( [$symbol$version]($style))'
disabled = false
[swift]
symbol = ' '
format = '( [$symbol$version]($style))'
@@ -434,9 +459,9 @@ format = '( [$symbol$version]($style))'
disabled = false
# ------------------------------------------------------------------------------
# Tools
# MARK: Tools
# ------------------------------------------------------------------------------
#
[aws]
symbol = ' '
format = '( [$symbol($profile)( \($region\))( \[$duration\])]($style))'
@@ -485,7 +510,7 @@ format = '( [$symbol$account(@$domain)(\($region\))]($style))'
disabled = true
[gradle]
fomat = '( [$symbol($version)]($style))'
format = '( [$symbol($version)]($style))'
disabled = true
[helm]
@@ -501,6 +526,18 @@ disabled = false
format = '( [$symbol$project]($style))'
disabled = true
[mise]
format = '( [$symbol$health]($style))'
disabled = true
[nats]
format = '( [$symbol$name]($style))'
disabled = false
[netns]
format = '( [$symbol \[$name\]]($style))'
disabled = true
[nix_shell]
symbol = ' '
format = '( [$symbol$state(\($name\))]($style))'
@@ -528,6 +565,10 @@ disabled = true
format = '( [$symbol$stack]($style))'
disabled = true
[quarto]
format = '( [$symbol$version]($style))'
disabled = false
[singularity]
format = '( [$symbol\[$env\]]($style))'
disabled = true
@@ -540,6 +581,10 @@ disabled = true
format = '( [$symbol$workspace]($style))'
disabled = false
[typst]
format = '( [$symbol$version]($style))'
disabled = false
[vagrant]
format = '( [$symbol($version)]($style))'
disabled = false

4
default.nix Normal file
View File

@@ -0,0 +1,4 @@
let
flake = builtins.getFlake "git+file://${builtins.toString ./.}";
in
flake.packages.${builtins.currentSystem}.default

27
flake.lock generated Normal file
View File

@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1768302833,
"narHash": "sha256-h5bRFy9bco+8QcK7rGoOiqMxMbmn21moTACofNLRMP4=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "61db79b0c6b838d9894923920b612048e1201926",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

36
flake.nix Normal file
View File

@@ -0,0 +1,36 @@
{
description = "Global packages for dotfiles";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
};
outputs =
{ self, nixpkgs }:
let
systems = [
"x86_64-darwin"
"aarch64-darwin"
"x86_64-linux"
"aarch64-linux"
];
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
in
{
packages = forAllSystems (
system:
let
pkgs = nixpkgs.legacyPackages.${system};
in
{
default = pkgs.buildEnv {
name = "dotfiles-packages";
paths = [
pkgs.nil
pkgs.nixfmt
];
};
}
);
};
}

View File

@@ -1,22 +1,34 @@
**/._zinit/*
**/.agents/drafts/
**/.agents/plans/
**/.agents/reviews/
**/.claude/drafts/
**/.claude/plans/
**/.claude/reviews/
**/.claude/settings.local.json
**/.claude/worktrees/
**/.vscode/settings.json
**/.vscode/settings.local.json
**/chart/preprod-values.yaml
**/chart/production-values.yaml
**/chart/staging-values.yaml
**/log/*.bz2
**/log/*.gz
**/test/dummy/log/*.bz2
**/test/dummy/log/*.gz
**/vendor/bundle
.AppleDouble
.DS_Store
._zinit/*
.bin
.bundle
.byebug_history
.dir-locals.el
.envrc
.mise.*local.toml
.mise.local.toml
.projectile
.stfolder
.stignore
.vagrant
.vscode/settings.json
.zinitrc.zsh
log/*.bz2
log/*.gz
mise.*local.toml
routes.txt
test/dummy/log/*.bz2
test/dummy/log/*.gz
vendor/bundle

View File

@@ -11,12 +11,13 @@ local function init_hotkeys()
hs.hotkey.bind({ 'cmd', 'alt', 'ctrl' }, 'S', apptoggle.showAppInfo)
apptoggle:bind({ 'cmd', 'alt', 'ctrl' }, 'A', { 'Activity Monitor' })
apptoggle:bind({ 'cmd', 'ctrl' }, '2', { 'Open WebUI' })
apptoggle:bind({ 'cmd', 'ctrl' }, '4', { 'Claude' })
apptoggle:bind({ 'cmd', 'ctrl' }, '1', { 'Codex' })
apptoggle:bind({ 'cmd', 'ctrl' }, '2', { 'Claude' })
apptoggle:bind({ 'cmd', 'ctrl' }, '3', { 'Conductor' })
apptoggle:bind({ 'cmd', 'ctrl' }, '4', { 'ChatGPT Atlas' }, { 'ChatGPT' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'A', { 'Argo CD' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'B', { 'TablePlus' }, { 'Lens' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'D', { 'Mail+ for Gmail' }, { 'Notion Mail' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'E', { 'Cursor' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'F', { 'GitButler' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'G', { 'Emacs', '/Applications/Emacs.app' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'T', { 'TeamSpeak 3', '/Applications/TeamSpeak 3 Client.app' })
@@ -29,6 +30,7 @@ local function init_hotkeys()
{ 'Google Calendar' }
)
apptoggle:bind({ 'cmd', 'ctrl' }, 'E', { 'Cursor' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'W',
{ 'Code - Insiders', '/Applications/Visual Studio Code - Insiders.app' },
{ 'Code', '/Applications/Visual Studio Code.app' }

View File

@@ -11,7 +11,10 @@ local function init_hotkeys()
hs.hotkey.bind({ 'cmd', 'alt', 'ctrl' }, 'S', apptoggle.showAppInfo)
apptoggle:bind({ 'cmd', 'alt', 'ctrl' }, 'A', { 'Activity Monitor' })
apptoggle:bind({ 'cmd', 'ctrl' }, '4', { 'Claude' })
apptoggle:bind({ 'cmd', 'ctrl' }, '1', { 'Codex' })
apptoggle:bind({ 'cmd', 'ctrl' }, '2', { 'Claude' })
apptoggle:bind({ 'cmd', 'ctrl' }, '3', { 'Conductor' })
apptoggle:bind({ 'cmd', 'ctrl' }, '4', { 'ChatGPT' }, { 'ChatGPT Atlas' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'A', { 'Messages' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'B', { 'TablePlus' }, { 'Sequel Pro' }, { 'Lens' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'D', { 'Mail+ for Gmail' }, { 'Mimestream' })
@@ -22,14 +25,9 @@ local function init_hotkeys()
apptoggle:bind({ 'cmd', 'ctrl' }, 'X', { 'Notion' }, { 'Obsidian' })
apptoggle:bind({ 'cmd', 'ctrl' }, 'Z', { 'WhatsApp' })
apptoggle:bind({ 'cmd', 'ctrl' }, '2',
{ 'ChatGPT' },
{ 'ChatGPT Atlas' }
)
apptoggle:bind({ 'cmd', 'ctrl' }, 'W',
{ 'Code - Insiders', '/Applications/Visual Studio Code - Insiders.app' },
{ 'Code', '/Applications/Visual Studio Code.app' }
{ 'Code', '/Applications/Visual Studio Code.app' },
{ 'Code - Insiders', '/Applications/Visual Studio Code - Insiders.app' }
)
apptoggle:bind({ 'cmd', 'ctrl' }, 'C',

View File

@@ -12,7 +12,7 @@ local wm = {
animationDuration = 0.0,
gridSizes = { default = '30x20', interactive = '8x4' },
gridTextSize = 50,
margins = { w = 4, h = 4 }
margins = { w = 0, h = 0 }
}
-- Initialize and register keybindings

View File

@@ -87,6 +87,11 @@ install_private() {
"$ROOT_PATH/$PRIVATE_PATH"
}
install_agentic() {
git_clone "git@github.com:jimeh/agentic.git" \
"$HOME/.config/agentic"
}
install_launch_agents() {
mkdir -p "$HOME/Library/LaunchAgents"
for file in $ROOT_PATH/launch_agents/*.plist; do
@@ -256,6 +261,7 @@ display_help() {
echo ' info: Display target and source directory information.'
echo ' emacs_config: Install Emacs configuration.'
echo ' private: Install private dotfiles.'
echo ' agentic: Clone agentic repo to ~/.config/agentic.'
echo ' homebrew: Install Homebrew (Mac OS X only).'
echo ' rbenv: Install rbenv, a Ruby version manager.'
echo ' launch_agents: Install launchd plists to ~/Library/LaunchAgents/'
@@ -278,6 +284,9 @@ case "$1" in
private)
install_private
;;
agentic)
install_agentic
;;
homebrew | brew)
install_homebrew
;;

View File

@@ -14,4 +14,7 @@ blanks-around-fences: # MD031
line-length: # MD013
# Allow lines up to 120 characters.
line_length: 80
code_blocks: true
ignore_code_blocks: true
code_block_line_length: 280
tables: false

View File

@@ -0,0 +1,287 @@
// ==UserScript==
// @name DuckDuckGo Old School Blue
// @description Dark theme inspired by Kagi's Old School dark theme.
// @version 1.0.0
// @namespace jimeh.me
// @downloadURL https://github.com/jimeh/dotfiles/raw/main/userscripts/duckduckgo-old-school-blue.user.js
// @updateURL https://github.com/jimeh/dotfiles/raw/main/userscripts/duckduckgo-old-school-blue.user.js
// @inject-into content
// @run-at document-end
// @match *://duckduckgo.com/*
// ==/UserScript==
(function () {
if (
window.location.hostname === "duckduckgo.com" &&
!window.location.pathname.startsWith("/duckduckgo-help-pages/")
) {
const css = `
/*
To be used with the following DuckDuckGo settings:
{"k18":"1","k21":"27293d","k7":"171824","k9":"8ab4f8","ka":"h","kaa":"c58af9","kae":"d","kj":"171824","km":"m","kt":"h","kx":"7aa1a8"}
These can be forcibly applied with the following JavaScript snippet:
Object.entries({18:"1",21:"27293d",7:"171824",9:"8ab4f8",a:"h",aa:"c58af9",ae:"d",j:"171824",m:"m",t:"h",x:"7aa1a8"}).forEach((([a,e])=>{document.cookie=\`\${a}=\${e};path=/;samesite=lax;expires=\${new Date(Date.now()+31536e6).toUTCString()}\`}));
*/
body {
--userstyle-bg-base: #171824;
--userstyle-bg-light-1: #1f2030;
--userstyle-bg-light-2: #27293D;
--userstyle-bg-light-3: #30334B;
--userstyle-bg-light-4: #373B57;
--userstyle-bg-light-5: #3F4464;
/* Search box background on results page */
--sds-color-background-01: var(--userstyle-bg-light-2);
/* Search box on landing page */
--theme-ai-searchbox-bg: var(--userstyle-bg-light-2);
--theme-ai-searchbox-bg--focused: var(--userstyle-bg-light-2);
--theme-col-bg-header: var(--userstyle-bg-base);
--theme-col-bg-page: var(--userstyle-bg-base);
--theme-col-bg-page-alt-1: var(--userstyle-bg-light-4);
--theme-col-bg-page-alt-2: var(--userstyle-bg-light-5);
--theme-col-bg-page-alt-3: var(--userstyle-bg-light-3);
--theme-assist-bg-chat-system: var(--userstyle-bg-light-2);
--theme-col-bg-button-secondary: var(--userstyle-bg-light-3);
--theme-col-bg-button-secondary-hover: var(--userstyle-bg-light-4);
--theme-col-bg-button-secondary-active: var(--userstyle-bg-light-5);
--theme-col-bg-button-secondary-disabled: var(--userstyle-bg-light-1);
--sds-color-background-utility: var(--userstyle-bg-light-3);
--sds-color-background-utility-state-01: var(--userstyle-bg-light-4);
--sds-color-background-utility-state-02: var(--userstyle-bg-light-5);
--sds-color-background-utility-alt: var(--userstyle-bg-light-2);
--sds-color-background-utility-alt-state-01: var(--userstyle-bg-light-3);
--sds-color-background-utility-alt-state-02: var(--userstyle-bg-light-4);
--sds-color-border-01: var(--userstyle-bg-light-3);
--theme-col-txt-title: #8ab4f8;
--theme-col-txt-title-visited: #c58af9;
--theme-col-txt-snippet: #cccccc;
--theme-col-txt-url: #7aa1a8;
--theme-col-txt-url-domain: #7aa1a8;
--theme-col-txt-url-path: var(--theme-col-txt-url-domain);
--sds-color-background-container-01: var(--userstyle-bg-light-2);
--sds-color-background-container-02: var(--userstyle-bg-light-2);
--theme-col-bg-ui: var(--userstyle-bg-light-2);
--theme-col-bg-ui-header: var(--userstyle-bg-light-2);
--theme-col-bg-card: var(--userstyle-bg-light-2);
--theme-col-bg-card-header: var(--userstyle-bg-light-2);
--theme-col-bg-button-ghost-hover: var(--userstyle-bg-light-4);
--theme-col-bg-button-ghost-active: var(--userstyle-bg-light-5);
}
.theme-dark .chip-select_root__xmFA3 {
--chip-select-bg: var(--userstyle-bg-light-1);
--chip-select-indicator-bg: var(--userstyle-bg-light-3);
--chip-select-indicator-bg--hover: var(--userstyle-bg-light-4);
}
.header-wrap {
box-shadow: 0 1px 0 var(--userstyle-bg-light-3);
background-color: var(--theme-col-bg-header) !important;
}
.is-related-search-exp.dark-bg .related-searches__item {
background-color: var(--userstyle-bg-light-3);
border-color: var(--userstyle-bg-light-3);
}
html,
body,
.body--home,
.site-wrapper,
.region__body,
.badge-link,
.module--carousel__image-wrapper,
.result__image,
.vertical--map__sidebar,
.vertical--map__sidebar__header,
.page-chrome_newtab,
.zci--type--tiles:not(.is-fallback).is-full-page.is-expanded,
.zci--type--tiles:not(.is-fallback).is-full-page.is-expanded .metabar:not(.is-stuck) {
background-color: var(--theme-col-bg-page) !important;
}
.nav-menu,
.nav-menu--slideout {
background-color: var(--userstyle-bg-light-2);
}
.vertical--map--sidebar-left .vertical--map__sidebar__header,
.vertical--map--sidebar-left .has-requery .vertical--map__sidebar__header,
.vertical--map__sidebar__header--mobile,
.map-requery-mobile,
.footer,
.footer--mobile {
border-color: var(--userstyle-bg-light-3);
background-color: var(--userstyle-bg-base);
box-shadow: 0 1px 0 var(--userstyle-bg-light-3);
}
.user-loc-tooltip__address,
.modal__header {
background: var(--userstyle-bg-light-4);
}
.module:not(.module--carousel):not(.module--placeholder):not(.module--translations):not(.module__chromeless),
.modal--popout .modal__box,
.modal__box,
.sidebar-modules .module,
.results--main .result:not(.result--ad).highlight,
.module .module--carousel__item,
.user-loc-cta,
.address-detail,
.modal--dropdown.modal--popout .modal__box,
.tile--info,
.place-detail,
.badge-link,
.atb-banner__bottom,
.multi-step-mobile-onboarding__step__content,
.is-mobile .results_links_deep,
.is-mobile .results_links,
.is-mobile .related-searches,
.user-loc-tooltip,
.anomaly-modal__modal {
border: 1px solid var(--userstyle-bg-light-3);
background: var(--userstyle-bg-light-2);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
color: #cccccc;
}
.modal--dropdown--settings .settings-dropdown--section .frm__field .frm__select select {
background: transparent !important;
}
.modal__list__link:hover,
.modal__list__link.is-active,
.modal__list__link.is-highlighted,
.modal--dropdown--region .modal__list__link.is-highlighted,
.highlight .result__image,
.switch,
.modal--dropdown--settings .settings-dropdown--section .frm__field .frm__switch .frm__switch__label.btn {
background-color: var(--userstyle-bg-base);
}
.search--home,
.search--header {
background-color: var(--userstyle-bg-light-2);
border-color: var(--userstyle-bg-light-3);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
.search__button:hover,
.search__button:focus,
.search--hover .search__button,
.search--hover .search__button:focus,
.search--header.has-text.search--hover .search__button,
.search--header.has-text.search--focus .search__button,
.search--header.has-text.search--hover .search__button:hover,
.search--header.has-text.search--focus .search__button:hover,
.search--home.has-text .search__button,
.search--home.has-text .search__button:focus,
.search--home.has-text .search__button:hover {
background-color: var(--userstyle-bg-light-4);
color: #cccccc;
}
.acp-wrap,
.acp-footer {
background-color: var(--userstyle-bg-light-2);
border-color: var(--userstyle-bg-light-5);
}
.acp--highlight {
background-color: var(--userstyle-bg-light-4);
}
.jyBaPv1HPGOoWrXSAjiu .T265XEcezvjUhK71U8pN {
box-shadow: 0 0 0 1px var(--userstyle-bg-light-3), 0 2px 3px 0 rgba(0, 0, 0, .06);
}
.set-head__menu .set-tab,
.set-tab:visited {
background-color: var(--userstyle-bg-light-3);
}
.set-head__menu .set-tab:hover {
background-color: var(--userstyle-bg-light-5);
color: #eee;
}
code,
.set-bookmarklet__input,
.set-bookmarklet__data,
.btn,
.btn:visited,
.btn:active,
.btn.btn--primary,
.btn.btn--secondary,
.btn--primary:hover,
.btn.is-disabled,
.btn.is-disabled:hover,
input,
textarea,
.frm__input,
.frm__text,
.detail--xd .c-detail__btn,
.set-bookmarklet,
.set-reset,
.frm__select,
.frm__select select,
.zci--json_validator textarea,
.colorpicker,
.feedback-modal__submit.is-disabled,
.feedback-modal__submit.is-disabled:hover,
.feedback-modal__submit.is-disabled:active,
.feedback-modal__submit.is-disabled:focus,
.btn.btn--skeleton:hover {
background-color: var(--userstyle-bg-light-3);
border-color: transparent;
color: #eeeeee;
text-shadow: none;
}
.cloudsave,
.set-bookmarklet__detail,
.set-reset__detail {
background: var(--userstyle-bg-light-1);
}
.set-head,
.set-thumbnail__img,
.set-main-footer,
.region__header__section--current,
.badge-link,
.frm__color__swatch {
border-color: var(--userstyle-bg-light-3);
}
.frm__hr {
border-color: var(--userstyle-bg-light-3);
}
.nav-menu--feedback,
[data-testid="feedback-prompt"] {
display: none;
}
`;
let styleElm = document.createElement("style");
if (styleElm.styleSheet) {
styleElm.styleSheet.cssText = css; // Support for IE
} else {
styleElm.appendChild(document.createTextNode(css));
}
document.getElementsByTagName("head")[0].appendChild(styleElm);
}
})();

View File

@@ -0,0 +1,273 @@
/* ==UserStyle==
@name DuckDuckGo Old School Blue
@description Dark theme inspired by Kagi's Old School dark theme.
@version 1.0.0
@license CC0-1.0
@author Jim Myhrberg
@namespace jimeh.me
@homepageURL https://github.com/jimeh/dotfiles/blob/main/userstyles/duckduckgo-old-school-blue.user.css
@updateURL https://github.com/jimeh/dotfiles/raw/main/userstyles/duckduckgo-old-school-blue.css
==/UserStyle== */
@-moz-document regexp("https?:\\/\\/duckduckgo\\.com\\/(?!duckduckgo-help-pages\\/).*") {
/*
To be used with the following DuckDuckGo settings:
{"k18":"1","k21":"27293d","k7":"171824","k9":"8ab4f8","ka":"h","kaa":"c58af9","kae":"d","kj":"171824","km":"m","kt":"h","kx":"7aa1a8"}
These can be forcibly applied with the following JavaScript snippet:
Object.entries({18:"1",21:"27293d",7:"171824",9:"8ab4f8",a:"h",aa:"c58af9",ae:"d",j:"171824",m:"m",t:"h",x:"7aa1a8"}).forEach((([a,e])=>{document.cookie=`${a}=${e};path=/;samesite=lax;expires=${new Date(Date.now()+31536e6).toUTCString()}`}));
*/
body {
--userstyle-bg-base: #171824;
--userstyle-bg-light-1: #1f2030;
--userstyle-bg-light-2: #27293D;
--userstyle-bg-light-3: #30334B;
--userstyle-bg-light-4: #373B57;
--userstyle-bg-light-5: #3F4464;
/* Search box background on results page */
--sds-color-background-01: var(--userstyle-bg-light-2);
/* Search box on landing page */
--theme-ai-searchbox-bg: var(--userstyle-bg-light-2);
--theme-ai-searchbox-bg--focused: var(--userstyle-bg-light-2);
--theme-col-bg-header: var(--userstyle-bg-base);
--theme-col-bg-page: var(--userstyle-bg-base);
--theme-col-bg-page-alt-1: var(--userstyle-bg-light-4);
--theme-col-bg-page-alt-2: var(--userstyle-bg-light-5);
--theme-col-bg-page-alt-3: var(--userstyle-bg-light-3);
--theme-assist-bg-chat-system: var(--userstyle-bg-light-2);
--theme-col-bg-button-secondary: var(--userstyle-bg-light-3);
--theme-col-bg-button-secondary-hover: var(--userstyle-bg-light-4);
--theme-col-bg-button-secondary-active: var(--userstyle-bg-light-5);
--theme-col-bg-button-secondary-disabled: var(--userstyle-bg-light-1);
--sds-color-background-utility: var(--userstyle-bg-light-3);
--sds-color-background-utility-state-01: var(--userstyle-bg-light-4);
--sds-color-background-utility-state-02: var(--userstyle-bg-light-5);
--sds-color-background-utility-alt: var(--userstyle-bg-light-2);
--sds-color-background-utility-alt-state-01: var(--userstyle-bg-light-3);
--sds-color-background-utility-alt-state-02: var(--userstyle-bg-light-4);
--sds-color-border-01: var(--userstyle-bg-light-3);
--theme-col-txt-title: #8ab4f8;
--theme-col-txt-title-visited: #c58af9;
--theme-col-txt-snippet: #cccccc;
--theme-col-txt-url: #7aa1a8;
--theme-col-txt-url-domain: #7aa1a8;
--theme-col-txt-url-path: var(--theme-col-txt-url-domain);
--sds-color-background-container-01: var(--userstyle-bg-light-2);
--sds-color-background-container-02: var(--userstyle-bg-light-2);
--theme-col-bg-ui: var(--userstyle-bg-light-2);
--theme-col-bg-ui-header: var(--userstyle-bg-light-2);
--theme-col-bg-card: var(--userstyle-bg-light-2);
--theme-col-bg-card-header: var(--userstyle-bg-light-2);
--theme-col-bg-button-ghost-hover: var(--userstyle-bg-light-4);
--theme-col-bg-button-ghost-active: var(--userstyle-bg-light-5);
}
.theme-dark .chip-select_root__xmFA3 {
--chip-select-bg: var(--userstyle-bg-light-1);
--chip-select-indicator-bg: var(--userstyle-bg-light-3);
--chip-select-indicator-bg--hover: var(--userstyle-bg-light-4);
}
.header-wrap {
box-shadow: 0 1px 0 var(--userstyle-bg-light-3);
background-color: var(--theme-col-bg-header) !important;
}
.is-related-search-exp.dark-bg .related-searches__item {
background-color: var(--userstyle-bg-light-3);
border-color: var(--userstyle-bg-light-3);
}
html,
body,
.body--home,
.site-wrapper,
.region__body,
.badge-link,
.module--carousel__image-wrapper,
.result__image,
.vertical--map__sidebar,
.vertical--map__sidebar__header,
.page-chrome_newtab,
.zci--type--tiles:not(.is-fallback).is-full-page.is-expanded,
.zci--type--tiles:not(.is-fallback).is-full-page.is-expanded .metabar:not(.is-stuck) {
background-color: var(--theme-col-bg-page) !important;
}
.nav-menu,
.nav-menu--slideout {
background-color: var(--userstyle-bg-light-2);
}
.vertical--map--sidebar-left .vertical--map__sidebar__header,
.vertical--map--sidebar-left .has-requery .vertical--map__sidebar__header,
.vertical--map__sidebar__header--mobile,
.map-requery-mobile,
.footer,
.footer--mobile {
border-color: var(--userstyle-bg-light-3);
background-color: var(--userstyle-bg-base);
box-shadow: 0 1px 0 var(--userstyle-bg-light-3);
}
.user-loc-tooltip__address,
.modal__header {
background: var(--userstyle-bg-light-4);
}
.module:not(.module--carousel):not(.module--placeholder):not(.module--translations):not(.module__chromeless),
.modal--popout .modal__box,
.modal__box,
.sidebar-modules .module,
.results--main .result:not(.result--ad).highlight,
.module .module--carousel__item,
.user-loc-cta,
.address-detail,
.modal--dropdown.modal--popout .modal__box,
.tile--info,
.place-detail,
.badge-link,
.atb-banner__bottom,
.multi-step-mobile-onboarding__step__content,
.is-mobile .results_links_deep,
.is-mobile .results_links,
.is-mobile .related-searches,
.user-loc-tooltip,
.anomaly-modal__modal {
border: 1px solid var(--userstyle-bg-light-3);
background: var(--userstyle-bg-light-2);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
color: #cccccc;
}
.modal--dropdown--settings .settings-dropdown--section .frm__field .frm__select select {
background: transparent !important;
}
.modal__list__link:hover,
.modal__list__link.is-active,
.modal__list__link.is-highlighted,
.modal--dropdown--region .modal__list__link.is-highlighted,
.highlight .result__image,
.switch,
.modal--dropdown--settings .settings-dropdown--section .frm__field .frm__switch .frm__switch__label.btn {
background-color: var(--userstyle-bg-base);
}
.search--home,
.search--header {
background-color: var(--userstyle-bg-light-2);
border-color: var(--userstyle-bg-light-3);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
.search__button:hover,
.search__button:focus,
.search--hover .search__button,
.search--hover .search__button:focus,
.search--header.has-text.search--hover .search__button,
.search--header.has-text.search--focus .search__button,
.search--header.has-text.search--hover .search__button:hover,
.search--header.has-text.search--focus .search__button:hover,
.search--home.has-text .search__button,
.search--home.has-text .search__button:focus,
.search--home.has-text .search__button:hover {
background-color: var(--userstyle-bg-light-4);
color: #cccccc;
}
.acp-wrap,
.acp-footer {
background-color: var(--userstyle-bg-light-2);
border-color: var(--userstyle-bg-light-5);
}
.acp--highlight {
background-color: var(--userstyle-bg-light-4);
}
.jyBaPv1HPGOoWrXSAjiu .T265XEcezvjUhK71U8pN {
box-shadow: 0 0 0 1px var(--userstyle-bg-light-3), 0 2px 3px 0 rgba(0, 0, 0, .06);
}
.set-head__menu .set-tab,
.set-tab:visited {
background-color: var(--userstyle-bg-light-3);
}
.set-head__menu .set-tab:hover {
background-color: var(--userstyle-bg-light-5);
color: #eee;
}
code,
.set-bookmarklet__input,
.set-bookmarklet__data,
.btn,
.btn:visited,
.btn:active,
.btn.btn--primary,
.btn.btn--secondary,
.btn--primary:hover,
.btn.is-disabled,
.btn.is-disabled:hover,
input,
textarea,
.frm__input,
.frm__text,
.detail--xd .c-detail__btn,
.set-bookmarklet,
.set-reset,
.frm__select,
.frm__select select,
.zci--json_validator textarea,
.colorpicker,
.feedback-modal__submit.is-disabled,
.feedback-modal__submit.is-disabled:hover,
.feedback-modal__submit.is-disabled:active,
.feedback-modal__submit.is-disabled:focus,
.btn.btn--skeleton:hover {
background-color: var(--userstyle-bg-light-3);
border-color: transparent;
color: #eeeeee;
text-shadow: none;
}
.cloudsave,
.set-bookmarklet__detail,
.set-reset__detail {
background: var(--userstyle-bg-light-1);
}
.set-head,
.set-thumbnail__img,
.set-main-footer,
.region__header__section--current,
.badge-link,
.frm__color__swatch {
border-color: var(--userstyle-bg-light-3);
}
.frm__hr {
border-color: var(--userstyle-bg-light-3);
}
.nav-menu--feedback,
[data-testid="feedback-prompt"] {
display: none;
}
}

View File

@@ -3,12 +3,12 @@
#
if command-exists cursor-agent; then
alias cu="cursor-agent"
setup-completions cursor-agent "$(command-path cursor-agent)" \
cursor-agent shell-integration zsh
fi
if command-exists cursor; then
export EDITOR="cursor -w"
alias cu="cursor"
alias e="cursor -w"
fi

7
zsh/iterm2.zsh Normal file
View File

@@ -0,0 +1,7 @@
#
# iTerm2 environment setup.
#
if [ -f "${HOME}/.iterm2_shell_integration.zsh" ]; then
source "${HOME}/.iterm2_shell_integration.zsh"
fi

View File

@@ -63,6 +63,7 @@ install_ruby_global_packages() {
ruby-lsp
ruby-lsp-rails
ruby-lsp-rspec
steep
syntax_tree
syntax_tree-haml
yard

View File

@@ -21,6 +21,10 @@ if command-exists batman; then
alias man="batman"
fi
if command-exists batdiff; then
alias biff="batdiff"
fi
# ==============================================================================
# completions
# ==============================================================================

View File

@@ -6,6 +6,10 @@ if command-exists zoxide; then
cached-eval "$(command-path zoxide)" zoxide init --cmd zox zsh
# Use functions to allow regular zsh completion for cd to work.
cd() { __zoxide_z "$@"; }
alias cdi='__zoxide_zi'
if command-exists __zoxide_z; then
cd() { __zoxide_z "$@"; }
fi
if command-exists __zoxide_zi; then
alias cdi='__zoxide_zi'
fi
fi

10
zshenv
View File

@@ -354,6 +354,10 @@ fi
# Use custom tmux install if available
path_prepend "/opt/tmux/bin"
# pnpm setup
export PNPM_HOME="$HOME/.local/share/pnpm"
path_prepend "$PNPM_HOME"
# Rust setup
export RUSTUP_HOME="$HOME/.rustup"
export CARGO_HOME="$HOME/.cargo"
@@ -383,12 +387,18 @@ path_prepend "$HOME/.orbstack/bin"
# Google Cloud SDK setup
source-if-exists "${HOMEBREW_PREFIX}/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc"
# Antigravity setup
path_prepend "$HOME/.antigravity/antigravity/bin"
# Windsurf setup
path_prepend "$HOME/.codeium/windsurf/bin"
# LM Studio setup
path_prepend "$HOME/.cache/lm-studio/bin"
# ToolHive setup
path_prepend "$HOME/.toolhive/bin"
# ==============================================================================
# Local Overrides
# ==============================================================================

20
zshrc
View File

@@ -16,10 +16,12 @@
# Cursor's agent setup, which is used when the agent runs terminal commands.
# Though it does also set a proper `TERM` value sometimes, hence the check for
# `CURSOR_AGENT` as well.
# - Claude Code's shell sessions, identified by `CLAUDECODE=1`.
#
if [[ -n "$VSCODE_RESOLVING_ENVIRONMENT" ]] ||
[[ "$TERM" == "dumb" ]] ||
[[ "$CURSOR_AGENT" == "1" ]]; then
[[ "$CURSOR_AGENT" == "1" ]] ||
[[ "$CLAUDECODE" == "1" ]]; then
return
fi
@@ -56,6 +58,9 @@ fi
echo &&
git clone --depth=1 "https://github.com/zdharma-continuum/zinit.git" "${ZINIT[BIN_DIR]}"
# Remove any stale Zinit plugin paths before loading to avoid issues.
path=("${(@)path:#${ZINIT[HOME_DIR]}/plugins/*}")
# Load Zinit
source "${ZINIT[BIN_DIR]}/zinit.zsh"
@@ -257,11 +262,18 @@ MISE_HOME="$HOME/.local/share/mise"
export MISE_INSTALL_PATH="$HOME/.local/bin/mise"
if ! command-exists mise; then
read -q 'REPLY?mise is not installed, install with `curl https://mise.run | sh`? [y/N]:' &&
read -qr 'REPLY?mise is not installed,' \
'install with "curl https://mise.run | sh"? [y/N]:' &&
echo && curl https://mise.run | sh
fi
if command-exists mise; then
# Remove any stale mise install paths before activation to ensure it correctly
# activates. This ensures any tooling that starts shells with an existing set
# of cached env vars will not cause issues. I'm looking at you, direnv for
# VSCode.
path=("${(@)path:#${MISE_HOME}/installs/*}")
# Activate mise. We cannot use cached-eval here as the activation script
# dynamically adjusts how it modifies PATH on each invocation.
eval "$("$MISE_INSTALL_PATH" activate zsh)"
@@ -275,7 +287,8 @@ fi
# ==============================================================================
if ! command-exists starship && [ -f "$MISE_INSTALL_PATH" ]; then
read -q 'REPLY?starship is not installed, install with `mise use -g starship`? [y/N]:' &&
read -qr 'REPLY?starship is not installed,' \
'install with "mise use -g starship"? [y/N]:' &&
echo && "$MISE_INSTALL_PATH" use -g starship
fi
@@ -321,6 +334,7 @@ source "$DOTZSH/nix.zsh"
source "$DOTZSH/restish.zsh"
source "$DOTZSH/tldr.zsh"
source "$DOTZSH/tmux.zsh"
source "$DOTZSH/iterm2.zsh"
source "$DOTZSH/vscode.zsh"
source "$DOTZSH/zoxide.zsh"