Taiga 스토리
브라우저 제어는 없습니다. 업로드는 scripts/taiga_stories.py를 통해 Taiga REST API로 이루어지며, 이 스크립트는 Python 표준 라이브러리만 사용합니다. 동일한 도구는 .env에서 설정된 모든 Taiga 프로젝트에 대해 작동합니다.
설정 (저장소당 한 번)
.env.example을 저장소 루트에.env로 복사하고TAIGA_PROJECT_URL을 프로젝트 링크(예:https://taiga.example.com/project/my-project)로 설정합니다.- 선택적으로
STORIES_DIR을 설정합니다(기본값:stories).
.env에는 비밀이 저장되지 않으며 git에서 무시됩니다. 토큰은 절대 .env에 들어가지 않습니다.
스토리 작성
각 스토리는 stories/ 디렉터리의 하나의 .md 파일이며, story-template.md를 따릅니다.
-
파일 이름: 소문자, 악센트 없음, 단어는 하이픈으로 연결(
automatic-slug.md). -
첫 번째 줄:
# Story: <제목>. "Story:" 뒤의 텍스트가 Taiga 제목이 됩니다. 버그 수정의 경우Fix — <발생한 상황>을 사용합니다. -
헤더:
**Project:**,**Branch:**,**Version:**,**Date:**,**Points:**를 한 줄에 하나씩 작성합니다. -
포인트: 기본값이 없습니다. 새 스토리를
stories/에 저장하기 전에story-points스킬(CODE_REPO_PATH의 커밋 기록)을 사용하여 포인트를 추정하고 사용자 확인을 받습니다.**Points:**필드(포르투갈어:**Pontos:**)에 값을 작성하세요. 값은 프로젝트의 포인트 척도(1, 2, 3, 5, 8, 13, 21)에 있는 이름이어야 합니다. -
섹션 순서:
## User story(As / I want / so that, 각각 굵게 자체 줄에),## Description(제품 소유자를 위한 산문, 코드 전문 용어 없음),## Acceptance criteria(- [ ]체크리스트, 완료 및 테스트된 항목은[x]),## Tasks,## Deployment notes(배포 관련이 아닌 경우## Notes). -
작업:
### Backend,### Frontend,### Tests,### Documentation순서로 그룹화하고 빈 그룹은 생략합니다. 각 작업은N. **제목**형식이며 설명은 다음 줄에 들여씁니다. 번호는 그룹 전체에 걸쳐 연속됩니다. -
언어: 전체 스토리(제목 포함)를 사용자 요청의 언어로 작성합니다. 포르투갈어 요청은 포르투갈어로 스토리를 작성합니다. 두 헤더 세트가 모두 파싱됩니다:
영어 포르투갈어 # Story:# História:**Project:**/**Branch:**/**Version:**/**Date:**/**Points:****Projeto:**/**Branch:**/**Versão:**/**Período:**/**Pontos:**## User story(As / I want / so that)## História de usuário(Como / quero / para)## Description## Descrição## Acceptance criteria## Critérios de aceite## Tasks(### Backend,### Frontend,### Tests,### Documentation)## Tarefas(### Backend,### Frontend,### Testes,### Documentação)## Deployment notes/## Notes## Observações para implantação/## ObservaçõesFix — ...Correção — ... -
방화벽 친화적 텍스트: 설명에서는
code바로 앞에;를 사용하지 말고(마침표 사용),<script>와 같은 리터럴 태그(대신 "script 태그"라고 작성), 경로 옆에Class::method체인을 피하세요. 스크립트가 이를 우회하지만 텍스트 품질이 나빠집니다.
형식 확인(네트워크 없음, 토큰 없음):
python -X utf8 .claude/skills/taiga-stories/scripts/taiga_stories.py validate [file.md ...]
오류를 수정하세요. 설명이 없는 작업은 허용 가능한 경고입니다. **Points:** 누락은 여기서는 경고에 불과하지만 업로드를 차단합니다.
Taiga에 업로드
매번 채팅에서 먼저 항상 질문
AskUserQuestion을 사용하거나, 사용할 수 없으면 일반 질문을 사용하세요. 이전 답변을 재사용하지 마세요:
- 대상: 어떤 스프린트(정확한 이름, 예:
Sprint 34) 또는 백로그. - 세션 토큰: 열린 Taiga 탭에서 F12 > Console >
localStorage.getItem("token"). 명령어의 인라인 환경 변수로만 사용하세요..env또는 어떤 파일에도 절대 작성하지 마세요. - 누락된 포인트: 업로드할 스토리 중
**Points:**가 없는 경우(--dry-run에MISSING으로 표시됨),story-points스킬로 해당 스토리를 추정하고 사용자 확인을 받되, 제목별로 나열하세요. 각 값을 스토리의**Points:**줄(포르투갈어:**Pontos:**)에**Date:**/**Período:**바로 뒤에 작성하세요. 이미 포인트가 있는 스토리는 다시 추정하지 않습니다. 유효한 값이 없는 스토리가 있으면 업로드는 아무것도 생성하기 전에 중단됩니다.
.env가 없으면 Taiga 프로젝트 링크도 물어보고 .env.example에서 .env를 만드세요.
단계
S=.claude/skills/taiga-stories/scripts/taiga_stories.py
python -X utf8 $S validate
python -X utf8 $S upload --sprint "Sprint 34" --dry-run # 또는 --backlog
TAIGA_TOKEN='<token>' python -X utf8 $S upload --sprint "Sprint 34"
마지막에 파일 이름을 전달하여 일부 스토리만 업로드할 수 있습니다. 그런 다음 생성된 스토리와 작업 수, 스크립트가 다시 작성한 텍스트(및 설명이 삭제된 작업)를 사용자에게 보고합니다.
기본값: 토큰 소유자가 스토리와 작업의 담당자가 되고, 상태는 프로젝트 기본값을 사용하며, 포인트는 각 스토리의 **Points:** 필드(프로젝트의 computable role 기준)에서 가져옵니다.
스크립트는:
- 제목이 이미 프로젝트에 존재하는 스토리는 건너뜁니다. 사용자가 요청하는 경우에만
--force를 사용하세요; - 중단된 실행을 중복 없이 재개합니다(
stories/.taiga_state.json에 상태 저장). 중단되면 그냥 다시 실행하세요; - 방화벽에 차단된 텍스트를 다시 작성하고 마지막에 나열합니다.
실패할 수 있는 단계 뒤에 ;로 다른 생성 명령을 연결하지 마세요. 중간에 실패하면 중복이 발생할 수 있습니다.
학습된 내용
- HTML 본문이 포함된 Cloudflare 403("Just a moment...")은 WAF가 텍스트를 차단했음을 의미하며, 권한 문제가 아닙니다. 스크립트가 더 간단한 변형으로 재시도합니다. 작업 설명이 없으면 일반 산문(백틱 없음,
::없음)으로 다시 작성하고 현재version을 보내 PATCH하세요. - JSON
PermissionDenied가 포함된 403은 실제 권한 오류입니다. 일반 멤버는 사용자 스토리를 삭제하지 못할 수 있지만(작업은 괜찮음), 중복을 피하세요. 중복이 발생하면 삭제 대신 PATCH(subject, description, points, milestone, assigned_to,version)로 스토리를 재사용하세요. - 포인트는
points: {"<computable role id>": <point id>}로 전달되며, 포인트 ID는 프로젝트 척도에서 이름으로 조회됩니다. - Windows에서 Python은 Git Bash의
/tmp를 인식하지 못합니다. Windows 경로를 사용하고, 악센트가 올바르게 출력되도록-X utf8플래그와 함께 Python을 실행하세요.