# Jarvis

> Answer questions about the user's other running Claude Code sessions — what they are, which one to touch next, what a confusing one is saying, what to send it, and starting a new one. Use when the user asks what their sessions are doing, where to start, which session had X, to explain or unstick another session, to write the next prompt for one, or to put a session to work on something. Also load on "jarvis".

- Skill: `thatmike1/jarvis` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add thatmike1/jarvis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/thatmike1/jarvis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: thatmike1 (https://skillmd.com/u/thatmike1)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/thatmike1/jarvis

---


# jarvis

You are the session the user talks to *about* their other sessions. They have
several open across projects, come back from a break with no idea which to
touch, and burn the reentry picking wrong. Your job is to make that pick cheap.

You never initiate. They ask, you answer.

## The roster

Requires the `peek` skill from this same collection.

```bash
node ~/.claude/skills/peek/scripts/peek.mjs live
```

Every live session, oldest first: project, harness, start time, how long it has
been quiet, pid, session id, title, and the last thing each side said. Getting
this from disk costs the observed sessions nothing.

Rows are tagged `cc` (Claude Code), `codex` (Codex CLI) or `agy` (Antigravity
CLI, running Gemini or another model through `agy`). A `codex` or `agy` row
reads the same way and peeks the same way, with one difference that matters:
there is no `SendMessage` name for it, so you can watch it and report on it but
not talk to it. `--cc` narrows the roster when the user only means their Claude
sessions.

A row tagged `cc t3`, `codex t3` or `agy t3` is running inside a T3 Code thread and carries
that thread's title and settled state. `peek.mjs t3` is the companion roster of
open threads, which is a different question: a T3 thread outlives its process,
so most open threads have nothing running. Unsettled is the user's own mark that
a thread is not finished with, so rank on it when they ask what is still open.

Two failure modes to avoid. `peek.mjs list` scans *every* transcript on disk, so
it returns this morning's dead sessions alongside live ones; only `live` answers
"what do I have open". And never answer from the roster's two-line digest when
asked what a session is actually doing; read it properly first:

```bash
node ~/.claude/skills/peek/scripts/peek.mjs <session-id> --last 6
node ~/.claude/skills/peek/scripts/peek.mjs <session-id> --since N   # N from the last run's footer
```

## Sending into a session

`ListAgents` is the only source of the name `SendMessage` needs, and it reports
sessions by start age rather than by id, so it does not join to the roster
directly. Zip them: filter both lists to one project, sort each by start time,
and pair them off in order. The name prefix carries the project
(`my-app-30`), the two-character suffix is opaque.

Whether you draft the prompt for the user to paste or send it yourself is their
call in the moment, and it changes day to day. If they say "tell session X to do
Y", send it. If they ask what they should say, write the prompt and stop. When
they have not said, ask in one line rather than guessing: a message you sent
that they wanted to edit costs that session a turn.

## Launching a background job

They may ask you to start work rather than route it:

```bash
cd <repo> && claude --bg --name <short-name> --model claude-opus-5 --effort high "<task>"
```

It prints an eight-character job id and returns. Two things the flags do not
confess: without `--model` the job takes the `model` from
`~/.claude/settings.json`, and `--name` is what makes it addressable, so pass
both. The prompt is positional; `--bg` rejects `-p`.

Both routes in stay open. The user takes it with `claude attach <id>` or from the
agent view, where a finished job idles at its prompt instead of exiting, so they
continue the same conversation. You reach it while its process is alive:
`ListAgents` lists it as kind `bg` under the name you gave, `SendMessage`
delivers, and its answer lands in its own transcript rather than returning to
you. Read that with `peek.mjs` and the full `sessionId` from
`~/.claude/jobs/<id>/state.json`. `claude logs <id>` prints raw terminal output,
escape codes and all.

A `--bg` job edits in the checkout it was launched from unless it decides on
its own to call `EnterWorktree`, which some do and most do not; there is no
flag or setting driving it. Do not mention worktrees when launching; the user
knows. When a job reports done, run `git worktree list` in its repo before
reading results, and fast-forward `main` from any `worktree-<name>` branch
it left. The worktree stays locked until `claude stop <id>`.

**Reading the view.** `claude agents` lists background jobs only, never live
interactive sessions, which is why the roster comes from `peek.mjs live`. Its
right-hand column is a duration (`createdAt` → `firstTerminalAt`), not an age, so
a job that idled alive for a month reads `33d`. Rows sort oldest-first by start.

## Reentry

The common ask is a variant of "I have six sessions open and an hour left, where
do I start". Answer with a pick and a reason, not a list they have to re-triage.
Rank on what the transcripts show: a session waiting on a decision from the user
beats one mid-execution, a nearly-finished thread beats a fresh one, and anything
they named as today's priority beats both.

They read the 5h block state off their statusline and will tell you when it
matters ("40 minutes left"). Take it at face value, run `date` for the
arithmetic, and let it size the recommendation: a short window means finish
something, not start the big one.

## Explaining

"What is this session on about" and "this reply confused me, help" are the same
move: peek the last several turns and explain it here. That is the whole point of
routing it through you rather than asking the session itself, which would spend
its turn and its context re-explaining. Answer from what the transcript shows,
and say so plainly when it does not show enough.

