원클릭으로
planning-board
Full CRUD access to the Planning Board for creating, reading, updating, and deleting tickets.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Full CRUD access to the Planning Board for creating, reading, updating, and deleting tickets.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Participate in team discussions, report quality patterns, and respond to mentions on the Meeting Board.
Read review queue, post review feedback, and transition tickets through the CQ gate on the Planning Board.
Post status updates, respond to mentions, and communicate with the team on the Meeting Board.
Read assigned tickets, post comments, and update ticket status on the Planning Board.
Post deployment status, infrastructure health updates, and coordinate with team on the Meeting Board.
Read tickets, post deployment comments, and move tickets to closed status on the Planning Board.
| name | planning-board |
| description | Full CRUD access to the Planning Board for creating, reading, updating, and deleting tickets. |
PO has full, unrestricted access to the Planning Board. This skill covers every operation available: creating tickets, reading and querying tickets, updating any field, deleting tickets, assigning work, managing statuses, and reading comment and status histories.
${PLANNING_BOARD_URL} (set via environment variable)Authorization: Bearer ${PLANNING_BOARD_TOKEN}application/jsonAll examples below use these variables. Replace with actual values at runtime.
There are exactly three ticket types:
There are no other types. Do not use bug, task, subtask, or feature — they will be rejected by the API.
Ticket numbers use the format MNS-{N} for all types (e.g., MNS-1, MNS-42). There are no per-type prefixes.
curl -s -X POST "${PLANNING_BOARD_URL}/api/tickets" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"type\": \"story\", \"title\": \"Implement user login form\", \"description\": \"Create a login form with email and password fields.\\n\\n## Acceptance Criteria\\n- [ ] Form has email field with validation\\n- [ ] Form has password field (min 8 chars)\\n- [ ] Submit button disabled until valid\\n- [ ] Server errors display inline\", \"priority\": 4, \"assignee\": \"${EXAMPLE_DEV_EMAIL}\", \"labels\": [\"frontend\", \"auth\"]}"
curl -s -X POST "${PLANNING_BOARD_URL}/api/tickets" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"type\": \"epic\", \"title\": \"User Authentication System\", \"description\": \"Complete authentication system including login, registration, password reset, and session management.\", \"priority\": 4, \"labels\": [\"auth\", \"mvp\"]}"
curl -s -X POST "${PLANNING_BOARD_URL}/api/tickets" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"type\": \"initiative\", \"title\": \"Build user onboarding flow\", \"description\": \"Users need a guided onboarding experience after registration.\", \"priority\": 3}"
Notes:
type defaults to story if omitted.priority is a number: 1 (lowest) to 5 (critical).assignee is an email like ${EXAMPLE_DEV_EMAIL}, not a role name.description field. There is no separate acceptance_criteria field.boardId is optional — the API auto-selects the default board if omitted.curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets/MNS-22" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?status=in-review" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?type=initiative" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?type=epic" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?assignee=${EXAMPLE_DEV_EMAIL}" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?assignee=none&status=todo" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?status=in-progress&type=story&priority=4" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?search=login%20form" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?label=auth" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?updated_after=2025-01-15T00:00:00Z&updated_before=2025-01-16T00:00:00Z" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X PATCH "${PLANNING_BOARD_URL}/api/tickets/MNS-22" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"status\": \"in-progress\"}"
curl -s -X PATCH "${PLANNING_BOARD_URL}/api/tickets/MNS-22" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"assignee\": \"${EXAMPLE_DEV_EMAIL}\"}"
curl -s -X PATCH "${PLANNING_BOARD_URL}/api/tickets/MNS-22" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"priority\": 5}"
curl -s -X PATCH "${PLANNING_BOARD_URL}/api/tickets/MNS-22" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"type\": \"epic\"}"
curl -s -X PATCH "${PLANNING_BOARD_URL}/api/tickets/MNS-22" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"status\": \"in-progress\", \"assignee\": \"${EXAMPLE_DEV_EMAIL}\", \"priority\": 4}"
curl -s -X PATCH "${PLANNING_BOARD_URL}/api/tickets/MNS-22" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"title\": \"Implement user login form with validation\", \"description\": \"Updated scope: include rate limiting feedback.\"}"
Use sparingly. Only for duplicates or tickets created in error.
curl -s -X DELETE "${PLANNING_BOARD_URL}/api/tickets/MNS-99" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X PUT "${PLANNING_BOARD_URL}/api/tickets/MNS-22/assignee" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"assignee\": \"${EXAMPLE_DEV_EMAIL}\"}"
curl -s -X PUT "${PLANNING_BOARD_URL}/api/tickets/MNS-22/assignee" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"assignee\": null}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets/MNS-22/comments" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X POST "${PLANNING_BOARD_URL}/api/tickets/MNS-22/comments" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"body\": \"Reviewing this ticket. Acceptance criteria look good.\"}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets/MNS-22/history" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/board/summary" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/board/workload" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
The board separates two concepts:
Key rules:
rank field cannot be set via PATCH /api/tickets/:id — it is only changeable through the reorder endpoint.curl -s -X POST "${PLANNING_BOARD_URL}/api/tasks/reorder" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"order\": [{\"id\": \"TASK_OBJECT_ID_1\", \"order\": 0}, {\"id\": \"TASK_OBJECT_ID_2\", \"order\": 1}]}"
Each item in the order array maps a task ObjectId to its new position. The API sets rank = index + 1 for each item.
curl -s -X GET "${PLANNING_BOARD_URL}/api/ticket-types" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
Returns: ["initiative", "epic", "story"]
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?type=initiative&status=todo" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets/MNS-5" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"
Create epics with a label linking back to the initiative ticket number.
curl -s -X POST "${PLANNING_BOARD_URL}/api/tickets" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"type\": \"epic\", \"title\": \"User Authentication System\", \"description\": \"Complete auth system. Spawned from MNS-5.\", \"priority\": 4, \"labels\": [\"auth\", \"initiative:MNS-5\"]}"
curl -s -X POST "${PLANNING_BOARD_URL}/api/tickets" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"type\": \"story\", \"title\": \"Implement login form\", \"description\": \"Login form with validation.\\n\\n## Acceptance Criteria\\n- [ ] Email field with format validation\\n- [ ] Password field (min 8 chars)\\n- [ ] Disabled submit until valid\", \"priority\": 4, \"assignee\": \"${EXAMPLE_DEV_EMAIL}\", \"labels\": [\"auth\", \"initiative:MNS-5\"]}"
curl -s -X PATCH "${PLANNING_BOARD_URL}/api/tickets/MNS-5" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"status\": \"completed\"}"
Add a summary comment listing all created tickets:
curl -s -X POST "${PLANNING_BOARD_URL}/api/tickets/MNS-5/comments" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"body\": \"Initiative decomposed. Created: MNS-10 (epic), MNS-11 through MNS-14 (stories). All tagged with initiative:MNS-5.\"}"
curl -s -X GET "${PLANNING_BOARD_URL}/api/tickets?label=initiative:MNS-5" \
-H "Authorization: Bearer ${PLANNING_BOARD_TOKEN}"