| name | issue-triage |
| description | 通过 Composio CLI 分诊 Linear 或 Jira backlogs,并执行 bug sweeps。可批量拉取 issues、去重、重打标签、重新分配并发布摘要。Keywords: Linear, Jira, issue triage. |
Issue Triage (Linear / Jira)
Drive triage sessions and bug sweeps across Linear or Jira with the Composio CLI. Pull the backlog, cluster duplicates, apply labels, and hand a clean list back to the team.
When to Use
- Weekly triage: "what's unassigned, stale, or missing a priority?"
- Bug sweep after a release: "cluster all P1/P2 bugs, dedupe, assign owners."
- Cross-tool sync: Sentry → Linear, PagerDuty → Jira.
Prereqs
curl -fsSL https://composio.dev/install | bash
composio login
composio link linear
Discover Tools
composio search "list issues" --toolkits linear
composio search "search issues" --toolkits jira
composio tools list linear
composio tools list jira
Common slugs (verify with --get-schema):
Linear
LINEAR_LIST_ISSUES
LINEAR_CREATE_ISSUE
LINEAR_UPDATE_ISSUE
LINEAR_CREATE_COMMENT
Jira
JIRA_SEARCH_FOR_ISSUES_USING_JQL
JIRA_CREATE_ISSUE
JIRA_EDIT_ISSUE
JIRA_ADD_COMMENT
JIRA_ASSIGN_ISSUE
Triage Workflow
- Pull the backlog slice:
composio execute LINEAR_LIST_ISSUES -d '{
"filter": { "state": { "type": { "eq": "unstarted" } }, "assignee": { "null": true } },
"first": 100
}'
composio execute JIRA_SEARCH_FOR_ISSUES_USING_JQL -d '{
"jql": "project = APP AND statusCategory != Done AND assignee is EMPTY ORDER BY updated DESC",
"maxResults": 100,
"fields": ["summary","priority","labels","updated","reporter"]
}'
- Cluster by title similarity and labels. The agent groups likely duplicates locally.
- Apply updates in one pass (label, priority, assignee):
composio execute LINEAR_UPDATE_ISSUE -d '{
"id":"abc-123","priority":2,"labelIds":["label-bug","label-p1"],"assigneeId":"user-42"
}'
composio execute JIRA_EDIT_ISSUE -d '{
"issueIdOrKey":"APP-482",
"fields":{"priority":{"name":"High"},"labels":["bug","p1"]}
}'
- Link duplicates with comments referencing the canonical issue.
- Post a digest of what changed to Slack so the team sees the sweep results.
Bug Sweep (Post-Release)
composio execute JIRA_SEARCH_FOR_ISSUES_USING_JQL -d '{
"jql":"type = Bug AND created >= -7d ORDER BY priority DESC, created ASC",
"fields":["summary","priority","labels","reporter","components"]
}' | jq -r '.issues[] | "\(.fields.priority.name)\t\(.key)\t\(.fields.summary)"'
Workflow File
scripts/triage-linear.ts, run with composio run --file scripts/triage-linear.ts:
const { nodes: issues } = await execute("LINEAR_LIST_ISSUES", {
filter: { state: { type: { eq: "unstarted" } }, assignee: { null: true } },
first: 100
});
const stale = issues.filter(i => {
const age = (Date.now() - new Date(i.updatedAt).getTime()) / 86400000;
return age > 14;
});
for (const i of stale) {
await execute("LINEAR_CREATE_COMMENT", {
issueId: i.id,
body: "Auto-triage: stale for 14+ days. Please assign or close."
});
}
await execute("SLACK_SEND_MESSAGE", {
channel: "triage",
text: `Weekly triage: pinged ${stale.length} stale issues.`
});
Cross-Tool: Sentry → Linear
composio run '
const hot = await execute("SENTRY_LIST_A_PROJECTS_ISSUES", {
organization_slug:"acme", project_slug:"api",
query:"is:unresolved", sort:"freq", limit:5
});
for (const s of hot) {
await execute("LINEAR_CREATE_ISSUE", {
teamId: "TEAM_ID",
title: `[Sentry] ${s.title}`,
description: `${s.permalink}\nCount: ${s.count}`,
labelIds: ["label-bug","label-from-sentry"]
});
}
'
Troubleshooting
- Unknown field names →
composio execute <SLUG> --get-schema shows the exact filter shape (Linear uses nested objects; Jira uses JQL strings).
403 on Linear → re-run composio link linear with the right workspace.
- Jira custom fields missing → request them explicitly in the
fields array.
- Bulk edits rate-limited → insert a 250ms sleep in the
composio run loop; don't use --parallel.
Full CLI reference: docs.composio.dev/docs/cli