Claude Code skill: session handoff
Summary
moonstreak-handoff is a skill for Claude Code
that ends a coding session by pushing whatever is unfinished into Moonstreak: a
project, one task per next action, the context in the task notes, and the steps
as a checklist you can tick off. It uses the public API
with a key you create, so it works from any repository, on any machine, against
your own organization.
It exists because the hardest part of a long session is not the code — it is remembering, three days later, where you were and what you were about to do.
Install
Paste this into Claude Code:
Install the Moonstreak handoff skill: https://moonstreak.app/skills/moonstreak-handoff/install.md
Claude reads that page and does the rest — downloads the skill, checks your Node version, and walks you through connecting your account.
Prefer to run it yourself:
curl -fsSL https://moonstreak.app/skills/moonstreak-handoff/install.sh | sh
Read the script
first if you'd rather see what it does — it downloads five files into
~/.claude/skills/moonstreak-handoff/ and touches nothing else. Add
--project (running it as a file, not through a pipe) to install into the
current repository's .claude/skills/ instead.
Re-running either command upgrades an existing install.
Requirements: Node 18+, Claude Code, and a Moonstreak plan that includes API access.
Connect your account
-
Settings → API keys → Create key. Give it the scopes
tasks:write,constellations:write, andtasks:read. The key is shown exactly once — copy it now. -
Store it:
echo 'sk_...' | node ~/.claude/skills/moonstreak-handoff/scripts/moonstreak.mjs login -
Check it:
node ~/.claude/skills/moonstreak-handoff/scripts/moonstreak.mjs check
OK and you're done. 402 means the plan does not include API access.
The key is stored in ~/.moonstreak/config.json with mode 0600. It is never
accepted as a command-line flag, because anything in a command line lands in
your shell history and in every process listing on the machine. Set
MOONSTREAK_API_KEY in the environment instead if you prefer not to keep a file
— for CI, that is the only sensible option.
Self-hosted: set MOONSTREAK_BASE_URL=https://your-domain before login.
Use it
Say any of these to Claude Code and the skill takes over:
- "I'm stopping for today — put what's left in Moonstreak"
- "Hand this off to future me"
- "What's still open on the checkout project?"
It gathers what was actually left unfinished, asks what to call the project (or which existing project to file under), and creates the tasks. You get a project URL back.
What lands in Moonstreak
For a session that ended mid-refactor, one task looks like this:
| Field | Content |
|---|---|
| Title | Re-run the failing cart total test |
| Notes | Where things stand, the exact file and line, the decision already made, the command that verifies it |
| Checklist | Open src/tests/cart.test.ts → Update the expected total at line 88 → Run pnpm vitest run … |
| Status | in_progress for the thing that was mid-flight when you stopped |
The first checklist step is always something doable in under two minutes. Starting is the expensive part; the skill is built around making the first step free.
Picking it back up
node ~/.claude/skills/moonstreak-handoff/scripts/moonstreak.mjs tasks # what's open
node ~/.claude/skills/moonstreak-handoff/scripts/moonstreak.mjs done ID # tick one off
Or just ask Claude Code "where were we on X" at the start of the next session — it reads the notes off the first open task and starts there. Tasks show up everywhere else in Moonstreak too: on the project board, in the Today queue, and as something you can run the timer against.
What it does to your data
- It creates projects, tasks, and checklist items. It never deletes, and it
never edits anything it did not create — apart from
done, which sets one task's status when you ask it to. - Everything is scoped to the organization the API key belongs to. The server derives the tenant from the key, so the tool cannot reach another organization's data even if pointed at one.
- Nothing is sent anywhere except your Moonstreak instance.
If a push is interrupted (rate limit, closed laptop), re-run the same command: it records each created id as it goes and resumes rather than duplicating.
Troubleshooting
| Symptom | What it means | Fix |
|---|---|---|
401 | Key wrong, revoked, or from another org | Create a new key, re-run login. |
402 plan_required | Plan has no API access | Upgrade the organization's plan. |
403 when filing under a project | Key is missing constellations:write | Create a key with all three scopes. |
429 | Rate limit | It retries twice, then stops. Re-run — the push resumes. |
| Tasks appear, project page empty | Key had only tasks:write | Re-create the key with constellations:write and re-push. |
| Skill doesn't activate | Not installed where Claude Code looks | Confirm ~/.claude/skills/moonstreak-handoff/SKILL.md exists. |
Uninstall
rm -rf ~/.claude/skills/moonstreak-handoff
rm -f ~/.moonstreak/config.json # only if you also want the stored key gone
Revoke the key itself in Settings → API keys. Anything already created in Moonstreak stays — it is your data, and removing the skill does not touch it.
Related
- Public API v1 — the contract the skill is built on, including the task and project endpoints it calls.
- API Cookbook — if you would rather write your own integration than use the skill.