ask
CommandAsk a single expert agent a question - like a Slack ping to a colleague
Worktree lifecycle management - create, list, remove, info on interactive worktrees
> /plugin marketplace add restarter/lets-workflow> /plugin install lets@lets-workflow
description: Worktree lifecycle management - create, list, remove, info on interactive worktrees argument-hint: "[create <name|task-id> [--branch <ref>] [--attach|--new-branch] [--flow plan|plan-workflow] [--launch-mode default|auto|all-in] [--auto] [--all-in] [--orca|--cmux|--tmux]|create --team [<callsign>] --area <a> [--launch-mode default|auto|all-in] [--auto] [--all-in] [--orca|--cmux|--tmux]|list|info|remove <name>]"
Thin dispatcher for interactive parallel worktrees. All filesystem/git work lives in the Go subcommand `lets worktree` (`cli/internal/worktreecmd/`); this skill captures user intent via `AskUserQuestion`, shells out with `--json`, and renders the result.
**Interactive worktrees only.** Agent worktrees (`isolation: worktree`) use native Claude Code behavior — not this command.
> **IMPORTANT:** If the spec below invokes any deferred tool (e.g. `AskUserQuestion`), you MUST load and call it as specified. Never skip the call, never substitute a default answer of your own — the tool invocation is part of the contract. This is critical.
**If argument provided** (e.g., `/lets:worktree create auth-feature`), parse it:
**If no argument**, use **AskUserQuestion**:
AskUserQuestion(
questions=[{
question: "What do you want to do with worktrees?",
header: "Action",
options: [
{ label: "Create", description: "Create a new worktree for parallel work" },
{ label: "List", description: "Show all active worktrees" },
{ label: "Remove", description: "Remove a worktree and clean up" },
{ label: "Info", description: "Show current worktree status" }
],
multiSelect: false
}]
)---
Create an interactive worktree. The Go subcommand owns the guard, name validation, `.gitignore` ensure, `git worktree add`, symlinks (`.lets/` and the tracker adapter's declared store links), verify, and rollback. The skill drives the user choices.
Optional launcher override on the argument: `--orca` / `--no-orca` / `--cmux` / `--no-cmux` / `--tmux` / `--no-tmux` force the launcher for this run (otherwise `$LETS_LAUNCHER` decides — Orca in Step C0, the others in Step C3.5).
**Launch mode** (lets-d3wu3). How every session this command launches starts - `{launch_cmd}` below is `claude` rendered for it:
| mode | `{launch_cmd}` | |---|---| | `default` | `claude` | | `auto` | `claude --permission-mode auto` (auto-approves low-risk work; LETS AUTO MODE rules still gate push / PR / close / external) | | `all-in` | `claude --permission-mode bypassPermissions` (no harness permission prompts in that session) |
Resolve it once: a flag the user typed in this turn - `--launch-mode <m>`, `--auto` (= `auto`) or `--all-in` (= `all-in`) - beats `LETS_LAUNCH_MODE`, read through Go: `lets worktree info --json` -> `launch_mode` (`value`, `source` = `project` | `user` | `unset`, `valid`); neither set -> `default`. With no launch-mode flag typed in this turn, `launch_mode.valid=false` (a hand-edited value outside default | auto | all-in) -> `default`, plus one line "LETS_LAUNCH_MODE=<value> is not default | auto | all-in; launching in default"; with a typed flag the flag's mode applies and the invalid value is only named: "LETS_LAUNCH_MODE=<value> is not default | auto | all-in; ignored for the typed flag". The mode's **source** is the flag (`--all-in flag`, `--auto flag`, `--launch-mode flag`) or the file: `LETS_LAUNCH_MODE in .lets/.env` (`source=project`), `LETS_LAUNCH_MODE in ~/.lets/.env` (`source=user`). `all-in` is explicit only: such a flag, or `LETS_LAUNCH_MODE=all-in` the owner set - never inferred, never a fallback, never the default. Before EVERY `all-in` launch, print one line, then launch: "launching <name> with all-in (bypassPermissions; source: <source>): no harness permission prompts in that session; LETS gates (push, PR, merge, close, peer sends) still ask" (`<name>` = the session, slug or worktree being opened; `<source>` = the mode's source, or, for a team's lead on Reopen, the key T5 launches: `team file orca_agent` on the orca launcher, `team file agent_command` otherwise). The LETS gates are prompt discipline and are unchanged; `crossSessionInbound` is never written. The harness holds a cross-session messag
A development workflow plugin for Claude Code Stop babysitting your AI. Start shipping with it.
Ask a single expert agent a question - like a Slack ping to a colleague
Backlog review and cleanup - multi-agent backlog review, quick no-agent pulse (--fast), or interactive triage cleanup
Quick sanity check - code (inline 6-perspective) or plan (--plan).
End a work session - a settlement pass that reconciles uncommitted / unpushed work + session context into git, the tracker, and a…
Execute implementation plan from /lets:plan - inline in native plan mode, or delegated to named implementer subagents you review…
Implement tasks incrementally — build, test, verify, commit. Add "auto" to run the whole plan in one approved pass.