QA
team-attention/hoyeon
Systematically QA test any application — web apps, native macOS apps, Electron apps, CLI tools, interactive REPLs, or anything on screen.
Starts work in tmux sessions and windows through sesh instead of raw tmux commands, resolving names, directories, zoxide results and configured sessions.
$ npx skills add joshmedeski/sesh --skill sesh -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install joshmedeski/sesh sesh --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/joshmedeski/sesh.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/sesh .claude/skills/sesh && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "sesh" agent skill from https://github.com/joshmedeski/sesh/tree/main/skills/sesh into .claude/skills/sesh/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sesh", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/joshmedeski/sesh/tree/main/skills/seshType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add joshmedeski/sesh --skill sesh -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install joshmedeski/sesh sesh --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/joshmedeski/sesh.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/sesh .agents/skills/sesh && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sesh" agent skill from https://github.com/joshmedeski/sesh/tree/main/skills/sesh into .agents/skills/sesh/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sesh", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add joshmedeski/sesh --skill sesh -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install joshmedeski/sesh sesh --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/joshmedeski/sesh.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/sesh .cursor/skills/sesh && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "sesh" agent skill from https://github.com/joshmedeski/sesh/tree/main/skills/sesh into .cursor/skills/sesh/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sesh", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/joshmedeski/sesh.git --path skills/sesh--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add joshmedeski/sesh --skill sesh -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install joshmedeski/sesh sesh --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/joshmedeski/sesh.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/sesh .gemini/skills/sesh && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "sesh" agent skill from https://github.com/joshmedeski/sesh/tree/main/skills/sesh into .gemini/skills/sesh/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sesh", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install joshmedeski/sesh seshInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add joshmedeski/sesh --skill sesh -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/joshmedeski/sesh.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/sesh .github/skills/sesh && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "sesh" agent skill from https://github.com/joshmedeski/sesh/tree/main/skills/sesh into .github/skills/sesh/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sesh", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add joshmedeski/sesh --skill sesh -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install joshmedeski/sesh sesh --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/joshmedeski/sesh.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/sesh .opencode/skills/sesh && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "sesh" agent skill from https://github.com/joshmedeski/sesh/tree/main/skills/sesh into .opencode/skills/sesh/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sesh", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
seshStarts work in tmux sessions and windows through sesh instead of raw tmux commands, resolving names, directories, zoxide results and configured sessions.
When work needs to start somewhere other than the current shell, the agent is told to call sesh rather than tmux. Sesh resolves a rough name or a directory to the right session, starts it from its configured root with its startup commands, reuses what is already running and decides whether to move you or leave you where you are. If sesh is not on the PATH, the agent falls back to raw tmux.
The first decision is session versus window. A session suits a unit of work with its own directory, through sesh connect with a path or name, and a window suits work that belongs inside a session that already exists, through sesh window connect, for example a second track such as tests, logs, an agent or a dev server. Both select or create, so they are safe to run without checking first. The connect command accepts a path, a session name, a zoxide result, a configured session or a tmuxinator config.
Read from SKILL.md and the folder at commit 59b8478. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are bash).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Sesh Terminal Sessions loads about 2.3k tokens when it runs. Until then it costs about 101 tokens; SKILL.md has 960 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from joshmedeski/sesh at commit 59b8478, republished under its MIT licence (© joshmedeski). 960 words, ~2,314 tokens.
.claude/skills/sesh/SKILL.md (or your agent's skills folder).When work needs to start somewhere other than the shell you're in, call sesh, not tmux.
Reaching for tmux new-session -s <name> or tmux new-window -t <session> throws away what the
user set sesh up to do: resolve a rough name or a directory to the right session, start it from
its configured root with its startup commands, reuse what's already running instead of duplicating
it, and decide whether to move the user or leave them where they are.
If sesh is not on PATH, fall back to raw tmux. Otherwise use the commands below.
This is the first decision, and the one most worth getting right.
A session per unit of work. That's the model — a project, a repo, a directory. If the work has its own directory, it wants its own session:
sesh connect ~/c/sesh
sesh connect sesh # a name works too; sesh resolves itA window when it belongs inside a context that already exists. Reach for a window when the work is part of a session that's already running rather than a thing of its own:
sesh window connect claude -t 'second brain' -c 'claude "<prompt>"'Good reasons to add a window instead of a session:
If neither applies, use a session. Don't create a window in an unrelated session just because that session happens to be attached.
Either way, both commands select-or-create: they reuse what's there and only create on a miss, so it's safe to run them without checking first.
sesh connect <name|directory>Connects to the session, creating it if it isn't running. The argument can be a path, a session name, a zoxide result, a configured session, or a tmuxinator config — sesh resolves across all of them, which is the main reason to call it instead of tmux.
sesh connect ~/c/sesh # by path
sesh connect sesh # by rough name
sesh connect 'second brain' -s # names with spaces need quoting
sesh connect ~/c/api -c 'npm run dev'| Flag | Meaning |
|---|---|
-s, --switch | Switch the client rather than attach. Use when triggering sesh from outside the terminal — a hotkey, a script, another app. |
-c, --command | Startup command. Only runs on a cold start — silently ignored if the session already exists. |
-T, --tmuxinator | Start via tmuxinator if the session isn't running. |
That -c caveat is the sharp edge: if the user might already have the session open, sesh connect -c may do nothing at all. To run a command in a session that may already be running, add a window
(next section).
Two related entry points, for when the directory doesn't exist yet:
sesh mkdir ~/c/new-project -c '<command>' # create the directory, then connect to it
sesh clone <repo> # clone a git repo and connect to itUse sesh mkdir rather than mkdir && sesh connect — it's one step and doesn't wait on zoxide.
sesh window connect <name|directory> -t <session> -c '<command>'Selects the window called <name> in <session>, creating it if it isn't there. Prints the
window's session:index target.
sesh window connect tests -c 'npm test -- --watch' # in the current session
sesh window connect ~/c/sesh -t dotfiles # window "sesh", rooted at that pathA directory argument is named after its basename and rooted there, so running it twice selects the window the first run created rather than duplicating it.
--command means different things on create and reuseIdentity is the window name:
So launching an agent twice with the same window name starts one agent, then types the second
prompt into the first agent's input. When each invocation must get its own window, pass --new:
sesh window connect claude -t 'second brain' --new -c 'claude "<prompt>"'--new always creates, letting windows share a name; a later connect without it reuses the
lowest-indexed one. Omitting the name also always creates — there's nothing to match on.
-t <session> resolves the same way sesh connect does and starts the session if it isn't
running, without moving the user's client. So you don't have to check whether the session is up,
and cold and warm targets take the same command.
With no -t, the target is the attached session. Outside tmux that fails with
Not inside a tmux session, use --target to specify one. — pass -t.
Both commands move the user to what they connected to. That's right when they asked for it and wrong when it's a background step.
| Situation | Flag |
|---|---|
| The user asked for this and wants to land there | (default) |
| Background work; leave them where they are | -b (windows only) |
| Triggered from outside tmux — hotkey, script, another app | -s |
-b / --background creates the window without selecting it or moving the client. Prefer it for
anything the user didn't explicitly ask to be taken to. Sessions have no -b; a window connect
with -t is the way to set something up without moving.
Don't guess a session name and don't invent one:
sesh list -j # every source: tmux, zoxide, config, tmuxinator
sesh list -t # running tmux sessions only
sesh window list -t <session> # windows in a session (-j for json)When the user names a project or directory, pass what they said — sesh resolves it. Session names
contain spaces (second brain) more often than you'd expect, so quote arguments.
tmux new-session, tmux attach, tmux new-window, or tmux split-window to
start work. Use sesh connect or sesh window connect.tmux send-keys to run a command. Use -c, which knows whether the target is
new or already running.sesh list.-b.Panes are outside sesh's scope; tmux split-window and tmux send-keys remain correct there.
sesh connect <name|directory> Connect to a session, creating it if it doesn't exist
-s, --switch Switch the client rather than attach
-c, --command <cmd> Startup command; ignored if the session already exists
-T, --tmuxinator Start via tmuxinator if the session isn't running
sesh mkdir <path> Create a directory and connect to it as a session
-c, --command <cmd> Startup command
-s, --switch Switch rather than attach
sesh clone <repo> Clone a git repo and connect to it as a session
-d, --dir <name> Directory git creates
-c, --cmdDir <dir> Directory to run git in
sesh window connect [name|directory] Select a window, creating it if it doesn't exist
-t, --target <session> Target session (default: current attached session)
-c, --command <cmd> Command to run in the target
-p, --path <dir> Start directory (default: the target session's root)
-b, --background Create without selecting it or moving the client
-s, --switch Switch the client rather than attach
--new Always create, even when the name matches an existing window
sesh window list List the windows of a session
-t, --target <session> Target session (default: current attached session)
-j, --json Output as json
sesh list List sessions from all sources
-j, --json Output as json
-t, --tmux tmux sessions only
-z, --zoxide zoxide results only
sesh last Connect to the last tmux session
sesh root Print the root directory of the active session© joshmedeski, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/sesh of joshmedeski/sesh.
Open the folder on GitHubat commit 59b8478
Sesh Terminal Sessions next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Sesh Terminal Sessions this skilljoshmedeski/sesh | 2.9k | — | ~2.3k | Automated safety check: Pass | MIT | |
| QAteam-attention/hoyeon | 173 | — | ~2.6k | Automated safety check: Notes | MIT | |
| TuiosGaurav-Gosain/tuios | 5.1k | — | ~3.7k | Automated safety check: Pass | MIT | |
| Kanvibe Release Deployrookedsysc/kanvibe | 143 | — | ~12k | Automated safety check: Notes | AGPL-3.0 | |
| Council Executionhex/claude-council | 851 | — | ~824 | Automated safety check: Pass | MIT | |
| Drive Screencoleam00/skills | 674 | — | ~5.4k | Automated safety check: Pass | MIT |
team-attention/hoyeon
Systematically QA test any application — web apps, native macOS apps, Electron apps, CLI tools, interactive REPLs, or anything on screen.
Gaurav-Gosain/tuios
Drive tuios from inside one of its panes. An agent skill from Gaurav-Gosain/tuios.
rookedsysc/kanvibe
A skill your agent uses whenever releasing or deploying KanVibe desktop from a clean, up-to-date dev checkout: ask only for the target version and release-note approval, then let the AI update…
hex/claude-council
Executes council queries by running the query pipeline across selected AI providers (Gemini, OpenAI, Grok, Perplexity), displaying formatted responses verbatim, and generating a synthesis of…
coleam00/skills
Take real control of the desktop - list and focus windows, type, paste, click, scroll, and screenshot - on Windows, macOS or Linux, and drive other coding-agent sessions running in terminals.
manaflow-ai/cmux
Turns a described workflow preference into cmux keyboard shortcut bindings, proposing templates such as tmux-style or Vim-style and applying only what the user picks.
joshmedeski/sesh
Checks that every TOML field added, renamed or removed in Go code has a matching update in sesh's JSON schema, so TOML editors don't reject valid config with a schema error.
Works with
Categories
Starts work in tmux sessions and windows through sesh instead of raw tmux commands, resolving names, directories, zoxide results and configured sessions. When work needs to start somewhere other than the current shell, the agent is told to call sesh rather than tmux. Sesh resolves a rough name or a directory to the right session, starts it from its configured root with its startup commands, reuses what is already running and decides whether to move you or leave you where you are.
Sesh Terminal Sessions fits situations like: opening a project or directory in a terminal session; connecting to an existing session by name; running a command or coding agent in another session or window; cloning a repo to work in.
Run `npx skills add joshmedeski/sesh --skill sesh -a claude-code`. Or copy the skill folder (skills/sesh in joshmedeski/sesh) into .claude/skills/sesh in your project. Claude Code loads it when a task matches its description.
Run `npx skills add joshmedeski/sesh --skill sesh -a codex`. Or copy the skill folder (skills/sesh in joshmedeski/sesh) into .agents/skills/sesh in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add joshmedeski/sesh --skill sesh -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sesh, .gemini/skills/sesh, .github/skills/sesh and .opencode/skills/sesh in your project.
SKILL.md names no scripts, command-line tools or credentials: Sesh Terminal Sessions is instructions for the agent only. Our summary lists: sesh on the PATH, with tmux.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Sesh Terminal Sessions is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.3k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Sesh Terminal Sessions: QA (team-attention/hoyeon, 173 stars), Tuios (Gaurav-Gosain/tuios, 5.1k stars), Kanvibe Release Deploy (rookedsysc/kanvibe, 143 stars) and Council Execution (hex/claude-council, 851 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
joshmedeski (a GitHub user) maintains it in joshmedeski/sesh, which has 2,862 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 6, 2026.
Source: joshmedeski/sesh on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.