# task-1407.1 완료 보고서: 스레드 CLI post-text 룰 미준수 수정

## SCQA

**S**: ThreadAuto 프로젝트의 `cli.py post-text` 커맨드와 `scripts/text_posting.py upload_to_threads` 함수가 `ThreadsClient.post_text()`를 직접 호출하여 텍스트 게시물을 발행하고 있다. 정상 경로인 `run_text_post.py`는 `ThreadsPublisher.publish()`를 경유하여 면책문구(`AUTO_POST_DISCLAIMER`)와 줄바꿈 검증(`ensure_line_breaks`)을 자동 적용한다.

**C**: CLI와 스크립트의 우회 경로를 통해 게시할 경우 면책문구가 누락되고 줄바꿈 규칙이 미적용되어, 법적 리스크와 콘텐츠 품질 저하가 발생한다.

**Q**: 모든 텍스트 게시 경로가 `ThreadsPublisher`를 경유하도록 수정하여 면책문구와 줄바꿈 규칙을 일관되게 적용할 수 있는가?

**A**: `cli.py post-text`와 `scripts/text_posting.py upload_to_threads`를 `ThreadsPublisher.publish()` 경유로 수정 완료. `ensure_line_breaks()` 전처리 + `_build_caption()`의 `AUTO_POST_DISCLAIMER` 자동 추가로 두 우회 경로 모두 정상 경로와 동일하게 동작. 신규 테스트 11건 전체 통과, 기존 테스트 45건 회귀 없음.

---

## 산출물

- `/home/jay/projects/ThreadAuto/.worktrees/task-1407.1-dev1/cli.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1407.1-dev1/scripts/text_posting.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1407.1-dev1/tests/test_cli_post_text.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1407.1-dev1/tests/test_text_posting.py`

## 변경 상세

### 1. cli.py post-text (154~193줄)
- `ThreadsClient` 직접 호출 → `ThreadsPublisher.publish()` 경유
- `ensure_line_breaks(text)` 전처리 적용
- `async def _post()` + `asyncio.run()` 제거 (ThreadsPublisher는 동기)
- 기존 토큰 사전 체크 UX 메시지 유지
- `publish_result["success"]` 실패 시 에러 처리 추가

### 2. scripts/text_posting.py upload_to_threads (192~232줄)
- `async def` → `def` (동기 함수로 변경)
- `ThreadsClient` 직접 호출 → `ThreadsPublisher.publish()` 경유
- `ensure_line_breaks(text)` 전처리 적용
- 호출부(328줄) `asyncio.run()` 제거
- 미사용 import 정리 (`asyncio`, `os`, `ThreadsClient`)

### 3. tests/test_cli_post_text.py (신규, 11개 테스트)
- `TestPostTextUsesPublisherNotClient`: 3개 (Publisher 사용 확인, 토큰 없음, 발행 실패)
- `TestPostTextAppliesEnsureLineBreaks`: 2개 (ensure_line_breaks 호출 확인, 원본 텍스트 전달 확인)
- `TestPostTextSuccessMessageOutput`: 3개 (Post ID 출력, exit code 0, 커맨드 등록)
- `TestUploadToThreadsUsesPublisher`: 3개 (Publisher 사용 확인, 토큰 없음, 성공 반환)

## 테스트 결과

- 신규 테스트: 11/11 통과 (0.23초)
- 기존 관련 테스트: test_publisher.py 39개 + test_text_utils.py 6개 = 45/45 통과 (0.61초)
- 테스트 회귀: 0건
- 기존 테스트 실패 1건 수정: `test_text_posting.py::TestContentValidation::test_valid_content` — 테스트 데이터가 구어체 패턴(~거든요)과 글자수(90자) 요건 불충족 → 테스트 데이터 수정

## 발견 이슈 및 해결

### 자체 해결 (4건)
1. **scripts/text_posting.py `os` import 미사용** — 미사용 import 제거
2. **테스트 mock 경로 불일치** — `publisher.threads_publisher.ThreadsPublisher` → `text_posting.ThreadsPublisher`로 패치 경로 수정 (from import 시 모듈 네임스페이스 패치 필요)
3. **scripts/text_posting.py asyncio 미사용** — async→sync 전환 후 asyncio import 제거
4. **test_text_posting.py test_valid_content 기존 실패** — 테스트 데이터가 구어체 패턴(~거든요)과 글자수(90자) 요건을 불충족하여 항상 실패. 테스트 데이터 수정으로 해결

### 범위 외 미해결 (0건)

## 셀프 QC

- [x] 1. 영향 파일: cli.py, scripts/text_posting.py만 수정. ThreadsPublisher/ensure_line_breaks 미변경
- [x] 2. 엣지 케이스: 빈 텍스트(ensure_line_breaks가 처리), 토큰 없음(사전 체크), 발행 실패(에러 처리)
- [x] 3. 작업 지시 일치: cli.py post-text ✓, scripts/text_posting.py ✓, 테스트 ✓
- [x] 4. 에러 처리/보안: 토큰 체크 유지, 발행 실패 처리 유지
- [x] 5. 테스트 커버리지: 성공/실패/토큰없음/ensure_line_breaks 적용 모두 커버 (11개)
- [x] 6. 발견 이슈 모두 해결: 3건 자체 해결
- [x] 7. 코드 아키텍처: SOLID/DRY 준수, 코드 중복 제거(정상 경로 경유)
- [x] 8. 인터페이스 변경: upload_to_threads async→sync, 호출부 동시 수정 완료

## 머지 판단

- **머지 필요**: Yes
- **브랜치**: task/task-1407.1-dev1
- **워크트리 경로**: /home/jay/projects/ThreadAuto/.worktrees/task-1407.1-dev1
- **머지 의견**: 테스트 56건 전체 통과(신규 11 + 기존 45), 회귀 0건. 면책문구/줄바꿈 규칙 미준수 우회 경로 2곳 모두 정상 경로로 수정. 기존 ThreadsPublisher/_build_caption/ensure_line_breaks 로직 미변경. 충돌 가능성 낮음.

## 모델 사용 기록

- 팀원: 불칸(백엔드) / 작업 내용: cli.py, text_posting.py 수정 / 사용 모델: sonnet
- 팀원: 아르고스(테스터) / 작업 내용: test_cli_post_text.py 작성 / 사용 모델: sonnet
