Compare commits

..

1 Commits

Author SHA1 Message Date
8460c2d408 feat: switch to chezmoi
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-11-13 00:26:19 +02:00
397 changed files with 36741 additions and 6750 deletions

53
.chezmoi.yaml.tmpl Normal file
View File

@@ -0,0 +1,53 @@
{{- $hostname := .chezmoi.hostname -}}
{{- $username := .chezmoi.username -}}
{{- $osid := .chezmoi.os -}}
sourceDir: {{ .chezmoi.sourceDir | quote }}
data:
hostname: {{ $hostname | quote }}
username: {{ $username | quote }}
osid: {{ $osid | quote }}
# Detect if we're on macOS
is_macos: {{ eq $osid "darwin" }}
# Detect if we're on Linux
is_linux: {{ eq $osid "linux" }}
# Host-specific flags
is_air: {{ eq $hostname "air" }}
is_lakka: {{ eq $hostname "lakka" }}
is_tunkki: {{ eq $hostname "tunkki" }}
is_s: {{ eq $hostname "s" }}
# Merge strategy for dealing with conflicts
merge:
command: "nvim"
args:
- "-d"
- "{{ "{{" }} .Destination {{ "}}" }}"
- "{{ "{{" }} .Source {{ "}}" }}"
- "{{ "{{" }} .Target {{ "}}" }}"
# Template options
template:
options:
- "missingkey=error"
# Diff options
diff:
exclude:
- "scripts"
pager: "delta"
# Git options
git:
autoCommit: false
autoPush: false
# Hooks
hooks:
read-source-state:
pre:
command: ".local/share/chezmoi/.chezmoihooks/pre-read-source-state.sh"

View File

@@ -0,0 +1,13 @@
#!/usr/bin/env bash
# Pre-read-source-state hook for chezmoi
# This runs before chezmoi reads the source state
set -e
DOTFILES="${CHEZMOI_SOURCE_DIR:-$HOME/.local/share/chezmoi}"
# Update git submodules if they exist
if [ -d "$DOTFILES/.git" ]; then
cd "$DOTFILES"
git submodule update --init --recursive --quiet || true
fi

90
.chezmoiignore Normal file
View File

@@ -0,0 +1,90 @@
# Chezmoi ignore file
# Files and directories that should not be managed by chezmoi
# Git and version control
.git/
.gitignore
.gitattributes
.gitmodules
# GitHub
.github/
# Documentation
README.md
*.md
docs/
AGENTS.md
# Development tools
.vscode/
.serena/
.claude/
node_modules/
# Testing
tests/
test-all.sh
# Configuration files for the repo itself
.editorconfig
.editorconfig-checker.json
.eslintrc.json
.prettierrc.js
.prettierignore
.markdownlint.json
.markdownlintignore
.mega-linter.yml
.commitlintrc.json
.releaserc.json
.shellcheckrc
.yamlignore
.yamllint.yml
.browserslistrc
.actrc
.luarc.json
.ignore
stylua.toml
phpcs.xml
# Package management
package.json
yarn.lock
# Python and Node version files
.python-version
.nvmrc
.go-version
# Dotbot (old system)
install.conf.yaml
tools/dotbot/
tools/dotbot-*/
tools/dotbot-defaults.yaml
# Installation and build scripts in root
install
add-submodules.sh
# Chezmoi-specific directories (not to be managed)
.chezmoihooks/
# Host-specific directories (will be handled via templates)
{{- if not .is_air }}
hosts/air/
{{- end }}
{{- if not .is_lakka }}
hosts/lakka/
{{- end }}
{{- if not .is_tunkki }}
hosts/tunkki/
{{- end }}
{{- if not .is_s }}
hosts/s/
{{- end }}
# Secrets (should use separate secrets management)
secrets/
# macOS specific files
.DS_Store

View File

@@ -1,14 +0,0 @@
---
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

@@ -1,13 +0,0 @@
#!/usr/bin/env bash
# Async Bats runner: run matching test file when a script is edited.
# Runs in background (async: true) — output appears on next turn.
fp=$(jq -r '.tool_input.file_path // empty')
[ -z "$fp" ] && exit 0
name=$(basename "$fp")
test_file="$CLAUDE_PROJECT_DIR/tests/${name}.bats"
[ ! -f "$test_file" ] && exit 0
echo "Running $test_file ..."
"$CLAUDE_PROJECT_DIR/node_modules/.bin/bats" "$test_file"

View File

@@ -1,14 +0,0 @@
#!/usr/bin/env bash
# PostToolUseFailure logger: append tool failures to a local log file.
log_file="$CLAUDE_PROJECT_DIR/.claude/hook-failures.log"
entry=$(jq -c '{
time: (now | strftime("%Y-%m-%dT%H:%M:%SZ")),
tool: .tool_name,
error: .error
}')
echo "$entry" >> "$log_file"
exit 0

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env bash
# Notification hook: alert when Claude goes idle.
# Uses pushover if available, falls back to macOS native notification.
msg=$(jq -r '.message // "Claude is waiting for input"')
if command -v pushover > /dev/null; then
pushover "Claude Code" "$msg"
elif command -v osascript > /dev/null; then
osascript -e "display notification \"$msg\" with title \"Claude Code\""
fi
exit 0

View File

@@ -1,15 +0,0 @@
#!/usr/bin/env bash
# Post-edit: warn when formatter/linter configs are changed,
# since they affect the entire repo's code style.
fp=$(jq -r '.tool_input.file_path // empty')
[ -z "$fp" ] || [ ! -f "$fp" ] && exit 0
case "$(basename "$fp")" in
.editorconfig | biome.json | .prettierrc.json | .shellcheckrc | stylua.toml | .yamllint.yml)
echo "NOTE: Formatter/linter config changed ($fp)." >&2
echo "Run 'pre-commit run --all-files' to verify consistency." >&2
;;
esac
exit 0

View File

@@ -1,28 +0,0 @@
#!/usr/bin/env bash
# Post-edit: validate Dotbot install.conf.yaml files after editing.
# Checks YAML syntax and verifies link targets exist.
fp=$(jq -r '.tool_input.file_path // empty')
[ -z "$fp" ] || [ ! -f "$fp" ] && exit 0
case "$fp" in
*install.conf.yaml) ;;
*) exit 0 ;;
esac
# YAML syntax check
if command -v yamllint > /dev/null; then
if ! output=$(yamllint -d relaxed "$fp" 2>&1); then
echo "Dotbot config YAML error in $fp:" >&2
echo "$output" >&2
exit 2
fi
elif command -v python3 > /dev/null; then
if ! output=$(python3 -c "import yaml; yaml.safe_load(open('$fp'))" 2>&1); then
echo "Dotbot config YAML parse error in $fp:" >&2
echo "$output" >&2
exit 2
fi
fi
exit 0

View File

@@ -1,30 +0,0 @@
#!/usr/bin/env bash
# Post-edit formatter: auto-format file based on extension.
# Receives tool output JSON on stdin.
fp=$(jq -r '.tool_input.file_path // empty')
[ -z "$fp" ] || [ ! -f "$fp" ] && exit 0
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"
;;
*.fish)
command -v fish_indent > /dev/null && fish_indent -w "$fp"
;;
*.lua)
command -v stylua > /dev/null && stylua "$fp"
;;
*.md)
command -v biome > /dev/null && biome format --write "$fp" 2> /dev/null
command -v markdown-table-formatter > /dev/null \
&& markdown-table-formatter "$fp" 2> /dev/null
;;
*.yml | *.yaml)
command -v prettier > /dev/null && prettier --write "$fp" 2> /dev/null
;;
esac
exit 0

View File

@@ -1,35 +0,0 @@
#!/usr/bin/env bash
# Pre-edit guard: block vendor/lock files and secrets.d real fish files.
# Receives tool input JSON on stdin.
fp=$(jq -r '.tool_input.file_path // empty')
[ -z "$fp" ] && exit 0
case "$fp" in
*/fzf-tmux | */yarn.lock | */.yarn/*)
echo "BLOCKED: $fp is a vendor/lock file — do not edit directly" >&2
exit 2
;;
*/tools/dotbot/* | */tools/dotbot-include/* | */tools/antidote/*)
echo "BLOCKED: $fp is inside a git submodule — do not edit" >&2
exit 2
;;
*/config/tmux/plugins/*)
echo "BLOCKED: $fp is a tmux plugin submodule — do not edit" >&2
exit 2
;;
*/config/cheat/cheatsheets/community/* | */config/cheat/cheatsheets/tldr/*)
echo "BLOCKED: $fp is a cheat submodule — do not edit" >&2
exit 2
;;
*/secrets.d/*.fish)
case "$(basename "$fp")" in
*.example.fish | *.fish.example) exit 0 ;;
esac
echo "BLOCKED: do not edit $fp directly — it is gitignored." >&2
echo "Copy the matching .fish.example file and edit that locally." >&2
exit 2
;;
esac
exit 0

View File

@@ -1,15 +0,0 @@
#!/usr/bin/env bash
# SessionStart context: print branch, dirty file count, and last commit.
cd "$CLAUDE_PROJECT_DIR" || exit 0
branch=$(git branch --show-current 2> /dev/null)
dirty=$(git status --short 2> /dev/null | wc -l | tr -d ' ')
last=$(git log -1 --oneline 2> /dev/null)
echo "=== Dotfiles session context ==="
echo "Branch : ${branch:-unknown}"
echo "Dirty : ${dirty} file(s)"
echo "Last : ${last}"
exit 0

View File

@@ -1,16 +0,0 @@
#!/usr/bin/env bash
# Stop gate: run yarn lint before Claude finishes.
# Exit 2 sends feedback back and keeps Claude working.
cd "$CLAUDE_PROJECT_DIR" || exit 0
output=$(yarn lint 2>&1)
status=$?
if [ $status -ne 0 ]; then
echo "Lint failed — fix before finishing:" >&2
echo "$output" >&2
exit 2
fi
exit 0

View File

@@ -1,87 +0,0 @@
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start-context.sh",
"statusMessage": "Loading project context..."
}
]
}
],
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-edit-block.sh"
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-edit-format.sh",
"statusMessage": "Formatting..."
},
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-edit-dotbot-validate.sh",
"statusMessage": "Validating Dotbot config..."
},
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-edit-config-warn.sh"
},
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/async-bats.sh",
"async": true,
"statusMessage": "Running tests..."
}
]
}
],
"PostToolUseFailure": [
{
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/log-failures.sh",
"async": true
}
]
}
],
"Notification": [
{
"matcher": "idle_prompt",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/notify-idle.sh",
"async": true
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop-lint-gate.sh",
"statusMessage": "Running lint gate..."
}
]
}
]
}
}

View File

@@ -1,38 +0,0 @@
---
name: dotbot-validate
description: >-
Validate Dotbot install.conf.yaml files after editing.
Apply when writing or modifying any install.conf.yaml.
user-invocable: false
allowed-tools: Bash, Read
---
After editing any `install.conf.yaml` file, validate it:
## 1. YAML syntax
```bash
yamllint -d relaxed <file>
```
If yamllint is not available, fall back to:
```bash
python3 -c "import yaml; yaml.safe_load(open('<file>'))"
```
## 2. Link target verification
For each `link` entry, verify the source path exists relative
to the repo root. Report any missing source files.
## 3. Host-specific configs
Files in `hosts/<hostname>/install.conf.yaml` overlay the
global config. Verify that any `include` directives reference
existing files.
## Key locations
- `install.conf.yaml` — global config
- `hosts/*/install.conf.yaml` — per-host overlays

View File

@@ -1,38 +0,0 @@
---
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

@@ -1,58 +0,0 @@
---
name: host-override
description: >-
Create or extend host-specific config overlays
in hosts/<hostname>/ for machine-specific settings.
user-invocable: true
allowed-tools: Bash, Read, Write, Edit
---
When creating host-specific configuration overrides:
## 1. Determine hostname
```bash
hostname -s
```
## 2. Directory structure
Host overrides live in `hosts/<hostname>/` mirroring the
global layout:
```
hosts/<hostname>/
base/ -> ~/.*
config/ -> ~/.config/
install.conf.yaml
```
## 3. Create install.conf.yaml
If it doesn't exist, create `hosts/<hostname>/install.conf.yaml`
following the Dotbot format. Use `include` to layer on top of
the global config:
```yaml
- defaults:
link:
create: true
relink: true
force: true
```
## 4. Git config overrides
The most common override is `hosts/<hostname>/config/git/overrides/config`.
This is where host-specific git user, signing keys, and credential
helpers go. Always `[include]` the shared config:
```ini
[include]
path = ~/.dotfiles/config/git/shared
```
## 5. Test
Run `./install` to apply. Dotbot processes
`hosts/<hostname>/install.conf.yaml` after the global config.

View File

@@ -1,22 +0,0 @@
---
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,40 +0,0 @@
---
name: new-fish-function
description: >-
Scaffold a new fish function in config/fish/functions/
with proper conventions and event handling.
user-invocable: true
allowed-tools: Bash, Read, Write, Edit
---
When creating a new fish function in `config/fish/functions/`:
## 1. Create the function file
Create `config/fish/functions/<name>.fish`:
```fish
function <name> --description '<one-line description>'
# Function logic here
end
```
- One function per file, filename must match function name
- Always include `--description`
- Use `--argument-names` for named parameters
## 2. Conventions
- Do NOT use `_tide_` prefix (reserved for tide prompt plugin)
- Use `--wraps` if the function wraps an existing command
- For abbreviation-like functions, prefer fish abbreviations
in `config/fish/alias.fish` instead
## 3. Validate
Run the fish-validate skill checks:
```bash
fish --no-execute config/fish/functions/<name>.fish
fish_indent --check config/fish/functions/<name>.fish
```

View File

@@ -1,53 +0,0 @@
---
name: new-script
description: >-
Scaffold a new helper script in local/bin/ with proper
boilerplate, msgr sourcing, and documentation tag.
user-invocable: true
allowed-tools: Bash, Read, Write, Edit
---
When creating a new script in `local/bin/`, follow this template:
## 1. Script file
Create `local/bin/<name>` with:
```bash
#!/usr/bin/env bash
# @description <one-line description>
set -euo pipefail
# shellcheck source=msgr
. "$(dirname "$0")/msgr"
# Script logic here
```
- Use `msgr` functions for output: `msgr msg`, `msgr run`,
`msgr yay`, `msgr err`, `msgr warn`
- The `@description` tag is required — `dfm scripts` discovers
scripts by it
- POSIX scripts (`/bin/sh`) should NOT source msgr
## 2. Make executable
```bash
chmod +x local/bin/<name>
```
## 3. Generate docs
Run `dfm docs script <name>` or manually create `local/bin/<name>.md`
with a usage summary.
## 4. Validate
Run the shell-validate skill checks (syntax + shellcheck).
## Naming conventions
- `x-` prefix for standalone utilities (e.g., `x-ssl-expiry-date`)
- Short names for frequently used commands (e.g., `a`, `ad`, `ae`)
- `git-` prefix for git subcommands (e.g., `git-dirty`)

View File

@@ -1,44 +0,0 @@
---
name: shell-validate
description: >-
Validate shell scripts after editing.
Apply when writing or modifying any shell script
in local/bin/ or scripts/.
user-invocable: false
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:
## 1. Determine the shell
- `/bin/sh` or `#!/usr/bin/env sh` shebang -> POSIX, use `sh -n`
- `/bin/bash` or `#!/usr/bin/env bash` shebang -> Bash, use `bash -n`
- `# shellcheck shell=bash` directive (no shebang) -> use `bash -n`
- `# shellcheck shell=sh` directive (no shebang) -> use `sh -n`
- No shebang and no directive -> default to `bash -n`
## 2. Syntax check
Run the appropriate syntax checker:
```bash
bash -n <file> # for bash scripts
sh -n <file> # for POSIX sh scripts
```
If syntax check fails, fix the issue before proceeding.
## 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.
## Key files to never validate (not shell scripts)
- `local/bin/fzf-tmux` (vendor file)
- `*.md` files
- `*.bats` test files (Bats, not plain shell)

