| name | where-was-i |
| description | Reconstruct what the current session was doing after losing the thread. Reads the live conversation transcript, todos, git state and recently touched files straight off disk, then reports what the user asked for, where the work got to and what comes next. Use when the user says "where was I", "I lost my train of thought", "what were we doing", "remind me what we're working on", "catch me up", "recap", or after a context compact, crash or session resume when the plan is unclear. |
Where was I
The point of this skill is that it does not trust your context. If the thread is
lost, whatever is left in the window is the least reliable evidence available.
Everything below comes off disk.
Run this first
bin/where-was-i.py sits next to this file. Run whichever path exists:
python3 "${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/skills/where-was-i}/bin/where-was-i.py"
CLAUDE_PLUGIN_ROOT is the plugin directory when installed as a plugin, and
the skill directory otherwise. If neither resolves, find the script with
ls ~/.claude/skills/where-was-i/bin/.
Useful flags:
| Flag | Effect |
|---|
--cwd PATH | Reconstruct a different directory |
--session ID | A specific session, default is this one where the harness exports its id |
--only a,b | Read only these harnesses |
--skip a,b | Ignore these harnesses |
--sections a,b | Any of transcript,earlier_sessions,todos,git,files |
--minutes N | Recent-file window, default 180 |
--max-user N | User messages to print, default 20 |
--max-chars N | Per-message cap, default 1200 |
--tools N | Recent tool calls, default 20, 0 drops the section |
--all | Every harness with history here, not just the newest |
--list | Known harnesses, whether installed, on or off |
--init-config | Write config.json with everything currently detected |
Configuring what it reads
Defaults are fine for a first run. To make choices stick, write ~/.config/where-was-i/config.json with --init-config and edit it:
{
"harnesses": { "gemini": false, "cursor-agent": false },
"sections": { "files": false },
"generic_roots": { "deepseek": "~/.deepseek/sessions" },
"limits": { "max_user": 20, "max_chars": 1200, "tools": 20, "minutes": 180 }
}
Anything absent from harnesses stays on, so the file only needs the things you
are turning off. generic_roots adds a harness by path: the generic reader
matches a transcript to the directory by looking for the cwd inside the file,
which is enough for most JSON and JSONL formats. WHERE_WAS_I_CONFIG=path points
at a different file.
Reach for the flags when the run is one-off. Two worth knowing:
where-was-i.py --only claude-code --sections transcript,git
where-was-i.py --cwd ~/code/other-repo --minutes 1440
It reads, in this order of authority:
- The newest transcript for this directory across Claude Code, Codex, pi, omp,
opencode, and Kilo Code / Roo / Cline task dirs. Unknown harnesses are picked
up by a generic reader that matches on the cwd appearing in the file.
~/.claude/history.jsonl, which catches prompts submitted mid-turn that the
transcript has not flushed yet, plus prompts from earlier sessions here.
- The session todo list.
- Git: branch, status, untracked files, diffstat, log, stash, worktrees.
- Files modified inside the window.
If a harness stores prompts only (omp), the script says so in a note: line.
Then report, in this shape
WAS DOING: one sentence
EVIDENCE: two or three facts, each with a path, timestamp or commit
STATE: branch, N files dirty, last known test/build result
NEXT: 1. 2. 3.
UNSURE: anything the artifacts do not settle
Keep it under about fifteen lines. The user asked because they lost the thread,
so hand back the thread, not a transcript.
Rules
- Disk beats memory, and uncommitted changes beat both. If the transcript says a
refactor is finished and
git diff shows it half-applied, the diff is right.
- Quote the user's own words for
WAS DOING where they exist. Their last few
messages usually contain the answer verbatim.
NEXT comes from unfinished todos, then the diff, then the last user message.
Do not invent a plan the artifacts do not support.
- Say what is missing. "No test run recorded in this session" is more useful
than a guess at whether tests pass.
- Do not start work off the back of this. Report, then wait, unless the user
already told you to carry on.
- Long gap since the last activity, or a different branch than the transcript
expects, is worth flagging.
Other harnesses
The script is plain Python 3 with no dependencies and no harness APIs, so it
runs anywhere a shell does. Codex reads ~/.codex/prompts/where-was-i.md, omp
reads ~/.omp/agent/skills/where-was-i/. For anything else, run the script by path.
install.sh in the repo root sets all of those up.
To teach it a harness it does not know yet, add the state directory to
GENERIC_ROOTS in bin/where-was-i.py. A dedicated reader is only needed when the
transcript never mentions its own working directory.