Advanced Features
Advanced Features
Power user features: file attachments, custom fields, batch operations from JSON/CSV files, and workspace-wide search.
Attachments
Upload a File
bun run dev task attach TASK_ID ./document.pdf
Files are streamed from disk, so large attachments (up to Asana's 100 MB limit) do not need to fit in memory.
List Attachments
bun run dev task attachment list TASK_ID
Output includes the attachment GID, name, type, size, and creation time.
Download an Attachment
# Saved under the attachment's original name
bun run dev task attachment download ATTACHMENT_ID
# Custom output path; --force overwrites an existing file
bun run dev task attachment download ATTACHMENT_ID --output ./downloaded.pdf --force
External attachments (e.g. Google Drive links) have no download URL and are reported as not downloadable.
Custom Fields
List Workspace Custom Fields
bun run dev custom-field list --workspace WORKSPACE_ID
Omit --workspace to use your configured default workspace.
List Custom Field Values on a Task
bun run dev task custom-field list TASK_ID
Set a Custom Field Value
# Text field
bun run dev task custom-field set TASK_ID FIELD_ID "Quarterly review"
# Number field — value is validated as a number
bun run dev task custom-field set TASK_ID FIELD_ID "42.5"
# Enum field — accepts the option name (case-insensitive) or option GID
bun run dev task custom-field set TASK_ID FIELD_ID "High"
The CLI fetches the field definition first and coerces the value to the type
the API expects. Supported types: text, number, enum.
Batch Operations
All batch commands run up to 5 API calls concurrently, show progress on stderr, and report per-item failures without aborting the whole batch. The exit code is non-zero if any item failed.
Batch Update (JSON)
Each entry needs a gid; all other keys are passed to the update API.
[
{ "gid": "1201234567890123", "completed": true },
{ "gid": "1201234567890124", "name": "Renamed task", "due_on": "2026-07-01" }
]
bun run dev task batch-update --file tasks.json
Batch Create (JSON or CSV)
CSV files need a header row; empty cells are skipped. A project column adds
the task to that project.
name,notes,due_on,project
Write launch post,Draft for review,2026-07-01,1209876543210987
Prepare demo,,2026-07-03,
bun run dev task batch-create --file tasks.csv --workspace WORKSPACE_ID
bun run dev task batch-create --file tasks.json
Batch Delete (text file)
One task GID per line; blank lines and # comments are ignored. Deletion is
confirmed interactively unless --yes is passed.
# tasks to remove
1201234567890123
1201234567890124
bun run dev task batch-delete --file task-ids.txt --yes
Search
Search Tasks
Full-text search on task names and descriptions. Requires a premium Asana
workspace (the API returns 402 Payment Required otherwise).
bun run dev search tasks "quarterly goals" --workspace WORKSPACE_ID
# Filters
bun run dev search tasks "bug" --completed false --assignee USER_ID --limit 50
Asana's search API does not support stable offset pagination; use --limit
(1–100, default 20) to control the page size.
Search Projects
Project search uses Asana's typeahead API, which returns the most relevant matches quickly.
bun run dev search projects "Q1" --workspace WORKSPACE_ID