From task-flow
Manages the full task lifecycle across Notion (planning) and GitHub Issues (execution). This skill IS the planning and brainstorming step for any task that originates from Notion — do NOT run the brainstorming skill first. Invoke this skill instead. ALWAYS invoke before starting any development work, feature, bug fix, or content task, even if the user does not use task management vocabulary. Invoke when: the user opens a session by describing work to be done ("I need to work on X", "[Brand] feature name", "let's do X", "working on X today"); the user mentions a task, story, epic, or ticket; the user says "start", "begin", or "let's work on" anything; or the user asks to create, graduate, plan, close, or sync a task. Do NOT let the session proceed to brainstorming, worktrees, code, or any implementation before this skill has run and the user has approved a GitHub Issues plan.
How this skill is triggered — by the user, by Claude, or both
Slash command
/task-flow:task-flowThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Two systems, one rule: **Notion for planning, GitHub Issues for execution**.
Two systems, one rule: Notion for planning, GitHub Issues for execution.
Every Notion task goes through a structured flow before any code work begins: Claude reads the task, plans a breakdown into one or more GitHub Issues, writes that plan as a checklist on the Notion page, and waits for user approval before creating anything. The Notion task closes only when every linked issue is closed and the user verifies completion.
notion-* tools)gh CLI authenticated (gh auth status)If either is missing, announce which is unavailable and fall back to manual instructions for that step.
Before any operation, look for .claude/task-management.json in the project root.
Run this once per project. At the end, write .claude/task-management.json and confirm.
Walk the user through these questions in order, one at a time:
1. Notion database ID
"What's the ID of your Notion tasks database? You can find it in the database URL:
notion.so/<workspace>/<DATABASE_ID>?v=...Just the ID portion — 32 hex characters."
2. Status field name
"What is the name of the status property in your Notion database? (default:
Status)"
3. Status values
"What are the values for each state in your status field?
- Not started yet (default:
Not Started)- In progress (default:
In Progress)- Done (default:
Done)"
4. GitHub Issues link field
"Do you have a text property in Notion for storing linked GitHub Issue URLs? This field stores one issue URL per line and is used to track all issues linked to a task. What is it called? (default:
GitHub Issues— press enter to skip if you don't use one)Note: this must be a Text or Rich Text property, not a URL property — URL properties only hold a single value."
5. Default GitHub repository
"What is the default GitHub repo for issues? Format:
owner/repo(e.g.acme/backend). You can override this per task."
Write config:
{
"notion": {
"database_id": "<captured>",
"status_field": "<captured>",
"status_values": {
"todo": "<captured>",
"in_progress": "<captured>",
"done": "<captured>"
},
"github_issues_field": "<captured or null>"
},
"github": {
"default_repo": "<captured>"
}
}
Confirm: "Config saved to .claude/task-management.json. You can commit this file if you want the whole team to share the same config, or add it to .gitignore if you'd rather keep your Notion database ID out of the repo."
Use when the user wants to capture something that isn't ready for code yet.
notion-create-pages with the tasks database ID and the provided fields. Set status to the todo value.Announcement: "Task created in Notion: <title> — <url>"
This is a three-phase operation. Do not skip ahead — each phase gates the next.
Enter plan mode before doing anything else. Use EnterPlanMode if available. The goal is to think through the task scope before proposing anything to the user.
Steps:
Ask for the Notion task URL (or name to search for it).
Fetch the full task via notion-fetch — read the title, description, and any existing page content.
If the task description is too sparse to reason about scope (a title with no context), ask the user:
"This task doesn't have much detail yet. Can you describe what needs to happen so I can plan the right issues?"
Analyse the task scope in plan mode:
Produce a proposed breakdown: a numbered list of issues, each with a title and one-sentence description.
Append the plan as a checklist to the bottom of the Notion task page using notion-update-page with command: "insert_content" and position: {"type": "end"}:
## GitHub Issues Plan
- [ ] <Issue title> — <one-sentence description>
- [ ] <Issue title> — <one-sentence description>
- [ ] <Issue title> — <one-sentence description>
Before calling insert_content, read the Notion Markdown spec via notion://docs/enhanced-markdown-spec to ensure correct checkbox syntax.
Present the plan to the user:
"I've planned X issues for this task and added the checklist to the Notion page. Here's the breakdown: 1. Issue title — description 2. Issue title — description
Review the checklist on the Notion page and let me know if you'd like to adjust anything, or approve to proceed."
WAIT for user approval. Do not create any GitHub Issues until the user explicitly approves.
If the user requests changes, update the checklist on the Notion page using notion-update-page with command: "update_content" (search-and-replace the relevant lines), then present the revised plan again.
Fires immediately after the user approves the plan. No further prompting between issues — execute the full plan automatically.
Task Start checkpoint — announce before creating the first issue:
"Task Start checkpoint — executing plan, creating X GitHub Issues."
For each planned issue in order:
gh issue create \
--repo <repo> \
--title "<issue title>" \
--body "<issue description>
---
Notion task: <notion url>"
github_issues_field (one URL per line, preserve existing).notion-update-page with command: "update_content", replacing the plain item with the issue number and URL:
- [ ] <Issue title> — <description>- [ ] <Issue title> — #<N> <url>"Created #<N>: <title>"After all issues are created:
in_progress.Announcement: "Task Start checkpoint complete — X GitHub Issues created, Notion task In Progress.
#1: <title> — <url>
#2: <title> — <url>
..."
Use when the user indicates work is done. This operation has a verification gate — the Notion task is not marked Done until the user confirms.
Steps:
Ask for the Notion task URL or GitHub Issue number.
Fetch the Notion task and read all linked issue URLs from github_issues_field.
Check the state of each linked issue:
gh issue view <N> -R <repo> --json state,title --jq '{state: .state, title: .title}'
Present a completion summary to the user:
All issues closed:
"All X issues for this task are closed: ✓ #1: ✓ #2: <title>
Ready to mark the Notion task Done. Approve?"
Some issues still open:
"X of Y issues are closed. These are still open: ○ #3:
Do you want to close them now, or keep the task In Progress until they're done?"
WAIT for user verification and approval.
On approval:
Task Close checkpoint — announce:
"Task Close checkpoint — marking Notion task Done."
done via notion-update-page with command: "update_properties".notion-update-page with command: "update_content":
- [ ] <Issue title> — #<N> <url>- [x] <Issue title> — #<N> <url>Announcement: "Task Close checkpoint complete — Notion task marked Done."
| Situation | Behaviour |
|---|---|
| Notion MCP unavailable | Skip all Notion steps; announce which actions need to be done manually |
gh CLI not authenticated | Stop; instruct user to run gh auth login |
| Task description too sparse to plan | Ask user to elaborate before entering plan mode |
| User adjusts plan after approval | Re-enter Phase 1, update checklist, wait for re-approval |
| Some issues still open at Close | Present summary, ask whether to close them now or leave task In Progress |
No Notion task: line in issue body | Cannot retrieve Notion URL; ask user to provide it manually |
github_issues_field not configured | Skip field updates; rely on checklist on the page for tracking |
| MCP does not support page block updates | Display checklist in conversation; ask user to paste it into Notion |
| Issue URLs span multiple repos | Extract owner/repo from each stored URL when checking issue state |
For detailed setup instructions (finding your Notion database ID, installing Notion MCP, authenticating gh, creating the GitHub Issues text field), read references/setup-guide.md.
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 chaoming/claude-productivity-skills --plugin task-flow