Compare commits

..

59 Commits

Author SHA1 Message Date
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
renovate[bot]
035405b22f chore(actions): update ivuorinen/actions action (v2026.03.11 → v2026.03.14) (#307)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-17 15:29:24 +02:00
renovate[bot]
7dd6ccbc6c chore(actions): update softprops/action-gh-release action (v2.5.0 → v2.6.1) (#308)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-17 14:56:51 +02:00
8a5c9f9089 chore: general maintenance and cleanup (#306) 2026-03-15 19:14:36 +02:00
renovate[bot]
2410f343c2 chore(deps): update pre-commit hook astral-sh/ruff-pre-commit (v0.15.5 → v0.15.6) (#305) 2026-03-13 20:06:51 +02:00
renovate[bot]
d120839830 chore(actions): update ivuorinen/actions action (v2026.03.02 → v2026.03.11) (#304)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-13 08:40:10 +02:00
renovate[bot]
5662d09202 chore(deps): update pre-commit hook johnnymorganz/stylua (v2.3.1 → v2.4.0) (#303)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-08 19:31:45 +02:00
renovate[bot]
076050ad58 chore(deps): update pre-commit hook astral-sh/ruff-pre-commit (v0.15.4 → v0.15.5) (#302) 2026-03-07 03:46:31 +02:00
renovate[bot]
313915e55c chore(deps): update loopwerk/tag-changelog action (v1.3.0 → v1.5.0) (#300) 2026-03-05 22:07:58 +02:00
renovate[bot]
e490a735c8 chore(deps): lock file maintenance (#301) 2026-03-05 22:06:11 +02:00
renovate[bot]
5fe82b2898 chore(deps): lock file maintenance (#299) 2026-03-03 08:19:51 +02:00
renovate[bot]
6621bcb470 chore(deps): update ivuorinen/actions action (v2026.02.24 → v2026.03.02) (#298)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-03 05:54:49 +00:00
3b6ace12e9 feat(scripts): add shellspec installation to dfm (#296)
* feat(scripts): add shellspec installation to dfm

Add install-shellspec.sh script that clones shellspec to
~/.cache/shellspec and installs via make to ~/.local/bin.
Wire it into dfm install menu and the Tier 4 install-all pipeline.

* fix(scripts): address PR review feedback for shellspec installer

Add companion install-shellspec.md documentation file to match
codebase convention. Add --depth=1 to git pull for consistent
shallow clone behavior.

* fix(scripts): pin shellspec install to latest release tag

Use x-gh-get-latest-version to fetch the latest release tag from
GitHub and clone/checkout that specific version. Addresses supply
chain concern and normalizes --depth=1 style.

* docs(scripts): update shellspec docs to reflect release-tag pinning
2026-03-02 16:39:17 +02:00
renovate[bot]
f92e4a606f chore(deps): lock file maintenance (#295)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-02 00:58:41 +02:00
fae7a8f13f feat(bin): add x-visit-folders script for bulk zoxide registration (#294)
* feat(bin): add x-visit-folders script for bulk zoxide registration

* fix(bin): fix x-visit-folders usage exit code, no-op fallback, and count increment

- usage() now accepts optional exit code; --help exits 0
- Remove no-op subshell cd fallback in visit_dir(), just log failure
- Replace ((count++)) with count=$((count + 1)) to avoid set -e trap
2026-03-01 22:02:49 +02:00
eaa7680671 chore(config): sesh config additions 2026-03-01 21:37:34 +02:00
070c94a244 docs: update CLAUDE.md with biome migrate command and gotchas 2026-02-28 10:50:44 +02:00
70cf8ccf6d style(fish): reformat phpenv files with fish_indent 2026-02-28 10:50:43 +02:00
63faf4c4bf feat(claude): add fish-validate and lua-format skills
Add fish-validate skill for syntax checking and formatting .fish files,
lua-format skill for stylua formatting, and fish_indent PostToolUse hook.
2026-02-28 10:50:43 +02:00
renovate[bot]
d81ff6dabb chore(deps): update pre-commit hook astral-sh/ruff-pre-commit (v0.15.2 → v0.15.4) (#293)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-28 10:44:34 +02:00
ed6bef5c7e fix(deps): resolve minimatch to latest 10.x
Add resolutions field to pin minimatch to ^10.2.4.
2026-02-28 10:40:19 +02:00
46b9e3ebeb build(deps): upgrade devDependencies to latest
Bump @biomejs/biome ^2.4.4, @types/node ^25.3.2, bats ^1.13.0,
editorconfig-checker ^6.1.1, typescript ^5.9.3.
2026-02-28 10:39:50 +02:00
f26303a0ff build(biome): migrate schema to v2.4.4 2026-02-28 10:39:04 +02:00
8379135c81 fix(skills): wrap long lines in shell-validate skill
Break lines exceeding 120 chars in the description frontmatter,
intro paragraph, and shellcheck section.
2026-02-28 10:38:42 +02:00
73d0d6b35f fix(scripts): remove exit-on-error from cargo install script
Remove -e from set -euo pipefail so the script continues past
individual cargo install failures.
2026-02-28 10:37:35 +02:00
6a839eea56 fix(gh): update git protocol to ssh
Switch gh CLI git_protocol from https to ssh. Add hosts.yml to
prettierignore since the file is managed by gh CLI.
2026-02-28 10:37:22 +02:00
28c8332058 fix(wezterm): adjust font size and window padding
Reduce font size from 16 to 12, increase window padding from 5 to 10.
2026-02-28 10:36:58 +02:00
b956119b98 feat(fish): add mise version manager integration
Add mise activate and shims PATH for fish shell, plus rustup
cargo env sourcing in conf.d/rustup.fish.
2026-02-28 10:36:49 +02:00
renovate[bot]
0f82f8e65b chore(deps): update node.js (v24.13.1 → v24.14.0) (#292)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-26 08:37:40 +02:00
renovate[bot]
f1277ddf99 chore(deps): update ivuorinen/actions action (v2026.02.18 → v2026.02.24) (#291)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-26 06:36:36 +00:00
renovate[bot]
c834eab42b chore(deps): lock file maintenance (#290) 2026-02-23 21:34:33 +02:00
renovate[bot]
f93deb8bca chore(deps): update pre-commit hook astral-sh/ruff-pre-commit (v0.15.1 → v0.15.2) (#289) 2026-02-21 18:23:46 +02:00
renovate[bot]
248f57b914 chore(deps): update ivuorinen/actions action (v2026.02.10 → v2026.02.18) (#287)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-20 13:58:20 +02:00
renovate[bot]
86e4f9618c chore(deps): lock file maintenance (#288)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-20 13:40:40 +02:00
renovate[bot]
7eb97392fb chore(deps): lock file maintenance (#286) 2026-02-17 19:09:11 +02:00
renovate[bot]
8be1a9e7e2 chore(deps): update pre-commit hook rhysd/actionlint (v1.7.10 → v1.7.11) (#285)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-16 01:46:56 +00:00
renovate[bot]
a7c03fc3d6 chore(deps): update pre-commit hook astral-sh/ruff-pre-commit (v0.15.0 → v0.15.1) (#284)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-14 10:10:21 +02:00
renovate[bot]
3368e3b6dc chore(deps): update ivuorinen/actions action (v2026.02.03 → v2026.02.10) (#283)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-12 01:51:09 +00:00
renovate[bot]
5d87452224 chore(deps): update node.js (v24.13.0 → v24.13.1) (#282)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-12 01:49:42 +00:00
93 changed files with 1349 additions and 1277 deletions

View File

@@ -0,0 +1,14 @@
---
name: code-reviewer
description: Reviews shell/fish/lua changes for correctness and style
tools: [Read, Grep, Glob, Bash]
---
Review the changed files for:
1. **Shell scripts**: POSIX compliance for /bin/sh scripts, proper quoting, shellcheck issues
2. **Fish files**: fish syntax correctness, consistent function patterns
3. **Lua files**: stylua compliance, Neovim API usage patterns
4. **All**: EditorConfig compliance (2-space indent, LF endings)
Report only high-confidence issues. Skip vendor files (fzf-tmux).

View File

@@ -18,6 +18,14 @@
{ {
"type": "command", "type": "command",
"command": "fp=$(cat | jq -r '.tool_input.file_path // empty') && [ -n \"$fp\" ] && [ -f \"$fp\" ] && case \"$fp\" in *.sh|*/bin/*) head -1 \"$fp\" | grep -qE '^#!.*(ba)?sh' && command -v shfmt > /dev/null && shfmt -i 2 -bn -ci -sr -fn -w \"$fp\";; esac; exit 0" "command": "fp=$(cat | jq -r '.tool_input.file_path // empty') && [ -n \"$fp\" ] && [ -f \"$fp\" ] && case \"$fp\" in *.sh|*/bin/*) head -1 \"$fp\" | grep -qE '^#!.*(ba)?sh' && command -v shfmt > /dev/null && shfmt -i 2 -bn -ci -sr -fn -w \"$fp\";; esac; exit 0"
},
{
"type": "command",
"command": "fp=$(cat | jq -r '.tool_input.file_path // empty') && [ -n \"$fp\" ] && [ -f \"$fp\" ] && case \"$fp\" in *.fish) command -v fish_indent > /dev/null && fish_indent -w \"$fp\";; esac; exit 0"
},
{
"type": "command",
"command": "fp=$(cat | jq -r '.tool_input.file_path // empty') && [ -n \"$fp\" ] && [ -f \"$fp\" ] && case \"$fp\" in *.lua) command -v stylua > /dev/null && stylua \"$fp\";; esac; exit 0"
} }
] ]
} }

View File

@@ -0,0 +1,38 @@
---
name: fish-validate
description: >-
Validate fish scripts after editing.
Apply when writing or modifying any .fish file
in config/fish/.
user-invocable: false
allowed-tools: Bash, Read
---
After editing any `.fish` file in `config/fish/`, validate it:
## 1. Syntax check
```bash
fish --no-execute <file>
```
If syntax check fails, fix the issue before proceeding.
## 2. Format check
Run `fish_indent` to verify formatting:
```bash
fish_indent --check <file>
```
If formatting differs, apply it:
```bash
fish_indent -w <file>
```
## Key files to never validate
- Files inside `config/fish/functions/` prefixed with `_tide_`
(managed by the tide prompt plugin)

View File

@@ -0,0 +1,22 @@
---
name: lua-format
description: >-
Format Lua files after editing.
Apply when writing or modifying any .lua file.
user-invocable: false
allowed-tools: Bash
---
After editing any `.lua` file, format it with stylua:
```bash
stylua <file>
```
Project settings are in `stylua.toml` (90-char line length).
If stylua is not available, skip formatting silently.
## Files to never format
- Files inside `config/nvim/` managed by plugins (lazy.nvim lockfile)

View File

@@ -1,11 +1,16 @@
--- ---
name: shell-validate name: shell-validate
description: Validate shell scripts after editing. Apply when writing or modifying any shell script in local/bin/ or scripts/. description: >-
Validate shell scripts after editing.
Apply when writing or modifying any shell script
in local/bin/ or scripts/.
user-invocable: false user-invocable: false
allowed-tools: Bash, Read, Grep allowed-tools: Bash, Read, Grep
--- ---
After editing any shell script in `local/bin/`, `scripts/`, or `config/` (files with a `#!` shebang or `# shellcheck shell=` directive), validate it: After editing any shell script in `local/bin/`, `scripts/`, or `config/`
(files with a `#!` shebang or `# shellcheck shell=` directive),
validate it:
## 1. Determine the shell ## 1. Determine the shell
@@ -28,7 +33,9 @@ If syntax check fails, fix the issue before proceeding.
## 3. ShellCheck ## 3. ShellCheck
Run `shellcheck <file>`. The project `.shellcheckrc` already disables SC2039, SC2166, SC2154, SC1091, SC2174, SC2016. Only report and fix warnings that are NOT in that exclude list. Run `shellcheck <file>`. The project `.shellcheckrc` already
disables SC2039, SC2166, SC2154, SC1091, SC2174, SC2016.
Only report and fix warnings that are NOT in that exclude list.
## Key files to never validate (not shell scripts) ## Key files to never validate (not shell scripts)

View File

@@ -0,0 +1,38 @@
---
name: yaml-validate
description: >-
Validate YAML files after editing.
Apply when writing or modifying any .yml or .yaml file.
user-invocable: false
allowed-tools: Bash, Read
---
After editing any YAML file, validate it:
## 1. Syntax check
Run yamllint on the file:
```bash
yamllint <file>
```
If yamllint is not available, fall back to:
```bash
python3 -c "import yaml; yaml.safe_load(open('<file>'))"
```
## 2. GitHub Actions workflows
If the file is under `.github/workflows/`, also run:
```bash
actionlint <file>
```
If actionlint is not available, skip silently.
## Files to skip
- `config/gh/hosts.yml` — managed by `gh` CLI, not hand-edited

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",

View File

@@ -24,7 +24,7 @@ jobs:
- name: Create changelog text - name: Create changelog text
id: changelog id: changelog
uses: loopwerk/tag-changelog@941366edb8920e2071eae0449031830984b9f26e # v1.3.0 uses: loopwerk/tag-changelog@8dd150d55fbf1fe93e0ea00a29a6153aaeb81912 # v1.5.0
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
config_file: .github/tag-changelog-config.js config_file: .github/tag-changelog-config.js

View File

@@ -5,7 +5,7 @@ name: Lint Code Base
# yamllint disable-line # yamllint disable-line
on: on:
pull_request: pull_request:
branches: [master, main] branches: [main]
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
@@ -36,4 +36,4 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
- name: Run PR Lint - name: Run PR Lint
uses: ivuorinen/actions/pr-lint@f371da218e9152e7d29ee39358454e41010c36dc # v2026.02.03 uses: ivuorinen/actions/pr-lint@1da3a0e79fcd7da6bed9ee1979f1449ba11f58f9 # v2026.03.14

View File

@@ -35,14 +35,14 @@ jobs:
- name: Create changelog text - name: Create changelog text
if: steps.daily-version.outputs.created if: steps.daily-version.outputs.created
id: changelog id: changelog
uses: loopwerk/tag-changelog@941366edb8920e2071eae0449031830984b9f26e # v1.3.0 uses: loopwerk/tag-changelog@8dd150d55fbf1fe93e0ea00a29a6153aaeb81912 # v1.5.0
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
config_file: .github/tag-changelog-config.js config_file: .github/tag-changelog-config.js
- name: Create release - name: Create release
if: steps.daily-version.outputs.created if: steps.daily-version.outputs.created
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
tag_name: ${{ steps.daily-version.outputs.version }} tag_name: ${{ steps.daily-version.outputs.version }}

View File

@@ -30,4 +30,4 @@ jobs:
issues: write issues: write
steps: steps:
- uses: ivuorinen/actions/sync-labels@f371da218e9152e7d29ee39358454e41010c36dc # v2026.02.03 - uses: ivuorinen/actions/sync-labels@1da3a0e79fcd7da6bed9ee1979f1449ba11f58f9 # v2026.03.14

View File

@@ -5,7 +5,7 @@ name: Update submodules
on: on:
schedule: schedule:
# At 04:00 on Monday and Thursday. # At 04:00 on Monday and Thursday.
- cron: "0 4 * * 1" - cron: "0 4 * * 1,4"
workflow_dispatch: workflow_dispatch:
concurrency: concurrency:

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.13.0

View File

@@ -39,13 +39,13 @@ repos:
hooks: hooks:
- id: yamllint - id: yamllint
- repo: https://github.com/pre-commit/mirrors-prettier - repo: local
rev: v4.0.0-alpha.8
hooks: hooks:
- id: prettier - id: prettier
name: Prettier (YAML)
entry: yarn prettier --write
language: system
types_or: [yaml] types_or: [yaml]
additional_dependencies:
- prettier@3.8.1
- repo: https://github.com/shellcheck-py/shellcheck-py - repo: https://github.com/shellcheck-py/shellcheck-py
rev: v0.11.0.1 rev: v0.11.0.1
@@ -59,12 +59,12 @@ repos:
args: [-i, "2", -bn, -ci, -sr, -fn, -w] args: [-i, "2", -bn, -ci, -sr, -fn, -w]
- repo: https://github.com/rhysd/actionlint - repo: https://github.com/rhysd/actionlint
rev: v1.7.10 rev: v1.7.11
hooks: hooks:
- id: actionlint - id: actionlint
- repo: https://github.com/JohnnyMorganz/StyLua - repo: https://github.com/JohnnyMorganz/StyLua
rev: v2.3.1 rev: v2.4.0
hooks: hooks:
- id: stylua # or stylua-system / stylua-github - id: stylua # or stylua-system / stylua-github
exclude: hammerspoon\.types\.lua$ exclude: hammerspoon\.types\.lua$
@@ -76,7 +76,7 @@ repos:
- id: fish_indent - id: fish_indent
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.0 rev: v0.15.6
hooks: hooks:
- id: ruff-check - id: ruff-check
args: [--fix] args: [--fix]

View File

@@ -15,4 +15,4 @@ config/zsh
local/bin/antigen.zsh local/bin/antigen.zsh
local/bin/asdf local/bin/asdf
tools tools
docs/plans config/gh/hosts.yml

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

@@ -1,55 +0,0 @@
# Project guidelines
This repository contains configuration files and helper scripts for managing
a development environment.
Dotbot drives installation, and host-specific folders under `hosts/` contain extra configs.
## Setup
1. Run `yarn install` to fetch linting tools and the Bats test framework.
2. Re-run `yarn install` whenever `package.json` changes.
3. Yarn is the package manager of choice; avoid `npm` commands.
## Keeping the repository up to date
1. Update submodules with `git submodule update --remote --merge`.
2. Pull the latest changes and run `./install`.
## Linting and tests
- Format files with:
```bash
yarn fix:prettier
yarn fix:markdown
```
- Shell scripts must pass `shellcheck`.
```bash
find . -path ./node_modules -prune -o -name '*.sh' -print0 | xargs -0 shellcheck
```
- Ensure `.editorconfig` rules pass:
```bash
tools/install-ec.sh
ec
```
- Execute tests with `yarn test` when code changes.
## Debugging lint issues
- `yarn lint:prettier` and `yarn lint:markdown` show formatting errors.
- Ensure shell scripts have a shebang or `# shellcheck shell=bash` directive.
- Consult `.shellcheckrc` for project specific checks.
Scripts rely on helpers in `config/shared.sh` so they run under Bash, Zsh and Fish by default.
## Commits and PRs
- Use Semantic Commit messages: `type(scope): summary`.
- Keep PR titles in the same format.
<!-- vim: set ft=markdown spell spelllang=en_us cc=80 : -->

104
CLAUDE.md
View File

@@ -50,12 +50,15 @@ yarn test # Run all tests in tests/
# Shell linting # Shell linting
shellcheck <script> # Lint shell scripts shellcheck <script> # Lint shell scripts
# Tooling maintenance
npx @biomejs/biome migrate --write # Update biome schema version
``` ```
## Pre-commit Hooks ## Pre-commit Hooks
Configured in `.pre-commit-config.yaml`: shellcheck, shfmt, biome, Configured in `.pre-commit-config.yaml`: shellcheck, shfmt, biome,
yamllint, prettier, actionlint, stylua, fish_syntax/fish_indent. yamllint, prettier, actionlint, stylua, fish_syntax/fish_indent, ruff.
Run `pre-commit run --all-files` to check everything. Run `pre-commit run --all-files` to check everything.
## Commit Convention ## Commit Convention
@@ -121,7 +124,7 @@ These are layered on top of the global config during installation.
- **Lua** (neovim config): Formatted with stylua (`stylua.toml`), - **Lua** (neovim config): Formatted with stylua (`stylua.toml`),
90-char line length. 90-char line length.
- **JSON/JS/TS/Markdown**: Formatted with Biome (`biome.json`), - **JSON/JS/TS/Markdown**: Formatted with Biome (`biome.json`),
80-char width. 80-char width (Markdown uses 120-char override).
- **YAML**: Formatted with Prettier (`.prettierrc.json`), - **YAML**: Formatted with Prettier (`.prettierrc.json`),
validated with yamllint (`.yamllint.yml`). validated with yamllint (`.yamllint.yml`).
@@ -140,7 +143,9 @@ SC2174 (mkdir -p -m), SC2016 (single-quote expressions).
- **Vendor file**: `local/bin/fzf-tmux` is vendored from - **Vendor file**: `local/bin/fzf-tmux` is vendored from
junegunn/fzf — do not modify. junegunn/fzf — do not modify.
- **Fish config**: `config/fish/` has its own config chain - **Fish config**: `config/fish/` has its own config chain
(`config.fish`, `exports.fish`, `alias.fish`) plus 80+ functions. (`config.fish`, `exports.fish`, `alias.fish`) plus 60+ functions.
- **gh CLI config**: `config/gh/hosts.yml` is managed by `gh` CLI
and excluded from prettier (see `.prettierignore`).
- **Python**: Two scripts (`x-compare-versions.py`, - **Python**: Two scripts (`x-compare-versions.py`,
`x-git-largest-files.py`) linted by Ruff (config in `pyproject.toml`). `x-git-largest-files.py`) linted by Ruff (config in `pyproject.toml`).
@@ -149,9 +154,102 @@ SC2174 (mkdir -p -m), SC2016 (single-quote expressions).
- **Hooks** (`.claude/settings.json`): - **Hooks** (`.claude/settings.json`):
- *PreToolUse*: Blocks edits to `fzf-tmux`, `yarn.lock`, `.yarn/` - *PreToolUse*: Blocks edits to `fzf-tmux`, `yarn.lock`, `.yarn/`
- *PostToolUse*: Auto-runs `shfmt` on shell scripts after Edit/Write - *PostToolUse*: Auto-runs `shfmt` on shell scripts after Edit/Write
- *PostToolUse*: Auto-runs `fish_indent` on `.fish` files after Edit/Write
- *PostToolUse*: Auto-runs `stylua` on `.lua` files after Edit/Write
- **Skills** (`.claude/skills/`): - **Skills** (`.claude/skills/`):
- `shell-validate`: Auto-validates shell scripts (syntax + shellcheck) - `shell-validate`: Auto-validates shell scripts (syntax + shellcheck)
- `fish-validate`: Auto-validates fish scripts (syntax + fish_indent)
- `lua-format`: Auto-formats Lua files with stylua
- `yaml-validate`: Auto-validates YAML files (yamllint + actionlint)
- **Subagents** (`.claude/agents/`):
- `code-reviewer`: Reviews shell/fish/lua changes for correctness and style
- **MCP Servers**:
- `context7`: Live documentation lookup for tools and libraries
## 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.3.11/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,25 @@ 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
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 +378,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 +412,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 +421,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 +464,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 +477,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_NAME:-}" ]; 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

@@ -2,21 +2,21 @@
# Place in ~/.config/fish/completions/phpenv.fish # Place in ~/.config/fish/completions/phpenv.fish
# Complete main commands # Complete main commands
complete -c phpenv -f -n "__fish_use_subcommand" -a "install" -d "Install a PHP version" complete -c phpenv -f -n __fish_use_subcommand -a install -d "Install a PHP version"
complete -c phpenv -f -n "__fish_use_subcommand" -a "uninstall" -d "Uninstall a PHP version" complete -c phpenv -f -n __fish_use_subcommand -a uninstall -d "Uninstall a PHP version"
complete -c phpenv -f -n "__fish_use_subcommand" -a "use" -d "Use PHP version for current shell" complete -c phpenv -f -n __fish_use_subcommand -a use -d "Use PHP version for current shell"
complete -c phpenv -f -n "__fish_use_subcommand" -a "local" -d "Set PHP version for current project" complete -c phpenv -f -n __fish_use_subcommand -a local -d "Set PHP version for current project"
complete -c phpenv -f -n "__fish_use_subcommand" -a "global" -d "Set global PHP version" complete -c phpenv -f -n __fish_use_subcommand -a global -d "Set global PHP version"
complete -c phpenv -f -n "__fish_use_subcommand" -a "list" -d "List installed PHP versions" complete -c phpenv -f -n __fish_use_subcommand -a list -d "List installed PHP versions"
complete -c phpenv -f -n "__fish_use_subcommand" -a "ls" -d "List installed PHP versions" complete -c phpenv -f -n __fish_use_subcommand -a ls -d "List installed PHP versions"
complete -c phpenv -f -n "__fish_use_subcommand" -a "current" -d "Show current PHP version" complete -c phpenv -f -n __fish_use_subcommand -a current -d "Show current PHP version"
complete -c phpenv -f -n "__fish_use_subcommand" -a "which" -d "Show path to PHP binary" complete -c phpenv -f -n __fish_use_subcommand -a which -d "Show path to PHP binary"
complete -c phpenv -f -n "__fish_use_subcommand" -a "versions" -d "Show all available versions" complete -c phpenv -f -n __fish_use_subcommand -a versions -d "Show all available versions"
complete -c phpenv -f -n "__fish_use_subcommand" -a "doctor" -d "Check phpenv installation" complete -c phpenv -f -n __fish_use_subcommand -a doctor -d "Check phpenv installation"
complete -c phpenv -f -n "__fish_use_subcommand" -a "config" -d "Manage configuration" complete -c phpenv -f -n __fish_use_subcommand -a config -d "Manage configuration"
complete -c phpenv -f -n "__fish_use_subcommand" -a "extensions" -d "Manage PHP extensions" complete -c phpenv -f -n __fish_use_subcommand -a extensions -d "Manage PHP extensions"
complete -c phpenv -f -n "__fish_use_subcommand" -a "ext" -d "Manage PHP extensions" complete -c phpenv -f -n __fish_use_subcommand -a ext -d "Manage PHP extensions"
complete -c phpenv -f -n "__fish_use_subcommand" -a "help" -d "Show help" complete -c phpenv -f -n __fish_use_subcommand -a help -d "Show help"
# Helper functions for completions # Helper functions for completions
function __phpenv_complete_installed_versions function __phpenv_complete_installed_versions
@@ -26,13 +26,13 @@ end
function __phpenv_complete_available_versions function __phpenv_complete_available_versions
# Try to get dynamic versions first # Try to get dynamic versions first
if command -q curl -a command -q jq; and functions -q __phpenv_parse_version_field if command -q curl -a command -q jq; and functions -q __phpenv_parse_version_field
echo "latest" echo latest
echo "nightly" echo nightly
echo "5.x" echo "5.x"
echo "7.x" echo "7.x"
echo "8.x" echo "8.x"
__phpenv_parse_version_field "latest" "8.4" __phpenv_parse_version_field latest "8.4"
__phpenv_parse_version_field "nightly" "8.5" __phpenv_parse_version_field nightly "8.5"
__phpenv_parse_version_field "5.x" "5.6" __phpenv_parse_version_field "5.x" "5.6"
__phpenv_parse_version_field "7.x" "7.4" __phpenv_parse_version_field "7.x" "7.4"
__phpenv_parse_version_field "8.x" "8.4" __phpenv_parse_version_field "8.x" "8.4"
@@ -64,18 +64,18 @@ complete -c phpenv -f -n "__fish_seen_subcommand_from uninstall use local global
-a "(__phpenv_complete_installed_versions)" -d "Installed PHP version" -a "(__phpenv_complete_installed_versions)" -d "Installed PHP version"
# Add system option for use command # Add system option for use command
complete -c phpenv -f -n "__fish_seen_subcommand_from use" -a "system" -d "Use system PHP" complete -c phpenv -f -n "__fish_seen_subcommand_from use" -a system -d "Use system PHP"
# Complete binaries for which command # Complete binaries for which command
complete -c phpenv -f -n "__fish_seen_subcommand_from which" -a "(__phpenv_complete_binaries)" -d "PHP binary" complete -c phpenv -f -n "__fish_seen_subcommand_from which" -a "(__phpenv_complete_binaries)" -d "PHP binary"
# Complete config subcommands # Complete config subcommands
complete -c phpenv -f -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set list" \ complete -c phpenv -f -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set list" \
-a "get" -d "Get configuration value" -a get -d "Get configuration value"
complete -c phpenv -f -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set list" \ complete -c phpenv -f -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set list" \
-a "set" -d "Set configuration value" -a set -d "Set configuration value"
complete -c phpenv -f -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set list" \ complete -c phpenv -f -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set list" \
-a "list" -d "List all configuration" -a list -d "List all configuration"
# Complete config keys # Complete config keys
complete -c phpenv -f -n "__fish_seen_subcommand_from config; and __fish_seen_subcommand_from get set" \ complete -c phpenv -f -n "__fish_seen_subcommand_from config; and __fish_seen_subcommand_from get set" \
@@ -91,27 +91,27 @@ complete -c phpenv -f \
complete -c phpenv -f \ complete -c phpenv -f \
-n "__fish_seen_subcommand_from extensions ext" \ -n "__fish_seen_subcommand_from extensions ext" \
-n "not __fish_seen_subcommand_from install uninstall remove list ls available" \ -n "not __fish_seen_subcommand_from install uninstall remove list ls available" \
-a "install" -d "Install PHP extension" -a install -d "Install PHP extension"
complete -c phpenv -f \ complete -c phpenv -f \
-n "__fish_seen_subcommand_from extensions ext" \ -n "__fish_seen_subcommand_from extensions ext" \
-n "not __fish_seen_subcommand_from install uninstall remove list ls available" \ -n "not __fish_seen_subcommand_from install uninstall remove list ls available" \
-a "uninstall" -d "Uninstall PHP extension" -a uninstall -d "Uninstall PHP extension"
complete -c phpenv -f \ complete -c phpenv -f \
-n "__fish_seen_subcommand_from extensions ext" \ -n "__fish_seen_subcommand_from extensions ext" \
-n "not __fish_seen_subcommand_from install uninstall remove list ls available" \ -n "not __fish_seen_subcommand_from install uninstall remove list ls available" \
-a "remove" -d "Remove PHP extension" -a remove -d "Remove PHP extension"
complete -c phpenv -f \ complete -c phpenv -f \
-n "__fish_seen_subcommand_from extensions ext" \ -n "__fish_seen_subcommand_from extensions ext" \
-n "not __fish_seen_subcommand_from install uninstall remove list ls available" \ -n "not __fish_seen_subcommand_from install uninstall remove list ls available" \
-a "list" -d "List installed extensions" -a list -d "List installed extensions"
complete -c phpenv -f \ complete -c phpenv -f \
-n "__fish_seen_subcommand_from extensions ext" \ -n "__fish_seen_subcommand_from extensions ext" \
-n "not __fish_seen_subcommand_from install uninstall remove list ls available" \ -n "not __fish_seen_subcommand_from install uninstall remove list ls available" \
-a "ls" -d "List installed extensions" -a ls -d "List installed extensions"
complete -c phpenv -f \ complete -c phpenv -f \
-n "__fish_seen_subcommand_from extensions ext" \ -n "__fish_seen_subcommand_from extensions ext" \
-n "not __fish_seen_subcommand_from install uninstall remove list ls available" \ -n "not __fish_seen_subcommand_from install uninstall remove list ls available" \
-a "available" -d "Show available extensions" -a available -d "Show available extensions"
# Complete extension names # Complete extension names
complete -c phpenv -f \ complete -c phpenv -f \

View File

@@ -1,22 +0,0 @@
function ___paths_plugin_set_colors
if not set -q ___paths_plugin_colors
set -Ux ___paths_plugin_colors 27e6ff 29e0ff 5cd8ff 77d0ff 8ac8ff 9cbfff afb5ff c5a7ff d99bfe ea8feb f684d5 fe7abd ff73a3 ff708a fa7070 ff708a ff73a3 fe7abd f684d5 ea8feb d99bfe c5a7ff afb5ff 9cbfff 8ac8ff 77d0ff 5cd8ff 29e0ff
end
return 0
end
function _paths_uninstall --on-event paths_uninstall
for i in ___paths_plugin_wrap_color ___paths_plugin_output ___paths_plugin_handle_found_item ___paths_plugin_handle_source ___paths_plugin_cycle_color
functions -e $i
end
set -e ___paths_plugin_colors
set -e ___paths_plugin_current_color
end
function _paths_install --on-event _paths_install
___paths_plugin_set_colors
end
function _paths_update --on-event paths_update
___paths_plugin_set_colors
end

View File

@@ -23,7 +23,7 @@ if not set -q PHPENV_AUTO_SWITCH
end end
if not set -q PHPENV_DEFAULT_EXTENSIONS if not set -q PHPENV_DEFAULT_EXTENSIONS
set -g PHPENV_DEFAULT_EXTENSIONS "opcache" set -g PHPENV_DEFAULT_EXTENSIONS opcache
end end
# Initialize PATH on shell startup if global version is set (less aggressive) # Initialize PATH on shell startup if global version is set (less aggressive)

View File

@@ -2,6 +2,8 @@
# │ fish/config.fish # │ fish/config.fish
# ╰──────────────────────────────────────────────────────────╯ # ╰──────────────────────────────────────────────────────────╯
set -g fish_greeting
fish_config theme choose "Catppuccin Mocha" fish_config theme choose "Catppuccin Mocha"
test -e "$HOME/.config/fish/alias.fish" && test -e "$HOME/.config/fish/alias.fish" &&
@@ -20,19 +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 rbenv; and source (rbenv init -|psub) type -q mise; and mise activate fish | source
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
#open-tmux # defined in functions/open-tmux.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)
@@ -47,3 +47,8 @@ fish_add_path $HOME/.opencode/bin
# Added by OrbStack: command-line tools and integration # Added by OrbStack: command-line tools and integration
# This won't be added again if you remove it. # This won't be added again if you remove it.
source ~/.orbstack/shell/init2.fish 2>/dev/null || : source ~/.orbstack/shell/init2.fish 2>/dev/null || :
# Warn if GITHUB_TOKEN is not set
if status is-interactive; and not set -q GITHUB_TOKEN
echo "Warning: GITHUB_TOKEN is not set" >&2
end

View File

@@ -17,13 +17,11 @@ set -q HOSTNAME; or set -x HOSTNAME (hostname -s)
# Add local bin to path # Add local bin to path
fish_add_path "$XDG_BIN_HOME" fish_add_path "$XDG_BIN_HOME"
# Add cargo bin to path # Add mise shims to path
fish_add_path "$XDG_SHARE_HOME/cargo/bin" fish_add_path "$XDG_DATA_HOME/mise/shims"
# NPM/NVM configuration # Add cargo bin to path
set -q NVM_DIR; or set -x NVM_DIR "$XDG_DATA_HOME/nvm" fish_add_path "$XDG_DATA_HOME/cargo/bin"
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"
@@ -33,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"
@@ -55,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
@@ -84,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 \
@@ -101,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"
@@ -125,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_SHARE_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"
@@ -163,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

@@ -3,3 +3,4 @@ jethrokuan/z
ivuorinen/phpenv.fish ivuorinen/phpenv.fish
ilancosman/tide@v6 ilancosman/tide@v6
catppuccin/fish catppuccin/fish
edc/bass

View File

@@ -1,7 +1,7 @@
# Description: Open tmux session if not already open # Description: Open tmux session if not already open
# Dependencies: tmux # Dependencies: tmux
# Usage: open-tmux # Usage: .t
function open-tmux --wraps='tmux attach-session -t main || tmux new-session -s main' --description 'open tmux session' function .t --wraps='tmux attach-session -t main || tmux new-session -s main' --description 'open tmux session'
# Check if not in an SSH session and not already in a tmux session # Check if not in an SSH session and not already in a tmux session
if test -z "$SSH_TTY"; and not set -q TMUX if test -z "$SSH_TTY"; and not set -q TMUX
command tmux attach-session -t main || command tmux new-session -s main command tmux attach-session -t main || command tmux new-session -s main

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

@@ -1,175 +0,0 @@
function ___paths_plugin_wrap_color
set_color normal
set_color "$argv[1]"
echo -n (set_color "$argv[1]")"$argv[2..]"
set_color normal
end
# duplicated in conf.d
function ___paths_plugin_set_colors
if not set -q ___paths_plugin_colors
set -Ux ___paths_plugin_colors 27e6ff 29e0ff 5cd8ff 77d0ff 8ac8ff 9cbfff afb5ff c5a7ff d99bfe ea8feb f684d5 fe7abd ff73a3 ff708a fa7070 ff708a ff73a3 fe7abd f684d5 ea8feb d99bfe c5a7ff afb5ff 9cbfff 8ac8ff 77d0ff 5cd8ff 29e0ff
end
return 0
end
function ___paths_plugin_cycle_color
if not set -q ___paths_plugin_current_color
set -Ux ___paths_plugin_current_color 1
else if test $___paths_plugin_current_color -gt (count $___paths_plugin_colors)
set -Ux ___paths_plugin_current_color 1
end
echo $___paths_plugin_colors[$___paths_plugin_current_color]
set -Ux ___paths_plugin_current_color (math $___paths_plugin_current_color + 1)
end
function ___paths_plugin_handle_found_item -a testName outFlags
set -f flags (string split -n ' ' -- "$outFlags")
set -f options (fish_opt -s c -l clean)
set -a options (fish_opt -s s -l single)
set -a options (fish_opt -s k -l no-color)
set -a options (fish_opt -s n -l inline)
argparse $options -- $flags
set -f arrow "=>"
# check if file exists
if test -e "$testName"
set -f nameOut (string trim -- "$testName")
if not set -q _flag_c # is not clean
if test -L "$testName" # is symlink
set -f __linkname (readlink -f "$testName")
set __linkname (string trim -- "$__linkname")
set testName (string trim -- "$testName")
if not set -q _flag_k # is color
set nameOut (___paths_plugin_wrap_color (___paths_plugin_cycle_color) $testName) (___paths_plugin_wrap_color "yellow" "$arrow") (___paths_plugin_wrap_color (___paths_plugin_cycle_color) $__linkname)
else # is color
set nameOut (echo -n "$testName" "$arrow" "$__linkname")
end
else # is not symlink
if not set -q _flag_k # is color
set testName (string trim -- "$testName")
set nameOut (___paths_plugin_wrap_color (___paths_plugin_cycle_color) "$testName")
else
set testName (string trim -- "$testName")
set nameOut "$testName"
end
end
set nameOut (string trim -- "$nameOut")
# do the tick
if set -q _flag_k # is not color
set nameOut "- $nameOut"
else # is color
set nameOut (___paths_plugin_wrap_color "yellow" "-") "$nameOut"
end
end
set nameOut (string trim -- "$nameOut")
echo -n $nameOut
end
end
function paths --description "Reveal the executable matches in shell paths or fish autoload."
set -f options (fish_opt -s c -l clean)
set -a options (fish_opt -s s -l single)
set -a options (fish_opt -s k -l no-color)
set -a options (fish_opt -s q -l quiet)
set -a options (fish_opt -s n -l inline)
argparse $options -- $argv
if test (count $argv) -lt 1
echo "paths - executable matches in shell paths or fish autoload."
and echo "usage: paths [-c|-s|-k] <name>"
and echo -e "\t-c or --no-color: output without color"
and echo -e "\t-s or --single: output without color or headers, the first result"
and echo -e "\t-k or --clean: output without tick marks or headers"
# and echo -e "\t-n or --inline: output without endline"
and return 1
end
set -f foundStatus 1
set -f input (string trim -- $argv)
# deprecated
if set -q _flag_q
set _flag_c True
end
if set -q _flag_s
set _flag_k True
set _flag_c True
end
set -f outFlags ''
set -q _flag_n; and set -a outFlags -n
set -q _flag_c; and set -a outFlags -c
set -q _flag_k; and set -a outFlags -k
set -q _flag_s; and set -a outFlags -s
set outFlags (string split -n " " -- "$outFlags")
___paths_plugin_set_colors
# loop over list of path lists
for pVar in VIRTUAL_ENV fisher_path fish_function_path fish_user_paths PATH
set -e acc
set -f acc ''
set -e hit
# see if variable is empty
if test -z "$pVar"
continue
end
set -f acc (begin
for t in $$pVar
for snit in "$t/$input.fish" "$t/$input"
set -f found (___paths_plugin_handle_found_item "$snit" "$outFlags")
set found (string trim -- "$found")
if test -n "$found"
set -f hit True
echo "$found"
if set -q _flag_s
break
end
end
end
if set -q _flag_s
if set -q hit
break
end
end
end
end)
# prepend source
if not set -q _flag_c
if set -q hit
set pVar (string trim -- "$pVar")
echo -e -n "$pVar\n"
end
end
if test -n "$acc"
set foundStatus 0
for fk in $acc
echo $fk
if set -q _flag_s
# stop after one
return $foundStatus
end
end
end
end
# check
set -l built (type --type $input 12&>/dev/null)
if test -n "$built"
and test "$built" = builtin
set $foundStatus 0
if not set -q _flag_c
echo -e -n "builtin\n"
if set -q _flag_k
echo - "$input"
else # is color
echo (___paths_plugin_wrap_color "yellow" "-") (___paths_plugin_wrap_color (___paths_plugin_cycle_color) "$input")
end
else
echo "$input"
end
end
return $foundStatus
end

View File

@@ -103,7 +103,7 @@ end
function __phpenv_find_version_file -a phpenv_filename function __phpenv_find_version_file -a phpenv_filename
set -l phpenv_dir (pwd) set -l phpenv_dir (pwd)
while test "$phpenv_dir" != "/" while test "$phpenv_dir" != /
if test -f "$phpenv_dir/$phpenv_filename" if test -f "$phpenv_dir/$phpenv_filename"
echo "$phpenv_dir/$phpenv_filename" echo "$phpenv_dir/$phpenv_filename"
return return
@@ -130,13 +130,13 @@ function __phpenv_parse_composer_version
end end
set -l phpenv_platform_php (jq -r '.config.platform.php // empty' composer.json 2>/dev/null) set -l phpenv_platform_php (jq -r '.config.platform.php // empty' composer.json 2>/dev/null)
if test $status -eq 0 -a -n "$phpenv_platform_php" -a "$phpenv_platform_php" != "null" if test $status -eq 0 -a -n "$phpenv_platform_php" -a "$phpenv_platform_php" != null
echo $phpenv_platform_php echo $phpenv_platform_php
return return
end end
set -l phpenv_require_php (jq -r '.require.php // empty' composer.json 2>/dev/null) set -l phpenv_require_php (jq -r '.require.php // empty' composer.json 2>/dev/null)
if test $status -eq 0 -a -n "$phpenv_require_php" -a "$phpenv_require_php" != "null" if test $status -eq 0 -a -n "$phpenv_require_php" -a "$phpenv_require_php" != null
__phpenv_parse_semver_constraint $phpenv_require_php __phpenv_parse_semver_constraint $phpenv_require_php
return return
end end
@@ -196,7 +196,7 @@ set -g __phpenv_version_cache_time 0
function __phpenv_get_version_info function __phpenv_get_version_info
set -l current_time (date +%s) set -l current_time (date +%s)
set -l cache_duration 300 # 5 minutes set -l cache_duration 300 # 5 minutes
# Return cached version if still valid # Return cached version if still valid
if test -n "$__phpenv_version_cache" if test -n "$__phpenv_version_cache"
@@ -236,12 +236,12 @@ end
# Check if Ondřej PPA is configured on the system # Check if Ondřej PPA is configured on the system
function __phpenv_has_ondrej_ppa function __phpenv_has_ondrej_ppa
if test -d /etc/apt/sources.list.d if test -d /etc/apt/sources.list.d
if grep -rq "ondrej/php" /etc/apt/sources.list.d/ 2>/dev/null if grep -rq ondrej/php /etc/apt/sources.list.d/ 2>/dev/null
return 0 return 0
end end
end end
if test -f /etc/apt/sources.list if test -f /etc/apt/sources.list
if grep -q "ondrej/php" /etc/apt/sources.list 2>/dev/null if grep -q ondrej/php /etc/apt/sources.list 2>/dev/null
return 0 return 0
end end
end end
@@ -262,34 +262,34 @@ function __phpenv_get_provider
end end
# macOS always uses Homebrew # macOS always uses Homebrew
if test (uname -s) = "Darwin" if test (uname -s) = Darwin
echo "homebrew" echo homebrew
return 0 return 0
end end
# Linux: check for apt with Ondřej PPA first # Linux: check for apt with Ondřej PPA first
if test (uname -s) = "Linux" if test (uname -s) = Linux
if command -q apt-get; and __phpenv_has_ondrej_ppa if command -q apt-get; and __phpenv_has_ondrej_ppa
echo "apt" echo apt
return 0 return 0
end end
# Fall back to Homebrew (Linuxbrew) if available # Fall back to Homebrew (Linuxbrew) if available
if command -q brew if command -q brew
echo "homebrew" echo homebrew
return 0 return 0
end end
# If apt is available but no PPA yet, still use apt provider # If apt is available but no PPA yet, still use apt provider
# (it will prompt to add the PPA when needed) # (it will prompt to add the PPA when needed)
if command -q apt-get if command -q apt-get
echo "apt" echo apt
return 0 return 0
end end
end end
# Default fallback # Default fallback
echo "homebrew" echo homebrew
return 0 return 0
end end
@@ -319,7 +319,7 @@ function __phpenv_provider_homebrew_ensure_source
end end
# Check and add required taps only if missing # Check and add required taps only if missing
set -l required_taps "shivammathur/php" "shivammathur/extensions" set -l required_taps shivammathur/php shivammathur/extensions
for tap in $required_taps for tap in $required_taps
if not brew tap | grep -qx $tap 2>/dev/null if not brew tap | grep -qx $tap 2>/dev/null
if not brew tap $tap 2>/dev/null if not brew tap $tap 2>/dev/null
@@ -343,7 +343,7 @@ function __phpenv_provider_homebrew_list_installed
continue continue
end end
if test "$phpenv_basename" = "php" if test "$phpenv_basename" = php
set -l phpenv_latest (__phpenv_parse_version_field "latest" "8.4") set -l phpenv_latest (__phpenv_parse_version_field "latest" "8.4")
set -a phpenv_versions $phpenv_latest set -a phpenv_versions $phpenv_latest
else if echo $phpenv_basename | grep -qE '^php@[0-9]+\.[0-9]+$' else if echo $phpenv_basename | grep -qE '^php@[0-9]+\.[0-9]+$'
@@ -375,7 +375,7 @@ function __phpenv_provider_homebrew_list_available
continue continue
end end
if test "$phpenv_clean_name" = "php" if test "$phpenv_clean_name" = php
set -a phpenv_versions "$phpenv_latest_version (latest)" set -a phpenv_versions "$phpenv_latest_version (latest)"
else if echo $phpenv_clean_name | grep -qE '^php@[0-9]+\.[0-9]+$' else if echo $phpenv_clean_name | grep -qE '^php@[0-9]+\.[0-9]+$'
set -l phpenv_version (echo $phpenv_clean_name | sed 's/php@//') set -l phpenv_version (echo $phpenv_clean_name | sed 's/php@//')
@@ -502,7 +502,7 @@ function __phpenv_provider_homebrew_ext_list -a phpenv_version
for phpenv_ext_dir in $phpenv_cellar_path/*@$phpenv_version for phpenv_ext_dir in $phpenv_cellar_path/*@$phpenv_version
if test -d $phpenv_ext_dir if test -d $phpenv_ext_dir
set -l phpenv_ext_name (basename $phpenv_ext_dir | sed "s/@$phpenv_version//") set -l phpenv_ext_name (basename $phpenv_ext_dir | sed "s/@$phpenv_version//")
if test "$phpenv_ext_name" != "php" if test "$phpenv_ext_name" != php
echo $phpenv_ext_name echo $phpenv_ext_name
end end
end end
@@ -574,7 +574,7 @@ function __phpenv_provider_apt_ensure_source
echo "" echo ""
read -P "Add ppa:ondrej/php? [y/N] " -l confirm read -P "Add ppa:ondrej/php? [y/N] " -l confirm
if test "$confirm" = "y" -o "$confirm" = "Y" if test "$confirm" = y -o "$confirm" = Y
echo "Adding ppa:ondrej/php..." echo "Adding ppa:ondrej/php..."
if command -q add-apt-repository if command -q add-apt-repository
if sudo add-apt-repository -y ppa:ondrej/php if sudo add-apt-repository -y ppa:ondrej/php
@@ -603,8 +603,7 @@ function __phpenv_provider_apt_list_installed
return 1 return 1
end end
dpkg -l 'php[0-9]*-cli' 2>/dev/null | grep '^ii' | \ dpkg -l 'php[0-9]*-cli' 2>/dev/null | grep '^ii' | sed -E 's/^ii\s+php([0-9]+\.[0-9]+)-cli.*/\1/' | sort -V | uniq
sed -E 's/^ii\s+php([0-9]+\.[0-9]+)-cli.*/\1/' | sort -V | uniq
end end
function __phpenv_provider_apt_list_available function __phpenv_provider_apt_list_available
@@ -613,8 +612,7 @@ function __phpenv_provider_apt_list_available
return return
end end
apt-cache search '^php[0-9]+\.[0-9]+-cli$' 2>/dev/null | \ apt-cache search '^php[0-9]+\.[0-9]+-cli$' 2>/dev/null | sed -E 's/^php([0-9]+\.[0-9]+)-cli.*/\1/' | sort -V | uniq
sed -E 's/^php([0-9]+\.[0-9]+)-cli.*/\1/' | sort -V | uniq
end end
function __phpenv_provider_apt_get_php_path -a phpenv_version function __phpenv_provider_apt_get_php_path -a phpenv_version
@@ -644,7 +642,7 @@ function __phpenv_provider_apt_get_php_path -a phpenv_version
set -l temp_link "$target.$fish_pid" set -l temp_link "$target.$fish_pid"
ln -s "$source" "$temp_link" 2>/dev/null ln -s "$source" "$temp_link" 2>/dev/null
and mv -f "$temp_link" "$target" 2>/dev/null and mv -f "$temp_link" "$target" 2>/dev/null
else if test "$binary" = "phar"; and test -x "/usr/bin/phar$phpenv_version" else if test "$binary" = phar; and test -x "/usr/bin/phar$phpenv_version"
set -l temp_link "$target.$fish_pid" set -l temp_link "$target.$fish_pid"
ln -s "/usr/bin/phar$phpenv_version" "$temp_link" 2>/dev/null ln -s "/usr/bin/phar$phpenv_version" "$temp_link" 2>/dev/null
and mv -f "$temp_link" "$target" 2>/dev/null and mv -f "$temp_link" "$target" 2>/dev/null
@@ -819,8 +817,7 @@ function __phpenv_provider_apt_ext_list -a phpenv_version
# Filter out core packages (cli, common, etc.) # Filter out core packages (cli, common, etc.)
set -l core_packages cli common opcache fpm cgi phpdbg set -l core_packages cli common opcache fpm cgi phpdbg
dpkg -l "php$phpenv_version-*" 2>/dev/null | grep '^ii' | awk '{print $2}' | \ dpkg -l "php$phpenv_version-*" 2>/dev/null | grep '^ii' | awk '{print $2}' | sed "s/php$phpenv_version-//" | while read ext
sed "s/php$phpenv_version-//" | while read ext
# Skip core packages # Skip core packages
set -l is_core 0 set -l is_core 0
for core in $core_packages for core in $core_packages
@@ -837,9 +834,7 @@ end
function __phpenv_provider_apt_ext_available -a phpenv_version function __phpenv_provider_apt_ext_available -a phpenv_version
# List available extensions from apt cache # List available extensions from apt cache
apt-cache search "^php$phpenv_version-" 2>/dev/null | \ apt-cache search "^php$phpenv_version-" 2>/dev/null | sed "s/php$phpenv_version-//" | awk '{print $1}' | grep -v -E '^(cli|common|fpm|cgi|phpdbg|dev)$' | sort | uniq
sed "s/php$phpenv_version-//" | awk '{print $1}' | \
grep -v -E '^(cli|common|fpm|cgi|phpdbg|dev)$' | sort | uniq
end end
function __phpenv_provider_apt_get_path_pattern function __phpenv_provider_apt_get_path_pattern
@@ -979,9 +974,9 @@ end
function __phpenv_resolve_version_alias -a phpenv_version function __phpenv_resolve_version_alias -a phpenv_version
switch $phpenv_version switch $phpenv_version
case latest case latest
__phpenv_parse_version_field "latest" "8.4" __phpenv_parse_version_field latest "8.4"
case nightly case nightly
__phpenv_parse_version_field "nightly" "8.5" __phpenv_parse_version_field nightly "8.5"
case '8.x' case '8.x'
__phpenv_parse_version_field "8.x" "8.4" __phpenv_parse_version_field "8.x" "8.4"
case '7.x' case '7.x'
@@ -997,7 +992,7 @@ function __phpenv_get_formula_name -a phpenv_version
set -l phpenv_latest_version (__phpenv_parse_version_field "latest" "8.4") set -l phpenv_latest_version (__phpenv_parse_version_field "latest" "8.4")
if test "$phpenv_version" = "$phpenv_latest_version" if test "$phpenv_version" = "$phpenv_latest_version"
echo "shivammathur/php/php" echo shivammathur/php/php
else else
echo "shivammathur/php/php@$phpenv_version" echo "shivammathur/php/php@$phpenv_version"
end end
@@ -1140,7 +1135,7 @@ function __phpenv_use
set -l phpenv_version $argv[1] set -l phpenv_version $argv[1]
# Handle special case: restore system PHP # Handle special case: restore system PHP
if test "$phpenv_version" = "system" if test "$phpenv_version" = system
__phpenv_restore_system_path __phpenv_restore_system_path
echo "Restored system PHP" echo "Restored system PHP"
return 0 return 0
@@ -1157,7 +1152,7 @@ function __phpenv_use
end end
if not __phpenv_is_version_installed $phpenv_version if not __phpenv_is_version_installed $phpenv_version
if test "$(__phpenv_config_get auto-install)" = "true" if test "$(__phpenv_config_get auto-install)" = true
__phpenv_install $phpenv_version __phpenv_install $phpenv_version
else else
echo "PHP $phpenv_version is not installed. Install with: phpenv install $phpenv_version" echo "PHP $phpenv_version is not installed. Install with: phpenv install $phpenv_version"
@@ -1179,7 +1174,7 @@ function __phpenv_local -a phpenv_version
return 1 return 1
end end
echo $phpenv_version > .php-version echo $phpenv_version >.php-version
echo "Set local PHP version to $phpenv_version" echo "Set local PHP version to $phpenv_version"
end end
@@ -1272,7 +1267,7 @@ function __phpenv_get_tap_versions
continue continue
end end
if test "$phpenv_clean_name" = "php" if test "$phpenv_clean_name" = php
set -a phpenv_versions "$phpenv_latest_version (latest)" set -a phpenv_versions "$phpenv_latest_version (latest)"
else if echo $phpenv_clean_name | grep -qE '^php@[0-9]+\.[0-9]+$' else if echo $phpenv_clean_name | grep -qE '^php@[0-9]+\.[0-9]+$'
set -l phpenv_version (echo $phpenv_clean_name | sed 's/php@//') set -l phpenv_version (echo $phpenv_clean_name | sed 's/php@//')
@@ -1310,7 +1305,7 @@ function __phpenv_doctor
# Show provider information # Show provider information
set -l provider (__phpenv_get_provider) set -l provider (__phpenv_get_provider)
set -l provider_source "auto-detected" set -l provider_source auto-detected
if set -q PHPENV_PROVIDER; and test -n "$PHPENV_PROVIDER" if set -q PHPENV_PROVIDER; and test -n "$PHPENV_PROVIDER"
set provider_source "PHPENV_PROVIDER override" set provider_source "PHPENV_PROVIDER override"
end end
@@ -1429,7 +1424,7 @@ function __phpenv_config_get -a phpenv_key
end end
end end
if test "$argv[2]" = "--verbose" if test "$argv[2]" = --verbose
if test -n "$phpenv_value" if test -n "$phpenv_value"
echo "$phpenv_key = $phpenv_value (from $phpenv_source)" echo "$phpenv_key = $phpenv_value (from $phpenv_source)"
else else
@@ -1581,19 +1576,18 @@ function __phpenv_get_tap_formulas -a tap_name
return 1 return 1
end end
brew tap-info $tap_name --json 2>/dev/null | \ brew tap-info $tap_name --json 2>/dev/null | jq -r '.[]|(.formula_names[]?)' 2>/dev/null
jq -r '.[]|(.formula_names[]?)' 2>/dev/null
end end
function __phpenv_get_available_extensions function __phpenv_get_available_extensions
__phpenv_get_tap_formulas "shivammathur/extensions" __phpenv_get_tap_formulas shivammathur/extensions
end end
function __phpenv_extension_available -a phpenv_extension phpenv_version function __phpenv_extension_available -a phpenv_extension phpenv_version
set -l phpenv_available_extensions (__phpenv_get_available_extensions) set -l phpenv_available_extensions (__phpenv_get_available_extensions)
if test -z "$phpenv_available_extensions" if test -z "$phpenv_available_extensions"
return 0 # Assume available if can't check return 0 # Assume available if can't check
end end
for phpenv_ext_formula in $phpenv_available_extensions for phpenv_ext_formula in $phpenv_available_extensions
@@ -1695,7 +1689,7 @@ function __phpenv_auto_switch --on-variable PWD
end end
set -l phpenv_auto_switch (__phpenv_config_get auto-switch) set -l phpenv_auto_switch (__phpenv_config_get auto-switch)
if test "$phpenv_auto_switch" = "false" if test "$phpenv_auto_switch" = false
return 0 return 0
end end
@@ -1718,7 +1712,7 @@ function __phpenv_auto_switch --on-variable PWD
set -g PHPENV_LAST_SWITCH_TIME $phpenv_current_time set -g PHPENV_LAST_SWITCH_TIME $phpenv_current_time
else else
set -l phpenv_auto_install (__phpenv_config_get auto-install) set -l phpenv_auto_install (__phpenv_config_get auto-install)
if test "$phpenv_auto_install" = "true" if test "$phpenv_auto_install" = true
echo "Auto-installing PHP $phpenv_new_version..." echo "Auto-installing PHP $phpenv_new_version..."
if phpenv install "$phpenv_new_version" if phpenv install "$phpenv_new_version"
set -g PHPENV_LAST_SWITCH_TIME $phpenv_current_time set -g PHPENV_LAST_SWITCH_TIME $phpenv_current_time
@@ -1771,7 +1765,7 @@ function __phpenv_help
end end
function __phpenv_validate_boolean -a phpenv_value function __phpenv_validate_boolean -a phpenv_value
test "$phpenv_value" = "true" -o "$phpenv_value" = "false" test "$phpenv_value" = true -o "$phpenv_value" = false
end end
function __phpenv_validate_version -a phpenv_version function __phpenv_validate_version -a phpenv_version

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,6 +1,5 @@
---
github.com: github.com:
git_protocol: https git_protocol: ssh
users: users:
ivuorinen: ivuorinen:
user: ivuorinen user: ivuorinen

View File

@@ -7,6 +7,7 @@
*-secret *-secret
__secret __secret
__ignored __ignored
__ignored/*
__test_*.php __test_*.php
__test_*.txt __test_*.txt
__test.php __test.php

View File

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

View File

@@ -19,8 +19,8 @@
logs = log --graph --pretty=format:'%C(magenta)%h%Creset -%C(red)%d%Creset %s %C(dim green)(%cr) %C(cyan)<%an>%Creset' --abbrev-commit logs = log --graph --pretty=format:'%C(magenta)%h%Creset -%C(red)%d%Creset %s %C(dim green)(%cr) %C(cyan)<%an>%Creset' --abbrev-commit
nah = !git reset --hard && git clean -df nah = !git reset --hard && git clean -df
recent = "!r() { count=$1; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -ts'|';}; r" recent = "!r() { count=$1; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -ts'|';}; r"
reset-origin = !git fetch origin && git reset --hard origin/master && git clean -f -d reset-origin = !git fetch origin && git reset --hard origin/HEAD && git clean -f -d
reset-upstream = !git fetch upstream && git reset --hard upstream/master && git clean -f -d reset-upstream = !git fetch upstream && git reset --hard upstream/HEAD && git clean -f -d
rl = reflog --format='%C(auto)%h %<|(20)%gd %C(blue)%cr%C(reset) %gs (%s)' rl = reflog --format='%C(auto)%h %<|(20)%gd %C(blue)%cr%C(reset) %gs (%s)'
tagdate = log --date-order --graph --tags --simplify-by-decoration --pretty=format:\"%ai %h %d\" tagdate = log --date-order --graph --tags --simplify-by-decoration --pretty=format:\"%ai %h %d\"
undo = reset --soft HEAD^ undo = reset --soft HEAD^

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

@@ -2,7 +2,7 @@
-- │ ivuorinen's Neovim configuration │ -- │ ivuorinen's Neovim configuration │
-- ╰─────────────────────────────────────────────────────────╯ -- ╰─────────────────────────────────────────────────────────╯
-- ── Install lazylazy ──────────────────────────────────────────────── -- ── Install lazy ────────────────────────────────────────────────────
-- https://github.com/folke/lazy.nvim -- https://github.com/folke/lazy.nvim
local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim'
if not (vim.uv or vim.loop).fs_stat(lazypath) then if not (vim.uv or vim.loop).fs_stat(lazypath) then
@@ -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'
@@ -53,7 +57,7 @@ require('lazy').setup(
path = '~/Code/nvim', -- Load wip plugins from this path path = '~/Code/nvim', -- Load wip plugins from this path
}, },
install = { install = {
colorscheme = { vim.g.colors_theme }, colorscheme = { 'catppuccin' },
}, },
profiling = { profiling = {
loader = true, loader = true,
@@ -61,8 +65,6 @@ require('lazy').setup(
} }
) )
-- require('nvm-default').setup()
require 'keymaps' require 'keymaps'
-- vim: set ts=2 sts=2 sw=2 wrap et : -- vim: set ts=2 sts=2 sw=2 wrap et :

View File

@@ -28,7 +28,6 @@ K.d('<C-k>', { 'n', 'v' }, ":m '<-2<CR>gv=gv", 'Move Block Up')
K.d('<C-j>', { 'n', 'v' }, ":m '>+1<CR>gv=gv", 'Move Block Down') K.d('<C-j>', { 'n', 'v' }, ":m '>+1<CR>gv=gv", 'Move Block Down')
-- ── Other operations ──────────────────────────────────────────────── -- ── Other operations ────────────────────────────────────────────────
K.nl('o', function() require('snacks').gitbrowse() end, 'Open repo in browser')
K.n('<C-s>', ':w!<cr>', { desc = 'Save', noremap = true }) K.n('<C-s>', ':w!<cr>', { desc = 'Save', noremap = true })
K.n('<esc><esc>', ':nohlsearch<cr>', { desc = 'Clear Search Highlighting' }) K.n('<esc><esc>', ':nohlsearch<cr>', { desc = 'Clear Search Highlighting' })
@@ -59,7 +58,6 @@ K.ld('cci', 'n', function() b().lsp_incoming_calls() end, 'Incoming calls')
K.ld('cco', 'n', function() b().lsp_outgoing_calls() end, 'Outgoing calls') K.ld('cco', 'n', function() b().lsp_outgoing_calls() end, 'Outgoing calls')
K.ld('cd', 'n', function() b().lsp_definitions() end, 'Definitions') K.ld('cd', 'n', function() b().lsp_definitions() end, 'Definitions')
K.ld('cf', { 'n', 'x' }, ':lua vim.lsp.buf.format()<CR>', 'Format') K.ld('cf', { 'n', 'x' }, ':lua vim.lsp.buf.format()<CR>', 'Format')
K.ld('cg', 'n', ':lua require("neogen").generate()<CR>', 'Generate annotations')
K.ld('ci', 'n', function() b().lsp_implementations() end, 'Implementations') K.ld('ci', 'n', function() b().lsp_implementations() end, 'Implementations')
K.ld('cp', 'n', function() b().lsp_type_definitions() end, 'Type Definition') K.ld('cp', 'n', function() b().lsp_type_definitions() end, 'Type Definition')
K.ld('cr', 'n', vim.lsp.buf.rename, 'Rename') K.ld('cr', 'n', vim.lsp.buf.rename, 'Rename')

View File

@@ -1,120 +0,0 @@
-- Get nvm default version and use it in node_host_prog
-- and g.copilot_node_command.
--
-- This module automatically configures Neovim to use the default Node.js version
-- from NVM. It requires a working NVM installation and 'default' alias to be set,
-- and also neovim npm package to be installed.
--
-- You can install the neovim package by running:
-- npm i --global neovim
--
-- Usage:
-- require('nvm-default').setup({
-- add_to_path = true, -- optional: add NVM bin directory to PATH
-- nvm_path = "~/.nvm", -- optional: custom NVM installation path
-- notify_level = "info" -- optional: notification level
-- })
local M = {}
M.name = 'nvm-default.nvim'
M.version = '0.1.0' -- x-release-please-version
-- Helper function to run a shell command
---@param cmd string Run a shell command
---@return string? Return the result of the command
local function run_command(cmd)
local result = vim.fn.system(cmd)
return vim.v.shell_error == 0 and result:gsub('%s+$', '') or nil
end
-- Helper function to show a notification
---@param msg string Show a message
---@param level "info"|"warn"|"error"|"trace" Notification level
local function n(msg, level)
if msg == nil then msg = M.name .. ': No message provided' end
if level == nil then level = 'trace' end
local log_level = vim.log.levels.INFO
if level == 'info' then
log_level = vim.log.levels.INFO
elseif level == 'warn' then
log_level = vim.log.levels.WARN
elseif level == 'error' then
log_level = vim.log.levels.ERROR
elseif level == 'trace' then
log_level = vim.log.levels.TRACE
end
vim.notify(M.name .. ': ' .. msg, log_level)
end
---@class NvmDefaultOptions
---@field add_to_path boolean Add found NVM bin directory to PATH
---@field nvm_path string Where nvm installation is located
---@field notify_level number|"info"|"warn"|"error"|"trace" Notification level filter
-- Default options
---@type NvmDefaultOptions
M.defaults = {
add_to_path = vim.g.nvm_default_add_to_path or true,
nvm_path = vim.fn.expand(os.getenv 'NVM_DIR' or '~/.nvm'),
notify_level = vim.g.nvm_default_notify_level or 'info',
}
-- Fetch the NVM default version or fallback to node version
---@param opts? NvmDefaultOptions Plugin options
function M.setup(opts)
local options = vim.tbl_deep_extend('force', M.defaults, opts or {})
local nvm_path = options.nvm_path
local node_version = run_command(
string.format('. %s/nvm.sh && nvm version default', nvm_path)
) or run_command(string.format('. %s/nvm.sh && nvm version node', nvm_path)) or nil
if node_version and node_version:match '^v' then
-- Set vim.g.node_host_prog and vim.g.copilot_node_command
local current_nvm_version_path =
string.format('%s/versions/node/%s', nvm_path, node_version)
local current_nvm_node_bin_path = string.format('%s/bin', current_nvm_version_path)
local current_nvm_node_bin = string.format('%s/node', current_nvm_node_bin_path)
local neovim_node_host_bin_path =
string.format('%s/neovim-node-host', current_nvm_node_bin_path)
-- Collect missing files and directories errors for error output
local missing = {}
-- If node_dir isn't there, stop and show error
if not vim.fn.isdirectory(current_nvm_version_path) then
table.insert(missing, 'Node.js directory: ' .. current_nvm_version_path)
end
-- If node_bin isn't there, stop and show error
if not vim.fn.filereadable(current_nvm_node_bin) then
table.insert(missing, 'Node.js binary: ' .. current_nvm_node_bin)
end
if not vim.fn.filereadable(neovim_node_host_bin_path) then
table.insert(missing, 'Neovim host binary: ' .. neovim_node_host_bin_path)
end
if #missing > 0 then
n('Missing required files:\n- ' .. table.concat(missing, '\n- '), 'error')
return
end
-- Add to PATH if requested. Can be turned off by setting if it messes with
-- other tools.
if options.add_to_path then
vim.env.PATH = current_nvm_node_bin_path .. ':' .. vim.env.PATH
end
vim.g.node_host_prog = neovim_node_host_bin_path
vim.g.copilot_node_command = current_nvm_node_bin
else
n('Unable to determine the Node.js version from nvm.', 'error')
end
end
return M

View File

@@ -13,10 +13,6 @@ local a = vim.api -- A table to store API functions
g.mapleader = ' ' -- Space as the leader key g.mapleader = ' ' -- Space as the leader key
g.maplocalleader = ' ' -- Space as the local leader key g.maplocalleader = ' ' -- Space as the local leader key
-- g.colors_theme = 'onedark' -- Set the colorscheme
-- g.colors_variant_light = 'tokyonight-day' -- Set the light variant
-- g.colors_variant_dark = 'tokyonight-storm' -- Set the dark variant
g.editorconfig = true -- Make sure editorconfig support is enabled g.editorconfig = true -- Make sure editorconfig support is enabled
g.loaded_perl_provider = 0 -- Disable perl provider g.loaded_perl_provider = 0 -- Disable perl provider
g.loaded_ruby_provider = 0 -- Disable ruby provider g.loaded_ruby_provider = 0 -- Disable ruby provider

View File

@@ -1,6 +1,6 @@
return { return {
-- Performant, batteries-included completion plugin for Neovim -- Performant, batteries-included completion plugin for Neovim
-- https:/github.com/saghen/blink.cmp -- https://github.com/saghen/blink.cmp
{ {
'saghen/blink.cmp', 'saghen/blink.cmp',
version = '*', version = '*',

View File

@@ -24,7 +24,14 @@ return {
-- https://github.com/fatih/vim-go -- https://github.com/fatih/vim-go
{ {
'fatih/vim-go', 'fatih/vim-go',
config = function() end, ft = 'go',
config = function()
vim.g.go_def_mode = 'gopls'
vim.g.go_info_mode = 'gopls'
vim.g.go_fmt_autosave = 0
vim.g.go_imports_autosave = 0
vim.g.go_mod_fmt_autosave = 0
end,
}, },
-- Clarify and beautify your comments using boxes and lines. -- Clarify and beautify your comments using boxes and lines.

View File

@@ -223,7 +223,7 @@ return {
vim.env.VIMRUNTIME, vim.env.VIMRUNTIME,
} }
client.config.settings.Lua.runtime = { version = 'LuaJIT' } client.config.settings.Lua.runtime = { version = 'LuaJIT' }
client.notify( client:notify(
'workspace/didChangeConfiguration', 'workspace/didChangeConfiguration',
{ settings = client.config.settings } { settings = client.config.settings }
) )

View File

@@ -89,15 +89,12 @@ return {
'f-person/auto-dark-mode.nvim', 'f-person/auto-dark-mode.nvim',
opts = { opts = {
update_interval = 1000, update_interval = 1000,
-- stylua: ignore
set_dark_mode = function() set_dark_mode = function()
vim.api.nvim_set_option_value('background', 'dark', {}) vim.api.nvim_set_option_value('background', 'dark', {})
-- vim.cmd.colorscheme(vim.g.colors_variant_dark)
-- vim.cmd 'colorscheme rose-pine'
end, end,
set_light_mode = function() set_light_mode = function()
vim.api.nvim_set_option_value('background', 'light', {}) vim.api.nvim_set_option_value('background', 'light', {})
-- vim.cmd.colorscheme(vim.g.colors_variant_light)
-- vim.cmd 'colorscheme rose-pine-dawn'
end, end,
}, },
}, },

View File

@@ -100,5 +100,6 @@ function GetIntelephenseLicense()
local f = assert(io.open(p, 'rb')) local f = assert(io.open(p, 'rb'))
local content = f:read '*a' local content = f:read '*a'
f:close() f:close()
return string.gsub(content, '%s+', '')[1] or nil local stripped = string.gsub(content, '%s+', '')
return stripped == '' and nil or stripped
end end

View File

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

View File

@@ -8,8 +8,11 @@
# #
# Smart session manager for the terminal # Smart session manager for the terminal
# https://github.com/joshmedeski/sesh # https://github.com/joshmedeski/sesh
#:schema https://github.com/joshmedeski/sesh/raw/main/sesh.schema.json
strict_mode = false strict_mode = false
dir_length = 2 # Uses last 2 directories: "projects/sesh" instead of just "sesh"
cache = true
# [marker] # [marker]
# inactivity_threshold = 10 # Seconds before alerts start # inactivity_threshold = 10 # Seconds before alerts start
@@ -52,3 +55,7 @@ disable_startup_command = true
name = "Downloads" name = "Downloads"
path = "~/Downloads" path = "~/Downloads"
startup_command = "lsa" startup_command = "lsa"
[[session]]
name = "Code/ivuorinen"
path = "~/Code/ivuorinen/"

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

@@ -10,7 +10,7 @@ config.color_scheme_dirs = {
} }
-- Font and font size -- Font and font size
config.font_size = 16 config.font_size = 12
config.font = wezterm.font_with_fallback { config.font = wezterm.font_with_fallback {
{ {
family = 'Monaspace Argon NF', family = 'Monaspace Argon NF',
@@ -48,9 +48,9 @@ config.window_background_opacity = 0.97
config.window_decorations = 'RESIZE' config.window_decorations = 'RESIZE'
config.macos_window_background_blur = 10 config.macos_window_background_blur = 10
config.window_padding = { config.window_padding = {
left = 5, left = 10,
right = 5, right = 10,
top = 5, top = 10,
bottom = 5, bottom = 5,
} }

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,19 @@ 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)" "shellspec:Install shellspec testing framework"
"python-packages:Install Python packages via uv"
"xcode-cli-tools:Install Xcode CLI tools (macOS)" "xcode-cli-tools:Install Xcode CLI tools (macOS)"
"z:Install z" "z:Install z"
) )
@@ -106,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
@@ -121,6 +116,7 @@ section_install()
$0 install ntfy $0 install ntfy
# Tier 4: Independent utilities # Tier 4: Independent utilities
$0 install shellspec
$0 install z $0 install z
msgr msg "Reloading configurations again..." msgr msg "Reloading configurations again..."
@@ -129,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
@@ -161,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" \
@@ -180,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 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)
@@ -233,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)
@@ -245,6 +226,12 @@ section_install()
&& msgr yay "Xcode CLI tools installed!" && msgr yay "Xcode CLI tools installed!"
;; ;;
shellspec)
msgr run "Installing shellspec..."
bash "$DOTFILES/scripts/install-shellspec.sh" \
&& msgr yay "shellspec has been installed!"
;;
z) z)
msgr run "Installing z..." msgr run "Installing z..."
bash "$DOTFILES/scripts/install-z.sh" \ bash "$DOTFILES/scripts/install-z.sh" \
@@ -281,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)
@@ -541,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)
@@ -557,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!"
;; ;;
@@ -585,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[@]}" ;;

103
local/bin/x-visit-folders Executable file
View File

@@ -0,0 +1,103 @@
#!/usr/bin/env bash
#
# Register level-1 subdirectories with zoxide so they appear
# in `z` completions.
# Usage: x-visit-folders [options] [directory]
#
# Example: x-visit-folders ~/Code/ivuorinen
#
# Copyright (c) 2026 Ismo Vuorinen. All Rights Reserved.
# Licensed under the MIT license.
#
# @description Register level-1 subdirectories with zoxide
set -euo pipefail
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
DRY_RUN=0
# Function to print usage information
usage()
{
echo "Usage: $0 [options] [directory]"
echo ""
echo "Options:"
echo " -h, --help Show this help message"
echo " -v, --verbose Print each directory as it is visited"
echo " -n, --dry-run List directories without adding them"
local code="${1:-1}"
exit "$code"
}
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
}
# Function to print error messages and exit
# $1 - error message (string)
msg_err()
{
echo "(!) ERROR: $1" >&2
exit 1
}
# Function to register a directory with zoxide
# $1 - directory path (string)
visit_dir()
{
if zoxide add "$1" 2> /dev/null; then
msg "Added: $1"
else
msg "zoxide add failed for: $1"
fi
}
# Main function
main()
{
while [[ $# -gt 0 ]]; do
case "$1" in
-h | --help) usage 0 ;;
-v | --verbose) VERBOSE=1 ;;
-n | --dry-run) DRY_RUN=1 ;;
-*)
msg_err "Unknown option: $1"
;;
*)
break
;;
esac
shift
done
local target="${1:-.}"
if [[ ! -d "$target" ]]; then
msg_err "Not a directory: $target"
fi
target="$(cd "$target" && pwd)"
local count=0
for dir in "$target"/*/; do
[[ -d "$dir" ]] || continue
local name
name="$(basename "$dir")"
[[ "$name" == .* ]] && continue
if [[ "$DRY_RUN" -eq 1 ]]; then
echo "(dry-run) $dir"
else
visit_dir "$dir"
fi
count=$((count + 1))
done
echo "Visited $count directories."
}
main "$@"

View File

@@ -0,0 +1,23 @@
# x-visit-folders
Register level-1 subdirectories with zoxide so they appear in
`z` completions.
## Usage
```bash
x-visit-folders [options] [directory]
```
- `directory` target directory (defaults to current directory)
- `-n`, `--dry-run` list directories without adding them
- `-v`, `--verbose` print each directory as it is visited
- `-h`, `--help` show usage information
## Example
```bash
x-visit-folders ~/Code/ivuorinen
```
<!-- vim: set ft=markdown spell spelllang=en_us cc=80 : -->

View File

@@ -34,13 +34,16 @@
}, },
"homepage": "https://github.com/ivuorinen/dotfiles#readme", "homepage": "https://github.com/ivuorinen/dotfiles#readme",
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.3.1", "@biomejs/biome": "^2.4.4",
"@types/node": "^24.0.1", "@types/node": "^25.3.2",
"bats": "^1.12.0", "bats": "^1.13.0",
"editorconfig-checker": "^6.1.0", "editorconfig-checker": "^6.1.1",
"markdown-table-formatter": "^1.7.0", "markdown-table-formatter": "^1.7.0",
"prettier": "^3.8.1", "prettier": "^3.8.1",
"typescript": "^5.8.3" "typescript": "^5.9.3"
},
"resolutions": {
"minimatch": "^10.2.4"
}, },
"packageManager": "yarn@4.12.0" "packageManager": "yarn@4.12.0"
} }

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,139 @@
#!/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
}
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
}
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 -euo 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,9 @@ 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[*]} # shellcheck disable=SC2086
msgr run_done "Done" ./install.sh -q -s ${fonts[*]} \
&& 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"
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

@@ -0,0 +1,16 @@
# install-shellspec
Installs [shellspec](https://github.com/shellspec/shellspec), a BDD-style
testing framework for shell scripts.
## Usage
```bash
scripts/install-shellspec.sh
```
The script resolves the latest release tag via `x-gh-get-latest-version`,
clones shellspec to `~/.cache/shellspec` pinned to that tag, and runs
`make install PREFIX=$HOME/.local`, placing the binary in `~/.local/bin/`.
Re-running the script fetches and checks out the newest release tag
before reinstalling.

37
scripts/install-shellspec.sh Executable file
View File

@@ -0,0 +1,37 @@
#!/usr/bin/env bash
set -euo pipefail
# @description Install shellspec testing framework
#
# shellcheck source=shared.sh
source "${DOTFILES}/config/shared.sh"
SHELLSPEC_REPO="https://github.com/shellspec/shellspec.git"
SHELLSPEC_CACHE="$HOME/.cache/shellspec"
install_shellspec()
{
local version
version=$(x-gh-get-latest-version shellspec/shellspec)
msgr ok "Latest shellspec version: $version"
if [[ -d "$SHELLSPEC_CACHE" ]]; then
msgr ok "shellspec repo already cloned, fetching $version..."
git -C "$SHELLSPEC_CACHE" fetch --depth=1 origin "refs/tags/$version"
git -C "$SHELLSPEC_CACHE" checkout "$version"
else
git clone --branch "$version" --depth=1 "$SHELLSPEC_REPO" "$SHELLSPEC_CACHE"
fi
msgr run "Running make install..."
make -C "$SHELLSPEC_CACHE" install PREFIX="$HOME/.local" \
&& msgr run_done "shellspec $version installed to $HOME/.local/bin/shellspec"
return 0
}
main()
{
install_shellspec
return 0
}
main "$@"

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

184
yarn.lock
View File

@@ -5,18 +5,18 @@ __metadata:
version: 8 version: 8
cacheKey: 10c0 cacheKey: 10c0
"@biomejs/biome@npm:^2.3.1": "@biomejs/biome@npm:^2.4.4":
version: 2.3.11 version: 2.4.7
resolution: "@biomejs/biome@npm:2.3.11" resolution: "@biomejs/biome@npm:2.4.7"
dependencies: dependencies:
"@biomejs/cli-darwin-arm64": "npm:2.3.11" "@biomejs/cli-darwin-arm64": "npm:2.4.7"
"@biomejs/cli-darwin-x64": "npm:2.3.11" "@biomejs/cli-darwin-x64": "npm:2.4.7"
"@biomejs/cli-linux-arm64": "npm:2.3.11" "@biomejs/cli-linux-arm64": "npm:2.4.7"
"@biomejs/cli-linux-arm64-musl": "npm:2.3.11" "@biomejs/cli-linux-arm64-musl": "npm:2.4.7"
"@biomejs/cli-linux-x64": "npm:2.3.11" "@biomejs/cli-linux-x64": "npm:2.4.7"
"@biomejs/cli-linux-x64-musl": "npm:2.3.11" "@biomejs/cli-linux-x64-musl": "npm:2.4.7"
"@biomejs/cli-win32-arm64": "npm:2.3.11" "@biomejs/cli-win32-arm64": "npm:2.4.7"
"@biomejs/cli-win32-x64": "npm:2.3.11" "@biomejs/cli-win32-x64": "npm:2.4.7"
dependenciesMeta: dependenciesMeta:
"@biomejs/cli-darwin-arm64": "@biomejs/cli-darwin-arm64":
optional: true optional: true
@@ -36,92 +36,83 @@ __metadata:
optional: true optional: true
bin: bin:
biome: bin/biome biome: bin/biome
checksum: 10c0/b9764070c3d1583466a8861d37dc480c18103f7bb52115db0f265a38e6343d69792c9beea094e0b3db0905cb365b9a82ad2a0f3f05b7f04873a8f9b444263140 checksum: 10c0/c073da6f081b72e061e471f6bc6d8680978dceb84a3528cb58117466d38ecb7cef075d949875d2371a268af030c2afece0fb6dd593d124fc8706c9307909f244
languageName: node languageName: node
linkType: hard linkType: hard
"@biomejs/cli-darwin-arm64@npm:2.3.11": "@biomejs/cli-darwin-arm64@npm:2.4.7":
version: 2.3.11 version: 2.4.7
resolution: "@biomejs/cli-darwin-arm64@npm:2.3.11" resolution: "@biomejs/cli-darwin-arm64@npm:2.4.7"
conditions: os=darwin & cpu=arm64 conditions: os=darwin & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@biomejs/cli-darwin-x64@npm:2.3.11": "@biomejs/cli-darwin-x64@npm:2.4.7":
version: 2.3.11 version: 2.4.7
resolution: "@biomejs/cli-darwin-x64@npm:2.3.11" resolution: "@biomejs/cli-darwin-x64@npm:2.4.7"
conditions: os=darwin & cpu=x64 conditions: os=darwin & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@biomejs/cli-linux-arm64-musl@npm:2.3.11": "@biomejs/cli-linux-arm64-musl@npm:2.4.7":
version: 2.3.11 version: 2.4.7
resolution: "@biomejs/cli-linux-arm64-musl@npm:2.3.11" resolution: "@biomejs/cli-linux-arm64-musl@npm:2.4.7"
conditions: os=linux & cpu=arm64 & libc=musl conditions: os=linux & cpu=arm64 & libc=musl
languageName: node languageName: node
linkType: hard linkType: hard
"@biomejs/cli-linux-arm64@npm:2.3.11": "@biomejs/cli-linux-arm64@npm:2.4.7":
version: 2.3.11 version: 2.4.7
resolution: "@biomejs/cli-linux-arm64@npm:2.3.11" resolution: "@biomejs/cli-linux-arm64@npm:2.4.7"
conditions: os=linux & cpu=arm64 & libc=glibc conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@biomejs/cli-linux-x64-musl@npm:2.3.11": "@biomejs/cli-linux-x64-musl@npm:2.4.7":
version: 2.3.11 version: 2.4.7
resolution: "@biomejs/cli-linux-x64-musl@npm:2.3.11" resolution: "@biomejs/cli-linux-x64-musl@npm:2.4.7"
conditions: os=linux & cpu=x64 & libc=musl conditions: os=linux & cpu=x64 & libc=musl
languageName: node languageName: node
linkType: hard linkType: hard
"@biomejs/cli-linux-x64@npm:2.3.11": "@biomejs/cli-linux-x64@npm:2.4.7":
version: 2.3.11 version: 2.4.7
resolution: "@biomejs/cli-linux-x64@npm:2.3.11" resolution: "@biomejs/cli-linux-x64@npm:2.4.7"
conditions: os=linux & cpu=x64 & libc=glibc conditions: os=linux & cpu=x64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@biomejs/cli-win32-arm64@npm:2.3.11": "@biomejs/cli-win32-arm64@npm:2.4.7":
version: 2.3.11 version: 2.4.7
resolution: "@biomejs/cli-win32-arm64@npm:2.3.11" resolution: "@biomejs/cli-win32-arm64@npm:2.4.7"
conditions: os=win32 & cpu=arm64 conditions: os=win32 & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@biomejs/cli-win32-x64@npm:2.3.11": "@biomejs/cli-win32-x64@npm:2.4.7":
version: 2.3.11 version: 2.4.7
resolution: "@biomejs/cli-win32-x64@npm:2.3.11" resolution: "@biomejs/cli-win32-x64@npm:2.4.7"
conditions: os=win32 & cpu=x64 conditions: os=win32 & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@isaacs/balanced-match@npm:^4.0.1": "@types/node@npm:^25.3.2":
version: 4.0.1 version: 25.5.0
resolution: "@isaacs/balanced-match@npm:4.0.1" resolution: "@types/node@npm:25.5.0"
checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420
languageName: node
linkType: hard
"@isaacs/brace-expansion@npm:^5.0.1":
version: 5.0.1
resolution: "@isaacs/brace-expansion@npm:5.0.1"
dependencies: dependencies:
"@isaacs/balanced-match": "npm:^4.0.1" undici-types: "npm:~7.18.0"
checksum: 10c0/e5d67c7bbf1f17b88132a35bc638af306d48acbb72810d48fa6e6edd8ab375854773108e8bf70f021f7ef6a8273455a6d1f0c3b5aa2aff06ce7894049ab77fb8 checksum: 10c0/70c508165b6758c4f88d4f91abca526c3985eee1985503d4c2bd994dbaf588e52ac57e571160f18f117d76e963570ac82bd20e743c18987e82564312b3b62119
languageName: node languageName: node
linkType: hard linkType: hard
"@types/node@npm:^24.0.1": "balanced-match@npm:^4.0.2":
version: 24.10.9 version: 4.0.4
resolution: "@types/node@npm:24.10.9" resolution: "balanced-match@npm:4.0.4"
dependencies: checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b
undici-types: "npm:~7.16.0"
checksum: 10c0/e9e436fcd2136bddb1bbe3271a89f4653910bcf6ee8047c4117f544c7905a106c039e2720ee48f28505ef2560e22fb9ead719f28bf5e075fdde0c1120e38e3b2
languageName: node languageName: node
linkType: hard linkType: hard
"bats@npm:^1.12.0": "bats@npm:^1.13.0":
version: 1.13.0 version: 1.13.0
resolution: "bats@npm:1.13.0" resolution: "bats@npm:1.13.0"
bin: bin:
@@ -130,6 +121,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"brace-expansion@npm:^5.0.2":
version: 5.0.4
resolution: "brace-expansion@npm:5.0.4"
dependencies:
balanced-match: "npm:^4.0.2"
checksum: 10c0/359cbcfa80b2eb914ca1f3440e92313fbfe7919ee6b274c35db55bec555aded69dac5ee78f102cec90c35f98c20fa43d10936d0cd9978158823c249257e1643a
languageName: node
linkType: hard
"debug@npm:^4.3.4": "debug@npm:^4.3.4":
version: 4.4.3 version: 4.4.3
resolution: "debug@npm:4.4.3" resolution: "debug@npm:4.4.3"
@@ -149,7 +149,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"editorconfig-checker@npm:^6.1.0": "editorconfig-checker@npm:^6.1.1":
version: 6.1.1 version: 6.1.1
resolution: "editorconfig-checker@npm:6.1.1" resolution: "editorconfig-checker@npm:6.1.1"
bin: bin:
@@ -174,24 +174,24 @@ __metadata:
linkType: hard linkType: hard
"fs-extra@npm:^11.1.1": "fs-extra@npm:^11.1.1":
version: 11.3.3 version: 11.3.4
resolution: "fs-extra@npm:11.3.3" resolution: "fs-extra@npm:11.3.4"
dependencies: dependencies:
graceful-fs: "npm:^4.2.0" graceful-fs: "npm:^4.2.0"
jsonfile: "npm:^6.0.1" jsonfile: "npm:^6.0.1"
universalify: "npm:^2.0.0" universalify: "npm:^2.0.0"
checksum: 10c0/984924ff4104e3e9f351b658a864bf3b354b2c90429f57aec0acd12d92c4e6b762cbacacdffb4e745b280adce882e1f980c485d9f02c453f769ab4e7fc646ce3 checksum: 10c0/e08276f767a62496ae97d711aaa692c6a478177f24a85979b6a2881c9db9c68b8c2ad5da0bcf92c0b2a474cea6e935ec245656441527958fd8372cb647087df0
languageName: node languageName: node
linkType: hard linkType: hard
"glob@npm:^13.0.0": "glob@npm:^13.0.0":
version: 13.0.1 version: 13.0.6
resolution: "glob@npm:13.0.1" resolution: "glob@npm:13.0.6"
dependencies: dependencies:
minimatch: "npm:^10.1.2" minimatch: "npm:^10.2.2"
minipass: "npm:^7.1.2" minipass: "npm:^7.1.3"
path-scurry: "npm:^2.0.0" path-scurry: "npm:^2.0.2"
checksum: 10c0/af7b863dec8dff74f61d7d6e53104e1f6bbdd482157a196cade8ed857481e876ec35181b38a059b2a7b93ea3b08248f4ff0792fef6dc91814fd5097a716f48e4 checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a
languageName: node languageName: node
linkType: hard linkType: hard
@@ -206,13 +206,13 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "ivuorinen-dotfiles@workspace:." resolution: "ivuorinen-dotfiles@workspace:."
dependencies: dependencies:
"@biomejs/biome": "npm:^2.3.1" "@biomejs/biome": "npm:^2.4.4"
"@types/node": "npm:^24.0.1" "@types/node": "npm:^25.3.2"
bats: "npm:^1.12.0" bats: "npm:^1.13.0"
editorconfig-checker: "npm:^6.1.0" editorconfig-checker: "npm:^6.1.1"
markdown-table-formatter: "npm:^1.7.0" markdown-table-formatter: "npm:^1.7.0"
prettier: "npm:^3.8.1" prettier: "npm:^3.8.1"
typescript: "npm:^5.8.3" typescript: "npm:^5.9.3"
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@@ -240,9 +240,9 @@ __metadata:
linkType: hard linkType: hard
"lru-cache@npm:^11.0.0": "lru-cache@npm:^11.0.0":
version: 11.2.5 version: 11.2.7
resolution: "lru-cache@npm:11.2.5" resolution: "lru-cache@npm:11.2.7"
checksum: 10c0/cc98958d25dddf1c8a8cbdc49588bd3b24450e8dfa78f32168fd188a20d4a0331c7406d0f3250c86a46619ee288056fd7a1195e8df56dc8a9592397f4fbd8e1d checksum: 10c0/549cdb59488baa617135fc12159cafb1a97f91079f35093bb3bcad72e849fc64ace636d244212c181dfdf1a99bbfa90757ff303f98561958ee4d0f885d9bd5f7
languageName: node languageName: node
linkType: hard linkType: hard
@@ -271,19 +271,19 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"minimatch@npm:^10.1.2": "minimatch@npm:^10.2.4":
version: 10.1.2 version: 10.2.4
resolution: "minimatch@npm:10.1.2" resolution: "minimatch@npm:10.2.4"
dependencies: dependencies:
"@isaacs/brace-expansion": "npm:^5.0.1" brace-expansion: "npm:^5.0.2"
checksum: 10c0/0cccef3622201703de6ecf9d772c0be1d5513dcc038ed9feb866c20cf798243e678ac35605dac3f1a054650c28037486713fe9e9a34b184b9097959114daf086 checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945
languageName: node languageName: node
linkType: hard linkType: hard
"minipass@npm:^7.1.2": "minipass@npm:^7.1.2, minipass@npm:^7.1.3":
version: 7.1.2 version: 7.1.3
resolution: "minipass@npm:7.1.2" resolution: "minipass@npm:7.1.3"
checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb
languageName: node languageName: node
linkType: hard linkType: hard
@@ -308,13 +308,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"path-scurry@npm:^2.0.0": "path-scurry@npm:^2.0.2":
version: 2.0.1 version: 2.0.2
resolution: "path-scurry@npm:2.0.1" resolution: "path-scurry@npm:2.0.2"
dependencies: dependencies:
lru-cache: "npm:^11.0.0" lru-cache: "npm:^11.0.0"
minipass: "npm:^7.1.2" minipass: "npm:^7.1.2"
checksum: 10c0/2a16ed0e81fbc43513e245aa5763354e25e787dab0d539581a6c3f0f967461a159ed6236b2559de23aa5b88e7dc32b469b6c47568833dd142a4b24b4f5cd2620 checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482
languageName: node languageName: node
linkType: hard linkType: hard
@@ -343,7 +343,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@npm:^5.8.3": "typescript@npm:^5.9.3":
version: 5.9.3 version: 5.9.3
resolution: "typescript@npm:5.9.3" resolution: "typescript@npm:5.9.3"
bin: bin:
@@ -353,7 +353,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@patch:typescript@npm%3A^5.8.3#optional!builtin<compat/typescript>": "typescript@patch:typescript@npm%3A^5.9.3#optional!builtin<compat/typescript>":
version: 5.9.3 version: 5.9.3
resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin<compat/typescript>::version=5.9.3&hash=5786d5" resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin<compat/typescript>::version=5.9.3&hash=5786d5"
bin: bin:
@@ -363,10 +363,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"undici-types@npm:~7.16.0": "undici-types@npm:~7.18.0":
version: 7.16.0 version: 7.18.2
resolution: "undici-types@npm:7.16.0" resolution: "undici-types@npm:7.18.2"
checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d
languageName: node languageName: node
linkType: hard linkType: hard