View File

@@ -1,38 +0,0 @@
---
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

@@ -8,12 +8,8 @@ indent_style = space
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
[*.py]
indent_size = 4
max_line_length = 120
[*.fish] [*.fish]
max_line_length = 120 max_line_length = 80
[*.md] [*.md]
max_line_length = 120 max_line_length = 120
@@ -53,6 +49,3 @@ ignore = true
[plan] [plan]
trim_trailing_whitespace = false trim_trailing_whitespace = false
max_line_length = off max_line_length = off
[base/hammerspoon/hammerspoon.types.lua]
max_line_length = off

View File

@@ -7,7 +7,6 @@
"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",

3
.eslintrc.json Normal file
View File

@@ -0,0 +1,3 @@
{
"extends": ["@ivuorinen"]
}

6
.github/README.md vendored
View File

@@ -37,7 +37,7 @@ see what interesting stuff you've done with it. Sharing is caring.
### Interesting folders ### Interesting folders
| Path | Description | | Path | Description |
|---------------------|----------------------------------------------| | ------------------- | -------------------------------------------- |
| `.github` | GitHub Repository configuration files, meta. | | `.github` | GitHub Repository configuration files, meta. |
| `hosts/{hostname}/` | Configs that should apply to that host only. | | `hosts/{hostname}/` | Configs that should apply to that host only. |
| `local/bin` | Helper scripts that I've collected or wrote. | | `local/bin` | Helper scripts that I've collected or wrote. |
@@ -52,7 +52,7 @@ is processed by Dotbot during installation.
### dotfile folders ### dotfile folders
| Repo | Destination | Description | | Repo | Destination | Description |
|-----------|-------------|---------------------------------------------| | --------- | ----------- | ------------------------------------------- |
| `base/` | `.*` | `$HOME` level files. | | `base/` | `.*` | `$HOME` level files. |
| `config/` | `.config/` | Configurations for applications. | | `config/` | `.config/` | Configurations for applications. |
| `local/` | `.local/` | XDG Base folder: `bin`, `share` and `state` | | `local/` | `.local/` | XDG Base folder: `bin`, `share` and `state` |
@@ -86,7 +86,7 @@ The folder structure follows [XDG Base Directory Specification][xdg] where possi
### XDG Variables ### XDG Variables
| Env | Default | Short description | | Env | Default | Short description |
|--------------------|----------------------|------------------------------------------------| | ------------------ | -------------------- | ---------------------------------------------- |
| `$XDG_BIN_HOME` | `$HOME/.local/bin` | Local binaries | | `$XDG_BIN_HOME` | `$HOME/.local/bin` | Local binaries |
| `$XDG_CONFIG_HOME` | `$HOME/.config` | User-specific configs | | `$XDG_CONFIG_HOME` | `$HOME/.config` | User-specific configs |
| `$XDG_DATA_HOME` | `$HOME/.local/share` | User-specific data files | | `$XDG_DATA_HOME` | `$HOME/.local/share` | User-specific data files |

8
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
---
version: 2
updates:
# Maintain dependencies for GitHub Actions
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'weekly'

View File

@@ -16,10 +16,10 @@ module.exports = {
excludeTypes: [], excludeTypes: [],
renderTypeSection: (label, commits) => { renderTypeSection: function (label, commits) {
let text = `\n## ${label}\n\n` let text = `\n## ${label}\n\n`
commits.forEach((commit) => { commits.forEach(commit => {
const scope = commit.scope ? `**${commit.scope}:** ` : '' const scope = commit.scope ? `**${commit.scope}:** ` : ''
text += `- ${scope}${commit.subject}\n` text += `- ${scope}${commit.subject}\n`
}) })
@@ -27,10 +27,10 @@ module.exports = {
return text return text
}, },
renderChangelog: (release, changes) => { renderChangelog: function (release, changes) {
const now = new Date() const now = new Date()
const d = now.toISOString().substring(0, 10) const d = now.toISOString().substring(0, 10)
const header = `# ${release} - ${d}\n` const header = `# ${release} - ${d}\n`
return `${header}${changes}\n\n` return header + changes + '\n\n'
}, },
} }

View File

@@ -9,27 +9,25 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions: permissions: read-all
contents: read
jobs: jobs:
debug-changelog: debug-changelog:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions: write-all
contents: read
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Create changelog text - name: Create changelog text
id: changelog id: changelog
uses: loopwerk/tag-changelog@8dd150d55fbf1fe93e0ea00a29a6153aaeb81912 # v1.5.0 uses: loopwerk/tag-changelog@941366edb8920e2071eae0449031830984b9f26e # v1.3.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: "Echo results" - name: 'Echo results'
id: output-changelog id: output-changelog
run: | run: |
echo "${{ steps.changelog.outputs.changes }}" echo "${{ steps.changelog.outputs.changes }}"

View File

@@ -5,14 +5,13 @@ name: Lint Code Base
# yamllint disable-line # yamllint disable-line
on: on:
pull_request: pull_request:
branches: [main] branches: [master, main]
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions: permissions: read-all
contents: read
jobs: jobs:
Linter: Linter:
@@ -28,12 +27,12 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Yarn Lock Changes - name: Yarn Lock Changes
uses: Simek/yarn-lock-changes@59f47ee499424d2c2437c5aebf863b5c6d50a5bc # v0.14.1 uses: Simek/yarn-lock-changes@61d1a0595070b79c1abdc8e1e5a5f5d98b18918c # v0.12.2
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
- name: Run PR Lint - name: Run PR Lint
uses: ivuorinen/actions/pr-lint@1da3a0e79fcd7da6bed9ee1979f1449ba11f58f9 # v2026.03.14 uses: ivuorinen/actions/pr-lint@ff0ca4bc920c518b2ce2dc20c5e5a6e95f76dee0 # v2025.11.02

View File

@@ -5,28 +5,26 @@ name: Release Daily State
on: on:
workflow_dispatch: workflow_dispatch:
schedule: schedule:
- cron: "0 21 * * *" # 00:00 at Europe/Helsinki - cron: '0 21 * * *' # 00:00 at Europe/Helsinki
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions: permissions: read-all
contents: read
jobs: jobs:
new-daily-release: new-daily-release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions: write-all
contents: write
outputs: outputs:
created: ${{ steps.daily-version.outputs.created }} created: ${{ steps.daily-version.outputs.created }}
version: ${{ steps.daily-version.outputs.version }} version: ${{ steps.daily-version.outputs.version }}
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Create tag if necessary - name: Create tag if necessary
uses: fregante/daily-version-action@fb1a60b7c4daf1410cd755e360ebec3901e58588 # v2.1.3 uses: fregante/daily-version-action@fb1a60b7c4daf1410cd755e360ebec3901e58588 # v2.1.3
@@ -35,14 +33,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@8dd150d55fbf1fe93e0ea00a29a6153aaeb81912 # v1.5.0 uses: loopwerk/tag-changelog@941366edb8920e2071eae0449031830984b9f26e # v1.3.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@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe # v2.4.2
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

@@ -5,15 +5,14 @@ name: Pre-commit autoupdate
on: on:
schedule: schedule:
# At 04:00 on Monday and Thursday. # At 04:00 on Monday and Thursday.
- cron: "0 4 * * 1,4" - cron: '0 4 * * 1,4'
workflow_dispatch: workflow_dispatch:
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions: permissions: read-all
contents: read
jobs: jobs:
auto-update: auto-update:
@@ -24,16 +23,16 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
- run: pip install pre-commit && pre-commit autoupdate - run: pip install pre-commit && pre-commit autoupdate
- uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
branch: update/pre-commit-hooks branch: update/pre-commit-hooks
title: "chore: update pre-commit hooks" title: 'chore: update pre-commit hooks'
commit-message: "chore: update pre-commit hooks" commit-message: 'chore: update pre-commit hooks'
body: Update versions of pre-commit hooks to latest version. body: Update versions of pre-commit hooks to latest version.

View File

@@ -14,8 +14,7 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions: permissions: read-all
pull-requests: read
jobs: jobs:
semantic-pr: semantic-pr:

View File

@@ -11,7 +11,7 @@ on:
- .github/workflows/sync-labels.yml - .github/workflows/sync-labels.yml
- .github/labels.yml - .github/labels.yml
schedule: schedule:
- cron: "34 5 * * *" - cron: '34 5 * * *'
workflow_call: workflow_call:
workflow_dispatch: workflow_dispatch:
@@ -19,8 +19,7 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions: permissions: read-all
contents: read
jobs: jobs:
SyncLabels: SyncLabels:
@@ -30,4 +29,4 @@ jobs:
issues: write issues: write
steps: steps:
- uses: ivuorinen/actions/sync-labels@1da3a0e79fcd7da6bed9ee1979f1449ba11f58f9 # v2026.03.14 - uses: ivuorinen/actions/sync-labels@ff0ca4bc920c518b2ce2dc20c5e5a6e95f76dee0 # v2025.11.02

View File

@@ -5,26 +5,24 @@ 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,4" - cron: '0 4 * * 1'
workflow_dispatch: workflow_dispatch:
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions: permissions: read-all
contents: read
jobs: jobs:
update-submodules: update-submodules:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions: write-all
contents: write
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with: with:
submodules: true submodules: true
fetch-depth: 2 fetch-depth: 2

14
.gitignore vendored
View File

@@ -11,7 +11,6 @@
.nfs* .nfs*
.scannerwork .scannerwork
.vscode .vscode
.yarn/
!config/git/local.d/.gitkeep !config/git/local.d/.gitkeep
!config/nvim/spell/.gitkeep !config/nvim/spell/.gitkeep
!config/zed/settings.json !config/zed/settings.json
@@ -25,13 +24,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/fish/secrets.d/*
!config/fish/secrets.d/*.example
!config/fish/secrets.d/README.md
config/gh/hosts.yml config/gh/hosts.yml
config/git/credentials config/git/credentials
config/git/local.d/* config/git/local.d/*
@@ -61,12 +55,4 @@ local/man/yabai.1
local/share/fonts/* local/share/fonts/*
lock lock
node_modules node_modules
__pycache__
ssh/local.d/* ssh/local.d/*
config/fish/fish_variables*
# Allow .claude directory (overrides global **/.claude/* ignore)
!.claude/
!.claude/**
.claude/**/*.log
.claude/settings.local.json

