diff --git a/flake.lock b/flake.lock index b32e564..dd3b75c 100644 --- a/flake.lock +++ b/flake.lock @@ -28,11 +28,11 @@ ] }, "locked": { - "lastModified": 1748489961, - "narHash": "sha256-uGnudxMoQi2c8rpPoHXuQSm80NBqlOiNF4xdT3hhzLM=", + "lastModified": 1751638848, + "narHash": "sha256-7HiC6w4ROEbMmKtj5pilnLOJej9HkkfU9wEd5QSTyNo=", "owner": "nix-community", "repo": "home-manager", - "rev": "95c988cf08e9a5a8fe7cc275d5e3f24e9e87bd51", + "rev": "7d9e3c35f0d46f82bac791d76260f15f53d83529", "type": "github" }, "original": { @@ -49,11 +49,11 @@ ] }, "locked": { - "lastModified": 1748352827, - "narHash": "sha256-sNUUP6qxGkK9hXgJ+p362dtWLgnIWwOCmiq72LAWtYo=", + "lastModified": 1751313918, + "narHash": "sha256-HsJM3XLa43WpG+665aGEh8iS8AfEwOIQWk3Mke3e7nk=", "owner": "nix-darwin", "repo": "nix-darwin", - "rev": "44a7d0e687a87b73facfe94fba78d323a6686a90", + "rev": "e04a388232d9a6ba56967ce5b53a8a6f713cdfcf", "type": "github" }, "original": { @@ -65,11 +65,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1748406211, - "narHash": "sha256-B3BsCRbc+x/d0WiG1f+qfSLUy+oiIfih54kalWBi+/M=", + "lastModified": 1751596331, + "narHash": "sha256-7WSzIrw0nCl8iYroj7c//LLsf2zgNEIJNyUSvx4MPLI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3d1f29646e4b57ed468d60f9d286cde23a8d1707", + "rev": "472908faa934435cf781ae8fac77291af3d137d3", "type": "github" }, "original": { @@ -88,11 +88,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1748508910, - "narHash": "sha256-KIe/4Vum4kUvj8BP5cNhc3yUdfyU1ajS/tKSxstVgZw=", + "lastModified": 1751642422, + "narHash": "sha256-hvYrV5Wu6EwIIVsq9hpnIacrvykgZ7SxgTQ4a465sag=", "owner": "nix-community", "repo": "NUR", - "rev": "624ce0fd6d30a2e9ed2bf8da7daab2b0a84ffa76", + "rev": "390876721dd32c9797da8935dd912477c4533311", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 41ce21f..1f8f60e 100644 --- a/flake.nix +++ b/flake.nix @@ -22,16 +22,14 @@ # Necessary for using flakes on this system. nix.settings.experimental-features = "nix-command flakes"; - - # Enable alternative shell support in nix-darwin. - # programs.fish.enable = true; + nix.settings.warn-dirty = false; # Set Git commit hash for darwin-version. system.configurationRevision = self.rev or self.dirtyRev or null; # Used for backwards compatibility, please read the changelog before changing. # $ darwin-rebuild changelog - system.stateVersion = 5; + system.stateVersion = 6; # The platform the configuration will be used on. nixpkgs.hostPlatform = "aarch64-darwin"; @@ -66,8 +64,13 @@ homebrew = { enable = true; - brews = []; - casks = [ "raycast" "firefox" "slack" ]; + brews = [ "asdf" "libyaml" "libpq" "k9s" + { + name = "postgresql@17"; + restart_service = "changed"; + } + ]; + casks = [ "raycast" "firefox" "slack" "google-chrome" "cursor" "qbittorrent" "vlc" "obsidian" ]; onActivation = { cleanup = "zap"; }; @@ -89,15 +92,13 @@ services = { - tailscale = { - enable = true; - }; + tailscale.enable = true; }; home-manager.useGlobalPkgs = true; home-manager.backupFileExtension = "bak"; home-manager.users.andrei = { - home.packages = []; + home.packages = [ pkgs.go]; home.stateVersion = "25.11"; programs = { @@ -126,6 +127,10 @@ packages = with pkgs.nur.repos.rycee.firefox-addons; [ ublock-origin onepassword-password-manager + sponsorblock + imagus + reddit-enhancement-suite + react-devtools ]; settings = {}; }; @@ -136,7 +141,7 @@ "full-screen-api.warning.timeout" = 0; "browser.fullscreen.exit_on_escape" = false; "browser.tabs.closeWindowWithLastTab" = false; - "browser.ctrlTab.recentlyUsedOrder" = true; + "browser.ctrlTab.sortByRecentlyUsed" = true; "browser.startup.page" = 3; }; }; @@ -154,6 +159,8 @@ pkgs.vscode-extensions.ms-dotnettools.csdevkit pkgs.vscode-extensions.ms-dotnettools.csharp pkgs.vscode-extensions.ms-dotnettools.vscode-dotnet-runtime + pkgs.vscode-extensions.shopify.ruby-lsp + pkgs.vscode-extensions.castwide.solargraph ]; userSettings = { "editor.fontSize" = 16; @@ -177,7 +184,7 @@ enable = true; enableZshIntegration = true; nix-direnv.enable = true; - #silent = true; + silent = true; }; zsh = { enable = true; @@ -190,6 +197,10 @@ syntaxHighlighting = { enable = true; }; + envExtra = '' + # Add asdf shims to PATH + export PATH="$HOME/.asdf/shims:$PATH" + ''; }; git = { enable = true; @@ -227,7 +238,6 @@ services = { ollama = { enable = true; - # loadModels = [ "llama3.2:3b" "deepseek-r1:1.5b" "devstral:24b" "gemma3:12b" "gemma3:1b" ]; }; }; }; diff --git a/scripts/edit-os b/scripts/edit-os.sh similarity index 100% rename from scripts/edit-os rename to scripts/edit-os.sh diff --git a/scripts/edit-os/.envrc b/scripts/edit-os/.envrc new file mode 100644 index 0000000..4f6ad48 --- /dev/null +++ b/scripts/edit-os/.envrc @@ -0,0 +1,2 @@ +watch_file gemset.nix +use flake diff --git a/scripts/edit-os/.gitignore b/scripts/edit-os/.gitignore new file mode 100644 index 0000000..92b2793 --- /dev/null +++ b/scripts/edit-os/.gitignore @@ -0,0 +1 @@ +.direnv diff --git a/scripts/edit-os/Gemfile b/scripts/edit-os/Gemfile new file mode 100644 index 0000000..e165c74 --- /dev/null +++ b/scripts/edit-os/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +# gem "rails" + +gem "ruby_llm", "~> 1.3" diff --git a/scripts/edit-os/Gemfile.lock b/scripts/edit-os/Gemfile.lock new file mode 100644 index 0000000..b74a98d --- /dev/null +++ b/scripts/edit-os/Gemfile.lock @@ -0,0 +1,42 @@ +GEM + remote: https://rubygems.org/ + specs: + base64 (0.3.0) + event_stream_parser (1.0.0) + faraday (2.13.1) + faraday-net_http (>= 2.0, < 3.5) + json + logger + faraday-multipart (1.1.0) + multipart-post (~> 2.0) + faraday-net_http (3.4.0) + net-http (>= 0.5.0) + faraday-retry (2.3.1) + faraday (~> 2.0) + json (2.12.2) + logger (1.7.0) + marcel (1.0.4) + multipart-post (2.4.1) + net-http (0.6.0) + uri + ruby_llm (1.3.0) + base64 + event_stream_parser (~> 1) + faraday (>= 1.10.0) + faraday-multipart (>= 1) + faraday-net_http (>= 1) + faraday-retry (>= 1) + marcel (~> 1.0) + zeitwerk (~> 2) + uri (1.0.3) + zeitwerk (2.7.3) + +PLATFORMS + arm64-darwin-24 + ruby + +DEPENDENCIES + ruby_llm (~> 1.3) + +BUNDLED WITH + 2.6.7 diff --git a/scripts/edit-os/edit_os.rb b/scripts/edit-os/edit_os.rb new file mode 100644 index 0000000..c9b1ac8 --- /dev/null +++ b/scripts/edit-os/edit_os.rb @@ -0,0 +1,9 @@ +require 'ruby_llm' + +RubyLLM.configure do |config| + config.ollama_api_base = "http://127.0.0.1:11434/v1" +end + +chat = RubyLLM.chat(model: 'qwen3:8b', provider: :ollama) + +print chat.ask "What's the best way to learn Ruby? Answer in 10 words or less /nothink" diff --git a/scripts/edit-os/flake.lock b/scripts/edit-os/flake.lock new file mode 100644 index 0000000..f6d958e --- /dev/null +++ b/scripts/edit-os/flake.lock @@ -0,0 +1,186 @@ +{ + "nodes": { + "bob-ruby": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1747288354, + "narHash": "sha256-OcnnbsQ0cKLhXA6T1ytaLUVZViBn5cZoXFsdlvRruSI=", + "owner": "bobvanderlinden", + "repo": "nixpkgs-ruby", + "rev": "5d7598f3059fff0cbd0dc4756f9d87f8cb7f3f7c", + "type": "github" + }, + "original": { + "owner": "bobvanderlinden", + "repo": "nixpkgs-ruby", + "type": "github" + } + }, + "bundix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1721093334, + "narHash": "sha256-5FghZ0HIETbc0TGcBV8uyixq5z4w/9PF5Puhujz3D1o=", + "owner": "inscapist", + "repo": "bundix", + "rev": "42c08846f7e5d91ef121239fd364feaeb22c0bbc", + "type": "github" + }, + "original": { + "owner": "inscapist", + "ref": "main", + "repo": "bundix", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1694529238, + "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "fu": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1748856973, + "narHash": "sha256-RlTsJUvvr8ErjPBsiwrGbbHYW8XbB/oek0Gi78XdWKg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e4b09e47ace7d87de083786b404bf232eb6c89d8", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1678875422, + "narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "bob-ruby": "bob-ruby", + "bundix": "bundix", + "fu": "fu", + "nixpkgs": "nixpkgs", + "ruby-nix": "ruby-nix" + } + }, + "ruby-nix": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1744623277, + "narHash": "sha256-0HWA2YD9v71SHyMF11PKnVJcHnrHhRLHDCldlUbzYII=", + "owner": "inscapist", + "repo": "ruby-nix", + "rev": "43964ced23803f49e2d307fbbfd4e03ed23760c0", + "type": "github" + }, + "original": { + "owner": "inscapist", + "repo": "ruby-nix", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/scripts/edit-os/flake.nix b/scripts/edit-os/flake.nix new file mode 100644 index 0000000..b13705d --- /dev/null +++ b/scripts/edit-os/flake.nix @@ -0,0 +1,92 @@ +{ + description = "A simple ruby app demo"; + + nixConfig = { + extra-substituters = "https://nixpkgs-ruby.cachix.org"; + extra-trusted-public-keys = "nixpkgs-ruby.cachix.org-1:vrcdi50fTolOxWCZZkw0jakOnUI1T19oYJ+PRYdK4SM="; + }; + + inputs = { + nixpkgs.url = "nixpkgs"; + ruby-nix.url = "github:inscapist/ruby-nix"; + # a fork that supports platform dependant gem + bundix = { + url = "github:inscapist/bundix/main"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + fu.url = "github:numtide/flake-utils"; + bob-ruby.url = "github:bobvanderlinden/nixpkgs-ruby"; + bob-ruby.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = + { + self, + nixpkgs, + fu, + ruby-nix, + bundix, + bob-ruby, + }: + with fu.lib; + eachDefaultSystem ( + system: + let + pkgs = import nixpkgs { + inherit system; + overlays = [ bob-ruby.overlays.default ]; + }; + rubyNix = ruby-nix.lib pkgs; + + # TODO generate gemset.nix with bundix + gemset = if builtins.pathExists ./gemset.nix then import ./gemset.nix else { }; + + # If you want to override gem build config, see + # https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/ruby-modules/gem-config/default.nix + gemConfig = { }; + + # See available versions here: https://github.com/bobvanderlinden/nixpkgs-ruby/blob/master/ruby/versions.json + ruby = pkgs."ruby-3.4.4"; + + # Running bundix would regenerate `gemset.nix` + bundixcli = bundix.packages.${system}.default; + + # Use these instead of the original `bundle ` commands + bundleLock = pkgs.writeShellScriptBin "bundle-lock" '' + export BUNDLE_PATH=vendor/bundle + bundle lock + ''; + bundleUpdate = pkgs.writeShellScriptBin "bundle-update" '' + export BUNDLE_PATH=vendor/bundle + bundle lock --update + ''; + in + rec { + inherit + (rubyNix { + inherit gemset ruby; + name = "my-rails-app"; + gemConfig = pkgs.defaultGemConfig // gemConfig; + }) + env + ; + + devShells = rec { + default = dev; + dev = pkgs.mkShell { + buildInputs = + [ + env + bundixcli + bundleLock + bundleUpdate + ] + ++ (with pkgs; [ + rufo + # more packages here + ]); + }; + }; + } + ); +} diff --git a/scripts/edit-os/gemset.nix b/scripts/edit-os/gemset.nix new file mode 100644 index 0000000..f8fef89 --- /dev/null +++ b/scripts/edit-os/gemset.nix @@ -0,0 +1,176 @@ +{ + base64 = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yx9yn47a8lkfcjmigk79fykxvr80r4m1i35q82sxzynpbm7lcr7"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "0.3.0"; + }; + event_stream_parser = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1j73glgif3f97q3znq9ih67h5i7zd1wqzj2d33w8cqhjf2mkns52"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "1.0.0"; + }; + faraday = { + dependencies = ["faraday-net_http" "json" "logger"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xbv450qj2bx0qz9l2pjrd3kc057y6bglc3na7a78zby8ssiwlyc"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "2.13.1"; + }; + faraday-multipart = { + dependencies = ["multipart-post"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0l87r9jg06nsh24gwwd1jdnxb1zq89ffybnxab0dd90nfcf0ysw5"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "1.1.0"; + }; + faraday-net_http = { + dependencies = ["net-http"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jp5ci6g40d6i50bsywp35l97nc2fpi9a592r2cibwicdb6y9wd1"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "3.4.0"; + }; + faraday-retry = { + dependencies = ["faraday"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00swh1var1576yvvz4yfw3xbg3y5ky47kg2rsdh57z213yigl120"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "2.3.1"; + }; + json = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1x5b8ipv6g0z44wgc45039k04smsyf95h2m5m67mqq35sa5a955s"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "2.12.2"; + }; + logger = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00q2zznygpbls8asz5knjvvj2brr3ghmqxgr83xnrdj4rk3xwvhr"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "1.7.0"; + }; + marcel = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "190n2mk8m1l708kr88fh6mip9sdsh339d2s6sgrik3sbnvz4jmhd"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "1.0.4"; + }; + multipart-post = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1a5lrlvmg2kb2dhw3lxcsv6x276bwgsxpnka1752082miqxd0wlq"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "2.4.1"; + }; + net-http = { + dependencies = ["uri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ysrwaabhf0sn24jrp0nnp51cdv0jf688mh5i6fsz63q2c6b48cn"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "0.6.0"; + }; + ruby_llm = { + dependencies = ["base64" "event_stream_parser" "faraday" "faraday-multipart" "faraday-net_http" "faraday-retry" "marcel" "zeitwerk"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bg6rmhr11ich5k2pc3yjdzf969hn2mcmj2k1wnqrkj8g87d8ydd"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "1.3.0"; + }; + uri = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04bhfvc25b07jaiaf62yrach7khhr5jlr5bx6nygg8pf11329wp9"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "1.0.3"; + }; + zeitwerk = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "119ypabas886gd0n9kiid3q41w76gz60s8qmiak6pljpkd56ps5j"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "2.7.3"; + }; +} \ No newline at end of file