From bdada995355736b0c385cdaaee91f2c8ecf6302b Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Thu, 8 Oct 2026 11:48:34 -0400 Subject: [PATCH] docs(docs): add pj-palette and Ghostty grouping documentation --- docs/desktop/hyprland.mdx | 3 +++ docs/shell/scripts.mdx | 27 +++++++++++++++++++++++++++ docs/terminal/ghostty.mdx | 1 + docs/terminal/tmux.mdx | 4 +++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/desktop/hyprland.mdx b/docs/desktop/hyprland.mdx index 7b92b9d..77426a8 100644 --- a/docs/desktop/hyprland.mdx +++ b/docs/desktop/hyprland.mdx @@ -64,10 +64,13 @@ Omarchy's default bindings stay enabled. `omarchy_default_bindings` and `omarchy | `^com\.anthropic\.Claude$` | `special:claude silent` | | `^com\.fastmail\.Fastmail$` | `special:fastmail silent` | | `^Beeper$` | `special:beeper silent` | +| `^com\.mitchellh\.ghostty$` | `group = "set"`: opens as a group (tabbed, with a groupbar) | | `brave-(www\.)?youtube\.com__.*`, title not matching `.*Picture.?in.?[Pp]icture.*` | Float, pin, size 30% × 30% of the monitor, move to `10, monitor_h*0.7-10` (bottom-left corner) | Scratch residents are placed `silent` so that [`omarchy-toggle-scratch`](#omarchy-toggle-scratch) decides when to reveal them. The YouTube rule matches both `youtube.com` and `www.youtube.com` because Chromium's class changes once a video plays. It excludes the picture-in-picture overlay so Omarchy's own PiP rule still applies. Its size and inset must stay in sync with [`omarchy-pip`](#omarchy-pip). +Ghostty runs one tmux session per window and titles the window with the session name, so its groupbar reads as a list of sessions. With Omarchy's `group.auto_group`, more Ghostty windows opened while the group is focused join it. See [Ghostty](/terminal/ghostty#sessions). + ## Input `input.lua`: diff --git a/docs/shell/scripts.mdx b/docs/shell/scripts.mdx index 6a3b52a..b9b2560 100644 --- a/docs/shell/scripts.mdx +++ b/docs/shell/scripts.mdx @@ -49,6 +49,7 @@ Several scripts below also exist as fish functions of the same name (`ai`, `c2p` | [`mtime-sort`](#mtime-sort) | sh + perl | Sort path lines newest-first by mtime | | [`omp-session`](#omp-session) | python3 | Resume or start omp for the current repo; backend of the `omp-sessions` cable | | [`pj`](#pj) | bash | Task runner across every project task source, on a tv cable | +| [`pj-palette`](#pj-palette) | bash | pj's tasks plus quick actions as a tmux-palette source | | [`yazi-nvim-open`](#yazi-nvim-open) | sh | yazi opener that targets the host Neovim | ## ai @@ -332,6 +333,32 @@ A task runner that searches every task source in the project and lets you pick o **Needs:** `bash`, `tv`, `mtime-sort`, `jq`, `python3` 3.11+ (for `tomllib`), plus whichever runners the project uses. +## pj-palette + +```sh +pj-palette +pj-palette --run KIND TARGET ROOT RUNNER +pj-palette --cmd ROOT CMD… +``` + +The source of the **Project Tasks** [tmux command palette](/terminal/tmux#command-palette) (`palettes/tasks.json`). Open it with tmux `prefix t`, Ghostty ctrl+shift+space, or the "Project Tasks" item in the main palette. + +With no arguments it reads the active pane's directory (`tmux display -p '#{pane_current_path}'`) and prints palette items as JSON, grouped by category: + +| Group | Items | Shown when | +| --- | --- | --- | +| Quick | ` install` (alias `install`, `i`), ` run dev` (`dev`) | `package.json` at the project root. The package manager comes from `packageManager`, then the lockfile, as in `pj` | +| Quick | `uv sync` (`sync`), `uv run python` (`py`, `repl`) | `pyproject.toml` and `uv` installed | +| Quick | `make` (default target; `m`, `build`) | A Makefile and `make` | +| Quick | `go run .`, `cargo run` | `go.mod` / `Cargo.toml` and the toolchain | +| Tasks: `` | Every record from `pj --list`: npm/bun/pnpm/yarn scripts, Make, just, mise, devbox, pyproject task tables and console scripts | Whatever `pj` finds walking up to the git root | + +The project root is the git toplevel, else the pane's directory. + +**Run.** Every item opens a new tmux window in the task's directory. The command is passed to `new-window` as separate arguments, so no shell reparses it. `--run` calls `pj --run`, which keeps pj's `openlogs` wrapping of `dev`/`start`/`serve`/`watch` tasks, and `--cmd` runs a quick action. Either way, when the command exits the script prints `[exit N]` and `exec`s `$SHELL`, so the window keeps the output instead of closing. + +**Needs:** `pj` and its dependencies, `jq`, tmux. + ## yazi-nvim-open ```sh diff --git a/docs/terminal/ghostty.mdx b/docs/terminal/ghostty.mdx index 06b477f..4c0a3f0 100644 --- a/docs/terminal/ghostty.mdx +++ b/docs/terminal/ghostty.mdx @@ -61,6 +61,7 @@ Closing a window only detaches its session; the shells keep running in the tmux | Key | Sends | tmux action | | --- | --- | --- | | `ctrl+shift+t` | `prefix c` | New window (tab) in pane cwd | +| `ctrl+shift+space` | `prefix t` | Project Tasks palette (pj: install, dev, sync, make, every project task) | | `ctrl+shift+w` | `prefix k` | Kill window (close tab) | | `ctrl+shift+r` | `prefix r` | Rename window | | `ctrl+tab` / `ctrl+page_down` / `ctrl+shift+right` / `ctrl+shift+k` | `prefix n` | Next window | diff --git a/docs/terminal/tmux.mdx b/docs/terminal/tmux.mdx index 265de81..90fb209 100644 --- a/docs/terminal/tmux.mdx +++ b/docs/terminal/tmux.mdx @@ -42,6 +42,7 @@ These settings are what [yazi](/tools/yazi) needs inside tmux. `allow-passthroug | `prefix q` | Reload config | | `prefix /` | Copy mode, then search upward | | `prefix o` | tmux-sessionx: fuzzy-find, switch to, create, rename (`ctrl-r`), or kill (`alt-backspace`) sessions, with a preview | +| `prefix t` | Project Tasks palette ([`pj-palette`](/shell/scripts#pj-palette)): install/dev/sync/make quick actions plus every `pj` task, each run in a new window | | `prefix h` / `prefix v` | Split below / right, pane cwd | | `prefix x` | Kill pane | | `M-Enter` / `M-S-Enter` / `M-Escape` (no prefix) | Split below / split right / kill pane | @@ -91,7 +92,8 @@ Labels longer than 27 characters end in `…`. The icon comes from tmux-nerd-fon | File | Contents | | --- | --- | -| `commands.json` | The kitty launchers ported as palette items: **Lazygit** (90% popup in the pane's cwd; kitty `ctrl+shift+g`), **Yazi** (new window; kitty `ctrl+shift+f`), **Neovim Split** (right, 50%; kitty `ctrl+shift+e`), **Shell History (atuin)** (`atuin-pick` in a 25% split below; kitty `ctrl+shift+p`). Also **Sessions (sessionx)**, **Save Sessions**, and **Restore Sessions** (resurrect). Programs are started with `exec`, so the tab icon is the program's, not the shell's | +| `commands.json` | The kitty launchers ported as palette items: **Lazygit** (90% popup in the pane's cwd; kitty `ctrl+shift+g`), **Yazi** (new window; kitty `ctrl+shift+f`), **Neovim Split** (right, 50%; kitty `ctrl+shift+e`), **Shell History (atuin)** (`atuin-pick` in a 25% split below; kitty `ctrl+shift+p`). Also **Project Tasks** (opens the tasks palette), **Sessions (sessionx)**, **Save Sessions**, and **Restore Sessions** (resurrect). Programs are started with `exec`, so the tab icon is the program's, not the shell's | +| `palettes/tasks.json` | The **Project Tasks** palette (`prefix t`, Ghostty `ctrl+shift+space`), fed by [`pj-palette`](/shell/scripts#pj-palette): `bun install`, `bun run dev`, `uv sync`, `uv run python`, `make`, `go run .`, `cargo run` as Quick items when the project has them, then every task `pj` finds, grouped by tool. Each runs in a new window in its directory and keeps a shell after it exits | | `shortcuts.json` | Ghostty `ctrl+shift` chords shown next to the built-in items they trigger (New Window → `Ctrl+Shift+T`, …) | | `theme.json` | Cyberdream: bg `#16181a`, panel `#1e2124`, selected `#243348` (the active-tab plate), muted `#7b8496`, accent `#5ea1ff` |