Community코딩 & 개발github.com

taiga-stories

사용자 스토리를 표준 형식의 Markdown 파일로 작성하여 Taiga에 업로드합니다. 각 스토리에는 '## Tasks' 아래에 작업 목록이 포함됩니다.

taiga-stories란 무엇인가요?

이 스킬은 개발자가 Taiga 프로젝트 관리 도구와 연동하여 사용자 스토리와 작업을 체계적으로 관리할 수 있도록 돕습니다. 사용자가 스토리 .md 파일을 작성, 생성, 표준화, 검토하거나 Taiga, 스프린트, 백로그에 업로드/등록/푸시하라는 요청을 하면 활성화됩니다. 주요 기능은 로컬 Markdown 파일로 스토리를 작성하고 `taiga_stories.py` 스크립트를 통해 Taiga REST API로 업로드하는 것입니다. 스크립트는 Python 표준 라이브러리만 사용하므로 별도의 외부 의존성이 없으며, `.env` 파일에서 프로젝트 URL과 디렉터리 설정을 관리합니다. 업로드 전에 `story-points` 스킬을 사용하여 스토리 포인트를 추정하고 사용자 확인을 받아야 합니다. 업로드 과정에서는 사용자에게 대상 스프린트(또는 백로그)와 Taiga 세션 토큰을 매번 질문하며, 중복 생성 방지, 방화벽 차단 텍스트 재작성, 중단된 업로드 재개 등의 안전장치를 제공합니다. 스토리 형식은 영문과 포르투갈어를 모두 지원하며, 스토리 제목의 중복 체크와 강제 업로드(`--force`) 옵션도 사용할 수 있습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/czarist/md2taiga/tree/HEAD/.claude/skills/taiga-stories

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Taiga 스토리

브라우저 제어는 없습니다. 업로드는 scripts/taiga_stories.py를 통해 Taiga REST API로 이루어지며, 이 스크립트는 Python 표준 라이브러리만 사용합니다. 동일한 도구는 .env에서 설정된 모든 Taiga 프로젝트에 대해 작동합니다.

설정 (저장소당 한 번)

  1. .env.example을 저장소 루트에 .env로 복사하고 TAIGA_PROJECT_URL을 프로젝트 링크(예: https://taiga.example.com/project/my-project)로 설정합니다.
  2. 선택적으로 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ções
    Fix — ...Correção — ...
  • 방화벽 친화적 텍스트: 설명에서는 code 바로 앞에 ;를 사용하지 말고(마침표 사용), <script>와 같은 리터럴 태그(대신 "script 태그"라고 작성), 경로 옆에 Class::method 체인을 피하세요. 스크립트가 이를 우회하지만 텍스트 품질이 나빠집니다.

형식 확인(네트워크 없음, 토큰 없음):

python -X utf8 .claude/skills/taiga-stories/scripts/taiga_stories.py validate [file.md ...]

오류를 수정하세요. 설명이 없는 작업은 허용 가능한 경고입니다. **Points:** 누락은 여기서는 경고에 불과하지만 업로드를 차단합니다.

Taiga에 업로드

매번 채팅에서 먼저 항상 질문

AskUserQuestion을 사용하거나, 사용할 수 없으면 일반 질문을 사용하세요. 이전 답변을 재사용하지 마세요:

  1. 대상: 어떤 스프린트(정확한 이름, 예: Sprint 34) 또는 백로그.
  2. 세션 토큰: 열린 Taiga 탭에서 F12 > Console > localStorage.getItem("token"). 명령어의 인라인 환경 변수로만 사용하세요. .env 또는 어떤 파일에도 절대 작성하지 마세요.
  3. 누락된 포인트: 업로드할 스토리 중 **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을 실행하세요.

관련 스킬