32
.gitmodules vendored
View File

@@ -4,6 +4,11 @@
url = https://github.com/anishathalye/dotbot.git url = https://github.com/anishathalye/dotbot.git
ignore = dirty ignore = dirty
[submodule "dotbot-brew"]
path = tools/dotbot-brew
url = https://github.com/wren/dotbot-brew.git
ignore = dirty
[submodule "dotbot-include"] [submodule "dotbot-include"]
path = tools/dotbot-include path = tools/dotbot-include
url = https://gitlab.com/gnfzdz/dotbot-include.git url = https://gitlab.com/gnfzdz/dotbot-include.git
@@ -19,16 +24,41 @@
url = https://github.com/tmux-plugins/tmux-continuum url = https://github.com/tmux-plugins/tmux-continuum
ignore = dirty ignore = dirty
[submodule "tmux/tmux-sensible"]
path = config/tmux/plugins/tmux-sensible
url = https://github.com/tmux-plugins/tmux-sensible.git
ignore = dirty
[submodule "tmux/tmux-sessionist"] [submodule "tmux/tmux-sessionist"]
path = config/tmux/plugins/tmux-sessionist path = config/tmux/plugins/tmux-sessionist
url = https://github.com/tmux-plugins/tmux-sessionist.git url = https://github.com/tmux-plugins/tmux-sessionist.git
ignore = dirty ignore = dirty
[submodule "tmux/tmux-yank"]
path = config/tmux/plugins/tmux-yank
url = https://github.com/tmux-plugins/tmux-yank.git
ignore = dirty
[submodule "tmux/tmux-window-name"]
path = config/tmux/plugins/tmux-window-name
url = https://github.com/ivuorinen/tmux-window-name.git
ignore = dirty
[submodule "dotbot-pip"]
path = tools/dotbot-pip
url = https://github.com/sobolevn/dotbot-pip.git
ignore = dirty
[submodule "tmux/tmux-suspend"] [submodule "tmux/tmux-suspend"]
path = config/tmux/plugins/tmux-suspend path = config/tmux/plugins/tmux-suspend
url = https://github.com/MunifTanjim/tmux-suspend.git url = https://github.com/MunifTanjim/tmux-suspend.git
ignore = dirty ignore = dirty
[submodule "tmux/tmux-mode-indicator"]
path = config/tmux/plugins/tmux-mode-indicator
url = https://github.com/MunifTanjim/tmux-mode-indicator.git
ignore = dirty
[submodule "tmux/tmux-current-pane-hostname"] [submodule "tmux/tmux-current-pane-hostname"]
path = config/tmux/plugins/tmux-current-pane-hostname path = config/tmux/plugins/tmux-current-pane-hostname
url = https://github.com/soyuka/tmux-current-pane-hostname.git url = https://github.com/soyuka/tmux-current-pane-hostname.git
@@ -53,8 +83,6 @@
[submodule "tmux/tmux-resurrect"] [submodule "tmux/tmux-resurrect"]
path = config/tmux/plugins/tmux-resurrect path = config/tmux/plugins/tmux-resurrect
url = https://github.com/tmux-plugins/tmux-resurrect.git url = https://github.com/tmux-plugins/tmux-resurrect.git
ignore = dirty
[submodule "tmux/catppuccin"] [submodule "tmux/catppuccin"]
path = config/tmux/plugins/catppuccin path = config/tmux/plugins/catppuccin
url = https://github.com/catppuccin/tmux.git url = https://github.com/catppuccin/tmux.git
ignore = dirty

1
.go-version Normal file
View File

@@ -0,0 +1 @@
1.25.3

View File

