lanes-sh/app/lanes-sessions

Claude Code and agent skill by lanes-sh/app

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Use when managing Lanes issues or driving Claude Code sessions through the lanes_* MCP tools: creating issues, starting/stopping/inspecting sessions, batch-launching work across worktrees, reading terminal output, attaching labels and components by UUID, or moving issues between the board's statuses (backlog, planning, implementation, review, done, or ones the user added, such as todo). Skill applies whenever a request mentions "Lanes", "lanes board", "lanes issue", "lanes session", or any lanes_* tool name. Also applies when Claude Code is itself running inside a Lanes session (`LANES_TERMINAL=1`, `LANES_SESSION=<issue id>`). Every worktree you create must be linked to the issue with lanes_update_issue, or the issue's Changes tab points at an empty diff instead of at your work.

Install

npx vskill@latest install lanes-sh/app/lanes-sessions

SKILL.md

Lanes sessions

Lanes is a desktop app that puts every AI coding session on an issue board. It exposes a local MCP server (SSE on http://localhost:5353/sse) with a set of lanes_-prefixed tools for issue CRUD, session orchestration, history, and metadata lookups.

A single issue can host multiple concurrent CLI sessions (Claude, Codex, shell). Session-targeting tools take an optional session ref (UUID, auto-assigned slot, or name) to pick which one — see the "Multi-session model" section below.

Use this skill whenever the user wants to look at, create, or run work on the Lanes board through chat.

Verify the MCP is connected

Before doing anything, sanity-check that the Lanes MCP is reachable:

  • Call lanes_list_components. If it returns an array (possibly empty), you're good.
  • If the tool isn't available at all, the MCP isn't installed. Tell the user to run the /lanes-desktop:setup-mcp slash command (shipped alongside this skill) or, if they have raw skills only, run:

`` claude mcp add --transport sse lanes-desktop http://localhost:5353/sse --scope user `` Then restart Claude Code so the new MCP loads. Lanes itself must also be running (the desktop app must be open).

Working inside a Lanes session

Everything else here assumes you are driving the board from outside. When Lanes launched you, three environment variables say so:

VariableMeaning
LANES_TERMINAL1 when Lanes spawned this shell. Unset means this section does not apply.
LANES_SESSIONThe issue ID you are working on. This is what to pass as id / issueId.
LANES_SESSION_UUIDThis session's Lanes ref, for the session param.

Read them with echo $LANES_SESSION. If LANES_TERMINAL is unset you are an ordinary Claude Code session with no issue to report against, so skip to the tool inventory.

Link every worktree you create

Every `git worktree add` you run is followed by `lanes_update_issue { id: $LANES_SESSION, branch: "<branch>" }`. Not conditionally, not once you are finished. A worktree Lanes did not create is a worktree the issue does not know about, and until you link it the Changes tab and lanes_get_issue_changes both show an empty diff, so your work reads as never having happened.

Setting branch is the whole job. Lanes finds the worktree that branch is checked out in and fills worktreeStrategy, worktreePath and worktreeName from it, so do not set those three yourself.

Then check it took:

lanes_get_issue { id: $LANES_SESSION }

worktreeStrategy should be "select" and worktreePath should be the folder you are working in. If worktreeStrategy came back "none", Lanes could not find a worktree for that branch. Call lanes_list_worktrees, find your folder in the list, and pass its path:

lanes_update_issue { id: $LANES_SESSION, worktreePath: "<path from the list>" }

If your folder is not in that list either, you are in a repository Lanes has no working folder linked for, and there is nothing to link the issue to. Say so rather than retrying.

When Lanes started you inside a worktree it made, lanes_get_issue already reports "create" or "select" and there is nothing to do. Checking costs one call and is worth it before you assume.

Linking is not the same as asking for a worktree. worktreeStrategy: "create" only affects the next session on the issue and never relocates a running agent, so setting it mid-session will not move you.

Tool inventory

GroupToolPurpose
Issueslanes_list_issuesFilter by step / tags (any-match) / componentId / search. Defaults are scoped: at most 20, active project only, every Done status excluded. Pass limit (no upper bound), allProjects: true, or includeDone: true to widen. Filtering by a Done status includes it. Returns an envelope { issues, appliedFilters, truncated, totalAvailable }, so check truncated before concluding a search found nothing.
lanes_get_issueFull details by id. Does not include sessions.
lanes_create_issueRequired: title.
lanes_update_issuePatch by id; pass null to clear nullable fields.
lanes_delete_issueBy id. Permanent.
lanes_move_issueShorthand for update_issue with only step.
Sessionslanes_start_sessionRequired: issueId. Spawns Claude Code (default), Codex, or shell. Always adds a new session; returns its slot + UUID.
lanes_stop_sessionStop a session for issueId. Optional session (UUID/slot/name) to disambiguate when >1.
lanes_resume_sessionRe-attach Claude to a stopped session. Claude-only. Optional session.
lanes_delete_sessionPermanently delete a session (stops it first if running). Optional session.
lanes_get_session_statusWith issueId: bare array of every session for that issue (status under both status and runtimeStatus). Without: envelope { sessions, appliedFilters, truncated, totalAvailable } capped at 20.
Historylanes_get_issue_changesgit diff for the issue's cwd, by id.
lanes_get_issue_historyPaginated Claude conversation history, by id. Use cliSessionId to pick when an issue has multiple Claude sessions.
lanes_read_terminalLast lines (default 200, max 2000) of PTY scrollback. Optional session.
lanes_get_session_statsTokens, model breakdown, tool calls, duration, by id. Use cliSessionId to pick when an issue has multiple Claude sessions.
Metadatalanes_list_labelsUUIDs, names, colors. Call before assigning tags.
lanes_list_componentsUUIDs, names, project IDs. Call before setting componentId.
lanes_list_worktreesEvery worktree Lanes can see: name, path, branch, and the projectPath it came from. Optional projectPath narrows it to one repository. Use it to find the path to link, or to check whether a branch already has a worktree.
lanes_delete_worktreeRemove a git worktree on disk by projectPath + name.

Note the parameter-name inconsistency: issue endpoints take id, session endpoints take issueId. Don't mix them. Session-targeting tools additionally accept an optional session ref (UUID, slot, or name — case-insensitive).

Multi-session model

An issue can host any number of concurrent CLI sessions. Each session is addressable three ways:

  • `session_uuid` — Lanes' internal stable ID.
  • `slot` — auto-assigned ordinal at spawn ("1", "2", …, lowest free integer).
  • `name` — optional user-editable label.

Session-aware tools (lanes_stop_session, lanes_resume_session, lanes_delete_session, lanes_read_terminal) take session: string resolved in that order, case-insensitive. When session is omitted:

  • One session for the issue → tool proceeds against it. Happy path is unchanged.
  • Multiple sessions → tool returns an MCP success result (not an error) whose text starts "Issue N has multiple sessions…" and whose _meta.sessions array lists each candidate as { sessionUuid, slot, name, runtimeStatus, cli, cliSessionId, createdAt }. Pick one (ask the user if not obvious) and retry with session set to its slot, name, or UUID.

lanes_get_session_status is the read side and takes no session param. With issueId it returns a bare array of every session for that issue; each entry carries the runtime status under both status and runtimeStatus (same value, two keys). Filter that array yourself by slot / UUID.

lanes_start_session always creates a new session. It is never a way to re-attach or to "make sure" one is running — each call adds another slot. To re-attach, use lanes_resume_session.

lanes_resume_session is the only way to re-attach a stopped Claude session. Do not pass --resume, --continue, --session-id, or --fork-session to lanes_start_session — those flags are hard-rejected. Codex and shell sessions have no resume semantics; start fresh.

Starting is asynchronous

lanes_start_session hands the launch to the Lanes app and waits up to ~10s for the new session to register, then returns its slot and UUID. Two things follow:

  • A response that says it could not confirm is not a failure. The launch may still be in flight — worktree creation runs a real git worktree add, and if the issue has no usable cwd Lanes opens a folder picker and waits on the user indefinitely. Read lanes_get_session_status { issueId }, or ask the user to look at the Lanes window.
  • An empty session list is not proof the start failed. In the window before the session registers, lanes_get_session_status returns [] and the session-aware tools return "No sessions exist for issue N yet". Both are expected. Wait and re-read.

Never re-issue lanes_start_session to check on a previous one. That is how you end up with five identical sessions on one issue.

cliSessionId (the CLI's own resume token — for Claude, the --resume <uuid> value) is distinct from session_uuid (the Lanes ref used in session). lanes_get_issue_history and lanes_get_session_stats disambiguate via cliSessionId; everything else uses session. Don't conflate them.

Critical gotchas

  • Labels and components are UUIDs, not names. Always call lanes_list_labels / lanes_list_components first and resolve names → UUIDs locally. Passing a plain name like "bug" will not match anything.
  • `step` is a status id, and the user defines the statuses. Each tool's step enum comes from the user's Settings > Workflows, and its description names every option as id (Label, category). The built-in ids are backlog, planning, implementation, review, misc and done. The user can rename them, switch them off, and add their own, such as todo. A renamed status keeps its id, so match on the id, never the label. Create, update and move take active statuses only, and the error for anything else lists the ones that are. Use lanes_move_issue if you only want to change the step.
  • Each status is Not started, In progress or Done. Moving an issue into any Done status finishes it, and lanes_list_issues leaves every Done status out by default, not only done. A new issue with no step lands in backlog, or in the first active Not started status while Backlog is switched off.
  • Worktree auto-create requires two fields, set in advance. To make lanes_start_session create a fresh git worktree, the issue must already have worktreeStrategy: "create" AND worktreeName: "<branch>". Set them via lanes_create_issue or lanes_update_issue before calling start_session. To attach an issue to a worktree that already exists (one you made yourself, mid-session), set branch instead — see "Link a worktree you created yourself".
  • `prompt` has three modes:
  • Omitted → uses the issue's description (falling back to title).
  • "" (empty string) → starts the session with no prompt at all.
  • "text" → overrides the description for this session only.
  • `flags` array shape for lanes_start_session:

``json [ { "flag": "dangerously-skip-permissions", "value": "", "kind": "flag" }, { "flag": "ANTHROPIC_MODEL", "value": "claude-opus-4-7", "kind": "env" } ] ` kind: "flag" becomes --flag-name value; kind: "env" becomes ENV=value` prepended to the command.

  • `planMode: true` only takes effect when cli: "claude". It maps to --permission-mode plan.
  • `lanes_list_issues` filter combination: filters AND together, except tags, which is any-match (issue must have ≥1 of the listed UUIDs).
  • `update_issue` to clear a field requires explicitly passing null (or [] for tags/dependencies). Omitting a key leaves it untouched.

Common workflows

Create-and-launch a single issue

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
254
Repository forks
16
7-day trend score
28

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/lanes-sh/app/lanes-sessions/badge)](https://verified-skill.com/skills/lanes-sh/app/lanes-sessions)

Something wrong with this skill or its page? Tell us.