# Kamkan

> Plan and track AI work as tasks on a KamKan kanban board. Before starting any multi-step task, break it into discrete tasks, add them to the board, then move each task through the columns (Todo → Doing → Done) as you work. Use when the user asks to track work, or when starting any task with 3 or more steps.

- Skill: `dayeggpi/kamkan` (Agent Skill)
- Install (CLI): `npx skillmds@latest add dayeggpi/kamkan`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dayeggpi/kamkan/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: dayeggpi (https://skillmd.com/u/dayeggpi)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/dayeggpi/kamkan

---


# KamKan Task Tracking

Use the `kamkan` MCP server to plan and track this session's work on a KamKan board.

## Activation

Activate when:
- The user says `/kamkan [boardId]` or "track tasks on [board]"
- The user starts a multi-step request and has a `KAMKAN_TASK_BOARD` environment variable set
- The user explicitly asks you to track or plan your work

## Step 1 — Identify the board

Check in order:
1. Board ID passed in the user's message
2. `KAMKAN_TASK_BOARD` environment variable
3. If neither: ask — "Which KamKan board should I track tasks on?"

## Step 2 — Set up the board

Call `get_board` directly on the target board. If it fails (board not found):
- Call `create_board` with `boardId` = target, `columns` = `["Todo", "Doing", "Done"]`
- Then call `get_board` again on the new board

Do NOT call `list_boards` when a boardId is already known.

Identify the three column roles:

| Role | How to detect |
|---|---|
| **Todo** | First column where `isArchive: false` and `isDone: false` |
| **Doing** | Second column where `isArchive: false` and `isDone: false` (may not exist) |
| **Done** | Column where `isDone: true`, or last non-archive column |

Announce:
> Tracking on board **[boardId]** · [Todo col] → [Doing col] → [Done col]
> Ready. Describe the work and I'll plan tasks before touching any code.

**From this point forward, for every work request in this session:** apply Steps 3–5 below. The board stays active for the entire conversation — do not wait to be re-invoked.

## Step 3 — Plan before acting

**Before writing any code, running any commands, or making any changes**, decompose the work:

- Break into **3–10 discrete, completable tasks**
- Order by dependency (what must happen first, first)
- Each task title = one action verb + specific object

Call `create_task` for each task in the **Todo** column. Show the user the resulting task list with IDs.

### Task title examples

| Good | Bad |
|---|---|
| "Implement JWT refresh endpoint" | "Backend work" |
| "Add input validation to registration form" | "Fix form" |
| "Write unit tests for parseBoard()" | "Tests" |
| "Update README with new install steps" | "Documentation" |

## Step 4 — Execute task by task

For each task in order:

1. `move_task` → **Doing** (skip if no Doing column)
2. Do the work
3. `move_task` → **Done** (or call `complete_task`)

**Never mark a task done before the work is actually finished.**
**Never batch-complete multiple tasks at once.**

## Step 5 — Handle discovered tasks

When you encounter work not in the original plan:
- Call `create_task` in the **Todo** column immediately
- Tell the user: "Added task [N]: [title]"

When a task splits into two:
- Rename the current task to the first part
- Create the second part as a new task

## Step 6 — Session summary

After all work is done, call `get_board` and report:
> ✓ [N] tasks completed · [N] remaining in [Todo/Doing]

---

## Edge cases

**Only one active column**: Use it as both Todo and Done. Skip the move-to-Doing step.

**Board has custom column names** (e.g. "Backlog", "In Progress", "Review"): Map by position and `isDone` flag, not by name.

**Task turns out to be much larger than expected**: Split it. Complete the current portion, create follow-up tasks, keep moving.

**User changes scope mid-session**: Update the board to reflect. Add new tasks, cancel irrelevant ones by moving them directly to Done with a note in the title like "CANCELLED: [original title]".

