diff --git a/.github/actions/setup-nix/action.yml b/.github/actions/setup-nix/action.yml new file mode 100644 index 0000000..8c9f558 --- /dev/null +++ b/.github/actions/setup-nix/action.yml @@ -0,0 +1,20 @@ +name: Setup Nix with Flakes +description: Installs Nix, enables flakes, and installs Home Manager + +runs: + using: composite + steps: + - name: Install Nix + uses: DeterminateSystems/nix-installer-action@main + + - name: Enable Flakes + shell: bash + run: | + mkdir -p ~/.config/nix + echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf + + - name: Install Home Manager + shell: bash + run: | + nix-channel --add https://github.com/nix-community/home-manager/archive/release-24.05.tar.gz home-manager + nix-channel --update diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml new file mode 100644 index 0000000..ba40025 --- /dev/null +++ b/.github/workflows/nix.yml @@ -0,0 +1,55 @@ +name: Nix CI + +on: + push: + branches: [main, nix-migration] + pull_request: + branches: [main] + +jobs: + flake-check: + name: Flake Check + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Nix + uses: ./.github/actions/setup-nix + + - name: Check Flake + run: nix flake check + + home-manager: + name: Home Manager (${{ matrix.system }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - system: linux + attr: .#linux + - system: pi + attr: .#pi + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Nix + uses: ./.github/actions/setup-nix + + - name: Build Home Manager (${{ matrix.system }}) + run: home-manager build ${{ matrix.attr }} --show-trace + + nixos: + name: NixOS Config Check + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Nix + uses: ./.github/actions/setup-nix + + - name: Evaluate NixOS Config + run: nix eval .#nixosConfigurations.nixos.pkgs.system diff --git a/.github/workflows/stow.yml b/.github/workflows/stow.yml new file mode 100644 index 0000000..25f2b64 --- /dev/null +++ b/.github/workflows/stow.yml @@ -0,0 +1,59 @@ +name: Stow CI + +on: + push: + branches: [main, nix-migration] + pull_request: + branches: [main] + +jobs: + stow-check: + name: Stow Structure Check + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Stow + run: sudo apt-get update && sudo apt-get install -y stow + + - name: Verify Stow Packages + run: | + # Check that common packages exist and have content + for pkg in stow/common/*; do + if [ -d "$pkg" ]; then + count=$(find "$pkg" -type f | wc -l) + if [ "$count" -eq 0 ]; then + echo "Warning: $pkg is empty" + fi + fi + done + + - name: Verify OS-specific packages + run: | + # Check macOS packages + for pkg in stow/macos/*; do + if [ -d "$pkg" ]; then + count=$(find "$pkg" -type f | wc -l) + echo "macOS package: $(basename $pkg) - $count files" + fi + done + + # Check Linux packages + for pkg in stow/linux/*; do + if [ -d "$pkg" ]; then + count=$(find "$pkg" -type f | wc -l) + echo "Linux package: $(basename $pkg) - $count files" + fi + done + + # Check Pi packages + for pkg in stow/pi/*; do + if [ -d "$pkg" ]; then + count=$(find "$pkg" -type f | wc -l) + echo "Pi package: $(basename $pkg) - $count files" + fi + done diff --git a/.gitignore b/.gitignore index f04a709..c837c1c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,56 +1,118 @@ +# ===================================================================== +# OS/Editor Generated Files +# ===================================================================== .DS_Store \.DS_Store -node_modules/** -Makefile +.DS_Store? +._* +.Spotlight-V100 +.Trashes +Thumbs.db +ehthumbs.db +Desktop.ini + +# ===================================================================== +# Secrets & Credentials +# ===================================================================== *.pem *.key *.pub id_rsa* -cache/** -extensions/** -**/extensions/** +*id_ed25519* +*id_rsa +.env +.env.* +.env.secret +.env.local +.env.d.ts +oauth_creds.json +htpasswd +verdaccio/htpasswd +known_hosts* + +# ===================================================================== +# Build & Dependency Outputs +# ===================================================================== +node_modules/** +vendor/** +target/** +dist/** +build/** +*.o +*.so +*.a +*.lib +**/.docker/cli-plugins/** +# ===================================================================== +# Temporary Files +# ===================================================================== tmp/** -**/tmp/** temp/** .zsh_history -cache/** -.vscode/** -.netrwhist .zsh_sessions/** +cache/** (.config|config)/**/(temp|tmp)/** -.config/configstore/** -verdaccio/htpasswd -.config/yarn/** -.*history -known_hosts* -(.gemini|gemini)/oauth_creds.json -(.gemini|gemini)/tmp/** -htpasswd -oauth_creds.json +*.bak* +*~ +*.swp +*.swo +*# + +# ===================================================================== +# Development Tools +# ===================================================================== +.vscode/** *.vscode -.devbox -devbox.d -docker/.docker/** -!docker/.docker/config.json -!docker/.docker/daemon.json -.env* -.env.d.ts -.env.secret -cursor/.cursor/* -.cursor/* -orbstack/.orbstack/* -.yarnrc -./npm/.npmrc -.npmrc* -test/bats.diff* +.idea/ +*.iml +Makefile + +# ===================================================================== +# Test & Coverage +# ===================================================================== tests/**/bats.log -argv.json -bats.diff +test/** tests/bats.diff* -test/**/bats.diff* -zsh/custom/plugins/** -*id_ed25519* -*id_rsa -*.bak* -goose/**/*/githubcopilot/** -ollama/**/* +test/bats.diff* + +# ===================================================================== +# Package Managers +# ===================================================================== +.npmrc* +.yarnrc +./npm/.npmrc +yarn-error.log + +# ===================================================================== +# Nix (keep flake.nix and *.nix configs, but not results) +# ===================================================================== +result +result-* +*.lock + +# ===================================================================== +# Stow temporary +# ===================================================================== +.stow* +.stow-local-ignore + +# ===================================================================== +# Stow Package-Specific Ignores +# ===================================================================== +# Cursor (macOS) - cache and plugin directories +stow/macos/cursor/.cursor/ +cursor/.cursor/ + +# 1Password (if contains sensitive data) +stow/common/1Password/.op/ +stow/common/1Password/config** + +# Orbstack (macOS) +orbstack/.orbstack/* + +# Gemini +.gemini/** +gemini/** + +# Ollama +ollama/** diff --git a/.stow-local-ignore b/.stow-local-ignore index 7b6d934..36d0c62 100644 --- a/.stow-local-ignore +++ b/.stow-local-ignore @@ -1,25 +1,65 @@ -Makefile -/node_modules/ -\.DS_Store -.DS_Store +# ===================================================================== +# General Ignores (don't stow these) +# ===================================================================== .git .gitignore -.vscode -\.git -\.gitignore README.* LICENSE .env -test/* -devbox.* -package.* -README.md -.cursor/* -.claude/* -scripts/* -setup/* -test/* -bats -husky -nix/ +.env.* *.lock + +# Build outputs +node_modules/ +target/ +dist/ +build/ +vendor/ + +# IDE/Editor +.vscode/ +.idea/ +*.vscode + +# Test files +test/ +tests/ +bats/ + +# Scripts (run separately, not stowed) +scripts/ +setup*.sh +*.md + +# ===================================================================== +# Stow Directory-Specific +# ===================================================================== +# Nix/Flake files (managed separately) +flake.nix +hosts/ +linux/ +nix/ + +# Package managers +package.json +package-lock.json +pnpm-lock.yaml +yarn.lock + +# Dev tools +.devbox/ +devbox.d/ +.devbox + +# Temporary/Cache +cache/ +tmp/ +temp/ +*.swp +*.swo +*~ + +# macOS-specific cache +.DS_Store +.Spotlight-V100 +.Trashes diff --git a/README.md b/README.md index 6f7f266..e6683a3 100644 --- a/README.md +++ b/README.md @@ -1,203 +1,197 @@ # dotfiles -[![Built with Devbox](https://www.jetify.com/img/devbox/shield_moon.svg)](https://www.jetify.com/devbox/docs/contributor-quickstart/) +Dotfiles setup with: +- [stow](https://www.gnu.org/software/stow/) - Dotfile symlinking +- [Nix](https://nixos.org/) + [Home Manager](https://nix-community.github.io/home-manager/) - Package management +- [direnv](https://direnv.net) - Environment variable management -Dotfiles setup made with: -- [stow](https://www.gnu.org/software/stow/) +## Supported Systems -- [direnv](https://direnv.net) w/ global config in `~/.config/direnv/direnvrc` +| System | Package Manager | Dotfiles | +|--------|---------------|----------| +| **NixOS** | Nix (flake) | stow | +| **Linux/Debian** | Home Manager | stow | +| **Raspberry Pi** | Home Manager | stow | +| **macOS** | Homebrew | stow | -- Underlying ideals from [12 Factor App config](https://12factor.net/config) +--- ## Quick Start -The setup script automatically detects your operating system and runs the appropriate installer. - -**No special requirements** - works with standard shells on supported systems. - -**Supported Systems:** -- [macOS setup](setup-osx.md) based on [mac.install.guide](https://mac.install.guide/) tested with [Bats](https://github.com/bats-core/bats-core) (see [setup-osx.md](setup-osx.md)) -- [Raspberry Pi 4 setup](setup-pi.md) running Debian Trixie -- **NixOS** - Package management via `/etc/nixos/configuration.nix` (setup script provides guidance, stow script works normally) +### 1. Clone the Repository ```bash -# Install packages (auto-detects OS) -./setup.sh +git clone https://github.com/yourusername/dotfiles.git ~/.dotfiles +cd ~/.dotfiles +``` -# Check package status -./setup.sh check +### 2. Install Packages -# List all packages -./setup.sh list +#### NixOS -# Validate package configuration (macOS only) -./setup.sh validate -``` +```bash +# Enable flakes (if not already enabled) +mkdir -p ~/.config/nix +echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf -The script will automatically: -- **macOS**: Run `scripts/setup-osx.sh` (uses Homebrew) -- **Linux (Debian/Ubuntu)**: Run `scripts/setup-linux.sh` (uses APT) -- **NixOS**: Shows guidance (package management via configuration.nix) +# Apply configuration (includes Home Manager automatically) +sudo nixos-rebuild switch --flake .#nixos +``` -You can still run the OS-specific scripts directly if needed: -- `./scripts/setup-osx.sh` for macOS -- `./scripts/setup-linux.sh` for Linux -### Symlinking Dotfiles +> **Note**: The NixOS configuration is in `hosts/nixos/configuration.nix`. Using flakes, you do NOT need to copy it to `/etc/nixos/` - it is read directly from your dotfiles directory. -After installing packages, symlink your dotfiles using the OS-aware stow script: +#### Linux (Debian/Ubuntu/Raspberry Pi) ```bash -# Stow all dotfiles (auto-detects OS and only stows relevant packages) -./stow-dotfiles.sh +# Install Nix (single-user) +sh <(curl -L https://nixos.org/nix/install) --no-daemon -# Stow without adopting existing files (use if starting fresh) -./stow-dotfiles.sh "" -``` +# Enable flakes +mkdir -p ~/.config/nix +echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf -The script automatically: -- **Stows common packages** on all systems (bash, zsh, nvim, git, etc.) -- **Stows macOS-specific packages** on macOS only (see [setup-osx.md](setup-osx.md) for details) -- **Skips OS-specific packages** on other systems (e.g., Raspberry Pi won't get macOS packages) -- **Note**: The `nix/` folder is not stowed automatically - it should be managed manually or via NixOS `configuration.nix` +# Apply configuration +home-manager switch --flake .#linux -### Updating Dotfiles +# For Raspberry Pi (aarch64) +home-manager switch --flake .#pi +``` -After pulling updates from the repository, use the update script to sync everything: +#### macOS ```bash -# Pull updates, update submodules, install new packages, and update symlinks -./update.sh +# Install Nix via Homebrew +brew install nix + +# Enable flakes +mkdir -p ~/.config/nix +echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf + +# Apply Home Manager (optional - can also use brew) +home-manager switch --flake .#darwin + +# Or use Homebrew for packages +./setup.sh ``` -This will: -1. Pull latest changes from git -2. Update git submodules -3. Install any new packages (setup scripts check if already installed) -4. Update dotfile symlinks (stow is idempotent, safe to run multiple times) +### 3. Link Dotfiles -## Troubleshooting +```bash +# Stow dotfiles (auto-detects OS) +./stow-dotfiles.sh +``` -- **Check distribution detection**: `./setup.sh check` -- **List packages**: `./setup.sh list` -- **Dry run setup**: `DRY_RUN=true ./setup.sh` -- **Verify symlinks**: `ls -la ~ | grep "\->"` -- **macOS-specific**: See [setup-osx.md](setup-osx.md) for additional troubleshooting +--- -### Contents -- [dotfiles](#dotfiles) - - [Quick Start](#quick-start) - - [Symlinking Dotfiles](#symlinking-dotfiles) - - [Updating Dotfiles](#updating-dotfiles) - - [Troubleshooting](#troubleshooting) - - [Contents](#contents) - - [Maintenance](#maintenance) - - [act](#act) - - [Symlinking](#symlinking) - - [Nvim/LazyVim](#nvimlazyvim) - - [1Password](#1password) - - [Devbox](#devbox) +## Package Management +### Nix/Home Manager (Linux/NixOS/RPi) -## Maintenance +Packages are defined in: +- `linux/home.nix` - Main package list +- `flake.nix` - NixOS configuration -Keep submodules updated +To add packages, edit `linux/home.nix`: -```bash -git submodule update +```nix +home.packages = with pkgs; [ + git + curl + wget + neovim + # add more packages here +]; ``` -## act +### Homebrew (macOS) ```bash -# insert 1password token into github action secrets -act -s GITHUB_TOKEN=$(op read $GITHUB_TOKEN) +# Add packages to setup-osx.md or use brew directly +brew install ``` -## Symlinking +--- -```bash -./stow-dotfiles.sh +## Stow Directory Structure + +``` +stow/ +├── common/ # Shared across all OSes (bash, git, nvim, etc.) +├── macos/ # macOS-specific (zsh, cursor, iterm2, etc.) +├── linux/ # Linux-specific (zsh config) +└── pi/ # Raspberry Pi-specific (zsh config) ``` -**Manual stow** (if you need to stow individual packages): +The `stow-dotfiles.sh` script automatically stows the correct packages for your OS. -```bash -cp -mkdir -p -stow -``` +--- -## Nvim/LazyVim +## Updating -Build plugins +### Pull Updates ```bash -nvim --headless -c "Lazy sync" -c "qa" -``` +git pull -Force clean and reinstall LazyVim plugins +# Rebuild Nix configurations +home-manager switch --flake .#linux -```bash -nvim --headless -c "lua require('lazy').clean()" -c "lua require('lazy').sync()" -c "qa" +# Re-stow dotfiles +./stow-dotfiles.sh ``` -Refresh and sync plugins (interactive) +--- -```bash -:Lazy clean -:Lazy sync -``` -## 1Password +## Troubleshooting -```bash -op:////[section-name/] -``` +### Nix/Home Manager ```bash -Usage: op read [flags] - -Examples: +# Check what's installed +home-manager packages -Print the secret saved in the field 'password', on the item 'db', in the vault 'app-prod': +# Dry-run (see changes without applying) +home-manager switch --flake .#linux --dry-run -op read op://app-prod/db/password +# List available packages +nix search nixpkgs +``` -Use a secret reference with a query parameter to retrieve a one-time -password: +### Stow -op read "op://app-prod/db/one-time password?attribute=otp" +```bash +# Verify symlinks +ls -la ~ | grep "\->" -Use a secret reference with a query parameter to get an SSH key's private key in the OpenSSH format: +# Restow specific package +stow -R +``` -op read "op://app-prod/ssh key/private key?ssh-format=openssh" +--- -Save the SSH key found on the item 'ssh' in the 'server' vault -as a new file 'key.pem' on your computer: +## Additional Tools -op read --out-file ./key.pem op://app-prod/server/ssh/key.pem +### LazyVim -Use 'op read' in a command with secret references in place of plaintext secrets: +```bash +# Build plugins +nvim --headless -c "Lazy sync" -c "qa" -docker login -u $(op read op://prod/docker/username) -p $(op read op://prod/docker/password) - +# Clean and reinstall +nvim --headless -c "lua require('lazy').clean()" -c "lua require('lazy').sync()" -c "qa" ``` -## Devbox - -[FAQ](https://www.jetify.com/docs/devbox/faq/) +### 1Password CLI ```bash -devbox add # add a package to the devbox environment -devbox rm # remove a package from the devbox environment -devbox info # show info about the devbox environment -devbox update # update packages in devbox -devbox version update # update devbox to the latest version -devbox shell # initialize the devbox shell -devbox generate direnv # generate a direnvrc file +# Read secret +op read op://vault/item/field ``` -Clean up packages in nix store + +### Devbox ```bash -devbox run -- nix store gc --extra-experimental-features nix-command -``` \ No newline at end of file +devbox add +devbox shell +``` diff --git a/cursor/.cursor/argv.json b/cursor/.cursor/argv.json deleted file mode 100644 index 4355133..0000000 --- a/cursor/.cursor/argv.json +++ /dev/null @@ -1,20 +0,0 @@ -// This configuration file allows you to pass permanent command line arguments to VS Code. -// Only a subset of arguments is currently supported to reduce the likelihood of breaking -// the installation. -// -// PLEASE DO NOT CHANGE WITHOUT UNDERSTANDING THE IMPACT -// -// NOTE: Changing this file requires a restart of VS Code. -{ - // Use software rendering instead of hardware accelerated rendering. - // This can help in cases where you see rendering issues in VS Code. - // "disable-hardware-acceleration": true, - - // Allows to disable crash reporting. - // Should restart the app if the value is changed. - "enable-crash-reporter": true, - - // Unique id used for correlating crash reports sent from this instance. - // Do not edit this value. - "crash-reporter-id": "e6556d5a-31c1-49e7-a0f7-167e4d980e86" -} \ No newline at end of file diff --git a/devbox.json b/devbox.json deleted file mode 100644 index fecea86..0000000 --- a/devbox.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.15.0/.schema/devbox.schema.json", - "packages": [ - "git@latest", - "direnv@latest", - "python@3.10", - "nodejs@latest", - "pnpm@latest", - "yarn@latest", - "docker@latest", - "go@latest", - "iterm2@latest", - "_1password-cli@latest", - "spotify@latest", - "neovim@latest", - "code-cursor@latest", - "mysql@latest", - "oh-my-zsh@latest", - "gh@latest", - "bruno@latest", - "ripgrep@latest" - ], - "shell": { - "init_hook": [ - "export FPATH=\"$(brew --prefix)/share/zsh/site-functions:$FPATH\"", - "autoload -Uz compinit && compinit -i" - ], - "scripts": { - "test": [ - "echo \"Error: no test specified\" && exit 1" - ] - } - } -} \ No newline at end of file diff --git a/devbox.lock b/devbox.lock deleted file mode 100644 index 6e245d4..0000000 --- a/devbox.lock +++ /dev/null @@ -1,884 +0,0 @@ -{ - "lockfile_version": "1", - "packages": { - "_1password-cli@latest": { - "last_modified": "2025-07-13T22:45:35Z", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#_1password-cli", - "source": "devbox-search", - "version": "2.31.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/g7gzkirv6x4n1cmm2vfrw01rwdzb6siq-1password-cli-2.31.1", - "default": true - } - ], - "store_path": "/nix/store/g7gzkirv6x4n1cmm2vfrw01rwdzb6siq-1password-cli-2.31.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/bxamsf9wfd5gvn3811p5rwigl1wfs9vc-1password-cli-2.31.1", - "default": true - } - ], - "store_path": "/nix/store/bxamsf9wfd5gvn3811p5rwigl1wfs9vc-1password-cli-2.31.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/l50an4522mdvgc3vpiljl6vhj429y3yz-1password-cli-2.31.1", - "default": true - } - ], - "store_path": "/nix/store/l50an4522mdvgc3vpiljl6vhj429y3yz-1password-cli-2.31.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/39ijpzwcdjjmjiq54vpvnbw7a36wbmp5-1password-cli-2.31.1", - "default": true - } - ], - "store_path": "/nix/store/39ijpzwcdjjmjiq54vpvnbw7a36wbmp5-1password-cli-2.31.1" - } - } - }, - "bruno@latest": { - "last_modified": "2025-07-25T08:26:56Z", - "resolved": "github:NixOS/nixpkgs/6027c30c8e9810896b92429f0092f624f7b1aace#bruno", - "source": "devbox-search", - "version": "2.8.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/0hpwz9drdygy7j7rdsxhv1lnrzjaggaj-bruno-2.8.0", - "default": true - } - ], - "store_path": "/nix/store/0hpwz9drdygy7j7rdsxhv1lnrzjaggaj-bruno-2.8.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/i8f263wya7j8yq8ff2n0hrnhdp79ma71-bruno-2.8.0", - "default": true - } - ], - "store_path": "/nix/store/i8f263wya7j8yq8ff2n0hrnhdp79ma71-bruno-2.8.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/zbarnc3l371j5ibkfr7x9v65s9zcdibd-bruno-2.8.0", - "default": true - } - ], - "store_path": "/nix/store/zbarnc3l371j5ibkfr7x9v65s9zcdibd-bruno-2.8.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/lzbhv6rmqii8g6dxrif4sqiraqramlaf-bruno-2.8.0", - "default": true - } - ], - "store_path": "/nix/store/lzbhv6rmqii8g6dxrif4sqiraqramlaf-bruno-2.8.0" - } - } - }, - "code-cursor@latest": { - "last_modified": "2025-07-15T16:15:05Z", - "resolved": "github:NixOS/nixpkgs/dab3a6e781554f965bde3def0aa2fda4eb8f1708#code-cursor", - "source": "devbox-search", - "version": "1.2.2", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/mdwh1hkzgqib6kj3xkjzaf3rhd2gh2wm-cursor-1.2.2", - "default": true - } - ], - "store_path": "/nix/store/mdwh1hkzgqib6kj3xkjzaf3rhd2gh2wm-cursor-1.2.2" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/fqzm8jw4gakpfbamb4kqjv44zfjsn9xr-cursor-1.2.2", - "default": true - } - ], - "store_path": "/nix/store/fqzm8jw4gakpfbamb4kqjv44zfjsn9xr-cursor-1.2.2" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/7izgpm9ia5y4xl4n73xz6fz5dzn5slrh-cursor-1.2.2", - "default": true - } - ], - "store_path": "/nix/store/7izgpm9ia5y4xl4n73xz6fz5dzn5slrh-cursor-1.2.2" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/b0z6lbz2qjfigd8y8x3mz6pvdn7036jk-cursor-1.2.2", - "default": true - } - ], - "store_path": "/nix/store/b0z6lbz2qjfigd8y8x3mz6pvdn7036jk-cursor-1.2.2" - } - } - }, - "direnv@latest": { - "last_modified": "2025-07-21T09:58:03Z", - "resolved": "github:NixOS/nixpkgs/2baf8e1658cba84a032c3a8befb1e7b06629242a#direnv", - "source": "devbox-search", - "version": "2.37.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/2yxm2j7kwmjvvjph8x2mmfhmzhaj1y5c-direnv-2.37.1", - "default": true - } - ], - "store_path": "/nix/store/2yxm2j7kwmjvvjph8x2mmfhmzhaj1y5c-direnv-2.37.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/8dfqhbnfc65fv4rxpjp2knvsc0c2h7f7-direnv-2.37.1", - "default": true - } - ], - "store_path": "/nix/store/8dfqhbnfc65fv4rxpjp2knvsc0c2h7f7-direnv-2.37.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/sl2ay9dwylk2nvyxsg2kpcclhahgzhnb-direnv-2.37.1", - "default": true - } - ], - "store_path": "/nix/store/sl2ay9dwylk2nvyxsg2kpcclhahgzhnb-direnv-2.37.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/cayixg88lflclgcwjlc21bih648in6ff-direnv-2.37.1", - "default": true - } - ], - "store_path": "/nix/store/cayixg88lflclgcwjlc21bih648in6ff-direnv-2.37.1" - } - } - }, - "docker@latest": { - "last_modified": "2025-07-15T16:15:05Z", - "resolved": "github:NixOS/nixpkgs/dab3a6e781554f965bde3def0aa2fda4eb8f1708#docker", - "source": "devbox-search", - "version": "28.3.2", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/hwnwd8mdzpk1gahv35lni2m667zqr1rg-docker-28.3.2", - "default": true - } - ], - "store_path": "/nix/store/hwnwd8mdzpk1gahv35lni2m667zqr1rg-docker-28.3.2" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/3yr6ry22vlh1jpqidri13328rnivw887-docker-28.3.2", - "default": true - } - ], - "store_path": "/nix/store/3yr6ry22vlh1jpqidri13328rnivw887-docker-28.3.2" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/xxdljnqxc58z32mmaahrh7l8qnkpa3sv-docker-28.3.2", - "default": true - } - ], - "store_path": "/nix/store/xxdljnqxc58z32mmaahrh7l8qnkpa3sv-docker-28.3.2" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/r81s03afqkm0wfys32xw0x90ygw2mh12-docker-28.3.2", - "default": true - } - ], - "store_path": "/nix/store/r81s03afqkm0wfys32xw0x90ygw2mh12-docker-28.3.2" - } - } - }, - "gh@latest": { - "last_modified": "2025-07-24T15:00:16Z", - "resolved": "github:NixOS/nixpkgs/b74a30dbc0a72e20df07d43109339f780b439291#gh", - "source": "devbox-search", - "version": "2.76.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/1rk4zapq51hwrx1shzd059aha1n8rpys-gh-2.76.1", - "default": true - } - ], - "store_path": "/nix/store/1rk4zapq51hwrx1shzd059aha1n8rpys-gh-2.76.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wnbz91jxavdyrql8gn4lccl236p49684-gh-2.76.1", - "default": true - } - ], - "store_path": "/nix/store/wnbz91jxavdyrql8gn4lccl236p49684-gh-2.76.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/vs7c36g9bz9wqkpy8lf48c1c2r2d9d7c-gh-2.76.1", - "default": true - } - ], - "store_path": "/nix/store/vs7c36g9bz9wqkpy8lf48c1c2r2d9d7c-gh-2.76.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/sv3yv54i9wn5xmi3ppvdsq6xx4iv4axa-gh-2.76.1", - "default": true - } - ], - "store_path": "/nix/store/sv3yv54i9wn5xmi3ppvdsq6xx4iv4axa-gh-2.76.1" - } - } - }, - "git@latest": { - "last_modified": "2025-07-13T22:45:35Z", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#git", - "source": "devbox-search", - "version": "2.50.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/2jwgd7jj1dil1b73h8hnh0xj928416jp-git-2.50.0", - "default": true - }, - { - "name": "doc", - "path": "/nix/store/wfg8mczayhr7k13bq6fjl1h7rxg5f6p8-git-2.50.0-doc" - } - ], - "store_path": "/nix/store/2jwgd7jj1dil1b73h8hnh0xj928416jp-git-2.50.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/7mp9n7lbilhk56s842rigrjclbr5ipdj-git-2.50.0", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/dajrhy2l14ghs5awaag5n8yj62lwsyg9-git-2.50.0-debug" - }, - { - "name": "doc", - "path": "/nix/store/kj8r3acr12x0hkxs0hyrpd8wknvvwhd2-git-2.50.0-doc" - } - ], - "store_path": "/nix/store/7mp9n7lbilhk56s842rigrjclbr5ipdj-git-2.50.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wy5g4i1fr1vrg2drjflbsd75rq7j9rh9-git-2.50.0", - "default": true - }, - { - "name": "doc", - "path": "/nix/store/kc1k9n4im10nlm6csp16jg3052vdmifa-git-2.50.0-doc" - } - ], - "store_path": "/nix/store/wy5g4i1fr1vrg2drjflbsd75rq7j9rh9-git-2.50.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/khdq35xh67vw7j7k9y4q9l0svxznhx1b-git-2.50.0", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/h29apnv0hcp0w03whsh03izhq7ln1jyw-git-2.50.0-debug" - }, - { - "name": "doc", - "path": "/nix/store/fypvhmxqj3583rkzxvmwakw10yri2i23-git-2.50.0-doc" - } - ], - "store_path": "/nix/store/khdq35xh67vw7j7k9y4q9l0svxznhx1b-git-2.50.0" - } - } - }, - "github:NixOS/nixpkgs/nixpkgs-unstable": { - "last_modified": "2025-08-02T08:13:18Z", - "resolved": "github:NixOS/nixpkgs/c02d05bcf73fb496c604798c2268ed424a09e73e?lastModified=1754122398&narHash=sha256-CyIrZ68gVLSZGa2ERK7zc2dGabvWp2A8PM6PII9M7gI%3D" - }, - "glibcLocales@latest": { - "last_modified": "2025-07-13T22:45:35Z", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#glibcLocales", - "source": "devbox-search", - "version": "2.40-66", - "systems": { - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wqz9ji7hzfnhg79wz9p7597vp898i9vz-glibc-locales-2.40-66", - "default": true - } - ], - "store_path": "/nix/store/wqz9ji7hzfnhg79wz9p7597vp898i9vz-glibc-locales-2.40-66" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/d7250sbw13rpdrcrcgv6hi6jkyp94m0g-glibc-locales-2.40-66", - "default": true - } - ], - "store_path": "/nix/store/d7250sbw13rpdrcrcgv6hi6jkyp94m0g-glibc-locales-2.40-66" - } - } - }, - "go@latest": { - "last_modified": "2025-07-13T22:45:35Z", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#go", - "source": "devbox-search", - "version": "1.24.4", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/f4a0g1p943l61wfvqnpdr73v9bsyfhf2-go-1.24.4", - "default": true - } - ], - "store_path": "/nix/store/f4a0g1p943l61wfvqnpdr73v9bsyfhf2-go-1.24.4" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/mdyik6amglpjs533vk927f9w1qmyw239-go-1.24.4", - "default": true - } - ], - "store_path": "/nix/store/mdyik6amglpjs533vk927f9w1qmyw239-go-1.24.4" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/b56ngr9p7x6z368w8m7ps95r3x8gdfv7-go-1.24.4", - "default": true - } - ], - "store_path": "/nix/store/b56ngr9p7x6z368w8m7ps95r3x8gdfv7-go-1.24.4" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/xrzqlk92h7z5mz9mlc4a9dyy91n5b68i-go-1.24.4", - "default": true - } - ], - "store_path": "/nix/store/xrzqlk92h7z5mz9mlc4a9dyy91n5b68i-go-1.24.4" - } - } - }, - "iterm2@latest": { - "last_modified": "2025-07-13T22:45:35Z", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#iterm2", - "source": "devbox-search", - "version": "3.5.14", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/iiq4nvfvq2rgsdx3myamr0s922nb294c-iterm2-3.5.14", - "default": true - } - ], - "store_path": "/nix/store/iiq4nvfvq2rgsdx3myamr0s922nb294c-iterm2-3.5.14" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/8mb00nvn0x6x1kysry1a99mshz2ayx37-iterm2-3.5.14", - "default": true - } - ], - "store_path": "/nix/store/8mb00nvn0x6x1kysry1a99mshz2ayx37-iterm2-3.5.14" - } - } - }, - "mysql@latest": { - "last_modified": "2023-02-24T09:01:09Z", - "plugin_version": "0.0.4", - "resolved": "github:NixOS/nixpkgs/7d0ed7f2e5aea07ab22ccb338d27fbe347ed2f11#mysql", - "source": "devbox-search", - "version": "10.6.12" - }, - "neovim@latest": { - "last_modified": "2025-07-15T16:15:05Z", - "resolved": "github:NixOS/nixpkgs/dab3a6e781554f965bde3def0aa2fda4eb8f1708#neovim", - "source": "devbox-search", - "version": "0.11.3", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/20n662aw5dz0rs1l91gybpcijnl2c0q1-neovim-0.11.3", - "default": true - } - ], - "store_path": "/nix/store/20n662aw5dz0rs1l91gybpcijnl2c0q1-neovim-0.11.3" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/69ywpq64jjrrvpww31sp1z1bggy0jxkw-neovim-0.11.3", - "default": true - } - ], - "store_path": "/nix/store/69ywpq64jjrrvpww31sp1z1bggy0jxkw-neovim-0.11.3" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/mjvvwchk25x88rccmyws62cfcm6kzgvj-neovim-0.11.3", - "default": true - } - ], - "store_path": "/nix/store/mjvvwchk25x88rccmyws62cfcm6kzgvj-neovim-0.11.3" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/62z9sarrycxm5agv1c1mhf0bbw2qw71k-neovim-0.11.3", - "default": true - } - ], - "store_path": "/nix/store/62z9sarrycxm5agv1c1mhf0bbw2qw71k-neovim-0.11.3" - } - } - }, - "nodejs@latest": { - "last_modified": "2025-07-20T07:42:04Z", - "plugin_version": "0.0.2", - "resolved": "github:NixOS/nixpkgs/7c688a0875df5a8c28a53fb55ae45e94eae0dddb#nodejs_24", - "source": "devbox-search", - "version": "24.4.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/1c4jixl4s8kyc9ypy6fbwrbwwvaxldi8-nodejs-24.4.1", - "default": true - }, - { - "name": "dev", - "path": "/nix/store/liix5qs67nyqidmi00zazw12ksc0pxxq-nodejs-24.4.1-dev" - }, - { - "name": "libv8", - "path": "/nix/store/fm4q7qypbnb8iyf9qm7i07vzybhp6b53-nodejs-24.4.1-libv8" - } - ], - "store_path": "/nix/store/1c4jixl4s8kyc9ypy6fbwrbwwvaxldi8-nodejs-24.4.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/k24g5rcnx42s4lwmgr9fh898xsc45668-nodejs-24.4.1", - "default": true - }, - { - "name": "dev", - "path": "/nix/store/jiz68w6405makvg4iibnhx5hhq95hbpg-nodejs-24.4.1-dev" - }, - { - "name": "libv8", - "path": "/nix/store/yz7jfa49dq3y5hk7w4fzgxbbxn5r4c7b-nodejs-24.4.1-libv8" - } - ], - "store_path": "/nix/store/k24g5rcnx42s4lwmgr9fh898xsc45668-nodejs-24.4.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wccpr20l2n1fmnyard3y33kkzi9iadb3-nodejs-24.4.1", - "default": true - }, - { - "name": "dev", - "path": "/nix/store/cpw2f6acji9nl40wsdcxy7vqb1895i4p-nodejs-24.4.1-dev" - }, - { - "name": "libv8", - "path": "/nix/store/b8q5m7qggq3dydfksmxnrqyx70qrf44w-nodejs-24.4.1-libv8" - } - ], - "store_path": "/nix/store/wccpr20l2n1fmnyard3y33kkzi9iadb3-nodejs-24.4.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/2bg4yn1ccasnw6cscqhgqwzfw8j2xq1m-nodejs-24.4.1", - "default": true - }, - { - "name": "dev", - "path": "/nix/store/7865hgg0qmbyambm53765ddy96qsg1vs-nodejs-24.4.1-dev" - }, - { - "name": "libv8", - "path": "/nix/store/rla4nj6lpf3dz3fxqbgqzvlm3bwd0545-nodejs-24.4.1-libv8" - } - ], - "store_path": "/nix/store/2bg4yn1ccasnw6cscqhgqwzfw8j2xq1m-nodejs-24.4.1" - } - } - }, - "oh-my-zsh@latest": { - "last_modified": "2025-07-13T22:45:35Z", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#oh-my-zsh", - "source": "devbox-search", - "version": "2025-07-01", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/19xqbccsi5awzxd48z235sixrhl364dg-oh-my-zsh-2025-07-01", - "default": true - } - ], - "store_path": "/nix/store/19xqbccsi5awzxd48z235sixrhl364dg-oh-my-zsh-2025-07-01" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/l00icfiagfhn58s6ff68whha3asa4lxl-oh-my-zsh-2025-07-01", - "default": true - } - ], - "store_path": "/nix/store/l00icfiagfhn58s6ff68whha3asa4lxl-oh-my-zsh-2025-07-01" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ndwfarx6hx222d8q30x5c6m4cpyrpxfi-oh-my-zsh-2025-07-01", - "default": true - } - ], - "store_path": "/nix/store/ndwfarx6hx222d8q30x5c6m4cpyrpxfi-oh-my-zsh-2025-07-01" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/msxwn6p2afciwndh0qwmyvrsh3idy9vf-oh-my-zsh-2025-07-01", - "default": true - } - ], - "store_path": "/nix/store/msxwn6p2afciwndh0qwmyvrsh3idy9vf-oh-my-zsh-2025-07-01" - } - } - }, - "pnpm@latest": { - "last_modified": "2025-07-18T03:30:42Z", - "resolved": "github:NixOS/nixpkgs/e821e03193486359aa942372be2d9c1f377b7a18#pnpm", - "source": "devbox-search", - "version": "10.13.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wqa2kn4a7ni8y9p293j6xwlr0111jha0-pnpm-10.13.1", - "default": true - } - ], - "store_path": "/nix/store/wqa2kn4a7ni8y9p293j6xwlr0111jha0-pnpm-10.13.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/91nil2hyw90n1yxkr9myd70kxb3cvadc-pnpm-10.13.1", - "default": true - } - ], - "store_path": "/nix/store/91nil2hyw90n1yxkr9myd70kxb3cvadc-pnpm-10.13.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ljac08bdv87gy7jj5j2dkxgbzy93bjc1-pnpm-10.13.1", - "default": true - } - ], - "store_path": "/nix/store/ljac08bdv87gy7jj5j2dkxgbzy93bjc1-pnpm-10.13.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/cdm1ypkmixsyvzj42p8has6j7884z6gv-pnpm-10.13.1", - "default": true - } - ], - "store_path": "/nix/store/cdm1ypkmixsyvzj42p8has6j7884z6gv-pnpm-10.13.1" - } - } - }, - "python@3.10": { - "last_modified": "2025-07-13T22:45:35Z", - "plugin_version": "0.0.4", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#python310", - "source": "devbox-search", - "version": "3.10.18", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/6jjmyqg9fifixf6vjn9y035ry6b25jri-python3-3.10.18", - "default": true - } - ], - "store_path": "/nix/store/6jjmyqg9fifixf6vjn9y035ry6b25jri-python3-3.10.18" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/470jaaj596rnanc1ncihhjxwj8lcjg6g-python3-3.10.18", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/a6h62f9z2rp5wj2647qd3zdm9f8yrz80-python3-3.10.18-debug" - } - ], - "store_path": "/nix/store/470jaaj596rnanc1ncihhjxwj8lcjg6g-python3-3.10.18" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/vr9vxyczaq2gjhf10gn9x1hizqqzx5s4-python3-3.10.18", - "default": true - } - ], - "store_path": "/nix/store/vr9vxyczaq2gjhf10gn9x1hizqqzx5s4-python3-3.10.18" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/30z1i1ys8jsqrs0b65g0j5phayr9bhcl-python3-3.10.18", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/gmi76h2iidz1n15fyj4fij4nx3jvw1mz-python3-3.10.18-debug" - } - ], - "store_path": "/nix/store/30z1i1ys8jsqrs0b65g0j5phayr9bhcl-python3-3.10.18" - } - } - }, - "ripgrep@latest": { - "last_modified": "2025-07-13T22:45:35Z", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#ripgrep", - "source": "devbox-search", - "version": "14.1.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/lxv4lraggh0g9bjcaxf4qicar3q7i1rz-ripgrep-14.1.1", - "default": true - } - ], - "store_path": "/nix/store/lxv4lraggh0g9bjcaxf4qicar3q7i1rz-ripgrep-14.1.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/i4dsm587azhml1cqf7agwd9dxgx52n5g-ripgrep-14.1.1", - "default": true - } - ], - "store_path": "/nix/store/i4dsm587azhml1cqf7agwd9dxgx52n5g-ripgrep-14.1.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/sn28r34yalqqj7sp1qnjw8ldl30cjsz4-ripgrep-14.1.1", - "default": true - } - ], - "store_path": "/nix/store/sn28r34yalqqj7sp1qnjw8ldl30cjsz4-ripgrep-14.1.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/8m8bfl2xl7vpr8qlibgb0cd3ybkkmn3j-ripgrep-14.1.1", - "default": true - } - ], - "store_path": "/nix/store/8m8bfl2xl7vpr8qlibgb0cd3ybkkmn3j-ripgrep-14.1.1" - } - } - }, - "spotify@latest": { - "last_modified": "2025-07-22T02:38:50Z", - "resolved": "github:NixOS/nixpkgs/83e677f31c84212343f4cc553bab85c2efcad60a#spotify", - "source": "devbox-search", - "version": "1.2.60.564.gcc6305cb", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "path": "/nix/store/gqjh8l9l7zg94d9gmp3dr5pj99175wrm-spotify-1.2.64.408", - "default": true - } - ] - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/21mi9gi4zk2yr2qv30gb17cm2y4js06c-spotify-1.2.60.564.gcc6305cb", - "default": true - } - ], - "store_path": "/nix/store/21mi9gi4zk2yr2qv30gb17cm2y4js06c-spotify-1.2.60.564.gcc6305cb" - } - } - }, - "yarn@latest": { - "last_modified": "2025-07-13T22:45:35Z", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#yarn", - "source": "devbox-search", - "version": "1.22.22", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/mgj28l56n5k8zp5l1vwzdjnqi188y5pk-yarn-1.22.22", - "default": true - } - ], - "store_path": "/nix/store/mgj28l56n5k8zp5l1vwzdjnqi188y5pk-yarn-1.22.22" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/gknplr1q5gs5p4pkmyd0r7dcjhznpkl3-yarn-1.22.22", - "default": true - } - ], - "store_path": "/nix/store/gknplr1q5gs5p4pkmyd0r7dcjhznpkl3-yarn-1.22.22" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/613ndjla4irf3lj468igks11dyn7xpnx-yarn-1.22.22", - "default": true - } - ], - "store_path": "/nix/store/613ndjla4irf3lj468igks11dyn7xpnx-yarn-1.22.22" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/6mzbvyzh4dfgfab6lciclji7awp9w3c4-yarn-1.22.22", - "default": true - } - ], - "store_path": "/nix/store/6mzbvyzh4dfgfab6lciclji7awp9w3c4-yarn-1.22.22" - } - } - } - } -} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..fb61d70 --- /dev/null +++ b/flake.nix @@ -0,0 +1,44 @@ +# flake.nix - Main entry point for NixOS + home-manager +{ + description = "Dotfiles with Nix and Home Manager"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { self, nixpkgs, home-manager, ... }: + let + systems = { + linux = "aarch64-linux"; + pi = "aarch64-linux"; + }; + in + { + # Home-manager standalone (Debian, RPi, macOS) + homeConfigurations = { + linux = home-manager.lib.homeManagerConfiguration { + pkgs = import nixpkgs { system = systems.linux; }; + modules = [ ./linux/home.nix ]; + }; + + pi = home-manager.lib.homeManagerConfiguration { + pkgs = import nixpkgs { system = systems.pi; }; + modules = [ ./linux/home.nix ]; + }; + }; + + # NixOS configuration (system + home-manager integrated) + nixosConfigurations.nixos = nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + modules = [ + ./hosts/nixos/configuration.nix + home-manager.nixosModules.home-manager + { home-manager.users.jenc = import ./linux/home.nix; } + ]; + }; + }; +} diff --git a/gh/.config/gh/.vscode/settings.json b/gh/.config/gh/.vscode/settings.json deleted file mode 100644 index 2bf6fa0..0000000 --- a/gh/.config/gh/.vscode/settings.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "workbench.colorCustomizations": { - "activityBar.activeBackground": "#0da9eb", - "activityBar.background": "#0da9eb", - "activityBar.foreground": "#15202b", - "activityBar.inactiveForeground": "#15202b99", - "activityBarBadge.background": "#fde1f5", - "activityBarBadge.foreground": "#15202b", - "commandCenter.border": "#e7e7e799", - "sash.hoverBorder": "#0da9eb", - "statusBar.background": "#0a86bb", - "statusBar.foreground": "#e7e7e7", - "statusBarItem.hoverBackground": "#0da9eb", - "statusBarItem.remoteBackground": "#0a86bb", - "statusBarItem.remoteForeground": "#e7e7e7", - "titleBar.activeBackground": "#0a86bb", - "titleBar.activeForeground": "#e7e7e7", - "titleBar.inactiveBackground": "#0a86bb99", - "titleBar.inactiveForeground": "#e7e7e799" - }, - "peacock.color": "#0a86bb" -} \ No newline at end of file diff --git a/nix/etc/nixos/configuration.nix b/hosts/nixos/configuration.nix similarity index 97% rename from nix/etc/nixos/configuration.nix rename to hosts/nixos/configuration.nix index 6ff7a51..51a8b97 100644 --- a/nix/etc/nixos/configuration.nix +++ b/hosts/nixos/configuration.nix @@ -8,7 +8,7 @@ imports = [ # Include the results of the hardware scan. # ./hardware-configuration.nix - (fetchTarball "https://github.com/nix-community/nixos-vscode-server/tarball/master") + # vscode-server managed via nixpkgs ]; diff --git a/linux/home.nix b/linux/home.nix new file mode 100644 index 0000000..ea98fd9 --- /dev/null +++ b/linux/home.nix @@ -0,0 +1,95 @@ +# linux/home.nix - Home Manager configuration for Linux (Debian/RPi) +{ config, pkgs, lib, ... }: + +{ + # ===================================================================== + # BASE PACKAGES - CLI tools and development libraries + # ===================================================================== + home.packages = with pkgs; [ + # Version control + git + + # HTTP clients + curl + wget + + # Essential build tools + build-essential + openssl + libyaml-dev + libgmp-dev + ca-certificates + gnupg + + # 1Password CLI + op + + # Node.js version manager + fnm + + # Shell prompts + starship + + # direnv + direnv + + # Utilities + stow + tree + unzip + lsb-release + + # System monitoring + htop + + # Editors + vim + neovim + ]; + + # ===================================================================== + # SPECIAL PACKAGES - Tools that need custom installation + # Note: These are typically installed via other means: + # - nvm: via script (https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh) + # - pnpm: via npm install -g pnpm + # - direnv: can be installed via nix or binary release + # - tailscale: via official script + # ===================================================================== + + + # ===================================================================== + # ENVIRONMENT VARIABLES + # ===================================================================== + home.stateVersion = "24.05"; + home.username = "jenc"; + home.homeDirectory = "/home/jenc"; + + home.sessionVariables = { + EDITOR = "nvim"; + VISUAL = "nvim"; + }; + + # ===================================================================== + # SHELL CONFIGURATION + # ===================================================================== + + # Enable zsh via home-manager (optional - can also use stow) + # programs.zsh.enable = true; + + # Enable bash via home-manager (optional) + # programs.bash.enable = true; + + # ===================================================================== + # NOTES + # ===================================================================== + # + # Package notes: + # - Most apt packages are available in nixpkgs + # - Some packages may need special handling (docker, tailscale, etc.) + # - For Pi-specific: use lib.optionals pkgs.hostPlatform.isAarch64 + # + # To add conditional packages: + # home.packages = (home.packages or []) ++ (with pkgs; lib.optionals pkgs.hostPlatform.isAarch64 [ + # # Pi-specific packages here + # ]); +} diff --git a/local-ai-setup.md b/local-ai-setup.md deleted file mode 100644 index 3ecf102..0000000 --- a/local-ai-setup.md +++ /dev/null @@ -1,53 +0,0 @@ -# Local AI Setup - -## Install Goose - -```bash -brew install block-cli-goose -``` - -# Container Use Setup - -## Install Container Use - -https://container-use.com/quickstart - -```bash -brew install dagger/tap/container-use -``` - -## Install Ollama - -Mac OS: https://docs.ollama.com/macos -Linux: https://docs.ollama.com/linux - -```bash -Environment Variables: - OLLAMA_DEBUG Show additional debug information (e.g. OLLAMA_DEBUG=1) - OLLAMA_HOST IP Address for the ollama server (default 127.0.0.1:11434) - OLLAMA_CONTEXT_LENGTH Context length to use unless otherwise specified (default: 2048) - OLLAMA_KEEP_ALIVE The duration that models stay loaded in memory (default "5m") - OLLAMA_MAX_LOADED_MODELS Maximum number of loaded models per GPU - OLLAMA_MAX_QUEUE Maximum number of queued requests - OLLAMA_MODELS The path to the models directory - OLLAMA_NUM_PARALLEL Maximum number of parallel requests - OLLAMA_NOPRUNE Do not prune model blobs on startup - OLLAMA_ORIGINS A comma separated list of allowed origins - OLLAMA_SCHED_SPREAD Always schedule model across all GPUs - OLLAMA_FLASH_ATTENTION Enabled flash attention - OLLAMA_KV_CACHE_TYPE Quantization type for the K/V cache (default: f16) - OLLAMA_LLM_LIBRARY Set LLM library to bypass autodetection - OLLAMA_GPU_OVERHEAD Reserve a portion of VRAM per GPU (bytes) - OLLAMA_LOAD_TIMEOUT How long to allow model loads to stall before giving up (default "5m") -``` - -[Setting Environment Variables on Linux](https://docs.ollama.com/faq#setting-environment-variables-on-linux) -[Setting Environment Variables on macOS](https://docs.ollama.com/faq#setting-environment-variables-on-mac) - -Example: -``` -export OLLAMA_HOST="0.0.0.0:11434" - -# macOS only -launchctl setenv OLLAMA_HOST "0.0.0.0:11434" -``` \ No newline at end of file diff --git a/nix/etc/.bashrc b/nix/etc/.bashrc deleted file mode 100644 index 318cfad..0000000 --- a/nix/etc/.bashrc +++ /dev/null @@ -1,9 +0,0 @@ -# bashrc completion -if [ -f ~/.nix-profile/etc/bash_completion.d/nix ]; then - source ~/.nix-profile/etc/bash_completion.d/nix -fi - -# Only start ssh-agent if not already running -if [ -z "$SSH_AUTH_SOCK" ]; then - eval "$(ssh-agent -s)" > /dev/null -fi \ No newline at end of file diff --git a/nix/etc/nix/nix.conf b/nix/etc/nix/nix.conf deleted file mode 100644 index 2c4e83f..0000000 --- a/nix/etc/nix/nix.conf +++ /dev/null @@ -1 +0,0 @@ -experimental-features = nix-command flakes \ No newline at end of file diff --git a/nix/scripts/clean.sh b/nix/scripts/clean.sh deleted file mode 100644 index 586561d..0000000 --- a/nix/scripts/clean.sh +++ /dev/null @@ -1,144 +0,0 @@ -#!/bin/bash - -# Nix garbage collection cleanup script -# Removes old direnv profiles and result symlinks, then runs GC - -set -e - -echo "=== Nix Store Cleanup Script ===" -echo - -# Check initial size -echo "Current /nix/store size:" -du -sh /nix/store -echo - -# Find all direnv flake profiles -echo "Finding direnv flake profiles to remove..." -DIRENV_PROFILES=$(find ~/proj -name 'flake-profile-*-link' -path '*/.direnv/*' 2>/dev/null || true) -if [ -z "$DIRENV_PROFILES" ]; then - PROFILE_COUNT=0 -else - PROFILE_COUNT=$(echo "$DIRENV_PROFILES" | wc -l) -fi -echo "Found $PROFILE_COUNT old direnv profile links" - -# Show some examples if found -if [ $PROFILE_COUNT -gt 0 ]; then - echo "Examples:" - echo "$DIRENV_PROFILES" | head -5 - echo -fi - -# Find result symlinks -echo "Finding result symlinks to remove..." -RESULT_LINKS=$(find ~/proj -maxdepth 3 -name 'result' -type l 2>/dev/null || true) -RESULT_COUNT=0 -if [ -n "$RESULT_LINKS" ]; then - RESULT_COUNT=$(echo "$RESULT_LINKS" | wc -l) -fi - -# Check for result in home -if [ -L ~/result ]; then - echo "Found ~/result symlink" - RESULT_COUNT=$((RESULT_COUNT + 1)) - if [ -z "$RESULT_LINKS" ]; then - RESULT_LINKS="$HOME/result" - else - RESULT_LINKS="$RESULT_LINKS -$HOME/result" - fi -fi - -echo "Found $RESULT_COUNT result symlinks" - -# Show some examples if found -if [ $RESULT_COUNT -gt 0 ]; then - echo "Examples:" - echo "$RESULT_LINKS" | head -5 - echo -fi - -# Nothing to clean -if [ $PROFILE_COUNT -eq 0 ] && [ $RESULT_COUNT -eq 0 ]; then - echo "No GC roots found to remove." - echo - read -p "Run garbage collection anyway? (y/N) " -n 1 -r - echo - if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo "Aborted." - exit 0 - fi -else - # Ask about direnv profiles - REMOVE_PROFILES=false - if [ $PROFILE_COUNT -gt 0 ]; then - read -p "Remove $PROFILE_COUNT direnv profile links? (y/N) " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - REMOVE_PROFILES=true - fi - fi - - # Ask about result symlinks - REMOVE_RESULTS=false - if [ $RESULT_COUNT -gt 0 ]; then - read -p "Remove $RESULT_COUNT result symlinks? (y/N) " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - REMOVE_RESULTS=true - fi - fi - - # Remove direnv profiles if approved - if [ "$REMOVE_PROFILES" = true ]; then - echo "Removing direnv profiles..." - find ~/proj -name 'flake-profile-*-link' -path '*/.direnv/*' -delete 2>/dev/null || true - echo "Done." - fi - - # Remove result symlinks if approved - if [ "$REMOVE_RESULTS" = true ]; then - echo "Removing result symlinks..." - find ~/proj -maxdepth 3 -name 'result' -type l -delete 2>/dev/null || true - [ -L ~/result ] && rm ~/result - echo "Done." - fi - - echo -fi - -# Detect nix installation type -if [ -f /etc/profile.d/nix.sh ]; then - # Multi-user install - echo "Detected multi-user Nix installation" - echo - echo "Running garbage collection (user profile)..." - nix-collect-garbage -d - - echo - echo "Running garbage collection (system-wide, requires sudo)..." - sudo bash -c ". /etc/profile.d/nix.sh && nix-collect-garbage -d" - - echo - echo "Optimizing store (requires sudo)..." - sudo bash -c ". /etc/profile.d/nix.sh && nix-store --optimize" -else - # Single-user install - echo "Detected single-user Nix installation" - echo - echo "Running garbage collection..." - nix-collect-garbage -d - - echo - echo "Optimizing store..." - nix-store --optimize -fi - -# Show final size -echo -echo "Final /nix/store size:" -du -sh /nix/store - -echo -echo "=== Cleanup complete ===" diff --git a/setup-pi.md b/setup-pi.md index 1f5cb21..1260299 100644 --- a/setup-pi.md +++ b/setup-pi.md @@ -1,4 +1,4 @@ -# Setting Up Dotfiles on Debian Trixie & Raspberry Pi 4 +Setting Up Dotfiles on Debian Trixie & Raspberry Pi 4 Quick guide for setting up this dotfiles repository on Debian Trixie running on Raspberry Pi 4. @@ -202,4 +202,3 @@ source ~/.bashrc # Create a symlink to the nvim binary in /usr/local/bin to make it available globally sudo ln -sf /opt/nvim-linux64/bin/nvim /usr/local/bin/nvim ``` - diff --git a/stow-dotfiles.sh b/stow-dotfiles.sh index 34e0547..1fa3814 100755 --- a/stow-dotfiles.sh +++ b/stow-dotfiles.sh @@ -1,15 +1,18 @@ #!/bin/bash -# OS-aware stow script - only stows relevant dotfiles based on OS +# OS-aware stow script - stows relevant dotfiles based on OS +# Uses new directory structure: stow/common/, stow/macos/, stow/linux/, stow/pi/ set -e -# Get script directory (works with bash) +# Get script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)" cd "$SCRIPT_DIR" +# Detect OS OS=$(uname -s) +ARCH=$(uname -m) -# Detect NixOS specifically (not just any Linux) +# Detect NixOS specifically IS_NIXOS=false if [[ "$OS" == "Linux" ]]; then if [[ -f /etc/os-release ]]; then @@ -22,6 +25,22 @@ if [[ "$OS" == "Linux" ]]; then fi fi +# Detect Raspberry Pi (ARM64) +IS_PI=false +if [[ "$ARCH" == "aarch64" ]] || [[ "$ARCH" == "arm64" ]]; then + IS_PI=true +fi + +# Determine which OS-specific directory to use +STOW_OS="" +if [[ "$OS" == "Darwin" ]]; then + STOW_OS="macos" +elif [[ "$IS_PI" == "true" ]]; then + STOW_OS="pi" +elif [[ "$OS" == "Linux" ]]; then + STOW_OS="linux" +fi + # Allow passing stow flags (defaults to --adopt if no arguments provided) # Pass empty string "" to skip --adopt flag if [[ $# -eq 0 ]]; then @@ -32,45 +51,14 @@ else STOW_FLAGS="$1" fi -# Common packages (work on both macOS and Linux) -COMMON=( - bash - nvim - git - direnv - ssh - docker - gh - op - npm - vim - 1Password -) - -# macOS-specific packages -MACOS_PACKAGES=( - act - iterm2 - orbstack - cursor - oh-my-zsh - zsh - zprofile - yarn - nvm - verdaccio - husky -) - -# Note: nix/ folder is not stowed automatically -# It should be managed manually or via NixOS configuration.nix - # Function to stow a package if it exists and is not empty stow_package() { local pkg="$1" - if [[ -d "$pkg" ]] && [[ -n "$(ls -A "$pkg" 2>/dev/null)" ]]; then + local dir="stow/$pkg" + + if [[ -d "$dir" ]] && [[ -n "$(ls -A "$dir" 2>/dev/null)" ]]; then echo "📦 Stowing $pkg..." - if stow $STOW_FLAGS "$pkg" 2>/dev/null; then + if stow $STOW_FLAGS -d stow -t "$HOME" "$pkg" 2>/dev/null; then echo " ✅ $pkg stowed successfully" else echo " ⚠️ Warning: Could not stow $pkg (may already be stowed or have conflicts)" @@ -81,27 +69,20 @@ stow_package() { } # Main execution -echo "🔗 Setting up dotfiles for $(uname -s)..." +echo "🔗 Setting up dotfiles for $OS..." echo "" -# Stow common packages +# Stow common packages (work on all OSes) echo "📦 Stowing common packages..." -for pkg in "${COMMON[@]}"; do - stow_package "$pkg" -done +stow_package "common" # Stow OS-specific packages -if [[ "$OS" == "Darwin" ]]; then +if [[ -n "$STOW_OS" ]]; then echo "" - echo "🍎 Stowing macOS-specific packages..." - for pkg in "${MACOS_PACKAGES[@]}"; do - stow_package "$pkg" - fi + echo "📦 Stowing $STOW_OS-specific packages..." + stow_package "$STOW_OS" fi -# Note: nix/ folder is not stowed automatically -# It should be managed manually or via NixOS configuration.nix - echo "" echo "✅ Dotfiles setup complete!" echo "" diff --git a/.profile b/stow/common/.profile similarity index 100% rename from .profile rename to stow/common/.profile diff --git a/bash/.bash_aliases b/stow/common/bash/.bash_aliases similarity index 100% rename from bash/.bash_aliases rename to stow/common/bash/.bash_aliases diff --git a/bash/.bash_login b/stow/common/bash/.bash_login similarity index 100% rename from bash/.bash_login rename to stow/common/bash/.bash_login diff --git a/bash/.bash_profile b/stow/common/bash/.bash_profile similarity index 100% rename from bash/.bash_profile rename to stow/common/bash/.bash_profile diff --git a/bash/.bashrc b/stow/common/bash/.bashrc similarity index 100% rename from bash/.bashrc rename to stow/common/bash/.bashrc diff --git a/bash/.inputrc b/stow/common/bash/.inputrc similarity index 100% rename from bash/.inputrc rename to stow/common/bash/.inputrc diff --git a/direnv/.config/direnv/direnvrc b/stow/common/direnv/.config/direnv/direnvrc similarity index 100% rename from direnv/.config/direnv/direnvrc rename to stow/common/direnv/.config/direnv/direnvrc diff --git a/stow/common/docker/.docker/config.json b/stow/common/docker/.docker/config.json new file mode 100644 index 0000000..ab0e2f4 --- /dev/null +++ b/stow/common/docker/.docker/config.json @@ -0,0 +1,17 @@ +{ + "auths": { + "https://index.docker.io/v1/": {}, + "https://index.docker.io/v1/access-token": {}, + "https://index.docker.io/v1/refresh-token": {} + }, + "credsStore": "osxkeychain", + "currentContext": "orbstack", + "plugins": { + "-x-cli-hints": { + "enabled": "true" + } + }, + "features": { + "hooks": "true" + } +} \ No newline at end of file diff --git a/docker/.docker/daemon.json b/stow/common/docker/.docker/daemon.json similarity index 100% rename from docker/.docker/daemon.json rename to stow/common/docker/.docker/daemon.json diff --git a/gh/.config/gh/config.yml b/stow/common/gh/.config/gh/config.yml similarity index 100% rename from gh/.config/gh/config.yml rename to stow/common/gh/.config/gh/config.yml diff --git a/gh/.config/gh/hosts.yml b/stow/common/gh/.config/gh/hosts.yml similarity index 100% rename from gh/.config/gh/hosts.yml rename to stow/common/gh/.config/gh/hosts.yml diff --git a/git/.gitconfig b/stow/common/git/.gitconfig similarity index 100% rename from git/.gitconfig rename to stow/common/git/.gitconfig diff --git a/git/.gitignore_global b/stow/common/git/.gitignore_global similarity index 100% rename from git/.gitignore_global rename to stow/common/git/.gitignore_global diff --git a/nvim/.config/nvim/.gitignore b/stow/common/nvim/.config/nvim/.gitignore similarity index 100% rename from nvim/.config/nvim/.gitignore rename to stow/common/nvim/.config/nvim/.gitignore diff --git a/nvim/.config/nvim/.neoconf.json b/stow/common/nvim/.config/nvim/.neoconf.json similarity index 100% rename from nvim/.config/nvim/.neoconf.json rename to stow/common/nvim/.config/nvim/.neoconf.json diff --git a/nvim/.config/nvim/LICENSE b/stow/common/nvim/.config/nvim/LICENSE similarity index 100% rename from nvim/.config/nvim/LICENSE rename to stow/common/nvim/.config/nvim/LICENSE diff --git a/nvim/.config/nvim/README.md b/stow/common/nvim/.config/nvim/README.md similarity index 100% rename from nvim/.config/nvim/README.md rename to stow/common/nvim/.config/nvim/README.md diff --git a/nvim/.config/nvim/init.lua b/stow/common/nvim/.config/nvim/init.lua similarity index 100% rename from nvim/.config/nvim/init.lua rename to stow/common/nvim/.config/nvim/init.lua diff --git a/nvim/.config/nvim/lazy-lock.json b/stow/common/nvim/.config/nvim/lazy-lock.json similarity index 100% rename from nvim/.config/nvim/lazy-lock.json rename to stow/common/nvim/.config/nvim/lazy-lock.json diff --git a/nvim/.config/nvim/lazyvim.json b/stow/common/nvim/.config/nvim/lazyvim.json similarity index 100% rename from nvim/.config/nvim/lazyvim.json rename to stow/common/nvim/.config/nvim/lazyvim.json diff --git a/nvim/.config/nvim/lua/config/autocmds.lua b/stow/common/nvim/.config/nvim/lua/config/autocmds.lua similarity index 100% rename from nvim/.config/nvim/lua/config/autocmds.lua rename to stow/common/nvim/.config/nvim/lua/config/autocmds.lua diff --git a/nvim/.config/nvim/lua/config/keymaps.lua b/stow/common/nvim/.config/nvim/lua/config/keymaps.lua similarity index 100% rename from nvim/.config/nvim/lua/config/keymaps.lua rename to stow/common/nvim/.config/nvim/lua/config/keymaps.lua diff --git a/nvim/.config/nvim/lua/config/lazy.lua b/stow/common/nvim/.config/nvim/lua/config/lazy.lua similarity index 100% rename from nvim/.config/nvim/lua/config/lazy.lua rename to stow/common/nvim/.config/nvim/lua/config/lazy.lua diff --git a/nvim/.config/nvim/lua/config/options.lua b/stow/common/nvim/.config/nvim/lua/config/options.lua similarity index 100% rename from nvim/.config/nvim/lua/config/options.lua rename to stow/common/nvim/.config/nvim/lua/config/options.lua diff --git a/nvim/.config/nvim/lua/plugins/laravel.lua b/stow/common/nvim/.config/nvim/lua/plugins/laravel.lua similarity index 100% rename from nvim/.config/nvim/lua/plugins/laravel.lua rename to stow/common/nvim/.config/nvim/lua/plugins/laravel.lua diff --git a/nvim/.config/nvim/lua/plugins/telescope.lua b/stow/common/nvim/.config/nvim/lua/plugins/telescope.lua similarity index 100% rename from nvim/.config/nvim/lua/plugins/telescope.lua rename to stow/common/nvim/.config/nvim/lua/plugins/telescope.lua diff --git a/nvim/.config/nvim/stylua.toml b/stow/common/nvim/.config/nvim/stylua.toml similarity index 100% rename from nvim/.config/nvim/stylua.toml rename to stow/common/nvim/.config/nvim/stylua.toml diff --git a/op/.config/op/config b/stow/common/op/.config/op/config similarity index 100% rename from op/.config/op/config rename to stow/common/op/.config/op/config diff --git a/stow/common/ssh/.ssh/1Password/config b/stow/common/ssh/.ssh/1Password/config new file mode 100644 index 0000000..d6cceac --- /dev/null +++ b/stow/common/ssh/.ssh/1Password/config @@ -0,0 +1,10 @@ +# This config file and the *.pub files in this folder are automatically +# generated and managed by 1Password. Any manual edits to this file or +# any *.pub file will be lost. +# +# You can include this file in your main SSH config by adding the +# following line to your ~/.ssh/config file: +# +# Include ~/.ssh/1Password/config + +Match all diff --git a/stow/common/ssh/.ssh/config b/stow/common/ssh/.ssh/config new file mode 100644 index 0000000..7332b15 --- /dev/null +++ b/stow/common/ssh/.ssh/config @@ -0,0 +1,11 @@ +# Added by OrbStack: 'orb' SSH host for Linux machines +# This only works if it's at the top of ssh_config (before any Host blocks). +# This won't be added again if you remove it. +Include ~/.orbstack/ssh/config + +Host * + AddKeysToAgent yes + UseKeychain yes + IdentityFile ~/.ssh/id_rsa + Include ~/.ssh/1Password/config + IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock" \ No newline at end of file diff --git a/vim/.vimrc b/stow/common/vim/.vimrc similarity index 100% rename from vim/.vimrc rename to stow/common/vim/.vimrc diff --git a/stow/linux/zsh/.zshrc b/stow/linux/zsh/.zshrc new file mode 100644 index 0000000..3c354f8 --- /dev/null +++ b/stow/linux/zsh/.zshrc @@ -0,0 +1,36 @@ +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +# ---- Basic Configuration ---- +export EDITOR="nvim" +export VISUAL="$EDITOR" + +# ---- Theme ---- +export ZSH="$HOME/.oh-my-zsh" +ZSH_THEME="robbyrussell" + +# ---- Plugins ---- +plugins=(git direnv zsh-autosuggestions zsh-autocomplete) + +# ---- Load oh-my-zsh ---- +source "$ZSH/oh-my-zsh.sh" + +# ---- User Configuration ---- +export PATH="$HOME/.local/bin:$PATH" + +# ---- Linux-specific aliases ---- +alias ll='ls -la' +alias la='ls -a' + +# ---- 1Password SSH Agent ---- +# Enable 1Password SSH agent on Linux +# Requires: op (1Password CLI) and op-ssh-agent +if command -v op &> /dev/null; then + # Set SSH_AUTH_SOCK for 1Password + export SSH_AUTH_SOCK="$HOME/.1Password/agent.sock" + + # Start op-ssh-agent if not running + if [ ! -S "$SSH_AUTH_SOCK" ]; then + op-ssh-agent --startup 2>/dev/null || true + fi +fi diff --git a/act/.actrc b/stow/macos/act/.actrc similarity index 100% rename from act/.actrc rename to stow/macos/act/.actrc diff --git a/husky/.husky/.gitignore b/stow/macos/husky/.husky/.gitignore similarity index 100% rename from husky/.husky/.gitignore rename to stow/macos/husky/.husky/.gitignore diff --git a/husky/.husky/pre-commit b/stow/macos/husky/.husky/pre-commit similarity index 100% rename from husky/.husky/pre-commit rename to stow/macos/husky/.husky/pre-commit diff --git a/iterm2/.iterm2_shell_integration.zsh b/stow/macos/iterm2/.iterm2_shell_integration.zsh similarity index 100% rename from iterm2/.iterm2_shell_integration.zsh rename to stow/macos/iterm2/.iterm2_shell_integration.zsh diff --git a/zprofile/.zprofile b/stow/macos/zprofile/.zprofile similarity index 100% rename from zprofile/.zprofile rename to stow/macos/zprofile/.zprofile diff --git a/zprofile/.zprofile.pysave b/stow/macos/zprofile/.zprofile.pysave similarity index 100% rename from zprofile/.zprofile.pysave rename to stow/macos/zprofile/.zprofile.pysave diff --git a/zsh/.osx_aliasrc b/stow/macos/zsh/.osx_aliasrc similarity index 100% rename from zsh/.osx_aliasrc rename to stow/macos/zsh/.osx_aliasrc diff --git a/zsh/.zshenv b/stow/macos/zsh/.zshenv similarity index 100% rename from zsh/.zshenv rename to stow/macos/zsh/.zshenv diff --git a/zsh/.zshrc b/stow/macos/zsh/.zshrc similarity index 99% rename from zsh/.zshrc rename to stow/macos/zsh/.zshrc index 19fa71c..1ab18bf 100644 --- a/zsh/.zshrc +++ b/stow/macos/zsh/.zshrc @@ -1,3 +1,5 @@ +# add homebrew sbin to path +export PATH="/opt/homebrew/sbin:$PATH" # OPENSPEC:START # OpenSpec shell completions configuration fpath=("/Users/jenc/.oh-my-zsh/custom/completions" $fpath) @@ -64,7 +66,6 @@ export NVM_DIR="$HOME/.nvm" # users are encouraged to define aliases within the ZSH_CUSTOM folder. # For a full list of active aliases, run `alias`. - # use iterm2 on zsh init source ~/.iterm2_shell_integration.zsh @@ -116,8 +117,6 @@ if [[ -f /opt/homebrew/opt/mysql/bin/mysql ]]; then export PATH="/opt/homebrew/opt/mysql@8.4/bin:$PATH" export PATH="/opt/homebrew/opt/mysql-client/bin:$PATH" fi -# add homebrew sbin to path -export PATH="/opt/homebrew/sbin:$PATH" # Load fnm (Fast Node Manager) eval "$(fnm env --use-on-cd)" diff --git a/stow/pi/zsh/.zshrc b/stow/pi/zsh/.zshrc new file mode 100644 index 0000000..62b6498 --- /dev/null +++ b/stow/pi/zsh/.zshrc @@ -0,0 +1,19 @@ +# Raspberry Pi-specific zsh configuration +# Inherits from Linux config, add Pi-specific overrides here + +# ---- Source Linux base config ---- +if [ -f "$HOME/.dotfiles/stow/linux/zsh/.zshrc" ]; then + source "$HOME/.dotfiles/stow/linux/zsh/.zshrc" +fi + +# ---- Pi-specific aliases ---- +# Example Pi-specific aliases: +# alias pi-temp='vcgencmd measure_temp' +# alias pi-reboot='sudo reboot' + +# ---- Pi-specific paths ---- +# Add any Pi-specific paths here + +# ---- Hardware-specific ---- +# For Raspberry Pi hardware utilities +# export PATH="$HOME/.local/bin:$PATH" diff --git a/verdaccio/.config/verdaccio/config.yaml b/verdaccio/.config/verdaccio/config.yaml deleted file mode 100644 index fa5de1a..0000000 --- a/verdaccio/.config/verdaccio/config.yaml +++ /dev/null @@ -1,201 +0,0 @@ -# -# This is the default configuration file. It allows all users to do anything, -# please read carefully the documentation and best practices to -# improve security. -# -# Look here for more config file examples: -# https://github.com/verdaccio/verdaccio/tree/6.x/conf -# -# Read about the best practices -# https://verdaccio.org/docs/best - -# path to a directory with all packages -storage: /Users/jenc/.local/share/verdaccio/storage -# path to a directory with plugins to include -plugins: ./plugins - -# https://verdaccio.org/docs/webui -web: - title: Verdaccio - # comment out to disable gravatar support - # gravatar: false - # by default packages are ordercer ascendant (asc|desc) - # sort_packages: asc - # convert your UI to the dark side - # darkMode: true - # html_cache: true - # by default all features are displayed - login: true - # showInfo: true - # showSettings: true - # In combination with darkMode you can force specific theme - # showThemeSwitch: true - # showFooter: true - # showSearch: true - # showRaw: true - # showDownloadTarball: true - # HTML tags injected after manifest - # scriptsBodyAfter: - # - '' - # HTML tags injected before ends - # metaScripts: - # - '' - # - '' - # - '' - # HTML tags injected first child at - # bodyBefore: - # - '
html before webpack scripts
' - # Public path for template manifest scripts (only manifest) - # publicPath: http://somedomain.org/ - -# https://verdaccio.org/docs/configuration#authentication -auth: - htpasswd: - file: ./htpasswd - # Maximum amount of users allowed to register, defaults to "+inf". - # You can set this to -1 to disable registration. - # max_users: 1000 - # Hash algorithm, possible options are: "bcrypt", "md5", "sha1", "crypt". - # algorithm: bcrypt # by default is crypt, but is recommended use bcrypt for new installations - # Rounds number for "bcrypt", will be ignored for other algorithms. - # rounds: 10 - -# https://verdaccio.org/docs/configuration#uplinks -# a list of other known repositories we can talk to -uplinks: - npmjs: - url: https://registry.npmjs.org/ - -# Learn how to protect your packages -# https://verdaccio.org/docs/protect-your-dependencies/ -# https://verdaccio.org/docs/configuration#packages -packages: - '@*/*': - # scoped packages - access: $all - publish: $authenticated - unpublish: $authenticated - proxy: npmjs - - '**': - # allow all users (including non-authenticated users) to read and - # publish all packages - # - # you can specify usernames/groupnames (depending on your auth plugin) - # and three keywords: "$all", "$anonymous", "$authenticated" - access: $all - - # allow all known users to publish/publish packages - # (anyone can register by default, remember?) - publish: $authenticated - unpublish: $authenticated - - # if package is not available locally, proxy requests to 'npmjs' registry - proxy: npmjs - -# To improve your security configuration and avoid dependency confusion -# consider removing the proxy property for private packages -# https://verdaccio.org/docs/best#remove-proxy-to-increase-security-at-private-packages - -# https://verdaccio.org/docs/configuration#server -# You can specify HTTP/1.1 server keep alive timeout in seconds for incoming connections. -# A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout. -# WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enough. -server: - keepAliveTimeout: 60 - # Allow `req.ip` to resolve properly when Verdaccio is behind a proxy or load-balancer - # See: https://expressjs.com/en/guide/behind-proxies.html - # trustProxy: '127.0.0.1' - -# https://verdaccio.org/docs/configuration#offline-publish -# publish: -# allow_offline: false - -# https://verdaccio.org/docs/configuration#url-prefix -# url_prefix: /verdaccio/ -# VERDACCIO_PUBLIC_URL='https://somedomain.org'; -# url_prefix: '/my_prefix' -# // url -> https://somedomain.org/my_prefix/ -# VERDACCIO_PUBLIC_URL='https://somedomain.org'; -# url_prefix: '/' -# // url -> https://somedomain.org/ -# VERDACCIO_PUBLIC_URL='https://somedomain.org/first_prefix'; -# url_prefix: '/second_prefix' -# // url -> https://somedomain.org/second_prefix/' - -# https://verdaccio.org/docs/configuration#security -# security: -# api: -# legacy: true -# # recomended set to true for older installations -# migrateToSecureLegacySignature: true -# jwt: -# sign: -# expiresIn: 29d -# verify: -# someProp: [value] -# web: -# sign: -# expiresIn: 1h # 1 hour by default -# verify: -# someProp: [value] - -# https://verdaccio.org/docs/configuration#user-rate-limit -# userRateLimit: -# windowMs: 50000 -# max: 1000 - -# https://verdaccio.org/docs/configuration#max-body-size -max_body_size: 10mb - -# https://verdaccio.org/docs/configuration#listen-port -# listen: -# - localhost:4873 # default value -# - http://localhost:4873 # same thing -# - 0.0.0.0:4873 # listen on all addresses (INADDR_ANY) -# - https://example.org:4873 # if you want to use https -# - "[::1]:4873" # ipv6 -# - unix:/tmp/verdaccio.sock # unix socket - -# The HTTPS configuration is useful if you do not consider use a HTTP Proxy -# https://verdaccio.org/docs/configuration#https -# https: -# key: ./path/verdaccio-key.pem -# cert: ./path/verdaccio-cert.pem -# ca: ./path/verdaccio-csr.pem - -# https://verdaccio.org/docs/configuration#proxy -# http_proxy: http://something.local/ -# https_proxy: https://something.local/ - -# https://verdaccio.org/docs/configuration#notifications -# notify: -# method: POST -# headers: [{ "Content-Type": "application/json" }] -# endpoint: https://usagge.hipchat.com/v2/room/3729485/notification?auth_token=mySecretToken -# content: '{"color":"green","message":"New package published: * {{ name }}*","notify":true,"message_format":"text"}' - -middlewares: - audit: - enabled: true - -# https://verdaccio.org/docs/logger -# log settings -log: { type: stdout, format: pretty, level: http } -#experiments: -# # support for npm token command -# token: false -# # disable writing body size to logs, read more on ticket 1912 -# bytesin_off: false -# # enable tarball URL redirect for hosting tarball with a different server, the tarball_url_redirect can be a template string -# tarball_url_redirect: 'https://mycdn.com/verdaccio/${packageName}/${filename}' -# # the tarball_url_redirect can be a function, takes packageName and filename and returns the url, when working with a js configuration file -# tarball_url_redirect(packageName, filename) { -# const signedUrl = // generate a signed url -# return signedUrl; -# } - -# translate your registry, api i18n not available yet -# i18n: -# list of the available translations https://github.com/verdaccio/verdaccio/blob/master/packages/plugins/ui-theme/src/i18n/ABOUT_TRANSLATIONS.md -# web: en-US diff --git a/yarn/.yarnrc b/yarn/.yarnrc deleted file mode 100644 index 1b7b952..0000000 --- a/yarn/.yarnrc +++ /dev/null @@ -1,5 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -lastUpdateCheck 1745961778541