From claude-handover
Capture and transfer project knowledge for team handovers. Use when someone mentions handover, hand over, going on leave, going on vacation, transferring a project, taking over a project, picking up where someone left off, ramping up on someone's work, out of office, or covering for someone. Supports /handover capture, /handover projects, /handover pickup <project>, /handover update <project>, /handover status <project>, /handover help.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-handover:handoverThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Help engineers capture project knowledge when transitioning off a project, and help incoming engineers ramp up with proactive guidance.
Help engineers capture project knowledge when transitioning off a project, and help incoming engineers ramp up with proactive guidance.
Parse the user's input to determine which subcommand applies. Check for explicit commands first, then infer from natural language.
Explicit commands:
/handover capture -> Capture/handover projects -> Projects/handover pickup <project> -> Pickup/handover update <project> -> Update/handover status <project> -> Status/handover share <project> -> Share (create GitHub repo, add collaborators)/handover clone <repo-url> -> Clone (fetch a shared handover from GitHub)/handover sync <project> -> Sync (pull latest changes from GitHub)/handover publish <project> -> Publish (commit and push updates to GitHub)/handover help -> Help/handover (no subcommand) -> HelpNatural language inference:
| Pattern | Maps to |
|---|---|
| "I need to hand over", "going on leave", "going on vacation", "transferring my project", "before I leave" | Capture |
| "what handovers are there", "list handovers", "show me the projects" | Projects |
| "I'm taking over", "picking up where X left off", "ramping up on", "what did X leave", "getting up to speed" | Pickup |
| "here's an update on", "things have changed", "update the handover" | Update |
| "what's the status", "where does X stand", "quick update on" | Status |
| "share this handover", "give access to", "create a repo for" | Share |
| "pull the latest", "fetch updates", "sync the handover" | Sync |
| "push my changes", "publish updates", "save to github" | Publish |
| Ambiguous | Ask: "Are you looking to capture a handover, pick one up, or something else?" |
Do NOT trigger for:
Handover data directory: ~/.claude/handovers/<project-slug>/
When the user runs /handover help or /handover with no subcommand, present:
Available commands:
/handover capture -- Start capturing a new project handover
/handover projects -- List all available handovers
/handover pickup <project> -- Load a handover and get guided onboarding
/handover update <project> -- Add new context to an existing handover
/handover status <project> -- Quick dashboard for a project
/handover help -- Show this help text
Sharing (optional — you can also just send the folder manually):
/handover share <project> -- Create a private GitHub repo and invite collaborators
/handover clone <repo-url> -- Fetch a shared handover from GitHub
/handover sync <project> -- Pull latest changes from GitHub
/handover publish <project> -- Push your updates to GitHub
You can also just talk naturally -- say things like "I need to hand over my
project" or "I'm picking up where Sarah left off" and I'll figure out what
you need.
This skill is fully customizable -- edit ~/.claude/skills/handover/SKILL.md
to add your own functionality or adapt it to your team's needs.
When the user wants to capture a handover, follow this flow:
~/.claude/handovers/ exists. Create it if not using the Bash tool: mkdir -p ~/.claude/handovers~/.claude/handovers/<slug>/ already exists. If so, ask whether to overwrite or create a versioned copy (e.g., <slug>-v2/).mkdir -p ~/.claude/handovers/<slug>/updates
mkdir -p ~/.claude/handovers/<slug>/resources
If the directory exists and contains a handover.yaml but it appears incomplete (missing key fields, empty context.md), warn:
"It looks like a previous capture for this project didn't finish. Want to resume where it left off, or start fresh?"
Ask for:
available — can be reached anytimeemail_only — prefer email onlyurgent_only — only for urgent issuesdo_not_disturb — do not contact at allTell the user:
"Here's what I can work with:
- Directly: text, markdown, code files, PDFs, images — just paste or give me file paths
- Copy-paste needed: Slack threads, ClickUp tickets, emails, or anything behind auth — paste the content here
- MCP integrations: if you have MCP servers connected for Slack, ClickUp, Jira, etc., I can pull context from those directly
How would you like to do this?"
Let the user choose, or detect from their behavior (if they start pasting text, switch to dump mode).
Whether interviewing or absorbing dumps, cover these suggested categories. These are NOT mandatory — adapt to whatever the project actually needs:
Use people's actual names and nicknames. Make it feel human, not like a form.
Adapt to project complexity:
As context is captured, write to the files immediately so nothing is lost if the session ends:
Write handover.yaml using this schema:
project:
name: "<Project Name>"
slug: "<project-slug>"
summary: "<One-line summary of what this project is>"
captured_date: "<YYYY-MM-DD>"
last_updated: "<YYYY-MM-DD>"
staleness_threshold_days: 14
handover:
from:
name: "<Name>"
role: "<Role>"
contact_preference: "<available|email_only|urgent_only|do_not_disturb>"
contact_details: "<email or other contact info>"
return_date: null # YYYY-MM-DD or null
to:
- name: "<Name>"
role: "<Role>"
people:
- name: "<Name (Nickname)>"
role: "<Role or what they know>"
org: "<Organization if external>"
context: "<Why they matter to this project>"
channels:
- name: "<#channel-name>"
purpose: "<What it's used for>"
environments:
- name: "<Environment Name>"
status: "<Current state>"
notes: "<Any access notes, gotchas>"
repos:
- name: "<repo-name>"
purpose: "<What it does>"
notes: "<Any important notes>"
ticket_system: "<ClickUp/Jira/Linear/etc.>"
ticket_search_hint: "<How to find relevant tickets>"
Write context.md with narrative content. Suggested sections (adapt based on what the user provides — create, rename, or omit sections as needed):
# <Project Name> — Handover Context
## Priorities
<!-- Ordered by importance. Include who owns each, what state it's in, and why it matters. -->
## Blockers
<!-- What's stuck and why. Include any debugging context or hypotheses. -->
## Gotchas & Tribal Knowledge
<!-- Things that would bite someone who doesn't know. Warnings, edge cases, "don't touch this because..." -->
## Architecture Notes
<!-- How things fit together, data flows, key design decisions and why they were made. -->
## Additional Notes
<!-- Anything else that doesn't fit above. -->
Write resources/index.yaml if the user provides files:
resources:
- filename: "<filename>"
description: "<What this file contains and why it matters>"
added_date: "<YYYY-MM-DD>"
Present a summary of everything captured:
"Here's what I've captured for the handover:
- People: [list]
- Repos: [list]
- Environments: [list]
- Priorities: [count] items
- Blockers: [count] items
- Resources: [count] files
Areas that might need more detail: [list any thin categories]
Want to add anything else, or does this look good?"
Let the user iterate or sign off.
Once the user signs off, offer sharing options:
"Handover captured! How would you like to share it?
Option A: GitHub (recommended) — I'll create a private repo, push the handover, and invite your teammate. They run
/handover clone <url>and they're in. Updates sync via/handover publishand/handover sync.Option B: Manual — Send the
~/.claude/handovers/<slug>/folder and the~/.claude/skills/handover/folder to whoever is picking up. They drop them in the same paths on their machine and run/handover pickup <slug>."
If they choose GitHub, run the Share flow.
When the user runs /handover projects:
~/.claude/handovers/: ls ~/.claude/handovers/ 2>/dev/null"No handovers found. Run
/handover captureto create one, or if someone sent you a handover folder, drop it into~/.claude/handovers/<project-name>/."
example-project handover exists, mention it:
"There's an example project you can look at to see what a handover looks like — run
/handover pickup example-project. Feel free to delete it whenever you want."
handover.yaml using the Read tool. Extract: project name, summary, captured date, last updated.last_updated to today's date against staleness_threshold_days.Available handovers:
<slug> -- <Project Name> (<summary>)
Captured: <date> | Updated: <date> | <fresh/stale indicator>
<slug> -- <Project Name> (<summary>)
Captured: <date> | Updated: <date> | <fresh/stale indicator>
Use a checkmark for fresh handovers and a warning for stale ones.When the user runs /handover status <project>:
~/.claude/handovers/<project>/ exists. If not, run the Projects flow to show available handovers and suggest the closest match.handover.yaml and context.md using the Read tool.updates/ using the Glob and Read tools.<Project Name> — Status Dashboard
Last updated: <date> (<fresh/stale>)
Captured by: <Name> on <date>
Contact: <contact preference message>
Priorities:
1. <priority 1>
2. <priority 2>
...
Active Blockers:
- <blocker 1>
- <blocker 2>
Recent updates: <count> since capture
When the user runs /handover pickup <project>:
~/.claude/handovers/<project>/ exists. If not:
find ~/Downloads ~/Desktop ~/Documents -maxdepth 2 -name "<project>" -type d 2>/dev/null | head -5<project> folder at <path>. Want me to move it to ~/.claude/handovers/<project>/ so you can use it?"handover.yaml using the Read tool.context.md using the Read tool.updates/ and read them, sorted chronologically.resources/index.yaml if it exists. For text-based resources, read them too. For images/PDFs, note their existence and offer to show them.Compare last_updated from handover.yaml to today's date. If the difference exceeds staleness_threshold_days:
"Heads up — this handover was captured on , which is days ago. Some priorities or blockers may have changed. Consider checking with the team for the latest."
Don't dump everything at once. Present a short header with the essential context, then a numbered menu of areas the user can explore. This keeps things clean and lets the user control what they see.
Format the header as:
**<Project Name>** — <summary>
Captured by <from_name> on <captured_date> | <fresh/stale> | <contact preference one-liner>. <Return date if set.>
<If updates exist:> <count> updates since capture.
Contact preference one-liners:
available: " is reachable at <contact_details>"email_only: " prefers email only: <contact_details>"urgent_only: " is available for urgent issues only"do_not_disturb: " is not available — do not contact"Important: When the preference is do_not_disturb, NEVER suggest contacting them anywhere in the handover, even if they are the only person who knows something. Suggest alternative sources instead.
Then present the menu. Build it dynamically from what's actually in the handover — only show items that have content:
**Here's what I can brief you on:**
1. Project overview & architecture
2. Key people & contacts (<count> people)
3. Communication channels & meetings
4. Environments (<count> environments)
5. Repositories (<count> repos)
6. Priorities (<count> items)
7. Active blockers (<count> items)
8. Gotchas & tribal knowledge (<count> items)
9. <Any additional sections from context.md>
10. <Any resource files>
**Quick summary:** The highest priority is **<top priority>**, which is currently **<status/blocker if any>**.
Ask me about any of the above by number or name, or say "give me everything" for the full briefing.
If the user picks a number or topic: Present just that section with clean formatting:
---) between major sectionsIf the user says "give me everything": Present all sections sequentially with clean visual separation:
--- between each major sectionIf the user asks a specific question: Answer it directly from the handover context without presenting a full section.
If there are files in updates/, present them chronologically either as part of the full briefing or when the user asks about updates:
"Since the handover was captured, here are the updates:"
- :
After presenting content (whether a single section or the full briefing), suggest where to start:
"Based on the current priorities, I'd suggest starting with: . Want me to walk you through it?"
From here, follow the user's lead:
Answer any follow-up questions from the handover context. But also proactively volunteer relevant context when you notice the user is working on or asking about something that the handover has information about — even if they didn't ask directly. For example:
Don't repeat things you've already told them, but do surface relevant handover context when the moment is right.
If asked about something not covered in the handover:
"That wasn't covered in the handover. You might want to check with or look at <most relevant system, e.g., the ClickUp board>."
If the user seems to be doing something the skill doesn't handle well, quietly suggest:
"Tip: you could extend this skill to handle that — edit
~/.claude/skills/handover/SKILL.md."
Don't push this — only mention it if it's genuinely useful.
When the user runs /handover update <project>:
~/.claude/handovers/<project>/ exists. If not, run the Projects flow to show available handovers.handover.yaml using the Read tool to understand the current context.updates/YYYY-MM-DDTHHMM-<summary>.md using the Write tool. Example: updates/2026-04-01T1430-multi-brand-fix.mdresources/ and update resources/index.yaml using the Edit tool.last_updated in handover.yaml to today's date using the Edit tool.context.md or existing update files. Updates are append-only."Update saved to
updates/<filename>. The handover for is now up to date.When <original person's name> comes back, they can run
/handover pickup <slug>to catch up on everything that happened while they were away."
When the user runs /handover share <project>:
IMPORTANT: Repos MUST always be created as private. Never create a public repo for handover data.
~/.claude/handovers/<project>/ exists. If not, list available projects.gh (GitHub CLI) is installed and authenticated: gh auth status
/handover publish instead.handover-<project-slug> as defaultcd ~/.claude/handovers/<project>
git init
git add -A
git commit -m "Initial handover capture"
gh repo create <repo-name> --private --source=. --push
gh api repos/<owner>/<repo-name>/collaborators/<username> -X PUT
"Done! Private repo created at
https://github.com/<owner>/<repo-name>. has been invited as a collaborator.Tell them to run
/handover clone https://github.com/<owner>/<repo-name>to get started. After making updates, either of you can run/handover publish <project>to push changes and/handover sync <project>to pull the latest."
When the user runs /handover clone <repo-url>:
~/.claude/handovers/ exists, create if not: mkdir -p ~/.claude/handoversgit clone <repo-url> /tmp/handover-clone-temp
handover.yaml from the temp clone to get the actual project slug:
# Read the slug field from handover.yaml
~/.claude/handovers/<slug>/ already exists:
<slug> already exists locally. Want to replace it with the remote version, or keep what you have?"rm -rf ~/.claude/handovers/<slug>mv /tmp/handover-clone-temp ~/.claude/handovers/<slug>
"Handover cloned! Run
/handover pickup <slug>to get started, or/handover projectsto see all available handovers."
Important: Always use the slug from handover.yaml, NOT the repo name. The repo might be called handover-softswiss but the slug is softswiss — the folder must match the slug for pickup to work.
When the user runs /handover sync <project>, or says things like "pull the latest", "fetch updates", "get the latest changes":
Check if ~/.claude/handovers/<project>/ exists and is a git repo with a remote.
/handover share <project> to set it up."Pull latest changes:
cd ~/.claude/handovers/<project> && git pull
Confirm what changed (if anything):
"Pulled the latest changes. Here's what's new since your last sync: ..."
Or if nothing changed:
"Already up to date."
When the user runs /handover publish <project>, or says things like "push my changes", "save to github", "publish the updates":
~/.claude/handovers/<project>/ exists and is a git repo with a remote.
/handover share <project> to set it up."cd ~/.claude/handovers/<project> && git status
cd ~/.claude/handovers/<project> && git add -A && git commit -m "<summary of changes>" && git push
"Updates published! Anyone with access to the repo can run
/handover sync <project>to get the latest."
Proactive publishing: During normal conversation, if the user has been making updates to a handover (via /handover update or just discussing changes that got written to files), and the handover is connected to GitHub, proactively offer:
"I've made some updates to the handover. Want me to publish them to GitHub so others can see the latest?"
Don't push this on every small change — use judgement. Offer after a meaningful update session, not after every tweak.
These apply across all subcommands:
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub fergalbittles/claude-handover --plugin claude-handover