@@ -6,5 +6,6 @@ config/tmux/plugins/**
config/vim/plugged/** config/vim/plugged/**
node_modules node_modules
tools/antidote/** tools/antidote/**
tools/dotbot-brew/**
tools/dotbot-include/** tools/dotbot-include/**
tools/dotbot/** tools/dotbot/**

19
.markdownlint.json Normal file
View File

@@ -0,0 +1,19 @@
{
"extends": "@ivuorinen/markdownlint-config",
"code-block-style": {
"style": "fenced"
},
"code-fence-style": {
"style": "backtick"
},
"heading-style": {
"style": "atx"
},
"no-duplicate-heading": {
"siblings_only": true
},
"required-headings": false,
"ul-style": {
"style": "dash"
}
}

View File

@@ -9,21 +9,19 @@ VALIDATE_ALL_CODEBASE: true
FILEIO_REPORTER: false # Generate file.io report FILEIO_REPORTER: false # Generate file.io report
GITHUB_STATUS_REPORTER: true # Generate GitHub status report GITHUB_STATUS_REPORTER: true # Generate GitHub status report
IGNORE_GENERATED_FILES: true # Ignore generated files IGNORE_GENERATED_FILES: true # Ignore generated files
JAVASCRIPT_DEFAULT_STYLE: prettier # Default style for JavaScript
PRINT_ALPACA: false # Print Alpaca logo in console PRINT_ALPACA: false # Print Alpaca logo in console
SARIF_REPORTER: true # Generate SARIF report SARIF_REPORTER: true # Generate SARIF report
SHOW_SKIPPED_LINTERS: false # Show skipped linters in MegaLinter log SHOW_SKIPPED_LINTERS: false # Show skipped linters in MegaLinter log
TYPESCRIPT_DEFAULT_STYLE: prettier # Default style for TypeScript
DISABLE_LINTERS: DISABLE_LINTERS:
- REPOSITORY_DEVSKIM - REPOSITORY_DEVSKIM
- JAVASCRIPT_ES # using biome - JAVASCRIPT_ES
- JAVASCRIPT_PRETTIER # using biome
- TYPESCRIPT_PRETTIER # using biome
- JSON_PRETTIER # using biome
- PYTHON_BLACK # using ruff
- PYTHON_FLAKE8 # using ruff
- PYTHON_PYLINT # using ruff
- PYTHON_ISORT # using ruff (I rules)
YAML_YAMLLINT_CONFIG_FILE: .yamllint.yml YAML_YAMLLINT_CONFIG_FILE: .yamllint.yml
MARKDOWN_MARKDOWNLINT_CONFIG_FILE: .markdownlint.json
JAVASCRIPT_ES_CONFIG_FILE: .eslintrc.json
TYPESCRIPT_ES_CONFIG_FILE: .eslintrc.json
REPOSITORY_GIT_DIFF_DISABLE_ERRORS: true REPOSITORY_GIT_DIFF_DISABLE_ERRORS: true
BASH_SHFMT_ARGUMENTS: -i 2 -bn -ci -sr -fn
FILTER_REGEX_EXCLUDE: > FILTER_REGEX_EXCLUDE: >
(node_modules|tools|config/cheat/cheatsheets/community|config/cheat/cheatsheets/tldr|config/fzf|config/zsh|config/tmux/plugins) (node_modules|tools|config/cheat/cheatsheets/community|config/cheat/cheatsheets/tldr|config/fzf|config/zsh|config/tmux/plugins)

View File

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

1
.nvmrc Normal file
View File

@@ -0,0 +1 @@
24.11.0

View File

@@ -20,35 +20,22 @@ repos:
- id: end-of-file-fixer - id: end-of-file-fixer
- id: mixed-line-ending - id: mixed-line-ending
args: [--fix=auto] args: [--fix=auto]
- id: pretty-format-json
args: [--autofix, --no-sort-keys]
- repo: local - repo: https://github.com/igorshubovych/markdownlint-cli
rev: v0.45.0
hooks: hooks:
- id: biome-check - id: markdownlint
name: Biome Check args: [-c, .markdownlint.json, --fix]
entry: yarn biome check --write --files-ignore-unknown=true --no-errors-on-unmatched
language: system
files: \.(js|ts|jsx|tsx|json)$
- id: markdown-table-formatter
name: Markdown Table Formatter
entry: yarn markdown-table-formatter
language: system
types: [markdown]
- repo: https://github.com/adrienverge/yamllint - repo: https://github.com/adrienverge/yamllint
rev: v1.38.0 rev: v1.37.1
hooks: hooks:
- id: yamllint - id: yamllint
- repo: local - repo: https://github.com/koalaman/shellcheck-precommit
hooks: rev: v0.11.0
- id: prettier
name: Prettier (YAML)
entry: yarn prettier --write
language: system
types_or: [yaml]
- repo: https://github.com/shellcheck-py/shellcheck-py
rev: v0.11.0.1
hooks: hooks:
- id: shellcheck - id: shellcheck
@@ -56,28 +43,24 @@ repos:
rev: v3.12.0-2 rev: v3.12.0-2
hooks: hooks:
- id: shfmt - id: shfmt
args: [-i, "2", -bn, -ci, -sr, -fn, -w]
- repo: https://github.com/rhysd/actionlint - repo: https://github.com/rhysd/actionlint
rev: v1.7.11 rev: v1.7.8
hooks: hooks:
- id: actionlint - id: actionlint
- repo: https://github.com/renovatebot/pre-commit-hooks
rev: 42.2.0
hooks:
- id: renovate-config-validator
- repo: https://github.com/JohnnyMorganz/StyLua - repo: https://github.com/JohnnyMorganz/StyLua
rev: v2.4.0 rev: v2.3.1
hooks: hooks:
- id: stylua # or stylua-system / stylua-github - id: stylua # or stylua-system / stylua-github
exclude: hammerspoon\.types\.lua$
- repo: https://github.com/hugoh/pre-commit-fish.git - repo: https://github.com/hugoh/pre-commit-fish.git
rev: v1.2 rev: v1.2
hooks: hooks:
- id: fish_syntax - id: fish_syntax
- id: fish_indent - id: fish_indent
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.6
hooks:
- id: ruff-check
args: [--fix]
- id: ruff-format

View File

@@ -1,18 +1,16 @@
node_modules # vim: ft=gitignore
.yarn .mypy_cache/*
.pnp.*
.mypy_cache
Brewfile.lock.json Brewfile.lock.json
lazy-lock.json base/plan
config/cheat/cheatsheets/community config/cheat/cheatsheets/community
config/cheat/cheatsheets/tldr config/cheat/cheatsheets/tldr
config/fzf config/fzf/*
config/nvim config/nvim/*
config/op/plugins/used_plugins config/op/plugins/used_plugins/*
config/tmux/plugins config/tmux/plugins/*
config/vim/plugged config/zsh/*
config/zsh lazy-lock.json
local/bin/antigen.zsh local/bin/antigen.zsh
local/bin/asdf local/bin/asdf
tools tools/antidote/*
config/gh/hosts.yml tools/dotbot*

15
.prettierrc.js Normal file
View File

@@ -0,0 +1,15 @@
module.exports = {
...require('@ivuorinen/prettier-config'),
trailingComma: 'all',
// Add custom options below:
overrides: [
{
files: '*.md',
options: {
printWidth: 120,
proseWrap: 'preserve',
tabWidth: 2,
},
},
],
}

View File

@@ -1,9 +0,0 @@
{
"$schema": "https://json.schemastore.org/prettierrc",
"printWidth": 200,
"tabWidth": 2,
"useTabs": false,
"endOfLine": "lf",
"singleQuote": false,
"proseWrap": "preserve"
}

1
.python-version Normal file
View File

@@ -0,0 +1 @@
3.14.0

View File

@@ -50,11 +50,12 @@ 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 mise - **Dependencies**: Git, Homebrew, Yarn, various CLI tools managed via asdf/aqua
## Development Environment ## Development Environment
- Node.js, Go, Python, Ruby, Rust managed via mise - Node.js managed via nvm/asdf
- Version files (.nvmrc, .go-version, .python-version) consumed by mise via idiomatic_version_file - Go version specified (.go-version)
- 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/`, `mise/`, `aqua/` - Development environment tools - `direnv/`, `asdf/`, `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 files (consumed by mise) - `.nvmrc`, `.go-version`, `.python-version` - Version management
- Various ignore files (.gitignore, .prettierignore, .yamlignore, etc.) - Various ignore files (.gitignore, .prettierignore, .yamlignore, etc.)
## Testing Infrastructure ## Testing Infrastructure

View File

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

View File

@@ -1,4 +1,10 @@
--- # language of the project (csharp, python, rust, java, typescript, go, cpp, or ruby)
# * For C, use cpp
# * For JavaScript, use typescript
# Special requirements:
# * csharp: Requires the presence of a .sln file in the project folder.
language: bash
# whether to use the project's gitignore file to ignore files # whether to use the project's gitignore file to ignore files
# Added on 2025-04-07 # Added on 2025-04-07
ignore_all_files_in_gitignore: true ignore_all_files_in_gitignore: true
@@ -7,11 +13,11 @@ ignore_all_files_in_gitignore: true
# Was previously called `ignored_dirs`, please update your config if you are using that. # Was previously called `ignored_dirs`, please update your config if you are using that.
# Added (renamed) on 2025-04-07 # Added (renamed) on 2025-04-07
ignored_paths: ignored_paths:
- "*.swp" - '*.swp'
- "*.tmp" - '*.tmp'
- "*.tmp.*" - '*.tmp.*'
- ".DS_Store" - '.DS_Store'
- ".git/**" - '.git/**'
- /config/cheat/cheatsheets/community/** - /config/cheat/cheatsheets/community/**
- /config/cheat/cheatsheets/pure-bash-bible/** - /config/cheat/cheatsheets/pure-bash-bible/**
- /config/cheat/cheatsheets/tldr/** - /config/cheat/cheatsheets/tldr/**
@@ -79,82 +85,6 @@ excluded_tools: []
# initial prompt for the project. It will always be given to the LLM upon activating the project # initial prompt for the project. It will always be given to the LLM upon activating the project
# (contrary to the memories, which are loaded on demand). # (contrary to the memories, which are loaded on demand).
initial_prompt: "" initial_prompt: ''
# the name by which the project can be referenced within Serena
project_name: ".dotfiles"
# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default). project_name: '.dotfiles'
# This extends the existing inclusions (e.g. from the global configuration).
included_optional_tools: []
# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools.
# This cannot be combined with non-empty excluded_tools or included_optional_tools.
fixed_tools: []
# list of mode names to that are always to be included in the set of active modes
# The full set of modes to be activated is base_modes + default_modes.
# If the setting is undefined, the base_modes from the global configuration (serena_config.yml) apply.
# Otherwise, this setting overrides the global configuration.
# Set this to [] to disable base modes for this project.
# Set this to a list of mode names to always include the respective modes for this project.
base_modes:
# list of mode names that are to be activated by default.
# The full set of modes to be activated is base_modes + default_modes.
# If the setting is undefined, the default_modes from the global configuration (serena_config.yml) apply.
# Otherwise, this overrides the setting from the global configuration (serena_config.yml).
# This setting can, in turn, be overridden by CLI parameters (--mode).
default_modes:
# time budget (seconds) per tool call for the retrieval of additional symbol information
# such as docstrings or parameter information.
# This overrides the corresponding setting in the global configuration; see the documentation there.
# If null or missing, use the setting from the global configuration.
symbol_info_budget:
# The language backend to use for this project.
# If not set, the global setting from serena_config.yml is used.
# Valid values: LSP, JetBrains
# Note: the backend is fixed at startup. If a project with a different backend
# is activated post-init, an error will be returned.
language_backend:
# line ending convention to use when writing source files.
# Possible values: unset (use global setting), "lf", "crlf", or "native" (platform default)
# This does not affect Serena's own files (e.g. memories and configuration files), which always use native line endings.
line_ending:
# list of regex patterns which, when matched, mark a memory entry as readonly.
# Extends the list from the global configuration, merging the two lists.
read_only_memory_patterns: []
# the encoding used by text files in the project
# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings
encoding: utf-8
# list of languages for which language servers are started; choose from:
# al bash clojure cpp csharp
# csharp_omnisharp dart elixir elm erlang
# fortran fsharp go groovy haskell
# java julia kotlin lua markdown
# matlab nix pascal perl php
# php_phpactor powershell python python_jedi r
# rego ruby ruby_solargraph rust scala
# swift terraform toml typescript typescript_vts
# vue yaml zig
# (This list may be outdated. For the current list, see values of Language enum here:
# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py
# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.)
# Note:
# - For C, use cpp
# - For JavaScript, use typescript
# - For Free Pascal/Lazarus, use pascal
# Special requirements:
# Some languages require additional setup/installations.
# See here for details: https://oraios.github.io/serena/01-about/020_programming-languages.html#language-servers
# When using multiple languages, the first language server that supports a given file will be used for that file.
# The first language is the default language and the respective language server will be used as a fallback.
# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored.
languages:
- bash
- lua

View File

@@ -1,5 +0,0 @@
{
"sonarCloudOrganization": "ivuorinen",
"projectKey": "ivuorinen_dotfiles",
"region": "EU"
}

View File

@@ -1 +0,0 @@
nodeLinker: node-modules

55
AGENTS.md Normal file
View File

@@ -0,0 +1,55 @@
# 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 : -->

277
CLAUDE.md
View File

@@ -1,277 +0,0 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code)
when working with code in this repository.
## Repository Overview
Personal dotfiles repository for Ismo Vuorinen.
Uses **Dotbot** (not GNU Stow) to symlink configuration files into place.
The directory layout follows the XDG Base Directory Specification.
## Directory Layout and Linking
| Source | Destination | Notes |
|---------------------|-------------------|-------------------------------------------|
| `base/*` | `~/.*` | Home-level dotfiles (`.` added by Dotbot) |
| `config/*` | `~/.config/` | Application configurations |
| `local/bin/*` | `~/.local/bin/` | Helper scripts and utilities |
| `local/share/*` | `~/.local/share/` | Data files |
| `local/man/**` | `~/.local/man/` | Manual pages |
| `ssh/*` | `~/.ssh/` | SSH configuration (mode 0600) |
| `hosts/<hostname>/` | Overlays | Host-specific overrides |
Installation: `./install` runs Dotbot with `install.conf.yaml`,
then applies `hosts/<hostname>/install.conf.yaml` if it exists.
## Commands
```bash
# Install dependencies (required before lint/test)
yarn install
# Linting
yarn lint # Run biome + prettier + editorconfig-checker
yarn lint:biome # Biome only
yarn lint:ec # EditorConfig checker only
yarn lint:md-table # Markdown table formatting check
yarn fix:md-table # Auto-fix markdown tables
# Formatting
yarn fix:biome # Autofix with biome (JS/TS/JSON/MD)
yarn fix:prettier # Autofix with prettier (YAML)
yarn format # Format with biome
yarn format:yaml # Format YAML files with prettier
# Testing (Bats - Bash Automated Testing System)
yarn test # Run all tests in tests/
# Run a single test file:
./node_modules/.bin/bats tests/dfm.bats
# Shell linting
shellcheck <script> # Lint shell scripts
# Tooling maintenance
npx @biomejs/biome migrate --write # Update biome schema version
```
## Pre-commit Hooks
Configured in `.pre-commit-config.yaml`: shellcheck, shfmt, biome,
yamllint, prettier, actionlint, stylua, fish_syntax/fish_indent, ruff.
Run `pre-commit run --all-files` to check everything.
## Commit Convention
Semantic Commit messages: `type(scope): summary`
(e.g., `fix(tmux): correct prefix binding`).
Enforced by commitlint extending `@ivuorinen/commitlint-config`.
## Architecture
### Shell Configuration Chain
Both `base/bashrc` and `base/zshrc` source `config/shared.sh`,
which loads:
- `config/exports` — environment variables, XDG dirs, PATH
- `config/alias` — shell aliases
Zsh additionally uses **antidote** (in `tools/antidote/`)
for plugin management and **oh-my-posh** for the prompt.
### msgr — Messaging Helper
`local/bin/msgr` provides colored output functions (`msgr msg`,
`msgr run`, `msgr yay`, `msgr err`, `msgr warn`). Sourced by `dfm`
and most scripts in `local/bin/`.
### dfm — Dotfiles Manager
`local/bin/dfm` is the main management script. Key commands:
- `dfm install all` — install everything in tiered stages
- `dfm brew install` / `dfm brew update` — Homebrew management
- `dfm apt upkeep` — APT package maintenance (Debian/Ubuntu)
- `dfm dotfiles fmt` / `dfm dotfiles shfmt` — format configs/scripts
- `dfm helpers <name>` — inspect aliases, colors, env, functions, path
- `dfm docs all` — regenerate documentation under `docs/`
- `dfm check arch` / `dfm check host` — system info
- `dfm scripts` — run scripts from `scripts/` (discovered via `@description` tags)
- `dfm tests` — test visualization helpers
### mise — Unified Tool Manager
`config/mise/config.toml` manages language runtimes (Node LTS, Python 3,
Go latest, Rust stable) and CLI tools (fd, ripgrep, eza, neovim, delta,
zoxide, etc.). Activated via `eval "$(mise activate bash)"` in
`config/exports`. Run `mise install` after adding new tools.
### Submodules
External dependencies are git submodules (Dotbot, plugins,
tmux plugins, cheatsheets, antidote).
Managed by `add-submodules.sh`. All set to `ignore = dirty`.
Updated automatically via GitHub Actions on a schedule.
### Host-specific Configs
Machine-specific overrides live in `hosts/<hostname>/`
with their own `base/`, `config/`, and `install.conf.yaml`.
These are layered on top of the global config during installation.
## Code Style
- **EditorConfig**: 2-space indent, UTF-8, LF line endings.
See `.editorconfig` for per-filetype overrides
(4-space for PHP/fish, tabs for git config).
- **Shell scripts**: Must have a shebang or
`# shellcheck shell=bash` directive.
Follow shfmt settings in `.editorconfig`
(2-space indent, `binary_next_line`,
`switch_case_indent`, `space_redirects`, `function_next_line`).
- **Lua** (neovim config): Formatted with stylua (`stylua.toml`),
90-char line length.
- **JSON/JS/TS/Markdown**: Formatted with Biome (`biome.json`),
80-char width (Markdown uses 120-char override).
- **YAML**: Formatted with Prettier (`.prettierrc.json`),
validated with yamllint (`.yamllint.yml`).
## ShellCheck Disabled Rules
Defined in `.shellcheckrc`:
SC2039 (POSIX `local`), SC2166 (`-o` in test),
SC2154 (unassigned variables), SC1091 (source following),
SC2174 (mkdir -p -m), SC2016 (single-quote expressions).
## Gotchas
- **POSIX scripts**: `x-ssh-audit`, `x-codeql`, `x-until-error`,
`x-until-success`, `x-ssl-expiry-date` use `/bin/sh`.
Validate with `sh -n`, not `bash -n`.
- **Vendor file**: `local/bin/fzf-tmux` is vendored from
junegunn/fzf — do not modify.
- **Fish config**: `config/fish/` has its own config chain
(`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`,
`x-git-largest-files.py`) linted by Ruff (config in `pyproject.toml`).
- **Fish secrets**: `config/fish/secrets.d/*.fish` files are auto-sourced
by `exports.fish`. Copy `github.fish.example``github.fish` for local
secrets. These files are gitignored; only `*.example` and `README.md`
are tracked.
## Claude Code Configuration
- **Hooks** (`.claude/settings.json`):
- *PreToolUse*: Blocks edits to `fzf-tmux`, `yarn.lock`,
`.yarn/`, submodule paths, and real secrets.d files
- *PostToolUse*: Auto-formats files by extension
(shfmt, fish_indent, stylua, biome, prettier)
- *PostToolUse*: Validates Dotbot `install.conf.yaml`
after edits
- *PostToolUse*: Warns on formatter/linter config changes
- *Stop*: Runs `yarn lint` gate before finishing
- **Skills** (`.claude/skills/`):
- `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)
- `dotbot-validate`: Validates Dotbot install.conf.yaml
- `new-script`: Scaffolds helper scripts in local/bin/
- `new-fish-function`: Scaffolds fish functions
- `host-override`: Creates host-specific config overlays
- **Subagents** (`.claude/agents/`):
- `code-reviewer`: Reviews shell/fish/lua changes
- **Plugins** (required):
- `context-mode`: Context window protection — must be
installed for this repo. See routing rules below.
- `context7`: Live documentation lookup
## Package Manager
Yarn (v4+) 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`, `npm 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 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

@@ -5,8 +5,12 @@ git submodule sync --recursive
# dotbot and plugins # dotbot and plugins
git submodule add --name dotbot \ git submodule add --name dotbot \
-f https://github.com/anishathalye/dotbot.git tools/dotbot -f https://github.com/anishathalye/dotbot.git tools/dotbot
git submodule add --name dotbot-brew \
-f https://github.com/wren/dotbot-brew.git tools/dotbot-brew
git submodule add --name dotbot-include \ git submodule add --name dotbot-include \
-f https://gitlab.com/gnfzdz/dotbot-include.git tools/dotbot-include -f https://gitlab.com/gnfzdz/dotbot-include.git tools/dotbot-include
git submodule add --name dotbot-pip \
-f https://github.com/sobolevn/dotbot-pip.git tools/dotbot-pip
# other repos # other repos
git submodule add --name cheat-community \ git submodule add --name cheat-community \
@@ -20,12 +24,20 @@ git submodule add --name antidote \
# tmux plugin manager and plugins # tmux plugin manager and plugins
git submodule add --name tmux/tmux-continuum \ git submodule add --name tmux/tmux-continuum \
-f https://github.com/tmux-plugins/tmux-continuum config/tmux/plugins/tmux-continuum -f https://github.com/tmux-plugins/tmux-continuum config/tmux/plugins/tmux-continuum
git submodule add --name tmux/tmux-mode-indicator \
-f https://github.com/MunifTanjim/tmux-mode-indicator.git config/tmux/plugins/tmux-mode-indicator
git submodule add --name tmux/tmux-resurrect \ git submodule add --name tmux/tmux-resurrect \
-f https://github.com/tmux-plugins/tmux-resurrect.git config/tmux/plugins/tmux-resurrect -f https://github.com/tmux-plugins/tmux-resurrect.git config/tmux/plugins/tmux-resurrect
git submodule add --name tmux/tmux-sensible \
-f https://github.com/tmux-plugins/tmux-sensible.git config/tmux/plugins/tmux-sensible
git submodule add --name tmux/tmux-sessionist \ git submodule add --name tmux/tmux-sessionist \
-f https://github.com/tmux-plugins/tmux-sessionist.git config/tmux/plugins/tmux-sessionist -f https://github.com/tmux-plugins/tmux-sessionist.git config/tmux/plugins/tmux-sessionist
git submodule add --name tmux/tmux-suspend \ git submodule add --name tmux/tmux-suspend \
-f https://github.com/MunifTanjim/tmux-suspend.git config/tmux/plugins/tmux-suspend -f https://github.com/MunifTanjim/tmux-suspend.git config/tmux/plugins/tmux-suspend
git submodule add --name tmux/tmux-window-name \
-f https://github.com/ivuorinen/tmux-window-name.git config/tmux/plugins/tmux-window-name
git submodule add --name tmux/tmux-yank \
-f https://github.com/tmux-plugins/tmux-yank.git config/tmux/plugins/tmux-yank
git submodule add --name tmux/tmux-current-pane-hostname \ git submodule add --name tmux/tmux-current-pane-hostname \
-f https://github.com/soyuka/tmux-current-pane-hostname.git config/tmux/plugins/tmux-current-pane-hostname -f https://github.com/soyuka/tmux-current-pane-hostname.git config/tmux/plugins/tmux-current-pane-hostname
git submodule add --name tmux/tmux-dark-notify \ git submodule add --name tmux/tmux-dark-notify \
@@ -42,70 +54,21 @@ done
# Mark certain repositories shallow # Mark certain repositories shallow
git config -f .gitmodules submodule.antidote.shallow true git config -f .gitmodules submodule.antidote.shallow true
# Log a message using msgr if available, else echo # remove old submodules
_log() folders=(
{ "config/tmux/plugins/tpm"
local msg="$1" "config/tmux/plugins/tmux"
if command -v msgr > /dev/null 2>&1; then "config/tmux/plugins/tmux-menus"
msgr run_done "$msg" "tools/dotbot-crontab"
else "tools/dotbot-snap"
echo " [ok] $msg" "config/nvim-kickstart"
fi "local/bin/asdf"
return 0 "local/asdf"
} "tools/dotbot-asdf"
# Remove a stale git submodule and clean up references
remove_old_submodule()
{
local name="$1" path="$2"
# Remove working tree
if [[ -d "$path" ]]; then
rm -rf "$path"
_log "Removed $path"
fi
# Remove stale git index entry
git rm --cached "$path" 2> /dev/null || true
# Remove .git/config section keyed by path
git config --remove-section "submodule.$path" 2> /dev/null || true
# Skip name-based cleanup if no submodule name provided
[[ -z "$name" ]] && return 0
# Remove .git/config section keyed by name
git config --remove-section "submodule.$name" 2> /dev/null || true
# Remove .git/modules/<name>/ cached repository
if [[ -d ".git/modules/$name" ]]; then
rm -rf ".git/modules/$name"
_log "Removed .git/modules/$name"
fi
}
# remove old submodules (name:path pairs)
old_submodules=(
"tmux/tpm:config/tmux/plugins/tpm"
":config/tmux/plugins/tmux"
"tmux/tmux-menus:config/tmux/plugins/tmux-menus"
"dotbot-crontab:tools/dotbot-crontab"
"dotbot-snap:tools/dotbot-snap"
"tmux/tmux-window-name:config/tmux/plugins/tmux-window-name"
"tmux/tmux-sensible:config/tmux/plugins/tmux-sensible"
"tmux/tmux-mode-indicator:config/tmux/plugins/tmux-mode-indicator"
"tmux/tmux-yank:config/tmux/plugins/tmux-yank"
":config/tmux/plugins/tmux-fzf-url"
"nvim-kickstart:config/nvim-kickstart"
"asdf:local/bin/asdf"
"asdf:local/asdf"
"dotbot-asdf:tools/dotbot-asdf"
"dotbot-pip:tools/dotbot-pip"
"dotbot-brew:tools/dotbot-brew"
) )
for entry in "${old_submodules[@]}"; do for folder in "${folders[@]}"; do
name="${entry%%:*}" [ -d "$folder" ] \
path="${entry#*:}" && rm -rf "$folder" \
remove_old_submodule "$name" "$path" && msgr run_done "Removed old submodule $folder"
done done

View File

@@ -2,17 +2,20 @@
# shellcheck shell=bash # shellcheck shell=bash
export DOTFILES="$HOME/.dotfiles" export DOTFILES="$HOME/.dotfiles"
# Minimal PATH for x-have and utilities; full PATH set in shared.sh/exports
export PATH="$HOME/.local/bin:$DOTFILES/local/bin:$PATH" export PATH="$HOME/.local/bin:$DOTFILES/local/bin:$PATH"
export SHARED_SCRIPTS_SOURCED=0 export SHARED_SCRIPTS_SOURCED=0
source "$DOTFILES/config/shared.sh" source "$DOTFILES/config/shared.sh"
if [ -n "${GHOSTTY_RESOURCES_DIR}" ]; then
builtin source "${GHOSTTY_RESOURCES_DIR}/shell-integration/bash/ghostty.bash"
fi
# shellcheck source=../config/fzf/fzf.bash # shellcheck source=../config/fzf/fzf.bash
[ -f "${DOTFILES}/config/fzf/fzf.bash" ] && [ -f "${DOTFILES}/config/fzf/fzf.bash" ] &&
source "${DOTFILES}/config/fzf/fzf.bash" source "${DOTFILES}/config/fzf/fzf.bash"
# Import ssh keys in keychain (macOS-specific -A flag, silently fails on Linux) # Import ssh keys in keychain
ssh-add -A 2>/dev/null ssh-add -A 2>/dev/null
x-have antidot && { x-have antidot && {
@@ -22,3 +25,6 @@ x-have antidot && {
PROMPT_DIRTRIM=3 PROMPT_DIRTRIM=3
PROMPT_COMMAND='PS1_CMD1=$(git branch --show-current 2>/dev/null)' PROMPT_COMMAND='PS1_CMD1=$(git branch --show-current 2>/dev/null)'
PS1='\[\e[95m\]\u\[\e[0m\]@\[\e[38;5;22;2m\]\h\[\e[0m\] \[\e[38;5;33m\]\w\[\e[0m\] \[\e[92;2m\]${PS1_CMD1}\n\[\e[39m\]➜\[\e[0m\] ' PS1='\[\e[95m\]\u\[\e[0m\]@\[\e[38;5;22;2m\]\h\[\e[0m\] \[\e[38;5;33m\]\w\[\e[0m\] \[\e[92;2m\]${PS1_CMD1}\n\[\e[39m\]➜\[\e[0m\] '
# Added by LM Studio CLI (lms)
export PATH="$PATH:$HOME/.lmstudio/bin"

1
base/envrc Normal file
View File

@@ -0,0 +1 @@
use node

View File

@@ -2,14 +2,14 @@
-- These globals can be set and accessed: -- These globals can be set and accessed:
-- --
globals = { globals = {
"rawrequire", "rawrequire",
} }
-- --
-- These globals can only be accessed: -- These globals can only be accessed:
-- --
read_globals = { read_globals = {
"hs", "hs",
"ls", "ls",
"spoon", "spoon",
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -193,12 +193,11 @@ end)
-- Paste 1Password secret with Meh + P -- Paste 1Password secret with Meh + P
f18:bind({}, 'p', function() f18:bind({}, 'p', function()
local output, status = local output, status = hs.execute('op read "op://Svea/3hzhctmvovbwlgulv7mgy25rf4/login-input"', true)
hs.execute('op read "op://Svea/3hzhctmvovbwlgulv7mgy25rf4/login-input"', true)
if status then if status then
hs.eventtap.keyStrokes(output:gsub('%s+$', '')) -- trim trailing whitespace hs.eventtap.keyStrokes(output:gsub('%s+$', '')) -- trim trailing whitespace
else else
hs.alert.show '1Password CLI error' hs.alert.show('1Password CLI error')
end end
end) end)

View File

@@ -7,13 +7,18 @@
autoload -U promptinit; promptinit autoload -U promptinit; promptinit
export DOTFILES="$HOME/.dotfiles" export DOTFILES="$HOME/.dotfiles"
# Minimal PATH for x-have and utilities; full PATH set in shared.sh/exports LOCAL_SHARE="$HOME/.local/share"
export PATH="$HOME/.local/bin:$DOTFILES/local/bin:$PATH" export PATH="$HOME/.local/bin:$DOTFILES/local/bin:$LOCAL_SHARE/nvim/mason/bin:$LOCAL_SHARE/bob/nvim-bin:$LOCAL_SHARE/cargo/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
export SHARED_SCRIPTS_SOURCED=0 export SHARED_SCRIPTS_SOURCED=0
source "$DOTFILES/config/shared.sh" source "$DOTFILES/config/shared.sh"
# zsh completions directory (ZSH_CUSTOM_COMPLETION_PATH set in shared.sh) # zsh completions directory
[ -z "$ZSH_COMPLETIONS" ] && export ZSH_COMPLETIONS="$XDG_CONFIG_HOME/zsh/completion"
# Add zsh completions to FPATH, compinit will be called later
FPATH="$ZSH_COMPLETIONS:$FPATH"
ZSH_COMPDUMP="$XDG_CACHE_HOME/zsh/zcompdump-${SHORT_HOST}-${ZSH_VERSION}" ZSH_COMPDUMP="$XDG_CACHE_HOME/zsh/zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
source "$DOTFILES/config/zsh/antidote.zsh" source "$DOTFILES/config/zsh/antidote.zsh"
@@ -28,13 +33,33 @@ source_fzf_config()
fi fi
} }
# Function to set up tmux window name plugin if tmux is active
setup_tmux_window_name_plugin()
{
if [[ -n "$TMUX" ]]; then
local tmux_window_name_plugin="$TMUX_PLUGINS/tmux-window-name/scripts/rename_session_windows.py"
if [[ -f "$tmux_window_name_plugin" ]]; then
tmux_window_name()
{
($tmux_window_name_plugin &)
}
add-zsh-hook chpwd tmux_window_name
tmux_window_name
fi
fi
}
source_fzf_config source_fzf_config
setup_tmux_window_name_plugin
x-have antidot && eval "$(antidot init)" x-have antidot && eval "$(antidot init)"
autoload -Uz compinit bashcompinit autoload -Uz compinit bashcompinit
compinit -d "$ZSH_COMPDUMP" compinit -d $ZSH_COMPDUMP
bashcompinit bashcompinit
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh. # To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
export P10K_CONFIG="$DOTFILES/config/zsh/p10k.zsh" export P10K_CONFIG="$DOTFILES/config/zsh/p10k.zsh"
[[ ! -f "$P10K_CONFIG" ]] || source "$P10K_CONFIG" [[ ! -f "$P10K_CONFIG" ]] || source "$P10K_CONFIG"
# Added by LM Studio CLI (lms)
export PATH="$PATH:$HOME/.lmstudio/bin"

View File

@@ -1,104 +0,0 @@
{
"$schema": "https://biomejs.dev/schemas/2.4.7/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true,
"defaultBranch": "main"
},
"files": {
"ignoreUnknown": true,
"includes": [
"**",
"!!**/.mypy_cache",
"!!**/Brewfile.lock.json",
"!!**/base/plan",
"!!**/config/cheat/cheatsheets/community",
"!!**/config/cheat/cheatsheets/tldr",
"!!**/config/fzf",
"!!**/config/nvim",
"!!**/config/op/plugins/used_plugins",
"!!**/config/tmux/plugins",
"!!**/config/zsh",
"!!**/config/karabiner",
"!!**/config/vim",
"!!**/lazy-lock.json",
"!!**/local/bin/antigen.zsh",
"!!**/local/bin/asdf",
"!!**/tools/antidote",
"!!**/tools/dotbot",
"!!**/node_modules"
]
},
"formatter": {
"enabled": true,
"formatWithErrors": false,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 80
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {
"noUnusedVariables": "warn",
"noUnusedImports": "warn"
},
"style": {
"useConst": "warn",
"useTemplate": "warn"
},
"suspicious": {
"noExplicitAny": "warn",
"noConsole": "off"
}
}
},
"javascript": {
"formatter": {
"enabled": true,
"quoteStyle": "single",
"jsxQuoteStyle": "double",
"trailingCommas": "all",
"semicolons": "asNeeded",
"arrowParentheses": "always",
"bracketSpacing": true,
"bracketSameLine": false,
"quoteProperties": "asNeeded",
"indentStyle": "space",
"indentWidth": 2
}
},
"json": {
"parser": {
"allowComments": true,
"allowTrailingCommas": false
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 80
}
},
"overrides": [
{
"includes": ["*.md", "*.mdx"],
"formatter": {
"enabled": true,
"lineWidth": 120
}
},
{
"includes": ["package.json"],
"json": {
"formatter": {
"enabled": true,
"indentWidth": 2
}
}
}
]
}

