Compare commits

...

23 Commits

Author SHA1 Message Date
coderabbitai[bot]
ba99c00ec9 📝 CodeRabbit Chat: Add generated unit tests 2026-03-18 13:41:08 +00:00
03ba75d908 fix: improve shell detection, curl flags, and cleanup robustness
- Use ZSH_VERSION instead of ZSH_NAME for reliable zsh detection
- Document NVIM_* env vars as optional external overrides
- Add -fsSL flags to curl for mise bootstrap
- Consolidate duplicate shellcheck directives in install-fonts.sh
- Add explicit return 0 to cleanup script helper functions
- Add actionable remediation to uv-not-found error message
2026-03-18 15:19:33 +02:00
e918a41d75 fix: guard success messages on command exit status
- Source x-path instead of capturing empty stdout via command substitution
- Validate --dry-run argument in cleanup script, reject unknown flags
- Gate success messages on preceding command's exit status with &&
- Applies to dfm (fmt, reset_nvim, shfmt) and install scripts
  (fonts, gh-extensions, python-packages, shellspec, z)
2026-03-18 12:33:00 +02:00
9df2996a5d fix: harden error handling and shell-agnostic mise activation
- Guard x-path call to prevent PATH clobber when missing
- Make husky init.sh use shell-agnostic mise activate --shims
- Add fail-fast to Tier 2 install steps in dfm install all
- Check brew update exit status before reporting success
- Always run mise install during reset_nvim (handles bootstrap)
- Use double-bracket conditional in cleanup script
2026-03-18 11:17:31 +02:00
63977f81db fix(git): use XDG path for host excludesfile
Point excludesfile to ~/.config/git/overrides/ignore instead of
~/.dotfiles/config/git/overrides/ignore for consistency with the
Dotbot-installed symlink layout.
2026-03-18 09:59:55 +02:00
e0ac135352 fix(mise): correct PATH precedence, error handling, and shell detection
- Append non-mise PATH entries so mise shims keep highest precedence
- Remove legacy cargo bin from initial PATH bootstrap
- Detect current shell for mise activate instead of hardcoding bash
- Rename AWS_SESSION_TOKEN to AWS_SESSION_TOKEN_FILE (was a file path)
- Add exit-on-failure checks to dfm mise install block
- Fix reset_nvim to call mise instead of removed npm installer
- Forward all args in dfm mise-cleanup
- Auto-detect DOTFILES in cleanup script when not pre-exported
- Report brew uninstall failures instead of masking with || true
- Fix p10k segment name from MISE to ASDF
- Replace npm with yarn in CLAUDE.md Bash whitelist
2026-03-18 09:15:10 +02:00
df84f1dc0e chore(mise): update configs and add cleanup script documentation
Update tooling configs, shell settings, and editor configurations
as part of the mise migration. Add companion documentation for the
cleanup-old-version-managers script and remove unused fish completions.
2026-03-18 08:43:32 +02:00
d5e692e997 chore(mise): trust project directories for auto-activation 2026-03-18 04:08:01 +02:00
fedb3c7cd1 chore: update project tooling and metadata 2026-03-18 04:04:39 +02:00
026aa8afa7 refactor(mise): consolidate version files into .mise.toml 2026-03-18 04:03:41 +02:00
8db8cbbe38 feat(dfm): add cleanup script for old version manager installations 2026-03-18 04:03:31 +02:00
bf61ccd8fb chore(brew): remove tools now managed by mise 2026-03-18 04:03:24 +02:00
425543b40a refactor(dfm): replace per-language install commands with mise 2026-03-18 04:03:15 +02:00
2d316bfed7 refactor(shell): replace version managers with mise activate 2026-03-18 04:03:06 +02:00
cccb64a703 feat(mise): add global mise config for unified tool management 2026-03-18 04:02:55 +02:00
052813695a feat(shell): align fish, bash, and zsh shell configurations
Synchronize environment variables, PATH entries, and aliases across
all three shell configs to ensure consistent behavior on all hosts.
2026-03-18 02:11:38 +02:00
51bb734998 style(karabiner): reformat karabiner.json 2026-03-18 01:33:10 +02:00
b530a6d8e9 feat(git): add host-specific git ignore and excludesfile 2026-03-18 01:33:03 +02:00
ed1fe05681 feat(tmux): enable allow-passthrough for terminal queries 2026-03-18 01:32:55 +02:00
f6cd1a4e6e update(fish): add dark-mode section to Catppuccin themes 2026-03-18 01:32:48 +02:00
85345121b2 feat(fish): add kubectl and orbctl completions 2026-03-18 01:32:38 +02:00
1341aaf3b0 feat(fish): add dotnet tools to PATH 2026-03-18 01:32:32 +02:00
10aa7be8f8 fix(fish): use $HOME instead of hardcoded path in rustup.fish 2026-03-18 01:32:18 +02:00
60 changed files with 1555 additions and 903 deletions

View File

