issue-maplisted
Install: claude install-skill Finfra/fpm
> ⚠️ **글로벌 SCAR 변경 가드** (Issue46)
>
> 본 스킬은 모든 프로젝트가 공유. 즉흥 수정 금지.
>
> * cwd ≠ `~/.claude/` → 즉시 수정 금지, `~/.claude/Issue.md` 이슈 등록 후 별도 세션에서 처리
> * 영속 설계 SSOT: (자기 자신이 SSOT)
> * 절차: `~/.claude/rules/global-scar-change-rules.md`
# 목적
`Issue.md` 는 이슈를 나열하지만 **무엇이 무엇을 막고 있는지**는 텍스트만으로 파악하기 어렵다. 본 스킬은 `Issue.md` 를 단일 SSOT 로 삼아 의존 관계도·임계 경로·착수 가능 여부를 한 장의 HTML(`Issue_map.htm`)로 생성한다.
산출물은 **fPm hub 렌더물이 아니라 프로젝트에서 지속 관리되는 독립 문서**다. 다이어그램을 SVG 로 선렌더해 파일 안에 넣으므로 서버·네트워크 없이 파일 하나로 열람된다.
nPTiR(`Issue.md`)을 쓰는 **모든 프로젝트**에서 사용 가능한 글로벌 SCAR 다 (Issue246 으로 prj58 로컬에서 승격).
# 트리거
* `/issue-map` 슬래시 커맨드
* "이슈맵 갱신", "issue map 만들어줘", "의존 관계도 다시 그려줘"
* 이슈 등록·종결 직후 지도 갱신이 필요할 때
* **자동 호출 (Issue253 종결 · Issue264 등록)**: `Issue_map.htm` 이 존재하는 프로젝트는 아래 두 경로에서 매번 자동 재생성됨 — 수동 실행은 등록·종결 사이클 밖에서 필요할 때만
- `issue-closer-g` **3-2** 단계 — 이슈 종결 시 (Issue253)
- `issue-reg-g` **5-1** 단계 — 이슈 등록 시 (Issue264). 등록이 노드·화살표를 늘리는 이벤트이므로 종결과 대칭 적용
# 실행
**nPTiR 루트(= `Issue.md` 가 있는 디렉토리)에서 실행**한다. 생성기는 cwd 기준으로 `Issue.md` 를 읽고 `Issue_map.htm` 을 쓴다.
## 생성기 경로 해석 (`$BIM` — 플러그인·글로벌 양쪽 지원, Issue316)
본 스킬은 **글로벌 SCAR(`~/.claude/skills/issue-map/`)** 와 **fpm-core 플러그인 번들(`${CLAUDE_PLUGIN_ROOT}/skills/fpm-issue-map/`)** 두 경로로 배포된다. 경로를 하드코딩하면 플러그인 전용 설치 환경(prj1 미설치 머신)에서 파일을 못 찾아 영구 실패한다 — 아래 resolver 를 **먼저 실행**해 `$BIM` 을 확정한 뒤 그것만 호출한다.
```bash
BIM=""
for c in "${CLAUDE_PLUGIN_ROOT:-/nonexistent}/skills/fpm-issue-map/build_issue_map.py" \
"$HOME/.claude/skills/issue-map/build_issue_map.py";