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

- 작성자: [민트](https://community.clauders.ai/member/imported-member-smUiDI8zkn)
- 공간: [비즈니스 / 재테크](https://community.clauders.ai/business)
- 게시: 2025-12-01
- 연재: [고객에서 출발하는 사업 실행 계획](https://community.clauders.ai/series/working-backwards-roadmap) 2/3편
- 태그: #비즈니스로드맵
- 주소: https://community.clauders.ai/business/post/%EC%A0%9C%ED%85%94%EC%B9%B4%EC%8A%A4%ED%85%90-%EC%9E%90%EB%8F%99-%EC%97%B0%EA%B2%B0-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%EC%B6%95-idea-develop-%ED%9B%85-%EB%A7%8C%EB%93%A4%EA%B8%B0-8dffbfc0-680b-8d74-857b-a2eea420129a

---

### 연결 유형 정의

```
| 유형 | 설명 | frontmatter 필드 |
|------|------|-----------------|
| 시간적 연결 | 아이디어 진화 과정 | evolved_from, evolves_to |
| 프로젝트 연결 | 같은 프로젝트 소속 | project |
| 개념적 연결 | 유사한 주제 (향후) | related |
```

###  트리거 조건

- **Write 도구**가 `22-ideas` 폴더에 파일 생성

- 파일에 `evolved_from` 필드가 존재

- 원본 노트가 존재

### 작동 흐름

```
[Claude가 새 문서 Write]
         ↓
[PostToolUse 훅 트리거]
         ↓
[idea-develop-hook.sh 실행]
         ↓
[evolved_from 필드 파싱]
         ↓
[원본 노트에 evolves_to 자동 추가]
```

### 3.1 디렉토리 구조

```
.claude/
├── settings.local.json          # 훅 등록
└── skills/
    └── idea-develop/
        ├── SKILL.md             # 스킬 설명
        └── scripts/
            └── idea-develop-hook.sh  # 훅 스크립트
```

### 3.2 훅 스크립트 핵심 로직

```
#!/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 훅 등록

```
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "/path/to/.claude/skills/idea-develop/scripts/idea-develop-hook.sh"
          }
        ]
      }
    ]
  }
}
```

### 테스트 시나리오

1. 원본 노트: `2025-11-21 OOOO 설립 이념.md` (status: seed)

2. 발전 노트: `2025-11-29 OOOO 브랜드 스토리.md` (status: developing)

### 테스트 전

**원본 노트:**

```
---
status: seed
evolves_to: "[[2025-11-29 OOOO 브랜드 스토리]]"
---
```

### 테스트 실행

```
echo '{"tool_input": {"file_path": ".../테스트.md"}}' | ./idea-develop-hook.sh
```

###  테스트 후

**원본 노트:**

```
---

status: seed

evolves_to:

  - "[[2025-11-29 OOOO 브랜드 스토리]]"

  - "[[2025-11-29 테스트 노트]]"

---
```

**결과**: 기존 값 유지 + 새 값 추가 **성공**

###  Claude Code 훅 시스템

```
| 항목 | 내용 |
|------|------|
| 설정 위치 | .claude/settings.local.json |
| 훅 종류 | PreToolUse, PostToolUse, UserPromptSubmit, Stop 등 |
| 실행 방식 | bash 스크립트 실행 (스킬 직접 호출 불가) |
| 입력 | stdin으로 JSON 전달 (`tool_input.file_path` 등) |
```

### 버그 수정 경험

- **문제**: 단일 값을 리스트로 변환할 때 기존 값 덮어씀

- **해결**: 기존 값 추출 → 리스트로 변환 시 기존 값 + 새 값 모두 포함

### 6.1 개요

`evolved_from → evolves_to` 연결 외에, **related** 필드로 관련 노트를 자동 연결하는 기능 추가.

### 6.2 두 가지 방식

```
| 방식 | 설명 | 장점 | 단점 |
|------|------|------|------|
| 태그 기반 | 같은 태그를 가진 노트 찾기 | 빠름, 비용 없음 | 정확도 낮음 |
| 벡터 검색 | OpenAI Vector Store로 시맨틱 검색 | 의미적 유사도 | API 비용, 느림 |
```

### 6.3 구현

**find_**[**related.py**](http://related.py) (벡터 검색용):

```
# .openai-pkms-rag/find_related.py
def find_related_files(query: str, max_results: int = 5) -> list:
    # OpenAI Vector Store에서 유사 문서 검색
    # CRITICAL 우선순위 스토어만 검색 (속도)
    # 파일 이름만 반환
```

**훅 스크립트 확장**:

```
# 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 테스트 결과

**테스트 전:**

```
---
status: developing
evolved_from: "[[원본 노트]]"
project: OOOO
---
```

**테스트 후:**

```
---
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` 필드만 넣으면 자동 연결:

```
---
status: developing
evolved_from: "[[원본 노트 제목]]"
---
```

### 수동 테스트

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

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

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