View File

@@ -0,0 +1,251 @@
# Start AeroSpace at login
start-at-login = false
# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization
enable-normalization-flatten-containers = true
enable-normalization-opposite-orientation-for-nested-containers = true
# See: https://nikitabobko.github.io/AeroSpace/guide#layouts
# The 'accordion-padding' specifies the size of accordion padding
# You can set 0 to disable the padding feature
accordion-padding = 10
# Possible values: tiles|accordion
default-root-container-layout = 'tiles'
# Possible values: horizontal|vertical|auto
# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation,
# tall monitor (anything higher than wide) gets vertical orientation
default-root-container-orientation = 'auto'
# Mouse follows focus when focused monitor changes
# Drop it from your config, if you don't like this behavior
# See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks
# See https://nikitabobko.github.io/AeroSpace/commands#move-mouse
# Fallback value (if you omit the key): on-focused-monitor-changed = []
on-focused-monitor-changed = ['move-mouse monitor-lazy-center']
# You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag
# Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key
# Also see: https://nikitabobko.github.io/AeroSpace/goodness#disable-hide-app
automatically-unhide-macos-hidden-apps = true
# [[on-window-detected]]
# if.app-id = 'com.apple.systempreferences'
# if.app-name-regex-substring = 'settings'
# if.window-title-regex-substring = 'substring'
# if.workspace = 'workspace-name'
# if.during-aerospace-startup = true
# check-further-callbacks = true
# run = ['layout floating', 'move-node-to-workspace S'] # The callback itself
[[on-window-detected]]
if.app-name-regex-substring = 'settings' # All settings
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.apple.systempreferences' # macOS System Preferences
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.1password.1password' # 1Password
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'org.ferdium.ferdium-app' # Ferdium, has WhatsApp etc.
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.jetbrains.PhpStorm' # PhpStorm
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.apple.finder' # Finder
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.apple.Preview' # Preview
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.apple.mail' # Mail
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.DanPristupov.Fork' # Fork
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.flexibits.fantastical2.mac' # Fantastical
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'org.whispersystems.signal-desktop' # Signal
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.tidal.desktop' # TIDAL
run = ['layout floating', 'move-node-to-workspace 2'] # Float and move to workspace 2
[[on-window-detected]]
if.app-id = 'com.apple.TV' # Apple TV app
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.setapp.DesktopClient' # Setapp
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.electron.dockerdesktop' # Docker Desktop
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.tinyspeck.slackmacgap' # Slack
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'md.obsidia' # Obsidian
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.todoist.mac.Todoist' # Todoist
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.apple.backup.launcher' # TimeMachine
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.philipyoungg.session-setapp' # Session app (Setapp)
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.microsoft.rdc.macos' # Remote Desktop
run = ['layout floating']
# Possible values: (qwerty|dvorak)
# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping
[key-mapping]
preset = 'qwerty'
# Gaps between windows (inner-*) and between monitor edges (outer-*).
# Possible values:
# - Constant: gaps.outer.top = 8
# - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24]
# In this example, 24 is a default value when there is no match.
# Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'.
# See: https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors
[gaps]
inner.horizontal = 5
inner.vertical = 5
outer.top = [{ monitor.'^built-in retina display$' = 0 }, 0]
outer.right = 0
outer.bottom = 0
outer.left = 0
# 'main' binding mode declaration
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
# 'main' binding mode must be always presented
# Fallback value (if you omit the key): mode.main.binding = {}
[mode.main.binding]
cmd-h = [] # Disable "hide application"
cmd-alt-h = [] # Disable "hide others"
# All possible keys:
# - Letters. a, b, c, ..., z
# - Numbers. 0, 1, 2, ..., 9
# - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9
# - F-keys. f1, f2, ..., f20
# - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon, backtick,
# leftSquareBracket, rightSquareBracket, space, enter, esc, backspace, tab
# - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual,
# keypadMinus, keypadMultiply, keypadPlus
# - Arrows. left, down, up, right
# All possible modifiers: cmd, alt, ctrl, shift
# All possible commands: https://nikitabobko.github.io/AeroSpace/commands
# See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget
# You can uncomment the following lines to open up terminal with alt + enter shortcut (like in i3)
# alt-enter = '''exec-and-forget osascript -e '
# tell application "Terminal"
# do script
# activate
# end tell'
# '''
# alt-cmd-shift-f = 'fullscreen'
# alt-shift-f = 'layout floating'
# alt-shift-tab = 'move-workspace-to-monitor --wrap-around next'
# See: https://nikitabobko.github.io/AeroSpace/commands#focus
alt-h = 'focus left'
alt-j = 'focus down'
alt-k = 'focus up'
alt-l = 'focus right'
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace
alt-shift-1 = 'workspace 1' # Main
alt-shift-2 = 'workspace 2' # Media
ctrl-shift-1 = 'move-node-to-workspace 1' # Move node to Main
ctrl-shift-2 = 'move-node-to-workspace 2' # Move node to Media
alt-shift-tab = 'workspace-back-and-forth' # Switch between workspaces
ctrl-shift-tab = 'move-workspace-to-monitor --wrap-around prev'
# See: https://nikitabobko.github.io/AeroSpace/commands#mode
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
alt-a = 'mode apps'
alt-s = 'mode service'
alt-m = 'mode move'
# ╭──────────────────────────────────────────────────────────╮
# │ alt-m │
# ╰──────────────────────────────────────────────────────────╯
[mode.move.binding]
esc = ['reload-config', 'mode main']
# See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace
1 = ['move-node-to-workspace 1 --focus-follows-window']
2 = ['move-node-to-workspace 2 --focus-follows-window']
# See: https://nikitabobko.github.io/AeroSpace/commands#move
h = 'move left'
j = 'move down'
k = 'move up'
l = 'move right'
# See: https://nikitabobko.github.io/AeroSpace/commands#join-with
shift-h = 'join-with left'
shift-j = 'join-with down'
shift-k = 'join-with up'
shift-l = 'join-with right'
# https://nikitabobko.github.io/AeroSpace/commands#resize
ctrl-h = 'resize smart -70'
ctrl-l = 'resize smart +70'
shift-left = 'resize smart +70'
shift-right = 'resize smart -70'
# https://nikitabobko.github.io/AeroSpace/commands#flatten-workspace-tree
r = ['flatten-workspace-tree', 'mode main'] # reset layout
# ╭──────────────────────────────────────────────────────────╮
# │ alt-a │
# ╰──────────────────────────────────────────────────────────╯
[mode.apps.binding]
esc = ['reload-config', 'mode main']
b = ['exec-and-forget open -a /Applications/Brave Browser.app', 'mode main'] # Browser
c = ['exec-and-forget open -a /Applications/Ferdium.app', 'mode main'] # Chat
g = ['exec-and-forget open -a /Applications/Ghostty.app', 'mode main'] # Ghostty
o = ['exec-and-forget open -a /Applications/Obsidian.app', 'mode main'] # Obsidian
s = ['exec-and-forget open -a /Applications/Slack.app', 'mode main'] # Slack
t = ['exec-and-forget open -a /Applications/TIDAL.app', 'mode main'] # Tidal
w = ['exec-and-forget open -a /Applications/WezTerm.app', 'mode main'] # WezTerm
# ╭──────────────────────────────────────────────────────────╮
# │ alt-s │
# ╰──────────────────────────────────────────────────────────╯
[mode.service.binding]
esc = ['reload-config', 'mode main'] # reload config
r = ['flatten-workspace-tree', 'mode main'] # reset layout
# See: https://nikitabobko.github.io/AeroSpace/commands#layout
f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout
backspace = ['close-all-windows-but-current', 'mode main']

