diff --git a/dot_agents/dot_skill-lock.json b/dot_agents/dot_skill-lock.json index cce89b88..0bc01d71 100644 --- a/dot_agents/dot_skill-lock.json +++ b/dot_agents/dot_skill-lock.json @@ -105,9 +105,9 @@ "sourceType": "github", "sourceUrl": "https://github.com/blader/humanizer.git", "skillPath": "SKILL.md", - "skillFolderHash": "a2ace14a88a6746f64f1f53ed8272d6788828038", + "skillFolderHash": "9600f2b7241cb4eed6ad803abee5ea01d67fe8e4", "installedAt": "2026-05-25T13:30:00.000Z", - "updatedAt": "2026-05-30T10:38:26.596Z" + "updatedAt": "2026-06-08T08:48:15.298Z" }, "kagi-cli": { "source": "/Users/joelazar/Code/rust/kagi-cli/docs", @@ -258,9 +258,9 @@ "sourceType": "github", "sourceUrl": "https://github.com/pbakaus/impeccable.git", "skillPath": ".agents/skills/impeccable/SKILL.md", - "skillFolderHash": "6cb8c637f757ba5b580c1d5398309ba80f350dbc", + "skillFolderHash": "9fe84c4d60e8cfc09cc38cc873918ba2fd8f1495", "installedAt": "2026-05-30T10:39:26.849Z", - "updatedAt": "2026-05-30T10:39:26.849Z" + "updatedAt": "2026-06-08T08:48:24.674Z" } }, "dismissed": { diff --git a/dot_claude/settings.json b/dot_claude/settings.json index a3f39344..7bbed9ec 100644 --- a/dot_claude/settings.json +++ b/dot_claude/settings.json @@ -118,11 +118,11 @@ }, "effortLevel": "high", "autoUpdatesChannel": "stable", + "tui": "fullscreen", "showThinkingSummaries": true, "skipDangerousModePermissionPrompt": true, "theme": "dark-ansi", "preferredNotifChannel": "ghostty", "fileCheckpointingEnabled": false, - "voiceEnabled": false, - "tui": "fullscreen" + "voiceEnabled": false } diff --git a/dot_config/television/cable/aerospace-windows.toml b/dot_config/television/cable/aerospace-windows.toml new file mode 100644 index 00000000..caab471a --- /dev/null +++ b/dot_config/television/cable/aerospace-windows.toml @@ -0,0 +1,26 @@ +[metadata] +name = "aerospace-windows" +description = "List and manage AeroSpace windows" +requirements = ["aerospace", "awk"] + +[source] +command = '''aerospace list-windows --all \ + --format '%{window-id}%{tab}%{workspace}%{tab}%{app-name}%{tab}%{window-title}' \ + | awk -F'\t' '$3 != "AeroSpace" {printf "%s\t[%s] %s | %s\n", $1, $2, $3, $4}' +''' +display = "{split:\\t:1}" +output = "{split:\\t:0}" + +[keybindings] +enter = "actions:focus" +ctrl-x = [ "actions:close", "reload_source" ] + +[actions.focus] +description = "Focus the selected window" +command = "aerospace focus --window-id '{split:\\t:0}'" +mode = "execute" + +[actions.close] +description = "Close the selected window" +command = "aerospace close --window-id '{split:\\t:0}'" +mode = "fork" diff --git a/dot_config/television/cable/brew-packages.toml b/dot_config/television/cable/brew-packages.toml index 18086ca6..83ba5415 100644 --- a/dot_config/television/cable/brew-packages.toml +++ b/dot_config/television/cable/brew-packages.toml @@ -5,8 +5,8 @@ requirements = ["brew"] [source] command = [ - "brew list --formula", - "brew list --cask", + { name = "Formulae", run = "brew list --formula" }, + { name = "Casks", run = "brew list --cask" }, ] [preview] diff --git a/dot_config/television/cable/dirs.toml b/dot_config/television/cable/dirs.toml index 4f283130..3647c9e6 100644 --- a/dot_config/television/cable/dirs.toml +++ b/dot_config/television/cable/dirs.toml @@ -4,7 +4,10 @@ description = "A channel to select from directories" requirements = ["fd"] [source] -command = ["fd -t d", "fd -t d --hidden"] +command = [ + { name = "Default", run = "fd -t d" }, + { name = "Hidden", run = "fd -t d --hidden" }, +] [preview] command = "ls -la --color=always '{}'" diff --git a/dot_config/television/cable/docker-containers.toml b/dot_config/television/cable/docker-containers.toml index d13c21d0..a5f2953d 100644 --- a/dot_config/television/cable/docker-containers.toml +++ b/dot_config/television/cable/docker-containers.toml @@ -5,8 +5,8 @@ requirements = ["docker", "jq"] [source] command = [ - "docker ps --format '{{.Names}}\\t{{.Image}}\\t{{.Status}}'", - "docker ps -a --format '{{.Names}}\\t{{.Image}}\\t{{.Status}}'", + { name = "Running", run = "docker ps --format '{{.Names}}\\t{{.Image}}\\t{{.Status}}'" }, + { name = "All", run = "docker ps -a --format '{{.Names}}\\t{{.Image}}\\t{{.Status}}'" }, ] display = "{split:\\t:0} ({split:\\t:2})" output = "{split:\\t:0}" diff --git a/dot_config/television/cable/files.toml b/dot_config/television/cable/files.toml index 8e5a3369..0596163a 100644 --- a/dot_config/television/cable/files.toml +++ b/dot_config/television/cable/files.toml @@ -4,16 +4,13 @@ description = "A channel to select files and directories" requirements = ["fd", "bat"] [source] -# Press Ctrl+S to cycle between modes: -# files, gitignored files, hidden + gitignored files, -# directories, gitignored directories, hidden + gitignored directories command = [ - "fd -t f", - "fd -t f -I", - "fd -t f -H -I", - "fd -t d", - "fd -t d -I", - "fd -t d -H -I", + { name = "Files", run = "fd -t f" }, + { name = "Files +ignored", run = "fd -t f -I" }, + { name = "Files +hidden", run = "fd -t f -H -I" }, + { name = "Dirs", run = "fd -t d" }, + { name = "Dirs +ignored", run = "fd -t d -I" }, + { name = "Dirs +hidden", run = "fd -t d -H -I" }, ] [preview] diff --git a/dot_config/television/cable/fj-issues.toml b/dot_config/television/cable/fj-issues.toml new file mode 100644 index 00000000..ea9b78a4 --- /dev/null +++ b/dot_config/television/cable/fj-issues.toml @@ -0,0 +1,37 @@ +[metadata] +name = "fj-issues" +description = "List Forgejo issues for the current repo" +requirements = ["fj", "bat"] + +[source] +command = '''fj issue search --state open | awk -F ' [(]by ' '/^#[0-9]+:/ { + number=$1; sub(/^#/,"",number); sub(/: .*/,"",number) + title=$1; sub(/^#[0-9]+: /,"",title) + author=$2; sub(/\)$/,"",author) + printf "\033[32m#%s\033[39m\t%s \033[33m@%s\033[39m\n", number, title, author +}' ''' +ansi = true +output = "{strip_ansi|split:\t:0|replace:s/^#//}" + +[ui] +layout = "portrait" +preview_panel = { header = '{strip_ansi|split:\t:1}' } + +[preview] +command = "fj issue view {strip_ansi|split:\t:0|replace:s/^#//} | bat --language=md --style=plain --color=always" +env = { BAT_THEME = "ansi" } + +[actions.open] +description = "Open the issue in the browser" +command = "fj issue browse {strip_ansi|split:\t:0|replace:s/^#//}" +mode = "fork" + +[actions.close] +description = "Close the selected issue" +command = "fj issue close {strip_ansi|split:\t:0|replace:s/^#//}" +mode = "fork" + +[actions.comment] +description = "Add a comment to the selected issue" +command = "fj issue comment {strip_ansi|split:\t:0|replace:s/^#//}" +mode = "execute" diff --git a/dot_config/television/cable/fj-prs.toml b/dot_config/television/cable/fj-prs.toml new file mode 100644 index 00000000..189c1da9 --- /dev/null +++ b/dot_config/television/cable/fj-prs.toml @@ -0,0 +1,42 @@ +[metadata] +name = "fj-prs" +description = "List Forgejo PRs for the current repo" +requirements = ["fj", "bat"] + +[source] +command = '''fj pr search --state open | awk -F ' [(]by ' '/^#[0-9]+:/ { + number=$1; sub(/^#/,"",number); sub(/: .*/,"",number) + title=$1; sub(/^#[0-9]+: /,"",title) + author=$2; sub(/\)$/,"",author) + printf "\033[32m#%s\033[39m\t%s \033[33m@%s\033[39m\n", number, title, author +}' ''' +ansi = true +output = "{strip_ansi|split:\t:0|replace:s/^#//}" + +[ui] +layout = "portrait" +preview_panel = { header = '{strip_ansi|split:\t:1}' } + +[preview] +command = "fj pr view {strip_ansi|split:\t:0|replace:s/^#//} | bat --language=md --style=plain --color=always" +env = { BAT_THEME = "ansi" } + +[actions.open] +description = "Open the PR in the browser" +command = "fj pr browse {strip_ansi|split:\t:0|replace:s/^#//}" +mode = "fork" + +[actions.checkout] +description = "Checkout the PR branch locally" +command = "fj pr checkout {strip_ansi|split:\t:0|replace:s/^#//}" +mode = "execute" + +[actions.merge] +description = "Merge the selected PR" +command = "fj pr merge {strip_ansi|split:\t:0|replace:s/^#//}" +mode = "execute" + +[actions.diff] +description = "View the PR diff" +command = "fj pr view {strip_ansi|split:\t:0|replace:s/^#//} diff | less" +mode = "execute" diff --git a/dot_config/television/cable/images.toml b/dot_config/television/cable/images.toml index 6bbc7d6c..ec1c222e 100644 --- a/dot_config/television/cable/images.toml +++ b/dot_config/television/cable/images.toml @@ -5,8 +5,8 @@ requirements = ["fd", "chafa"] [source] command = [ - "fd -t f -e png -e jpg -e jpeg -e gif -e webp -e bmp -e svg .", - "fd -t f -e png -e jpg -e jpeg -e gif -e webp -e bmp -e svg -H .", + { name = "Default", run = "fd -t f -e png -e jpg -e jpeg -e gif -e webp -e bmp -e svg ." }, + { name = "Hidden", run = "fd -t f -e png -e jpg -e jpeg -e gif -e webp -e bmp -e svg -H ." }, ] [preview] diff --git a/dot_config/television/cable/k8s-deployments.toml b/dot_config/television/cable/k8s-deployments.toml index 23a42487..52614cd5 100644 --- a/dot_config/television/cable/k8s-deployments.toml +++ b/dot_config/television/cable/k8s-deployments.toml @@ -11,16 +11,20 @@ Press `ctrl-d` to delete the selected Deployment. requirements = ["kubectl"] [source] -command = [ - ''' - kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' - ''', - ''' - kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' --all-namespaces - ''', -] output = "{1}" +[[source.command]] +name = "Current ns" +run = ''' +kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' +''' + +[[source.command]] +name = "All namespaces" +run = ''' +kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' --all-namespaces +''' + [preview] command = "kubectl describe -n {0} deployments/{1}" diff --git a/dot_config/television/cable/k8s-pods.toml b/dot_config/television/cable/k8s-pods.toml index 9197b9ec..7ca72d65 100644 --- a/dot_config/television/cable/k8s-pods.toml +++ b/dot_config/television/cable/k8s-pods.toml @@ -13,16 +13,20 @@ Press `ctrl-l` to print and follow the logs of the selected Pod. requirements = ["kubectl"] [source] -command = [ - ''' - kubectl get pods -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' - ''', - ''' - kubectl get pods -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' --all-namespaces - ''', -] output = "{1}" +[[source.command]] +name = "Current ns" +run = ''' +kubectl get pods -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' +''' + +[[source.command]] +name = "All namespaces" +run = ''' +kubectl get pods -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' --all-namespaces +''' + [preview] command = "kubectl describe -n {0} pods/{1}" diff --git a/dot_config/television/cable/k8s-services.toml b/dot_config/television/cable/k8s-services.toml index 2b912af8..feeeb1a5 100644 --- a/dot_config/television/cable/k8s-services.toml +++ b/dot_config/television/cable/k8s-services.toml @@ -11,16 +11,20 @@ Press `ctrl-d` to delete the selected Service. requirements = ["kubectl"] [source] -command = [ - ''' - kubectl get services -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' - ''', - ''' - kubectl get services -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' --all-namespaces - ''', -] output = "{1}" +[[source.command]] +name = "Current ns" +run = ''' +kubectl get services -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' +''' + +[[source.command]] +name = "All namespaces" +run = ''' +kubectl get services -o go-template --template '{{range .items}}{{.metadata.namespace}} {{.metadata.name}}{{"\n"}}{{end}}' --all-namespaces +''' + [preview] command = "kubectl describe -n {0} services/{1}" diff --git a/dot_config/television/cable/opencode-sessions.toml b/dot_config/television/cable/opencode-sessions.toml index e13ec691..d8324a48 100644 --- a/dot_config/television/cable/opencode-sessions.toml +++ b/dot_config/television/cable/opencode-sessions.toml @@ -11,7 +11,7 @@ output = "{split:\t:0}" [preview] # We use triple single quotes so we don't have to escape the backslashes for jq or the template engine -command = '''opencode session list --format json | jq -r '.[] | select(.id == "{split:\t:0}") | "TITLE: \(.title)\nID: \(.id)\nPROJECT: \(.projectId)\nDIRECTORY: \(.directory)\nUPDATED: \((.updated / 1000) | strftime("%Y-%m-%d %H:%M:%S"))"'''' +command = '''opencode session list --format json | jq -r '.[] | select(.id == "{split:\t:0}") | "TITLE: \(.title)\nID: \(.id)\nPROJECT: \(.projectId)\nDIRECTORY: \(.directory)\nUPDATED: \((.updated / 1000) | strftime("%Y-%m-%d %H:%M:%S"))"' ''' [ui] layout = "landscape" @@ -32,5 +32,5 @@ mode = "execute" [actions.delete] description = "Delete session" -command = '''bash -c 'echo "Delete {split:\t:1}?" && read -p "[y/N]: " conf && [[ $conf == "y" ]] && opencode session delete {split:\t:0} '''' +command = '''bash -c 'echo "Delete {split:\t:1}?" && read -p "[y/N]: " conf && [[ $conf == "y" ]] && opencode session delete {split:\t:0} ' ''' mode = "execute" diff --git a/dot_config/television/cable/pdf-files.toml b/dot_config/television/cable/pdf-files.toml index 018aad47..0a2fae83 100644 --- a/dot_config/television/cable/pdf-files.toml +++ b/dot_config/television/cable/pdf-files.toml @@ -5,8 +5,8 @@ requirements = ["fd", "pdftotext"] [source] command = [ - "fd -t f -e pdf .", - "fd -t f -e pdf -H .", + { name = "Default", run = "fd -t f -e pdf ." }, + { name = "Hidden", run = "fd -t f -e pdf -H ." }, ] [preview] diff --git a/dot_config/television/cable/podman-containers.toml b/dot_config/television/cable/podman-containers.toml index 27af478c..bff5278f 100644 --- a/dot_config/television/cable/podman-containers.toml +++ b/dot_config/television/cable/podman-containers.toml @@ -5,8 +5,8 @@ requirements = ["podman", "jq"] [source] command = [ - "podman ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}'", - "podman ps -a --format '{{.Names}}\t{{.Image}}\t{{.Status}}'", + { name = "Running", run = "podman ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}'" }, + { name = "All", run = "podman ps -a --format '{{.Names}}\t{{.Image}}\t{{.Status}}'" }, ] display = "{split:\t:0} ({split:\t:2})" output = "{split:\t:0}" diff --git a/dot_config/television/cable/recent-files.toml b/dot_config/television/cable/recent-files.toml index 661d2043..4cf94331 100644 --- a/dot_config/television/cable/recent-files.toml +++ b/dot_config/television/cable/recent-files.toml @@ -5,8 +5,8 @@ requirements = ["git", "bat"] [source] command = [ - "git diff --name-only HEAD~10 HEAD 2>/dev/null || find . -type f -mtime -7 -not -path '*/.*' 2>/dev/null | head -100", - "find . -type f -mmin -60 -not -path '*/.*' 2>/dev/null | head -100", + { name = "Recent", run = "git diff --name-only HEAD~10 HEAD 2>/dev/null || find . -type f -mtime -7 -not -path '*/.*' 2>/dev/null | head -100" }, + { name = "Last hour", run = "find . -type f -mmin -60 -not -path '*/.*' 2>/dev/null | head -100" }, ] [preview] diff --git a/dot_config/television/cable/sesh.toml b/dot_config/television/cable/sesh.toml index 748da0a9..05c13869 100644 --- a/dot_config/television/cable/sesh.toml +++ b/dot_config/television/cable/sesh.toml @@ -10,13 +10,15 @@ requirements = ["sesh", "fd"] # Multiple source commands for cycling through different modes # Press Ctrl+S to cycle between sources command = [ - "sesh list --icons", # all sessions (default) - "sesh list -t --icons", # tmux sessions only - "sesh list -c --icons", # config directories - "sesh list -z --icons", # zoxide directories - "fd -H -d 2 -t d -E .Trash . ~" # find directories + { name = "All", run = "sesh list --icons" }, + { name = "Tmux", run = "sesh list -t --icons" }, + { name = "Configs", run = "sesh list -c --icons" }, + { name = "Zoxide", run = "sesh list -z --icons" }, + { name = "Directories", run = "fd -H -d 2 -t d -E .Trash . ~" }, ] ansi = true +frecency = false # handled by sesh +no_sort = true # handled by sesh output = "{strip_ansi|split: :1..|join: }" [preview] @@ -24,7 +26,7 @@ command = "sesh preview '{strip_ansi|split: :1..|join: }'" [keybindings] enter = "actions:connect" -ctrl-d = [ "actions:kill_session", "reload_source" ] +ctrl-d = ["actions:kill_session", "reload_source"] [actions.connect] description = "Connect to selected session" diff --git a/dot_config/television/cable/systemd-units.toml b/dot_config/television/cable/systemd-units.toml index cd137c83..fe8c6c25 100644 --- a/dot_config/television/cable/systemd-units.toml +++ b/dot_config/television/cable/systemd-units.toml @@ -5,8 +5,8 @@ requirements = ["systemctl"] [source] command = [ - "systemctl list-units --type=service --no-pager --no-legend --plain", - "systemctl list-units --type=service --all --no-pager --no-legend --plain", + { name = "Active", run = "systemctl list-units --type=service --no-pager --no-legend --plain" }, + { name = "All", run = "systemctl list-units --type=service --all --no-pager --no-legend --plain" }, ] display = "{split: :0}" diff --git a/dot_config/television/cable/tea-issues.toml b/dot_config/television/cable/tea-issues.toml new file mode 100644 index 00000000..5918de44 --- /dev/null +++ b/dot_config/television/cable/tea-issues.toml @@ -0,0 +1,36 @@ +[metadata] +name = "tea-issues" +description = "List Gitea issues for the current repo" +requirements = ["tea", "jq"] + +[source] +command = '''tea issues list --output json --state open 0 then "\u001b[36mLabels:\u001b[39m " + ([.labels[] | "\u001b[35m" + .name + "\u001b[39m"] +| join(" ")) else empty end), +"", +"\u001b[90m────────────────────────────────────────────────────────────\u001b[39m", +"", +(.body // "") +' +''' + +[actions.close] +description = "Close the selected issue" +command = "tea issues close {strip_ansi|split:#:1|split:\t:0}" +mode = "fork" diff --git a/dot_config/television/cable/tea-prs.toml b/dot_config/television/cable/tea-prs.toml new file mode 100644 index 00000000..23b837e7 --- /dev/null +++ b/dot_config/television/cable/tea-prs.toml @@ -0,0 +1,42 @@ +[metadata] +name = "tea-prs" +description = "List Gitea PRs for the current repo" +requirements = ["tea", "jq"] + +[source] +command = '''tea pulls list --output json --state open 0 then "\u001b[36mLabels:\u001b[39m " + ([.labels[] | "\u001b[35m" + .name + "\u001b[39m"] | join(" ")) else empty end), +"\u001b[36mMergeable:\u001b[39m " + (if .mergeable then "\u001b[32m✓ Clean\u001b[39m" else "\u001b[31m✗ Dirty\u001b[39m" end), +"", +"\u001b[90m────────────────────────────────────────────────────────────\u001b[39m", +"", +(.body // "") +' +''' + +[actions.checkout] +description = "Checkout the PR branch locally" +command = "tea pulls checkout {strip_ansi|split:#:1|split:\t:0}" +mode = "execute" + +[actions.merge] +description = "Merge the selected PR" +command = "tea pulls merge {strip_ansi|split:#:1|split:\t:0}" +mode = "execute" diff --git a/dot_config/television/cable/text.toml b/dot_config/television/cable/text.toml index b07448c4..016091ce 100644 --- a/dot_config/television/cable/text.toml +++ b/dot_config/television/cable/text.toml @@ -5,8 +5,8 @@ requirements = ["rg", "bat"] [source] command = [ - "rg . --no-heading --line-number --colors 'match:fg:white' --colors 'path:fg:blue' --color=always", - "rg . --no-heading --line-number --hidden --colors 'match:fg:white' --colors 'path:fg:blue' --color=always", + { name = "Default", run = "rg . --no-heading --line-number --colors 'match:fg:white' --colors 'path:fg:blue' --color=always" }, + { name = "Hidden", run = "rg . --no-heading --line-number --hidden --colors 'match:fg:white' --colors 'path:fg:blue' --color=always" }, ] ansi = true output = "{strip_ansi|split:\\::..2}"