You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
sesh: add svibe --agents CSV mode and --no-specstory opt-out
Heterogeneous svibe layouts via --agents claude,codex,opencode,...
(list length = pane count, mixing with positional N rejected for
unambiguous semantics). Per-pane wrapping means one opencode pane can
sit next to specstory-wrapped claude panes in the same window.
Add --no-specstory opt-out to scode/svibe for raw agent invocation
without markdown auto-save.
Track upstream specstoryai/getspecstory#156 in backlog so opencode
joins the auto-wrap list when the PR ships.
Copy file name to clipboardExpand all lines: TODO.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -47,6 +47,8 @@ with a one-line summary of what shipped.
47
47
48
48
## P? — Needs evaluation before committing
49
49
50
+
-[ ]**[?/M] tmux window status indicators (running / idle / error)** — show per-window state on the tab list (e.g. `1 opencode ⚙` busy vs `2 opencode 💤` idle vs `❌` errored). Three options evaluated; lean toward hook-based per-pane state file driven by opencode `session.*` + Claude `Stop`/`UserPromptSubmit` hooks. Blocked on (a) verifying opencode hook event names, (b) confirming the `dot_claude/modify_settings.json` merger handles multiple entries per event so we don't ping-pong with CodeIsland. → [research](backlog/tmux-window-status-indicators.md)
51
+
-[ ]**[?/S] specstory: enable opencode auto-wrap when upstream lands** — `_sesh_wrap_agent` in `dot_config/zsh/tools/22_sesh.zsh` currently passes `opencode` through raw because specstory doesn't support it as a provider. Add to the case statement (one-line change) once `specstoryai/getspecstory#156` merges + ships. → [research](backlog/specstory-opencode-support.md)
50
52
-[ ]**[?/L] Use mise to manage most runtime versions** — already used for Node (Neovim) and Rust (Cargo) per `README.md`. Question: extend to python/go/ruby and retire ad-hoc PATH wiring + nvm? Trade-off: another layer vs unified version pinning. Spike: pick one runtime currently outside mise (go?), try alongside current setup for two weeks.
51
53
-[ ]**[?/L] Optimize zsh & tmux startup time** — needs profiling first (`zprof`, `time zsh -i -c exit`). Current state: conda/nvm are lazy-loaded already, so low-hanging fruit may be gone. Don't optimize blind.
52
54
-[ ]**[?/XL] CUDA / ML toolchain ansible role** — driver/cudnn/nccl version matrix is large; only relevant on Linux ML hosts. Defer until there's a concrete host that needs it. Likely belongs behind a new `ml_linux` profile.
Note `opencode` is absent from the available provider list.
43
+
44
+
## Options considered
45
+
46
+
| Option | Pros | Cons |
47
+
|---|---|---|
48
+
| A. Wait for upstream PR #156 to merge, then add `opencode` to the case statement | Zero engineering on our end; consistent with how other providers were added | Blocked on external timeline (unknown ETA) |
49
+
| B. Maintain a local shim wrapper that fakes specstory output | We control the timing | Reinvents specstory; output format may diverge from upstream's eventual implementation; high churn |
50
+
| C. Use a different recorder for opencode (asciinema, script(1), etc.) | Independent of specstory | Different output format from other agents; breaks the single-source-of-truth markdown story |
51
+
52
+
Going with A. The cost of waiting is "opencode panes lose the auto-save
53
+
nicety"; the cost of B/C is ongoing maintenance plus eventual migration to
54
+
upstream.
55
+
56
+
## Current blocker
57
+
58
+
Waiting on `specstoryai/getspecstory#156` to merge + ship in a release.
59
+
60
+
## Activation steps (when unblocked)
61
+
62
+
When PR #156 merges and is released:
63
+
64
+
1. Bump local specstory: `npm i -g @specstoryai/specstory@latest`
65
+
(or whatever the install command is on this machine).
66
+
2. Verify: `specstory run --help` now lists `opencode`.
> — when `specstoryai/getspecstory#156` lands, the case statement in
121
+
> `_sesh_wrap_agent` gets a one-line update and opencode joins the auto-wrap
122
+
> list.
123
+
124
+
##### `--on-exit` modes
125
+
126
+
What happens when the agent exits (clean quit, Ctrl+C, crash):
127
+
128
+
| Mode | Behavior |
129
+
|------|----------|
130
+
|`shell` (default) | Pane prints a yellow hint and drops into `$SHELL`. You can re-launch the agent (the hint shows the exact command), switch to lazygit, or close the pane manually. Costs one background `$SHELL` process per pane. |
131
+
|`kill`| Pane closes when the agent exits. The historical / tmux-default behavior. |
132
+
|`restart`| Wraps the agent in `while true; do AGENT \|\| true; sleep 1; done`. Use Ctrl+C twice quickly to break the loop and land in shell. Useful for crash-prone development of an agent itself. |
133
+
134
+
> The `shell` default trades one background process per pane for far better
135
+
> recoverability — the most common reported pain point with the old
136
+
> `coding-agent` workflow was "I hit Ctrl+C and lost the pane plus the
137
+
> 75/25 layout".
138
+
139
+
##### Single-agent only
140
+
141
+
`scode` is single-agent by design. If you want multiple agents in parallel,
142
+
use `svibe --agents …`. Passing `--agents` to `scode` errors with a hint to
143
+
switch to `svibe`.
112
144
113
145
> The legacy `coding-agent` named session in `sesh.toml` is **kept for
114
146
> back-compat** (still appears in the sesh picker, still works as
@@ -120,29 +152,67 @@ The agent override resolves to:
120
152
Built directly with tmux scripting (not tmuxp) because pane counts are
Copy file name to clipboardExpand all lines: docs/zsh/aliases.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -447,8 +447,8 @@ Quick reference for custom aliases and shell functions defined in this dotfiles
447
447
|`sesh-sessions`| function |`dot_config/zsh/tools/22_sesh.zsh`| fzf popup picker for all sesh sessions (also bound to `Alt+S`) |
448
448
|`sesh-here` / `shere`| function / alias |`dot_config/zsh/tools/22_sesh.zsh`| Lightweight: bare shell session at `$PWD` (no nvim, no project layout). Pass args/`-c CMD` to override |
449
449
|`sesh-root` / `sroot`| function / alias |`dot_config/zsh/tools/22_sesh.zsh`| Connect sesh to current git root (falls back to `$PWD`); honors sesh.toml wildcards/default |
450
-
|`sesh-code` / `scode`| function / alias |`dot_config/zsh/tools/22_sesh.zsh`| Repo-scoped coding-agent layout: nvim 75% \|`specstory run [agent]` 25%, plus btop window. Session named `coding-agent/<repo>` (collision-safe). Refuses outside git repos |
451
-
|`sesh-vibe` / `svibe`| function / alias |`dot_config/zsh/tools/22_sesh.zsh`| Parametric multi-agent layout: `svibe [N_AGENTS] [AGENT_CLI]` (default `4 claude`). N tiled agent panes + lazygit window + nvim window. Session named `vibe/<repo>`. Refuses outside git repos|
450
+
|`sesh-code` / `scode`| function / alias |`dot_config/zsh/tools/22_sesh.zsh`| Repo-scoped coding-agent layout: nvim 75% \|`specstory run [agent]` 25%, plus btop window. Session named `coding-agent/<repo>` (collision-safe). Refuses outside git repos. Flags: `--on-exit shell\|kill\|restart`, `--no-specstory`|
451
+
|`sesh-vibe` / `svibe`| function / alias |`dot_config/zsh/tools/22_sesh.zsh`| Parametric multi-agent layout: `svibe [N] [CLI]` (homogeneous) or `svibe --agents claude,codex,opencode,…` (heterogeneous). N tiled agent panes + lazygit window + nvim window. Session named `vibe/<repo>`. Same `--on-exit` / `--no-specstory` flags as scode|
452
452
|`try-sesh` / `tsesh`| function / alias |`dot_config/zsh/tools/32_try.zsh`| Open a `try` ephemeral workspace and immediately connect via sesh |
0 commit comments