By willseltzer
Generate HANDOFF.md files capturing project goals, completed tasks, git state, key decisions, and resume instructions to transfer AI coding sessions to any agent like Claude Code, Cursor, Copilot, or Aider. Resume work by reading handoffs, checking git drift, and continuing tasks.
Create handoff documents that let any AI coding agent continue your work.
Run these commands inside Claude Code:
/plugin marketplace add willseltzer/claude-handoff
/plugin install handoff
AI sessions have limited context. When you switch tools, take a break, or hit a context limit, the next agent starts from scratch. Handoffs solve this by capturing:
| Command | Description |
|---|---|
/handoff:create | Full handoff with complete context |
/handoff:quick | Minimal handoff - just the essentials |
/handoff:resume | Continue from an existing handoff |
When you're done (or switching agents):
/handoff:create
This generates HANDOFF.md with:
For simple tasks:
/handoff:quick
In a new session (Claude Code or any AI):
/handoff:resume
The agent will:
Just tell them:
"Read HANDOFF.md and continue the work"
The format is agent-agnostic.
# Handoff: [Task Title]
**Generated**: 2024-01-15 14:30
**Branch**: feature/auth
**Status**: In Progress
## Goal
Add user authentication with OAuth2.
## Completed
- [x] Set up OAuth2 provider config
- [x] Created login endpoint
## Not Yet Done
- [ ] Add token refresh logic
- [ ] Handle logout
## Failed Approaches (Don't Repeat These)
Tried passport.js first - it conflicted with our Express middleware.
`req.user` was always undefined because passport's session middleware
ran after our custom auth check. Switched to oauth4webapi which works
directly with fetch and doesn't touch Express.
## Key Decisions
| Decision | Rationale |
|----------|-----------|
| oauth4webapi over passport | Lighter weight, no middleware conflicts |
| Store refresh token in httpOnly cookie | More secure than localStorage |
## Current State
**Working**: Login flow returns valid tokens
**Broken**: Refresh endpoint returns 500 - `TokenExpiredError` at refresh.ts:42
## Code Context
// Hook signature - src/hooks/useAuth.ts
function useAuth(): {
user: User | null;
login: (email: string, password: string) => Promise<void>;
logout: () => void;
isLoading: boolean;
}
// POST /api/auth/login response
{ "accessToken": "eyJ...", "expiresIn": 3600 }
// Refresh token set as httpOnly cookie, not in response body
## Resume Instructions
1. Fix refresh endpoint: the JWT verify call at `refresh.ts:42` uses wrong secret
- Expected: Returns new access token
- Current: Throws TokenExpiredError even for valid tokens
2. Add logout: clear the httpOnly cookie, POST /api/auth/logout
3. Test full flow:
- Login with [email protected] / testpass123
- Wait 5 seconds, trigger refresh (or manually call /api/auth/refresh)
- Expected: New token returned, no errors
## Setup Required
- `OAUTH_CLIENT_SECRET` env var must be set (see .env.example)
- Test user exists: [email protected] / testpass123
## Warnings
- OAuth provider sandbox resets daily at midnight UTC
- Don't use `localStorage` for tokens - we decided httpOnly cookies only
claude-handoff/
├── .claude-plugin/
│ └── plugin.json
├── commands/
│ ├── create.md # /handoff:create
│ ├── quick.md # /handoff:quick
│ └── resume.md # /handoff:resume
├── skills/
│ └── handoff/
│ └── SKILL.md # Auto-detection
└── README.md
Failed approaches are mandatory - This is the most valuable part. "Tried X, it didn't work because Y" saves hours.
Show code, don't describe - "Created a hook" is useless. Show the signature so the next agent knows how to use it.
Test steps need expected outcomes - Not "verify it works" but "POST to /api/X, expect 200 with { status: 'ok' }".
Include the actual error messages - "It threw an error" vs "TokenExpiredError at line 42" - huge difference.
Use /handoff:quick for simple tasks - Not everything needs 10 sections.
MIT
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
npx claudepluginhub willseltzer/claude-handoff --plugin handoffCorca Workflow Framework — consolidated hooks and skill orchestration for structured development sessions
Personal Claude Code + Codex dev stack: security hooks, AI-first code conventions, /security-review, /repo-map, /stack-check, portable statusline. Designed to complement other skills-based plugins, not replace them.
Development workflow automation plugin: specify → open → execute pipeline with parallel research agents, hook-based guards, and PR state management
Multi-agent orchestration for code that matters.
Persistent memory system for AI coding sessions — cross-tool memory sharing with 6-dimensional hybrid search
Persistent context for AI coding assistants