Agent Skills: project-status Skill

|

UncategorizedID: semicolon-devteam/semo/project-status

Install this agent skill to your local

pnpm dlx add-skill https://github.com/semicolon-devteam/semo/tree/HEAD/semo-system/semo-skills/project-status

Skill Files

Browse the full folder contents for project-status.

Download Skill

Loading file tree…

semo-system/semo-skills/project-status/SKILL.md

Skill Metadata

Name
project-status
Description
|

호출 시 메시지: 이 Skill이 호출되면 반드시 [SEMO] Skill: project-status 시스템 메시지를 첫 줄에 출력하세요.

project-status Skill

이슈 Status 필드 변경 (Supabase DB 기반)

🔴 데이터 소스 변경 (v2.0.0)

| 버전 | 데이터 소스 | 방식 | |------|------------|------| | v1.x | GitHub Projects | GraphQL mutation | | v2.0 | Supabase | issues.status UPDATE |


Purpose

Supabase issues 테이블의 status 컬럼을 업데이트합니다. 상태 변경 이력은 issue_status_history 테이블에 자동 기록됩니다.


Status 옵션

| Status | 설명 | |--------|------| | backlog | 초기 상태 | | todo | 할 일 목록 | | in_progress | 개발 진행 중 | | review | 코드 리뷰 대기 | | testing | QA 테스트 단계 | | done | 작업 완료 |

Workflow

1. Supabase로 Status 변경

// Supabase 클라이언트를 사용한 상태 변경
const { data, error } = await supabase
  .from('issues')
  .update({ status: 'in_progress' })
  .eq('number', 123)
  .eq('office_id', officeId)
  .select('number, title, status')
  .single();

2. SQL 직접 사용 (MCP Server)

-- 단일 이슈 상태 변경
UPDATE issues
SET status = 'in_progress',
    updated_at = NOW()
WHERE number = 123
  AND office_id = '{office_uuid}'
RETURNING number, title, status;

3. update_issue_status 함수 사용 (권장)

마이그레이션에 포함된 헬퍼 함수를 사용하면 히스토리 자동 기록:

-- 상태 변경 함수 호출 (히스토리 자동 기록)
SELECT * FROM update_issue_status(
  123,                    -- issue_number
  '{office_uuid}'::uuid,  -- office_id
  'in_progress',          -- new_status
  '{actor_uuid}'::uuid    -- changed_by (optional)
);

4. 이전 상태 확인

-- 현재 상태 확인
SELECT number, title, status
FROM issues
WHERE number = 123
  AND office_id = '{office_uuid}';

-- 상태 변경 이력 확인
SELECT *
FROM issue_status_history
WHERE issue_id = (
  SELECT id FROM issues WHERE number = 123
)
ORDER BY changed_at DESC;

상태값 Alias

사용자가 한글/영문 키워드를 사용하면 실제 status 값으로 매핑:

| 입력 | status 값 | |------|-----------| | 백로그, backlog | backlog | | 할일, 작업대기, todo | todo | | 작업중, 진행중, in_progress | in_progress | | 리뷰요청, 리뷰, review | review | | 테스트중, 테스트, testing | testing | | 완료, 닫기, done | done |

일괄 변경 지원

-- 특정 라벨의 이슈들 일괄 상태 변경
UPDATE issues
SET status = 'in_progress',
    updated_at = NOW()
WHERE 'project:차곡' = ANY(labels)
  AND state = 'open'
  AND office_id = '{office_uuid}'
RETURNING number, title, status;
// Supabase로 일괄 변경
const { data, error } = await supabase
  .from('issues')
  .update({ status: 'in_progress' })
  .contains('labels', ['project:차곡'])
  .eq('state', 'open')
  .eq('office_id', officeId)
  .select('number, title, status');

출력 포맷

[SEMO] project-status: 상태 변경 완료

✅ Status 변경 완료

**Issue**: #123
**이전 상태**: todo
**변경 상태**: in_progress

에러 처리

이슈 미발견

⚠️ **이슈 미발견**

Issue #123을 찾을 수 없습니다.
- 이슈 번호를 확인해주세요.
- Office ID가 올바른지 확인해주세요.

잘못된 상태값

⚠️ **잘못된 상태값**

'{status}'는 유효하지 않은 상태값입니다.

사용 가능한 상태:
- backlog, todo, in_progress, review, testing, done

Supabase 연결 오류

⚠️ **Supabase 연결 오류**

상태를 변경할 수 없습니다.
- MCP 서버 설정을 확인해주세요.

GitHub GraphQL Fallback

Supabase 연결이 불가능한 경우 GitHub GraphQL로 폴백:

# Fallback: GitHub Projects GraphQL
gh api graphql -f query='
  mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!) {
    updateProjectV2ItemFieldValue(input: {
      projectId: $projectId
      itemId: $itemId
      fieldId: $fieldId
      value: { singleSelectOptionId: $optionId }
    }) {
      projectV2Item { id }
    }
  }
' -f projectId="$PROJECT_ID" \
  -f itemId="$ITEM_ID" \
  -f fieldId="$STATUS_FIELD_ID" \
  -f optionId="$STATUS_OPTION_ID"

References