1. 배경 및 문제 정의
현재 상황
- /idea 커맨드로 seed 아이디어를 22-ideas 폴더에 저장하는 시스템이 있음
- thinking-partner 등 다른 세션에서 seed를 발전시켜 새 문서(developing)를 만드는 경우가 있음
- 하지만 seed → developing 관계가 자동으로 연결되지 않음
원하는 것
seed 노트에서 발전된 노트가 만들어지면:
1. 새 문서에 evolved_from 필드로 원본 참조
2. 원본 문서에 evolves_to 필드로 역참조
3. 양방향 링크 자동 생성
2. 설계
연결 유형 정의
| 유형 | 설명 | frontmatter 필드 |
|------|------|-----------------|
| 시간적 연결 | 아이디어 진화 과정 | evolved_from, evolves_to |
| 프로젝트 연결 | 같은 프로젝트 소속 | project |
| 개념적 연결 | 유사한 주제 (향후) | related |트리거 조건
- Write 도구가 22-ideas 폴더에 파일 생성
- 파일에 evolved_from 필드가 존재
- 원본 노트가 존재
작동 흐름
[Claude가 새 문서 Write]
↓
[PostToolUse 훅 트리거]
↓
[idea-develop-hook.sh 실행]
↓
[evolved_from 필드 파싱]
↓
[원본 노트에 evolves_to 자동 추가]
3. 구현
3.1 디렉토리 구조
.claude/
├── settings.local.json # 훅 등록
└── skills/
└── idea-develop/
├── SKILL.md # 스킬 설명
└── scripts/
└── idea-develop-hook.sh # 훅 스크립트3.2 훅 스크립트 핵심 로직
bash
#!/bin/bash
# idea-develop-hook.sh
# stdin에서 JSON 입력 받기
input=$(cat)
file_path=$(echo "$input" | jq -r '.tool_input.file_path // empty')
# 조건 체크: 22-ideas 폴더, .md 파일
if [[ "$file_path" != "22-ideas" ]]; then exit 0; fi
if [[ "$file_path" != *.md ]]; then exit 0; fi
# frontmatter에서 evolved_from 추출
evolved_from=$(awk '/^---$/{p=!p; next} p && /^evolved_from:/' "$file_path" | ...)
# 원본 노트에 evolves_to 추가
# - 단일 값 → 리스트 변환
# - 리스트 → 항목 추가
# - 기존 값 유지
3.3 settings.local.json 훅 등록
json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "/path/to/.claude/skills/idea-develop/scripts/idea-develop-hook.sh"
}
]
}
]
}
}
4. 테스트 결과
테스트 시나리오
1. 원본 노트: 2025-11-21 OOOO 설립 이념.md (status: seed)
2. 발 전 노트: 2025-11-29 OOOO 브랜드 스토리.md (status: developing)
테스트 전
원본 노트:
yaml
---
status: seed
evolves_to: "[[2025-11-29 OOOO 브랜드 스토리]]"
---테스트 실행
bash
echo '{"tool_input": {"file_path": ".../테스트.md"}}' | ./idea-develop-hook.sh테스트 후
원본 노트:
yaml
---
status: seed
evolves_to:
- "[[2025-11-29 OOOO 브랜드 스토리]]"
- "[[2025-11-29 테스트 노트]]"
---결과: 기존 값 유지 + 새 값 추가 성공
5. 핵심 학습 포인트
Claude Code 훅 시스템
| 항목 | 내용 |
|------|------|
| 설정 위치 | .claude/settings.local.json |
| 훅 종류 | PreToolUse, PostToolUse, UserPromptSubmit, Stop 등 |
| 실행 방식 | bash 스크립트 실행 (스킬 직접 호출 불가) |
| 입력 | stdin으로 JSON 전달 (`tool_input.file_path` 등) |버그 수정 경험
- 문제: 단일 값을 리스트로 변환할 때 기존 값 덮어씀
- 해결: 기존 값 추출 → 리스트로 변환 시 기존 값 + 새 값 모두 포함
6. related 연결 구현 (추가 기능)
6.1 개요
evolved_from → evolves_to 연결 외에, related 필드로 관련 노트를 자동 연결하는 기능 추가.
6.2 두 가지 방식
| 방식 | 설명 | 장점 | 단점 |
|------|------|------|------|
| 태그 기반 | 같은 태그를 가진 노트 찾기 | 빠름, 비용 없음 | 정확도 낮음 |
| 벡터 검색 | OpenAI Vector Store로 시맨틱 검색 | 의미적 유사도 | API 비용, 느림 |6.3 구현
find_related.py (벡터 검색용):
```python
# .openai-pkms-rag/find_related.py
def find_related_files(query: str, max_results: int = 5) -> list:
# OpenAI Vector Store에서 유사 문서 검색
# CRITICAL 우선순위 스토어만 검색 (속도)
# 파일 이름만 반환
```훅 스크립트 확장:
``bash
# 1. 태그 기반 related 찾기
tags=$(grep -o '#[a-zA-Z0-9_-]*' "$file_path")
for tag in $tags; do
matching_files=$(grep -l "$tag" "$ideas_folder"/*.md)
done
# 2. 벡터 검색 related (선택적)
if [[ "$ENABLE_VECTOR_SEARCH" == "true" ]]; then
vector_results=$(python3 find_related.py "$query" --max 3)
fi
# 3. frontmatter에 related 추가
related:
- "[[관련 노트 1]]"
- "[[관련 노트 2]]"
```6.4 테스트 결과
테스트 전:
```yaml
---
status: developing
evolved_from: "[[원본 노트]]"
project: OOOO
---
```테스트 후:
``yaml
---
status: developing
related:
- "[[Mobile]]"
- "[[00-Ideas-Dashboard]]"
- "[[2025-11-19]]"
evolved_from: "[[원본 노트]]"
project: OOOO
---
```결과: 태그 기반 related 자동 추가 성공
7. 향후 개선 사항
| 우선순위 | 항목 | 설명 |
|---------|------|------|
| 중간 | project 자동 추출 | 태그에서 프로젝트명 자동 감지 |
| 낮음 | 양방향 동기화 | evolves_to 삭제 시 evolved_from도 정리 |
| 낮음 | related 정확도 개선 | 더 관련성 높은 노트 추천 |8. 사용 방법
자동 실행 (Claude Code 재시작 후)
새 문서 작성 시 evolved_from 필드만 넣으면 자동 연결:
```yaml
---
status: developing
evolved_from: "[[원본 노트 제목]]"
---
```수동 테스트
```bash
echo '{"tool_input": {"file_path": "/path/to/file.md"}}' | \
./.claude/skills/idea-develop/scripts/idea-develop-hook.sh
```9. 결론
Claude Code의 PostToolUse 훅을 활용하여 제텔카스텐 스타일의 양방향 링크를 자동 생성하는 시스템을 구축했다.
핵심은:
1. 훅은 스킬을 직접 호출할 수 없지만, bash 스크립트로 원하는 로직 구현 가능
2. 조건부 실행: 특정 폴더, 특정 필드가 있을 때만 작동
3. 기존 데이터 보존: YAML 파싱 시 기존 값 유지 중요
이를 통해 아이디어의 진화 과정을 자동으로 추적할 수 있게 되었다.
너무 편리함. 이제 아이디어 만들고 -> 발전시키고 -> 그 다음은 프로젝트화 하는 과정으로 가겟슴