View File

@@ -1,3 +1,8 @@
import = [
# Default to night if the copied one doesn't exist.
"~/.dotfiles/config/alacritty/theme-night.toml",
"~/.config/alacritty/theme-active.toml"
]
[env] [env]
TERM = "xterm-256color" TERM = "xterm-256color"
@@ -45,10 +50,3 @@ lines = 75
[window.padding] [window.padding]
x = 5 x = 5
y = 5 y = 5
[general]
import = [
# Default to night if the copied one doesn't exist.
"~/.dotfiles/config/alacritty/theme-night.toml",
"~/.config/alacritty/theme-active.toml"
]

View File

@@ -7,6 +7,8 @@ x-have eza && {
alias ls="eza -h -s=type --git --icons --group-directories-first" alias ls="eza -h -s=type --git --icons --group-directories-first"
} }
alias vim='vim -u "$XDG_CONFIG_HOME/vim/vimrc"'
# Easier navigation: .., ..., .... # Easier navigation: .., ..., ....
alias ..="cd .." alias ..="cd .."
alias ...="cd ../.." alias ...="cd ../.."
@@ -33,8 +35,6 @@ 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

@@ -93,13 +93,13 @@ expand-main:
# Note that not all layouts respond to this command. # Note that not all layouts respond to this command.
increase-main: increase-main:
mod: mod1 mod: mod1
key: "," key: ','
# Decrease the number of windows in the main pane. # Decrease the number of windows in the main pane.
# Note that not all layouts respond to this command. # Note that not all layouts respond to this command.
decrease-main: decrease-main:
mod: mod1 mod: mod1
key: "." key: '.'
# General purpose command for custom layouts. # General purpose command for custom layouts.
# Functionality is layout-dependent. # Functionality is layout-dependent.

View File

