From 55adebb809858ed27a96c03f2a9cc99ab1dc93bb Mon Sep 17 00:00:00 2001 From: Sage Date: Tue, 31 Mar 2026 11:19:04 +0000 Subject: [PATCH 1/2] Add worktrunk --- modules/home/terminal/development.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/home/terminal/development.nix b/modules/home/terminal/development.nix index b0f55d6..5bcaedf 100644 --- a/modules/home/terminal/development.nix +++ b/modules/home/terminal/development.nix @@ -30,5 +30,9 @@ in { programs.zsh.sessionVariables = lib.mkIf config.mods.terminal.zsh.enable { EDITOR = "nvim"; }; + + home.packages = with pkgs; [ + worktrunk + ]; }; } From 08293858022458d157c56e0cfc1a411cb792da2e Mon Sep 17 00:00:00 2001 From: Sage Date: Tue, 31 Mar 2026 11:35:38 +0000 Subject: [PATCH 2/2] Add worktrunk shell integration --- modules/home/terminal/default.nix | 1 + modules/home/terminal/development.nix | 10 ++- modules/home/terminal/worktrunk.nix | 103 ++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 modules/home/terminal/worktrunk.nix diff --git a/modules/home/terminal/default.nix b/modules/home/terminal/default.nix index 7beb495..0107465 100644 --- a/modules/home/terminal/default.nix +++ b/modules/home/terminal/default.nix @@ -17,6 +17,7 @@ ./zellij ./opencode ./gh.nix + ./worktrunk.nix ]; config = lib.mkIf osConfig.mods.desktop.enable { diff --git a/modules/home/terminal/development.nix b/modules/home/terminal/development.nix index 5bcaedf..81bec67 100644 --- a/modules/home/terminal/development.nix +++ b/modules/home/terminal/development.nix @@ -26,13 +26,15 @@ in { enableNushellIntegration = lib.mkIf config.mods.terminal.nushell.enable true; }; + programs.worktrunk = { + enable = true; + enableZshIntegration = lib.mkIf config.mods.terminal.zsh.enable true; + enableNushellIntegration = lib.mkIf config.mods.terminal.nushell.enable true; + }; + home.sessionVariables.EDITOR = "nvim"; programs.zsh.sessionVariables = lib.mkIf config.mods.terminal.zsh.enable { EDITOR = "nvim"; }; - - home.packages = with pkgs; [ - worktrunk - ]; }; } diff --git a/modules/home/terminal/worktrunk.nix b/modules/home/terminal/worktrunk.nix new file mode 100644 index 0000000..5d85528 --- /dev/null +++ b/modules/home/terminal/worktrunk.nix @@ -0,0 +1,103 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib) mkIf types; + + cfg = config.programs.worktrunk; +in { + options.programs.worktrunk = { + enable = lib.mkEnableOption "worktrunk, a CLI tool for managing work sessions"; + + package = lib.mkPackageOption pkgs "worktrunk" {nullable = true;}; + + enableBashIntegration = lib.hm.shell.mkBashIntegrationOption {inherit config;}; + + enableFishIntegration = lib.hm.shell.mkFishIntegrationOption {inherit config;}; + + enableNushellIntegration = lib.hm.shell.mkNushellIntegrationOption {inherit config;}; + + enableZshIntegration = lib.hm.shell.mkZshIntegrationOption {inherit config;}; + + shellWrapperName = lib.mkOption { + type = types.str; + default = "wt"; + example = "wt"; + description = '' + Name of the shell wrapper to be called. + ''; + }; + }; + + config = mkIf cfg.enable { + home.packages = mkIf (cfg.package != null) [cfg.package]; + + programs = let + bashIntegration = '' + ${cfg.shellWrapperName}() { + local directive_file=$(mktemp) + WORKTRUNK_DIRECTIVE_FILE="$directive_file" command ${ + if cfg.shellWrapperName != "wt" + then "wt" + else "\${WORKTRUNK_BIN:-wt}" + } "$@" + if [[ -s "$directive_file" ]]; then + source "$directive_file" + fi + rm -f "$directive_file" + } + ''; + + fishIntegration = '' + set -l directive_file (mktemp) + ${ + if cfg.shellWrapperName != "wt" + then '' + env WORKTRUNK_DIRECTIVE_FILE=$directive_file wt $argv'' + else '' + set -q WORKTRUNK_BIN; or set -l WORKTRUNK_BIN wt + env WORKTRUNK_DIRECTIVE_FILE=$directive_file $WORKTRUNK_BIN $argv'' + } + if test -s "$directive_file" + set -l directive (string collect < "$directive_file") + eval $directive + end + command rm -f "$directive_file" + ''; + + nushellIntegration = '' + def --env --wrapped ${cfg.shellWrapperName} [...args] { + let directive_file = (mktemp --tmpdir) + let worktrunk_bin = (${ + if cfg.shellWrapperName != "wt" + then "'wt'" + else "$env.WORKTRUNK_BIN? | default 'wt'" + }) + with-env { WORKTRUNK_DIRECTIVE_FILE: $directive_file } { + ^$worktrunk_bin ...$args + } + if ($directive_file | path exists) { + let directives = open $directive_file --raw | str trim | lines + for directive in $directives { + if ($directive | str starts-with "cd '") { + let target_dir = $directive | str substring 4..-2 + cd $target_dir + } + } + } + rm -f $directive_file + } + ''; + in { + bash.initExtra = mkIf cfg.enableBashIntegration bashIntegration; + + zsh.initContent = mkIf cfg.enableZshIntegration bashIntegration; + + fish.functions.${cfg.shellWrapperName} = mkIf cfg.enableFishIntegration fishIntegration; + + nushell.extraConfig = mkIf cfg.enableNushellIntegration nushellIntegration; + }; + }; +}