asanalisted
Install: claude install-skill dversoza/claude-skills
# Asana
Task CRUD against the Asana REST API through the installed `asana` CLI. Every
subcommand prints JSON to stdout; errors print `{"error": ...}` to stderr and
exit non-zero. There is intentionally no delete: only list, get, create, update
(completing a task is an update).
## Setup
The CLI installs as a `uv` tool and exposes an `asana` command:
```bash
uv tool install ~/.claude/skills/asana/cli # or --force to reinstall after edits
asana setup --token <PERSONAL_ACCESS_TOKEN> # optionally --workspace <GID>
```
Create a Personal Access Token at https://app.asana.com/0/my-apps. If the token
lives in 1Password, source it without exposing it in shell history:
```bash
asana setup --token "$(op read -n 'op://<vault>/<item>/token')"
```
`setup` writes the token to `~/.config/asana-cli/config.env` (mode `0600`) and
verifies it by calling `/users/me`. Confirm auth anytime with `asana whoami`.
Token resolution order (first hit wins): `ASANA_ACCESS_TOKEN` env var, then the
config file. So a token exported in the shell (e.g. from `.zshrc`) overrides the
stored one.
If `asana: command not found`, the uv tool bin dir is not on `PATH`; run
`uv tool install ~/.claude/skills/asana/cli` (uv installs into `~/.local/bin`).
## Subcommands
```bash
asana whoami # authenticated user + workspaces
asana workspaces # accessible workspaces
asana projects [--workspace GID] [--limit N] # projects in a workspace
asana ta