oh-my-llmwikimode 1.0.0
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/LICENSE +21 -0
- package/README.md +494 -0
- package/bin/llmwiki.js +1493 -0
- package/docs/INSTALLATION.md +228 -0
- package/docs/SCOPE_LOCK.md +79 -0
- package/docs/STAGE1_GUIDE.md +265 -0
- package/docs/STAGE2_AGENT_TEAM_GUIDE.md +141 -0
- package/docs/STAGE3_CONVERSATIONAL_GROWTH_GUIDE.md +50 -0
- package/docs/TEST_WORKSHEET.md +120 -0
- package/docs/github-private-bootstrap.md +53 -0
- package/docs/release.md +79 -0
- package/docs/stage4-slice1-manual-test.md +259 -0
- package/docs/stage4-slice1-user-guide.md +269 -0
- package/docs/user-guide-ko.md +452 -0
- package/package.json +76 -0
- package/scripts/install-llmwiki.ps1 +229 -0
- package/src/config.js +74 -0
- package/src/curator/browser-data.js +134 -0
- package/src/curator/queue.js +324 -0
- package/src/curator/schema.js +237 -0
- package/src/curator/scoring.js +83 -0
- package/src/hooks.js +199 -0
- package/src/librarian/schema.js +218 -0
- package/src/librarian/weekly-digest.js +478 -0
- package/src/security.js +127 -0
- package/src/server.js +860 -0
- package/src/stage4/graph-reasoning/analyzer.js +255 -0
- package/src/stage4/graph-reasoning/browser-data.js +130 -0
- package/src/stage4/graph-reasoning/index.js +35 -0
- package/src/stage4/graph-reasoning/loader.js +122 -0
- package/src/stage4/graph-reasoning/queue.js +154 -0
- package/src/stage4/graph-reasoning/schema.js +190 -0
- package/src/team/browser-data.js +142 -0
- package/src/team/capabilities.js +79 -0
- package/src/team/dispatch.js +108 -0
- package/src/team/queue.js +290 -0
- package/src/team/schema.js +225 -0
- package/src/team/shared-memory.js +183 -0
- package/src/todo/browser-data.js +71 -0
- package/src/todo/queue.js +159 -0
- package/src/todo/schema.js +90 -0
- package/src/utils/embedding-model.js +111 -0
- package/src/wiki/alias-suggestions.js +180 -0
- package/src/wiki/browser-data.js +284 -0
- package/src/wiki/doctor.js +218 -0
- package/src/wiki/entry-normalizer.js +139 -0
- package/src/wiki/ingest.js +443 -0
- package/src/wiki/lesson-proposal-analyzer.js +463 -0
- package/src/wiki/lesson-proposal-manager.js +331 -0
- package/src/wiki/lesson-template.js +182 -0
- package/src/wiki/lint.js +294 -0
- package/src/wiki/notebooklm-adapter.js +264 -0
- package/src/wiki/query.js +304 -0
- package/src/wiki/raw-manager.js +400 -0
- package/src/wiki/search-feedback.js +211 -0
- package/src/wiki/semantic-index.js +333 -0
- package/src/wiki/semantic-search.js +170 -0
- package/src/wiki/source-ledger.js +370 -0
- package/src/wiki/store.js +1329 -0
- package/src/wiki/usage-events.js +144 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
# oh-my-llmwikimode 사용자 가이드
|
|
2
|
+
|
|
3
|
+
`oh-my-llmwikimode`는 OpenCode 대화에서 얻은 문제 해결 지식을 로컬 Markdown 위키에 저장하고, 다음 세션에서 다시 검색해 참고할 수 있게 해주는 OpenCode 플러그인입니다.
|
|
4
|
+
|
|
5
|
+
이 문서는 현재 개발된 기능과 실제 사용법을 기준으로 설명합니다.
|
|
6
|
+
|
|
7
|
+
> 현재 상태: `oh-my-llmwikimode`는 private GitHub 저장소에서 개발 중이며 아직 npm에 공개 배포되지 않았습니다. 따라서 일반 사용자의 한 줄 설치는 npm 공개 이후에 가능합니다.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 무엇을 해주나요?
|
|
12
|
+
|
|
13
|
+
### 핵심 기능
|
|
14
|
+
|
|
15
|
+
- **검색**: `wiki_search`로 로컬 LLM Wiki에서 관련 지식을 찾습니다.
|
|
16
|
+
- **저장**: `wiki_store`로 새 지식을 Markdown 파일로 저장합니다.
|
|
17
|
+
- **승격**: `wiki_promote`로 자주 쓰는 항목을 `lesson`으로 승격합니다.
|
|
18
|
+
- **NotebookLM 가져오기**: `notebooklm_llmwikiflow`로 NotebookLM 연구 결과를 후보 지식으로 가져옵니다.
|
|
19
|
+
- **자동 메모리**: 문제/오류/실패 같은 대화 패턴을 감지하면 후보 지식으로 저장할 수 있습니다.
|
|
20
|
+
- **부트 규칙 주입**: OpenCode 시스템 프롬프트에 Wiki Boot Rules를 넣어, 에이전트가 문제 해결 전 검색하고 해결 후 저장하도록 안내합니다.
|
|
21
|
+
- **보안 처리**: API 키, 토큰, 비밀번호처럼 흔한 민감정보 패턴은 저장 전에 가립니다.
|
|
22
|
+
|
|
23
|
+
### 쉽게 말하면
|
|
24
|
+
|
|
25
|
+
예전에 해결했던 “Docker Compose 볼륨 때문에 컨테이너가 계속 실패한 문제” 같은 내용을 다음에 다시 만나면, 에이전트가 먼저 로컬 위키에서 비슷한 해결 기록을 찾아 참고할 수 있게 해줍니다.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. 저장 위치와 파일 구조
|
|
30
|
+
|
|
31
|
+
기본 위키 위치는 다음과 같습니다.
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
~/Documents/llm-wiki
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Windows 기본 경로 예시는 다음과 같습니다.
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
C:\Users\USER\Documents\llm-wiki
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
플러그인이 사용하는 구조는 다음과 같습니다.
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
llm-wiki/
|
|
47
|
+
├── inbox/ # 새 저장 항목과 자동 캡처가 들어오는 곳
|
|
48
|
+
├── problems/ # 사람이 정리한 문제 항목을 둘 수 있는 곳
|
|
49
|
+
├── editorial/
|
|
50
|
+
│ └── lessons/ # wiki_promote로 승격된 안정적인 학습 항목
|
|
51
|
+
├── raw/ # 원본 자료 및 외부 가져오기 보관
|
|
52
|
+
│ ├── sources/ # 원본 자료 (Source Ledger)
|
|
53
|
+
│ │ ├── ledger.jsonl
|
|
54
|
+
│ │ └── files/
|
|
55
|
+
│ │ └── {source_id}/
|
|
56
|
+
│ │ ├── manifest.json
|
|
57
|
+
│ │ └── content.txt
|
|
58
|
+
│ ├── notebooklm/ # NotebookLM 가져오기 원본 파일 보관
|
|
59
|
+
│ │ └── imports/
|
|
60
|
+
│ │ └── {run_id}/
|
|
61
|
+
│ │ ├── manifest.json
|
|
62
|
+
│ │ └── report.md
|
|
63
|
+
│ └── packs/ # 지식 팩 (Knowledge Pack) 원본 보관
|
|
64
|
+
│ └── {pack_id}/
|
|
65
|
+
│ └── {version}/
|
|
66
|
+
│ ├── manifest.json
|
|
67
|
+
│ └── *.md
|
|
68
|
+
└── .system/
|
|
69
|
+
└── index.json # 검색용 자동 생성 인덱스, 직접 수정하지 않음
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
새로 저장되는 항목은 기본적으로 `inbox/`에 Markdown 파일로 생성됩니다. `.system/index.json`은 검색을 빠르게 하기 위한 파생 파일이므로 직접 편집하지 않는 것이 좋습니다.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 3. 설치 상태와 설치 방법
|
|
77
|
+
|
|
78
|
+
### 현재: private/local 개발 설치
|
|
79
|
+
|
|
80
|
+
현재 저장소는 private 상태이고 npm에 공개되지 않았습니다. 따라서 아래 공개 설치 명령은 아직 일반 사용자에게 동작하지 않습니다.
|
|
81
|
+
|
|
82
|
+
```powershell
|
|
83
|
+
opencode plugin oh-my-llmwikimode --global
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
현재 실사용/개발 환경에서는 다음 중 하나의 방식으로 연결합니다.
|
|
87
|
+
|
|
88
|
+
#### 방식 A: 로컬 파일 또는 로컬 패키지 경로로 연결
|
|
89
|
+
|
|
90
|
+
OpenCode 설정의 `plugin` 배열에서 로컬 경로를 참조합니다.
|
|
91
|
+
|
|
92
|
+
```jsonc
|
|
93
|
+
{
|
|
94
|
+
"plugin": [
|
|
95
|
+
["file:///C:/Users/USER/Desktop/OpenCode_Modes/plugins/oh-my-llmwikimode/src/server.js", {
|
|
96
|
+
"wikiRoot": "~/Documents/llm-wiki"
|
|
97
|
+
}]
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### 방식 B: private GitHub 접근 권한이 있는 개발자 설치
|
|
103
|
+
|
|
104
|
+
private GitHub 저장소 접근 권한이 있는 환경에서는 npm dependency 형태로 설치할 수 있습니다.
|
|
105
|
+
|
|
106
|
+
```powershell
|
|
107
|
+
npm install oh-my-llmwikimode@github:wjdtmddn325-maker/oh-my-llmwikimode
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
이 방식은 개발/운영자용입니다. 일반 공개 설치 문서로 안내할 방식은 아닙니다.
|
|
111
|
+
|
|
112
|
+
### 추후: npm 공개 배포 후 설치
|
|
113
|
+
|
|
114
|
+
npm 공개 배포가 완료되면 다음 명령이 기본 설치 흐름이 됩니다.
|
|
115
|
+
|
|
116
|
+
```powershell
|
|
117
|
+
opencode plugin oh-my-llmwikimode --global
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
또는 `opencode.json`에 직접 추가할 수 있습니다.
|
|
121
|
+
|
|
122
|
+
```jsonc
|
|
123
|
+
{
|
|
124
|
+
"plugin": [
|
|
125
|
+
["oh-my-llmwikimode", {
|
|
126
|
+
"wikiRoot": "~/Documents/llm-wiki",
|
|
127
|
+
"autoMemoryEnabled": true,
|
|
128
|
+
"autoSearchEnabled": true,
|
|
129
|
+
"contextBudget": 2500,
|
|
130
|
+
"maxEntries": 3
|
|
131
|
+
}]
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
> 이 workspace에서는 `oh-my-openagent.json`이 스위처가 만든 런타임 출력물입니다. 프로필 원본과 스위처 레이어가 source of truth이므로, 장기 설정은 원본 설정 파일에서 관리하는 것이 안전합니다.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 4. 설정 옵션
|
|
141
|
+
|
|
142
|
+
| 옵션 | 기본값 | 설명 |
|
|
143
|
+
|---|---:|---|
|
|
144
|
+
| `wikiRoot` | `~/Documents/llm-wiki` | Markdown 위키 저장 위치입니다. `~`는 사용자 홈으로 확장됩니다. |
|
|
145
|
+
| `autoMemoryEnabled` | `true` | 문제 해결 패턴을 자동으로 후보 지식으로 저장할지 정합니다. |
|
|
146
|
+
| `autoSearchEnabled` | `true` | OpenCode 시스템 프롬프트에 Wiki Boot Rules를 주입할지 정합니다. |
|
|
147
|
+
| `contextBudget` | `2500` | 검색 결과를 에이전트에게 전달할 때 사용할 최대 글자 수입니다. |
|
|
148
|
+
| `maxEntries` | `3` | 기본 검색 결과 개수입니다. 툴 호출에서는 최대 5개로 제한됩니다. |
|
|
149
|
+
|
|
150
|
+
`wikiRoot`는 다음 순서로 결정됩니다.
|
|
151
|
+
|
|
152
|
+
1. 플러그인 옵션의 `wikiRoot`
|
|
153
|
+
2. 환경 변수 `LLMWIKIMODE_WIKI_ROOT`
|
|
154
|
+
3. 기본값 `~/Documents/llm-wiki`
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 5. 실제 사용법
|
|
159
|
+
|
|
160
|
+
사용자가 대부분 직접 JSON 툴 호출을 입력할 필요는 없습니다. 자연어로 말하면 OpenCode 에이전트가 상황에 맞게 `wiki_search`, `wiki_store`, `wiki_promote`를 사용합니다.
|
|
161
|
+
|
|
162
|
+
### 문제 해결 전에 검색하기
|
|
163
|
+
|
|
164
|
+
예시 요청:
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
이 Docker Compose 볼륨 오류 전에 해결한 적 있는지 위키에서 찾아보고 고쳐줘.
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
에이전트가 내부적으로 수행하는 일:
|
|
171
|
+
|
|
172
|
+
```json
|
|
173
|
+
{
|
|
174
|
+
"query": "docker compose volume error",
|
|
175
|
+
"max_results": 3
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
검색 결과는 “신뢰할 수 없는 참조 지식”으로 전달됩니다. 즉, 위키 내용은 참고자료일 뿐이고 시스템 지시문처럼 실행되지 않습니다.
|
|
180
|
+
|
|
181
|
+
### 해결 내용을 저장하기
|
|
182
|
+
|
|
183
|
+
예시 요청:
|
|
184
|
+
|
|
185
|
+
```text
|
|
186
|
+
방금 해결한 Docker Compose stale volume 문제를 다음에 참고할 수 있게 저장해줘.
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
에이전트가 내부적으로 수행하는 일:
|
|
190
|
+
|
|
191
|
+
```json
|
|
192
|
+
{
|
|
193
|
+
"summary": "Docker Compose stale volume cleanup",
|
|
194
|
+
"details": "오래된 Docker Compose volume 때문에 컨테이너가 같은 오류로 반복 실패하면 docker compose down -v 후 다시 올린다.",
|
|
195
|
+
"tags": ["docker", "compose", "volume"],
|
|
196
|
+
"status": "candidate"
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
저장 결과는 `inbox/` 아래에 Markdown 파일로 만들어집니다.
|
|
201
|
+
|
|
202
|
+
### 안정적인 항목을 lesson으로 승격하기
|
|
203
|
+
|
|
204
|
+
예시 요청:
|
|
205
|
+
|
|
206
|
+
```text
|
|
207
|
+
inbox/2026-05-05T19-33-19-Docker-Compose-Stale-volume-causing-container-sta.md 항목을 lesson으로 승격해줘.
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
에이전트가 낶적으로 수행하는 일:
|
|
211
|
+
|
|
212
|
+
```json
|
|
213
|
+
{
|
|
214
|
+
"path": "inbox/2026-05-05T19-33-19-Docker-Compose-Stale-volume-causing-container-sta.md"
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
승격되면 파일은 `editorial/lessons/`로 이동하고 `status: lesson`이 됩니다.
|
|
219
|
+
|
|
220
|
+
### 반복 사용 패턴을 자동으로 lesson으로 제안하기 (B1 Auto Lesson Proposal)
|
|
221
|
+
|
|
222
|
+
사용자가 같은 주제로 여러 번 검색하거나 같은 항목을 반복해서 참조하면, 플러그인이 자동으로 lesson 제안을 생성합니다. 이 제안은 **검토 대상** 상태로만 생성되며, 실제 승격은 사용자가 명시적으로 실행해야 합니다.
|
|
223
|
+
|
|
224
|
+
**안전 원칙:**
|
|
225
|
+
- 원본 항목(inbox/ 문제 메모 등)은 절대 수정하지 않습니다.
|
|
226
|
+
- frontmatter에 `used_count`, `last_used` 등을 기록하지 않습니다.
|
|
227
|
+
- 자동 승격은 금지되어 있습니다. 반드시 사용자가 `apply`를 실행해야 합니다.
|
|
228
|
+
|
|
229
|
+
**CLI 명령:**
|
|
230
|
+
|
|
231
|
+
```powershell
|
|
232
|
+
# usage event 분석 후 lesson 제안 생성
|
|
233
|
+
npx llmwiki lesson-proposal analyze
|
|
234
|
+
|
|
235
|
+
# 현재 제안 목록 조회
|
|
236
|
+
npx llmwiki lesson-proposal list --json
|
|
237
|
+
|
|
238
|
+
# 특정 제안 상세 보기
|
|
239
|
+
npx llmwiki lesson-proposal show lp_abc123
|
|
240
|
+
|
|
241
|
+
# 사용자 승인 후 lesson으로 승격
|
|
242
|
+
npx llmwiki lesson-proposal apply lp_abc123
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
제안은 `.system/lesson-proposals/`에 JSON 아티팩트로 저장되며, `status: review_required`, `auto_apply: false` 상태로 생성됩니다. `apply`를 실행하면 `editorial/lessons/`에 새 lesson 파일이 생성되고, 제안 아티팩트는 `applied` 상태로 업데이트됩니다.
|
|
246
|
+
|
|
247
|
+
**제안 생성 조건:**
|
|
248
|
+
- 동일 `query_hash`로 2회 이상 검색
|
|
249
|
+
- 동일 `entry_path`를 2회 이상 참조
|
|
250
|
+
- `search_result_used` 이벤트가 동일 query로 3회 이상 → 높은 우선순위(high confidence)
|
|
251
|
+
|
|
252
|
+
### NotebookLM 연구 결과 가져오기
|
|
253
|
+
|
|
254
|
+
`nlm` CLI 등으로 남긴 NotebookLM 결과를 위키 후보 지식으로 가져옵니다.
|
|
255
|
+
|
|
256
|
+
예시 요청:
|
|
257
|
+
|
|
258
|
+
```text
|
|
259
|
+
C:\Users\USER\Downloads\notebooklm-export 폴더의 연구 결과를 위키에 가져와줘.
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
에이전트가 내부적으로 수행하는 일:
|
|
263
|
+
|
|
264
|
+
```json
|
|
265
|
+
{
|
|
266
|
+
"input_path": "C:\\Users\\USER\\Downloads\\notebooklm-export",
|
|
267
|
+
"original_query": "React hooks best practices",
|
|
268
|
+
"title": "React Hooks Research",
|
|
269
|
+
"tags": ["react", "frontend"]
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
가져오기가 완료되면 다음이 생성됩니다.
|
|
274
|
+
|
|
275
|
+
- `raw/notebooklm/imports/{run_id}/` 아래에 원본 파일 복사본
|
|
276
|
+
- 같은 폴더의 `manifest.json` (원본 쿼리, 파일 목록, 해시값 기록)
|
|
277
|
+
- `inbox/` 아래에 `status: candidate`, `source: notebooklm`인 Markdown 항목
|
|
278
|
+
|
|
279
|
+
가져온 항목은 자동으로 `lesson`이 되지 않습니다. 검토 후 직접 `wiki_promote`로 승격하세요.
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## 6. 자동 메모리는 어떻게 동작하나요?
|
|
284
|
+
|
|
285
|
+
`autoMemoryEnabled`가 `true`이면 플러그인은 OpenCode 메시지에서 문제 해결 패턴을 감지합니다. 현재 방식은 LLM이 의미를 깊게 판단하는 방식이 아니라, 정해진 한/영 키워드가 포함됐는지 보는 가벼운 패턴 매칭입니다.
|
|
286
|
+
|
|
287
|
+
감지 키워드 예시는 다음과 같습니다.
|
|
288
|
+
|
|
289
|
+
```text
|
|
290
|
+
bug, error, failure, crash, exception, broken, not working, fails, issue, problem
|
|
291
|
+
버그, 오류, 실패, 문제, 에러, 오작동
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
자동 저장은 아래 조건을 모두 만족할 때만 실행됩니다.
|
|
295
|
+
|
|
296
|
+
1. `autoMemoryEnabled`가 꺼져 있지 않아야 합니다.
|
|
297
|
+
2. 위 문제 키워드 중 하나가 메시지에 포함되어야 합니다.
|
|
298
|
+
3. “저장해줘”, “remember this”, “다음에 참고”처럼 명시적 저장 요청이 없어야 합니다.
|
|
299
|
+
4. `[analyze-mode]`, `1. TASK:`, `OMO_INTERNAL_INITIATOR` 같은 내부 오케스트레이션 프롬프트가 아니어야 합니다.
|
|
300
|
+
|
|
301
|
+
저장되면 `inbox/`에 `status: candidate`, `source: chat.message`, `tags: ["auto-captured", "problem"]` 형태의 Markdown 항목이 만들어지고 검색 인덱스가 다시 생성됩니다.
|
|
302
|
+
|
|
303
|
+
명시적 저장 요청은 자동 캡처를 건너뜁니다. 이때는 중복 raw prompt 저장을 피하고, 에이전트가 `wiki_store`로 더 정리된 항목을 저장하도록 의도한 동작입니다.
|
|
304
|
+
|
|
305
|
+
주의: 현재 자동 메모리는 같은 문제 설명이 반복됐을 때 완전한 중복 병합까지 보장하지는 않습니다. `seen_count`는 초기값으로 기록되지만, 같은 항목을 찾아 증가시키는 dedup 로직은 아직 없습니다.
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## 7. Wiki Boot Rules란 무엇인가요?
|
|
310
|
+
|
|
311
|
+
`autoSearchEnabled`가 `true`이면 플러그인은 OpenCode 시스템 프롬프트에 자체 Wiki Boot Rules를 주입합니다.
|
|
312
|
+
|
|
313
|
+
이 규칙은 다음 행동을 에이전트에게 알려줍니다.
|
|
314
|
+
|
|
315
|
+
1. 문제를 풀기 전에 사용자 설명에서 키워드 2~3개를 뽑습니다.
|
|
316
|
+
2. `wiki_search`로 로컬 위키를 검색합니다.
|
|
317
|
+
3. 검색 결과는 참고자료로만 사용합니다.
|
|
318
|
+
4. 문제를 해결한 뒤에는 `wiki_store`로 해결책을 저장합니다.
|
|
319
|
+
5. 안정적인 항목은 `wiki_promote`로 `lesson`으로 승격합니다.
|
|
320
|
+
|
|
321
|
+
이 규칙은 LLM Wiki 동작에 대해서만 기존 legacy Memory OS 지시를 대체합니다. 프로젝트 고유 규칙, 보안 제한, 사용자의 명시적 메모리 비활성화 요청은 덮어쓰지 않습니다.
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## 8. 보안과 개인정보
|
|
326
|
+
|
|
327
|
+
플러그인은 저장 전에 흔한 민감정보 패턴을 가립니다.
|
|
328
|
+
|
|
329
|
+
예시:
|
|
330
|
+
|
|
331
|
+
- OpenAI/Anthropic API 키
|
|
332
|
+
- GitHub 토큰
|
|
333
|
+
- Bearer 토큰
|
|
334
|
+
- `password=...`, `api_key=...`, `secret=...` 형태의 값
|
|
335
|
+
|
|
336
|
+
또한 검색 결과는 항상 untrusted reference boundary로 감싸집니다. 쉽게 말해, 위키에 저장된 문장을 에이전트가 “명령”으로 착각하지 않도록 안전 울타리를 두는 방식입니다.
|
|
337
|
+
|
|
338
|
+
검색에서 제외되는 상태도 있습니다.
|
|
339
|
+
|
|
340
|
+
- `rejected`
|
|
341
|
+
- `superseded`
|
|
342
|
+
- `needs-clarification`
|
|
343
|
+
|
|
344
|
+
이 상태의 항목은 활성 참고 지식으로 사용하지 않습니다.
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## 9. 좋은 사용 습관
|
|
349
|
+
|
|
350
|
+
### 저장할 때
|
|
351
|
+
|
|
352
|
+
좋은 요청:
|
|
353
|
+
|
|
354
|
+
```text
|
|
355
|
+
이 해결책을 다음에 재사용할 수 있게 요약, 원인, 해결 명령, 주의사항으로 저장해줘.
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
더 좋은 저장 내용:
|
|
359
|
+
|
|
360
|
+
- 어떤 문제가 있었는지
|
|
361
|
+
- 원인이 무엇이었는지
|
|
362
|
+
- 정확히 어떤 조치를 했는지
|
|
363
|
+
- 다음에 같은 문제가 나오면 먼저 확인할 것
|
|
364
|
+
- 관련 태그
|
|
365
|
+
|
|
366
|
+
### 검색할 때
|
|
367
|
+
|
|
368
|
+
좋은 요청:
|
|
369
|
+
|
|
370
|
+
```text
|
|
371
|
+
이 TypeScript 타입 오류와 비슷한 항목이 LLM Wiki에 있는지 먼저 검색해줘.
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
검색 키워드는 짧고 구체적일수록 좋습니다.
|
|
375
|
+
|
|
376
|
+
```text
|
|
377
|
+
typescript generic type error
|
|
378
|
+
docker compose volume
|
|
379
|
+
opencode plugin cache
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### 승격할 때
|
|
383
|
+
|
|
384
|
+
`inbox/`는 임시 보관함에 가깝습니다. 여러 번 재사용했고 내용이 안정적이면 `lesson`으로 승격하세요.
|
|
385
|
+
|
|
386
|
+
```text
|
|
387
|
+
이 inbox 항목은 검증됐으니 lesson으로 승격해줘.
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## 10. 문제 해결 체크리스트
|
|
393
|
+
|
|
394
|
+
### 플러그인 툴이 보이지 않을 때
|
|
395
|
+
|
|
396
|
+
1. OpenCode를 재시작합니다.
|
|
397
|
+
2. `opencode.json`의 `plugin` 배열에 `oh-my-llmwikimode` 또는 로컬 경로가 들어 있는지 확인합니다.
|
|
398
|
+
3. npm 공개 전이라면 private GitHub 접근 권한 또는 로컬 경로가 올바른지 확인합니다.
|
|
399
|
+
4. 개발 환경에서는 OpenCode package cache가 최신 코드와 동기화됐는지 확인합니다.
|
|
400
|
+
|
|
401
|
+
### 검색 결과가 없을 때
|
|
402
|
+
|
|
403
|
+
1. `~/Documents/llm-wiki/inbox/` 또는 `editorial/lessons/`에 Markdown 파일이 있는지 확인합니다.
|
|
404
|
+
2. 항목의 frontmatter에 `title`이 있는지 확인합니다.
|
|
405
|
+
3. 상태가 `rejected`, `superseded`, `needs-clarification`이면 검색에서 제외됩니다.
|
|
406
|
+
4. 더 구체적인 키워드로 다시 검색합니다.
|
|
407
|
+
|
|
408
|
+
### 저장이 중복되는 것 같을 때
|
|
409
|
+
|
|
410
|
+
현재 구현은 명시적 저장 요청과 내부 오케스트레이션 프롬프트를 감지하면 자동 캡처를 건너뜁니다. 그래도 같은 실제 문제 설명을 여러 번 말하면 중복 항목이 생길 수 있으므로, 같은 시간대의 `inbox/` 파일을 확인하고 불필요한 항목은 `status: rejected`로 바꾸거나 정리하면 됩니다.
|
|
411
|
+
|
|
412
|
+
### legacy `wiki/` 폴더가 보일 때
|
|
413
|
+
|
|
414
|
+
새 기본 레이아웃은 `inbox/`, `problems/`, `editorial/lessons/`, `.system/index.json`입니다. 예전 `wiki/` 폴더는 migration 또는 fallback 이슈로만 취급하고, 새 저장은 플러그인 도구에 맡기는 것이 좋습니다.
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## 11. 개발자 검증 명령
|
|
419
|
+
|
|
420
|
+
패키지 루트는 다음입니다.
|
|
421
|
+
|
|
422
|
+
```text
|
|
423
|
+
plugins/oh-my-llmwikimode/
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
검증 명령:
|
|
427
|
+
|
|
428
|
+
```powershell
|
|
429
|
+
npm run verify
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
workspace 루트에서 실행할 때는 다음처럼 실행할 수 있습니다.
|
|
433
|
+
|
|
434
|
+
```powershell
|
|
435
|
+
npm --prefix plugins/oh-my-llmwikimode run verify
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
`npm run verify`는 테스트, 패키지 검증, 문서 검증, release dry-run, side-effect audit을 순서대로 실행합니다.
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 12. 현재 공개 배포 전 체크포인트
|
|
443
|
+
|
|
444
|
+
아래 작업이 끝나야 일반 사용자에게 “한 줄 설치”를 안내할 수 있습니다.
|
|
445
|
+
|
|
446
|
+
1. npm publish 승인
|
|
447
|
+
2. repository secret `NPM_TOKEN` 추가
|
|
448
|
+
3. repository variable `ENABLE_RELEASE=true` 설정
|
|
449
|
+
4. semantic-release 성공 확인
|
|
450
|
+
5. 공개 설치 명령 검증
|
|
451
|
+
|
|
452
|
+
그 전까지는 “private/local 개발 설치”와 “추후 npm 공개 설치”를 반드시 구분해서 안내해야 합니다.
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "oh-my-llmwikimode",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "LLM Wiki plugin for OpenCode — auto-memory, retrieval, and knowledge promotion",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./src/server.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"llmwiki": "bin/llmwiki.js"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./src/server.js",
|
|
12
|
+
"./server": "./src/server.js"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"bin",
|
|
16
|
+
"src",
|
|
17
|
+
"docs",
|
|
18
|
+
"scripts/install-llmwiki.ps1",
|
|
19
|
+
"LICENSE",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"test": "node --test test/**/*.test.js",
|
|
24
|
+
"test:loader": "node --test test/loader.test.js",
|
|
25
|
+
"test:hooks": "node --test test/hooks.test.js",
|
|
26
|
+
"test:paths": "node --test test/paths.test.js",
|
|
27
|
+
"test:storage": "node --test test/storage.test.js",
|
|
28
|
+
"test:security": "node --test test/security.test.js",
|
|
29
|
+
"verify:package": "node test/verify-package.test.js",
|
|
30
|
+
"verify:docs": "node test/verify-docs.test.js",
|
|
31
|
+
"verify:side-effects": "node scripts/side-effect-audit.js",
|
|
32
|
+
"prepublishOnly": "npm test",
|
|
33
|
+
"release:dry-run": "node scripts/release-dry-run.js",
|
|
34
|
+
"verify:runtime": "npm run test && npm run verify:package && npm run verify:docs && npm run release:dry-run && npm run verify:side-effects",
|
|
35
|
+
"verify:extension": "npm --prefix packages/oh-my-llmwiki-pack run verify",
|
|
36
|
+
"verify": "npm run verify:runtime && npm run verify:extension"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"opencode",
|
|
40
|
+
"plugin",
|
|
41
|
+
"llm",
|
|
42
|
+
"wiki",
|
|
43
|
+
"memory",
|
|
44
|
+
"knowledge-management"
|
|
45
|
+
],
|
|
46
|
+
"author": "oh-my-llmwikimode",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "git+https://github.com/wjdtmddn325-maker/oh-my-llmwikimode.git"
|
|
51
|
+
},
|
|
52
|
+
"bugs": {
|
|
53
|
+
"url": "https://github.com/wjdtmddn325-maker/oh-my-llmwikimode/issues"
|
|
54
|
+
},
|
|
55
|
+
"homepage": "https://github.com/wjdtmddn325-maker/oh-my-llmwikimode#readme",
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"@opencode-ai/plugin": "^1.14.0"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@opencode-ai/plugin": "^1.14.0",
|
|
61
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
62
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
63
|
+
"@semantic-release/git": "^10.0.1",
|
|
64
|
+
"@semantic-release/github": "^12.0.6",
|
|
65
|
+
"@semantic-release/npm": "^13.1.5",
|
|
66
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
67
|
+
"conventional-changelog-conventionalcommits": "^9.3.1",
|
|
68
|
+
"semantic-release": "^25.0.3"
|
|
69
|
+
},
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=18.0.0"
|
|
72
|
+
},
|
|
73
|
+
"publishConfig": {
|
|
74
|
+
"access": "public"
|
|
75
|
+
}
|
|
76
|
+
}
|