doc-driftlisted
Install: claude install-skill Kyungjong-kim/claude-code-harness
# Doc Drift
> 기능 문서를 작성·갱신하는 규율(게이트)이 문서 *작성*은 닫아도, 코드만 바뀌고 문서가 안 따라간 *노후*는 못 막는다.
> 이 스킬은 문서가 참조하는 source 파일의 git 변경 시점을 문서 갱신 시점과 비교해 stale 문서를 찾는다.
> **읽기 전용 — 탐지만.** 발견 후 사용자 확인 하에 갱신.
저장소 루트에서 실행. 특정 영역만 보려면 인자로 경로 전달(예: `src/docs/pages`).
> **쉘 호환(중요)**: 모든 쉘(bash·zsh·sh/dash)에서 동작하도록 작성. 금지 — `for x in $var`(zsh 단어분리 안 함), `< <(...)`(POSIX sh 미지원). **임시파일 redirect**(`done < "$tmp"` — 카운터 유지)와 **내부 파이프 결과 캡처**(`result=$(... | while read)`)를 쓴다.
> **경로 주의**: 문서의 source 경로는 보통 **프로젝트 루트 기준 상대경로**(`src/...`)다. 모노레포면 문서가 속한 패키지 prefix를 붙여 해소한다(`resolve()`).
### 통합 실행 (영역 인자 선택)
```bash
SCOPE="${ARGS:-.}"
tmp=$(mktemp)
# 문서 파일 패턴은 프로젝트 컨벤션에 맞게 조정 (예: FE_*.md·BE_*.md)
find $SCOPE \( -name "FE_*.md" -o -name "BE_*.md" \) -not -path "*/node_modules/*" -not -path "*/archive/*" > "$tmp"
proj_prefix() { # 문서 경로 → source 상대경로 앞에 붙일 패키지 prefix (모노레포 대응)
case "$1" in
*/docs/*) printf '%s/' "$(echo "$1" | cut -d/ -f1)" ;; # <pkg>/docs/... → <pkg>/
*) printf '' ;; # 루트 docs/... → prefix 없음
esac
}
resolve() { for c in "$2$1" "$1"; do [ -e "$c" ] && { printf '%s' "$c"; return 0; }; done; return 1; }
stale_n=0; ok_n=0; unverif=0; nofield=0
while IFS= read -r doc; do
[ -z "$doc" ] && continue
grep -q "최종 확인\|Last verified\|last-verified" "$doc" || nofield=$((nofield+1))
doc_epoch=$(git log -1 --format=%ct -- "$doc" 2>/dev/null)
[ -z "$doc_epoch" ] && { echo "⚠️ 미커밋(비교 불가): $doc"; continue; }
prefix=$(proj_prefix "$doc"