一键导入
organize-tasks
Use when David wants to clean up, review, or triage his Todoist tasks. Batch review process - 4 tasks at a time, David decides, AI executes.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when David wants to clean up, review, or triage his Todoist tasks. Batch review process - 4 tasks at a time, David decides, AI executes.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
How to make an AI coding agent run on a schedule, loop, or interval — cron jobs, heartbeats, self-starting/self-terminating loops, recurring autonomous checks. Use when the user asks to "run every N minutes/hours", "check something on a regular interval", "schedule a task", "run on a loop", "self-start", "heartbeat", "cron job for an agent", or wants an agent to fire periodically without manual launching. Covers two camps — one-shot agents you wrap in an external clock (Claude Code, Codex, Pi) vs agents with a built-in scheduler daemon (Hermes).
Use only when David explicitly says "track my behavior in this conversation" or clearly asks to log, track, or analyze his behavior in the current conversation. This skill logs each of David's messages to a local behavior database, records decisions with follow-up questions, updates local notes when useful, and surfaces patterns when asked.
Direct browser control via CDP. Use when the user wants to automate, scrape, test, or interact with web pages. Connects to the user's already-running Chrome.
MUST be read ANY time you interact with cmux in ANY way — listing/inspecting/creating/closing cmux workspaces, panes, or surfaces; reading or capturing pane/screen output; sending input or keys to a pane/surface; delegating to, polling, or checking on other agents running in cmux panes/surfaces; building or rearranging terminal layout; cmux browser automation; sending notifications/flashes/status/progress to the sidebar; editing cmux settings; or integrating an agent with cmux hooks. If your command starts with `cmux ` or touches a cmux workspace/pane/surface/agent, read this FIRST. Triggers on "cmux", "in this workspace", "this pane", "the other agent", "delegate to", "check on the agent", "send to the pane". macOS only (14.0+).
Explain and write effective instructions for OpenAI Codex's `/goal` feature — the persistent self-checking agent loop (plan → act → test → review → iterate). Use when the user mentions Codex `/goal`, "goal loop", wants to kick off a long-running autonomous Codex run, asks how to write a goal prompt, or wants a one-paragraph goal instruction drafted.
Use when David is preparing for or running a consulting call (lawyer, accountant, tax advisor, etc.) and wants to manage a question list — adding, marking as asked, moving between Main/Potential, or tracking answers. Triggers on consulting call, advisor call, prep questions, mark as asked, add question to call.
| name | organize-tasks |
| description | Use when David wants to clean up, review, or triage his Todoist tasks. Batch review process - 4 tasks at a time, David decides, AI executes. |
Goal: Review every active task with David. He decides - AI presents and executes.
The Inbox is a brain dump - tasks, ideas, frustrations, observations, notes all land here. This is by design, not a problem. Triage is where signal gets separated from noise. Never comment on this pattern or suggest changing it.
.txt reminder file,
ALWAYS delete the Todoist task immediately after confirming the file was
created. One atomic operation.
business/reminders/personal/reminders/Fetch scope is defined by David at session start. Ask if unclear. Examples:
<INBOX_PROJECT_ID>, no date filter.Project IDs and the fetch pattern live in the todoist skill. Never assume scope - confirm first.
Track a session set of task contents David has said "keep/skip" on - these stay in Todoist but should not be re-presented.
Fetch the scope from Todoist. Filter out anything in the session's kept/skipped set. Sort: P4 first, then P3, P2, P1.
Show progress (handled this session / total remaining in scope), then the current batch (numbered 1-4), a separator, then a preview of the next batch (numbered 5-8). Use identical formatting for both - David reads them side by side and any styling difference makes the preview harder to scan:
**12 handled, 28 remaining**
**Current batch:**
1. **P4** task text
2. **P2** task text
3. **P1** task text
4. **P4** task text
---
**Preview of next batch:**
5. **P4** task text
6. **P3** task text
7. **P2** task text
8. **P1** task text
For each of the 4, David gives a disposition. Execute immediately in Todoist:
.txt file, delete Todoist task."labels": ["reminder"]).
Common label: reminder for self-nudge tasks.Once all 4 are handled, re-fetch the scope from Todoist (fresh state, latest IDs), filter out the kept/skipped set, present the next 4 plus preview. No confirmation needed. Repeat until no tasks remain in scope.
ALWAYS re-fetch before every batch - David often edits Todoist directly in the web/mobile app between batches (adds, deletes, reprioritizes, reschedules). Never present from cached data. One fresh fetch per batch is non-negotiable.
Summarize totals (kept, deleted, completed, moved, delegated). Report final task count remaining in Todoist.
Every operation MUST go through a script file (write_file to
/tmp/todoist_*.sh, then bash). NEVER run inline curl/jq in the terminal.
Auth-token masking corrupts inline commands. A security filter rewrites
the literal string Authorization: Bearer $TOKEN and can silently break the
command. Workaround that survives the filter:
TK=$(grep -E '^TODOIST_API' .env | cut -d= -f2- | tr -d '"' | tr -d "'" | tr -d ' ')
WORD="Bea""rer"
HDR="Authorization: ${WORD} ${TK}"
curl -s ... -H "$HDR" ...
After write_file, read_file the script to confirm the auth line is intact.
curl exits 0 even on 401/auth failure. Capture the response body and
check it with jq. A success body has the task object; a failure has an
error/null. Never report a disposition as done without seeing the updated
object.
Don't invent priority errors. P3 = API value 2. If David says P3 and you
send priority:2, that is correct. Re-check the Priority Trap table before
fixing anything.
David's brain-dump tasks often contain smart quotes, em-dashes, and ellipses.
Exact full-content jq matching is fragile. Match on a safe ASCII prefix with
startswith, not the full string.
findid() { echo "$INBOX" | jq -r --arg s "$1" '.results[] | select(.content | startswith($s)) | .id' | head -1; }
ID=$(findid "Team member is right")
ID=$(findid "list out all things I")
When David asks for a recurring disposition ("every 14 days", "every 4 days"),
set it through due_string, NOT a separate field. Combine recurrence + start
date in one string:
"due_string":"every 14 days starting Monday" -> recurs, first due Monday"due_string":"every 10 days starting today" -> recurs, first due today"due_string":"every 4 days starting today" -> recurs from todayVerify the response body's .due.string echoes the recurrence and .due.date
is the correct first occurrence. This is part of a compound action - set
priority/labels/due_string before the move.
API priority is inverted vs UI. Always convert:
API priority | UI Label | Meaning |
|---|---|---|
| 4 | P1 | Highest (red) |
| 3 | P2 | High (orange) |
| 2 | P3 | Medium (blue) |
| 1 | P4 | Lowest (no color) |
Before presenting ANY batch: Verify the API value matches the UI label.
David frequently sets recurring reminders during triage. Set recurrence via the
due_string field on the update call:
"due_string":"every 4 days starting today" -> first occurrence today"due_string":"every 14 days starting Monday" -> first occurrence next Monday"due_string":"every 6 days" -> Todoist defaults first occurrence to todayWhen David says "every N days, due date today" he means recurrence every N days,
first occurrence today -> "every N days starting today".
When a task is moved to a different project, Todoist assigns a new task ID.
Match by content (task text), not by id.
Execution order for compound actions: Always update priority and due date before moving. The move changes the task ID, so later updates using the old ID will silently fail.
When David asks to auto-categorize remaining Inbox tasks between main projects,
tasks prefixed with a team member's name (e.g. assistant -- ...) are not candidates
for self-categorization - they belong delegated to that person's project. If
David's stated task count does not match the actual Inbox count, the diff is
usually team-prefixed tasks.
Name-only-not-prefixed tasks (e.g. "assistant errand") are different. They are not a team-prefixed delegation pattern. If David scopes categorization to Personal/Business/Wisdom only, ask: "Assistant's project, or Personal?"
ALWAYS re-fetch task IDs immediately before any delete/move/update operation. Never reuse IDs from an earlier fetch - they go stale when tasks are moved or recreated. The API returns 204 on already-deleted IDs with no error, so stale IDs fail silently.
If a compound-action run gets interrupted mid-batch, do not re-execute the whole list.
This avoids double-moving, duplicate creates, or silently leaving the half-finished task in the wrong state.
Uses the todoist skill for all API operations. Key endpoints:
DELETE /api/v1/tasks/{id}POST /api/v1/tasks/{id}/closePOST /api/v1/tasks/{id}/move with {"project_id": "TARGET_ID"}POST /api/v1/tasks/{id} with {"priority": API_VALUE}{"due_string": ""}), then delete.project_id.Auth: $TODOIST_API_TOKEN from .env file. Always source .env first.