Task CLI (Type-Safe)
Type-safe CLI for task management using tRPC with end-to-end type safety.
Service: Task Service at http://localhost:3004
Script: .claude/skills/task-cli/scripts/task-cli.sh
Benefits Over Old Scripts
- •End-to-end type safety — tRPC client shares types with the server
- •No curl commands — type-safe function calls instead of HTTP
- •Concise output — optimised for AI parsing
- •Batch operations — update/complete multiple items at once
- •Auto-complete — TypeScript knows all valid fields and values
Date Concepts
The system has two ways to surface tasks at the right time:
| Concept | Purpose | Use When |
|---|---|---|
| Due Date | Hard deadline | Task must be done by this date |
| Check-ins | Periodic reviews | Long-running task needs regular touch-points |
Due Date (--due)
A deadline. Task becomes overdue if not completed by this date. Use for:
- •Tasks with actual deadlines ("Submit report by Friday")
- •Meeting prep ("Prep agenda before 2pm meeting")
Accepted formats:
- •
2026-01-28— ISO date (YYYY-MM-DD) - •
today,tod— today's date - •
tomorrow,tom— tomorrow's date - •
monday,tue, etc. — next occurrence of that weekday - •
+3d— 3 days from today (works with any number) - •
none— clear due date (update only)
Check-ins
Scheduled dates to review progress on a task. A task can have multiple check-ins. When a check-in date arrives, the task appears in tcli checkins. Completing a check-in doesn't complete the task. Use for:
- •Long-running projects ("Check vendor status every Tuesday")
- •Delegated work ("Follow up with James on Friday")
- •Monitoring items ("Check analytics weekly")
- •Soft reminders ("Revisit this idea in mid-January")
Key difference: A task has one due date, but can have many check-ins. Use check-ins for soft reminders without deadlines.
Organization-Level Tasks (General Projects)
Each organization has a _general project for tasks not tied to a specific initiative. The underscore prefix sorts it to the top in file listings.
# Create org-level task - must specify org since _general exists in multiple orgs tcli create task "General admin work" --project acme-corp/_general tcli create task "ExOrg admin" --project example-org/_general # Create project-specific task (always use org/slug format) tcli create task "Update nuclear tracker" --project acme-corp/analytics-dashboard tcli create task "Website update" --project acme-corp/website
When to use _general:
- •Administrative tasks for the org
- •Tasks spanning multiple projects
- •Quick items not tied to a specific initiative
- •Inbox-style tasks to triage later
When to use a specific project:
- •Work on a defined initiative
- •Tasks with clear project scope
Disambiguating projects: Use org/project syntax when a project slug exists in multiple orgs.
Important Workflows
Creating Tasks from Meetings
ALWAYS use tcli sync meeting <path> to create tasks from meeting actions.
This command:
- •Automatically links tasks to source meeting
- •Sets owner from the Actions table
- •Assigns project from meeting frontmatter
NEVER manually create tasks for meeting actions — they won't be linked to the meeting and will lack source tracking.
# Correct: Sync meeting actions to tasks tcli sync meeting acme-corp/meetings/2026/01/2026-01-28-standup.md # Wrong: Creating tasks manually loses meeting link tcli create task "Review budget" # ❌ No meeting link
Note: There's no way to retroactively link an existing task to a meeting. If you accidentally created a task manually, delete it and re-sync the meeting.
Before Creating Tasks
Always verify project slug exists before using it:
tcli projects | grep -i <keyword>
The --project flag always requires the fully qualified org/slug format:
- •✅
--project acme-corp/kw-web(org/slug) - •❌
--project kw-web(missing org — will be rejected) - •❌
--project knowledge-work-web(display name — won't work)
Quick Reference
# Alias for convenience alias tcli='.claude/skills/task-cli/scripts/task-cli.sh' # ───────────────────────────────────────────────────────────── # QUERYING # ───────────────────────────────────────────────────────────── # List items tcli list # All pending items tcli list --owner Alice # Filtered by owner tcli list --project acme-corp/grid-management # Filtered by project tcli list --due today # Due today tcli list --type workstream # Only workstreams tcli list --status pending,in_progress # Multiple statuses # Query shortcuts tcli today # Items due today tcli overdue # Overdue items (past due date) tcli checkins # Items with check-ins due tcli waiting # Items waiting on others tcli blocked # Blocked items with blocker info tcli priority # High priority items (P1, P2) tcli stats # Summary statistics/dashboard # Get details tcli get T-42 # Full item details tcli get T-42,T-43,T-44 # Batch get (compact list) tcli history T-42 # Activity history for item tcli subtasks T-42 # Show subtasks # Search tcli search "nuclear" # Search by title # Activity feed tcli activity # Recent activity (last 30) tcli activity --limit 50 # More activity tcli activity --since 2026-01-20 # Activity since date # ───────────────────────────────────────────────────────────── # CREATING & UPDATING # ───────────────────────────────────────────────────────────── # Create items tcli create task "Task title" --owner Alice --priority 2 tcli create task "Blocked task" --blocked-by T-100,T-101 tcli create workstream "Workstream name" --project acme-corp/energy tcli create goal "Q1 Goal" --target 2026-Q1 # Update items tcli update T-42 --status complete # Update status tcli update T-42 --priority 1 # Update priority tcli update T-42 --due 2026-02-15 # Set due date tcli update T-42 --due none # Clear due date tcli update T-42 --owner James # Change owner tcli update T-42 --project acme-corp/nuclear # Move to project tcli update T-42,T-43,T-44 --status complete # Batch update # Complete items (shorthand) tcli complete T-42 # Mark complete tcli complete T-42,T-43 # Batch complete # Delete/restore tcli delete T-42 # Soft delete tcli delete T-42,T-43 # Batch delete tcli restore T-42 # Restore deleted item # Add notes tcli note T-42 "Made progress on draft" # Add note tcli note T-42 "Blocked on approval" --type blocker # Blocker note # ───────────────────────────────────────────────────────────── # CHECK-INS (Soft Reminders) # ───────────────────────────────────────────────────────────── # NOTE: Check-ins are SEPARATE from due dates. Use check-ins for # soft reminders/review dates. Use --due for hard deadlines. # The update command does NOT have a --checkin option. tcli checkin-add T-42 2026-01-25 # Add check-in (date is POSITIONAL) tcli checkin-add T-42 2026-02-01 --note "Follow up on proposal" tcli checkin-list T-42 # List check-ins for task tcli checkin-list T-42 --include-completed # Include completed tcli checkin-complete T-42 # Complete next pending check-in tcli checkin-complete T-42 --checkin-id 5 # Complete specific one tcli checkin-complete T-42 --clear # Complete all pending tcli checkin-delete 123 # Delete check-in by ID # ───────────────────────────────────────────────────────────── # BLOCKING & LINKS # ───────────────────────────────────────────────────────────── tcli update T-101 --blocked-by T-100 # Block by task (sets status + adds blocker) tcli update T-101 --blocked-by T-100,T-200 # Block by multiple tasks tcli update T-101 --add-blocker T-200 # Add another blocker tcli update T-101 --remove-blocker T-100 # Remove blocker tcli blocked # List all blocked tasks # General links (not blocking) tcli link-add T-100 blocks T-101 # Create blocking link tcli link-add T-100 related T-101 # Create related link tcli link-remove T-100 blocks T-101 # Remove link tcli links T-100 # View all links for task # ───────────────────────────────────────────────────────────── # PEOPLE # ───────────────────────────────────────────────────────────── tcli people # List all people with task counts tcli people Alice # Show tasks for specific person tcli people-create "Jane Doe" --org acme-corp --email jane@example.com tcli people-update "Jane Doe" --new-name "Jane Smith" tcli people-delete "Jane Doe" # Item-person roles tcli person-add T-42 "James" waiting_on # Add waiting_on role tcli person-add T-42 "Sarah" reviewer # Add reviewer tcli person-remove T-42 "James" waiting_on # Remove role tcli item-people T-42 # Show all people on item # ───────────────────────────────────────────────────────────── # TAGS # ───────────────────────────────────────────────────────────── tcli tags list # List all tags tcli tags get "urgent" # Get tag details with items tcli tags create "urgent" --color red # Create tag tcli tags update 1 --name "critical" # Update tag tcli tags delete 1 # Delete tag tcli tag-add T-42 "urgent" # Add tag to item tcli tag-remove T-42 "urgent" # Remove tag from item tcli item-tags T-42 # Show tags on item # ───────────────────────────────────────────────────────────── # ROUTINES # ───────────────────────────────────────────────────────────── tcli routines due # Today's routines tcli routines due --date 2026-01-20 # Routines for specific date tcli routines overdue # Overdue routines tcli routines list # All routine templates tcli routines get 51 # Routine details with history tcli routines complete 51 # Complete routine for today tcli routines complete 51 --date 2026-01-15 # Complete for specific date tcli routines skip 51 # Skip routine for today tcli routines skip 51 --notes "Holiday" # Skip with reason tcli routines skip-all-overdue 51 # Skip all overdue instances tcli routines uncomplete 51 # Undo completion tcli routines unskip 51 # Undo skip tcli routines create "Daily standup" --rule daily --time 09:00 tcli routines update 51 --title "New title" tcli routines delete 51 # Delete routine # ───────────────────────────────────────────────────────────── # PROJECTS & ORGANIZATIONS # ───────────────────────────────────────────────────────────── tcli projects # List all projects tcli projects --org example-org # Filter by org tcli projects grid-management # Get project details tcli projects-create energy-policy "Energy Policy" --org example-org tcli projects-update energy-policy --status active tcli projects-delete old-project # Delete project tcli orgs # List all organizations tcli orgs acme-corp # Get organization details tcli orgs-create newclient "New Client" --short-name NC tcli orgs-update newclient --name "Updated Name" tcli orgs-delete newclient # Delete (fails if referenced) # ───────────────────────────────────────────────────────────── # SPECIALIZED QUERIES # ───────────────────────────────────────────────────────────── tcli goals # List all goals tcli goals --org acme-corp # Goals for org tcli workstreams # List workstreams tcli workstreams --status active # Filter by status # ───────────────────────────────────────────────────────────── # SYNC OPERATIONS # ───────────────────────────────────────────────────────────── tcli sync meeting-preview path/to/meeting.md # Preview meeting sync tcli sync meeting path/to/meeting.md # Sync meeting actions to DB tcli sync meeting path/to/meeting.md --dry-run # Preview without changes tcli sync filesystem-preview # Preview workstream files tcli sync filesystem # Sync all workstream files tcli sync file path/to/workstream/README.md # Sync specific file tcli sync file path/to/file.md --force # Force sync tcli sync item T-42 # Push DB changes to file tcli sync conflicts # List sync conflicts tcli sync resolve T-42 file # Resolve conflict (file wins) tcli sync resolve T-42 database # Resolve conflict (DB wins)
Output Format
The CLI produces concise, tabular output optimised for AI parsing:
$ tcli list --due today T-1187 pending p1 Alice Prepare SV USA stakeholder list due:today T-1188 pending p1 James Croydon SPD images due:today T-1117 pending p2 Alice YA website redesign scoping due:today ──────────────────────────────────────────────────────────────────────────── 3 items | 0 overdue | 2 high priority
Column format:
- •ID (T-xxxx)
- •Status (pending, in_prog, complete, blocked)
- •Priority (p1-p4 or blank)
- •Owner (first name, 10 chars max)
- •Title (40 chars max)
- •Due date indicator
Due indicators:
- •
due:today— due today - •
due:tmrw— due tomorrow - •
due:3d— due in 3 days - •
due:15 Jan— due on specific date - •
OVERDUE:2d— 2 days overdue
Commands
list
List items with optional filters.
tcli list [options] Options: --type TYPE Item type (task, workstream, goal, routine) --project ORG/SLUG Project (requires org/slug format, e.g. myorg/website) --owner NAME Owner name (partial match) --due DATE Due date filter (today, tomorrow, this-week, YYYY-MM-DD) --status STATUS Status filter (comma-separated: pending,in_progress,blocked) --limit N Max results
⚠️ COMMON MISTAKES — read carefully:
- •
NO
--due-beforeor--due-afterflags. These DO NOT EXIST. Use--duewith a single value:- •
--due today— due today - •
--due this-week— due this week - •
--due 2026-02-01— due on that exact date - •For range queries, use
tcli overdueor filter results after fetching
- •
- •
Statuses must be comma-separated in ONE flag, not repeated:
- •✅
--status pending,in_progress,blocked - •❌
--status pending --status in_progress --status blocked
- •✅
- •
No range queries. The
--dueflag is a single-value filter, not a range. To find tasks due in a week, use--due this-week.
activity
Show recent activity feed (status changes, completions, notes added). Essential for understanding what has happened in the task system.
tcli activity # Recent activity (last 30) tcli activity --limit 50 # Show more tcli activity --since 2026-01-20 # Activity since date
Output format:
Recent Activity (15 items) ────────────────────────────────────────────────────────────────────── 22 Jan 14:30 T-1234 pending → complete Review budget document [Grid Management] 22 Jan 12:15 T-1235 created Prepare presentation slides [Nuclear] 22 Jan 10:00 T-1200 note: Made progress Long-running project [YA Management]
Use cases:
- •Daily summary: See what was accomplished today
- •End of day: Review progress and changes made
- •Morning review: Catch up on what happened since last session
- •Audit trail: Understand when and how tasks changed
today
Show items due today.
tcli today
overdue
Show all overdue items.
tcli overdue
get
Get details for one or more items. Accepts comma-separated IDs for batch queries.
tcli get T-42 # Full details for single item tcli get T-42,T-43,T-44 # Compact list view for multiple items
Single ID returns full detail view. Multiple IDs return compact list view (same format as tcli list). Missing IDs are silently skipped in batch mode.
create
Create a new item.
tcli create TYPE "title" [options] Types: task, workstream, goal Options: --owner NAME Owner name --project ORG/SLUG Project (requires org/slug format, e.g. myorg/website) --due DATE Due date (today, tomorrow, +3d, monday, YYYY-MM-DD) --target PERIOD Target period for goals (e.g., 2026-Q1, 2026-01) --priority N Priority (1-4) --description TXT Description --parent ID Parent item ID (for subtasks) --blocked-by IDS Comma-separated IDs of blocking items (creates task as blocked)
Default owner: Tasks should be assigned to the main user by default (check .claude/context/background.md for their name). Only assign to someone else when explicitly indicated:
- •"John to do X" → assign to John
- •"Ask Sarah to X" → assign to Sarah
- •"Review the document" → assign to main user (default)
Note: To set a soft reminder/review date, create the task first, then use checkin-add.
update
Update one or more items. Supports comma-separated IDs for batch updates.
tcli update ID [options] tcli update T-42,T-43,T-44 --status complete Options: --status STATUS New status (pending, in_progress, complete, blocked, cancelled, deferred, active, paused) --priority N New priority (1-4) --due DATE New due date (today, tomorrow, +3d, monday, YYYY-MM-DD, or "none" to clear) --target PERIOD Target period (e.g., 2026-Q1) --title TEXT New title --description TEXT New description --owner NAME New owner --project ORG/SLUG Move to project (requires org/slug format) --parent ID Set parent item (for subtasks) --blocked-by IDS Set blockers (comma-separated, also sets status to blocked) --add-blocker IDS Add blockers without clearing existing ones --remove-blocker IDS Remove specific blockers
Clearing due date: Use --due none to remove a due date:
tcli update T-42 --due none # Clear due date
Setting soft reminders: The update command does NOT have a --checkin or --attention option. Use checkin-add instead:
tcli checkin-add T-42 2026-02-10 # Add soft reminder for Feb 10
complete
Shorthand for update --status complete.
tcli complete T-42 tcli complete T-42,T-43,T-44
people
List people or show tasks for a specific person.
tcli people # List all people with task counts tcli people Alice # Show tasks for Alice tcli people --org acme-corp # Filter by organization
people-create / people-update / people-delete
Manage people records.
tcli people-create "Jane Doe" --org acme-corp --email jane@example.com --notes "Board member" tcli people-update "Jane Doe" --new-name "Jane Smith" --email new@example.com tcli people-delete "Jane Doe"
person-add / person-remove / item-people
Manage people roles on items (assignee, waiting_on, stakeholder, reviewer, cc).
tcli person-add T-42 "James" waiting_on # Mark waiting on James tcli person-add T-42 "Sarah" reviewer # Add as reviewer tcli person-remove T-42 "James" waiting_on # Remove the role tcli item-people T-42 # Show all people on item
delete / restore
Soft delete and restore items.
tcli delete T-42 # Soft delete single item tcli delete T-42,T-43,T-44 # Batch delete tcli restore T-42 # Restore deleted item
note
Add notes or updates to items.
tcli note T-42 "Made progress on draft" # Add a note tcli note T-42 "Blocked on approval" --type blocker # Blocker note tcli note T-42 "50% complete" --type progress # Progress note
history
Show activity history for an item.
tcli history T-42
Output shows all status changes, notes, and updates with timestamps.
subtasks
Show subtasks for an item.
tcli subtasks T-42
waiting
Show items waiting on others (items with waiting_on person roles).
tcli waiting
priority / high
Show high priority items (P1 and P2).
tcli priority # All P1 and P2 items tcli high # Alias for priority tcli priority --owner Alice # Filter by owner tcli priority --limit 10 # Limit results
stats / dashboard
Show summary statistics.
tcli stats # Summary dashboard tcli dashboard # Alias for stats tcli stats --owner Alice # Filter by owner
Output includes: total active, overdue, due today, high priority, blocked counts.
goals
List goals.
tcli goals # All goals tcli goals --project energy # Filter by project tcli goals --target 2026-Q1 # Filter by target period
workstreams
List workstreams.
tcli workstreams # All workstreams tcli workstreams --project energy # Filter by project tcli workstreams --status active # Filter by status
tags
Manage tags.
tcli tags list # List all tags tcli tags list --search "urgent" # Search tags tcli tags get "urgent" # Get tag with items tcli tags get 1 # Get tag by ID tcli tags create "urgent" --color red --description "Needs immediate attention" tcli tags update 1 --name "critical" --color orange tcli tags delete 1
tag-add / tag-remove / item-tags
Manage tags on items.
tcli tag-add T-42 "urgent" # Add tag to item tcli tag-remove T-42 "urgent" # Remove tag from item tcli item-tags T-42 # Show all tags on item
search
Search items by title.
tcli search "nuclear"
checkins
Show tasks where a check-in date has arrived. These are tasks you've scheduled to review.
tcli checkins # Items with check-ins due today or earlier
Check-in Management
Check-ins are scheduled review dates for tasks. Use them for long-running tasks that need periodic attention.
# Add a check-in tcli checkin-add T-42 2026-01-25 # Check on Jan 25 tcli checkin-add T-42 2026-02-01 --note "Follow up" # With note # List check-ins for a task tcli checkin-list T-42 # Pending check-ins tcli checkin-list T-42 --include-completed # All check-ins # Complete a check-in (marks check-in done, NOT the task) tcli checkin-complete T-42 # Complete next pending check-in tcli checkin-complete T-42 --checkin-id 5 # Complete specific check-in tcli checkin-complete T-42 --clear # Complete all pending check-ins # Delete a check-in tcli checkin-delete 123 # Delete by check-in ID
Example workflow for delegated task:
# Create task for someone else to do tcli create task "James to review proposal" --owner James --due 2026-01-31 # Schedule check-ins to follow up tcli checkin-add T-42 2026-01-22 --note "First follow-up" tcli checkin-add T-42 2026-01-28 --note "Final check before deadline" # When check-in date arrives, task appears in: tcli checkins # After following up, complete the check-in (task stays open) tcli checkin-complete T-42
Task Blocking (Many-to-Many)
Tasks can be blocked by multiple other tasks. The blocking system uses ItemLink for many-to-many relationships.
Setting blockers with --blocked-by:
# Mark T-101 as blocked by T-100 (sets status + adds blocker) tcli update T-101 --blocked-by T-100 # Block by multiple tasks at once (comma-separated) tcli update T-101 --blocked-by T-100,T-200
This sets the status to blocked AND records all blockers. The task will show in tcli blocked with blocker info.
Adding/removing individual blockers:
# Add another blocker to an already-blocked task tcli update T-101 --add-blocker T-300 # Remove a specific blocker tcli update T-101 --remove-blocker T-100
Auto-unblock behavior: When a blocking task is completed, the system checks if the blocked task has remaining blockers:
- •If no remaining blockers → status automatically changes to
pending - •If other blockers remain → status stays
blocked
Alternative — use link-add for general relationships:
tcli link-add T-100 blocks T-101 # Creates relationship link tcli link-add T-100 related T-101 # Related but not blocking tcli link-remove T-100 blocks T-101 # Remove a link tcli links T-100 # View all links for a task
Note: link-add creates a relationship but doesn't automatically set status to blocked. Use --blocked-by for actual blocking dependencies.
When to use blocking:
- •Sequential tasks from a meeting (research → draft → review)
- •Prerequisites (proposal must be approved before implementation)
- •Dependencies (API change blocks frontend work)
- •Multiple prerequisites: task requires 2+ things to complete first
Important: Don't write "(blocked by X)" in task titles — use --blocked-by to create proper relationships that the system can track.
routines
Manage recurring routines (daily reviews, weekly updates, etc).
tcli routines due # Today's routines (pending + completed) tcli routines due --date 2026-01-20 # Routines for specific date tcli routines overdue # Overdue routines with missed dates tcli routines list # All routine templates tcli routines complete 51 # Complete routine #51 for today tcli routines complete 51 --date 2026-01-15 # Complete for specific date tcli routines skip 51 # Skip routine for today tcli routines skip 51 --notes "Holiday" # Skip with reason tcli routines skip-all-overdue 51 # Skip all overdue instances
Routines output:
Routines for 2026-01-16
────────────────────────────────────────────────────────────
Pending (2):
51 p1 Morning Review [Personal]
52 Weekly Grid Update [Grid Management]
Completed (1):
53 ✓ End of Day Summary
projects
List projects or get project details.
tcli projects # List all projects tcli projects --org example-org # Filter by org tcli projects grid-management # Get project details
organizations
Manage organizations (workstreams/clients like Acme Corp, ExOrg, etc.).
Organizations are now stored in the database rather than as a fixed enum, allowing new organizations to be added dynamically.
# List all organizations tcli orgs # Get organization details (includes project/people counts) tcli orgs acme-corp # Create a new organization tcli orgs-create newclient "New Client Name" --short-name NC --description "Description" # Update an organization tcli orgs-update newclient --name "Updated Name" tcli orgs-update newclient --short-name "" # Clear short name # Delete an organization (fails if projects/people reference it) tcli orgs-delete newclient
Output example:
$ tcli orgs 6 organizations ──────────────────────────────────────────────────────────── example-org Centre for Example Org (ExOrg) consulting Consulting external External other Other personal Personal acme-corp Acme Corp (YA) $ tcli orgs acme-corp Acme Corp (acme-corp) ──────────────────────────────────────── Short name: YA Projects: 7 People: 4 Created: 2026-01-19
sync
Sync operations for meetings and workstream files.
Meeting Sync
Sync actions from meeting markdown files to the task database.
# Preview what would be synced tcli sync meeting-preview acme-corp/meetings/2026/01/2026-01-15-meeting.md # Actually sync the actions (creates tasks) tcli sync meeting acme-corp/meetings/2026/01/2026-01-15-meeting.md # Dry run (preview without making changes) tcli sync meeting path/to/meeting.md --dry-run
Meeting preview output:
Meeting: YA Strategy Meeting
Path: acme-corp/meetings/2026/01/2026-01-15-meeting.md
Date: 2026-01-15
Attendees: Alice, John, Julia
Primary Project: ya-management
────────────────────────────────────────────────────────────
4 actions found
Would create: 3
Would skip: 1
Actions:
+ CREATE: Schedule 6-month check-in
Owner: Alice, Due: 2026-01-20, Status: Pending
+ CREATE: Finalise goals document
Owner: James, Due: -, Status: Pending
○ SKIP: Review budget (T-1234)
Owner: Julia, Due: -, Status: Complete
Filesystem Sync
Bidirectional sync between workstream markdown files and the database.
# Preview workstream files found in filesystem tcli sync filesystem-preview # Sync all workstream files to database tcli sync filesystem # Sync a specific file to database tcli sync file example-org/projects/energy/nuclear.md # Force sync (overrides conflict detection) tcli sync file path/to/file.md --force # Push database changes to a workstream file tcli sync item T-42 # Force push (overrides conflict detection) tcli sync item T-42 --force
Conflict Management
When both file and database have changed since the last sync, a conflict is detected.
# List all conflicts tcli sync conflicts # Resolve a conflict (choose winner) tcli sync resolve T-42 file # File version wins tcli sync resolve T-42 database # Database version wins
Conflict output:
3 conflicts ──────────────────────────────────────────────────────────── T-1234: example-org/projects/energy/nuclear.md Reason: Both file and database modified since last sync File hash: abc12345... DB hash: def67890...
AI Confirmation Workflow
When processing batch updates (from quick notes, meeting processing, or user context), the AI proposes changes and asks for confirmation before executing.
How It Works
AI processes input (quick note / context)
↓
AI identifies proposed changes
↓
AI uses AskUserQuestion to present proposals
↓
User approves/rejects via tool options
↓
AI executes only approved actions
Smart Task Detection
Many phrases indicate follow-ups on existing work rather than new tasks. These should add check-ins to existing tasks instead of creating duplicates.
What is a check-in? A check-in is a soft reminder date attached to a task. Unlike due dates (hard deadlines), check-ins are "revisit this around X" prompts. A task can have multiple check-ins. When the check-in date arrives, the task appears in tcli checkins. Completing a check-in marks the reminder done but keeps the task open.
Check-ins are for the main user. Check-ins are reminders for YOU to follow up - they don't need an owner specified. The task itself may be owned by someone else (e.g., "John to review document"), but the check-in is your reminder to chase John.
Common use cases for check-ins:
- •Delegated work: "Check in with John next week" → add check-in to John's task (reminder for you to chase him)
- •Long-running projects: Weekly review dates
- •Waiting on others: Reminder to chase
Detection patterns:
| Pattern | Action |
|---|---|
| "Check in with Y" | Search for task owned by Y, propose check-in |
| "Discuss X with Y" | Search for task about X, propose check-in |
| "Follow up on X" | Search for task about X, propose check-in |
| "Waiting on Y for X" | Search for task about X, add waiting_on |
| "Chase Y about X" | Search for task, propose check-in |
| "Call scheduled with Y" | NOT a new task — add check-in to existing project task for the call date |
| "Meeting booked for X" | NOT a new task — it's a calendar event. Add check-in if follow-up needed |
Calendar events are NOT tasks. A scheduled call or meeting is a calendar event, not an actionable task. Do not create tasks like "Call with X" or "Meeting with Y". Instead, add a check-in to the relevant existing project task for that date, so you're reminded to prepare or follow up.
Workflow for "Check in with John":
- •Search:
tcli list --owner John - •Present John's pending tasks to user
- •User selects which task to add check-in to
- •Execute:
tcli checkin-add T-XX YYYY-MM-DD --note "Check in with John"
Confirmation Prompt Format
The AI presents proposals in a structured format:
{
"questions": [{
"question": "Confirm these task changes?",
"header": "Task updates",
"options": [
{"label": "Create: Review Q1 budget", "description": "New task, P2, due Friday"},
{"label": "Check-in on T-42", "description": "Add check-in to existing task"},
{"label": "Skip all", "description": "Don't make any changes"}
],
"multiSelect": true
}]
}
Prompt Templates
All AI prompts for quick notes and batch updates are defined in:
packages/web/src/prompts/
These templates include confirmation instructions, task pattern detection, and type-specific processing rules.
Focus Tracking
Track daily focus ratings and view trends.
# Record focus rating for today tcli focus --user 4 --ai 3 --notes "Productive morning, distracted afternoon" # Record with date tcli focus --date 2026-01-27 --user 3 --ai 3 # View today's focus entry tcli focus # View specific date tcli focus --date 2026-01-25 # List recent focus entries tcli focus-list # Last 30 entries tcli focus-list --week # Last 7 days tcli focus-list --month 2026-01 # Specific month tcli focus-list --limit 10 # Limit results # View summary and trends tcli focus-summary # Last month tcli focus-summary --period week # Last week tcli focus-summary --period all # All time
Rating scale:
- •1: Very distracted, little progress
- •2: Struggled to focus, some progress
- •3: Mixed focus, moderate progress
- •4: Good focus, solid progress
- •5: Excellent focus, highly productive
Output format:
Focus entries (7) ────────────────────────────────────────────────────────── Date User AI Notes ────────────────────────────────────────────────────────── 2026-01-28 4/5 3/5 Productive morning 2026-01-27 3/5 3/5 Distracted by meetings
Architecture
┌─────────────────────────────────────────────────────────────┐
│ @kw/api-types │
│ (Zod schemas + inferred TypeScript types) │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────┼──────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌──────────┐ ┌────────────────┐
│ task-service │ │ Next.js │ │ task-cli │
│ (tRPC server)│ │ (tRPC │ │ (tRPC client) │
│ │ │ client) │ │ │
└───────────────┘ └──────────┘ └────────────────┘
Installation
The CLI uses tsx to run TypeScript directly. Install dependencies:
cd .claude/skills/task-cli && npm install
Then use via the wrapper script:
.claude/skills/task-cli/scripts/task-cli.sh list
Or add an alias:
alias tcli='.claude/skills/task-cli/scripts/task-cli.sh'