팀원이 자연어로 할 일을 적으면 AI API로 Task 초안을 만들고 Jira에 티켓을 생성하는 서비스입니다.
- 사전 등록 이메일/비밀번호 로그인
- 30일 세션
- 자연어 입력 한 개
- 로그인 사용자에게 자동 담당자 지정
- 생성 진행 상태와 이번 브라우저 세션의 티켓 영수증
- 원문 선저장, idempotency, 부분 실패, Mattermost 실패 알림
조회·검색·수정·삭제·프로젝트 선택·타입 선택·스프린트·계층·관리 화면은 만들지 않습니다.
- FastAPI + vanilla HTML/CSS/JS
- private SQLite: 사용자, 세션, 생성 요청 원문, 생성 결과
- AI API: 자연어를 평평한 Task 목록으로 정리
- 티켓 생성 연동: 확인된 Task 생성
- 제한된 worker pool: 여러 팀원의 요청을 병렬 처리하고 초과 요청은 대기
- Mattermost Incoming Webhook: 티켓 생성/agent 실패 원문과 입력 원문을 리드에게 전달
화면은 서버의 과거 생성 내역을 조회하지 않습니다. SQLite 기록은 입력 유실 방지와 장애 조사만을 위한 내부 데이터입니다.
python3 -m venv .venv
.venv/bin/python -m pip install -e '.[test]'
cp .env.example .env
chmod 600 .env.env에서 필요한 AI API, 티켓 생성, Mattermost 인증 정보를 설정합니다. production에서는 이 값들과 secure cookie가 없으면 앱이 시작되지 않습니다. API 키와 Token은 저장소나 이미지에 포함하지 않고 Kubernetes Secret으로 주입합니다.
비밀번호와 외부 서비스 사용자 식별자는 repository나 shell argument에 넣지 않습니다. 사용자 식별자는 외부 서비스에서 정확히 확인하고, 비밀번호는 TTY에서 두 번 입력합니다.
set -a; . ./.env; set +a
.venv/bin/python -m app.seed_user \
--email 'member@example.com' \
--display-name '홍길동'외부 서비스 사용자 식별자 조회가 유일하지 않거나 누락되면 등록이 거부됩니다.
set -a; . ./.env; set +a
.venv/bin/uvicorn app.main:create_app --factory --host 127.0.0.1 --port 8080TLS reverse proxy 뒤에서 운영합니다. COWORK_COOKIE_SECURE=true를 유지합니다.
Dockerfile은 Python 베이스 이미지를 digest로 고정하고 UID/GID 1000의 non-root
사용자로 실행합니다. SQLite 상태는 /data 아래에 두며,
운영에서는 하나의 영속 PVC를 마운트합니다. image tag는 Git commit SHA만 사용하고
main CI가 검증한 image만 GHCR에 게시합니다.
실제 배포는 PinLog k3s와 Argo CD GitOps로 관리합니다. SQLite singleton이므로
replica는 1이고 Deployment 전략은 Recreate여야 합니다. Tunnel token, Mattermost
webhook, provider/OAuth credential은 image나 이 저장소에 포함하지 않습니다.
요청 key는 불명확한 network 실패 동안 browser sessionStorage에 유지됩니다. 티켓 생성 후 local receipt 저장 여부가 불명확하면 자동 재시도하지 않고 내부 reconcile 상태로 남기며 리드 알림을 보냅니다. Mattermost 전송 실패는 private SQLite outbox에 보존됩니다.
.venv/bin/python -m pytest -q
.venv/bin/ruff check app tests
.venv/bin/python -m compileall -q app tests테스트는 티켓 생성과 Mattermost 연동을 mock하며 실제 티켓을 생성하지 않습니다.