@@ -7,6 +7,7 @@
"Exclude": [ "Exclude": [
"base/plan", "base/plan",
"config/fish/completions/.*", "config/fish/completions/.*",
"config/karabiner/.*",
"config/fish/conf.d/.*", "config/fish/conf.d/.*",
"config/fish/functions/.*", "config/fish/functions/.*",
"config/fzf/key-bindings.fish", "config/fzf/key-bindings.fish",

2
.gitignore vendored
View File

@@ -25,6 +25,8 @@ config/alacritty/theme-active.toml
config/cheat/cheatsheets/pure-bash-bible/* config/cheat/cheatsheets/pure-bash-bible/*
config/cheat/cheatsheets/tldr/* config/cheat/cheatsheets/tldr/*
config/fish/completions/asdf.fish config/fish/completions/asdf.fish
config/fish/completions/kubectl.fish
config/fish/completions/orbctl.fish
config/fish/fish_variables config/fish/fish_variables
config/fish/fish_variables.* config/fish/fish_variables.*
config/gh/hosts.yml config/gh/hosts.yml

View File

@@ -1 +0,0 @@
1.25.5

4
.mise.toml Normal file
View File

@@ -0,0 +1,4 @@
[tools]
node = "24.14.0"
python = "3.14.3"
go = "1.25.5"

1
.nvmrc
View File

@@ -1 +0,0 @@
24.14.0

View File

@@ -1 +0,0 @@
3.14.3

View File

@@ -50,12 +50,11 @@ the primary installation framework to manage symlinks and setup configurations.
- **Platform**: Darwin (macOS) - Version 24.6.0 - **Platform**: Darwin (macOS) - Version 24.6.0
- **Architecture**: Universal (Intel/Apple Silicon via Homebrew) - **Architecture**: Universal (Intel/Apple Silicon via Homebrew)
- **Dependencies**: Git, Homebrew, Yarn, various CLI tools managed via asdf/aqua - **Dependencies**: Git, Homebrew, Yarn, various CLI tools managed via mise
## Development Environment ## Development Environment
- Node.js managed via nvm/asdf - Node.js, Go, Python, Ruby, Rust managed via mise
- Go version specified (.go-version) - Version files (.nvmrc, .go-version, .python-version) consumed by mise via idiomatic_version_file
- Python version specified (.python-version)
- Package management via Yarn with lockfile - Package management via Yarn with lockfile
- TypeScript support for configuration files - TypeScript support for configuration files

View File

@@ -30,7 +30,7 @@ Configuration files for development tools and applications:
- `starship.toml` - Starship prompt configuration - `starship.toml` - Starship prompt configuration
- `shared.sh` - Cross-shell compatibility functions - `shared.sh` - Cross-shell compatibility functions
- `aerospace/`, `amethyst/`, `yabai/`, `skhd/` - Window managers - `aerospace/`, `amethyst/`, `yabai/`, `skhd/` - Window managers
- `direnv/`, `asdf/`, `aqua/` - Development environment tools - `direnv/`, `mise/`, `aqua/` - Development environment tools
- `gpg-tui/`, `op/`, `gh/` - Security and CLI tools - `gpg-tui/`, `op/`, `gh/` - Security and CLI tools
- Theme configurations: everforest color schemes across multiple tools - Theme configurations: everforest color schemes across multiple tools
@@ -97,7 +97,7 @@ Installation and setup automation scripts
- `.shellcheckrc` - ShellCheck configuration - `.shellcheckrc` - ShellCheck configuration
- `.mega-linter.yml` - MegaLinter configuration - `.mega-linter.yml` - MegaLinter configuration
- `.luarc.json` - Lua language server configuration - `.luarc.json` - Lua language server configuration
- `.nvmrc`, `.go-version`, `.python-version` - Version management - `.nvmrc`, `.go-version`, `.python-version` - Version files (consumed by mise)
- Various ignore files (.gitignore, .prettierignore, .yamlignore, etc.) - Various ignore files (.gitignore, .prettierignore, .yamlignore, etc.)
## Testing Infrastructure ## Testing Infrastructure

View File

@@ -59,10 +59,11 @@ pre-commit run --all-files
## Version Management ## Version Management
```bash ```bash
# Check current versions # Check current versions (all managed by mise)
node --version # Managed by nvm (.nvmrc: v20.18.1) node --version # mise (.nvmrc via idiomatic_version_file)
go version # Managed by asdf (.go-version) go version # mise (.go-version)
python --version # Managed by asdf (.python-version) python --version # mise (.python-version)
mise ls # List all installed tool versions
``` ```
## System Utilities (Darwin-specific) ## System Utilities (Darwin-specific)

View File

@@ -169,3 +169,87 @@ SC2174 (mkdir -p -m), SC2016 (single-quote expressions).
## Package Manager ## Package Manager
Yarn (v4.12.0) is the package manager. Do not use npm. Yarn (v4.12.0) is the package manager. Do not use npm.
# context-mode — MANDATORY routing rules
You have context-mode MCP tools available. These rules are NOT optional —
they protect your context window from flooding.
A single unrouted command can dump 56 KB into context and waste the entire session.
## BLOCKED commands — do NOT attempt these
### curl / wget — BLOCKED
Any Bash command containing `curl` or `wget` is intercepted and replaced with an error message. Do NOT retry.
Instead use:
- `ctx_fetch_and_index(url, source)` to fetch and index web pages
- `ctx_execute(language: "javascript", code: "const r = await fetch(...)")` to run HTTP calls in sandbox
### Inline HTTP — BLOCKED
Any Bash command containing `fetch('http`, `requests.get(`, `requests.post(`,
`http.get(`, or `http.request(` is intercepted and replaced with an error message.
Do NOT retry with Bash.
Instead use:
- `ctx_execute(language, code)` to run HTTP calls in sandbox — only stdout enters context
### WebFetch — BLOCKED
WebFetch calls are denied entirely. The URL is extracted and you are told to use `ctx_fetch_and_index` instead.
Instead use:
- `ctx_fetch_and_index(url, source)` then `ctx_search(queries)` to query the indexed content
## REDIRECTED tools — use sandbox equivalents
### Bash (>20 lines output)
Bash is ONLY for: `git`, `mkdir`, `rm`, `mv`, `cd`, `ls`, `yarn install`, `pip install`,
and other short-output commands.
For everything else, use:
- `ctx_batch_execute(commands, queries)` — run multiple commands + search in ONE call
- `ctx_execute(language: "shell", code: "...")` — run in sandbox, only stdout enters context
### Read (for analysis)
If you are reading a file to **Edit** it → Read is correct (Edit needs content in context).
If you are reading to **analyze, explore, or summarize**
use `ctx_execute_file(path, language, code)` instead.
Only your printed summary enters context. The raw file content stays in the sandbox.
### Grep (large results)
Grep results can flood context.
Use `ctx_execute(language: "shell", code: "grep ...")` to run searches in sandbox.
Only your printed summary enters context.
## Tool selection hierarchy
1. **GATHER**: `ctx_batch_execute(commands, queries)` — Primary tool.
Runs all commands, auto-indexes output, returns search results.
ONE call replaces 30+ individual calls.
2. **FOLLOW-UP**: `ctx_search(queries: ["q1", "q2", ...])`
Query indexed content. Pass ALL questions as array in ONE call.
3. **PROCESSING**: `ctx_execute(language, code)` |
`ctx_execute_file(path, language, code)`
Sandbox execution. Only stdout enters context.
4. **WEB**: `ctx_fetch_and_index(url, source)` then
`ctx_search(queries)` — Fetch, chunk, index, query.
Raw HTML never enters context.
5. **INDEX**: `ctx_index(content, source)`
Store content in FTS5 knowledge base for later search.
## Subagent routing
When spawning subagents (Agent/Task tool), the routing block is automatically
injected into their prompt. Bash-type subagents are upgraded to general-purpose
so they have access to MCP tools.
You do NOT need to manually instruct subagents about context-mode.
## Output constraints
- Keep responses under 500 words.
- Write artifacts (code, configs, PRDs) to FILES — never return them
as inline text. Return only: file path + 1-line description.
- When indexing content, use descriptive source labels so others can `ctx_search(source: "label")` later.
## ctx commands
| Command | Action |
|---------------|---------------------------------------------------------------------------------------|
| `ctx stats` | Call the `ctx_stats` MCP tool and display the full output verbatim |
| `ctx doctor` | Call the `ctx_doctor` MCP tool, run the returned shell command, display as checklist |
| `ctx upgrade` | Call the `ctx_upgrade` MCP tool, run the returned shell command, display as checklist |

View File

@@ -1,5 +1,5 @@
{ {
"$schema": "https://biomejs.dev/schemas/2.4.4/schema.json", "$schema": "https://biomejs.dev/schemas/2.4.7/schema.json",
"vcs": { "vcs": {
"enabled": true, "enabled": true,
"clientKind": "git", "clientKind": "git",
@@ -20,6 +20,7 @@
"!!**/config/op/plugins/used_plugins", "!!**/config/op/plugins/used_plugins",
"!!**/config/tmux/plugins", "!!**/config/tmux/plugins",
"!!**/config/zsh", "!!**/config/zsh",
"!!**/config/karabiner",
"!!**/config/vim", "!!**/config/vim",
"!!**/lazy-lock.json", "!!**/lazy-lock.json",
"!!**/local/bin/antigen.zsh", "!!**/local/bin/antigen.zsh",

View File

@@ -33,6 +33,8 @@ alias .c='cd $HOME/Code'
alias .d='cd $DOTFILES' alias .d='cd $DOTFILES'
alias .l='cd $HOME/.local' alias .l='cd $HOME/.local'
alias .o='cd $HOME/Code/ivuorinen/obsidian/' alias .o='cd $HOME/Code/ivuorinen/obsidian/'
alias .s='cd $HOME/Code/s'
alias .p='cd $HOME/Code/ivuorinen'
# Shortcuts for listing # Shortcuts for listing
alias ll="ls -la" alias ll="ls -la"

View File

@@ -14,7 +14,20 @@
# if DOTFILES is not set, set it to the default location # if DOTFILES is not set, set it to the default location
[ -z "${DOTFILES:-}" ] && export DOTFILES="$HOME/.dotfiles" [ -z "${DOTFILES:-}" ] && export DOTFILES="$HOME/.dotfiles"
export PATH="$XDG_BIN_HOME:$DOTFILES/local/bin:$XDG_DATA_HOME/bob/nvim-bin:$XDG_DATA_HOME/cargo/bin:/opt/homebrew/bin:/usr/local/bin:$PATH" # Editor settings
[ -z "${EDITOR:-}" ] && export EDITOR="nvim"
[ -z "${VISUAL:-}" ] && export VISUAL="code"
# Bootstrap: ensure local/bin is on PATH so x-path is available
PATH="$DOTFILES/local/bin:$PATH"
# Use x-path to deduplicate PATH entries (only if x-path is available)
if command -v x-path &> /dev/null; then
# shellcheck source=../local/bin/x-path
source "$(command -v x-path)"
normalize_path_var
do_prepend "$XDG_BIN_HOME" "$DOTFILES/local/bin" "/opt/homebrew/bin" "/usr/local/bin"
fi
export PATH
if ! command -v msg &> /dev/null; then if ! command -v msg &> /dev/null; then
# Function to print messages if VERBOSE is enabled # Function to print messages if VERBOSE is enabled
@@ -304,7 +317,7 @@ export ANTIDOTE_PLUGINS="$XDG_CONFIG_HOME/zsh/antidote_plugins"
# https://docs.ansible.com/ansible/latest/reference_appendices/config.html # https://docs.ansible.com/ansible/latest/reference_appendices/config.html
msg "Setting up Ansible configuration" msg "Setting up Ansible configuration"
export ANSIBLE_HOME="$XDG_CONFIG_HOME/ansible" export ANSIBLE_HOME="$XDG_CONFIG_HOME/ansible"
export ANSIBLE_CONFIG="$XDG_CONFIG_HOME/ansible.cfg" export ANSIBLE_CONFIG="$ANSIBLE_HOME/ansible.cfg"
export ANSIBLE_GALAXY_CACHE_DIR="$XDG_CACHE_HOME/ansible/galaxy_cache" export ANSIBLE_GALAXY_CACHE_DIR="$XDG_CACHE_HOME/ansible/galaxy_cache"
x-dc "$ANSIBLE_HOME" x-dc "$ANSIBLE_HOME"
x-dc "$ANSIBLE_GALAXY_CACHE_DIR" x-dc "$ANSIBLE_GALAXY_CACHE_DIR"
@@ -325,10 +338,26 @@ export AWS_CONFIGURE_OUTPUT=true
export AWS_CONFIGURE_PROFILE=true export AWS_CONFIGURE_PROFILE=true
export AWS_CONFIGURE_PROMPT=true export AWS_CONFIGURE_PROMPT=true
export AWS_CONFIGURE_PROMPT_DEFAULT="default" export AWS_CONFIGURE_PROMPT_DEFAULT="default"
export AWS_SESSION_TOKEN_FILE="${XDG_STATE_HOME}/aws/session_token"
export AWS_CONFIGURE_SESSION=true
export AWS_CONFIGURE_SESSION_DURATION=7200
export AWS_CONFIGURE_SESSION_MFA=true
# bob manages nvim versions # Mason (nvim package manager)
msg "Setting up bob configuration" msg "Setting up Mason configuration"
x-path-prepend "$XDG_DATA_HOME/bob/nvim-bin" export MASON_HOME="$XDG_DATA_HOME/nvim/mason"
# Neovim environment variables — optional overrides for external tools.
# Neovim itself uses vim.fn.stdpath() and does not read these.
msg "Setting up Neovim configuration"
[ -z "${NVIM_STATE:-}" ] && export NVIM_STATE="$XDG_STATE_HOME/nvim"
[ -z "${NVIM_CONFIG_HOME:-}" ] && export NVIM_CONFIG_HOME="$XDG_CONFIG_HOME/nvim"
[ -z "${NVIM_DATA_HOME:-}" ] && export NVIM_DATA_HOME="$XDG_DATA_HOME/nvim"
[ -z "${NVIM_CACHE_HOME:-}" ] && export NVIM_CACHE_HOME="$XDG_CACHE_HOME/nvim"
[ -z "${NVIM_LOG_PATH:-}" ] && export NVIM_LOG_PATH="$NVIM_STATE/log"
[ -z "${NVIM_SESSION_PATH:-}" ] && export NVIM_SESSION_PATH="$NVIM_STATE/session"
[ -z "${NVIM_SHADA_PATH:-}" ] && export NVIM_SHADA_PATH="$NVIM_STATE/shada"
[ -z "${NVIM_UNDO_PATH:-}" ] && export NVIM_UNDO_PATH="$NVIM_STATE/undo"
# bkt (shell command caching tool) configuration # bkt (shell command caching tool) configuration
msg "Setting up bkt configuration" msg "Setting up bkt configuration"
@@ -350,12 +379,21 @@ export COMPOSER_HOME="$XDG_STATE_HOME/composer"
export COMPOSER_BIN="$COMPOSER_HOME/vendor/bin" export COMPOSER_BIN="$COMPOSER_HOME/vendor/bin"
export PATH="$COMPOSER_BIN:$PATH" export PATH="$COMPOSER_BIN:$PATH"
# Yarn
msg "Setting up Yarn configuration"
export YARN_GLOBAL_FOLDER="$XDG_DATA_HOME/yarn"
# docker, https://docs.docker.com/engine/reference/commandline/cli/ # docker, https://docs.docker.com/engine/reference/commandline/cli/
msg "Setting up Docker configuration" msg "Setting up Docker configuration"
export DOCKER_CONFIG="${XDG_CONFIG_HOME}/docker" export DOCKER_CONFIG="${XDG_CONFIG_HOME}/docker"
x-dc "$DOCKER_CONFIG" x-dc "$DOCKER_CONFIG"
# Docker: Disable snyk ad # Docker: Disable snyk ad
export DOCKER_SCAN_SUGGEST=false export DOCKER_SCAN_SUGGEST=false
export DOCKER_HIDE_LEGACY_COMMANDS=true
# direnv
msg "Setting up direnv configuration"
export DIRENV_LOG_FORMAT=""
# fzf # fzf
export FZF_BASE="${XDG_CONFIG_HOME}/fzf" export FZF_BASE="${XDG_CONFIG_HOME}/fzf"
@@ -375,13 +413,6 @@ export GOBIN="$XDG_BIN_HOME"
# Lando # Lando
export PATH="$HOME/.lando/bin${PATH+:$PATH}" #landopath export PATH="$HOME/.lando/bin${PATH+:$PATH}" #landopath
# NPM: Add npm packages to path
msg "Setting up NPM configuration"
x-have node && {
NVM_NODE_BIN_DIR="$(dirname "$(which node)")"
export PATH="$NVM_NODE_BIN_DIR:$PATH"
}
# oh-my-posh (omp) configuration # oh-my-posh (omp) configuration
msg "Setting up oh-my-posh configuration" msg "Setting up oh-my-posh configuration"
export OHMYPOSH_CFG="$DOTFILES/config/omp/own.toml" export OHMYPOSH_CFG="$DOTFILES/config/omp/own.toml"
@@ -391,20 +422,21 @@ msg "Setting up 1Password CLI configuration"
export OP_CACHE="$XDG_STATE_HOME/1password" export OP_CACHE="$XDG_STATE_HOME/1password"
# Python # Python
#
# pyenv, python environments
msg "Setting up Python configuration" msg "Setting up Python configuration"
export WORKON_HOME="$XDG_DATA_HOME/virtualenvs" export WORKON_HOME="$XDG_DATA_HOME/virtualenvs"
export PYENV_ROOT="$XDG_STATE_HOME/pyenv"
## for MichaelAquilina/zsh-autoswitch-virtualenv ## for MichaelAquilina/zsh-autoswitch-virtualenv
export AUTOSWITCH_VIRTUAL_ENV_DIR="$WORKON_HOME" export AUTOSWITCH_VIRTUAL_ENV_DIR="$WORKON_HOME"
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
x-have pyenv && eval "$(pyenv init -)"
# Rust / cargo # Rust / cargo
msg "Setting up Rust/Cargo configuration" msg "Setting up Rust/Cargo configuration"
export RUST_WITHOUT=rust-docs export CARGO_HOME="$XDG_DATA_HOME/cargo"
export CARGO_BIN_HOME="$XDG_BIN_HOME"
export RUSTUP_HOME="$XDG_DATA_HOME/rustup"
export RUST_WITHOUT="clippy,docs,rls"
# Poetry
msg "Setting up Poetry configuration"
export POETRY_HOME="$XDG_DATA_HOME/poetry"
# sonarlint # sonarlint
# https://www.sonarlint.org/ # https://www.sonarlint.org/
@@ -433,6 +465,10 @@ export ZSH_TMUX_UNICODE=true
export ZSH_TMUX_AUTOQUIT=false export ZSH_TMUX_AUTOQUIT=false
export ZSH_TMUX_DEFAULT_SESSION_NAME=main export ZSH_TMUX_DEFAULT_SESSION_NAME=main
# tms (tmux session manager)
msg "Setting up tms configuration"
export TMS_CONFIG_FILE="$XDG_CONFIG_HOME/tms/config.toml"
# wakatime, https://github.com/wakatime/wakatime-cli # wakatime, https://github.com/wakatime/wakatime-cli
msg "Setting up Wakatime configuration" msg "Setting up Wakatime configuration"
export WAKATIME_HOME="$XDG_STATE_HOME/wakatime" export WAKATIME_HOME="$XDG_STATE_HOME/wakatime"
@@ -442,12 +478,39 @@ x-dc "$WAKATIME_HOME"
msg "Setting up LM Studio configuration" msg "Setting up LM Studio configuration"
export PATH="$PATH:$HOME/.lmstudio/bin" export PATH="$PATH:$HOME/.lmstudio/bin"
# Screen
msg "Setting up screen configuration"
export SCREENRC="$XDG_CONFIG_HOME/misc/screenrc"
# Zoxide
msg "Setting up Zoxide configuration"
export _ZO_DATA_DIR="$XDG_DATA_HOME/zoxide"
export _ZO_EXCLUDE_DIRS="$XDG_DATA_HOME"
# Misc # Misc
msg "Setting up miscellaneous configuration" msg "Setting up miscellaneous configuration"
export ZSHZ_DATA="$XDG_STATE_HOME/z" export ZSHZ_DATA="$XDG_STATE_HOME/z"
export CHEAT_USE_FZF=true export CHEAT_USE_FZF=true
export SQLITE_HISTORY="${XDG_CACHE_HOME}/sqlite_history" export SQLITE_HISTORY="${XDG_CACHE_HOME}/sqlite_history"
# Additional PATH entries (aligned with fish config)
[ -d "$XDG_DATA_HOME/mise/shims" ] && export PATH="$XDG_DATA_HOME/mise/shims:$PATH"
[ -d "$YARN_GLOBAL_FOLDER/bin" ] && export PATH="$PATH:$YARN_GLOBAL_FOLDER/bin"
[ -d "$MASON_HOME/bin" ] && export PATH="$PATH:$MASON_HOME/bin"
[ -d "$HOME/.dotnet/tools" ] && export PATH="$PATH:$HOME/.dotnet/tools"
[ -d "$POETRY_HOME/bin" ] && export PATH="$PATH:$POETRY_HOME/bin"
[ -d "$HOME/.opencode/bin" ] && export PATH="$PATH:$HOME/.opencode/bin"
# mise — unified tool version manager
# https://mise.jdx.dev
if command -v mise &> /dev/null; then
if [ -n "${ZSH_VERSION:-}" ]; then
eval "$(mise activate zsh)"
else
eval "$(mise activate bash)"
fi
fi
if [ -f "$XDG_CONFIG_HOME/exports-secret" ]; then source "$XDG_CONFIG_HOME/exports-secret"; fi if [ -f "$XDG_CONFIG_HOME/exports-secret" ]; then source "$XDG_CONFIG_HOME/exports-secret"; fi
if [ -f "$XDG_CONFIG_HOME/exports-local" ]; then source "$XDG_CONFIG_HOME/exports-local"; fi if [ -f "$XDG_CONFIG_HOME/exports-local" ]; then source "$XDG_CONFIG_HOME/exports-local"; fi
# shellcheck source=./exports-lakka # shellcheck source=./exports-lakka

View File

@@ -1,6 +1,7 @@
# Set aliases for fish shell # Set aliases for fish shell
alias vim='vim -u "$XDG_CONFIG_HOME/vim/vimrc"' alias vim='nvim'
alias vi='nvim'
# eza aliases if eza is installed # eza aliases if eza is installed
if type -q eza >/dev/null if type -q eza >/dev/null
@@ -92,5 +93,41 @@ function configure_tide \
--transient=Yes --transient=Yes
end end
# Navigation aliases
abbr --add .. 'cd ..'
abbr --add ... 'cd ../..'
abbr --add .... 'cd ../../..'
# Interesting folders
function .b --wraps='cd $XDG_BIN_HOME' --description 'cd $XDG_BIN_HOME'
cd $XDG_BIN_HOME $argv
end
function .l --wraps='cd ~/.local' --description 'cd ~/.local'
cd ~/.local $argv
end
function .o --wraps='cd ~/Code/ivuorinen/obsidian/' --description 'cd ~/Code/ivuorinen/obsidian/'
cd ~/Code/ivuorinen/obsidian/ $argv
end
# cd to git root directory
function cdgr --description 'cd to git root'
if git rev-parse --is-inside-work-tree &>/dev/null
cd (git rev-parse --show-toplevel); or return $status
else
echo >&2 "Not in a git repository"
return 1
end
end
# Colored grep
abbr --add grep 'grep --color'
# Date helpers
alias isodate="date +'%Y-%m-%d'"
alias x-datetime="date +'%Y-%m-%d %H:%M:%S'"
alias x-timestamp="date +'%s'"
# Random abbreviations # Random abbreviations
abbr --add stats onefetch --nerd-fonts --true-color never abbr --add stats onefetch --nerd-fonts --true-color never

View File

@@ -1 +0,0 @@
source "/home/ivuorinen/.local/share/cargo/env.fish"

View File

@@ -22,20 +22,17 @@ if status is-interactive
type -q op; and test -e "$HOME/.config/op/plugins.sh" && type -q op; and test -e "$HOME/.config/op/plugins.sh" &&
source "$HOME/.config/op/plugins.sh" source "$HOME/.config/op/plugins.sh"
# version manager initializers # mise version manager
type -q mise; and source (mise activate fish|psub) type -q mise; and mise activate fish | source
type -q rbenv; and source (rbenv init -|psub)
type -q pyenv; and source (pyenv init -|psub)
type -q pyenv; and source (pyenv virtualenv-init -|psub)
type -q goenv; and source (goenv init -|psub)
# type -q fnm; and fnm env --use-on-cd --shell fish | source
type -q load_nvm; and load_nvm >/dev/stderr
# Initialize other tools if available # Initialize other tools if available
type -q zoxide; and zoxide init fish | source type -q zoxide; and zoxide init fish | source
# Start tmux if not already running and not in SSH # Start tmux if not already running and not in SSH
#.t # defined in functions/.t.fish #.t # defined in functions/.t.fish
else
# Non-interactive shells (IDE subprocesses) use shims for tool discovery
type -q mise; and mise activate fish --shims | source
end end
# Added by LM Studio CLI (lms) # Added by LM Studio CLI (lms)

View File

@@ -23,11 +23,6 @@ fish_add_path "$XDG_DATA_HOME/mise/shims"
# Add cargo bin to path # Add cargo bin to path
fish_add_path "$XDG_DATA_HOME/cargo/bin" fish_add_path "$XDG_DATA_HOME/cargo/bin"
# NPM/NVM configuration
set -q NVM_DIR; or set -x NVM_DIR "$XDG_DATA_HOME/nvm"
fish_add_path "$NVM_DIR/bin"
fish_add_path "$XDG_CONFIG_HOME/nvm"
# Yarn configuration # Yarn configuration
set -q YARN_GLOBAL_FOLDER; or set -x YARN_GLOBAL_FOLDER "$XDG_DATA_HOME/yarn" set -q YARN_GLOBAL_FOLDER; or set -x YARN_GLOBAL_FOLDER "$XDG_DATA_HOME/yarn"
fish_add_path "$YARN_GLOBAL_FOLDER/bin" fish_add_path "$YARN_GLOBAL_FOLDER/bin"
@@ -36,6 +31,9 @@ fish_add_path "$YARN_GLOBAL_FOLDER/bin"
set -q MASON_HOME; or set -x MASON_HOME "$XDG_DATA_HOME/nvim/mason" set -q MASON_HOME; or set -x MASON_HOME "$XDG_DATA_HOME/nvim/mason"
fish_add_path "$MASON_HOME/bin" fish_add_path "$MASON_HOME/bin"
# Add dotnet tools to path
fish_add_path "$HOME/.dotnet/tools/"
# Set Neovim environment variables # Set Neovim environment variables
test -z "$NVIM_STATE" && set -x NVIM_STATE "$XDG_STATE_HOME/nvim" test -z "$NVIM_STATE" && set -x NVIM_STATE "$XDG_STATE_HOME/nvim"
test -z "$NVIM_CONFIG_HOME" && set -x NVIM_CONFIG_HOME "$XDG_CONFIG_HOME/nvim" test -z "$NVIM_CONFIG_HOME" && set -x NVIM_CONFIG_HOME "$XDG_CONFIG_HOME/nvim"
@@ -58,11 +56,14 @@ set -q AWS_CONFIG_FILE; or set -x AWS_CONFIG_FILE "$XDG_STATE_HOME/aws/config"
set -q AWS_SHARED_CREDENTIALS_FILE; or set -x AWS_SHARED_CREDENTIALS_FILE "$XDG_STATE_HOME/aws/credentials" set -q AWS_SHARED_CREDENTIALS_FILE; or set -x AWS_SHARED_CREDENTIALS_FILE "$XDG_STATE_HOME/aws/credentials"
set -q AWS_SESSION_TOKEN; or set -x AWS_SESSION_TOKEN "$XDG_STATE_HOME/aws/session_token" set -q AWS_SESSION_TOKEN; or set -x AWS_SESSION_TOKEN "$XDG_STATE_HOME/aws/session_token"
set -q AWS_DATA_PATH; or set -x AWS_DATA_PATH "$XDG_DATA_HOME/aws" set -q AWS_DATA_PATH; or set -x AWS_DATA_PATH "$XDG_DATA_HOME/aws"
set -q AWS_DEFAULT_REGION; or set -x AWS_DEFAULT_REGION eu-west-1
set -q AWS_DEFAULT_OUTPUT; or set -x AWS_DEFAULT_OUTPUT table set -q AWS_DEFAULT_OUTPUT; or set -x AWS_DEFAULT_OUTPUT table
set -q AWS_CONFIGURE_KEYS; or set -x AWS_CONFIGURE_KEYS true set -q AWS_CONFIGURE_KEYS; or set -x AWS_CONFIGURE_KEYS true
set -q AWS_CONFIGURE_SESSION; or set -x AWS_CONFIGURE_SESSION true set -q AWS_CONFIGURE_SESSION; or set -x AWS_CONFIGURE_SESSION true
set -q AWS_CONFIGURE_SESSION_DURATION; or set -x AWS_CONFIGURE_SESSION_DURATION 7200 set -q AWS_CONFIGURE_SESSION_DURATION; or set -x AWS_CONFIGURE_SESSION_DURATION 7200
set -q AWS_CONFIGURE_SESSION_MFA; or set -x AWS_CONFIGURE_SESSION_MFA true set -q AWS_CONFIGURE_SESSION_MFA; or set -x AWS_CONFIGURE_SESSION_MFA true
set -q AWS_CONFIGURE_REGION; or set -x AWS_CONFIGURE_REGION true
set -q AWS_CONFIGURE_OUTPUT; or set -x AWS_CONFIGURE_OUTPUT true
set -q AWS_CONFIGURE_PROFILE; or set -x AWS_CONFIGURE_PROFILE true set -q AWS_CONFIGURE_PROFILE; or set -x AWS_CONFIGURE_PROFILE true
set -q AWS_CONFIGURE_PROMPT; or set -x AWS_CONFIGURE_PROMPT true set -q AWS_CONFIGURE_PROMPT; or set -x AWS_CONFIGURE_PROMPT true
set -q AWS_CONFIGURE_PROMPT_DEFAULT; or set -x AWS_CONFIGURE_PROMPT_DEFAULT true set -q AWS_CONFIGURE_PROMPT_DEFAULT; or set -x AWS_CONFIGURE_PROMPT_DEFAULT true
@@ -87,14 +88,6 @@ x-dc "$DOCKER_CONFIG"
set -q DOCKER_HIDE_LEGACY_COMMANDS; or set -x DOCKER_HIDE_LEGACY_COMMANDS true set -q DOCKER_HIDE_LEGACY_COMMANDS; or set -x DOCKER_HIDE_LEGACY_COMMANDS true
set -q DOCKER_SCAN_SUGGEST; or set -x DOCKER_SCAN_SUGGEST false set -q DOCKER_SCAN_SUGGEST; or set -x DOCKER_SCAN_SUGGEST false
# FNM / Node.js configuration
set -q FNM_DIR; or set -x FNM_DIR "$XDG_DATA_HOME/fnm"
fish_add_path "$FNM_DIR"
set -q FNM_VERSION_FILE_STRATEGY; or set -x FNM_VERSION_FILE_STRATEGY recursive
set -q FNM_USE_ON_CD; or set -x FNM_USE_ON_CD true
set -q FNM_COREPACK_ENABLED; or set -x FNM_COREPACK_ENABLED true
set -q FNM_RESOLVE_ENGINES; or set -x FNM_RESOLVE_ENGINES true
# fzf configuration # fzf configuration
set -q FZF_BASE; or set -x FZF_BASE "$XDG_CONFIG_HOME/fzf" set -q FZF_BASE; or set -x FZF_BASE "$XDG_CONFIG_HOME/fzf"
set -q FZF_DEFAULT_OPTS; or set -x FZF_DEFAULT_OPTS \ set -q FZF_DEFAULT_OPTS; or set -x FZF_DEFAULT_OPTS \
@@ -104,19 +97,14 @@ set -q FZF_DEFAULT_OPTS; or set -x FZF_DEFAULT_OPTS \
set -q GNUPGHOME; or set -x GNUPGHOME "$XDG_DATA_HOME/gnupg" set -q GNUPGHOME; or set -x GNUPGHOME "$XDG_DATA_HOME/gnupg"
# Go configuration # Go configuration
# set -q GOPATH; or set -x GOPATH "$XDG_DATA_HOME/go" set -q GOPATH; or set -x GOPATH "$XDG_DATA_HOME/go"
set -q GOBIN; or set -x GOBIN "$XDG_BIN_HOME" set -q GOBIN; or set -x GOBIN "$XDG_BIN_HOME"
set -q GOENV_ROOT; or set -x GOENV_ROOT "$XDG_DATA_HOME/goenv"
set -q GOENV_RC_FILE; or set -x GOENV_RC_FILE "$XDG_CONFIG_HOME/goenv/goenvrc.fish"
# 1Password configuration # 1Password configuration
set -q OP_CACHE; or set -x OP_CACHE "$XDG_STATE_HOME/1password" set -q OP_CACHE; or set -x OP_CACHE "$XDG_STATE_HOME/1password"
# Python configuration # Python configuration
set -q WORKON_HOME; or set -x WORKON_HOME "$XDG_DATA_HOME/virtualenvs" set -q WORKON_HOME; or set -x WORKON_HOME "$XDG_DATA_HOME/virtualenvs"
set -q PYENV_ROOT; or set -x PYENV_ROOT "$XDG_DATA_HOME/pyenv"
fish_add_path "$PYENV_ROOT/bin"
# Poetry configuration # Poetry configuration
set -q POETRY_HOME; or set -x POETRY_HOME "$XDG_DATA_HOME/poetry" set -q POETRY_HOME; or set -x POETRY_HOME "$XDG_DATA_HOME/poetry"
@@ -128,7 +116,6 @@ set -q CARGO_BIN_HOME; or set -x CARGO_BIN_HOME "$XDG_BIN_HOME"
set -q RUSTUP_HOME; or set -x RUSTUP_HOME "$XDG_DATA_HOME/rustup" set -q RUSTUP_HOME; or set -x RUSTUP_HOME "$XDG_DATA_HOME/rustup"
set -x RUST_WITHOUT "clippy,docs,rls" set -x RUST_WITHOUT "clippy,docs,rls"
fish_add_path "$CARGO_HOME/bin" fish_add_path "$CARGO_HOME/bin"
fish_add_path "$XDG_DATA_HOME/bob/nvim-bin"
# screen configuration # screen configuration
set -q SCREENRC; or set -x SCREENRC "$XDG_CONFIG_HOME/misc/screenrc" set -q SCREENRC; or set -x SCREENRC "$XDG_CONFIG_HOME/misc/screenrc"
@@ -166,6 +153,15 @@ x-dc "$WAKATIME_HOME"
set -q _ZO_DATA_DIR; or set -x _ZO_DATA_DIR "$XDG_DATA_HOME/zoxide" set -q _ZO_DATA_DIR; or set -x _ZO_DATA_DIR "$XDG_DATA_HOME/zoxide"
set -q _ZO_EXCLUDE_DIRS; or set -x _ZO_EXCLUDE_DIRS "$XDG_DATA_HOME" set -q _ZO_EXCLUDE_DIRS; or set -x _ZO_EXCLUDE_DIRS "$XDG_DATA_HOME"
# bkt (shell command caching tool) configuration
set -q BKT_TTL; or set -x BKT_TTL 1m
# Manpager
set -q MANPAGER; or set -x MANPAGER "less -X"
# Lando
fish_add_path "$HOME/.lando/bin"
# Miscellaneous configuration # Miscellaneous configuration
set -q CHEAT_USE_FZF; or set -x CHEAT_USE_FZF true set -q CHEAT_USE_FZF; or set -x CHEAT_USE_FZF true
set -q SQLITE_HISTORY; or set -x SQLITE_HISTORY "$XDG_CACHE_HOME/sqlite/sqlite_history" set -q SQLITE_HISTORY; or set -x SQLITE_HISTORY "$XDG_CACHE_HOME/sqlite/sqlite_history"

View File

@@ -1,16 +0,0 @@
function load_nvm --on-variable="PWD"
set -l default_node_version (nvm version default)
set -l node_version (nvm version)
set -l nvmrc_path (nvm_find_nvmrc)
if test -n "$nvmrc_path"
set -l nvmrc_node_version (nvm version (cat $nvmrc_path))
if test "$nvmrc_node_version" = N/A
nvm install (cat $nvmrc_path)
else if test "$nvmrc_node_version" != "$node_version"
nvm use $nvmrc_node_version
end
else if test "$node_version" != "$default_node_version"
echo "Reverting to default Node version"
nvm use default
end
end

View File

@@ -1,3 +0,0 @@
function nvm
bass source $NVM_DIR/nvm.sh --no-use ';' nvm $argv
end

View File

@@ -1,3 +0,0 @@
function nvm_find_nvmrc
bass source $NVM_DIR/nvm.sh --no-use ';' nvm_find_nvmrc
end

View File

@@ -58,3 +58,32 @@ fish_pager_color_progress 737994
fish_pager_color_prefix f4b8e4 fish_pager_color_prefix f4b8e4
fish_pager_color_completion c6d0f5 fish_pager_color_completion c6d0f5
fish_pager_color_description 737994 fish_pager_color_description 737994
[unknown]
# preferred_background: 303446
fish_color_normal c6d0f5
fish_color_command 8caaee
fish_color_param eebebe
fish_color_keyword ca9ee6
fish_color_quote a6d189
fish_color_redirection f4b8e4
fish_color_end ef9f76
fish_color_comment 838ba7
fish_color_error e78284
fish_color_gray 737994
fish_color_selection --background=414559
fish_color_search_match --background=414559
fish_color_option a6d189
fish_color_operator f4b8e4
fish_color_escape ea999c
fish_color_autosuggestion 737994
fish_color_cancel e78284
fish_color_cwd e5c890
fish_color_user 81c8be
fish_color_host 8caaee
fish_color_host_remote a6d189
fish_color_status e78284
fish_pager_color_progress 737994
fish_pager_color_prefix f4b8e4
fish_pager_color_completion c6d0f5
fish_pager_color_description 737994

View File

@@ -58,3 +58,32 @@ fish_pager_color_progress 6e738d
fish_pager_color_prefix f5bde6 fish_pager_color_prefix f5bde6
fish_pager_color_completion cad3f5 fish_pager_color_completion cad3f5
fish_pager_color_description 6e738d fish_pager_color_description 6e738d
[unknown]
# preferred_background: 24273a
fish_color_normal cad3f5
fish_color_command 8aadf4
fish_color_param f0c6c6
fish_color_keyword c6a0f6
fish_color_quote a6da95
fish_color_redirection f5bde6
fish_color_end f5a97f
fish_color_comment 8087a2
fish_color_error ed8796
fish_color_gray 6e738d
fish_color_selection --background=363a4f
fish_color_search_match --background=363a4f
fish_color_option a6da95
fish_color_operator f5bde6
fish_color_escape ee99a0
fish_color_autosuggestion 6e738d
fish_color_cancel ed8796
fish_color_cwd eed49f
fish_color_user 8bd5ca
fish_color_host 8aadf4
fish_color_host_remote a6da95
fish_color_status ed8796
fish_pager_color_progress 6e738d
fish_pager_color_prefix f5bde6
fish_pager_color_completion cad3f5
fish_pager_color_description 6e738d

View File

@@ -58,3 +58,32 @@ fish_pager_color_progress 6c7086
fish_pager_color_prefix f5c2e7 fish_pager_color_prefix f5c2e7
fish_pager_color_completion cdd6f4 fish_pager_color_completion cdd6f4
fish_pager_color_description 6c7086 fish_pager_color_description 6c7086
[unknown]
# preferred_background: 1e1e2e
fish_color_normal cdd6f4
fish_color_command 89b4fa
fish_color_param f2cdcd
fish_color_keyword cba6f7
fish_color_quote a6e3a1
fish_color_redirection f5c2e7
fish_color_end fab387
fish_color_comment 7f849c
fish_color_error f38ba8
fish_color_gray 6c7086
fish_color_selection --background=313244
fish_color_search_match --background=313244
fish_color_option a6e3a1
fish_color_operator f5c2e7
fish_color_escape eba0ac
fish_color_autosuggestion 6c7086
fish_color_cancel f38ba8
fish_color_cwd f9e2af
fish_color_user 94e2d5
fish_color_host 89b4fa
fish_color_host_remote a6e3a1
fish_color_status f38ba8
fish_pager_color_progress 6c7086
fish_pager_color_prefix f5c2e7
fish_pager_color_completion cdd6f4
fish_pager_color_description 6c7086

View File

@@ -1,2 +1,3 @@
!.gitkeep !.gitkeep
config config
ignore

View File

@@ -1,17 +1,13 @@
tap "1password/tap" tap "1password/tap"
tap "anchore/grype"
tap "cormacrelf/tap" tap "cormacrelf/tap"
tap "ddosify/tap" tap "ddosify/tap"
tap "dm3ch/tap" tap "dm3ch/tap"
tap "doron-cohen/tap" tap "doron-cohen/tap"
tap "gesquive/tap" tap "gesquive/tap"
tap "github/gh"
tap "golangci/tap" tap "golangci/tap"
tap "homebrew/autoupdate" tap "homebrew/autoupdate"
tap "homebrew/bundle" tap "homebrew/bundle"
tap "homebrew/services" tap "homebrew/services"
tap "jesseduffield/lazygit"
tap "k8sgpt-ai/k8sgpt"
tap "keith/formulae" tap "keith/formulae"
tap "koekeishiya/formulae" tap "koekeishiya/formulae"
tap "mongodb/brew" tap "mongodb/brew"
@@ -20,14 +16,9 @@ tap "pantheon-systems/external"
tap "reviewdog/tap" tap "reviewdog/tap"
tap "shivammathur/extensions" tap "shivammathur/extensions"
tap "shivammathur/php" tap "shivammathur/php"
tap "snyk/tap"
tap "tabbyml/tabby" tap "tabbyml/tabby"
tap "teamookla/speedtest" tap "teamookla/speedtest"
tap "xwmx/taps" tap "xwmx/taps"
# Run your GitHub Actions locally
brew "act"
# Simple, modern, secure file encryption
brew "age"
# Mozilla CA certificate store # Mozilla CA certificate store
brew "ca-certificates" brew "ca-certificates"
# Mozilla CA bundle for Python # Mozilla CA bundle for Python
@@ -40,10 +31,6 @@ brew "cryptography"
brew "libyaml" brew "libyaml"
# Display directories as trees (with optional color/HTML output) # Display directories as trees (with optional color/HTML output)
brew "tree" brew "tree"
# Automate deployment, configuration, and upgrading
brew "ansible"
# Checks ansible playbooks for practices and behaviour
brew "ansible-lint"
# Generic-purpose lossless compression algorithm by Google # Generic-purpose lossless compression algorithm by Google
brew "brotli" brew "brotli"
# Library and utilities for processing GIFs # Library and utilities for processing GIFs
@@ -80,18 +67,12 @@ brew "pkgconf"
brew "autogen" brew "autogen"
# Tool for generating GNU Standards-compliant Makefiles # Tool for generating GNU Standards-compliant Makefiles
brew "automake" brew "automake"
# Official Amazon AWS command-line interface
brew "awscli"
# GNU internationalization (i18n) and localization (l10n) library # GNU internationalization (i18n) and localization (l10n) library
brew "gettext" brew "gettext"
# Bourne-Again SHell, a UNIX command interpreter # Bourne-Again SHell, a UNIX command interpreter
brew "bash" brew "bash"
# Clone of cat(1) with syntax highlighting and Git integration
brew "bat"
# GNU File, Shell, and Text utilities # GNU File, Shell, and Text utilities
brew "coreutils" brew "coreutils"
# Bash Automated Testing System
brew "bats-core"
# Parser generator # Parser generator
brew "bison" brew "bison"
# Freely available high-quality data compressor # Freely available high-quality data compressor
@@ -102,22 +83,12 @@ brew "freetype"
brew "fontconfig" brew "fontconfig"
# Core application library for C # Core application library for C
brew "glib" brew "glib"
# Binary installation for rust projects
brew "cargo-binstall"
# Multi-platform support library with a focus on asynchronous I/O # Multi-platform support library with a focus on asynchronous I/O
brew "libuv" brew "libuv"
# Open-source, cross-platform JavaScript runtime environment
brew "node", link: false
# CLI tool for analyzing Claude Code usage from local JSONL files # CLI tool for analyzing Claude Code usage from local JSONL files
brew "ccusage" brew "ccusage"
# JSON Schema CLI # JSON Schema CLI
brew "check-jsonschema" brew "check-jsonschema"
# Prevent cloud misconfigurations during build-time for IaC tools
brew "checkov"
# Human-friendly and fast alternative to cut and (sometimes) awk
brew "choose-rust"
# Cross-platform make
brew "cmake"
# Get a file from an HTTP, HTTPS or FTP server # Get a file from an HTTP, HTTPS or FTP server
brew "curl" brew "curl"
# Network authentication protocol # Network authentication protocol
@@ -154,14 +125,8 @@ brew "flock"
brew "freetds" brew "freetds"
# Monitor a directory for changes and run a shell command # Monitor a directory for changes and run a shell command
brew "fswatch" brew "fswatch"
# Command-line fuzzy finder written in Go
brew "fzf"
# Graphics library to dynamically manipulate images # Graphics library to dynamically manipulate images
brew "gd" brew "gd"
# Disk usage analyzer with console interface written in Go
brew "gdu"
# GitHub command-line tool
brew "gh"
# Distributed revision control system # Distributed revision control system
brew "git" brew "git"
# Enable transparent encryption/decryption of files in a git repo # Enable transparent encryption/decryption of files in a git repo
@@ -170,14 +135,10 @@ brew "git-crypt"
brew "git-extras" brew "git-extras"
# Browse your latest git branches, formatted real fancy # Browse your latest git branches, formatted real fancy
brew "git-recent" brew "git-recent"
# Render markdown on the CLI
brew "glow"
# GNU implementation of the famous stream editor # GNU implementation of the famous stream editor
brew "gnu-sed" brew "gnu-sed"
# GNU Pretty Good Privacy (PGP) package # GNU Pretty Good Privacy (PGP) package
brew "gnupg" brew "gnupg"
# Go version management
brew "goenv"
# Library access to GnuPG # Library access to GnuPG
brew "gpgme" brew "gpgme"
# Manage your GnuPG keys with ease! # Manage your GnuPG keys with ease!
@@ -190,8 +151,6 @@ brew "librsvg"
brew "graphviz" brew "graphviz"
# GNU grep, egrep and fgrep # GNU grep, egrep and fgrep
brew "grep" brew "grep"
# Vulnerability scanner for container images and filesystems
brew "grype"
# Popular GNU data compression program # Popular GNU data compression program
brew "gzip" brew "gzip"
# Improved top (interactive process viewer) # Improved top (interactive process viewer)
@@ -206,8 +165,6 @@ brew "imagemagick"
brew "irssi" brew "irssi"
# Image manipulation library # Image manipulation library
brew "jpeg" brew "jpeg"
# Lightweight and flexible command-line JSON processor
brew "jq"
# JSON parser for C # JSON parser for C
brew "json-c" brew "json-c"
# Crawling and spidering framework # Crawling and spidering framework
@@ -244,8 +201,6 @@ brew "nginx"
brew "nmap" brew "nmap"
# Libraries for security-enabled client and server applications # Libraries for security-enabled client and server applications
brew "nss" brew "nss"
# Command-line Git information tool
brew "onefetch"
# General-purpose speech recognition model # General-purpose speech recognition model
brew "openai-whisper" brew "openai-whisper"
# Open source suite of directory software # Open source suite of directory software
@@ -258,46 +213,18 @@ brew "php", link: false
brew "php@8.2", link: true brew "php@8.2", link: true
# General-purpose scripting language # General-purpose scripting language
brew "php@8.3" brew "php@8.3"
# Pins GitHub Actions to full hashes and versions
brew "pinact"
# Python version management
brew "pyenv"
# Migrate pip packages from one Python version to another
brew "pyenv-pip-migrate"
# Pyenv plugin to manage virtualenv
brew "pyenv-virtualenv"
# Interpreted, interactive, object-oriented programming language # Interpreted, interactive, object-oriented programming language
brew "python@3.11" brew "python@3.11"
# Install various Ruby versions and implementations
brew "ruby-build"
# Ruby version manager
brew "rbenv"
# Generate C-based recognizers from regular expressions # Generate C-based recognizers from regular expressions
brew "re2c" brew "re2c"
# Rust toolchain installer
brew "rustup"
# Static analysis and lint tool, for (ba)sh scripts
brew "shellcheck"
# User interface to the TELNET protocol # User interface to the TELNET protocol
brew "telnet" brew "telnet"
# Send macOS User Notifications from the command-line # Send macOS User Notifications from the command-line
brew "terminal-notifier" brew "terminal-notifier"
# Tool which checks for the support of TLS/SSL ciphers and flaws # Tool which checks for the support of TLS/SSL ciphers and flaws
brew "testssl" brew "testssl"
# Terraform version manager inspired by rbenv
brew "tfenv"
# Linter for Terraform files
brew "tflint"
# Static analysis security scanner for your terraform code
brew "tfsec"
# Terminal multiplexer # Terminal multiplexer
brew "tmux" brew "tmux"
# Extremely fast Python package installer and resolver, written in Rust
brew "uv"
# Tool for creating isolated virtual python environments
brew "virtualenv"
# Command-line interface to the WakaTime api
brew "wakatime-cli"
# Executes a program periodically, showing output fullscreen # Executes a program periodically, showing output fullscreen
brew "watch" brew "watch"
# Internet file retriever # Internet file retriever
@@ -336,8 +263,6 @@ brew "shivammathur/extensions/yaml@8.3"
brew "shivammathur/php/php-debug" brew "shivammathur/php/php-debug"
# General-purpose scripting language # General-purpose scripting language
brew "shivammathur/php/php@8.2-debug" brew "shivammathur/php/php@8.2-debug"
# Find & fix known vulnerabilities in open-source dependencies
brew "snyk/tap/snyk"
# Tabby: AI Coding Assistant # Tabby: AI Coding Assistant
brew "tabbyml/tabby/tabby" brew "tabbyml/tabby/tabby"
# Command-line interface for 1Password # Command-line interface for 1Password

View File

@@ -1,4 +1,2 @@
#!/usr/bin/env bash #!/usr/bin/env bash
eval "$(mise activate --shims)"
[[ -z "$NVM_DIR" ]] && export NVM_DIR="$HOME/.config/nvm"
[[ -s "$NVM_DIR/nvm.sh" ]] && \. "$NVM_DIR/nvm.sh" # This loads nvm

View File

@@ -1,68 +1,68 @@
{ {
"profiles": [ "profiles": [
{
"complex_modifications": {
"rules": [
{
"description": "Change right_command+hjkl to arrow keys",
"manipulators": [
{
"from": {
"key_code": "h",
"modifiers": {
"mandatory": ["right_command"],
"optional": ["any"]
}
},
"to": [{ "key_code": "left_arrow" }],
"type": "basic"
},
{
"from": {
"key_code": "j",
"modifiers": {
"mandatory": ["right_command"],
"optional": ["any"]
}
},
"to": [{ "key_code": "down_arrow" }],
"type": "basic"
},
{
"from": {
"key_code": "k",
"modifiers": {
"mandatory": ["right_command"],
"optional": ["any"]
}
},
"to": [{ "key_code": "up_arrow" }],
"type": "basic"
},
{
"from": {
"key_code": "l",
"modifiers": {
"mandatory": ["right_command"],
"optional": ["any"]
}
},
"to": [{ "key_code": "right_arrow" }],
"type": "basic"
}
]
}
]
},
"name": "Default profile",
"selected": true,
"simple_modifications": [
{ {
"from": { "key_code": "caps_lock" }, "complex_modifications": {
"to": [{ "key_code": "f18" }] "rules": [
{
"description": "Change right_command+hjkl to arrow keys",
"manipulators": [
{
"from": {
"key_code": "h",
"modifiers": {
"mandatory": ["right_command"],
"optional": ["any"]
}
},
"to": [{ "key_code": "left_arrow" }],
"type": "basic"
},
{
"from": {
"key_code": "j",
"modifiers": {
"mandatory": ["right_command"],
"optional": ["any"]
}
},
"to": [{ "key_code": "down_arrow" }],
"type": "basic"
},
{
"from": {
"key_code": "k",
"modifiers": {
"mandatory": ["right_command"],
"optional": ["any"]
}
},
"to": [{ "key_code": "up_arrow" }],
"type": "basic"
},
{
"from": {
"key_code": "l",
"modifiers": {
"mandatory": ["right_command"],
"optional": ["any"]
}
},
"to": [{ "key_code": "right_arrow" }],
"type": "basic"
}
]
}
]
},
"name": "Default profile",
"selected": true,
"simple_modifications": [
{
"from": { "key_code": "caps_lock" },
"to": [{ "key_code": "f18" }]
}
],
"virtual_hid_keyboard": { "keyboard_type_v2": "iso" }
} }
], ]
"virtual_hid_keyboard": { "keyboard_type_v2": "iso" } }
}
]
}

105
config/mise/config.toml Normal file
View File

@@ -0,0 +1,105 @@
[tools]
# Language runtimes
node = "lts"
python = "3"
go = "latest"
rust = "stable"
# Pre-built binaries via ubi (fast — no compilation)
"ubi:sharkdp/fd" = "latest"
"ubi:BurntSushi/ripgrep" = "latest"
"ubi:eza-community/eza" = "latest"
"ubi:ClementTsang/bottom" = "latest"
"ubi:ajeetdsouza/zoxide" = "latest"
"ubi:tree-sitter/tree-sitter" = "latest"
"ubi:neovim/neovim" = "latest" # Neovim editor binary
"ubi:dandavison/delta" = "latest"
# Cargo-based tools (no pre-built binary available)
"cargo:bkt" = "latest"
"cargo:difftastic" = "latest"
"cargo:tmux-sessionizer" = "latest"
# Go-based tools
"go:github.com/google/yamlfmt/cmd/yamlfmt" = "latest"
"go:github.com/cheat/cheat/cmd/cheat" = "latest"
"go:github.com/charmbracelet/glow" = "latest"
"go:github.com/junegunn/fzf" = "latest"
"go:github.com/charmbracelet/gum" = "latest"
"go:github.com/joshmedeski/sesh/v2" = "latest"
"go:github.com/dotzero/git-profile" = "latest"
# npm-based tools
"npm:editorconfig-checker" = "latest"
"npm:github-release-notes" = "latest"
"npm:neovim" = "latest" # Node.js client for Neovim's RPC API (required by plugins)
"npm:corepack" = "latest"
# Python tools (via pipx backend)
"pipx:ansible" = "latest"
"pipx:ansible-lint" = "latest"
"pipx:ruff" = "latest"
"pipx:openapi-python-client" = "latest"
# .NET tools (via dotnet backend)
"dotnet:coverlet.console" = "latest"
"dotnet:csharp-ls" = "latest"
"dotnet:csharpier" = "latest"
"dotnet:ilspycmd" = "latest"
"dotnet:dotnet-ef" = "latest"
# DevOps & security tools
act = "latest"
age = "latest"
aws-cli = "latest"
checkov = "latest"
grype = "latest"
pinact = "latest"
snyk = "latest"
# Dev tools (pre-built binaries)
lazygit = "latest"
bat = "latest"
bats = "latest"
choose = "latest"
cmake = "latest"
gdu = "latest"
github-cli = "latest"
jq = "latest"
shellcheck = "latest"
shfmt = "latest"
stylua = "latest"
actionlint = "latest"
"aqua:mpalmer/action-validator" = "latest"
oh-my-posh = "latest"
"ubi:o2sh/onefetch" = "latest"
"ubi:wakatime/wakatime-cli" = "latest"
# Terraform (replaces tfenv)
terraform = "latest"
tflint = "latest"
tfsec = "latest"
# Other useful tools
uv = "latest"
[settings]
trusted_config_paths = [
"~/Code/ivuorinen",
"~/Code/s",
"~/Code/masf",
]
# Respect .nvmrc, .python-version, .ruby-version, etc. in other projects.
# This repo uses .mise.toml at the repo root for pinned versions.
idiomatic_version_file = true
idiomatic_version_file_enable_tools = [
"node", "python", "ruby", "go", "java",
"terraform", "yarn", "bun", "deno", "dotnet",
]
# Generate mise.lock for reproducible installs
lockfile = true
# Save disk space — don't keep downloaded archives or failed installs
always_keep_download = false
always_keep_install = false

View File

@@ -27,8 +27,12 @@ if not (vim.uv or vim.loop).fs_stat(lazypath) then
end end
vim.opt.rtp:prepend(lazypath) vim.opt.rtp:prepend(lazypath)
-- ── Add ~/.local/bin to the PATH ──────────────────────────────────── -- ── Add mise shims and ~/.local/bin to the PATH ───────────────────────
vim.fn.setenv('PATH', vim.fn.expand '$HOME/.local/bin' .. ':' .. vim.fn.expand '$PATH') vim.env.PATH = vim.env.HOME
.. '/.local/share/mise/shims:'
.. vim.env.HOME
.. '/.local/bin:'
.. vim.env.PATH
require 'options' require 'options'
require 'autogroups' require 'autogroups'

View File

@@ -102,4 +102,4 @@ function GetIntelephenseLicense()
f:close() f:close()
local stripped = string.gsub(content, '%s+', '') local stripped = string.gsub(content, '%s+', '')
return stripped == '' and nil or stripped return stripped == '' and nil or stripped
end end

View File

@@ -1,5 +0,0 @@
# $NVM_DIR/default-packages
yarn
neovim
corepack

View File

@@ -71,7 +71,6 @@ x-set-env XDG_BIN_HOME "$HOME/.local/bin"
x-path-prepend "/usr/local/bin" x-path-prepend "/usr/local/bin"
x-path-prepend "/opt/homebrew/bin" x-path-prepend "/opt/homebrew/bin"
x-path-prepend "$XDG_DATA_HOME/cargo/bin" x-path-prepend "$XDG_DATA_HOME/cargo/bin"
x-path-prepend "$XDG_DATA_HOME/bob/nvim-bin"
x-path-prepend "$DOTFILES/local/bin" x-path-prepend "$DOTFILES/local/bin"
x-path-prepend "$XDG_BIN_HOME" x-path-prepend "$XDG_BIN_HOME"

View File

@@ -16,6 +16,7 @@
# -u : Unset the specified option. # -u : Unset the specified option.
set -as terminal-features ",xterm-256color:RGB:clipboard:usstyle:strikethrough:overline" set -as terminal-features ",xterm-256color:RGB:clipboard:usstyle:strikethrough:overline"
set -g allow-passthrough on # Let apps query outer terminal (OSC 11 for fish theme detection)
set -s escape-time 0 # Address vim mode switching delay set -s escape-time 0 # Address vim mode switching delay
set -s set-clipboard on # System clipboard via OSC 52 set -s set-clipboard on # System clipboard via OSC 52

View File

@@ -3,6 +3,9 @@
" "
" vim: ts=2 sw=2 expandtab " vim: ts=2 sw=2 expandtab
" vint: +ProhibitAbbreviationOption +ProhibitSetNoCompatible " vint: +ProhibitAbbreviationOption +ProhibitSetNoCompatible
" mise — add shims to PATH for tool discovery
let $PATH = $HOME . '/.local/bin:' . $HOME . '/.local/share/mise/shims:' . $PATH
"***************************************************************************** "*****************************************************************************
"" Vim-Plug core "" Vim-Plug core
"***************************************************************************** "*****************************************************************************

View File

@@ -18,7 +18,6 @@
# Plugin configurations # Plugin configurations
zstyle ':antidote:bundle' use-friendly-names 'yes' zstyle ':antidote:bundle' use-friendly-names 'yes'
zstyle ':omz:update' mode reminder zstyle ':omz:update' mode reminder
zstyle ':omz:plugins:nvm' autoload yes
# Pure prompt settings # Pure prompt settings
export PURE_PROMPT_SYMBOL='➜' export PURE_PROMPT_SYMBOL='➜'

View File

@@ -24,14 +24,10 @@ ohmyzsh/ohmyzsh path:plugins/fzf
ohmyzsh/ohmyzsh path:plugins/git ohmyzsh/ohmyzsh path:plugins/git
ohmyzsh/ohmyzsh path:plugins/golang ohmyzsh/ohmyzsh path:plugins/golang
ohmyzsh/ohmyzsh path:plugins/gpg-agent ohmyzsh/ohmyzsh path:plugins/gpg-agent
ohmyzsh/ohmyzsh path:plugins/nvm
ohmyzsh/ohmyzsh path:plugins/python ohmyzsh/ohmyzsh path:plugins/python
# ohmyzsh/ohmyzsh path:plugins/tmux # ohmyzsh/ohmyzsh path:plugins/tmux
ohmyzsh/ohmyzsh path:plugins/z ohmyzsh/ohmyzsh path:plugins/z
# Automatically activate nvm if .nvmrc file is present
ivuorinen/nvm-auto-use
# Add core plugins that make Zsh a bit more like Fish # Add core plugins that make Zsh a bit more like Fish
zdharma-continuum/fast-syntax-highlighting zdharma-continuum/fast-syntax-highlighting

View File

@@ -61,7 +61,7 @@
vcs # git status vcs # git status
# command_execution_time # previous command duration # command_execution_time # previous command duration
go go
nvm asdf
aws aws
# =========================[ Line #2 ]========================= # =========================[ Line #2 ]=========================
newline # \n newline # \n
@@ -121,8 +121,8 @@
# Don't show context unless root or in SSH. # Don't show context unless root or in SSH.
# typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION= # typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION=
# aws, go and nvm versions colors. # aws, go and asdf versions colors.
typeset -g POWERLEVEL9K_{AWS,GO,NVM}_FOREGROUND=$grey typeset -g POWERLEVEL9K_{AWS,GO,ASDF}_FOREGROUND=$grey
# Show previous command duration only if it's >= 86400s = 24h. # Show previous command duration only if it's >= 86400s = 24h.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=86400 typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=86400

View File

@@ -1,26 +0,0 @@
# shellcheck disable=SC1071,SC1103,SC2148
# Source: https://github.com/nvm-sh/nvm#zsh
# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
local nvmrc_path
nvmrc_path="$(nvm_find_nvmrc)"
if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version
nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
nvm use
fi
elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

View File

@@ -2,6 +2,9 @@
[include] [include]
path = ~/.dotfiles/config/git/shared path = ~/.dotfiles/config/git/shared
[core]
excludesfile = ~/.config/git/overrides/ignore
[gpg] [gpg]
format = ssh format = ssh

View File

@@ -0,0 +1,31 @@
.DS_Store
.idea
.run
*.cache
*~
*-secret
__secret
__ignored
__test_*.php
__test_*.txt
__test.php
_theme
*.sql.gz
*.WordPress.*.xml
cachegrind.out.*
composer.phar
wp_*.sh
auth.json
dfm.sh
.scannerwork
.phpactor.json
.zsh_history
**/.claude/*
**/.serena/*
**/docs/plans/*
**/docs/superpowers/*
CLAUDE.md
TODO.md
specs.md

View File

@@ -40,7 +40,7 @@
glob: true glob: true
relink: true relink: true
path: config/* path: config/*
exclude: [config/nvm, config/fzf, config/op] exclude: [config/fzf, config/op]
# 1Password CLI plugins # 1Password CLI plugins
~/.config/op/plugins.sh: ~/.config/op/plugins.sh:
relink: true relink: true
@@ -68,6 +68,11 @@
glob: true glob: true
mode: 0600 mode: 0600
path: ssh/* path: ssh/*
# mise → asdf compatibility (tools expecting ~/.asdf find mise data)
~/.asdf:
path: ~/.local/share/mise
relink: true
force: true
- shell: - shell:
# Add Git submodules and remove old ones # Add Git submodules and remove old ones

View File

@@ -73,21 +73,18 @@ section_install()
MENU=( MENU=(
"all:Installs everything in the correct order" "all:Installs everything in the correct order"
"apt-packages:Install apt packages (Debian/Ubuntu)" "apt-packages:Install apt packages (Debian/Ubuntu)"
"cargo:Install rust/cargo packages"
"cheat-databases:Install cheat external cheatsheet databases" "cheat-databases:Install cheat external cheatsheet databases"
"composer:Install composer" "composer:Install composer"
"dnf-packages:Install dnf packages (Fedora/RHEL)" "dnf-packages:Install dnf packages (Fedora/RHEL)"
"fonts:Install programming fonts" "fonts:Install programming fonts"
"gh:Install GitHub CLI Extensions" "gh:Install GitHub CLI Extensions"
"git-crypt:Install git-crypt from source" "git-crypt:Install git-crypt from source"
"go:Install Go Packages"
"imagick:Install ImageMagick CLI" "imagick:Install ImageMagick CLI"
"macos:Setup nice macOS defaults" "macos:Setup nice macOS defaults"
"npm-packages:Install NPM Packages" "mise:Install tools via mise (runtimes + CLI tools)"
"mise-cleanup:Remove old version manager installations (--dry-run supported)"
"ntfy:Install ntfy notification tool" "ntfy:Install ntfy notification tool"
"nvm-latest:Install latest lts node using nvm" "python-libs:Install Python libraries (libtmux, pynvim)"
"nvm:Install Node Version Manager (nvm)"
"python-packages:Install Python packages via uv"
"shellspec:Install shellspec testing framework" "shellspec:Install shellspec testing framework"
"xcode-cli-tools:Install Xcode CLI tools (macOS)" "xcode-cli-tools:Install Xcode CLI tools (macOS)"
"z:Install z" "z:Install z"
@@ -107,13 +104,10 @@ section_install()
$0 brew install $0 brew install
$0 install fonts $0 install fonts
# Tier 2: Language packages (depend on runtimes from Tier 1) # Tier 2: Runtimes and CLI tools via mise, then remaining installers
$0 install cargo $0 install mise || exit 1
$0 install go $0 install composer || exit 1
$0 install composer $0 install python-libs || exit 1
$0 install nvm
$0 install npm-packages
$0 install python-packages
# Tier 3: Tool-dependent installers # Tier 3: Tool-dependent installers
$0 install cheat-databases $0 install cheat-databases
@@ -131,12 +125,6 @@ section_install()
msgr yay "All done!" msgr yay "All done!"
;; ;;
cargo)
msgr run "Installing cargo packages..."
bash "$DOTFILES/scripts/install-cargo-packages.sh" \
&& msgr yay "cargo packages installed!"
;;
cheat-databases) cheat-databases)
msgr run "Installing cheat databases..." msgr run "Installing cheat databases..."
for database in "$DOTFILES"/scripts/install-cheat-*.sh; do for database in "$DOTFILES"/scripts/install-cheat-*.sh; do
@@ -163,12 +151,6 @@ section_install()
&& msgr yay "github cli extensions installed!" && msgr yay "github cli extensions installed!"
;; ;;
go)
msgr run "Installing Go Packages..."
bash "$DOTFILES/scripts/install-go-packages.sh" \
&& msgr yay "go packages installed!"
;;
imagick) imagick)
msgr run "Downloading and installing ImageMagick CLI..." msgr run "Downloading and installing ImageMagick CLI..."
curl -L https://imagemagick.org/archive/binaries/magick > "$XDG_BIN_HOME/magick" \ curl -L https://imagemagick.org/archive/binaries/magick > "$XDG_BIN_HOME/magick" \
@@ -182,33 +164,30 @@ section_install()
&& msgr yay "macOS defaults set!" && msgr yay "macOS defaults set!"
;; ;;
nvm) mise)
msgr run "Installing nvm..." msgr run "Installing tools via mise..."
local NVM_VERSION if ! command -v mise &> /dev/null; then
NVM_VERSION=$(x-gh-get-latest-version nvm-sh/nvm) msgr nested "Installing mise..."
msgr ok "Latest nvm version: $NVM_VERSION" if ! curl -fsSL https://mise.run | sh; then
local NVM_INSTALL="https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh" msgr err "Failed to install mise"
local NVM_CURL="curl -o- \"$NVM_INSTALL\" | bash" exit 1
PROFILE=/dev/null bash -c "$NVM_CURL" fi
$0 install nvm-latest export PATH="${XDG_BIN_HOME:-$HOME/.local/bin}:$PATH"
msgr yay "nvm installed!"
;;
nvm-latest)
msgr run "Installing latest lts node..."
if [ -n "$NVM_DIR" ]; then
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
fi fi
nvm install --lts --latest-npm --default if ! mise install --yes; then
git checkout "$DOTFILES/base/zshrc" msgr err "mise install failed"
git checkout "$DOTFILES/base/bashrc" exit 1
msgr yay "latest lts node installed!" fi
if ! mise reshim; then
msgr err "mise reshim failed"
exit 1
fi
msgr yay "mise tools installed!"
;; ;;
npm-packages) mise-cleanup)
msgr run "NPM Packages install started..." msgr run "Cleaning up old version manager installations..."
bash "$DOTFILES/scripts/install-npm-packages.sh" \ bash "$DOTFILES/scripts/cleanup-old-version-managers.sh" "${@:2}"
&& msgr yay "NPM Packages have been installed!"
;; ;;
apt-packages) apt-packages)
@@ -235,10 +214,10 @@ section_install()
&& msgr yay "ntfy installed!" && msgr yay "ntfy installed!"
;; ;;
python-packages) python-libs)
msgr run "Installing Python packages..." msgr run "Installing Python libraries..."
bash "$DOTFILES/scripts/install-python-packages.sh" \ bash "$DOTFILES/scripts/install-python-packages.sh" \
&& msgr yay "Python packages installed!" && msgr yay "Python libraries installed!"
;; ;;
xcode-cli-tools) xcode-cli-tools)
@@ -289,8 +268,11 @@ section_brew()
;; ;;
update) update)
brew update && brew outdated && brew upgrade && brew cleanup if brew update && brew outdated && brew upgrade && brew cleanup; then
msgr yay "Done!" msgr yay "Done!"
else
msgr err "brew update failed"
fi
;; ;;
updatebundle) updatebundle)
@@ -549,9 +531,9 @@ section_dotfiles()
case "$1" in case "$1" in
fmt) fmt)
msgr run "Running all formatters" msgr run "Running all formatters"
$0 dotfiles yamlfmt $0 dotfiles yamlfmt \
$0 dotfiles shfmt && $0 dotfiles shfmt \
msgr run_done "...done!" && msgr run_done "...done!"
;; ;;
reset_all) reset_all)
@@ -565,12 +547,16 @@ section_dotfiles()
~/.local/share/nvim \ ~/.local/share/nvim \
~/.local/state/nvim \ ~/.local/state/nvim \
~/.cache/nvim \ ~/.cache/nvim \
~/.config/nvim ~/.config/nvim \
msgr ok "Deleted old nvim files (share, state and cache + config)" && msgr ok "Deleted old nvim files (share, state and cache + config)"
ln -s "$DOTFILES/config/nvim" ~/.config/nvim ln -s "$DOTFILES/config/nvim" ~/.config/nvim \
msgr ok "Linked nvim and astronvim" && msgr ok "Linked nvim and astronvim"
x-have npm && $0 install npm if $0 install mise; then
msgr ok "Installed packages" msgr ok "Installed packages"
else
msgr err "Failed to install mise tools"
exit 1
fi
msgr run_done "nvim reset!" msgr run_done "nvim reset!"
;; ;;
@@ -593,8 +579,8 @@ section_dotfiles()
--language-dialect bash \ --language-dialect bash \
--func-next-line --list --write \ --func-next-line --list --write \
--indent 2 --case-indent --space-redirects \ --indent 2 --case-indent --space-redirects \
--binary-next-line {} \; --binary-next-line {} \; \
msgr yay "dotfiles have been shfmt formatted!" && msgr yay "dotfiles have been shfmt formatted!"
;; ;;
*) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;; *) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;;

View File

@@ -0,0 +1,20 @@
# cleanup-old-version-managers
Remove old version manager installations that have been replaced by mise.
## Usage
```bash
scripts/cleanup-old-version-managers.sh [--dry-run]
```
## What it does
1. Removes data directories for nvm, fnm, pyenv, goenv, and bob-nvim.
2. Removes cargo-installed tool binaries now managed by mise.
3. Removes go-installed tool binaries from `$GOPATH/bin`.
4. Uninstalls Homebrew packages replaced by mise (if brew is available).
Mason binaries (`$XDG_DATA_HOME/nvim/mason/`) are not touched.
Pass `--dry-run` to preview what would be removed without making changes.

View File

@@ -0,0 +1,141 @@
#!/usr/bin/env bash
set -euo pipefail
# @description Remove old version manager installations replaced by mise.
# This script targets specific known directories — NOT which/command -v,
# because nvim's Mason installs some of the same tool names.
#
# Ensure DOTFILES is set even when script is invoked directly
if [[ -z "${DOTFILES:-}" ]]; then
DOTFILES="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
export DOTFILES
fi
# shellcheck source=shared.sh
source "$DOTFILES/config/shared.sh"
DRY_RUN=""
if [[ $# -gt 0 ]]; then
if [[ "$1" = "--dry-run" ]]; then
DRY_RUN="--dry-run"
else
echo "Usage: $0 [--dry-run]" >&2
exit 1
fi
fi
remove_dir()
{
local dir="$1"
local label="$2"
if [[ -d "$dir" ]]; then
if [[ "$DRY_RUN" = "--dry-run" ]]; then
msgr warn "[DRY RUN] Would remove $label: $dir"
else
msgr run "Removing $label: $dir"
rm -rf "$dir"
msgr run_done "Removed $label"
fi
else
msgr ok "$label not found (already clean): $dir"
fi
return 0
}
remove_file()
{
local file="$1"
local label="$2"
if [[ -f "$file" ]]; then
if [[ "$DRY_RUN" = "--dry-run" ]]; then
msgr warn "[DRY RUN] Would remove $label: $file"
else
rm -f "$file"
msgr run_done "Removed $label: $file"
fi
fi
return 0
}
msgr msg "Cleaning up old version manager installations..."
msgr msg "Mason binaries in \$XDG_DATA_HOME/nvim/mason/ will NOT be touched."
# --- Version manager data directories ---
# nvm (Node Version Manager)
remove_dir "$XDG_DATA_HOME/nvm" "nvm data"
# fnm (Fast Node Manager)
remove_dir "$XDG_DATA_HOME/fnm" "fnm data"
# pyenv
remove_dir "$XDG_DATA_HOME/pyenv" "pyenv data"
# goenv
remove_dir "$XDG_DATA_HOME/goenv" "goenv data"
# bob-nvim (neovim version manager — mise manages neovim now)
remove_dir "$XDG_DATA_HOME/bob" "bob-nvim data"
# --- Cargo-installed tool binaries ---
# These were installed via `cargo install` into $CARGO_HOME/bin.
# mise now manages them via ubi/cargo backends into its own install dirs.
# Only remove from the OLD cargo bin location, not from XDG_BIN_HOME.
CARGO_BIN="${XDG_DATA_HOME}/cargo/bin"
CARGO_MANAGED_TOOLS=(
bkt btm difft eza fd rg
tree-sitter tmux-sessionizer zoxide bob
cargo-install-update cargo-cache
)
for tool in "${CARGO_MANAGED_TOOLS[@]}"; do
remove_file "$CARGO_BIN/$tool" "cargo-installed $tool"
done
# --- Go-installed tool binaries ---
# go install puts binaries in $GOBIN (= $XDG_BIN_HOME) or $GOPATH/bin.
# Only remove from $GOPATH/bin if it differs from XDG_BIN_HOME.
GO_BIN="${XDG_DATA_HOME}/go/bin"
GO_MANAGED_TOOLS=(
yamlfmt cheat glow fzf gum sesh git-profile
)
if [[ "$GO_BIN" != "$XDG_BIN_HOME" ]] && [[ -d "$GO_BIN" ]]; then
for tool in "${GO_MANAGED_TOOLS[@]}"; do
remove_file "$GO_BIN/$tool" "go-installed $tool"
done
fi
# --- npm global binaries ---
# These were installed via `npm install -g` into the nvm/fnm node prefix.
# Since we removed nvm/fnm data dirs above, these are already gone.
# --- Python tools via uv tool ---
# uv tool binaries go to ~/.local/bin/ (XDG_BIN_HOME).
# mise pipx backend installs to a different location.
# We leave XDG_BIN_HOME alone and let mise take precedence via PATH.
# --- Homebrew-installed version managers ---
# These will be removed when `brew bundle cleanup` runs after Brewfile update.
if command -v brew &> /dev/null; then
BREW_REMOVE=(
pyenv pyenv-pip-migrate pyenv-virtualenv goenv cargo-binstall
act age ansible ansible-lint awscli bat bats-core checkov
choose-rust cmake gdu gh grype jq onefetch pinact shellcheck
tfenv tflint tfsec uv virtualenv wakatime-cli
)
for pkg in "${BREW_REMOVE[@]}"; do
if brew list "$pkg" &> /dev/null; then
if [[ "$DRY_RUN" = "--dry-run" ]]; then
msgr warn "[DRY RUN] Would brew uninstall $pkg"
else
msgr run "Uninstalling brew package: $pkg"
msgr warn "Note: $pkg may have dependents"
if brew uninstall "$pkg"; then
msgr run_done "Uninstalled $pkg"
else
msgr err "Failed to uninstall $pkg"
fi
fi
fi
done
fi
msgr yay "Cleanup complete! Run 'mise install' to set up tools via mise."

View File

@@ -1,21 +0,0 @@
# install-cargo-packages
Install Rust packages defined in the script.
## Usage
```bash
scripts/install-cargo-packages.sh
```
## What it does
1. If `cargo-install-update` is available, updates all existing packages first
and tracks which packages are already installed.
2. Installs each package from the inline list using `cargo install`,
skipping any already handled by the update step.
Builds run in parallel using available CPU cores (minus two).
3. Runs package-specific post-install steps.
4. Cleans the cargo cache with `cargo cache --autoclean`.
To add or remove packages, edit the `packages` array in `scripts/install-cargo-packages.sh`.

View File

@@ -1,88 +0,0 @@
#!/usr/bin/env bash
set -uo pipefail
# @description Install cargo/rust packages.
#
# shellcheck source=shared.sh
source "$DOTFILES/config/shared.sh"
msgr run "Starting to install rust/cargo packages"
# Track packages already managed by cargo install-update
declare -A installed_packages
# If we have cargo install-update, use it first
if command -v cargo-install-update &> /dev/null; then
msgr run "Updating cargo packages with cargo install-update"
# Show output in real-time (via stderr) while capturing it for parsing
update_output=$(cargo install-update -a 2>&1 | tee /dev/stderr)
msgr run_done "Done with cargo install-update"
# Parse installed package names from the update output
while IFS= read -r pkg_name; do
[[ -n "$pkg_name" ]] && installed_packages["$pkg_name"]=1
done < <(echo "$update_output" | awk '/v[0-9]+\.[0-9]+/ { print $1 }')
fi
# Cargo packages to install
packages=(
cargo-update # A cargo subcommand for checking and applying updates to installed executables
cargo-cache # Cargo cache management utility
tree-sitter-cli # An incremental parsing system for programming tools
bkt # A subprocess caching utility
difftastic # A structural diff that understands syntax
fd-find # A simple, fast and user-friendly alternative to 'find'
ripgrep # Recursively searches directories for a regex pattern while respecting your gitignore
bob-nvim # A version manager for neovim
bottom # A cross-platform graphical process/system monitor
eza # A modern alternative to ls
tmux-sessionizer # A tool for opening git repositories as tmux sessions
zoxide # A smarter cd command
)
# Number of jobs to run in parallel, this helps to keep the system responsive
BUILD_JOBS=$(nproc --ignore=2 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 1)
# Function to install cargo packages
install_packages()
{
for pkg in "${packages[@]}"; do
# Skip packages already handled by cargo install-update
if [[ -n "${installed_packages[$pkg]+x}" ]]; then
msgr ok "Skipping $pkg (already installed)"
continue
fi
msgr run "Installing cargo package $pkg"
cargo install --jobs "$BUILD_JOBS" "$pkg"
msgr run_done "Done installing $pkg"
echo ""
done
return 0
}
# Function to perform additional steps for installed cargo packages
post_install_steps()
{
msgr run "Now doing the next steps for cargo packages"
# use bob to install latest stable nvim
if command -v bob &> /dev/null; then
bob use stable && x-path-append "$XDG_DATA_HOME/bob/nvim-bin"
fi
msgr run "Removing cargo cache"
cargo cache --autoclean
msgr "done" "Done removing cargo cache"
return 0
}
# Install cargo packages and run post-install steps
main()
{
install_packages
msgr "done" "Installed cargo packages!"
post_install_steps
return 0
}
main "$@"

View File

@@ -51,8 +51,8 @@ install_fonts()
{ {
msgr run "Starting to install NerdFonts..." msgr run "Starting to install NerdFonts..."
# shellcheck disable=SC2048,SC2086 # shellcheck disable=SC2048,SC2086
./install.sh -q -s ${fonts[*]} ./install.sh -q -s ${fonts[*]} \
msgr run_done "Done" && msgr run_done "Done"
return 0 return 0
} }

View File

@@ -51,8 +51,8 @@ install_extensions()
# Install all GitHub CLI extensions # Install all GitHub CLI extensions
main() main()
{ {
install_extensions install_extensions \
msgr run_done "Done" && msgr run_done "Done"
return 0 return 0
} }

View File

@@ -1,18 +0,0 @@
# install-go-packages
Install Go packages defined in the script.
## Usage
```bash
scripts/install-go-packages.sh
```
## What it does
1. Checks that `go` is available.
2. Installs each package from the inline list using `go install`.
3. Runs post-install steps (e.g. generating shell completions).
4. Clears the Go module and build caches.
To add or remove packages, edit the `packages` array in `scripts/install-go-packages.sh`.

View File

@@ -1,69 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# @description Install Go packages
#
# shellcheck source=shared.sh
source "$DOTFILES/config/shared.sh"
msgr run "Installing go packages"
! x-have "go" && msgr err "go hasn't been installed yet." && exit 0
# Go packages to install
packages=(
github.com/dotzero/git-profile@latest # Switch between git user profiles
github.com/google/yamlfmt/cmd/yamlfmt@latest # Format yaml files
github.com/cheat/cheat/cmd/cheat@latest # Interactive cheatsheets on the CLI
github.com/charmbracelet/glow@latest # Render markdown on the CLI
github.com/junegunn/fzf@latest # General-purpose fuzzy finder
github.com/charmbracelet/gum@latest # Glamorous shell scripts
github.com/joshmedeski/sesh/v2@latest # Terminal session manager
)
# Function to install go packages
install_packages()
{
for pkg in "${packages[@]}"; do
# Strip inline comments and trim whitespace
pkg="${pkg%%#*}"
pkg="${pkg// /}"
[[ -z "$pkg" ]] && continue
msgr nested "Installing go package: $pkg"
go install "$pkg"
echo ""
done
return 0
}
# Function to install completions and run actions for selected packages
post_install()
{
msgr run "Installing completions for selected packages"
if command -v git-profile &> /dev/null; then
git-profile completion zsh > "$ZSH_CUSTOM_COMPLETION_PATH/_git-profile" \
&& msgr run_done "Installed completions for git-profile"
fi
return 0
}
# Function to clear go cache
clear_go_cache()
{
msgr run "Clearing go cache"
go clean -cache -modcache
return 0
}
# Install go packages, completions, and clear cache
main()
{
install_packages
post_install
clear_go_cache
msgr run_done "Done"
return 0
}
main "$@"

View File

@@ -1,18 +0,0 @@
# install-npm-packages
Install npm packages defined in the script.
## Usage
```bash
scripts/install-npm-packages.sh
```
## What it does
1. Checks that `npm` is available.
2. Installs each package from the inline list using `npm install -g`.
3. Upgrades all global packages.
4. Cleans the npm cache.
To add or remove packages, edit the `packages` array in `scripts/install-npm-packages.sh`.

View File

@@ -1,71 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# @description Install npm packages globally.
#
# shellcheck source=shared.sh
source "$DOTFILES/config/shared.sh"
msgr msg "Starting to install npm packages"
if ! command -v npm &> /dev/null; then
msgr err "npm could not be found."
exit 0
fi
packages=(
editorconfig-checker # Check files against .editorconfig rules
github-release-notes # Create release notes from tags and issues
neovim # Neovim node client
corepack # Node.js package manager version management
)
# Function to install npm packages
install_packages()
{
for pkg in "${packages[@]}"; do
# Strip inline comments and trim whitespace
pkg="${pkg%%#*}"
pkg="${pkg// /}"
[[ -z "$pkg" ]] && continue
if npm ls -g -p "$pkg" &> /dev/null; then
msgr run_done "$pkg" "already installed"
else
msgr run "Installing npm package:" "$pkg"
npm install -g --no-fund --no-progress --no-timing "$pkg"
fi
echo ""
done
return 0
}
# Function to upgrade all global npm packages
upgrade_global_packages()
{
msgr run "Upgrading all global packages"
npm -g --no-progress --no-timing --no-fund outdated || true
npm -g --no-timing --no-fund upgrade
return 0
}
# Function to clean npm cache
clean_npm_cache()
{
msgr run "Cleaning up npm cache"
npm cache verify
npm cache clean --force
npm cache verify
return 0
}
# Install, upgrade, and clean npm packages
main()
{
install_packages
upgrade_global_packages
clean_npm_cache
msgr yay "npm package installations complete"
return 0
}
main "$@"

View File

@@ -1,6 +1,6 @@
# install-python-packages # install-python-packages
Install Python packages defined in the script using `uv`. Install Python **libraries** (not tools — those are managed by mise).
## Usage ## Usage
@@ -10,9 +10,7 @@ scripts/install-python-packages.sh
## What it does ## What it does
1. Checks that `uv` is available; if missing, installs it via the official installer. 1. Checks that `uv` is available; if missing, exits with an error (install `uv` via mise first).
2. Installs each CLI tool from the inline `tools` array using `uv tool install --upgrade`. 2. Installs each library from the inline `libraries` array using `uv pip install --system --upgrade`.
3. Installs each library from the inline `libraries` array using `uv pip install --system --upgrade`.
4. Upgrades all uv-managed tools with `uv tool upgrade --all`.
To add or remove packages, edit the `tools` or `libraries` arrays in `scripts/install-python-packages.sh`. To add or remove packages, edit the `libraries` array in `scripts/install-python-packages.sh`.

View File

@@ -1,53 +1,27 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
# @description Install Python packages using uv. # @description Install Python libraries via uv pip (tools are managed by mise).
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$DOTFILES/config/shared.sh" source "$DOTFILES/config/shared.sh"
msgr run "Starting to install Python packages" msgr run "Starting to install Python libraries"
# Ensure uv is available # Ensure uv is available
if ! command -v uv &> /dev/null; then if ! command -v uv &> /dev/null; then
msgr nested "uv not found, installing via official installer" msgr err "uv not found install it via mise first (run: dfm install mise)"
curl -LsSf https://astral.sh/uv/install.sh | sh exit 1
export PATH="$HOME/.local/bin:$PATH"
fi fi
# CLI tools — installed isolated with `uv tool install`
tools=(
ansible # IT automation and configuration management
openapi-python-client # Generate Python API clients from OpenAPI specs
ruff # Fast Python linter and formatter
)
# Library packages — installed into system Python with `uv pip install --system` # Library packages — installed into system Python with `uv pip install --system`
libraries=( libraries=(
libtmux # Python API for tmux libtmux # Python API for tmux
pynvim # Neovim Python client pynvim # Neovim Python client
) )
# Function to install CLI tools via uv tool install
install_tools()
{
msgr run "Installing Python CLI tools"
for pkg in "${tools[@]}"; do
# Strip inline comments and trim whitespace
pkg="${pkg%%#*}"
pkg="${pkg// /}"
[[ -z "$pkg" ]] && continue
msgr nested "Installing tool: $pkg"
uv tool install --upgrade "$pkg"
echo ""
done
return 0
}
# Function to install library packages via uv pip install # Function to install library packages via uv pip install
install_libraries() install_libraries()
{ {
msgr run "Installing Python libraries"
for pkg in "${libraries[@]}"; do for pkg in "${libraries[@]}"; do
# Strip inline comments and trim whitespace # Strip inline comments and trim whitespace
pkg="${pkg%%#*}" pkg="${pkg%%#*}"
@@ -61,22 +35,5 @@ install_libraries()
return 0 return 0
} }
# Function to upgrade all uv-managed tools install_libraries \
upgrade_tools() && msgr yay "Python library installations complete"
{
msgr run "Upgrading all uv-managed tools"
uv tool upgrade --all
return 0
}
# Install Python tools, libraries, and upgrade all
main()
{
install_tools
install_libraries
upgrade_tools
msgr yay "Python package installations complete"
return 0
}
main "$@"

View File

@@ -23,8 +23,8 @@ install_shellspec()
fi fi
msgr run "Running make install..." msgr run "Running make install..."
make -C "$SHELLSPEC_CACHE" install PREFIX="$HOME/.local" make -C "$SHELLSPEC_CACHE" install PREFIX="$HOME/.local" \
msgr run_done "shellspec $version installed to $HOME/.local/bin/shellspec" && msgr run_done "shellspec $version installed to $HOME/.local/bin/shellspec"
return 0 return 0
} }

View File

@@ -15,8 +15,8 @@ clone_z_repo()
local bin_path=$2 local bin_path=$2
if [[ ! -d "$bin_path" ]]; then if [[ ! -d "$bin_path" ]]; then
git clone "$git_path" "$bin_path" git clone "$git_path" "$bin_path" \
msgr run_done "z installed at $bin_path" && msgr run_done "z installed at $bin_path"
else else
msgr ok "z ($bin_path/) already installed" msgr ok "z ($bin_path/) already installed"
fi fi

View File

@@ -0,0 +1,229 @@
#!/usr/bin/env bats
setup()
{
export DOTFILES="$PWD"
# Pre-set CURRENT_SHELL so config/shared.sh's x-path-prepend works
# even in environments where `ps` is unavailable.
export CURRENT_SHELL="bash"
# Use a temporary directory to isolate all XDG data operations
export XDG_DATA_HOME="$BATS_TMPDIR/share"
export XDG_BIN_HOME="$BATS_TMPDIR/bin"
export XDG_CONFIG_HOME="$BATS_TMPDIR/config"
export XDG_CACHE_HOME="$BATS_TMPDIR/cache"
export XDG_STATE_HOME="$BATS_TMPDIR/state"
mkdir -p "$XDG_DATA_HOME"
mkdir -p "$XDG_BIN_HOME"
}
teardown()
{
rm -rf "$BATS_TMPDIR/share" "$BATS_TMPDIR/bin" \
"$BATS_TMPDIR/config" "$BATS_TMPDIR/cache" "$BATS_TMPDIR/state"
}
# ── Group 1: Argument validation ──────────────────────────────────────
@test "cleanup script rejects unknown arguments" {
run bash scripts/cleanup-old-version-managers.sh --unknown-flag
[ "$status" -eq 1 ]
[[ "$output" == *"Usage:"* ]]
}
@test "cleanup script rejects positional argument" {
run bash scripts/cleanup-old-version-managers.sh some-arg
[ "$status" -eq 1 ]
[[ "$output" == *"Usage:"* ]]
}
@test "cleanup script accepts --dry-run flag" {
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
}
@test "cleanup script runs successfully with no arguments" {
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
}
# ── Group 2: Dry-run does not remove directories ───────────────────────
@test "dry-run does not remove nvm data directory" {
mkdir -p "$XDG_DATA_HOME/nvm"
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
[ -d "$XDG_DATA_HOME/nvm" ]
}
@test "dry-run does not remove fnm data directory" {
mkdir -p "$XDG_DATA_HOME/fnm"
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
[ -d "$XDG_DATA_HOME/fnm" ]
}
@test "dry-run does not remove pyenv data directory" {
mkdir -p "$XDG_DATA_HOME/pyenv"
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
[ -d "$XDG_DATA_HOME/pyenv" ]
}
@test "dry-run does not remove goenv data directory" {
mkdir -p "$XDG_DATA_HOME/goenv"
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
[ -d "$XDG_DATA_HOME/goenv" ]
}
@test "dry-run does not remove bob-nvim data directory" {
mkdir -p "$XDG_DATA_HOME/bob"
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
[ -d "$XDG_DATA_HOME/bob" ]
}
@test "dry-run output mentions DRY RUN for each existing directory" {
mkdir -p "$XDG_DATA_HOME/nvm"
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
[[ "$output" == *"DRY RUN"* ]]
}
# ── Group 3: Dry-run does not remove files ─────────────────────────────
@test "dry-run does not remove cargo-installed tool binaries" {
mkdir -p "$XDG_DATA_HOME/cargo/bin"
touch "$XDG_DATA_HOME/cargo/bin/bkt"
touch "$XDG_DATA_HOME/cargo/bin/eza"
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
[ -f "$XDG_DATA_HOME/cargo/bin/bkt" ]
[ -f "$XDG_DATA_HOME/cargo/bin/eza" ]
}
# ── Group 4: Live run removes directories ──────────────────────────────
@test "live run removes nvm data directory when it exists" {
mkdir -p "$XDG_DATA_HOME/nvm"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -d "$XDG_DATA_HOME/nvm" ]
}
@test "live run removes fnm data directory when it exists" {
mkdir -p "$XDG_DATA_HOME/fnm"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -d "$XDG_DATA_HOME/fnm" ]
}
@test "live run removes pyenv data directory when it exists" {
mkdir -p "$XDG_DATA_HOME/pyenv"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -d "$XDG_DATA_HOME/pyenv" ]
}
@test "live run removes goenv data directory when it exists" {
mkdir -p "$XDG_DATA_HOME/goenv"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -d "$XDG_DATA_HOME/goenv" ]
}
@test "live run removes bob-nvim data directory when it exists" {
mkdir -p "$XDG_DATA_HOME/bob"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -d "$XDG_DATA_HOME/bob" ]
}
@test "live run removes all version manager directories in one pass" {
mkdir -p "$XDG_DATA_HOME/nvm"
mkdir -p "$XDG_DATA_HOME/fnm"
mkdir -p "$XDG_DATA_HOME/pyenv"
mkdir -p "$XDG_DATA_HOME/goenv"
mkdir -p "$XDG_DATA_HOME/bob"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -d "$XDG_DATA_HOME/nvm" ]
[ ! -d "$XDG_DATA_HOME/fnm" ]
[ ! -d "$XDG_DATA_HOME/pyenv" ]
[ ! -d "$XDG_DATA_HOME/goenv" ]
[ ! -d "$XDG_DATA_HOME/bob" ]
}
# ── Group 5: Live run removes cargo-installed files ────────────────────
@test "live run removes cargo-installed bkt binary" {
mkdir -p "$XDG_DATA_HOME/cargo/bin"
touch "$XDG_DATA_HOME/cargo/bin/bkt"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -f "$XDG_DATA_HOME/cargo/bin/bkt" ]
}
@test "live run removes cargo-installed eza binary" {
mkdir -p "$XDG_DATA_HOME/cargo/bin"
touch "$XDG_DATA_HOME/cargo/bin/eza"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -f "$XDG_DATA_HOME/cargo/bin/eza" ]
}
@test "live run removes cargo-installed rg binary" {
mkdir -p "$XDG_DATA_HOME/cargo/bin"
touch "$XDG_DATA_HOME/cargo/bin/rg"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -f "$XDG_DATA_HOME/cargo/bin/rg" ]
}
@test "live run is idempotent when directories do not exist" {
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
}
# ── Group 6: Go bin skipped when equal to XDG_BIN_HOME ────────────────
@test "go binaries are not removed when GO_BIN equals XDG_BIN_HOME" {
# When $XDG_DATA_HOME/go/bin == $XDG_BIN_HOME the script skips removal
export XDG_BIN_HOME="$XDG_DATA_HOME/go/bin"
mkdir -p "$XDG_DATA_HOME/go/bin"
touch "$XDG_DATA_HOME/go/bin/fzf"
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ -f "$XDG_DATA_HOME/go/bin/fzf" ]
}
@test "go binaries are removed when GO_BIN differs from XDG_BIN_HOME" {
mkdir -p "$XDG_DATA_HOME/go/bin"
touch "$XDG_DATA_HOME/go/bin/fzf"
# XDG_BIN_HOME is $BATS_TMPDIR/bin which differs from $XDG_DATA_HOME/go/bin
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[ ! -f "$XDG_DATA_HOME/go/bin/fzf" ]
}
# ── Group 7: Output messages ───────────────────────────────────────────
@test "cleanup script prints completion message on success" {
run bash scripts/cleanup-old-version-managers.sh
[ "$status" -eq 0 ]
[[ "$output" == *"Cleanup complete"* ]]
}
@test "dry-run prints completion message on success" {
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
[[ "$output" == *"Cleanup complete"* ]]
}
@test "cleanup script notes Mason binaries will not be touched" {
run bash scripts/cleanup-old-version-managers.sh --dry-run
[ "$status" -eq 0 ]
[[ "$output" == *"Mason"* ]]
}

37
tests/dfm.bats Executable file → Normal file
View File

@@ -38,25 +38,38 @@ setup()
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
[[ "$output" == *"all"* ]] [[ "$output" == *"all"* ]]
[[ "$output" == *"apt-packages"* ]] [[ "$output" == *"apt-packages"* ]]
[[ "$output" == *"cargo"* ]]
[[ "$output" == *"cheat-databases"* ]] [[ "$output" == *"cheat-databases"* ]]
[[ "$output" == *"composer"* ]] [[ "$output" == *"composer"* ]]
[[ "$output" == *"dnf-packages"* ]] [[ "$output" == *"dnf-packages"* ]]
[[ "$output" == *"fonts"* ]] [[ "$output" == *"fonts"* ]]
[[ "$output" == *"gh"* ]] [[ "$output" == *"gh"* ]]
[[ "$output" == *"git-crypt"* ]] [[ "$output" == *"git-crypt"* ]]
[[ "$output" == *"go"* ]]
[[ "$output" == *"imagick"* ]] [[ "$output" == *"imagick"* ]]
[[ "$output" == *"macos"* ]] [[ "$output" == *"macos"* ]]
[[ "$output" == *"npm-packages"* ]] [[ "$output" == *"mise"* ]]
[[ "$output" == *"mise-cleanup"* ]]
[[ "$output" == *"ntfy"* ]] [[ "$output" == *"ntfy"* ]]
[[ "$output" == *"nvm-latest"* ]] [[ "$output" == *"python-libs"* ]]
[[ "$output" == *"nvm"* ]]
[[ "$output" == *"python-packages"* ]]
[[ "$output" == *"xcode-cli-tools"* ]] [[ "$output" == *"xcode-cli-tools"* ]]
[[ "$output" == *"z"* ]] [[ "$output" == *"z"* ]]
} }
@test "dfm install menu does not show removed nvm/cargo/go entries" {
run bash local/bin/dfm install
[ "$status" -eq 0 ]
[[ "$output" != *"nvm-latest"* ]]
[[ "$output" != *"npm-packages"* ]]
[[ "$output" != *"python-packages"* ]]
}
@test "dfm install menu shows mise entry with description" {
run bash local/bin/dfm install
[ "$status" -eq 0 ]
[[ "$output" == *"mise"* ]]
[[ "$output" == *"mise-cleanup"* ]]
[[ "$output" == *"python-libs"* ]]
}
@test "dfm install with invalid subcommand shows menu" { @test "dfm install with invalid subcommand shows menu" {
run bash local/bin/dfm install nonexistent run bash local/bin/dfm install nonexistent
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
@@ -101,9 +114,17 @@ setup()
@test "dfm scripts menu lists install scripts" { @test "dfm scripts menu lists install scripts" {
run bash local/bin/dfm scripts run bash local/bin/dfm scripts
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
[[ "$output" == *"cargo-packages"* ]]
[[ "$output" == *"fonts"* ]] [[ "$output" == *"fonts"* ]]
[[ "$output" == *"z"* ]] [[ "$output" == *"z"* ]]
[[ "$output" == *"python-packages"* ]]
}
@test "dfm scripts menu does not list removed cargo and go scripts" {
run bash local/bin/dfm scripts
[ "$status" -eq 0 ]
[[ "$output" != *"cargo-packages"* ]]
[[ "$output" != *"go-packages"* ]]
[[ "$output" != *"npm-packages"* ]]
} }
@test "dfm tests menu shows entries" { @test "dfm tests menu shows entries" {
@@ -142,4 +163,4 @@ setup()
@test "dfm check host with non-matching value exits 1" { @test "dfm check host with non-matching value exits 1" {
run bash local/bin/dfm check host fakehostname run bash local/bin/dfm check host fakehostname
[ "$status" -eq 1 ] [ "$status" -eq 1 ]
} }

View File

@@ -0,0 +1,157 @@
#!/usr/bin/env bats
setup()
{
export DOTFILES="$PWD"
# Pre-set CURRENT_SHELL so config/shared.sh's x-path-prepend works
# even in environments where `ps` is unavailable.
export CURRENT_SHELL="bash"
export XDG_DATA_HOME="$BATS_TMPDIR/share"
export XDG_BIN_HOME="$BATS_TMPDIR/bin"
export XDG_CONFIG_HOME="$BATS_TMPDIR/config"
export XDG_CACHE_HOME="$BATS_TMPDIR/cache"
export XDG_STATE_HOME="$BATS_TMPDIR/state"
mkdir -p "$XDG_DATA_HOME" "$XDG_BIN_HOME"
# Fake bin directory for mock commands
export FAKE_BIN="$BATS_TMPDIR/fake-bin"
mkdir -p "$FAKE_BIN"
}
teardown()
{
rm -rf "$BATS_TMPDIR/share" "$BATS_TMPDIR/bin" "$BATS_TMPDIR/fake-bin" \
"$BATS_TMPDIR/config" "$BATS_TMPDIR/cache" "$BATS_TMPDIR/state"
}
# ── Group 1: uv availability check ────────────────────────────────────
@test "script exits 1 when uv is not found" {
# Run with a PATH that does not contain uv
run env PATH="$FAKE_BIN:/usr/bin:/bin" bash scripts/install-python-packages.sh
[ "$status" -eq 1 ]
}
@test "script prints error message when uv is not found" {
run env PATH="$FAKE_BIN:/usr/bin:/bin" bash scripts/install-python-packages.sh
[ "$status" -eq 1 ]
[[ "$output" == *"uv not found"* ]]
}
@test "error message directs user to install uv via mise" {
run env PATH="$FAKE_BIN:/usr/bin:/bin" bash scripts/install-python-packages.sh
[ "$status" -eq 1 ]
[[ "$output" == *"mise"* ]]
}
# ── Group 2: Successful library installation ───────────────────────────
@test "script exits 0 when uv is available and installs succeed" {
# Create a mock uv that succeeds for all invocations
cat > "$FAKE_BIN/uv" <<'EOF'
#!/usr/bin/env bash
exit 0
EOF
chmod +x "$FAKE_BIN/uv"
run env PATH="$FAKE_BIN:$PATH" bash scripts/install-python-packages.sh
[ "$status" -eq 0 ]
}
@test "script calls uv pip install for libtmux" {
local calls_log="$BATS_TMPDIR/uv-calls.log"
cat > "$FAKE_BIN/uv" <<EOF
#!/usr/bin/env bash
echo "uv \$@" >> "$calls_log"
exit 0
EOF
chmod +x "$FAKE_BIN/uv"
run env PATH="$FAKE_BIN:$PATH" bash scripts/install-python-packages.sh
[ "$status" -eq 0 ]
grep -q "libtmux" "$calls_log"
}
@test "script calls uv pip install for pynvim" {
local calls_log="$BATS_TMPDIR/uv-calls.log"
cat > "$FAKE_BIN/uv" <<EOF
#!/usr/bin/env bash
echo "uv \$@" >> "$calls_log"
exit 0
EOF
chmod +x "$FAKE_BIN/uv"
run env PATH="$FAKE_BIN:$PATH" bash scripts/install-python-packages.sh
[ "$status" -eq 0 ]
grep -q "pynvim" "$calls_log"
}
@test "script uses --system flag with uv pip install" {
local calls_log="$BATS_TMPDIR/uv-calls.log"
cat > "$FAKE_BIN/uv" <<EOF
#!/usr/bin/env bash
echo "uv \$@" >> "$calls_log"
exit 0
EOF
chmod +x "$FAKE_BIN/uv"
run env PATH="$FAKE_BIN:$PATH" bash scripts/install-python-packages.sh
[ "$status" -eq 0 ]
grep -q -- "--system" "$calls_log"
}
@test "script uses --upgrade flag with uv pip install" {
local calls_log="$BATS_TMPDIR/uv-calls.log"
cat > "$FAKE_BIN/uv" <<EOF
#!/usr/bin/env bash
echo "uv \$@" >> "$calls_log"
exit 0
EOF
chmod +x "$FAKE_BIN/uv"
run env PATH="$FAKE_BIN:$PATH" bash scripts/install-python-packages.sh
[ "$status" -eq 0 ]
grep -q -- "--upgrade" "$calls_log"
}
@test "script prints success message when all libraries are installed" {
cat > "$FAKE_BIN/uv" <<'EOF'
#!/usr/bin/env bash
exit 0
EOF
chmod +x "$FAKE_BIN/uv"
run env PATH="$FAKE_BIN:$PATH" bash scripts/install-python-packages.sh
[ "$status" -eq 0 ]
[[ "$output" == *"complete"* ]]
}
# ── Group 3: Failure propagation ──────────────────────────────────────
@test "script exits non-zero when uv pip install fails" {
cat > "$FAKE_BIN/uv" <<'EOF'
#!/usr/bin/env bash
exit 1
EOF
chmod +x "$FAKE_BIN/uv"
run env PATH="$FAKE_BIN:$PATH" bash scripts/install-python-packages.sh
[ "$status" -ne 0 ]
}
@test "script does not install tools via uv tool install" {
# This PR removed tool installation; only library (pip) installs remain.
local calls_log="$BATS_TMPDIR/uv-calls.log"
cat > "$FAKE_BIN/uv" <<EOF
#!/usr/bin/env bash
echo "uv \$@" >> "$calls_log"
exit 0
EOF
chmod +x "$FAKE_BIN/uv"
run env PATH="$FAKE_BIN:$PATH" bash scripts/install-python-packages.sh
[ "$status" -eq 0 ]
# "uv tool install" should NOT appear in calls
run grep "tool install" "$calls_log"
[ "$status" -ne 0 ]
}

561
yarn.lock
View File

@@ -1,244 +1,385 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # This file is generated by running "yarn install" inside your project.
# yarn lockfile v1 # Manual changes might be lost - proceed with caution!
__metadata:
version: 8
cacheKey: 10c0
"@biomejs/biome@^2.4.4": "@biomejs/biome@npm:^2.4.4":
version "2.4.7" version: 2.4.7
resolved "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.7.tgz" resolution: "@biomejs/biome@npm:2.4.7"
integrity sha512-vXrgcmNGZ4lpdwZSpMf1hWw1aWS6B+SyeSYKTLrNsiUsAdSRN0J4d/7mF3ogJFbIwFFSOL3wT92Zzxia/d5/ng==
optionalDependencies:
"@biomejs/cli-darwin-arm64" "2.4.7"
"@biomejs/cli-darwin-x64" "2.4.7"
"@biomejs/cli-linux-arm64" "2.4.7"
"@biomejs/cli-linux-arm64-musl" "2.4.7"
"@biomejs/cli-linux-x64" "2.4.7"
"@biomejs/cli-linux-x64-musl" "2.4.7"
"@biomejs/cli-win32-arm64" "2.4.7"
"@biomejs/cli-win32-x64" "2.4.7"
"@biomejs/cli-darwin-arm64@2.4.7":
version "2.4.7"
resolved "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.7.tgz"
integrity sha512-Oo0cF5mHzmvDmTXw8XSjhCia8K6YrZnk7aCS54+/HxyMdZMruMO3nfpDsrlar/EQWe41r1qrwKiCa2QDYHDzWA==
"@biomejs/cli-darwin-x64@2.4.7":
version "2.4.7"
resolved "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.7.tgz"
integrity sha512-I+cOG3sd/7HdFtvDSnF9QQPrWguUH7zrkIMMykM3PtfWU9soTcS2yRb9Myq6MHmzbeCT08D1UmY+BaiMl5CcoQ==
"@biomejs/cli-linux-arm64-musl@2.4.7":
version "2.4.7"
resolved "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.7.tgz"
integrity sha512-I2NvM9KPb09jWml93O2/5WMfNR7Lee5Latag1JThDRMURVhPX74p9UDnyTw3Ae6cE1DgXfw7sqQgX7rkvpc0vw==
"@biomejs/cli-linux-arm64@2.4.7":
version "2.4.7"
resolved "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.7.tgz"
integrity sha512-om6FugwmibzfP/6ALj5WRDVSND4H2G9X0nkI1HZpp2ySf9lW2j0X68oQSaHEnls6666oy4KDsc5RFjT4m0kV0w==
"@biomejs/cli-linux-x64-musl@2.4.7":
version "2.4.7"
resolved "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.7.tgz"
integrity sha512-00kx4YrBMU8374zd2wHuRV5wseh0rom5HqRND+vDldJPrWwQw+mzd/d8byI9hPx926CG+vWzq6AeiT7Yi5y59g==
"@biomejs/cli-linux-x64@2.4.7":
version "2.4.7"
resolved "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.7.tgz"
integrity sha512-bV8/uo2Tj+gumnk4sUdkerWyCPRabaZdv88IpbmDWARQQoA/Q0YaqPz1a+LSEDIL7OfrnPi9Hq1Llz4ZIGyIQQ==
"@biomejs/cli-win32-arm64@2.4.7":
version "2.4.7"
resolved "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.7.tgz"
integrity sha512-hOUHBMlFCvDhu3WCq6vaBoG0dp0LkWxSEnEEsxxXvOa9TfT6ZBnbh72A/xBM7CBYB7WgwqboetzFEVDnMxelyw==
"@biomejs/cli-win32-x64@2.4.7":
version "2.4.7"
resolved "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.7.tgz"
integrity sha512-qEpGjSkPC3qX4ycbMUthXvi9CkRq7kZpkqMY1OyhmYlYLnANnooDQ7hDerM8+0NJ+DZKVnsIc07h30XOpt7LtQ==
"@types/node@^25.3.2":
version "25.5.0"
resolved "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz"
integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==
dependencies: dependencies:
undici-types "~7.18.0" "@biomejs/cli-darwin-arm64": "npm:2.4.7"
"@biomejs/cli-darwin-x64": "npm:2.4.7"
"@biomejs/cli-linux-arm64": "npm:2.4.7"
"@biomejs/cli-linux-arm64-musl": "npm:2.4.7"
"@biomejs/cli-linux-x64": "npm:2.4.7"
"@biomejs/cli-linux-x64-musl": "npm:2.4.7"
"@biomejs/cli-win32-arm64": "npm:2.4.7"
"@biomejs/cli-win32-x64": "npm:2.4.7"
dependenciesMeta:
"@biomejs/cli-darwin-arm64":
optional: true
"@biomejs/cli-darwin-x64":
optional: true
"@biomejs/cli-linux-arm64":
optional: true
"@biomejs/cli-linux-arm64-musl":
optional: true
"@biomejs/cli-linux-x64":
optional: true
"@biomejs/cli-linux-x64-musl":
optional: true
"@biomejs/cli-win32-arm64":
optional: true
"@biomejs/cli-win32-x64":
optional: true
bin:
biome: bin/biome
checksum: 10c0/c073da6f081b72e061e471f6bc6d8680978dceb84a3528cb58117466d38ecb7cef075d949875d2371a268af030c2afece0fb6dd593d124fc8706c9307909f244
languageName: node
linkType: hard
balanced-match@^4.0.2: "@biomejs/cli-darwin-arm64@npm:2.4.7":
version "4.0.4" version: 2.4.7
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" resolution: "@biomejs/cli-darwin-arm64@npm:2.4.7"
integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
bats@^1.13.0: "@biomejs/cli-darwin-x64@npm:2.4.7":
version "1.13.0" version: 2.4.7
resolved "https://registry.npmjs.org/bats/-/bats-1.13.0.tgz" resolution: "@biomejs/cli-darwin-x64@npm:2.4.7"
integrity sha512-giSYKGTOcPZyJDbfbTtzAedLcNWdjCLbXYU3/MwPnjyvDXzu6Dgw8d2M+8jHhZXSmsCMSQqCp+YBsJ603UO4vQ== conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
brace-expansion@^5.0.2: "@biomejs/cli-linux-arm64-musl@npm:2.4.7":
version "5.0.4" version: 2.4.7
resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz" resolution: "@biomejs/cli-linux-arm64-musl@npm:2.4.7"
integrity sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg== conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@biomejs/cli-linux-arm64@npm:2.4.7":
version: 2.4.7
resolution: "@biomejs/cli-linux-arm64@npm:2.4.7"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@biomejs/cli-linux-x64-musl@npm:2.4.7":
version: 2.4.7
resolution: "@biomejs/cli-linux-x64-musl@npm:2.4.7"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@biomejs/cli-linux-x64@npm:2.4.7":
version: 2.4.7
resolution: "@biomejs/cli-linux-x64@npm:2.4.7"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@biomejs/cli-win32-arm64@npm:2.4.7":
version: 2.4.7
resolution: "@biomejs/cli-win32-arm64@npm:2.4.7"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@biomejs/cli-win32-x64@npm:2.4.7":
version: 2.4.7
resolution: "@biomejs/cli-win32-x64@npm:2.4.7"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@types/node@npm:^25.3.2":
version: 25.5.0
resolution: "@types/node@npm:25.5.0"
dependencies: dependencies:
balanced-match "^4.0.2" undici-types: "npm:~7.18.0"
checksum: 10c0/70c508165b6758c4f88d4f91abca526c3985eee1985503d4c2bd994dbaf588e52ac57e571160f18f117d76e963570ac82bd20e743c18987e82564312b3b62119
languageName: node
linkType: hard
debug@^4.3.4: "balanced-match@npm:^4.0.2":
version "4.4.3" version: 4.0.4
resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" resolution: "balanced-match@npm:4.0.4"
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b
languageName: node
linkType: hard
"bats@npm:^1.13.0":
version: 1.13.0
resolution: "bats@npm:1.13.0"
bin:
bats: bin/bats
checksum: 10c0/7f697d6305d80d328d620bd58c658f7830fbed57e28a43f18771d89fb6f941a131b440ab18d951fd15fdd23f3c687687d607d7fc03ac4c99f4725e64d2432832
languageName: node
linkType: hard
"brace-expansion@npm:^5.0.2":
version: 5.0.4
resolution: "brace-expansion@npm:5.0.4"
dependencies: dependencies:
ms "^2.1.3" balanced-match: "npm:^4.0.2"
checksum: 10c0/359cbcfa80b2eb914ca1f3440e92313fbfe7919ee6b274c35db55bec555aded69dac5ee78f102cec90c35f98c20fa43d10936d0cd9978158823c249257e1643a
languageName: node
linkType: hard
deep-is@^0.1.3: "debug@npm:^4.3.4":
version "0.1.4" version: 4.4.3
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" resolution: "debug@npm:4.4.3"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
editorconfig-checker@^6.1.1:
version "6.1.1"
resolved "https://registry.npmjs.org/editorconfig-checker/-/editorconfig-checker-6.1.1.tgz"
integrity sha512-kiOb6qaWpMNt7Z/43ba0Pa1Inhr2/t9nKbvEKtCeXJ5AesztoM9AgLOOQVB4QUv/nGjgz3xkbx4pcogVRD2NWw==
fast-levenshtein@^2.0.6:
version "2.0.6"
resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
find-package-json@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz"
integrity sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==
fs-extra@^11.1.1:
version "11.3.4"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz"
integrity sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==
dependencies: dependencies:
graceful-fs "^4.2.0" ms: "npm:^2.1.3"
jsonfile "^6.0.1" peerDependenciesMeta:
universalify "^2.0.0" supports-color:
optional: true
checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6
languageName: node
linkType: hard
glob@^13.0.0: "deep-is@npm:^0.1.3":
version "13.0.6" version: 0.1.4
resolved "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz" resolution: "deep-is@npm:0.1.4"
integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c
languageName: node
linkType: hard
"editorconfig-checker@npm:^6.1.1":
version: 6.1.1
resolution: "editorconfig-checker@npm:6.1.1"
bin:
ec: dist/index.js
editorconfig-checker: dist/index.js
checksum: 10c0/0a46ce93e2821041c4b4bbf2ab9dc30e1b4eb03d3f20e5b14bbe45767f6f2aafd5e1310ea737c15402d8e193f702a421a814041e072584250e8a7d5e63d83741
languageName: node
linkType: hard
"fast-levenshtein@npm:^2.0.6":
version: 2.0.6
resolution: "fast-levenshtein@npm:2.0.6"
checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4
languageName: node
linkType: hard
"find-package-json@npm:^1.2.0":
version: 1.2.0
resolution: "find-package-json@npm:1.2.0"
checksum: 10c0/85d6c97afb9f8f0deb0d344a1c4eb8027347cf4d61666c28d3ac3f913e916684441218682b3dd6f8ad570e5d43c96a7db521f70183d70df559d07e1f99cdc635
languageName: node
linkType: hard
"fs-extra@npm:^11.1.1":
version: 11.3.4
resolution: "fs-extra@npm:11.3.4"
dependencies: dependencies:
minimatch "^10.2.2" graceful-fs: "npm:^4.2.0"
minipass "^7.1.3" jsonfile: "npm:^6.0.1"
path-scurry "^2.0.2" universalify: "npm:^2.0.0"
checksum: 10c0/e08276f767a62496ae97d711aaa692c6a478177f24a85979b6a2881c9db9c68b8c2ad5da0bcf92c0b2a474cea6e935ec245656441527958fd8372cb647087df0
languageName: node
linkType: hard
graceful-fs@^4.1.6, graceful-fs@^4.2.0: "glob@npm:^13.0.0":
version "4.2.11" version: 13.0.6
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" resolution: "glob@npm:13.0.6"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
jsonfile@^6.0.1:
version "6.2.0"
resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz"
integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==
dependencies: dependencies:
universalify "^2.0.0" minimatch: "npm:^10.2.2"
optionalDependencies: minipass: "npm:^7.1.3"
graceful-fs "^4.1.6" path-scurry: "npm:^2.0.2"
checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a
languageName: node
linkType: hard
levn@^0.4.1: "graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0":
version "0.4.1" version: 4.2.11
resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" resolution: "graceful-fs@npm:4.2.11"
integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2
languageName: node
linkType: hard
"ivuorinen-dotfiles@workspace:.":
version: 0.0.0-use.local
resolution: "ivuorinen-dotfiles@workspace:."
dependencies: dependencies:
prelude-ls "^1.2.1" "@biomejs/biome": "npm:^2.4.4"
type-check "~0.4.0" "@types/node": "npm:^25.3.2"
bats: "npm:^1.13.0"
editorconfig-checker: "npm:^6.1.1"
markdown-table-formatter: "npm:^1.7.0"
prettier: "npm:^3.8.1"
typescript: "npm:^5.9.3"
languageName: unknown
linkType: soft
lru-cache@^11.0.0: "jsonfile@npm:^6.0.1":
version "11.2.7" version: 6.2.0
resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz" resolution: "jsonfile@npm:6.2.0"
integrity sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==
markdown-table-formatter@^1.7.0:
version "1.7.0"
resolved "https://registry.npmjs.org/markdown-table-formatter/-/markdown-table-formatter-1.7.0.tgz"
integrity sha512-/yddr66lbp5N1HESvkJoFIQq2VUUdFoBEJ+jAU/Mm/H2xaK80Nq2e0ugkJPWCRrix4GXhTUAccbsg1tQg5jiew==
dependencies: dependencies:
debug "^4.3.4" graceful-fs: "npm:^4.1.6"
find-package-json "^1.2.0" universalify: "npm:^2.0.0"
fs-extra "^11.1.1" dependenciesMeta:
glob "^13.0.0" graceful-fs:
markdown-table-prettify "^3.6.0" optional: true
optionator "^0.9.4" checksum: 10c0/7f4f43b08d1869ded8a6822213d13ae3b99d651151d77efd1557ced0889c466296a7d9684e397bd126acf5eb2cfcb605808c3e681d0fdccd2fe5a04b47e76c0d
languageName: node
linkType: hard
markdown-table-prettify@^3.6.0: "levn@npm:^0.4.1":
version "3.7.0" version: 0.4.1
resolved "https://registry.npmjs.org/markdown-table-prettify/-/markdown-table-prettify-3.7.0.tgz" resolution: "levn@npm:0.4.1"
integrity sha512-woZ1X+u0HsTygXL5kcptMSDwnjU//3UKTOH6fGdaABSSLOxTdWjr2P6i7dVrru5t/pxyEOT48/skv/8m8/VqdA==
minimatch@^10.2.2:
version "10.2.4"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz"
integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==
dependencies: dependencies:
brace-expansion "^5.0.2" prelude-ls: "npm:^1.2.1"
type-check: "npm:~0.4.0"
checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e
languageName: node
linkType: hard
minipass@^7.1.2, minipass@^7.1.3: "lru-cache@npm:^11.0.0":
version "7.1.3" version: 11.2.7
resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz" resolution: "lru-cache@npm:11.2.7"
integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== checksum: 10c0/549cdb59488baa617135fc12159cafb1a97f91079f35093bb3bcad72e849fc64ace636d244212c181dfdf1a99bbfa90757ff303f98561958ee4d0f885d9bd5f7
languageName: node
linkType: hard
ms@^2.1.3: "markdown-table-formatter@npm:^1.7.0":
version "2.1.3" version: 1.7.0
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" resolution: "markdown-table-formatter@npm:1.7.0"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
optionator@^0.9.4:
version "0.9.4"
resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
dependencies: dependencies:
deep-is "^0.1.3" debug: "npm:^4.3.4"
fast-levenshtein "^2.0.6" find-package-json: "npm:^1.2.0"
levn "^0.4.1" fs-extra: "npm:^11.1.1"
prelude-ls "^1.2.1" glob: "npm:^13.0.0"
type-check "^0.4.0" markdown-table-prettify: "npm:^3.6.0"
word-wrap "^1.2.5" optionator: "npm:^0.9.4"
bin:
markdown-table-formatter: lib/index.js
checksum: 10c0/0f0d5eaec2c3bb9c60328ffbb4652305845def5387f4c87dd6e83559ef793961353af64ae44bce9cda3394469e419e046ae42fe7e9cafd47414b42deaa28f3b7
languageName: node
linkType: hard
path-scurry@^2.0.2: "markdown-table-prettify@npm:^3.6.0":
version "2.0.2" version: 3.7.0
resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz" resolution: "markdown-table-prettify@npm:3.7.0"
integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== bin:
markdown-table-prettify: cli/index.js
checksum: 10c0/f387b1ca81ceaa201bda2ce1db8e4d392a4d4ac3d7bb3173c7d9e3d9ca389e31d247eee2ccd2fa30f3132ae2447dc51285fb68636cdaf825633a43a499f41cd6
languageName: node
linkType: hard
"minimatch@npm:^10.2.4":
version: 10.2.4
resolution: "minimatch@npm:10.2.4"
dependencies: dependencies:
lru-cache "^11.0.0" brace-expansion: "npm:^5.0.2"
minipass "^7.1.2" checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945
languageName: node
linkType: hard
prelude-ls@^1.2.1: "minipass@npm:^7.1.2, minipass@npm:^7.1.3":
version "1.2.1" version: 7.1.3
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" resolution: "minipass@npm:7.1.3"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb
languageName: node
linkType: hard
prettier@^3.8.1: "ms@npm:^2.1.3":
version "3.8.1" version: 2.1.3
resolved "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz" resolution: "ms@npm:2.1.3"
integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48
languageName: node
linkType: hard
type-check@^0.4.0, type-check@~0.4.0: "optionator@npm:^0.9.4":
version "0.4.0" version: 0.9.4
resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" resolution: "optionator@npm:0.9.4"
integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
dependencies: dependencies:
prelude-ls "^1.2.1" deep-is: "npm:^0.1.3"
fast-levenshtein: "npm:^2.0.6"
levn: "npm:^0.4.1"
prelude-ls: "npm:^1.2.1"
type-check: "npm:^0.4.0"
word-wrap: "npm:^1.2.5"
checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675
languageName: node
linkType: hard
typescript@^5.9.3: "path-scurry@npm:^2.0.2":
version "5.9.3" version: 2.0.2
resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" resolution: "path-scurry@npm:2.0.2"
integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== dependencies:
lru-cache: "npm:^11.0.0"
minipass: "npm:^7.1.2"
checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482
languageName: node
linkType: hard
undici-types@~7.18.0: "prelude-ls@npm:^1.2.1":
version "7.18.2" version: 1.2.1
resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz" resolution: "prelude-ls@npm:1.2.1"
integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd
languageName: node
linkType: hard
universalify@^2.0.0: "prettier@npm:^3.8.1":
version "2.0.1" version: 3.8.1
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" resolution: "prettier@npm:3.8.1"
integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== bin:
prettier: bin/prettier.cjs
checksum: 10c0/33169b594009e48f570471271be7eac7cdcf88a209eed39ac3b8d6d78984039bfa9132f82b7e6ba3b06711f3bfe0222a62a1bfb87c43f50c25a83df1b78a2c42
languageName: node
linkType: hard
word-wrap@^1.2.5: "type-check@npm:^0.4.0, type-check@npm:~0.4.0":
version "1.2.5" version: 0.4.0
resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" resolution: "type-check@npm:0.4.0"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== dependencies:
prelude-ls: "npm:^1.2.1"
checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58
languageName: node
linkType: hard
"typescript@npm:^5.9.3":
version: 5.9.3
resolution: "typescript@npm:5.9.3"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5
languageName: node
linkType: hard
"typescript@patch:typescript@npm%3A^5.9.3#optional!builtin<compat/typescript>":
version: 5.9.3
resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin<compat/typescript>::version=5.9.3&hash=5786d5"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430
languageName: node
linkType: hard
"undici-types@npm:~7.18.0":
version: 7.18.2
resolution: "undici-types@npm:7.18.2"
checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d
languageName: node
linkType: hard
"universalify@npm:^2.0.0":
version: 2.0.1
resolution: "universalify@npm:2.0.1"
checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a
languageName: node
linkType: hard
"word-wrap@npm:^1.2.5":
version: 1.2.5
resolution: "word-wrap@npm:1.2.5"
checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20
languageName: node
linkType: hard