{ inputs, ... }: { flake.homeManagerModules.wisdomEditorsCursor = { config, lib, pkgs, ... }: let root = config.chiasson.home; cfg = config.chiasson.home.editors.cursor; cursorPkgs = inputs.cursor.packages.${pkgs.stdenv.hostPlatform.system} or { }; cursorPkg = if cursorPkgs ? cursor then cursorPkgs.cursor else if cursorPkgs ? default then cursorPkgs.default else null; cursorCli = if pkgs ? cursor-cli then pkgs.cursor-cli else null; nixIdeTools = [ pkgs.nixd pkgs.nixfmt ]; cursorWithNixIde = if cursorPkg == null then null else pkgs.symlinkJoin { name = "cursor-with-nix-ide"; paths = [ cursorPkg ]; buildInputs = [ pkgs.makeWrapper ]; postBuild = '' for prog in $out/bin/*; do if [ -x "$prog" ]; then wrapProgram "$prog" --prefix PATH : "${lib.makeBinPath nixIdeTools}" fi done ''; }; in { options.chiasson.home.editors.cursor = { enable = lib.mkEnableOption "Cursor editor from the `cursor` flake input."; setAsDefaultEditor = lib.mkOption { type = lib.types.bool; default = true; description = "`EDITOR` / `VISUAL` → `cursor --wait`."; }; nixIde = { enable = lib.mkEnableOption '' Nix IDE extension tooling (`nixd` LSP, `nixfmt` formatter). Installs `nixd` / `nixfmt` and wraps Cursor so they are on the editor `PATH` (the GUI does not inherit your shell profile). '' // { default = true; }; }; }; config = lib.mkIf (root.enable && cfg.enable && cursorPkg != null) { home.packages = [ (if cfg.nixIde.enable && cursorWithNixIde != null then cursorWithNixIde else cursorPkg) ] ++ lib.optionals (cursorCli != null) [ cursorCli ] ++ lib.optionals cfg.nixIde.enable nixIdeTools; # Cursor's updater drops a generic-linux binary here; remove it so `cursor-agent` resolves to cursor-cli. home.activation.removeBrokenCursorAgent = lib.hm.dag.entryAfter [ "writeBoundary" ] '' $DRY_RUN_CMD rm -f "$HOME/.local/bin/cursor-agent" ''; home.sessionVariables = lib.mkIf cfg.setAsDefaultEditor { EDITOR = "cursor --wait"; VISUAL = "cursor --wait"; }; }; }; }