@@ -6,19 +6,21 @@
* *
* @param {Object} windows - All windows in the current space. * @param {Object} windows - All windows in the current space.
* @param {Object} screenFrame - The frame of the current screen. * @param {Object} screenFrame - The frame of the current screen.
* @param {Object} state - The state of the current space.
* @param {Object} extendedFrames - The frames of the windows in the current space.
* @return {Object} - The frames for the windows in the current space. * @return {Object} - The frames for the windows in the current space.
*/ */
function layout() { function layout() {
return { return {
name: 'Almost Maximize', name: 'Almost Maximize',
getFrameAssignments: (windows, screenFrame) => { getFrameAssignments: (windows, screenFrame, state, extendedFrames) => {
const width = screenFrame.width * 0.95 const width = screenFrame.width * 0.95
const height = screenFrame.height * 0.95 const height = screenFrame.height * 0.95
const x = (screenFrame.width - width) / 2 const x = (screenFrame.width - width) / 2
const y = (screenFrame.height - height) / 2 const y = (screenFrame.height - height) / 2
const windowFrames = {} const windowFrames = {}
windows.forEach((window) => { windows.forEach(window => {
windowFrames[window.id] = { windowFrames[window.id] = {
Y: screenFrame.y + y, Y: screenFrame.y + y,
x: screenFrame.x + x, x: screenFrame.x + x,
@@ -31,5 +33,3 @@ function layout() {
}, },
} }
} }
module.exports = layout()

15
config/aqua/aqua.yaml Normal file
View File

@@ -0,0 +1,15 @@
---
# yaml-language-server: $schema=https://raw.githubusercontent.com/aquaproj/aqua/main/json-schema/aqua-yaml.json
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
# enabled: true
# require_checksum: true
# supported_envs:
# - all
registries:
- type: standard
ref: v4.346.0 # renovate: depName=aquaproj/aqua-registry
packages:
- name: cli/cli
version: 'v2.69.0'

5
config/asdf/asdfrc Normal file
View File

@@ -0,0 +1,5 @@
# See the docs for explanations: https://asdf-vm.com/manage/configuration.html
legacy_version_file=yes
use_release_candidates=no
concurrency=auto

View File

@@ -0,0 +1,27 @@
// A cargo subcommand for checking and applying
// updates to installed executables
cargo-update
// Cargo cache management utility
cargo-cache
// An incremental parsing system for programming tools
tree-sitter-cli
// a subprocess caching utility
bkt
// a structural diff that understands syntax
difftastic
// A simple, fast and user-friendly alternative to 'find'
fd-find
// recursively searches directories for a
// regex pattern while respecting your gitignore
ripgrep
// A version manager for neovim
bob-nvim
// bottom, btm - A cross-platform graphical process/system monitor with
// a customizable interface and a multitude of features.
bottom
// A modern alternative to ls
eza
// Tmux Sessionizer: A tool for opening git repositories as tmux sessions
tmux-sessionizer
// zoxide, a smarter cd command
zoxide

1
config/asdf/gem-packages Normal file
View File

@@ -0,0 +1 @@
bundler

View File

@@ -0,0 +1,27 @@
// These are golang packages I use,
// so they should be available with all versions
// Git Profile allows you to switch between user profiles in git repos
github.com/dotzero/git-profile@latest
// An extensible command line tool or library to format yaml files.
github.com/google/yamlfmt/cmd/yamlfmt@latest
// Parsing HTML at the command line
github.com/ericchiang/pup@latest
// HTML to Markdown converter
github.com/suntong/html2md@latest
// cheat allows you to create and view interactive cheatsheets on the cli.
github.com/cheat/cheat/cmd/cheat@latest
// Render markdown on the CLI, with pizzazz! 💅
github.com/charmbracelet/glow@latest
// Static checker for GitHub Actions workflow files
github.com/rhysd/actionlint/cmd/actionlint@latest
// Cleans up your $HOME from those pesky dotfiles
github.com/doron-cohen/antidot@latest
// FZF is a general-purpose command-line fuzzy finder.
github.com/junegunn/fzf@latest
// gopls, the Go language server
golang.org/x/tools/gopls@latest
// A language for writing HTML user interfaces in Go.
github.com/a-h/templ/cmd/templ@latest
// A terminal session manager
github.com/joshmedeski/sesh/v2@latest

7
config/asdf/npm-packages Normal file
View File

@@ -0,0 +1,7 @@
blade-formatter
corepack
editorconfig-checker
github-release-notes
neovim
npm
stylelint-lsp

View File

@@ -0,0 +1,20 @@
1password-cli https://github.com/NeoHsu/asdf-1password-cli.git f5d5aab
age https://github.com/threkk/asdf-age.git 396bdf6
asdf-plugin-manager https://github.com/asdf-community/asdf-plugin-manager.git b5862c1
direnv https://github.com/asdf-community/asdf-direnv.git 6ff3dbe
dotenv-linter https://github.com/wesleimp/asdf-dotenv-linter.git 1369f53
editorconfig-checker https://github.com/gabitchov/asdf-editorconfig-checker.git 585c1d5
fd https://gitlab.com/wt0f/asdf-fd.git 17d56e0
github-cli https://github.com/bartlomiejdanek/asdf-github-cli.git e0605b7
golang https://github.com/asdf-community/asdf-golang.git e2527a3
hadolint https://github.com/devlincashman/asdf-hadolint.git c8eb88b
kubectl https://github.com/asdf-community/asdf-kubectl.git 2fb3b57
pre-commit https://github.com/jonathanmorley/asdf-pre-commit.git 26bfc42
ripgrep https://gitlab.com/wt0f/asdf-ripgrep.git e836665
rust https://github.com/code-lever/asdf-rust.git 95acf4f
shellcheck https://github.com/luizm/asdf-shellcheck.git 66200ff
shfmt https://github.com/luizm/asdf-shfmt.git a42c5ff
terragrunt https://github.com/ohmer/asdf-terragrunt.git 29f2935
tf-summarize https://github.com/adamcrews/asdf-tf-summarize.git 880ad26
yamllint https://github.com/ericcornelissen/asdf-yamllint.git e4cfb17
yq https://github.com/sudermanjr/asdf-yq.git 772992f

View File

@@ -0,0 +1,4 @@
ansible
pipenv
neovim
libtmux

12
config/direnv/direnv.toml Normal file
View File

@@ -0,0 +1,12 @@
[global]
disable_stdin = false
load_dotenv = true
hide_env_diff = false
[whitelist]
prefix = [
"~/Code/"
]
exact = [
"~/.dotfiles/.envrc"
]

View File

@@ -0,0 +1,6 @@
### Do not edit. This was autogenerated by 'asdf direnv setup' ###
# shellcheck shell=bash
use_asdf()
{
source_env "$(asdf direnv envrc "$@")"
}

View File

@@ -4,30 +4,17 @@
# Set XDG directories if not already set # Set XDG directories if not already set
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html # https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
[ -z "${XDG_CONFIG_HOME:-}" ] && export XDG_CONFIG_HOME="$HOME/.config" [ -z "$XDG_CONFIG_HOME" ] && export XDG_CONFIG_HOME="$HOME/.config"
[ -z "${XDG_DATA_HOME:-}" ] && export XDG_DATA_HOME="$HOME/.local/share" [ -z "$XDG_DATA_HOME" ] && export XDG_DATA_HOME="$HOME/.local/share"
[ -z "${XDG_CACHE_HOME:-}" ] && export XDG_CACHE_HOME="$HOME/.cache" [ -z "$XDG_CACHE_HOME" ] && export XDG_CACHE_HOME="$HOME/.cache"
[ -z "${XDG_STATE_HOME:-}" ] && export XDG_STATE_HOME="$HOME/.local/state" [ -z "$XDG_STATE_HOME" ] && export XDG_STATE_HOME="$HOME/.local/state"
[ -z "${XDG_BIN_HOME:-}" ] && export XDG_BIN_HOME="$HOME/.local/bin" [ -z "$XDG_BIN_HOME" ] && export XDG_BIN_HOME="$HOME/.local/bin"
[ -z "${XDG_RUNTIME_DIR:-}" ] && export XDG_RUNTIME_DIR="$HOME/.local/run" [ -z "$XDG_RUNTIME_DIR" ] && export XDG_RUNTIME_DIR="$HOME/.local/run"
# 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"
# Editor settings 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"
[ -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
@@ -163,7 +150,6 @@ commit()
git commit -a -m "$commitMessage" git commit -a -m "$commitMessage"
} }
# Run Laravel scheduler in a loop
scheduler() scheduler()
{ {
while :; do while :; do
@@ -296,8 +282,7 @@ export LESSHISTFILE="$XDG_STATE_HOME"/less/history
export MANPAGER="less -X" export MANPAGER="less -X"
# Always enable colored `grep` output # Always enable colored `grep` output
# Note: GREP_OPTIONS is deprecated since GNU grep 2.21 export GREP_OPTIONS="--color=auto"
# Color is handled via alias in config/alias
# check the window size after each command and, if necessary, # check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS. # update the values of LINES and COLUMNS.
@@ -317,7 +302,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="$ANSIBLE_HOME/ansible.cfg" export ANSIBLE_CONFIG="$XDG_CONFIG_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"
@@ -338,25 +323,10 @@ 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
# Mason (nvim package manager) # bob manages nvim versions
msg "Setting up Mason configuration" msg "Setting up bob configuration"
export MASON_HOME="$XDG_DATA_HOME/nvim/mason" x-path-prepend "$XDG_DATA_HOME/bob/nvim-bin"
# 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"
@@ -378,9 +348,11 @@ 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 # direnv, https://direnv.net/
msg "Setting up Yarn configuration" # https://direnv.net/docs/hook.html
export YARN_GLOBAL_FOLDER="$XDG_DATA_HOME/yarn" # Set the hook to show the direnv message in a different color
# export DIRENV_LOG_FORMAT=$'\033[2mdirenv: %s\033[0m'
export DIRENV_LOG_FORMAT=
# 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"
@@ -388,11 +360,6 @@ 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"
@@ -412,6 +379,13 @@ 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"
@@ -421,21 +395,25 @@ 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 CARGO_HOME="$XDG_DATA_HOME/cargo" export RUST_WITHOUT=rust-docs
export CARGO_BIN_HOME="$XDG_BIN_HOME"
export RUSTUP_HOME="$XDG_DATA_HOME/rustup"
export RUST_WITHOUT="clippy,docs,rls"
# Poetry # screen
msg "Setting up Poetry configuration" # https://www.gnu.org/software/screen/manual/screen.html
export POETRY_HOME="$XDG_DATA_HOME/poetry" msg "Setting up screen configuration"
export SCREENRC="$XDG_CONFIG_HOME/misc/screenrc"
# sonarlint # sonarlint
# https://www.sonarlint.org/ # https://www.sonarlint.org/
@@ -464,51 +442,23 @@ 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) # tms, https://github.com/jrmoulton/tmux-sessionizer
msg "Setting up tms configuration" export TMS_CONFIG_FILE="${XDG_CONFIG_HOME}/tms/config.toml"
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"
x-dc "$WAKATIME_HOME" x-dc "$WAKATIME_HOME"
# LM Studio CLI
msg "Setting up LM Studio configuration"
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) [ -f "$XDG_CONFIG_HOME/exports-secret" ] && source "$XDG_CONFIG_HOME/exports-secret"
[ -d "$XDG_DATA_HOME/mise/shims" ] && export PATH="$XDG_DATA_HOME/mise/shims:$PATH" [ -f "$XDG_CONFIG_HOME/exports-local" ] && source "$XDG_CONFIG_HOME/exports-local"
[ -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
eval "$(mise activate bash)"
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
# shellcheck source=./exports-lakka # shellcheck source=./exports-lakka
if [ -f "$XDG_CONFIG_HOME/exports-$(hostname)" ]; then source "$XDG_CONFIG_HOME/exports-$(hostname)"; fi [ -f "$XDG_CONFIG_HOME/exports-$(hostname)" ] && source "$XDG_CONFIG_HOME/exports-$(hostname)"
# shellcheck source=./exports-lakka-secret # shellcheck source=./exports-lakka-secret
if [ -f "$XDG_CONFIG_HOME/exports-$(hostname)-secret" ]; then source "$XDG_CONFIG_HOME/exports-$(hostname)-secret"; fi [ -f "$XDG_CONFIG_HOME/exports-$(hostname)-secret" ] && source "$XDG_CONFIG_HOME/exports-$(hostname)-secret"

View File

@@ -8,6 +8,7 @@ fi
export PATH="$HOME/.local/go/bin:$PATH" export PATH="$HOME/.local/go/bin:$PATH"
alias logrotate='/usr/sbin/logrotate -s "$HOME/logs/state"' alias logrotate='/usr/sbin/logrotate -s "$HOME/logs/state"'
alias nano='nano -wS -$'
alias gpg=gpg2 alias gpg=gpg2
ACME_PATH="$HOME/.acme.sh" ACME_PATH="$HOME/.acme.sh"

View File

@@ -1,3 +1,5 @@
#!/usr/bin/env bash
#
# This file is secret and wont be added to the git repo. # This file is secret and wont be added to the git repo.
export GITLAB_API_TOKEN="" export GITLAB_API_TOKEN=""

View File

@@ -1,9 +1,6 @@
# Set aliases for fish shell # Set aliases for fish shell
if type -q nvim alias vim='vim -u "$XDG_CONFIG_HOME/vim/vimrc"'
alias vim='nvim'
alias vi='nvim'
end
# eza aliases if eza is installed # eza aliases if eza is installed
if type -q eza >/dev/null if type -q eza >/dev/null
@@ -33,19 +30,6 @@ if type -q eza >/dev/null
function l --wraps='eza_git' --description eza function l --wraps='eza_git' --description eza
eza_git $argv eza_git $argv
end end
else
function ls --description 'ls (system fallback)'
command ls $argv
end
function ll --description 'ls -lh (system fallback)'
command ls -lh $argv
end
function l --description 'ls (system fallback)'
command ls $argv
end
function lsa --description 'ls -lah (system fallback)'
command ls -lah $argv
end
end end
# Edit fish alias file # Edit fish alias file
@@ -108,43 +92,5 @@ 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
if type -q onefetch abbr --add stats onefetch --nerd-fonts --true-color never
abbr --add stats onefetch --nerd-fonts --true-color never
end

View File

@@ -0,0 +1,71 @@
# @halostatue/fish-macos/completions/app.fish:v7.0.1
complete --command app --erase
complete --command app --arguments bundleid \
--exclusive --condition __fish_use_subcommand \
--description 'Show bundle IDs for macOS apps'
complete --command app --arguments find \
--exclusive --condition __fish_use_subcommand \
--description 'Find macOS apps by pattern'
complete --command app --arguments frontmost \
--exclusive --condition __fish_use_subcommand \
--description 'Shows the front-most application'
complete --command app --arguments icon \
--exclusive --condition __fish_use_subcommand \
--description 'Extracts a MacOS app icon as a png file'
complete --command app --arguments quit \
--exclusive --condition __fish_use_subcommand \
--description 'Quit macOS apps by pattern'
for subcommand in bundleid find
complete --command app --condition '__fish_seen_subcommand_from '$subcommand \
--short-option x --long-option exact --description 'Exact matches only'
complete --command app --condition '__fish_seen_subcommand_from '$subcommand \
--short-option a --long-option all --description 'Show all matches'
complete --command app --condition '__fish_seen_subcommand_from '$subcommand \
--short-option q --long-option quiet --description 'Quiet (show no output)'
complete --command app --condition '__fish_seen_subcommand_from '$subcommand \
--short-option h --long-option help --description 'Help for app '$subcommand
end
complete --command app --condition '__fish_seen_subcommand_from 'bundleid \
--short-option s --long-option short --description 'Show only the bundle ID'
complete --command app --condition '__fish_seen_subcommand_from 'frontmost \
--short-option b --long-option bundle-id --description 'Shows the app bundle ID'
complete --command app --condition '__fish_seen_subcommand_from 'frontmost \
--short-option p --long-option path --description 'Shows the app path'
complete --command app --condition '__fish_seen_subcommand_from 'frontmost \
--short-option n --long-option name --description 'Shows the app name'
complete --command app --condition '__fish_seen_subcommand_from 'frontmost \
--short-option P --long-option pid --description 'Shows the PID of the app'
complete --command app --condition '__fish_seen_subcommand_from 'frontmost \
--short-option a --long-option all --description 'Shows all details'
complete --command app --condition '__fish_seen_subcommand_from 'frontmost \
--short-option h --long-option help --description 'Help for app 'frontmost
complete --command app --condition '__fish_seen_subcommand_from 'icon \
--short-option x --long-option exact --description 'Exact matches only'
complete --command app --condition '__fish_seen_subcommand_from 'icon \
--short-option o --long-option output --description 'Extracts to this file or directory' \
--force-files
complete --command app --condition '__fish_seen_subcommand_from 'icon \
--short-option w --long-option width --description 'Uses this pixel width' \
--no-files
complete --command app --condition '__fish_seen_subcommand_from 'icon \
--short-option h --long-option help --description 'Help for app 'icon
complete --command app --condition '__fish_seen_subcommand_from 'quit \
--short-option x --long-option exact --description 'Exact matches only'
complete --command app --condition '__fish_seen_subcommand_from 'quit \
--short-option r --long-option restart --description 'Restart after quit'
complete --command app --condition '__fish_seen_subcommand_from 'quit \
--short-option h --long-option help --description 'Help for app 'quit

0
config/fish/completions/docker.fish Normal file → Executable file
View File

View File

@@ -0,0 +1,70 @@
# @halostatue/fish-macos/completions/finder.fish:v7.0.1
complete --command finder --erase
complete --command finder --arguments track \
--exclusive --condition __fish_use_subcommand \
--description 'Enables Finder PWD tracking'
complete --command finder --arguments untrack \
--exclusive --condition __fish_use_subcommand \
--description 'Disables Finder PWD tracking'
complete --command finder --arguments pwd \
--exclusive --condition __fish_use_subcommand \
--description 'Prints the path of the Finder window'
complete --command finder --arguments cd \
--exclusive --condition __fish_use_subcommand \
--description 'Changes to the path of the Finder window'
complete --command finder --arguments pushd \
--exclusive --condition __fish_use_subcommand \
--description 'Pushes to the path of the Finder window'
complete --command finder --arguments update \
--exclusive --condition __fish_use_subcommand \
--description 'Updates the Finder to PWD'
complete --command finder --arguments list \
--exclusive --condition __fish_use_subcommand \
--description 'Sets Finder to list view with PWD'
complete --command finder --arguments icon \
--exclusive --condition __fish_use_subcommand \
--description 'Sets Finder to icon view with PWD'
complete --command finder --arguments column \
--exclusive --condition __fish_use_subcommand \
--description 'Sets Finder to column view with PWD'
complete --command finder --arguments hidden \
--exclusive --condition __fish_use_subcommand \
--description 'Shows or hides `hidden` files'
complete --command finder --arguments desktop-icons \
--exclusive --condition __fish_use_subcommand \
--description 'Shows or hides desktop icons'
complete --command finder --arguments clean \
--exclusive --condition __fish_use_subcommand \
--description 'Cleans .DS_Store files'
complete --command finder --arguments quarantine \
--exclusive --condition __fish_use_subcommand \
--description 'Works with file quarantine data'
complete --command finder --arguments selected \
--exclusive --condition __fish_use_subcommand \
--description 'Print Finder selected files'
for subcommand in cd clean column desktop-icons hidden icon list pushd pwd quarantine selected track untrack update
complete --command finder --condition '__fish_seen_subcommand_from '$subcommand \
--short-option h --long-option help --description 'Help for finder '$subcommand
end
for subcommand in hidden desktop-icons
complete --command finder --condition '__fish_seen_subcommand_from '$subcommand \
--arguments off --description 'Turns '$subcommand' off'
complete --command finder --condition '__fish_seen_subcommand_from '$subcommand \
--arguments on --description 'Turns '$subcommand' on'
complete --command finder --condition '__fish_seen_subcommand_from '$subcommand \
--arguments toggle --description 'Toggles '$subcommand
complete --command finder --condition '__fish_seen_subcommand_from '$subcommand \
--arguments status --description 'Shows the status of '$subcommand
end
complete --command finder --condition '__fish_seen_subcommand_from 'quarantine \
--arguments show --description 'Shows quarantine events'
complete --command finder --condition '__fish_seen_subcommand_from 'quarantine \
--arguments clear --description 'Clears all quarantine events'
complete --command finder --condition '__fish_seen_subcommand_from 'quarantine \
--arguments clean --description 'Removes 'quarantine' attributes from files' \
--require-parameter --force-files

View File

@@ -0,0 +1,8 @@
complete fzf_configure_bindings --no-files
complete fzf_configure_bindings --long help --short h --description "Print help" --condition "not __fish_seen_argument --help -h"
complete fzf_configure_bindings --long directory --description "Change the key binding for Search Directory" --condition "not __fish_seen_argument --directory"
complete fzf_configure_bindings --long git_log --description "Change the key binding for Search Git Log" --condition "not __fish_seen_argument --git_log"
complete fzf_configure_bindings --long git_status --description "Change the key binding for Search Git Status" --condition "not __fish_seen_argument --git_status"
complete fzf_configure_bindings --long history --description "Change the key binding for Search History" --condition "not __fish_seen_argument --history"
complete fzf_configure_bindings --long processes --description "Change the key binding for Search Processes" --condition "not __fish_seen_argument --processes"
complete fzf_configure_bindings --long variables --description "Change the key binding for Search Variables" --condition "not __fish_seen_argument --variables"

View File

@@ -0,0 +1 @@
/Applications/OrbStack.app/Contents/MacOS/../Resources/completions/fish/kubectl.fish

View File

@@ -0,0 +1,117 @@
# @halostatue/fish-macos/completions/mac.fish:v7.0.1
complete --command mac --erase
complete --command mac --arguments airdrop \
--exclusive --condition __fish_use_subcommand \
--description 'Changes AirDrop settings'
complete --command mac --arguments airport \
--exclusive --condition __fish_use_subcommand \
--description 'Work with AirPort (WiFi) settings'
complete --command mac --arguments brightness \
--exclusive --condition __fish_use_subcommand \
--description 'Adjust the screen brightness level'
complete --command mac --arguments flushdns \
--exclusive --condition __fish_use_subcommand \
--description 'Flushes DNS'
complete --command mac --arguments font-smoothing \
--exclusive --condition __fish_use_subcommand \
--description 'Manages font smoothing settings'
complete --command mac --arguments lsclean \
--exclusive --condition __fish_use_subcommand \
--description 'Cleans LaunchServices to remove duplicate Open with... entries'
complete --command mac --arguments mail \
--exclusive --condition __fish_use_subcommand \
--description 'Manage various operations of Mail.app'
complete --command mac --arguments proxy-icon \
--exclusive --condition __fish_use_subcommand \
--description 'Manage proxy icon appearance delay'
complete --command mac --arguments transparency \
--exclusive --condition __fish_use_subcommand \
--description 'Manage UI transparency'
complete --command mac --arguments vol \
--exclusive --condition __fish_use_subcommand \
--description 'Changes Mac volume; accepts 0100 volume percentage'
for subcommand in airdrop airport brightness flushdns font-smoothing lsclean mail proxy-icon transparency version vol
complete --command mac --condition '__fish_seen_subcommand_from '$subcommand \
--short-option h --long-option help --description 'Help for mac '$subcommand
end
complete --command mac --condition '__fish_seen_subcommand_from brightness' \
--arguments up --description 'Increases screen brightness'
complete --command mac --condition '__fish_seen_subcommand_from brightness' \
--arguments down --description 'Decreases screen brightness'
for subcommand in airdrop proxy-icon transparency
complete --command mac --condition '__fish_seen_subcommand_from '$subcommand \
--arguments on --description 'Enables '$subcommand
complete --command mac --condition '__fish_seen_subcommand_from '$subcommand \
--arguments off --description 'Disables '$subcommand
complete --command mac --condition '__fish_seen_subcommand_from '$subcommand \
--arguments toggle --description 'Toggles '$subcommand
complete --command mac --condition '__fish_seen_subcommand_from '$subcommand \
--arguments status --description 'Shows the status of '$subcommand
end
complete --command mac --condition '__fish_seen_subcommand_from 'airport \
--arguments scan --description 'Shows available networks'
complete --command mac --condition '__fish_seen_subcommand_from 'airport \
--arguments ssid --description 'Shows the SSID'
complete --command mac --condition '__fish_seen_subcommand_from 'airport \
--arguments password --description 'Gets the current WiFi network password'
complete --command mac --condition '__fish_seen_subcommand_from 'font-smoothing \
--arguments on --description 'Enables font smoothing; app IDs can be provided to limit control'
complete --command mac --condition '__fish_seen_subcommand_from 'font-smoothing \
--arguments off --description 'Disables font smoothing; app IDs can be provided to limit control'
complete --command mac --condition '__fish_seen_subcommand_from 'mail \
--arguments vacuum --description 'Vacuums the Mail.app envelope index'
complete --command mac --condition '__fish_seen_subcommand_from 'mail \
--arguments attachments --description 'Sets Mail.app attachment handling' \
--require-parameter --no-files
complete --command mac --condition '__fish_seen_subcommand_from 'attachments \
--arguments inline \
--description 'Sets Mail.app attachment handling so that they are inline to the message'
complete --command mac --condition '__fish_seen_subcommand_from 'attachments \
--arguments icon \
--description 'Sets Mail.app attachment handling so that they are icons on the message'
complete --command mac --condition '__fish_seen_subcommand_from 'version \
--short-option s --long-option simple --description 'Simple mac version name'
complete --command mac --condition '__fish_seen_subcommand_from 'version \
--short-option l --long-option lowercase --description 'Lowercase mac version name'
complete --command mac --condition '__fish_seen_subcommand_from 'version \
--short-option f --long-option version --description 'Full version number'
complete --command mac --condition '__fish_seen_subcommand_from 'version \
--short-option c --long-option comparable --description 'Simplified comparable version value'
complete --command mac --condition '__fish_seen_subcommand_from 'version \
--short-option h --long-option help --description 'Help for mac 'version
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments mute --description 'Mutes volume'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments unmute --description 'Unmutes volume'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments show --description 'Shows the current volume'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 10 --description 'Sets the volume to 10%'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 20 --description 'Sets the volume to 20%'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 30 --description 'Sets the volume to 30%'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 40 --description 'Sets the volume to 40%'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 50 --description 'Sets the volume to 50%'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 60 --description 'Sets the volume to 60%'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 70 --description 'Sets the volume to 70%'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 80 --description 'Sets the volume to 80%'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 90 --description 'Sets the volume to 90%'
complete --command mac --condition '__fish_seen_subcommand_from 'vol \
--arguments 100 --description 'Sets the volume to 100%'

View File

@@ -0,0 +1,8 @@
# @halostatue/fish-macos/completions/manp.fish:v7.0.1
complete --command manp --erase
complete --command manp --wraps man
complete --command manp --exclusive --condition __fish_no_arguments \
--short-option h --long-option help --description 'Show help for manp'
complete --command manp --exclusive --condition __fish_no_arguments \
--long-option clear-cache --description 'Clear the man page PDF cache'

View File

@@ -0,0 +1 @@
/Applications/OrbStack.app/Contents/MacOS/../Resources/completions/fish/orbctl.fish

View File

@@ -0,0 +1,4 @@
# @halostatue/fish-macos/completions/ql.fish:v7.0.1
complete --erase --command ql
complete --command ql --wraps qlmanage

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #d3c6aa
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #d3c6aa
set -U fish_color_comment #7a8478
set -U fish_color_selection --background=#323c41
set -U fish_color_search_match --background=#323c41
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #859289
# Set fish pager colors
set -U fish_pager_color_progress #9da9a0
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #d3c6aa
set -U fish_pager_color_description #859289

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #d3c6aa
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #d3c6aa
set -U fish_color_comment #7a8478
set -U fish_color_selection --background=#374247
set -U fish_color_search_match --background=#374247
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #859289
# Set fish pager colors
set -U fish_pager_color_progress #9da9a0
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #d3c6aa
set -U fish_pager_color_description #859289

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #d3c6aa
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #d3c6aa
set -U fish_color_comment #7a8478
set -U fish_color_selection --background=#3a464c
set -U fish_color_search_match --background=#3a464c
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #859289
# Set fish pager colors
set -U fish_pager_color_progress #9da9a0
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #d3c6aa
set -U fish_pager_color_description #859289

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #5c6a72
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #5c6a72
set -U fish_color_comment #a6b0a0
set -U fish_color_selection --background=#f4f0d9
set -U fish_color_search_match --background=#f4f0d9
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #b3c0b0
# Set fish pager colors
set -U fish_pager_color_progress #c0cdb8
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #5c6a72
set -U fish_pager_color_description #b3c0b0

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #5c6a72
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #5c6a72
set -U fish_color_comment #a6b0a0
set -U fish_color_selection --background=#ede6cf
set -U fish_color_search_match --background=#ede6cf
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #b3c0b0
# Set fish pager colors
set -U fish_pager_color_progress #c0cdb8
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #5c6a72
set -U fish_pager_color_description #b3c0b0

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #5c6a72
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #5c6a72
set -U fish_color_comment #a6b0a0
set -U fish_color_selection --background=#e9e1cc
set -U fish_color_search_match --background=#e9e1cc
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #b3c0b0
# Set fish pager colors
set -U fish_pager_color_progress #c0cdb8
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #5c6a72
set -U fish_pager_color_description #b3c0b0

View File

@@ -0,0 +1,7 @@
if test -z "$SSH_ENV"
set -xg SSH_ENV $HOME/.ssh/environment
end
if not __ssh_agent_is_started
__ssh_agent_start
end

Some files were not shown because too many files have changed in this diff Show More