plugins/todo-sync/skills/todo-sync/SKILL.md
Automatically syncs todos and plans from ~/.claude/ to the current project. Use this skill when asking about todo sync behavior, troubleshooting sync issues, or understanding where todos are stored.
npx skillsauth add nsheaps/ai-mktpl Todo SyncInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This plugin automatically synchronizes your todos and plans from the global Claude directory (~/.claude/) to your current project's .claude/ directory.
The plugin uses a PostToolUse hook that triggers after every TodoWrite tool call:
~/.claude/todos/.claude/todos/ in your project~/.claude/plans/ to .claude/plans/~/.claude/todos/{session-id}.json~/.claude/plans/{plan-name}.md.claude/todos/{session-id}.json.claude/plans/{plan-name}.mdTodos: When both source and destination files exist, todos are merged by deduplicating on the content field. This prevents duplicate todo entries.
Plans: Plans are copied if the source is newer than the destination or if the destination doesn't exist.
~/.claude/todos/ contains files for your session/plugins command outputclaude --debugThe script creates directories automatically. If you see permission errors:
.claude/ isn't gitignored with restrictive permissionsFiles containing only [] (empty arrays) are skipped during sync to avoid cluttering the project.
The plugin automatically adds patterns to ~/.config/git/ignore (the global gitignore) for .claude/todos/ and .claude/plans/ directories. This prevents synced files from being committed in any project by default.
If you want to track todos in version control for a specific project, add explicit !.claude/todos/ pattern to that project's .gitignore.
The sync happens automatically on TodoWrite. If you need to manually trigger it, simply update your todos:
TodoWrite: [your todos here]
The hook will fire and sync will occur.
tools
Manually reproduce what the github-app plugin's SessionStart hook does to make a GitHub App installation token usable in the current session — materialize the PEM, generate the token, isolate GH_CONFIG_DIR, write the runtime env file, and wire CLAUDE_ENV_FILE so every Bash call sees GH_TOKEN/GITHUB_TOKEN. Use when the hook did not run, the token is missing from the environment, or a shell/teammate needs the token wired up by hand. <example>GH_TOKEN isn't set even though github-app is configured</example> <example>the github-app SessionStart hook didn't run, set up the token manually</example> <example>wire the github app token into CLAUDE_ENV_FILE</example> <example>gh keeps falling back to the wrong account, isolate GH_CONFIG_DIR</example>
tools
Manually configure the GitHub App bot git identity the way the github-app plugin's SessionStart hook does — resolve the app slug and bot user ID, build the <slug>[bot] name and noreply email, set GIT_AUTHOR_*/GIT_COMMITTER_* env vars, and write an isolated GIT_CONFIG_GLOBAL with the gh auth git-credential helper. Use when commits are attributed to the wrong account, "Author identity unknown" appears, or git identity must be set up by hand. <example>my commits are showing up as the handler, not the bot</example> <example>git says Author identity unknown after the github-app hook ran</example> <example>configure the github app bot git identity manually</example> <example>set up the gh credential helper for git push</example>
tools
Manages spec files for requirements capture and validation
tools
# Bash Chaining Alternatives This skill teaches you how to work around the bash command chaining restriction enforced by this plugin. ## Why Chaining is Blocked The `bash-command-rejection` plugin blocks these operators: | Operator | Name | Why Blocked | | -------- | ---------- | ----------------------------------------------------------------------------------- | | `&&` | AND chain | Runs cmd2 only if cmd1 su