Features

Advanced Features

Attachments, custom fields, batch operations, and search with Asana CLI

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.

tasks.json
[
  { "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.

tasks.csv
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.

task-ids.txt
# tasks to remove
1201234567890123
1201234567890124
bun run dev task batch-delete --file task-ids.txt --yes

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