Taiga Common Operations
Plain-language playbooks for everyday Taiga work. Each one drives the REST API. For exact endpoint signatures and every field, open the api-reference skill's matching references/*.md file (named in each workflow).
Before anything: ensure a token
If TAIGA_AUTH_TOKEN is not already set this session, run the setup skill's login first. Every call below assumes TAIGA_AUTH_TOKEN and TAIGA_API_URL are set and uses Authorization: Bearer ${TAIGA_AUTH_TOKEN}.
The golden rules (why workflows look the way they do)
- Resolve names to IDs once. Users say "project apollo, story #42"; the API wants numbers. Hit
/resolver first and keep the IDs. (→ search-import.md)
- Read before you write. Editing an item requires its current
version. Always GET it, take .version, then PATCH with that version. (→ setup)
- Discover valid values per project. Status/type/priority IDs differ per project. Use the resource's
.../filters_data?project=<id> or list the *-statuses endpoint to pick the right ID instead of guessing.
- Confirm before deleting.
DELETE is irreversible; ask the user first.
Workflow: find a project and its building blocks
# Slug -> project id
PID=$(curl -s -H "Authorization: Bearer ${TAIGA_AUTH_TOKEN}" \
"${TAIGA_API_URL%/}/api/v1/resolver?project=apollo" | jq -r .project)
# Story statuses (id + name) for that project
curl -s -H "Authorization: Bearer ${TAIGA_AUTH_TOKEN}" \
"${TAIGA_API_URL%/}/api/v1/userstory-statuses?project=${PID}" | jq -r '.[] | "\(.id)\t\(.name)"'
(→ projects.md, user-stories.md)
Workflow: create / update a work item
The shape is identical for user stories, tasks, issues, and epics — only the path and a few fields differ.
- Create —
POST the collection with project + subject (+ optional status, assigned_to, milestone, classifiers).
- Update —
GET the item → read .version → PATCH with the changed fields and version.
- Move status —
PATCH { "status": <statusId>, "version": <v> }.
- Assign —
PATCH { "assigned_to": <userId>, "version": <v> }.
- Tag —
PATCH { "tags": [["urgent","#ff0000"], ...], "version": <v> }.
- Comment —
PATCH { "comment": "text", "version": <v> } (comments ride on the item; → history-webhooks.md).
- Attach a file — multipart
POST .../attachments with project, object_id, attached_file.
Reference per type: stories → user-stories.md, tasks → tasks.md, issues → issues.md, epics → epics.md.
# Move story 1234 to "In progress" (status 456)
US=$(curl -s -H "Authorization: Bearer ${TAIGA_AUTH_TOKEN}" "${TAIGA_API_URL%/}/api/v1/userstories/1234")
curl -s -X PATCH -H "Authorization: Bearer ${TAIGA_AUTH_TOKEN}" -H "Content-Type: application/json" \
-d "{\"status\":456,\"version\":$(echo "$US" | jq -r .version)}" \
"${TAIGA_API_URL%/}/api/v1/userstories/1234" | jq '{id, status}'
Workflow: sprint planning
- Create the sprint:
POST /milestones with project, name, estimated_start, estimated_finish. (→ milestones-wiki.md)
- Put stories in it: on each story
PATCH { "milestone": <sprintId>, "version": <v> }, or move many at once with POST /userstories/bulk_update_milestone. (→ user-stories.md)
- Add tasks under stories:
POST /tasks with user_story set. (→ tasks.md)
- Track progress:
GET /milestones/{id}/stats for points completed / remaining. (→ milestones-wiki.md)
Workflow: bug triage
- Discover classifier IDs:
GET /issues/filters_data?project=<id> → status, type, priority, severity. (→ issues.md)
- Create:
POST /issues with project, subject, type, priority, severity.
- Assign + comment + attach a screenshot as in "create/update a work item".
- Resolve:
PATCH { "status": <closedStatusId>, "version": <v> }.
Workflow: manage project access
- List members:
GET /memberships?project=<id>. (→ projects.md)
- Invite:
POST /memberships with project, role, username (email), or many via POST /memberships/bulk_create.
- Change a role:
PATCH /memberships/{id} with role + version.
- Manage roles/permissions:
roles + permissions endpoints. (→ projects.md)
Workflow: search & report
- Find items:
GET /search?project=<id>&text=<q>. (→ search-import.md)
- Filtered lists:
GET /userstories?project=&milestone=&status=&assigned_to= (same pattern for tasks/issues).
- Numbers:
GET /projects/{id}/stats, GET /projects/{id}/issues_stats, GET /milestones/{id}/stats.
- Full export:
GET /exporter/{projectId} → poll the dump URL. (→ search-import.md)
When a call fails (401, 400 version conflict, 403), switch to the troubleshoot skill.
1---2name: common-operations3description: This skill should be used when the user wants to do project-management work in Taiga — "create a user story / task / issue / epic in Taiga", "start a new sprint", "move a story to In Progress", "assign a task", "comment on an issue", "add members to a Taiga project", "build a sprint report", or any everyday Taiga operation. Provides plain-language workflows that drive the REST API and route to the exact endpoints.4---56# Taiga Common Operations78Plain-language playbooks for everyday Taiga work. Each one drives the REST API. For exact endpoint signatures and every field, open the `api-reference` skill's matching `references/*.md` file (named in each workflow).910## Before anything: ensure a token1112If `TAIGA_AUTH_TOKEN` is not already set this session, run the `setup` skill's login first. Every call below assumes `TAIGA_AUTH_TOKEN` and `TAIGA_API_URL` are set and uses `Authorization: Bearer ${TAIGA_AUTH_TOKEN}`.1314## The golden rules (why workflows look the way they do)15161. **Resolve names to IDs once.** Users say "project apollo, story #42"; the API wants numbers. Hit `/resolver` first and keep the IDs. (→ `search-import.md`)172. **Read before you write.** Editing an item requires its current `version`. Always `GET` it, take `.version`, then `PATCH` with that version. (→ `setup`)183. **Discover valid values per project.** Status/type/priority IDs differ per project. Use the resource's `.../filters_data?project=<id>` or list the `*-statuses` endpoint to pick the right ID instead of guessing.194. **Confirm before deleting.** `DELETE` is irreversible; ask the user first.2021## Workflow: find a project and its building blocks2223```bash24# Slug -> project id25PID=$(curl -s -H "Authorization: Bearer ${TAIGA_AUTH_TOKEN}" \26 "${TAIGA_API_URL%/}/api/v1/resolver?project=apollo" | jq -r .project)27# Story statuses (id + name) for that project28curl -s -H "Authorization: Bearer ${TAIGA_AUTH_TOKEN}" \29 "${TAIGA_API_URL%/}/api/v1/userstory-statuses?project=${PID}" | jq -r '.[] | "\(.id)\t\(.name)"'30```31(→ `projects.md`, `user-stories.md`)3233## Workflow: create / update a work item3435The shape is identical for user stories, tasks, issues, and epics — only the path and a few fields differ.36371. **Create** — `POST` the collection with `project` + `subject` (+ optional `status`, `assigned_to`, `milestone`, classifiers).382. **Update** — `GET` the item → read `.version` → `PATCH` with the changed fields **and** `version`.393. **Move status** — `PATCH` `{ "status": <statusId>, "version": <v> }`.404. **Assign** — `PATCH` `{ "assigned_to": <userId>, "version": <v> }`.415. **Tag** — `PATCH` `{ "tags": [["urgent","#ff0000"], ...], "version": <v> }`.426. **Comment** — `PATCH` `{ "comment": "text", "version": <v> }` (comments ride on the item; → `history-webhooks.md`).437. **Attach a file** — multipart `POST .../attachments` with `project`, `object_id`, `attached_file`.4445Reference per type: stories → `user-stories.md`, tasks → `tasks.md`, issues → `issues.md`, epics → `epics.md`.4647```bash48# Move story 1234 to "In progress" (status 456)49US=$(curl -s -H "Authorization: Bearer ${TAIGA_AUTH_TOKEN}" "${TAIGA_API_URL%/}/api/v1/userstories/1234")50curl -s -X PATCH -H "Authorization: Bearer ${TAIGA_AUTH_TOKEN}" -H "Content-Type: application/json" \51 -d "{\"status\":456,\"version\":$(echo "$US" | jq -r .version)}" \52 "${TAIGA_API_URL%/}/api/v1/userstories/1234" | jq '{id, status}'53```5455## Workflow: sprint planning56571. Create the sprint: `POST /milestones` with `project`, `name`, `estimated_start`, `estimated_finish`. (→ `milestones-wiki.md`)582. Put stories in it: on each story `PATCH { "milestone": <sprintId>, "version": <v> }`, or move many at once with `POST /userstories/bulk_update_milestone`. (→ `user-stories.md`)593. Add tasks under stories: `POST /tasks` with `user_story` set. (→ `tasks.md`)604. Track progress: `GET /milestones/{id}/stats` for points completed / remaining. (→ `milestones-wiki.md`)6162## Workflow: bug triage63641. Discover classifier IDs: `GET /issues/filters_data?project=<id>` → status, type, priority, severity. (→ `issues.md`)652. Create: `POST /issues` with `project`, `subject`, `type`, `priority`, `severity`.663. Assign + comment + attach a screenshot as in "create/update a work item".674. Resolve: `PATCH { "status": <closedStatusId>, "version": <v> }`.6869## Workflow: manage project access70711. List members: `GET /memberships?project=<id>`. (→ `projects.md`)722. Invite: `POST /memberships` with `project`, `role`, `username` (email), or many via `POST /memberships/bulk_create`.733. Change a role: `PATCH /memberships/{id}` with `role` + `version`.744. Manage roles/permissions: `roles` + `permissions` endpoints. (→ `projects.md`)7576## Workflow: search & report77781. Find items: `GET /search?project=<id>&text=<q>`. (→ `search-import.md`)792. Filtered lists: `GET /userstories?project=&milestone=&status=&assigned_to=` (same pattern for tasks/issues).803. Numbers: `GET /projects/{id}/stats`, `GET /projects/{id}/issues_stats`, `GET /milestones/{id}/stats`.814. Full export: `GET /exporter/{projectId}` → poll the dump URL. (→ `search-import.md`)8283When a call fails (401, 400 version conflict, 403), switch to the `troubleshoot` skill.