제텔카스텐 자동 연결 시스템 구축 - idea-develop 훅 만들기

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 파싱 시 기존 값 유지 중요

이를 통해 아이디어의 진화 과정을 자동으로 추적할 수 있게 되었다.

너무 편리함. 이제 아이디어 만들고 -> 발전시키고 -> 그 다음은 프로젝트화 하는 과정으로 가겟슴

2
3개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요