Observed since 20 Oct, 16:50 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
aa-cli
Automatic human-readable ID assignment for Asana tasks
Automatic human-readable ID assignment for Asana tasks and subtasks.
aa-cli automatically adds short, readable IDs to your Asana tasks - like PRJ-5 or PRJ-5-1. This makes tasks easier to reference in discussions, documentation, and team communication.
Key Features:
Install UV if you don't have it:
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
No installation needed! Just use uvx:
uvx aa-cli@latest --help
Create your configuration file:
uvx aa-cli@latest init
This will:
.aa.yml with everything configuredNote: For workspaces with 100+ projects, automatic code detection is skipped to avoid API rate limits. In this case, only the first project is added as an example - you can manually add your projects to the config.
Get your token: Asana Developer Console → "Create new token"
Build the ID cache from your existing tasks:
uvx aa-cli@latest scan
Preview changes:
uvx aa-cli@latest update --dry-run
Apply IDs to tasks:
uvx aa-cli@latest update
Done! Your tasks now have IDs like PRJ-1, PRJ-2, etc.
IDs follow a hierarchical pattern:
PRJ-1: Implement authentication
├── PRJ-1-1: Design login flow
├── PRJ-1-2: Create user model
│ ├── PRJ-1-2-1: Add validation
│ └── PRJ-1-2-2: Write tests
└── PRJ-1-3: Build API endpoints
PRJ-2: Setup CI/CD
└── PRJ-2-1: Configure GitHub Actions
CODE-N (e.g., PRJ-5)CODE-N-M (e.g., PRJ-5-1)CODE-N-M-K (e.g., PRJ-5-1-2)initInitialize configuration:
# Interactive mode (recommended)
uvx aa-cli@latest init
# Create template only
uvx aa-cli@latest init --force
scanScan projects and update cache:
# Scan all projects
uvx aa-cli@latest scan
# Scan specific project
uvx aa-cli@latest scan --project PRJ
# Ignore conflicts
uvx aa-cli@latest scan --ignore-conflicts
Safety Check: scan will fail if it detects "foreign" IDs (IDs from other projects) to prevent accidental duplication.
resetRemove IDs from all tasks in a project (useful for cleaning up messy projects):
# Reset specific project (requires Asana Project GID)
uvx aa-cli@latest reset --project-id 123456789
# Preview changes without applying
uvx aa-cli@latest reset --project-id 123456789 --dry-run
updateAssign IDs to tasks:
# Preview changes
uvx aa-cli@latest update --dry-run
# Apply changes
uvx aa-cli@latest update
# Update specific project
uvx aa-cli@latest update --project PRJ
All commands support:
--config PATH - Custom config file location-v - Verbose output (INFO level)-vv - Debug output (DEBUG level, shows API requests)--help - Show help.aa.ymlasana_token: "your-personal-access-token"
projects:
- code: PRJ # 2-5 uppercase letters
asana_id: "1234567890"
- code: TSK
asana_id: "9876543210"
Finding project IDs:
There are two ways to get a project ID:
From task URL (new format):
/project/: https://app.asana.com/.../project/123123123/task/...123123123 is your project IDFrom project URL:
https://app.asana.com/0/123123123/.../0/ is your project IDOr just use uvx aa-cli@latest init - it fetches everything automatically!
.aa.cache.yamlAutomatically managed by scan and update. Tracks the last assigned ID for each project:
projects:
PRJ:
last_root: 42
subtasks:
"5": 3 # PRJ-5-3 is last subtask of PRJ-5
# Add new tasks in Asana, then:
uvx aa-cli@latest update
.aa.yml to add the projectuvx aa-cli@latest scan --project NEWuvx aa-cli@latest update --project NEWIf someone manually added IDs or cache is out of sync:
# Review the conflict
uvx aa-cli@latest scan
# If safe, update cache to match Asana
uvx aa-cli@latest scan --ignore-conflicts
"Config file not found"
uvx aa-cli@latest init first"Invalid token" or 401 errors
.aa.yml"Conflict detected"
--ignore-conflicts if safeTasks not getting IDs
update, not just scan--dry-run flagFor contributors and developers:
git clone https://github.com/umaxfun/asana-tools
cd asana-tools
uv sync
uv run aa-cli --help
aa/
├── cli.py # Main CLI entry point
├── commands/ # Command implementations
├── core/ # Business logic
├── models/ # Data models
└── utils/ # Utilities
uv run pytest
uv add <package-name>
To bump the version and release a new tag:
# Bump version (updates pyproject.toml and aa/__init__.py)
python scripts/bump_version.py [major|minor|patch]
# Push commits and create a git tag
python scripts/push_tag.py
The push_tag.py script will:
v0.4.3)MIT
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
clickEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | click>=8.1.0 | runtime |
httpxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | httpx>=0.27.0 | runtime |
pydanticEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pydantic>=2.0.0 | runtime |
pyyamlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0.0 | runtime |
bdist_wheel · 32.22 KB · Python py3
sdist · 69.19 KB · Python source
Observed since 20 Oct, 16:50 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:ece64eeca57fb1900e5d133b11cac3f52be235d7a31399d698e60938d3256d7f