asana-cli is an unofficial Asana CLI for terminals, scripts, and CI, built on
rungrad. Commands print text tables for
people, stable --json for programs, --dry-run previews before supported
changes, confirmation before destructive actions, and predictable errors for
non-interactive use.
Use it to inspect and manage Asana workspaces, projects, sections, tasks, users, teams, tags, attachments, custom fields, goals, and portfolios from the shell.
asana-cli is not affiliated with, endorsed by, or sponsored by Asana, Inc.
- Text tables by default and stable
--jsonfor automation. - Copy-safe
--plain,--jq, and Go-template output modes through rungrad. --dry-runpreviews for supported write commands before any mutation happens.- Confirmation gates for destructive delete/remove commands.
- Name-to-GID resolution with deterministic non-interactive errors.
- A hidden
__rungrad_manifestcommand and conformance-tested CLI behavior. - Self-update checks with
asana update --check.
Website · Getting started and command reference
macOS and Linux users can install the latest checksummed release binary with:
curl -fsSL https://raw.githubusercontent.com/vincentsch/asana-cli/main/install.sh | bashOr build the current release with Go 1.22.2 or newer:
go install github.com/vincentsch/asana-cli/cmd/asana@v0.1.2Release binaries are named asana-<os>-<arch> and are published for Linux,
macOS, and Windows on amd64 and arm64.
Create a Personal Access Token in Asana:
https://app.asana.com/0/my-apps
Then store it locally:
asana loginFor scripts or temporary sessions, ASANA_TOKEN overrides the saved config:
export ASANA_TOKEN="0/your-token"
asana workspace listThe config file stays in the platform config directory under
asana/config.json, for example ~/.config/asana/config.json on Linux.
# Workspaces, users, and teams
asana workspace list
asana user me
asana team list --workspace "Company"
# Projects and sections
asana project list --workspace "Company"
asana project view "Launch Plan"
asana section list --project "Launch Plan"
# Tasks
asana task list --project "Launch Plan"
asana task view 1234567890123456
asana task create "Review launch checklist" --project "Launch Plan" --assignee me
asana task done 1234567890123456
# Preview writes and require explicit destructive confirmation
asana task update 1234567890123456 --name "Updated title" --dry-run
asana task delete 1234567890123456 --dry-run
asana task delete 1234567890123456 --confirmEvery command has examples and related commands in --help:
asana --help
asana task --help
asana task create --helpUse --json for stable machine output:
asana task list --project "Launch Plan" --jsonThe same result model powers advanced output modes:
asana project list --workspace-gid 123 --plain
asana task list --project-gid 456 --jq '.[].gid'
asana task view 789 --template '{{.name}}'API-backed commands can include safe request metadata:
asana workspace list --include-meta --jsonMetadata is opt-in and contains diagnostics such as endpoint path, request IDs, pagination state, retry attempts, and allowlisted rate-limit headers. It does not include credentials.
Generated command pages live under manual/commands/.
go test ./...
go vet ./...
make docs-check
make conformancemake conformance builds and scores the CLI against rungrad-spec/1 with local
mock fixtures. It does not need a live Asana token and does not make mutation
requests.
The CLI is pre-1.0. Command names and JSON shapes are intended to be stable, but there may still be compatibility changes before a stable release.
MIT