이슈 트라이에이지 (Linear / Jira)
Composio CLI를 사용하여 Linear 또는 Jira에서 트라이에이지 세션과 버그 스위프를 진행하세요. 백로그를 가져오고, 중복을 클러스터링하고, 레이블을 적용한 후 정리된 목록을 팀에 전달합니다.
사용 시기
- 주간 트라이에이지: "미할당, 오래되거나 우선순위가 누락된 이슈는 무엇인가?"
- 릴리스 후 버그 스위프: "모든 P1/P2 버그를 클러스터링하고, 중복을 제거하며, 담당자를 할당합니다."
- 크로스 툴 동기화: Sentry → Linear, PagerDuty → Jira.
사전 요구 사항
curl -fsSL https://composio.dev/install | bash
composio login
composio link linear # 또는: composio link jira
도구 검색
composio search "list issues" --toolkits linear
composio search "search issues" --toolkits jira
composio tools list linear
composio tools list jira
일반적인 슬러그 (--get-schema로 확인 가능):
Linear
LINEAR_LIST_ISSUESLINEAR_CREATE_ISSUELINEAR_UPDATE_ISSUELINEAR_CREATE_COMMENT
Jira
JIRA_SEARCH_FOR_ISSUES_USING_JQLJIRA_CREATE_ISSUEJIRA_EDIT_ISSUEJIRA_ADD_COMMENTJIRA_ASSIGN_ISSUE
트라이에이지 워크플로
- 백로그 슬라이스 가져오기:
# Linear composio execute LINEAR_LIST_ISSUES -d '{ "filter": { "state": { "type": { "eq": "unstarted" } }, "assignee": { "null": true } }, "first": 100 }' # Jira 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"] }' - 클러스터링: 제목 유사성과 레이블을 기준으로 중복 항목을 로컬에서 그룹화합니다.
- 한 번에 업데이트 적용 (레이블, 우선순위, 담당자):
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"]} }' - 중복 연결: 기준이 되는 이슈를 참조하는 댓글로 중복을 연결합니다.
- 변경 사항 요약 게시: Slack에 변경된 내용을 요약하여 팀이 스위프 결과를 확인할 수 있도록 합니다.
버그 스위프 (릴리스 후)
# Jira: 최근 7일 동안 생성된 모든 버그를 심각도 순으로 정렬
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)"'
워크플로 파일
scripts/triage-linear.ts, 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.`
});
크로스 툴: 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"]
});
}
'
문제 해결
- 알 수 없는 필드 이름 →
composio execute <SLUG> --get-schema명령어로 정확한 필터 형태를 확인하세요 (Linear는 중첩 객체를 사용하고 Jira는 JQL 문자열을 사용합니다). - Linear에서
403오류 → 올바른 워크스페이스로composio link linear를 다시 실행하세요. - Jira 사용자 정의 필드 누락 →
fields배열에 명시적으로 요청하세요. - 대량 편집 속도 제한 →
composio run루프에 250ms 지연을 추가하고--parallel은 사용하지 마세요.
전체 CLI 참고: docs.composio.dev/docs/cli