Add worktrunk shell integration

This commit is contained in:
Sage 2026-03-31 11:35:38 +00:00
parent 55adebb809
commit 0829385802
3 changed files with 110 additions and 4 deletions

View file

@ -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;
};
};
}