# todo-manager.py — todo.json CRUD 관리 스크립트

## 배경
- todo.json을 수동 편집하다가 JSON 구조 오류 발생 → 대시보드 장애 유발 (issue-040 유실 사고)
- 원인: 배열 바깥에 이슈를 삽입하는 실수 → JSON 파싱 실패
- 대책: **todo.json을 직접 편집하지 않고, 스크립트로만 조작**

## 목표
`memory/todo-manager.py` CLI 스크립트를 만든다. 모든 todo.json 조작은 이 스크립트를 통해서만 수행한다.

## 파일 위치
- 스크립트: `/home/jay/workspace/memory/todo-manager.py`
- 대상 파일: `/home/jay/workspace/memory/todo.json`

## 필수 기능 (서브커맨드)

### 1. `list` — 이슈 목록 조회
```bash
python3 todo-manager.py list                          # 전체 목록 (id, project, title, status)
python3 todo-manager.py list --project MktingAuto     # 프로젝트별 필터
python3 todo-manager.py list --status in_progress     # 상태별 필터
```

### 2. `show` — 이슈 상세 조회
```bash
python3 todo-manager.py show issue-040                # sub_items 포함 상세 출력
```

### 3. `add` — 이슈 추가
```bash
python3 todo-manager.py add \
  --project MktingAuto \
  --title "광고 이미지 생성 방법 테스트" \
  --priority high \
  --status in_progress \
  --description "6가지 방법 순차 테스트"
```
- id는 자동 생성 (기존 최대 숫자 + 1, 예: issue-041)
- 추가 후 JSON 구조 검증 (json.loads로 재파싱 확인)

### 4. `update` — 이슈 수정
```bash
python3 todo-manager.py update issue-040 --status done
python3 todo-manager.py update issue-040 --priority medium
python3 todo-manager.py update issue-040 --title "새 제목"
```

### 5. `remove` — 이슈 삭제
```bash
python3 todo-manager.py remove issue-040
```
- 삭제 전 확인 메시지 출력 (--force로 스킵 가능)
- 삭제된 이슈를 백업 파일에 기록 (`todo-removed.json`)

### 6. `sub-add` — sub_item 추가
```bash
python3 todo-manager.py sub-add issue-040 --title "⑤ Satori 테스트"
```

### 7. `sub-done` — sub_item 완료 처리
```bash
python3 todo-manager.py sub-done issue-040 --index 0 --task-id task-853.1
# 또는 제목으로 매칭
python3 todo-manager.py sub-done issue-040 --match "Satori" --task-id task-863.1
```

### 8. `link` — linked_tasks 추가
```bash
python3 todo-manager.py link issue-040 task-861.1
```

## 안전장치 (필수)

1. **저장 전 JSON 검증**: `json.loads()`로 재파싱하여 구조 무결성 확인. 실패 시 저장 안 함
2. **백업**: 매 수정 전 `todo.json.bak`에 현재 상태 백업 (1개만 유지)
3. **atomic write**: 임시 파일에 쓰고 rename (쓰기 도중 크래시 방지)
4. **출력 포맷**: 모든 출력은 JSON (--pretty 옵션으로 사람이 읽기 쉽게)

## 기술 제약
- Python 3.10+ 표준 라이브러리만 사용 (외부 의존성 없음)
- argparse로 CLI 구현
- 200줄 이하 유지. 초과 시 `todo_utils.py`로 분리
- UTF-8 인코딩, ensure_ascii=False

## 테스트
- pytest 테스트 작성 (최소 15개)
- 각 서브커맨드 정상 동작 테스트
- 잘못된 id, 존재하지 않는 이슈 등 에러 케이스
- JSON 무결성 검증 테스트 (의도적으로 깨진 JSON 복구 확인)
- atomic write 검증

## 산출물
- `/home/jay/workspace/memory/todo-manager.py`
- `/home/jay/workspace/memory/todo_utils.py` (200줄 초과 시)
- `/home/jay/workspace/memory/test_todo_manager.py`
- 보고서: `/home/jay/workspace/memory/reports/task-{task_id}.md`