hypomnema 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +18 -0
- package/.claude-plugin/plugin.json +1 -1
- package/README.ko.md +252 -78
- package/README.md +251 -77
- package/docs/ARCHITECTURE.md +309 -89
- package/docs/CONTRIBUTING.md +175 -44
- package/docs/assets/logo/apple-touch-icon.png +0 -0
- package/docs/assets/logo/cover-devto.png +0 -0
- package/docs/assets/logo/cover-devto.svg +70 -0
- package/docs/assets/logo/favicon-16.png +0 -0
- package/docs/assets/logo/favicon-32.png +0 -0
- package/docs/assets/logo/favicon-64.png +0 -0
- package/docs/assets/logo/icon-192.png +0 -0
- package/docs/assets/logo/icon-512.png +0 -0
- package/docs/assets/logo/logo.svg +60 -0
- package/docs/assets/logo/social-card.png +0 -0
- package/docs/assets/logo/social-card.svg +78 -0
- package/docs/assets/logo/wordmark.png +0 -0
- package/docs/assets/logo/wordmark.svg +47 -0
- package/package.json +1 -1
- package/scripts/bump-version.mjs +4 -0
- package/scripts/ingest.mjs +9 -4
- package/scripts/init.mjs +151 -9
- package/scripts/lib/pkg-json.mjs +59 -0
- package/scripts/lint.mjs +21 -1
- package/scripts/uninstall.mjs +63 -3
- package/scripts/upgrade.mjs +210 -15
- package/templates/hypo-config.md +1 -1
- package/templates/projects/_template/index.md +3 -0
- package/docs/TEST-CASES.md +0 -580
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/claude-code-plugin-marketplace.json",
|
|
3
|
+
"name": "hypomnema",
|
|
4
|
+
"description": "LLM-native personal wiki system for Claude Code — session-aware knowledge base with hooks, slash commands, and a synthesis pipeline.",
|
|
5
|
+
"owner": {
|
|
6
|
+
"name": "sk-lim19f",
|
|
7
|
+
"email": "limsangkyu0219@gmail.com"
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
{
|
|
11
|
+
"name": "hypomnema",
|
|
12
|
+
"source": "./",
|
|
13
|
+
"description": "LLM-native personal wiki — session-aware knowledge base for Claude Code",
|
|
14
|
+
"version": "1.0.1",
|
|
15
|
+
"homepage": "https://github.com/sk-lim19f/Hypomnema"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
package/README.ko.md
CHANGED
|
@@ -1,93 +1,245 @@
|
|
|
1
1
|
[English](README.md) | 한국어
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="docs/assets/logo/wordmark.svg" alt="Hypomnema" width="520">
|
|
5
|
+
</p>
|
|
4
6
|
|
|
5
7
|
# Hypomnema
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
[](https://www.npmjs.com/package/hypomnema)
|
|
10
|
+
[](https://www.npmjs.com/package/hypomnema)
|
|
11
|
+
[](https://nodejs.org)
|
|
12
|
+
[](https://opensource.org/licenses/MIT)
|
|
13
|
+
[](tests/runner.mjs)
|
|
14
|
+
[](https://github.com/sk-lim19f/Hypomnema/stargazers)
|
|
15
|
+
|
|
16
|
+
**Claude Code를 위한 LLM 네이티브 개인 위키. 복리로 성장하는 지식.**
|
|
17
|
+
|
|
18
|
+
_노트하지 마세요. Claude가 합성하게 하세요._
|
|
8
19
|
|
|
9
|
-
|
|
20
|
+
[빠른 시작](#빠른-시작) • [다른 시스템과의 비교](#다른-시스템과의-비교) • [설계 결정](#설계-결정) • [기능](#기능) • [아키텍처](docs/ARCHITECTURE.md) • [기여](docs/CONTRIBUTING.md)
|
|
21
|
+
|
|
22
|
+
> Andrej Karpathy의 "LLM 네이티브 위키" 스케치에서 영감을 받아, 10개월간의 개인 운영 경험으로 다듬어진 도구입니다. 캡처 → 합성 → 검색 → 세션 재개로 이어지는 전체 라이프사이클을 Claude Code 명령어와 라이프사이클 훅으로 제공합니다.
|
|
10
23
|
|
|
11
24
|
---
|
|
12
25
|
|
|
13
26
|
## 빠른 시작
|
|
14
27
|
|
|
28
|
+
Hypomnema는 **설치 경로 두 가지**를 제공합니다. 둘 다 동일한 위키·훅·`/hypo:*` 슬래시 커맨드를 만듭니다.
|
|
29
|
+
|
|
30
|
+
### Path A — Claude Code 플러그인 (권장)
|
|
31
|
+
|
|
32
|
+
Claude Code 안에서:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
/plugin marketplace add sk-lim19f/Hypomnema
|
|
36
|
+
/plugin install hypomnema@hypomnema
|
|
37
|
+
/hypo:init
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
플러그인 설치 단계에서 패키지의 `commands/` 디렉터리에서 `/hypo:*` 커맨드가 등록되고, `/hypo:init`이 위키 스캐폴딩과 `~/.claude/settings.json` 훅 병합을 수행합니다.
|
|
41
|
+
|
|
42
|
+
### Path B — npm CLI
|
|
43
|
+
|
|
44
|
+
셸에서:
|
|
45
|
+
|
|
15
46
|
```bash
|
|
16
|
-
npm install -g hypomnema
|
|
47
|
+
npm install -g hypomnema
|
|
48
|
+
hypomnema
|
|
17
49
|
```
|
|
18
50
|
|
|
19
|
-
Claude Code
|
|
51
|
+
`hypomnema`(또는 `hypomnema --help`로 플래그 확인)는 위키 스캐폴딩과 훅 설치를 수행하고, **추가로** `~/.claude/commands/hypo/`에 슬래시 커맨드 파일까지 복사해서 이후 Claude Code 안에서 `/hypo:*`이 동작합니다. 다음 `hypomnema upgrade` 실행은 파일별 SHA 추적으로 사용자가 손댄 파일을 덮어쓰지 않습니다.
|
|
52
|
+
|
|
53
|
+
> 어느 경로든: 첫 실행 후 Claude Code를 재시작(또는 새 세션 열기) 해야 새 훅과 슬래시 커맨드가 반영됩니다.
|
|
54
|
+
|
|
55
|
+
### Step 2: 위키처럼 사용
|
|
20
56
|
|
|
21
57
|
```
|
|
22
|
-
/hypo:
|
|
58
|
+
/hypo:ingest https://example.com/some-article-or-paper.pdf
|
|
59
|
+
/hypo:query "내가 X에 대해 알고 있는 것 정리해줘"
|
|
60
|
+
/hypo:feedback "버그 픽스 설명할 때는 항상 테스트 명령어를 같이 알려줘"
|
|
23
61
|
```
|
|
24
62
|
|
|
25
|
-
|
|
63
|
+
나머지는 훅이 처리합니다 — 자동 staging, 자동 commit/push, 세션 상태 주입, 룩업 신호.
|
|
64
|
+
|
|
65
|
+
> **여러 기기 동기화:** 위키는 처음부터 git 저장소입니다. remote만 한 번 연결해 두면, 이후 매 세션 종료 시 `Stop` 훅이 동기화를 유지합니다.
|
|
26
66
|
|
|
27
67
|
---
|
|
28
68
|
|
|
29
|
-
##
|
|
69
|
+
## Hypomnema가 필요한 이유
|
|
30
70
|
|
|
31
|
-
|
|
71
|
+
개인 지식 도구는 보통 네 가지 부류에 속하고, 각각 다른 지점에서 무너집니다:
|
|
72
|
+
|
|
73
|
+
| | 통증 | 왜 복리가 안 되는가 |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| **노트 볼트** (마크다운 기반, 로컬 우선) | 수동 캡처, 수동 링크, 수동 재독 | 노트가 독립적으로 머무름. 합성 없음 |
|
|
76
|
+
| **클라우드 지식 플랫폼** (페이지·DB 하이브리드) | 캡처는 빠르나 검색이 느림 | 키워드 기반 검색. LLM이 직접 접근 못 함 |
|
|
77
|
+
| **RAG / 벡터 검색 스택** | 파이프라인·임베딩·청킹 | 청크 반환에 그침. 청크가 무한정 증가 |
|
|
78
|
+
| **AI 네이티브 노트북** (독자 포맷의 "세컨드 브레인" 앱) | 처음엔 마법 같음 | 폐쇄 포맷·git 미지원·검색 로직 불투명·벤더 락인 |
|
|
79
|
+
| **코드 전용 위키** (레포에서 자동 생성) | 수동 작업 0 | 코드만 다룸. 의사결정·연구·AI 행동 교정 캡처 불가 |
|
|
80
|
+
|
|
81
|
+
Hypomnema는 이 빈틈을 메웁니다 — **평문 마크다운 위에서의 구조화된 합성, Claude Code 라이프사이클 기반 구동, git 버전 관리, 기본 로컬 우선.**
|
|
32
82
|
|
|
33
|
-
```bash
|
|
34
|
-
git -C ~/hypomnema remote add origin <저장소-URL>
|
|
35
|
-
git -C ~/hypomnema push -u origin HEAD
|
|
36
83
|
```
|
|
84
|
+
노트 볼트 ───► 전부 저장하나 합성은 0
|
|
85
|
+
클라우드 플랫폼 ───► 캡처는 빠르나 검색이 느림
|
|
86
|
+
RAG / 벡터 DB ───► 청크는 돌려주지만 페이지는 못 줌
|
|
87
|
+
AI 노트북 ───► 블랙박스, git 없음, 이식성 없음
|
|
88
|
+
코드 위키 ───► 코드만, 의사결정/연구/피드백 없음
|
|
37
89
|
|
|
38
|
-
|
|
90
|
+
Hypomnema ───► 합성 · 마크다운 · git · 훅 · 로컬
|
|
91
|
+
```
|
|
39
92
|
|
|
40
93
|
---
|
|
41
94
|
|
|
42
|
-
##
|
|
95
|
+
## 다른 시스템과의 비교
|
|
96
|
+
|
|
97
|
+
| | **Hypomnema** | 노트 볼트 | 클라우드 플랫폼 | RAG / 벡터 DB | AI 노트북 | 코드 위키 |
|
|
98
|
+
|---|---|---|---|---|---|---|
|
|
99
|
+
| **캡처 노력** | URL 붙여넣기 → 완료 | 직접 입력 | 직접 입력 | 업로드 + 임베딩 | 붙여넣기 / 채팅 | 레포에서 자동 |
|
|
100
|
+
| **저장 단위** | 합성된 **페이지** | 노트 | 페이지 / 블록 | 벡터 청크 | 불투명 메모리 | 코드 심볼 |
|
|
101
|
+
| **지식 성장** | 새 소스가 기존 페이지를 **갱신** | 각 노트가 독립 | 각 페이지가 독립 | 청크가 무한 증가 | 블랙박스 | 레포가 곧 한계 |
|
|
102
|
+
| **검색** | LLM이 근거 있는 답변 합성 | 전문 검색 / 백링크 | 키워드 검색 | 최근접 청크 | 불투명 | 코드 검색 |
|
|
103
|
+
| **세션 연속성** | `hot.md` + `session-state.md`로 자동 재개 | 없음 | 없음 | 없음 | 일부 | 없음 |
|
|
104
|
+
| **워크플로 통합** | Claude Code 네이티브 | 별도 앱 | 별도 앱 / 브라우저 | 별도 서비스 | 별도 앱 | 별도 사이트 |
|
|
105
|
+
| **포맷** | 평문 마크다운 + frontmatter | 마크다운 | 독자 포맷 | 벡터 스토어 | 독자 포맷 | HTML |
|
|
106
|
+
| **백엔드** | 로컬 파일 + git | 로컬 파일 | SaaS | 서비스 / DB | SaaS | 서비스 |
|
|
107
|
+
| **행동 튜닝** | `/hypo:feedback` → 영구 규칙 | 없음 | 없음 | 없음 | 일부 | 없음 |
|
|
108
|
+
| **셋업 비용** | 명령 1개 | 설치 1번 | 가입 | 파이프라인 구축 | 가입 | 레포 연결 |
|
|
109
|
+
| **락인** | 0 (마크다운 + git) | 낮음 | 높음 | 중간 | 높음 | 중간 |
|
|
110
|
+
|
|
111
|
+
### 이 트레이드오프가 가져오는 것
|
|
112
|
+
|
|
113
|
+
- **저장이 아닌 합성.** 다 못 읽은 글들의 무덤이 만들어지지 않습니다. `/hypo:ingest`가 매번 구조화된 페이지를 만들고, 같은 주제의 후속 인제스트는 그 페이지를 *갱신*합니다.
|
|
114
|
+
- **복리적 밀도.** 100개의 소스를 모은 위키가 100개의 단절된 페이지가 되어선 안 됩니다. 실사용 3개월 시점에서 페이지 수는 sub-linear로 늘고 교차 링크는 super-linear로 늘어납니다.
|
|
115
|
+
- **컨텍스트 전환 0.** 이미 Claude Code 안에 있습니다. 위키는 슬래시 명령 하나 떨어진 거리 — 새 탭도, 새 앱도, 새 로그인도 없습니다.
|
|
116
|
+
- **미래 안전한 저장소.** 평문 마크다운 + git이라는 의미는 — 20년 뒤에도 읽을 수 있고, 오프라인에서도 grep 되며, 언제든 다른 도구로 옮겨갈 수 있고, 아직 만나지 않은 미래의 AI 어시스턴트도 그대로 이해할 수 있다는 뜻입니다.
|
|
43
117
|
|
|
44
|
-
|
|
45
|
-
|---|---|---|---|
|
|
46
|
-
| **캡처 노력** | URL 붙여넣기 → 완료 | 직접 노트 작성 | 업로드 + 임베딩 파이프라인 |
|
|
47
|
-
| **지식 성장** | 새 소스가 기존 페이지를 업데이트 | 각 노트가 독립적 | 청크가 무한정 늘어남 |
|
|
48
|
-
| **검색** | LLM이 근거 있는 답변 합성 | 전문 검색 | 최근접 이웃 청크 |
|
|
49
|
-
| **워크플로 통합** | Claude Code 내부에서 동작 | 별도 앱 / 브라우저 탭 | 별도 서비스 |
|
|
118
|
+
---
|
|
50
119
|
|
|
51
|
-
|
|
120
|
+
## 설계 결정
|
|
52
121
|
|
|
53
|
-
|
|
54
|
-
2. **복리 성장 페이지.** 새 소스가 기존 페이지와 겹치면 Claude가 해당 페이지를 업데이트합니다. 위키는 단순히 커지는 것이 아니라 더 촘촘하고 연결되어 성장합니다.
|
|
55
|
-
3. **무마찰 훅.** 세션 시작·종료, 자동 스테이징, 자동 커밋이 Claude Code 라이프사이클 훅을 통해 자동으로 실행됩니다. 위키 관리를 위해 컨텍스트 전환이 필요 없습니다.
|
|
56
|
-
4. **워크플로 네이티브.** 별도 앱, 내보내기/가져오기, 동기화 서비스가 없습니다. 이미 열려 있는 Claude Code 세션 안에서 동작합니다.
|
|
122
|
+
각 결정이 왜 이 모양인지:
|
|
57
123
|
|
|
58
|
-
|
|
124
|
+
### 1. 왜 청크 기반 RAG가 아니라 **합성**인가
|
|
59
125
|
|
|
60
|
-
|
|
126
|
+
RAG는 *낯선* 코퍼스에 강합니다 — 100만 페이지 법률 아카이브를 주면 관련 단편을 잘 찾아냅니다. 그런데 *개인* 지식의 실패 모드는 정반대입니다:
|
|
127
|
+
|
|
128
|
+
- 코퍼스가 작지만 **중복도가 매우 높습니다** (같은 주제의 글 3편).
|
|
129
|
+
- 사용자는 단편이 아니라 **관점**을 원합니다.
|
|
130
|
+
- 청크 수는 캡처에 비례해 선형 증가합니다 — 지식이 늘지 않아도.
|
|
131
|
+
|
|
132
|
+
Hypomnema는 청크가 아니라 페이지를 지식 단위로 다룹니다. 새 소스는 페이지에 대해 reconcile됩니다. 결과물은 위키 문서처럼 읽힙니다 — 정확히 위키 문서이기 때문입니다.
|
|
133
|
+
|
|
134
|
+
### 2. 왜 독자 포맷이 아니라 **마크다운 + git**인가
|
|
135
|
+
|
|
136
|
+
개인 지식 베이스는 어떤 한 도구보다 오래 살아남아야 합니다. 마크다운은 살아남습니다. git도 살아남습니다. 둘 다 LLM 네이티브입니다 (어떤 모델이든 읽습니다). 둘 다 오프라인에서 동작합니다. 둘 다 30년치의 도구 생태계가 받쳐줍니다. 우리는 *지루한* 스택을 의도적으로 골랐습니다 — 흥미로운 부분은 *Claude가 그 위에서 무엇을 하는가*이기 때문입니다.
|
|
137
|
+
|
|
138
|
+
### 3. 왜 수동 명령이 아니라 **라이프사이클 훅**인가
|
|
139
|
+
|
|
140
|
+
마찰은 개인 지식 시스템의 조용한 살인자입니다. 한 가지 생각을 저장하기 위해 클릭이 3번 필요하면, 사람은 멈춥니다. Hypomnema는 Claude Code가 이미 발생시키는 이벤트에 올라탑니다:
|
|
141
|
+
|
|
142
|
+
| 이벤트 | 그렇지 않으면 수동으로 해야 할 일 |
|
|
143
|
+
|---|---|
|
|
144
|
+
| `SessionStart` | "어디까지 했더라?" — `hot.md` / `session-state.md` 읽기 |
|
|
145
|
+
| `UserPromptSubmit` | "이거 이미 알고 있나?" — BM25 룩업, top-3 주입 |
|
|
146
|
+
| `PreCompact` | "session log 안 썼나?" — 체크리스트 가드 |
|
|
147
|
+
| `PostToolUse` (Write/Edit) | `git add` |
|
|
148
|
+
| `Stop` | `git pull --rebase && git commit && git push` |
|
|
149
|
+
|
|
150
|
+
설치하고 나면 위키를 *관리*하는 일을 멈추게 됩니다. 그냥 쌓입니다.
|
|
151
|
+
|
|
152
|
+
### 4. 왜 재개를 위해 **`hot.md` 캐시**를 쓰는가
|
|
61
153
|
|
|
62
|
-
|
|
63
|
-
Kubernetes 문서와 블로그 글을 읽고 있습니다. 각 URL을 `/hypo:ingest`에 넣으면 됩니다. 세 번째 글을 처리할 때쯤 Claude는 새 페이지를 만드는 대신 기존 `kubernetes-networking.md`를 업데이트합니다. 일주일 후 `/hypo:query "pod CIDR 할당은 어떻게 동작하나요?"`를 실행하면 자신의 노트를 인용한 합성 답변을 받을 수 있습니다.
|
|
154
|
+
일시 중단된 프로젝트에서 가장 비싼 작업은 일을 다시 하는 게 아니라 **컨텍스트를 다시 쌓는 일**입니다. `session-log/`를 처음부터 다시 읽는 것은 분 단위 시간과 토큰을 먹지만, 한 페이지짜리 `hot.md`를 읽는 건 둘 다 거의 0입니다. 그래서 가장 최근 상태를 명시적으로 캐싱하고, `Stop`에서 재생성하고, `SessionStart`에서 주입합니다. 재개는 O(1).
|
|
64
155
|
|
|
65
|
-
**
|
|
66
|
-
중요한 변경 사항을 머지하기 전에 설계 문서나 PR 설명을 `/hypo:ingest`로 처리합니다. Claude가 컨텍스트, 트레이드오프, 결정 사항을 담은 ADR 스타일 페이지를 만듭니다. 이후 `[[wikilink]]` 참조가 관련 프롬프트에 근거를 직접 주입합니다.
|
|
156
|
+
### 5. 왜 **feedback → behavior** 파이프라인인가
|
|
67
157
|
|
|
68
|
-
|
|
69
|
-
몇 주에 걸쳐 특정 주제의 논문들을 읽고 있습니다. 각 `/hypo:ingest` 실행이 논문을 합성하고 기존 페이지와 교차 연결합니다. 언제든 `/hypo:query`를 실행하면 자신의 노트에 근거한 문헌 리뷰 스타일의 요약을 얻을 수 있습니다.
|
|
158
|
+
대부분의 AI 도구는 교정을 *현재 대화에 한해* 받아들입니다. 영속하지 않습니다. Hypomnema는 모든 `/hypo:feedback`을 `pages/feedback/`으로 흘려보내고, 영속성 있는 규칙은 `CLAUDE.md`의 `<learned_behaviors>` 블록으로 승격됩니다 — 이후 모든 세션, 위키를 pull하는 모든 기기에서 살아 있습니다.
|
|
70
159
|
|
|
71
|
-
**
|
|
72
|
-
Claude가 잘못하거나 정확히 맞았을 때마다 `/hypo:feedback`을 실행합니다. 교정 사항이 `pages/feedback/`에 저장되고 세션 시작 시 주입되어, 같은 실수가 반복되지 않습니다 — 하나의 대화가 아닌 세션 간에 걸쳐서요.
|
|
160
|
+
### 6. 왜 **API 키도, 벡터 DB도, 외부 서비스도** 없는가
|
|
73
161
|
|
|
74
|
-
|
|
75
|
-
|
|
162
|
+
모든 외부 의존은 미래의 실패 모드입니다 — 깨지거나, 인수되거나, 단종되거나, 자격증명이 새거나. Hypomnema는 Node.js 스크립트 + 마크다운 파일 + git이 전부입니다. "AI" 부분은 Claude 자체뿐이고, 그건 어차피 켜져 있습니다.
|
|
163
|
+
|
|
164
|
+
### 7. 왜 privacy mode 플래그가 아니라 **`.hypoignore`** 인가
|
|
165
|
+
|
|
166
|
+
v1.0에서는 `personal / shared / public` 3-mode를 만들었습니다. 현실과 부딪히자마자 무너졌습니다 — 모든 privacy 결정은 결국 *경로 단위* 질문이었고, 그 질문은 단일 파일(`.hypoignore`)이 네이티브로 처리합니다. v1.1은 mode 개념을 통째로 삭제했습니다. 단일 파일, 단일 진실 소스.
|
|
76
167
|
|
|
77
168
|
---
|
|
78
169
|
|
|
79
|
-
##
|
|
170
|
+
## 기능
|
|
171
|
+
|
|
172
|
+
### 합성 명령어
|
|
173
|
+
|
|
174
|
+
8개 명령어가 캡처 → 검색 → 통합 사이클 전체를 커버합니다.
|
|
175
|
+
|
|
176
|
+
| 명령어 | 하는 일 | 언제 쓰나 |
|
|
177
|
+
|---|---|---|
|
|
178
|
+
| `/hypo:ingest` | 원본을 `sources/`에 보관하고 Claude가 `pages/`에 구조화된 페이지를 합성. 셸 헬퍼(`scripts/ingest.mjs`)는 read-only — 아직 ingest되지 않은 소스를 *목록만* 출력 | 보관할 가치가 있는 글을 읽었을 때 |
|
|
179
|
+
| `/hypo:query` | BM25 검색 + LLM 합성 + `[[wikilink]]` 인용 | 자기 노트에 근거한 답변이 필요할 때 |
|
|
180
|
+
| `/hypo:crystallize` | 초안 합성 + 11단계 session-close 체크리스트 | 비자명한 세션 종료 시 |
|
|
181
|
+
| `/hypo:resume` | 활성 프로젝트의 가장 최근 세션 상태 로드 | 일시 중단된 프로젝트로 돌아올 때 |
|
|
182
|
+
| `/hypo:feedback` | AI 행동 교정 기록, 영구 규칙으로 승격 가능 | Claude가 잘못 하거나 정확히 잘 했을 때 |
|
|
183
|
+
| `/hypo:verify` | `verify_by` frontmatter 페이지 감사 | 시간 제약 지식이 노후화됐을 가능성이 있을 때 |
|
|
184
|
+
| `/hypo:lint` | frontmatter, 위키링크, 스키마 검증 | 커밋 전, CI에서 |
|
|
185
|
+
| `/hypo:graph` | 위키링크 의존성 그래프 생성 | 구조적 성장을 보고 싶을 때 |
|
|
186
|
+
|
|
187
|
+
### 라이프사이클 훅 (10개)
|
|
188
|
+
|
|
189
|
+
| 훅 | 이벤트 | 역할 |
|
|
190
|
+
|---|---|---|
|
|
191
|
+
| `hypo-session-start.mjs` | `SessionStart` | `hot.md` / `session-state.md` 주입 + `git pull --ff-only` |
|
|
192
|
+
| `hypo-first-prompt.mjs` | `UserPromptSubmit` | 마커 기반 일회성 `hot.md` 주입 (10분 TTL) |
|
|
193
|
+
| `hypo-lookup.mjs` | `UserPromptSubmit` | BM25 top-3 HIT 주입 / MISS → 가까운 슬러그 신호 |
|
|
194
|
+
| `hypo-compact-guard.mjs` | `UserPromptSubmit` | `/compact` 감지 → session-close 체크리스트 강제 |
|
|
195
|
+
| `hypo-cwd-change.mjs` | `CwdChanged` | cwd에 매칭되는 프로젝트 `hot.md` 주입 |
|
|
196
|
+
| `hypo-file-watch.mjs` | `FileChanged` | 위키 파일 변경 알림 |
|
|
197
|
+
| `hypo-auto-stage.mjs` | `PostToolUse(Write/Edit)` | 위키 파일 자동 stage |
|
|
198
|
+
| `hypo-auto-commit.mjs` | `Stop` | 자동 commit + pull + push |
|
|
199
|
+
| `hypo-hot-rebuild.mjs` | `Stop` | `hot.md` 재생성 |
|
|
200
|
+
| `hypo-personal-check.mjs` | `PreCompact` | lint 실패 / session-close 미완 시 compact 차단 |
|
|
201
|
+
|
|
202
|
+
모든 훅은 위키 루트를 `HYPO_DIR` 환경변수 → `hypo-config.md` 스캔 → `~/hypomnema` 기본값 순으로 해결하며, `hypo-shared.mjs`(`hooks.json`의 `shared` 필드로 선언)를 공유합니다.
|
|
203
|
+
|
|
204
|
+
### 셋업 & 유지보수
|
|
205
|
+
|
|
206
|
+
| 명령어 | 목적 |
|
|
207
|
+
|---|---|
|
|
208
|
+
| `/hypo:init` | 최초 설치 (디렉터리, 훅, settings.json 병합, 첫 commit/push) |
|
|
209
|
+
| `/hypo:doctor` | 상태 점검 (훅, 경로, frontmatter, git) |
|
|
210
|
+
| `/hypo:upgrade` | 훅/설정을 최신 버전으로 마이그레이션 |
|
|
211
|
+
| `/hypo:uninstall` | 훅 및 등록 정보 제거 |
|
|
212
|
+
| `/hypo:stats` | 위키 통계 |
|
|
80
213
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
214
|
+
### Claude Agent Skills
|
|
215
|
+
|
|
216
|
+
합성이 핵심인 명령어(`ingest`, `query`, `crystallize`, `lint`, `verify`, `graph`)는 `skills/<name>/SKILL.md`로도 등록되어 있어, 대화가 해당 description에 매칭되면 **Claude Agent Skills**로 자동 트리거됩니다 — 슬래시 명령 없이도.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 시나리오
|
|
221
|
+
|
|
222
|
+
**A — 새 기술 학습.**
|
|
223
|
+
Kubernetes 문서와 블로그 글을 읽는 중. 각 URL을 `/hypo:ingest`에 넣습니다. 세 번째 글에서 Claude가 새 페이지 대신 기존 `kubernetes-networking.md`를 갱신하기 시작합니다. 일주일 후 `/hypo:query "pod CIDR 할당은 어떻게 동작하나요?"`는 자신의 노트를 인용한 합성 답변을 돌려줍니다.
|
|
224
|
+
|
|
225
|
+
**B — 엔지니어링 결정 추적.**
|
|
226
|
+
중요한 변경 사항을 머지하기 전에 설계 문서나 PR 설명을 `/hypo:ingest`로 처리합니다. Claude가 컨텍스트, 트레이드오프, 결정 사항이 담긴 ADR 스타일 페이지를 작성합니다. 이후 `[[wikilink]]` 참조가 관련 프롬프트에 근거를 직접 주입합니다.
|
|
227
|
+
|
|
228
|
+
**C — 연구 누적.**
|
|
229
|
+
몇 주에 걸쳐 한 주제의 논문들을 읽습니다. 각 `/hypo:ingest`가 논문을 합성하고 기존 페이지와 교차 연결합니다. 언제든 `/hypo:query`로 자신의 노트에 근거한 문헌 리뷰 스타일 요약을 받을 수 있습니다.
|
|
230
|
+
|
|
231
|
+
**D — AI 행동 튜닝.**
|
|
232
|
+
Claude가 잘못하거나 정확히 맞았을 때마다 `/hypo:feedback`을 실행합니다. 교정 사항이 `pages/feedback/`에 저장되고 세션 시작 시 주입되어, 같은 실수가 반복되지 않습니다 — 한 대화 안이 아니라 세션 간에 걸쳐서요.
|
|
233
|
+
|
|
234
|
+
**E — 일시 중단된 프로젝트 재개.**
|
|
235
|
+
3주 동안 손 놓았던 프로젝트로 돌아옵니다. 다음 세션 시작 시 `hypo-session-start.mjs`가 `projects/<name>/session-state.md`를 읽고 "다음 작업"과 최근 결정 사항을 컨텍스트에 주입합니다. 첫 프롬프트를 입력하기 전에 이미 업무 파악이 끝나 있습니다.
|
|
85
236
|
|
|
86
237
|
---
|
|
87
238
|
|
|
88
239
|
## 위키에 저장할 것 / 저장하지 말 것
|
|
89
240
|
|
|
90
241
|
**저장할 것:**
|
|
242
|
+
|
|
91
243
|
- 외부 소스(문서, 논문, 강연)에서 합성된 지식
|
|
92
244
|
- 아키텍처 결정과 근거
|
|
93
245
|
- AI 행동 교정 및 선호사항
|
|
@@ -95,31 +247,12 @@ Claude가 잘못하거나 정확히 맞았을 때마다 `/hypo:feedback`을 실
|
|
|
95
247
|
- 연구 결과 및 교차 소스 비교
|
|
96
248
|
|
|
97
249
|
**저장하지 말 것:**
|
|
98
|
-
- 원본 소스 자료 — `sources/`에 자동으로, 미편집 상태로 저장됨
|
|
99
|
-
- 자격증명, 토큰, 비밀 — `.hypoignore`로 민감한 경로 제외
|
|
100
|
-
- 현재 세션의 일시적 작업 목록 — 대화 내 작업 목록 사용
|
|
101
|
-
- 레포지토리에서 도출 가능한 코드 패턴 — `git log`와 `grep`이 이미 정규 소스
|
|
102
|
-
- 다른 곳에 정규 소유자가 있는 정보 (Jira 티켓, Confluence 페이지, API 문서) — 미러가 아닌 *합성본*을 인제스트
|
|
103
|
-
|
|
104
|
-
---
|
|
105
250
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
| `/hypo:doctor` | 상태 점검 |
|
|
112
|
-
| `/hypo:upgrade` | 훅을 최신 버전으로 업그레이드 |
|
|
113
|
-
| `/hypo:uninstall` | 훅 및 등록 정보 제거 |
|
|
114
|
-
| `/hypo:ingest` | 외부 소스를 위키에 인제스트 |
|
|
115
|
-
| `/hypo:query` | 위키 페이지에서 검색 및 답변 합성 |
|
|
116
|
-
| `/hypo:crystallize` | 초안 및 관련 페이지를 안정적 지식으로 통합 |
|
|
117
|
-
| `/hypo:resume` | 활성 프로젝트의 가장 최근 세션 재개 |
|
|
118
|
-
| `/hypo:feedback` | AI 행동 교정 사항 기록 |
|
|
119
|
-
| `/hypo:verify` | 만료되었거나 누락된 `verify_by` 필드 감사 |
|
|
120
|
-
| `/hypo:stats` | 위키 통계 표시 |
|
|
121
|
-
| `/hypo:graph` | 위키링크 의존성 그래프 생성 |
|
|
122
|
-
| `/hypo:lint` | 프론트매터 및 위키링크 유효성 검사 |
|
|
251
|
+
- 원본 소스 자료 — `sources/`에 자동·미편집 상태로 보관됨
|
|
252
|
+
- 자격증명·토큰·비밀 — `.hypoignore`로 민감 경로 제외
|
|
253
|
+
- 현재 세션의 일시적 작업 목록 — 대화 내 작업 목록 사용
|
|
254
|
+
- 레포지토리에서 도출 가능한 코드 패턴 — `git log`, `grep`이 정규 소스
|
|
255
|
+
- 정규 소유자가 다른 곳에 있는 정보 (Jira, Confluence, API 문서) — 미러가 아닌 *합성본*만 인제스트
|
|
123
256
|
|
|
124
257
|
---
|
|
125
258
|
|
|
@@ -127,24 +260,64 @@ Claude가 잘못하거나 정확히 맞았을 때마다 `/hypo:feedback`을 실
|
|
|
127
260
|
|
|
128
261
|
```
|
|
129
262
|
<wiki-root>/
|
|
130
|
-
├── hypo-config.md
|
|
131
|
-
├── index.md
|
|
132
|
-
├── hot.md
|
|
133
|
-
├── log.md
|
|
134
|
-
├── SCHEMA.md
|
|
135
|
-
├── hypo-guide.md
|
|
136
|
-
├── .hypoignore
|
|
137
|
-
├── pages/
|
|
138
|
-
|
|
139
|
-
|
|
263
|
+
├── hypo-config.md ← 루트 마커 + 설정
|
|
264
|
+
├── index.md ← 검색 가능한 페이지 카탈로그
|
|
265
|
+
├── hot.md ← 활성 프로젝트 포인터
|
|
266
|
+
├── log.md ← 추가 전용 활동 로그
|
|
267
|
+
├── SCHEMA.md ← 타입 시스템 참조
|
|
268
|
+
├── hypo-guide.md ← 운영 가이드
|
|
269
|
+
├── .hypoignore ← 훅에서 제외할 글로브 패턴
|
|
270
|
+
├── pages/ ← 영구 지식 페이지
|
|
271
|
+
│ └── feedback/ ← AI 행동 교정
|
|
272
|
+
├── projects/ ← 프로젝트 아티팩트 및 세션 로그
|
|
273
|
+
│ └── <name>/
|
|
274
|
+
│ ├── hot.md
|
|
275
|
+
│ ├── session-state.md
|
|
276
|
+
│ └── session-log/
|
|
277
|
+
├── journal/ ← daily / weekly / monthly 기록
|
|
278
|
+
└── sources/ ← 원본 인제스트 소스 (수정 금지)
|
|
140
279
|
```
|
|
141
280
|
|
|
142
281
|
---
|
|
143
282
|
|
|
283
|
+
## 설정
|
|
284
|
+
|
|
285
|
+
위키 경로는 다음 순서로 해결됩니다 (`scripts/lib/hypo-root.mjs` 참조):
|
|
286
|
+
|
|
287
|
+
| 우선순위 | 출처 |
|
|
288
|
+
|---|---|
|
|
289
|
+
| 1 | `--hypo-dir=<path>` CLI 플래그 (스크립트 단위 오버라이드; 해당 플래그를 받는 스크립트에서만 동작) |
|
|
290
|
+
| 2 | `HYPO_DIR` 환경변수 |
|
|
291
|
+
| 3 | 홈 기준 후보 목록(`~/hypomnema`, `~/wiki`, `~/notes`, `~/knowledge`, `~/Documents/{hypomnema,wiki,notes}`)에서 `hypo-config.md` 마커 발견 |
|
|
292
|
+
| 4 | 기본값: `~/hypomnema` |
|
|
293
|
+
|
|
294
|
+
위키 루트에 `hypo-config.md`를 두면 환경변수 없이도 기기 간 이식이 가능합니다.
|
|
295
|
+
|
|
296
|
+
`.hypoignore`는 훅이 무시할 경로를 정의합니다 (기본: `*.pdf`, `*.zip`, `*.pem`, `*.env` 등). 직접 편집하면 됩니다 — privacy mode 플래그는 없습니다. 단일 파일, 단일 진실 소스.
|
|
297
|
+
|
|
298
|
+
### `/hypo:*` 커맨드는 어디서 오는가?
|
|
299
|
+
|
|
300
|
+
| 설치 경로 | 슬래시 커맨드 위치 |
|
|
301
|
+
|---|---|
|
|
302
|
+
| 플러그인 (Path A) | Claude Code 플러그인 캐시; `/plugin update`로 갱신 |
|
|
303
|
+
| npm CLI (Path B) | `~/.claude/commands/hypo/`; `hypomnema upgrade --apply`로 갱신, 파일별 SHA 추적. 사용자 수정본까지 덮어쓰려면 `--force-commands`(원본은 `.bak`으로 보존) |
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
144
307
|
## 요구 사항
|
|
145
308
|
|
|
146
|
-
- Node.js ≥ 18
|
|
147
|
-
- Claude Code CLI
|
|
309
|
+
- **Node.js ≥ 18** (18 / 20 / 22 검증됨)
|
|
310
|
+
- **Claude Code CLI**
|
|
311
|
+
|
|
312
|
+
외부 서비스·API 키·벡터 DB 모두 불필요.
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## 상태
|
|
317
|
+
|
|
318
|
+
- **테스트:** 51 / 51 통과 — `tests/runner.mjs`
|
|
319
|
+
- **CI:** 7개 독립 job (test matrix, lint, init/upgrade snapshots, replay, hypo-absent, uninstall-smoke)
|
|
320
|
+
- **릴리스:** `v*` 태그 push 시 `npm publish --provenance` 자동 실행
|
|
148
321
|
|
|
149
322
|
---
|
|
150
323
|
|
|
@@ -152,6 +325,7 @@ Claude가 잘못하거나 정확히 맞았을 때마다 `/hypo:feedback`을 실
|
|
|
152
325
|
|
|
153
326
|
- [ARCHITECTURE.md](docs/ARCHITECTURE.md) — 내부 구조, 컴포넌트 맵, 데이터 흐름
|
|
154
327
|
- [CONTRIBUTING.md](docs/CONTRIBUTING.md) — 개발 환경 설정, 컨벤션, PR 프로세스
|
|
328
|
+
- [CHANGELOG.md](CHANGELOG.md) — 릴리스 히스토리
|
|
155
329
|
|
|
156
330
|
---
|
|
157
331
|
|