LLM Wiki — Obsidian 볼트를 LLM이 유지보수하는 지식 베이스로 운영하기
LLM wiki kit
First committed by cookyman74
Published in cookyman74/llmwiki-harness. Publisher page
46 GitHub stars
What it is
llmwiki-harness
AutoGineer overview, from the brain’s own files
llmwiki-harness is a framework designed to turn an Obsidian vault into a living, self-maintaining knowledge base. Unlike standard RAG systems that re-process information on every query, this harness uses LLMs to incrementally ingest, synthesize, and cross-reference information into a structured wiki. It implements a 4-tier memory model (Working, Episodic, Semantic, Procedural) to manage information decay, confidence scoring, and knowledge promotion. The system is built for Claude Code, utilizing a suite of specialized agents and skills to handle wiki operations, linting, and MoC (Map of Content) maintenance, ensuring the knowledge base grows in value over time.
How it works
Memory model: LLM wiki
AutoGineer overview, from the brain’s own files
The system organizes data into three storage layers: raw sources, the wiki, and the schema. It uses a 4-tier memory hierarchy where information is promoted from L1-working (temporary session scratchpad) to L2-episodic (session summaries), L3-semantic (facts and entities with confidence scores), and L4-procedural (repeated methods). The harness uses specialized agents for tasks like ingestion, synthesis, and linting, triggered by specific skills. It maintains an index.md for cataloging and a log.md for chronological tracking, while using frontmatter metadata to manage status, confidence, and decay.
| Folder | Role | Files |
|---|---|---|
| .claude | agent-config | 33 |
| .github | agent-config | 1 |
| raw | raw-sources | 7 |
| templates | templates | 11 |
| tests | tests | 3 |
| tools | scripts | 166 |
| wiki | wiki | 6 |
| develop_docs | folder | 44 |
| metrics | folder | 2 |
The agent writes
- .gitignore evidence: README.md
Requirements
Databases: PostgreSQL
Works with: Claude Code, OpenCode
Set it up
This brain runs code automatically: 2 hooks (claude-code). Review .claude/settings.json before opening the folder in Claude Code. No step below turns a hook on for you.
.claude/settings.json:python3 "$CLAUDE_PROJECT_DIR"/.claude/skills/wiki-lint/scripts/wiki-status-check.py.claude/settings.json:python3 "$CLAUDE_PROJECT_DIR"/.claude/skills/wiki-lint/scripts/stamp-updated.py
- Download the brain as a ZIP and unzip it where you keep your notes or project: https://mp-staging.autogineer.com/agent-brains/cookyman74/llmwiki-harness/download
Claude Code reads CLAUDE.md from this folder automatically.
cd llmwiki-harness && claude
AutoGineer scanned these files at commit 139bc84.
First committed by cookyman74. Published in cookyman74/llmwiki-harness. Licence: MIT License.
Usage
AutoGineer overview, from the brain’s own files
- Ingesting new research papers or meeting notes into the wiki
- Querying the wiki for synthesized answers based on accumulated knowledge
- Running automated linting to identify stale information or missing links
- Maintaining Map of Content (MoC) pages for navigation
- Compressing session scratchpads into episodic memory
- Calculating confidence scores for facts based on source evidence
- “Ingest the notes in raw/meetings/project-kickoff.md into the wiki.”
- The agent extracts key facts, updates relevant entity pages, links the source, and updates the index.md.
- “Run a wiki-lint to check for stale information.”
- The agent identifies pages with low confidence or faded decay classes and marks them as archive candidates.
Documentation by cookyman74
LLM Wiki — Obsidian 볼트를 LLM이 유지보수하는 지식 베이스로 운영하기
Image: CI Image: Platform Image: Python Image: License: MIT Image: Obsidian Image: Claude Code Image: PRs Welcome
Obsidian을 IDE로, LLM을 프로그래머로, 위키를 코드베이스로. 사용자는 소스를 큐레이션하고 질문하고, LLM이 요약·교차참조·정리·부기(bookkeeping)를 전부 한다.
👉 처음이라면 INTRO.md 부터 — 이게 뭐고 왜 쓰는지 3분 소개.
이 문서 하나만 따라 하면 빈 Obsidian 볼트에서 시작해 자기 유지보수(self-maintaining) LLM 위키 하네스를 그대로 재현할 수 있다.
대상 도구: Claude Code (CLI/데스크톱/IDE)
언어: 노트 본문 한국어 / 파일명 영문 kebab-case
버전: v2.1 (통합 계층 기억 + lazy 인제스트·모델 라우팅) — v1(평평 구조) → v2(4계층·신뢰도·망각) → v2.1(비용 최적화)
목차
핵심 아이디어
아키텍처 — 3계층 저장 + 4계층 기억
디렉토리 구조 전체
처음부터 재현하기 (Setup)
하네스 구성요소 — 에이전트·스킬·스크립트
사용법 — 5가지 오퍼레이션 6.5. 일상 응용 시나리오
v2 메커니즘 상세 7.5. 질의 리트리벌 최적화 (v0.8.4~v0.9.0)
Frontmatter 스키마 레퍼런스
스크립트 레퍼런스
Obsidian 설정 팁
하네스 진화·확장
트러블슈팅
설계 결정 요약
1. 핵심 아이디어
대부분의 "LLM + 문서" 경험은 RAG다: 파일을 올리면 LLM이 질문마다 관련 조각을 검색해 답을 만든다. 문제는 누적이 없다는 것 — 매 질문마다 지식을 처음부터 재발견한다.
LLM Wiki는 다르다. LLM이 원본 소스와 당신 사이에 영속적인 위키(구조화·상호링크된 마크다운 파일 모음)를 점진적으로 만들고 유지한다. 새 소스를 넣으면 LLM은:
소스를 읽고 핵심 정보를 추출
기존 위키에 통합 — 엔티티 페이지 갱신, 요약 수정, 새 데이터가 옛 주장과 충돌하면 표시
교차참조·모순 표시·종합을 한 번 컴파일해두고 계속 최신화
즉 위키는 복리로 쌓이는 산출물이다. 교차참조는 이미 걸려 있고, 모순은 이미 표시돼 있고, 종합은 이미 읽은 모든 것을 반영한다.
역할 분담:
사람: 소스 큐레이션, 탐색 방향 결정, 좋은 질문
LLM: 요약·교차참조·정리·부기 — 위키를 지치지 않고 유지 (한 번에 15개 파일 갱신)
관련 정신: Vannevar Bush의 Memex(1945) — 개인이 큐레이션하는 지식 저장소, 문서 간 연상 경로. 그가 못 푼 것 = "누가 유지보수하나?". LLM이 그 답이다.
2. 아키텍처
2-1. 3계층 저장 (Storage)
| 계층 | 위치 | 소유 | 규칙 |
|---|---|---|---|
| Raw sources | raw/ | 사용자 | 본문 immutable — 내용 수정 금지, 진실의 원천. 단 인제스트 완료 스탬프(ingested/wiki_source/ingest_status)는 맨 위 메타 블록만 예외(본문 무변경). |
| The wiki | wiki/ | LLM | LLM이 전부 생성·유지. 사용자는 읽기만. |
| The schema | CLAUDE.md | 공동 | 구조·규약·워크플로우의 정본. 함께 진화. |
2-2. 4계층 기억 (Memory Tiers) — v2 핵심
v1의 한계(모든 정보가 영원히 동등·평평한 구조·품질 통제 없음)를 풀기 위해, 인간 기억 구조를 본떠 정보에 등급·시간·신뢰도를 부여한다. 정보는 아래층(휘발·구체)에서 위층(영속·추상)으로 반복·시간·신뢰도에 따라 승격한다.
raw/ ──▶ L1-working ──▶ L2-episodic ──▶ L3-semantic ──▶ L4-procedural
소스 작업기억 일화기억 의미기억 절차기억
(불변) 세션 스크래치 세션·소스 증거 사실·엔티티(신뢰도) 방법 steps
세션종료시 비움 "언제 무엇을" 증류된 지식 반복된 절차| 계층 | 폴더 | 담는 것 | 대표 파일 |
|---|---|---|---|
| L1 작업기억 | wiki/L1-working/ | 현재 세션 관찰·스크래치 | (임시, 세션 종료 시 비움) |
| L2 일화기억 | wiki/L2-episodic/ | 세션 요약, 소스 증거 | session-YYYY-MM-DD.md, source-*.md |
| L3 의미기억 | wiki/L3-semantic/ | 사실·엔티티·개념 (신뢰도 부여) | fact-*.md, entity-*.md, concept-*.md |
| L4 절차기억 | wiki/L4-procedural/ | 반복 관찰된 방법 (steps) | procedure-*.md |
| MoC (네비) | wiki/moc/ | 큐레이션 주제 지도 | home-moc.md, {topic}-moc.md |
승격 규칙:
L1 → L2 (세션 종료 시): L1 관찰을 3–5줄로 압축 →
session-*.md저장 → L1 비움L2 → L3 (lint 시): 같은 주장이 3회 이상 등장 →
fact-*.md로 승격 (모순 있으면 보류)L3 → L4 (lint 시): 같은 절차가 2회 이상 관찰 →
procedure-*.md로 추출
2-3. 특수 파일 두 개
index.md— 내용 지향. 위키 전체 카탈로그(페이지 + 한 줄 요약). 인제스트마다 자동 갱신. 질의 시 여기부터 읽어 관련 페이지를 찾는다.log.md— 시간 지향. append-only 기록. 각 항목## [YYYY-MM-DD] <op> | <제목>프리픽스 고정 →grep "^## \[" log.md | tail -5로 최근 이력 조회.
index.md vs MoC 차이: index는 "빠짐없이"(전수·기계적·평면), MoC는 "이해되게"(선별·큐레이션·계층). 둘 다 유지하되 역할을 섞지 않는다.
3. 디렉토리 구조 전체
llmwiki.obsidian/
├── CLAUDE.md # ★ 스키마 — 매 세션 로딩되는 정본 (규약·신뢰도·망각·관계 규칙)
├── CLAUDE.local.md # 개인 프로필 (gitignore — 공유 안 됨)
├── README.md # 이 문서
├── index.md # 전수 카탈로그 (자동 갱신)
├── log.md # 시간순 append-only 로그
│
├── raw/ # 원본 소스 (본문 immutable, 인제스트 스탬프만 예외)
│ ├── assets/ # 다운로드한 이미지
│ ├── meetings/ # 회의록 (verbal 소스)
│ ├── notes/ # 데일리 노트 (스크래치 — pending 스캔 제외)
│ └── ... # 자유 분류 (lecture/·article/·books/ 등)
│
├── wiki/ # LLM 소유 — 4계층 기억
│ ├── L1-working/ # 세션 스크래치 (종료 시 비움)
│ ├── L2-episodic/ # session-*.md, source-*.md
│ ├── L3-semantic/ # fact-*.md, entity-*.md, concept-*.md (신뢰도)
│ ├── L4-procedural/ # procedure-*.md (steps)
│ └── moc/ # 네비게이션 지도 (home-moc.md 현관 + {topic}-moc.md)
│
├── templates/ # Obsidian 템플릿
│ ├── meeting.md # 회의록 (→ raw/meetings/)
│ ├── daily.md # 오늘의 노트 (→ raw/notes/)
│ └── seeds/ # 빈 시드 (index·log·home-moc — 배포본 초기화용)
│
├── metrics/ # 비용대비효과 측정
│ ├── ingest-cost.csv # 문서당 토큰·페이지·모델 원장 (gitignore)
│ └── cost-report.py # 모델가중 비용 리포트
│
└── .claude/ # 하네스
├── settings.json # 훅 (SessionStart 자동 점검 + PostToolUse updated 스탬프)
├── agents/ # 전문가 정의 (누가) — 6개
│ ├── wiki-ingestor.md (model: sonnet)
│ ├── wiki-synthesizer.md
│ ├── wiki-linter.md
│ ├── wiki-cartographer.md
│ ├── wiki-consolidator.md
│ └── meeting-scribe.md (model: sonnet)
└── skills/ # 워크플로우 정의 (어떻게)
├── wiki-ops/ # ★ 오케스트레이터 (진입점)
├── wiki-ingest/ # 인제스트 절차 (lazy)
│ └── scripts/ # concept-index.py
├── wiki-query/ # 질의 절차
├── wiki-lint/ # 점검 절차
│ └── scripts/ # link-audit.py, decay.py, lint-due.py, search.py,
│ # ingest-status.py, wiki-status-check.py
├── wiki-moc/ # MoC 절차
├── wiki-consolidate/ # 통합·배치병합 절차
│ └── scripts/ # confidence.py, list-claims.py
├── weekly-review/ # 주간 리뷰 자동화
└── meeting-minutes/ # 녹음 → 전사 → 회의록 (로컬/OpenAI 이중 백엔드)
├── scripts/ # transcribe.py, apikey.py
└── references/ # backend-setup.md4. 처음부터 재현하기 (Setup)
세 갈래가 있다. 하네스 repo를 받았다면 방법 C가 가장 빠르다.
방법 C — git clone로 하네스 배포본 받기 (가장 빠름)
누군가 공유한 하네스 repo(구조·스킬만, 콘텐츠 제외)를 받아 바로 운영을 시작한다.
git clone <하네스-repo-URL> my-wiki && cd my-wiki개인 프로필 작성 —
CLAUDE.local.md를 만들어 자기 소개를 적는다(gitignore라 공유 안 됨). Claude가 세션마다 로딩해 설명 톤을 맞춘다:# CLAUDE.local.md ## 목적 / 사용자 프로필 - 역할: (백엔드 개발자 / 데이터 사이언티스트 / …) - 스택: (언어·프레임워크·인프라) - 관심/학습: (현재 파고드는 주제)시드 복사 — 빈 색인·로그·현관 MoC를 제자리로:
cp templates/seeds/index.md templates/seeds/log.md . cp templates/seeds/home-moc.md wiki/moc/Claude Code 실행 →
/hooks한 번 열기(훅 로드) → Obsidian에서 볼트 열기.raw/에 첫 소스를 넣고 "인제스트해줘" → 위키가 자란다.
업데이트 받기:
git pull. 하네스(스킬·에이전트·스크립트)만 갱신되고 내 콘텐츠는 그대로다. 내가 하네스를 고쳐 재배포:git add .claude/ CLAUDE.md README.md templates/ && git commit && git push— 콘텐츠·프로필은.gitignore라 안 올라간다. 볼트 밖(다른 프로젝트·Codex·Cursor 등)에서도 위키를 쓰려면: MCP 서버를 등록한다 — 설치·사용 가이드. 볼트에는 아무것도 설치하지 않는다(5-5 참고).
방법 A — myharness 팩토리로 자동 생성 (권장)
이 하네스는 myharness 플러그인(에이전트 팀 + 스킬 자동 구성 메타 스킬)으로 만들어졌다.
Obsidian 볼트 생성 — Obsidian에서 새 볼트를 만든다 (예:
llmwiki.obsidian).Claude Code를 볼트 디렉토리에서 실행 —
cd <볼트경로> && claude./init실행 (선택) — 기본 CLAUDE.md·규약 스캐폴딩.myharness 실행 — LLM Wiki 아이디어 문서를 인자로 넘겨 하네스 구성 요청:
/myharness:myharness <LLM Wiki 패턴 설명 + "MoC 네비게이션 포함" 요청>myharness가 Phase 0~7로 에이전트·스킬·스크립트·CLAUDE.md·훅을 생성한다.
v2 업그레이드 — 개선안(신뢰도·덮어쓰기·망각·4계층·엔티티·자동화)을 다시 myharness에 넘겨 아키텍처 변경을 요청하면 이 문서의 v2 구조로 확장된다.
방법 B — 수동 재현 (구조를 직접 만들기)
myharness 없이 파일을 직접 만들 때. 볼트 루트에서:
1) 디렉토리 스캐폴딩
mkdir -p raw/assets
mkdir -p wiki/L1-working wiki/L2-episodic wiki/L3-semantic wiki/L4-procedural wiki/moc
mkdir -p .claude/agents
mkdir -p .claude/skills/wiki-ops
mkdir -p .claude/skills/wiki-ingest
mkdir -p .claude/skills/wiki-query
mkdir -p .claude/skills/wiki-lint/scripts
mkdir -p .claude/skills/wiki-moc
mkdir -p .claude/skills/wiki-consolidate/scripts
# 빈 폴더가 git/OneDrive에서 유지되도록
find raw wiki -type d -exec touch {}/.gitkeep \;2) 파일 작성 — 아래 5장·8장·9장의 내용을 각 경로에 만든다:
CLAUDE.md(스키마 — 8장 frontmatter + 7장 규칙).claude/agents/*.md(5개 전문가 — 5-1장).claude/skills/*/SKILL.md(6개 스킬 — 5-2장)스크립트 10개 (9장) — 작성 후
chmod +x.claude/settings.json(훅 — 7-6장)index.md,log.md,wiki/moc/home-moc.md(시드)
3) 활성화
# 스크립트 실행권한
chmod +x .claude/skills/wiki-lint/scripts/*.sh .claude/skills/wiki-lint/scripts/*.py
chmod +x .claude/skills/wiki-consolidate/scripts/*.sh .claude/skills/wiki-consolidate/scripts/*.py
chmod +x .claude/skills/wiki-ingest/scripts/*.sh metrics/cost-report.pyClaude Code에서
/hooks를 한 번 열어 새 훅을 로드한다 (세션 중 추가된 훅은 설정 watcher가 즉시 못 잡는다 —/hooks열기 또는 재시작 필요).
사전 요구사항
Claude Code 설치
python3 (모든 결정적 스크립트 + 훅 — 표준 라이브러리만 사용)
(선택) Obsidian — 위키를 사람이 브라우징. 그래프 뷰로 위키 형태를 본다.
크로스플랫폼: 모든 스크립트·훅이 python3 전용이다(bash·grep·awk·jq·rg 불필요). 따라서:
macOS·Linux — 그대로 작동 (python3 기본/쉬운 설치).
Windows — 네이티브로 작동 (python3만 PATH에 있으면 됨; WSL·Git Bash 불필요). 단 훅 명령이
python3를 부르므로 Windows에서python만 있으면python3별칭을 잡아주거나 PATH에python3확보.줄바꿈은
.gitattributes가 LF로 정규화(Windows CRLF 손상 방지).
5. 하네스 구성요소
핵심 설계: 에이전트(누가) + 스킬(어떻게) 분리. 에이전트는 역할·원칙·프로토콜을, 스킬은 절차·템플릿을 담는다.
실행 모드: 전문가 풀 (서브 에이전트 디스패치). 오퍼레이션마다 전문가 1명을 호출한다 — 동시 협업 팀이 아니다. 한 소스 인제스트는 교차참조·신뢰도 일관성을 위해 단일 에이전트가 통째로 처리한다(분할하면 페이지 충돌).
5-1. 에이전트 (6명)
| 에이전트 | 역할 | 사용 스킬 | 모델 |
|---|---|---|---|
| wiki-ingestor | 소스 인제스트 (lazy) — L2 증거 + 신규 L3 초안만. 병합·신뢰도·덮어쓰기·관계는 lint 배치로 지연 | wiki-ingest, wiki-moc | sonnet |
| wiki-synthesizer | 질의 응답 — index→MoC→L3 탐색, 신뢰도·최신성 반영 인용 답변, 환류 | wiki-query, wiki-moc | opus |
| wiki-linter | 건강 검진 — 링크·망각·신뢰도 감사, 승격 후보, 모순 검사 | wiki-lint, wiki-consolidate, wiki-moc | opus |
| wiki-cartographer | MoC 네비게이션 — 허브 생성·갱신, L3/L4 편입, 도달성 점검 | wiki-moc | opus |
| wiki-consolidator | 기억 통합 — L1→L2 압축, L2→L3→L4 승격, 신뢰도 재계산 + lazy 후속 배치 병합(기존 페이지 통합·관계 구조화·중복 초안 정리) | wiki-consolidate, wiki-moc | opus |
| meeting-scribe | 전사문 → 회의록 — 결정·액션·미결 분리, 근거 있을 때만 발언 귀속. 2만 자 전사문을 격리 컨텍스트에서 소비 | meeting-minutes | sonnet |
모델 라우팅(v2.1): 인제스트는 추출·파일쓰기 위주라 sonnet(빈번한 경로를 싸게). 병합 판단·종합·감사 같은 고추론은 나머지 4개 에이전트가 opus로. 측정상 인제스트 페이지당 실질비용 ~4.6×↓·지연 ~3×↓.
각 에이전트 정의 파일(.claude/agents/{name}.md)의 frontmatter는 연결 계약을 담는다:
---
name: wiki-ingestor
description: <언제 이 에이전트를 쓰나 — pushy하게>
tools: Read, Write, Edit, Glob, Grep, Bash, WebFetch
model: sonnet # 인제스트=sonnet, 나머지 에이전트=opus (모델 라우팅)
skills: [wiki-ingest, wiki-moc] # 이 에이전트가 쓰는 스킬 (구성 자기평가용)
---본문 섹션: 핵심 역할 · 작업 원칙 · 입력/출력 프로토콜 · 이전 산출물이 있을 때 · 에러 핸들링 · 협업.
5-2. 스킬 (8개)
| 스킬 | 유형 | 하는 일 |
|---|---|---|
| wiki-ops | 오케스트레이터 (진입점) | Phase 0 컨텍스트 확인 → 라우팅 → 오퍼레이션 흐름 조율 |
| wiki-ingest | 워크플로우 | (lazy) 소스 → L2 증거 + 신규 L3 초안 (병합·신뢰도·관계·승격은 lint 지연) |
| wiki-query | 워크플로우 | 탐색 → 신뢰도 반영 인용 답변 → 환류 |
| wiki-lint | 워크플로우 | 스크립트 검사 → 망각·신뢰도·supersession 감사 → 배치 승격 → 추론 검사 |
| wiki-moc | 워크플로우 | MoC 허브 구조·계층·편입·도달성 |
| wiki-consolidate | 워크플로우 | 4계층 승격 (L1→L2→L3→L4) + lazy 후속 배치 병합(신뢰도·관계·기존 통합) |
| weekly-review | 워크플로우 | 주간 리뷰 자동 생성 — 완료·미결·stale·다음주 우선순위 → query 페이지 파일링 |
| meeting-minutes | 워크플로우 | 녹음 → 전사 → 회의록. 회의 민감도로 백엔드 분기(로컬 온디바이스 / OpenAI API) |
오케스트레이터 frontmatter는 orchestrates: 배열로 조율하는 에이전트를 선언:
---
name: wiki-ops
description: <pushy — 인제스트·질의·린트·MoC·통합 + 후속 키워드>
orchestrates: [wiki-ingestor, wiki-synthesizer, wiki-linter, wiki-cartographer, wiki-consolidator]
---5-3. 스크립트 (10개, 결정적 — LLM 토큰 0)
계산은 스크립트가, 의미 판단만 LLM이. 상세는 9장.
| 스크립트 | 위치 | 용도 |
|---|---|---|
confidence.py | wiki-consolidate/scripts | 소스 수·유형 → 신뢰도 점수 |
list-claims.py | wiki-consolidate/scripts | L2 주장(claim::) 수집 → 배치 병합·승격 |
concept-index.py | wiki-ingest/scripts | 기존 L3/L4 카탈로그 (본문 Read 없이 신규/기존 판별 — lazy의 핵심) |
decay.py | wiki-lint/scripts | Ebbinghaus 망각 보존율 계산·스캔 |
link-audit.py | wiki-lint/scripts | 끊긴 wikilink + 고아 + 누락 타겟(stub_targets) |
lint-due.py | wiki-lint/scripts | 마지막 lint 경과일 + L1 미압축 수 |
ingest-status.py | wiki-lint/scripts | raw 인제스트 상태 (done/pending) |
wiki-status-check.py | wiki-lint/scripts | SessionStart 훅 — lint 경과·L1·미인제스트 알림 |
search.py | wiki-lint/scripts | grep 기반 위키 본문 검색 |
cost-report.py | metrics/ | 문서당 토큰·모델가중 비용 리포트 |
transcribe.py | meeting-minutes/scripts | 녹음 전사 (로컬/OpenAI) — ffmpeg 정규화·청크·타임스탬프 |
apikey.py | meeting-minutes/scripts | OpenAI 키 해석·키체인 저장·인증 테스트 |
5-4. 회의록 파이프라인 — 외부 전송을 코드로 막는다
meeting-minutes는 다른 스킬과 성격이 하나 다르다. 오디오를 외부로 보낼지 말지라는 되돌릴 수 없는 결정을 포함한다.
판정은 회의 성격으로 한다 — 인사·평가·심사·계약·개인정보·보안·고객사 기밀은 로컬 온디바이스(mlx-whisper), 일반 업무회의·기술 논의·일정 조율만 OpenAI API. 애매하면 로컬이다. 오분류 비용이 비대칭이기 때문이다: 로컬 오분류는 시간만 더 들지만, OpenAI 오분류는 되돌릴 수 없다(삭제해도 캐시·색인이 남을 수 있다).
이 규칙을 SKILL.md에만 적으면 잊힌다. 그래서 스크립트가 --confirm-upload 없이는 openai 백엔드를 실행 자체를 거부한다. 플래그를 붙이는 행위가 곧 판정을 마쳤다는 기록이 된다.
$ transcribe.py --backend openai --input 회의.m4a
openai 백엔드는 오디오를 외부 서버로 전송한다.
민감 회의(인사·평가·심사·계약·개인정보)라면 --backend local 을 쓰라.
exit=1 # 네트워크 호출 0회산출물은 둘로 나뉜다. 전사 원문은 raw/meetings/transcripts/에 근거로 보존하고, 회의록만 raw/meetings/에 남겨 위키로 인제스트한다. 63분 녹음은 2만 자를 넘어 회의록의 가독성을 파괴하고 인제스트 토큰을 낭비한다. 회의록 작성은 meeting-scribe에 위임해 메인 컨텍스트가 전사문으로 오염되지 않게 한다.
화자 분리는 지원하지 않는다. Whisper 계열은 "누가 말했는지"를 출력하지 않는다.
meeting-scribe는 근거(호명·자기소개·역할 명시)가 있을 때만 발언을 귀속하고, 나머지는 화자 없이 기록한다. 심사·평가 회의에서 잘못된 발언 귀속은 내용 누락보다 해롭기 때문이다.
5-5. MCP 서버 (tools/llmwiki-mcp/) — 볼트 밖에서 위키 쓰기
지금까지의 구성요소는 모두 볼트 안에서 도는 Claude Code를 전제한다. 그런데 위키가 가장 아쉬운 순간은 대개 볼트 밖이다 — 다른 저장소에서 코드를 고치는 중, Codex CLI로 작업하는 중, Cursor에서 문서를 쓰는 중. 그때 위키를 열어 읽는 대신 에이전트가 위키에서 답을 찾게 하는 것이 이 서버다.
설치·사용법은 별도 문서에 있다 →
tools/llmwiki-mcp/docs/install-and-usage.ko.md(준비물, 3분 빠른 시작, 클라이언트 8종 등록, 사용법, 환경변수, 문제 해결, 업데이트·제거)
obsidian-llmwiki-mcp는 볼트를 읽기 전용으로 여는 MCP 서버다(Node ≥20, 사전 설치물은 Node 하나). 7.5장의 리트리벌(렉시컬 seed → 관계 1홉 확장 → MoC 멤버 → 옵션 BM25 rerank → claims 팩)을 도구 4개로 노출한다 — wiki_expand(진입점) · wiki_pack(주장·신뢰도 팩) · wiki_read_page(전문) · wiki_search(fallback). Claude Code(다른 프로젝트)·Codex·Gemini·agy·Cursor·Windsurf·Claude Desktop·VS Code 8종이 같은 서버를 등록해 쓴다. 등록은 클라이언트마다 한 줄이고, 스니펫은 서버의 print-config 가 만들어 준다.
볼트 안에서는 아무것도 바뀌지 않는다. wiki-query·wiki-ops는 지금처럼 search.py·scope-expand.py를 직접 부른다. 서버는 같은 규칙을 옮긴 것이고, 두 경로가 같은 결과를 낸다는 것을 패리티 테스트가 지킨다 — 볼트 안이든 밖이든 같은 답을 받는다.
위키는 읽기만 한다. 이 서버에는 파일을 쓰는 코드가 없고, 네트워크 연결도 LLM 호출도 하지 않는다. 인제스트·파일링·린트는 계속 볼트 하네스의 일이다. 그래서 설치·제거가 볼트에 아무 흔적을 남기지 않는다.
영문 상세 레퍼런스(도구 계약·상한·보안 경계)는 tools/llmwiki-mcp/README.md, 서버를 고칠 때 지켜야 할 규칙과 설계·검토 기록은 CLAUDE.md의 동기 규칙과 develop_docs/v0.8.6/에 있다.
6. 사용법 — 5가지 오퍼레이션
모든 작업의 진입점은 wiki-ops 오케스트레이터다. 위키 관련 요청을 하면 자동 트리거되고, 알맞은 전문가로 라우팅한다. 자연어로 요청하면 된다.
6-1. Ingest (소스 인제스트)
언제: 새 소스를 위키에 넣을 때.
1. raw/ 에 소스 파일을 넣는다 (예: raw/attention-is-all-you-need.md)
— Obsidian Web Clipper로 웹 기사를 markdown으로 저장하면 편하다.
2. Claude Code에서: "raw/attention-is-all-you-need.md 인제스트해줘"LLM이 하는 일 (v2.1 lazy — 싸고 빠르게):
소스 읽기 (본문 immutable) + 유형 판별 (공식/코드/일반/구두) + 중복 스탬프 체크
기존 개념은
concept-index.py카탈로그로만 파악 (페이지 본문 Read 안 함 — 위키가 커도 O(1))wiki/L2-episodic/source-*.md증거 페이지 — 핵심 사실 전부claim::로 (재등장 신호)신규 개념만
wiki/L3-semantic/초안 생성 (confidence 0.6 고정). 기존과 겹치면 손대지 않음신규 L3만 MoC에 가볍게 편입 +
index.md·log.md+ raw 맨 위 스탬프신규 페이지·claim 수 보고 + "병합·신뢰도·관계·승격은 다음 lint 배치" 명시
왜 lazy? v2는 인제스트마다 기존 페이지를 전수 Read하고 병합·관계까지 해서 위키가 클수록 토큰이 O(n)로 폭증했다. v2.1은 인제스트를 증거 남기기로 가볍게 하고, 병합은 본질적으로 효율적인 누적 후 lint 배치로 옮겼다(→ §6-5, §7).
6-2. Query (질의)
언제: 위키에 질문하거나 비교·분석이 필요할 때.
"우리 스택에서 PostgreSQL을 왜 쓰지? 근거랑 신뢰도까지"
"transformer와 RNN 비교표 만들어줘"LLM이 하는 일:
index.md→ 관련 MoC → L3 페이지 탐색 (없으면search.py)confidence·status·last_confirmed확인stale 페이지는 주근거로 안 씀 (superseded_by 따라 현재 페이지로)
각 주장에 신뢰도 + 출처 인용 병기
재사용 가치 있는 답은 위키에 환류 제안 → 승인 시 L3에 저장 (탐색이 복리로 쌓임)
6-3. Lint (건강 검진)
언제: 주기적으로, 또는 SessionStart 훅이 "3일+ 경과" 알릴 때.
"위키 점검해줘" / "위키 린트"LLM이 하는 일 (6단계):
스크립트:
link-audit.py(끊긴 링크·고아) +decay.py(망각 보존율)망각 처리: faded(R<0.3) 페이지 → 재확인 또는 아카이브 후보 (자동 삭제 금지)
신뢰도·supersession 감사: confidence 정합, stale 짝 링크 확인
통합 승격: L2→L3, L3→L4 후보 제안
추론 검사: 모순, 낡은 주장, 누락 개념, 빠진 관계
보고: 심각도 정렬 수리 목록 + 새 질문·소스 제안
lint 후 반드시
## [날짜] lint | ...를 log에 남긴다 — 자동화 훅이 경과일을 이 항목으로 계산한다.
6-4. MoC (네비게이션 정리)
언제: 주제 지도를 만들거나 갱신할 때.
"llmops 관련 MoC 만들어줘" / "네비게이션 정리해줘"LLM이 하는 일: wiki/moc/{topic}-moc.md 허브 생성/갱신, home-moc 계층 유지, 새 L3/L4 페이지 편입, 모든 L3/L4 페이지가 ≥1 MoC에서 도달 가능한지 점검(고아 방지).
6-5. Consolidate (기억 통합)
언제: 세션 마무리 시(L1→L2), 또는 lint 중(L2→L3→L4).
"세션 마무리하자" / "L1 압축해줘" / "통합해줘"LLM이 하는 일:
L1→L2: L1 관찰 3–5줄 압축 →
session-YYYY-MM-DD.md→ L1 비움L2→L3: 같은 주장 3회+ →
fact-*.md승격 (모순 시 보류)L3→L4: 같은 절차 2회+ →
procedure-*.md추출배치 병합 (lazy 인제스트 후속, v2.1): lazy가 미룬 일을 lint에서 일괄 — 신규 개념 ↔ 기존 페이지 병합,
sources:추가·신뢰도 재계산(claim 재등장 카운트),## 관계구조화, 중복 초안 정리. 병합은 여러 소스가 쌓인 뒤 한 번에 보는 게 효율적(소스마다 전수 스캔 회피).
6.5 일상 응용 시나리오 (단순 Q&A를 넘어)
단순 질문은 이 위키의 일부만 쓴다. 핵심 가치는 인제스트→축적→복리. 하루 업무 3블록 + 주간 리뷰에 매핑한 응용방안(외부 PKM/LLM-wiki 사례 리서치 기반).
① 회의 → 회의록 파이프라인
회의 직후 인제스트 → action item·결정사항을 claim으로 자동 추출.
회의 전 3분 브리핑 — "이 안건 지난 논의 뭐였지?" → 질의유형 라우팅으로 즉답(빠른 사실브리핑).
결정 로그(ADR) — 결정 번복 시 supersession(
status: stale+superseded_by)으로 "왜 바꿨나" 이력 보존.
② 학습 → 지식 복리 + 자동 복습
아티클/강의 인제스트 → concept 페이지 축적(흩어진 북마크 대신 연결된 지식).
신뢰도(confidence)로 이해도 추적 — 1소스 0.6="얕게 봄", 3소스 0.95="여러 각도 확인".
망각(forgetting)이 복습 엔진 — 보존율 하락 시 lint가 "복습 대상" 표시(Ebbinghaus). 일반 PKM엔 없는 기능.
③ 개발 → 운영지식·트러블슈팅 축적
트러블슈팅 로그 — 장애·해결 인제스트 → 같은 절차 2회+ 시 L4 procedure 자동 승격(런북화).
기술결정 기록 — "왜 X 대신 Y" concept + supersession.
운영지식(llmops·모니터링) — entity/procedure로 축적.
④ 주간 리뷰 (최고 ROI)
완료·미결(open loops)·stale·다음주 우선순위를 한 장으로 종합 → "몇 시간→몇 분". weekly-review 스킬로 자동화(/weekly-review, 금요일). 회고·계획·상급자 보고 초안을 한 번에.
이 위키만의 차별점 (일반 Notion+AI 대비)
| 기능 | 일상 용도 |
|---|---|
| 질의유형 라우팅 | 회의 전 3분 브리핑(빠름) |
| confidence | 보고 신뢰도·이해도 추적 |
| forgetting | 자동 복습 큐(학습) |
| supersession | 결정 번복 이력(ADR) |
| L3→L4 승격 | 반복 절차→런북 |
| session 압축 | 매일 작업 로그 자동 |
참고: Karpathy LLM Wiki(지식=컴파일된 코드) · AI Second Brain(회의노트→action item·주간리뷰 자동화) · living knowledge base. 상세 매핑은 위키 페이지
concept-wiki-daily-usage.
7. v2 메커니즘 상세
v2.1 타이밍 주의: 아래 신뢰도·덮어쓰기·관계는 개념이고, v2.1에서는 인제스트가 아니라 lint 배치 시점에 계산·구조화된다(lazy). 인제스트는 신규 개념에 confidence 0.6만 고정으로 붙이고, 재계산·병합·관계는 미룬다.
7-1. 신뢰도 점수 (Confidence)
주장의 확실성을 0.0~1.0으로. 소스 수·유형에서 결정적으로 계산 (confidence.py).
| 조건 | 점수 |
|---|---|
| 소스 1개 | 0.60 |
| 소스 2개 | 0.85 |
| 소스 3개 이상 | 0.95 |
| 소스 0개 (미확인) | 0.30 |
| + 공식 문서/코드 포함 | +0.10 |
| − 구두 정보(slack/회의록) | −0.10 |
최종값은 [0.0, 1.0]로 클램프. L3/L4 페이지 frontmatter confidence:에 기록하고, 질의 답변에 병기한다.
python3 .claude/skills/wiki-consolidate/scripts/confidence.py --count 3 --official # → 1.0
python3 .claude/skills/wiki-consolidate/scripts/confidence.py --kinds official,normal,verbal # → 0.957-2. 덮어쓰기 (Supersession)
새 정보가 옛 정보와 다르면 삭제하지 않고 명시 대체:
옛 페이지:
status: stale+superseded_by: [[새-페이지]]새 페이지:
supersedes: [[옛-페이지]]서로 링크, 타임스탬프 기록 → 이력 보존
어느 쪽이 맞는지 불명한 단순 상충은 대체가 아니라
> [!warning] 상충콜아웃으로 두 출처를 병기한다.
7-3. 망각 (Forgetting) — Ebbinghaus 곡선
시간이 지나면 정보의 보존율이 지수적으로 감쇠한다. 재확인하면 리셋.
보존율 R = exp(−Δt / S) — Δt = 마지막 확인 후 경과일, S = 안정성(decay_class가 결정).
| decay_class | S(일) | 성격 |
|---|---|---|
| architecture | 365 | 핵심 설계 결정 — 천천히 망각 |
| procedure | 365 | L4 절차 — 오래 감 |
| concept / semantic | 120 | 의미 개념 |
| entity | 90 | 엔티티 |
| episodic | 21 | 세션·소스 기록 — 바램 |
| transient | 7 | 일시적 버그·일회 관찰 — 빠르게 망각 |
| (default) | 90 |
보존율 밴드: R≥0.5 fresh / 0.3≤R<0.5 aging(재확인 권장) / R<0.3 faded(아카이브 후보 — 자동 삭제 금지).
리셋: 재확인 시 last_confirmed: 오늘 → Δt=0 → R=1.0.
lint가 decay.py --scan으로 faded 페이지를 표시한다.
7-4. 통합 계층 (Consolidation Tiers)
2-2장 참조. 요지: 반복·시간·신뢰도로 정보를 차등. 자주 확인되는 것은 위로 올라가 오래 살고(L4 절차), 한 번 스친 것은 아래에서 망각된다(L1/transient). 사람 기억이 그렇게 작동한다.
7-5. 엔티티 관계 (Entity Relations)
엔티티 페이지 ## 관계 섹션에 구조화된 관계를 기록 (Obsidian 인라인 필드 :: — Dataview 질의 가능):
## 관계
- caused :: [[incident-x]] (sources: 3, confidence: 0.9)
- depends_on :: [[postgres]] (sources: 1, confidence: 0.6)
- fixed :: [[bug-123]] (sources: 2, confidence: 0.85)관계 유형: uses · depends_on · contradicts · caused · fixed · supersedes. 각 관계에 소스 수·신뢰도 병기.
7-6. 자동화 (Automation)
정직한 한계: Claude Code 훅은 셸만 실행 — LLM lint를 스스로 못 돌린다. 그래서 훅은 조건 검사 + 알림까지만 한다.
두 개의 훅 (.claude/settings.json):
SessionStart 훅 —
wiki-status-check.py세션 시작 시 1회 실행 (Stop 훅은 매 턴 발화 = 스팸이라 회피)
lint-due.py로 마지막 lint 3일+ 경과 또는 L1 미압축 감지해당 시 모델 컨텍스트에 알림 주입 → Claude가 능동으로 lint/consolidate 제안
아무것도 안 걸리면
{}(조용)
PostToolUse 훅 —
updated:스탬프Write|Edit로.md파일을 건드리면 frontmatterupdated:를 오늘로 자동 갱신
진짜 자율 백그라운드 lint를 원하면 → Claude Code /schedule (클라우드 크론 에이전트)로 별도 배선. 예: "매주 월요일 위키 lint 돌려줘".
7.5 질의 리트리벌 최적화 (v0.8.4~v0.9.0)
질의 응답이 질의당 52~62k 토큰을 쓰던 문제(index 통독 + 광역 MoC 스윕)를 결정적 그래프 스코프 + 질의유형 라우팅으로 최적화했다. A/B 9라운드 실측·매 릴리즈 외부감사(agy). 상세: develop_docs/v0.8.3/TECH-SUMMARY.md, develop_docs/v0.8.5/COMBO.md, 실측 원장 metrics/ab-results.csv.
핵심 이동
[구식] 질의 → index(218줄) 통독 → MoC 다수 → 페이지 12~19 full-read → 종합
[신식] 질의 → scope-expand.py(0토큰): lexical seed → 관계 1홉 확장 → (rerank) → claims 팩
→ synthesizer: 팩 1-read → 부족분만 full-read → 종합적용 기술과 근거자료
| 기술 | 근거 | 우리 구현 |
|---|---|---|
| 그래프 확장 스코프 | GraphRAG — 지식그래프 엣지 탐색 | scope-expand.py expand: [[링크]] 파싱, lexical seed→관계 1홉(아웃·인·MoC멤버). 순수 lexical이 못 닿는 관계연결 페이지 도달 |
| claims 컨텍스트 팩 | Parent-Document Retriever(small-to-big) | 팩(claims)=small-side, 페이지 full=parent. 팩 1-read로 다중 페이지 대체 |
| 질의유형 라우팅 | Adaptive-RAG(질의복잡도 라우팅) | 조회=seed·사실브리핑=rerank+팩·절차=full-read. 하나의 전략은 만능 아님 |
| BM25 rerank | Anthropic Contextual Retrieval(reranking 실패 49→67%↓) | 임베딩 없이 BM25(0토큰)로 확장 pool을 질의관련도 top-N 축소 |
| 팩에 관계 포함 (v0.8.6) | 관계질의=관계 실린 사실브리핑 | pack이 ## 관계(uses/depends_on) 줄도 추출(+300토큰). 관계타겟(connector 등)을 새 라우트 없이 커버 |
요약: 우리 claims 팩 = parent-retriever의 small-side였고, rerank·라우팅이 빠진 조각이었다. Adaptive-RAG로 질의유형을 나누고, Contextual Retrieval의 reranking을 BM25로 얹어 완성.
질의유형별 라우팅 (파라미터)
| 유형 | 스코프 명령 | 전달 |
|---|---|---|
| 단일조회 | scope-expand.py expand … --max 6 | seed 목록 |
| 사실브리핑·비교 | … --max 20 --rerank 11 | claims 팩 |
| 절차·how-to | … --max 8(rerank 안 함) | 후보 full-read(팩 없음) |
실측 결과 (동일조건 A/B)
| 질의유형 | 구식(baseline) | 신식 | 개선 |
|---|---|---|---|
| 사실브리핑 | 50.6k / 14 tool | 22.7k / 1 tool | 토큰 −55%·tool −93% |
| 절차·how-to | 39.5k / 8 | ~38k / 10 | 동률(절차는 스코핑 이득 없음 — 본질적으로 다페이지 세부 필요) |
교훈 (실측 검증)
관계 도달은 lexical로 안 됨 → 그래프 1홉 확장 필수.
팩은 사실질의에만 이득 → 절차질의는 full-read 라우팅.
rerank는 최대 레버지만 다이얼 → 조이면 싸지고 recall 준다(11이 균형).
recall의 진짜 레버는
--max가 아니라 키워드 품질(엔티티 포함).절차질의 비용은 근본적 → 스코핑으로 못 줄임. 반복비용은 환류 캐시(query 페이지)로만.
관계질의는 새 유형 아님 → 팩에 관계 실으면 사실브리핑 라우트로 커버.
전체 근거자료·구현 상세·A/B 원장:
develop_docs/v0.8.3/TECH-SUMMARY.md. 관련 리서치 — GraphRAG · Parent-Document Retriever · Adaptive-RAG · Anthropic Contextual Retrieval · Contextual Compression · Self-RAG · Stop-RAG · AB-RAG.
8. Frontmatter 스키마 레퍼런스
모든 위키 페이지 상단에 YAML frontmatter. 파일이 type:을 가져야 위키 페이지로 인식된다(스크립트가 CLAUDE.md 같은 비-페이지를 걸러냄).
---
type: working | episodic | session | source | fact | entity | concept | procedure | moc | index | log | query
title: <한국어 제목>
aliases: [] # 영문 파일명의 한국어 라벨/별칭
tags: [] # 소문자, 예: [llm, training]
created: YYYY-MM-DD
updated: 2026-09-09
# --- L3/L4 전용 (신뢰도·망각) ---
confidence: 0.0~1.0 # confidence.py로 계산
sources: [소스-슬러그, …] # 근거 소스 (개수가 신뢰도 결정)
last_confirmed: YYYY-MM-DD # 재확인마다 갱신 → 망각 리셋
decay_class: architecture | procedure | concept | entity | episodic | transient
status: active | stale # 대체된 정보는 stale (삭제 안 함)
superseded_by: [[새-페이지]] # (옛 페이지에) 대체됨
supersedes: [[옛-페이지]] # (새 페이지에) 대체함
# --- source 페이지 전용 ---
source_url: <URL 또는 raw 경로>
source_kind: official | code | normal | verbal
---raw 파일 인제스트 스탬프 (raw/ 원본 맨 위에만 추가 — 본문 무변경, 완료 표시·중복 방지):
---
ingested: YYYY-MM-DD
wiki_source: [[source-<slug>]] # 생성된 L2 증거 페이지
ingest_status: done
---raw 본문은 immutable이지만 이 상태 스탬프는 예외. ingest-status.py가 이 표시로 done/pending을 판별한다.
규약 요약:
본문 한국어, 파일명 영문 kebab-case (
[[wikilinks]]깔끔)[[wikilinks]]양방향, 없는 페이지 링크는 스텁으로 남김모든 L3/L4 페이지는 ≥1 MoC 도달 가능 (고아 방지)
소스 immutable, 충돌은 병기 또는 supersession
파일 이동·이름변경은 승인 후 (wikilink 깨짐)
9. 스크립트 레퍼런스
confidence.py
# 소스 수 + 유형으로 신뢰도 계산
python3 .claude/skills/wiki-consolidate/scripts/confidence.py --count 2 # 0.85
python3 .claude/skills/wiki-consolidate/scripts/confidence.py --count 1 --official # 0.7
python3 .claude/skills/wiki-consolidate/scripts/confidence.py --kinds official,normal # count=2, +official → 0.95
python3 .claude/skills/wiki-consolidate/scripts/confidence.py --count 3 --json # {"score":0.95,...}소스 유형: official|code(+0.1) · verbal(−0.1) · normal.
decay.py
# 단일 페이지 보존율
python3 .claude/skills/wiki-lint/scripts/decay.py --class architecture --last 2026-01-01 # "0.57 fresh"
python3 .claude/skills/wiki-lint/scripts/decay.py --class transient --last 2026-07-01 # "0.04 faded"
# 위키 전체 스캔 — faded/aging 페이지 나열
python3 .claude/skills/wiki-lint/scripts/decay.py --scan . --json--today YYYY-MM-DD로 기준일 지정 가능(기본 오늘). last_confirmed 없으면 updated: 사용.
link-audit.py
python3 .claude/skills/wiki-lint/scripts/link-audit.py . # 사람이 읽는 리포트
python3 .claude/skills/wiki-lint/scripts/link-audit.py . --json # {broken, orphans, ...}broken: 대상 페이지가 없는
[[wikilink]]((page,target) 중복 제거)orphans: inbound 링크 0인 페이지 (단, index/log/working/episodic/session/source 유형은 제외 — 정상적으로 inbound 0)
stub_targets: 없는 페이지를 가리키는 링크를 참조 페이지 수(inbound)순으로 집계 → 여러 페이지가 가리키는 스텁 = 누락 개념 최우선 작성 후보. (의도된 스텁과 오타 broken을 구분하는 신호)
HTML 주석·코드펜스 안의 링크는 무시.
type:있는 파일만 페이지로 취급.
lint-due.py
python3 .claude/skills/wiki-lint/scripts/lint-due.py . 3 # 임계 3일
# 출력: "DUE 5" | "OK 2" | "NEVER" + "L1:<미압축 페이지 수>"log.md의 마지막 ## [날짜] lint 항목으로 경과일 계산.
wiki-status-check.py
SessionStart 훅이 호출. lint-due.py 결과로 알림 JSON을 만든다. DUE거나 L1>0이면 {"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":"..."}}, 아니면 {}.
search.py
python3 .claude/skills/wiki-lint/scripts/search.py "transformer" # wiki/ 전체 grep (rg 미의존)list-claims.py
python3 .claude/skills/wiki-consolidate/scripts/list-claims.py . # L2-episodic의 claim:: 라인 수집같은 주장이 3회+ 등장하는지 LLM이 클러스터링하는 입력(배치 병합·승격).
concept-index.py
python3 .claude/skills/wiki-ingest/scripts/concept-index.py . # 기존 L3/L4 카탈로그
# 출력: slug | title | aliases | confidence (frontmatter만, 한 줄씩)lazy 인제스트의 핵심 — 45개 페이지 본문을 Read하는 대신 이 한 출력만 보고 개념이 기존인지 신규인지 판별한다(토큰 O(1) 유지).
cost-report.py
python3 metrics/cost-report.py # 문서당 토큰·페이지 효율 표
python3 metrics/cost-report.py --by-model # opus vs sonnet 비교 (모델가중 wcost)metrics/ingest-cost.csv(오케스트레이터가 인제스트마다 append)를 읽어 tok/page·모델가중 비용을 낸다. v2/v2.1 비용대비효과 추적용. MODEL_PRICE 상대단가 opus 5·sonnet 1·haiku 0.25.
ingest-status.py
python3 .claude/skills/wiki-lint/scripts/ingest-status.py . # raw/ 인제스트 상태
# 출력: DONE <date> <file> | PENDING <file> + "ingested: N pending: M"raw 파일 맨 위 스탬프(ingest_status: done)를 읽어 인제스트 완료/대기를 판별. raw 본문은 immutable — 스탬프는 맨 위 메타 블록만 추가(본문 무변경). Obsidian에서 각 소스에 완료 표시가 보이고, 중복 인제스트를 막는다. wiki_source 필드는 생성된 L2 증거 페이지로 클릭 이동. 미인제스트 소스는 SessionStart 훅도 알린다.
환경 주의: 스크립트는 grep·python3만 의존한다.
rg(ripgrep)는 비로그인 셸 PATH에 없는 경우가 많아 쓰지 않는다.
10. Obsidian 설정 팁
Web Clipper — 브라우저 확장. 웹 기사를 markdown으로 변환해
raw/에 빠르게 저장.이미지 로컬 다운로드 — Settings → Files and links → Attachment folder path를
raw/assets/로. Settings → Hotkeys에서 "Download attachments for current file"을 단축키(예: Ctrl+Shift+D)로 바인딩. 클리핑 후 눌러 이미지 로컬 저장 → LLM이 이미지를 직접 참조 가능(끊기는 URL 대신).단, LLM은 인라인 이미지가 섞인 md를 한 번에 못 읽는다 — 텍스트 먼저 읽고, 필요한 이미지만 별도로 본다.
그래프 뷰 — 위키 형태(허브·고아)를 보는 최고의 도구.
Dataview 플러그인 — frontmatter(confidence·tags·sources·관계
::)로 동적 테이블·리스트 생성.Marp 플러그인 — 위키 내용에서 슬라이드 덱 직접 생성.
git — 위키는 결국 markdown git 레포. 버전 이력·브랜치·협업 무료.
템플릿 (회의록·오늘의 노트)
templates/에 두 템플릿이 있다. Obsidian 코어 플러그인으로 연결한다.
회의록 — templates/meeting.md → raw/meetings/
성격: 회의는 구두 소스(
source_kind: verbal) — 인제스트 시 신뢰도 −0.1.섹션: 안건 / 논의·결정 / 액션. frontmatter=메타(date·attendees), 본문=내용, 파일명=제목(중복 없음).
연결: 설정 → 코어 플러그인 Templates 켜기 → 템플릿 폴더
templates→ 새 노트에서Cmd+P→ "Insert template" → meeting.흐름: 회의 중 기록 →
raw/meetings/에 저장 → "인제스트해줘" → 결정·액션이 위키에 통합(ingest-status가 자동으로 pending 감지).
오늘의 노트 — templates/daily.md → raw/notes/
성격: 개인 스크래치(할 일·배운 것). 지식이 아니라 타임라인 → 인제스트해도 L2-episodic 기록만, L3 개념 생성 안 함.
섹션: 할 일 / 한 일·배운 것 / 메모. 파일명=날짜.
연결: 설정 → 코어 플러그인 Daily notes 켜기 → New file location
raw/notes· Template file locationtemplates/daily· Date formatYYYY-MM-DD→ 달력 아이콘/"Open today".주의:
raw/notes/는 인제스트 pending 스캔에서 제외돼 있다(매일 노트가 알림을 시끄럽게 안 만들게). 특정 날 노트를 위키에 넣고 싶으면 수동 인제스트.
동적 템플릿: 날짜 자동·참석자 입력이 필요하면 Templater 커뮤니티 플러그인.
{{date}}→<% tp.date.now("YYYY-MM-DD") %>, 입력받기<% tp.system.prompt("제목") %>. 폴더 템플릿으로raw/meetings/·raw/notes/에 새 노트 만들 때 자동 적용도 가능.
11. 하네스 진화·확장
하네스는 정적 산출물이 아니라 진화하는 시스템이다.
피드백 반영 경로:
피드백 유형 수정 대상 결과물 품질 해당 에이전트의 스킬 ( .claude/skills/*/SKILL.md)에이전트 역할 에이전트 정의 ( .claude/agents/*.md)워크플로우 순서 오케스트레이터 ( wiki-ops/SKILL.md)트리거 누락 스킬 description 신뢰도 규칙 confidence.py(base_for·모디파이어)망각 속도 decay.pySTABILITY 딕셔너리승격 임계 wiki-consolidate/SKILL.md(3회/2회)모든 변경은
CHANGELOG.md(하네스 변경 이력)에 기록 — 하네스가 어떻게 진화했는지 추적, 퇴행 방지. (2026-09-11 에CLAUDE.md에서 분리 — CLAUDE.md 는 현재 규칙만 둔다)재-myharness: 큰 아키텍처 변경은
/myharness:myharness에 개선안을 넘겨 자동 확장.update인자로 팩토리 정본 변경을 빌드된 하네스에 재전파(사용자 수정 보존).
튜닝 예시 — 망각을 더 느리게:
# .claude/skills/wiki-lint/scripts/decay.py 의 STABILITY 수정
STABILITY = { "architecture": 730, ... } # 365 → 730일12. 트러블슈팅
| 증상 | 원인 | 해결 |
|---|---|---|
| SessionStart 알림이 안 뜬다 | 세션 중 추가된 훅을 watcher가 미로드 | Claude Code에서 /hooks 한 번 열기 또는 재시작 |
updated: 자동 스탬프 안 됨 | 위와 동일 (훅 미로드) | /hooks 열기 |
| 스크립트 "command not found: rg" | 비로그인 셸 PATH에 rg 없음 | 이미 grep 기반이라 무관 — 커스텀 스크립트 추가 시 rg 대신 grep 사용 |
link-audit.py가 CLAUDE.md를 고아로 잡음 | 구버전 | 최신 버전은 type: 없는 파일 제외 — 스크립트 갱신 |
| 볼트가 비어 보임 (파일 없음) | OneDrive 클라우드 미동기 | Finder에서 "이 기기에 항상 유지" 또는 OneDrive 동기 강제 |
| 위키 페이지가 검색 안 됨 | frontmatter type: 누락 | 모든 페이지에 type: 부여 (스크립트가 페이지 판별 기준으로 씀) |
| decay.py가 페이지를 스캔 안 함 | last_confirmed·updated 둘 다 없음 | frontmatter에 날짜 필드 추가 |
검증 명령 모음:
# 링크 정합
python3 .claude/skills/wiki-lint/scripts/link-audit.py .
# 스크립트 문법
for s in $(find .claude/skills -name '*.sh'); do bash -n "$s"; done
for p in $(find .claude/skills -name '*.py'); do python3 -m py_compile "$p"; done
# 훅 JSON 유효성
jq -e '.hooks' .claude/settings.json13. 설계 결정 요약
| 결정 | 이유 |
|---|---|
| 전문가 풀(서브 에이전트), 팀 아님 | 오퍼레이션은 서로 다른 시점에 1명씩 실행 — 동시 협업 불필요. 인제스트는 단일 에이전트가 통째로(교차참조 일관성) |
| 계산은 스크립트, 판단은 LLM | 링크·신뢰도·망각은 결정적 → 스크립트가 공짜로. LLM 예산은 의미 검사(모순·승격 동치)에만 |
| grep 기반 스크립트 | rg는 비로그인 셸 PATH에 없는 경우가 많음 |
| SessionStart 훅 (Stop 아님) | Stop은 매 턴 발화=스팸. SessionStart는 세션당 1회 |
| 훅은 알림까지만 | 훅은 셸만 실행 — LLM lint 자동 실행 불가. 진짜 자율은 /schedule |
| stale 마킹, 삭제 안 함 | 이력 보존 — 언제 무엇이 왜 바뀌었는지 추적 |
| 단일 런타임 (Claude Code) | Codex 미사용 — AGENTS.md/.codex 중복 동기 부담 회피 |
| index.md + MoC 병존 | index=전수(기계적), MoC=큐레이션(계층). 임베딩 RAG 없이 수백 페이지 항해 |
| lazy 인제스트 (v2.1) | 인제스트는 증거+신규초안만, 병합·신뢰도·관계·승격은 lint 배치로. eager는 위키 클수록 O(n) 토큰 폭증 — 병합은 누적 후 일괄이 효율적 |
| 모델 라우팅 (v2.1) | 인제스트=sonnet(기계적·빈번), 나머지=opus(고추론). 측정 페이지당 실질비용 ~4.6×↓·지연 ~3×↓ |
| 비용 원장 (v2.1) | metrics/ — 문서당 토큰·모델가중 비용 추적. 최적화 효과를 숫자로 검증 |
| raw/notes 스캔 제외 | 데일리 노트는 스크래치 — 매일 pending 알림 스팸 방지, 넣고 싶은 날만 수동 인제스트 |
부록 — 빠른 시작 (TL;DR)
1. Obsidian 볼트 생성, Claude Code를 볼트에서 실행
2. /hooks 한 번 열어 훅 로드
3. raw/ 에 첫 소스 넣기 (Web Clipper 추천)
4. "이 소스 인제스트해줘" → L2 증거 + L3 사실(신뢰도) 생성
5. "llmops MoC 만들어줘" → 네비게이션 지도
6. "위키에 ~ 질문" → 신뢰도 포함 인용 답변
7. "위키 린트" → 망각·모순·승격 점검
8. "세션 마무리" → L1→L2 압축
9. Obsidian 그래프 뷰로 위키 형태 브라우징현재 상태는
CLAUDE.md(스키마), 하네스 변경 이력은CHANGELOG.md, 위키 타임라인은log.md가 정본이다.
tools/llmwiki-mcp/docs/install-and-usage.ko.md
obsidian-llmwiki-mcp 설치·사용 가이드
obsidian-llmwiki-mcp는 옵시디언 LLM 위키 v2 볼트를 읽기 전용으로 여는 MCP 서버입니다. 볼트 밖에서 일하는 에이전트 — 다른 저장소의 Claude Code, Codex CLI, Gemini CLI, agy, Cursor, Windsurf, Claude Desktop, VS Code — 가 위키를 통째로 다시 읽지 않고, 필요한 페이지와 주장(claim)만 골라 답할 수 있게 해 줍니다.
도구 4개(
wiki_expand·wiki_pack·wiki_read_page·wiki_search)를 stdio 로 제공합니다.쓰지 않습니다. 파일 쓰기 API 가 코드에 없고(CI 가 검사), 네트워크 연결도 LLM 호출도 하지 않습니다. 인제스트·파일링·린트는 계속 볼트 안의 하네스(
wiki-ops)가 합니다.패키지 이름과 명령 이름이 다릅니다. npm 패키지는
obsidian-llmwiki-mcp, 설치되는 명령은llmwiki-mcp입니다.npx -y obsidian-llmwiki-mcp …는 그 명령을 바로 실행합니다.
영문 상세 레퍼런스(도구 계약·상한·보안 경계)는 패키지 README에 있습니다. 이 문서는 한국어로 설치와 일상 사용에 필요한 것만 추렸습니다.
1. 준비물
| 항목 | 요구 |
|---|---|
| Node.js | 20 이상 — node -v 로 확인 |
| 볼트 | 아래 구조의 LLM 위키 v2 볼트(이 저장소 하네스로 운영하는 볼트) |
| Python | 필요 없습니다. 저장소의 Python 스크립트는 정본 구현(패리티 테스트 기준)일 뿐 런타임 의존성이 아닙니다 |
서버가 읽는 곳은 <볼트>/wiki/ 아래뿐입니다. raw/·index.md·log.md·.obsidian/ 은 보지 않습니다.
<볼트>/ ← --root 에 넘기는 경로는 이 폴더(wiki/ 의 부모)입니다
└── wiki/
├── L1-working/ *.md
├── L2-episodic/ *.md
├── L3-semantic/ *.md
├── L4-procedural/ *.md
└── moc/ *.md2. 빠른 시작 (Claude Code 기준, 3분)
① 볼트를 제대로 읽는지 확인 — 설치 없이 바로 실행됩니다.
npx -y obsidian-llmwiki-mcp --selftest --root "<볼트 경로>"llmwiki-mcp 0.1.0 selftest
root: vault (sha256:6fa15f0f)
pages: 25
mocs: 3
buildGraph_ms: 7
startup_to_ready_ms: 11pages 가 볼트의 페이지 수와 비슷하면 정상입니다. 경로는 로그·스크린샷에 새지 않도록 폴더 이름+해시로만 표시됩니다(전체 경로가 필요하면 --show-root). 첫 실행은 패키지를 내려받느라 몇 초 걸리고(실측 약 2.8초), 이후에는 1초 이내입니다.
② 등록 — 모든 프로젝트에서 보이도록 사용자 범위로 등록합니다.
claude mcp add --scope user llmwiki -- npx -y obsidian-llmwiki-mcp --root '<볼트 경로>'③ 확인 — claude mcp list 에 llmwiki 가 connected 로 보이면 됩니다. 이제 볼트 밖의 아무 프로젝트에서 이렇게 물어보세요.
위키 기준으로 RAG 청킹과 임베딩에 대해 정리해줘. 신뢰도도 같이 적어줘.
3. 클라이언트별 등록
등록 스니펫은 서버가 직접 만들어 줍니다. 출력만 하고 설정 파일은 건드리지 않습니다(설정 파일에 다른 서버의 비밀값이 있을 수 있기 때문).
npx -y obsidian-llmwiki-mcp print-config --client <클라이언트> --root "<볼트 경로>"
# <클라이언트> = claude-code | codex | agy | gemini | cursor | windsurf | claude-desktop | vscode아래 블록은 그 명령의 실제 출력(0.1.0)에서 옮겼습니다 — 설명 주석 줄은 빼고, JSON 배열은 한 줄로 줄였으며, 모양이 같은 Cursor·Windsurf·Claude Desktop 은 하나로 묶었습니다. 내용(명령·인자·키)은 출력과 같습니다. <VAULT> 자리에 볼트 경로가 들어갑니다. JSON 설정형은 기존 파일의 mcpServers(VS Code 는 servers)에 병합하세요 — 파일을 통째로 덮어쓰면 다른 서버 설정이 사라집니다.
Claude Code
claude mcp add --scope user llmwiki -- npx -y obsidian-llmwiki-mcp --root '<VAULT>'Codex CLI
codex mcp add llmwiki -- npx -y obsidian-llmwiki-mcp --root '<VAULT>'첫 실행이 Codex 기본 기동 타임아웃(10초)을 넘으면 ~/.codex/config.toml 에 타임아웃을 추가합니다. codex mcp add -c … 로는 지정할 수 없습니다(0.153.4 실측 — "invalid transport" 로 실패).
[mcp_servers.llmwiki]
command = "npx"
args = ["-y", "obsidian-llmwiki-mcp", "--root", "<VAULT>"]
startup_timeout_sec = 60
codex exec(비대화형)로 쓸 때: 기본approval: never가 MCP 도구 호출을 막습니다.--approve-for-me를 붙여야 도구가 실행됩니다.
agy
agy mcp add llmwiki -- npx -y obsidian-llmwiki-mcp --root '<VAULT>'agy 는 도구 선택이 다른 클라이언트보다 약해 wiki_search→전문 읽기로 새는 경향이 있습니다. 규칙 스니펫을 함께 설치하길 권합니다.
Gemini CLI — ~/.gemini/settings.json
{
"mcpServers": {
"llmwiki": {
"command": "npx",
"args": ["-y", "obsidian-llmwiki-mcp", "--root", "<VAULT>"]
}
}
}Cursor · Windsurf · Claude Desktop
셋 다 같은 모양이고 볼트 경로를 env 로 넘깁니다. 파일 위치만 다릅니다.
| 클라이언트 | 설정 파일 |
|---|---|
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Claude Desktop | claude_desktop_config.json |
{
"mcpServers": {
"llmwiki": {
"command": "npx",
"args": ["-y", "obsidian-llmwiki-mcp"],
"env": { "LLMWIKI_ROOT": "<VAULT>" }
}
}
}VS Code (Copilot) — .vscode/mcp.json
최상위 키가 mcpServers 가 아니라 servers 이고 "type": "stdio" 가 들어갑니다.
{
"servers": {
"llmwiki": {
"type": "stdio",
"command": "npx",
"args": ["-y", "obsidian-llmwiki-mcp", "--root", "<VAULT>"]
}
}
}Windows
어느 클라이언트든 --windows 를 붙여 생성하세요. 명령이 cmd /c 로 감싸지고, 볼트 경로는 명령줄이 아니라 항상 LLMWIKI_ROOT 환경변수로 전달됩니다(cmd.exe 는 큰따옴표 안에서도 %VAR% 를 확장하기 때문).
npx -y obsidian-llmwiki-mcp print-config --client claude-code --root "<VAULT>" --windowsclaude mcp add --scope user --env "LLMWIKI_ROOT=<VAULT>" llmwiki -- cmd /c npx -y obsidian-llmwiki-mcp경로에
%나!가 있으면 명령형 등록은 거부됩니다 — Cursor 같은 JSON 설정형을 쓰세요.PowerShell 에서 붙여 넣을 때는 값을 작은따옴표
'…'로 감싸세요.Windows 등록 스니펫은 문법을 단위 테스트로 고정했지만, 실제 cmd.exe·PowerShell 에서의 등록은 아직 실측하지 못했습니다.
전역 설치로 쓰기(선택)
매번 npx 로 받지 않고 한 번 설치해 두면 기동이 빨라지고 오프라인에서도 동작합니다. Codex 타임아웃을 피하는 가장 간단한 방법이기도 합니다.
npm i -g obsidian-llmwiki-mcp
npx -y obsidian-llmwiki-mcp print-config --client claude-code --root "<VAULT>" --globalclaude mcp add --scope user llmwiki -- llmwiki-mcp --root '<VAULT>'전역 설치 뒤에는 명령 이름 llmwiki-mcp 를 씁니다(예: llmwiki-mcp --selftest --root "<VAULT>").
4. 사용법
4.1 그냥 물어보면 됩니다
등록만 하면 에이전트가 알아서 도구를 고릅니다. "위키 기준으로", "위키에 뭐라고 돼 있어?" 처럼 위키를 가리키면 더 확실히 도구를 씁니다.
| 질문 예 | 에이전트가 하는 일 |
|---|---|
| "RAG 청킹과 임베딩에 대해 정리해줘" (사실 브리핑) | wiki_expand(rerank=11) → wiki_pack — 주장·신뢰도 팩으로 답합니다 |
| "HGX 섀시와 NVL72 랙 차이가 뭐야?" (비교) | 위와 같습니다 |
| "녹음 파일을 회의록으로 만드는 절차 알려줘" (절차) | wiki_expand(max=8) → wiki_read_page — 절차 페이지 본문을 읽습니다 |
| "concept-rag 페이지가 있어?" (단일 조회) | wiki_expand(max≤6) — seed 결과만으로 답합니다 |
4.2 도구 4개
| 도구 | 언제 | 입력(기본값·범위) | 돌려주는 것 |
|---|---|---|---|
wiki_expand | 모든 위키 질문의 첫 호출 | terms 1maxtop_seed 6(1rerank | 후보 페이지 목록(tier⇥refs⇥slug⇥type, rerank 시 점수) + 마지막 줄 suggested_next: |
wiki_pack | 사실 브리핑·비교 — expand 다음 | slugs 1~30개 | 페이지별 ## slug [type · conf · status] + 주장(claim)·요약·관계 |
wiki_read_page | 절차 질문, 또는 팩으로 결론이 안 날 때 | slug 1개(별칭은 한 번 따라감) | frontmatter 포함 본문 전체(최대 200KB) |
wiki_search | expand 후보가 너무 적을 때만(fallback) | terms 1top | 일치 페이지 목록 |
terms 는 공백으로 구분한 문자열 하나로 보내도 됩니다. slug 에 [[…]]·.md·wiki/…/ 가 붙어 있어도 알아서 떼어 냅니다.
4.3 서버가 요청하는 답변 규칙
신뢰도 병기 — 팩 헤더의
conf(0.6 / 0.85 / 0.95 …)를 답의 각 주장에 같이 적습니다.stale 따라가기 —
status: stale페이지는 주근거로 쓰지 않고,superseded_by가 가리키는 active 페이지를wiki_read_page로 확인합니다.읽기 전용 — 위키에 저장·수정하려면 볼트 안의
wiki-ops를 쓰세요.
이 규칙과 라우팅 표는 서버의 instructions, 각 도구 설명, wiki_expand 의 suggested_next 줄에 모두 들어 있어서 별도 설정 없이도 대부분의 클라이언트가 따릅니다. 실측(2026-09-10, 규칙 파일 없음): Claude Code 사실 3/3·절차 2/2, Codex 5/5 준수.
4.4 규칙 스니펫 (라우팅이 약한 클라이언트용)
도구를 엉뚱하게 고르는 클라이언트(실측상 agy)에는 저장소의 규칙 스니펫을 설치합니다. 원본은 templates/mcp-client-guide.md, 클라이언트별 파생본은 templates/clients/ 에 있습니다.
| 클라이언트 | 파생본 | 설치 위치 |
|---|---|---|
| Claude Code | claude-skill/SKILL.md | ~/.claude/skills/llmwiki-query/SKILL.md |
| agy | claude-skill/SKILL.md(같은 형식) | ~/.agents/skills/llmwiki-query/SKILL.md — 2026-09-09 실측 |
| Codex CLI | codex-AGENTS.md | ~/.codex/AGENTS.md 에 내용 추가 — P3 실측에 사용 |
| Gemini CLI | gemini-GEMINI.md | Gemini 의 GEMINI.md 규칙 파일(실사용 미검증) |
| Cursor | cursor-llmwiki.mdc | Cursor 규칙 파일(.mdc, 실사용 미검증) |
스니펫은 준수율을 높이는 보조 수단이고, 없어도 서버는 동작합니다.
5. 환경변수
| 변수 | 값 | 설명 |
|---|---|---|
LLMWIKI_ROOT | 볼트 경로 | --root 대신 쓸 수 있습니다. 둘 다 있으면 --root 가 이깁니다 |
LLMWIKI_DEBUG | 1 | 도구별 소요 시간을 stderr 에 남깁니다([llmwiki] wiki_pack 12ms). 질의어·slug·본문·볼트 경로는 기록하지 않습니다 |
LLMWIKI_CACHE | 0 / 1 | 프로세스 내 캐시를 강제로 끄거나 켭니다. 미지정이면 서버는 켜고 --once·--selftest 는 끕니다 |
LLMWIKI_STRUCTURED | 1 | 텍스트와 함께 structuredContent(+ 도구별 outputSchema)도 보냅니다. 기본은 텍스트만 — 구조화 필드를 프로그램으로 쓰는 클라이언트에서만 켜세요(1 외의 값은 무시) |
JSON 설정형이라면 env 블록에, Claude Code 라면 claude mcp add … --env LLMWIKI_DEBUG=1 … 처럼 넣습니다.
6. 명령어
llmwiki-mcp --root <vault> MCP stdio 서버 기동 (클라이언트가 실행)
llmwiki-mcp --selftest [--root <vault>] [--show-root] 페이지·MoC 수와 소요 시간 출력 후 종료
llmwiki-mcp print-config --client <c> --root <vault> [--windows] [--global] [--name <server>]
llmwiki-mcp --once <search|expand|pack> <args…> --root <vault> 서버 없이 1회 실행
llmwiki-mcp --version | --helpnpx 로 쓸 때는 앞의 llmwiki-mcp 를 npx -y obsidian-llmwiki-mcp 로 바꾸면 됩니다. --once 는 에이전트 없이 검색 결과를 직접 보고 싶을 때 유용합니다.
npx -y obsidian-llmwiki-mcp --once expand 벡터 인덱스 --root "<VAULT>" --max 20 --rerank 11
npx -y obsidian-llmwiki-mcp --once pack concept-vector-index --root "<VAULT>"7. 문제 해결
| 증상 | 원인·해결 |
|---|---|
vault root required: pass --root <path> or set LLMWIKI_ROOT (종료 코드 2) | 볼트 경로를 넘기지 않았습니다. --root 또는 LLMWIKI_ROOT 를 지정하세요 |
vault root not found or not a directory: "…" | 경로 오타이거나 폴더가 아닙니다 |
not an llmwiki vault (missing wiki/ directory): "…" | --root 에는 wiki/ 의 부모 폴더를 넘겨야 합니다(wiki/ 자체가 아님) |
refusing vault whose wiki/ is a symbolic link: "…" | 보안상 wiki/ 가 심볼릭 링크인 볼트는 거부합니다. 실제 폴더 경로를 넘기세요 |
| Codex 에서 첫 실행 시 서버가 안 뜸 | npx 다운로드가 10초 타임아웃을 넘었습니다 — config.toml 에 startup_timeout_sec = 60 을 넣거나 전역 설치를 쓰세요 |
codex exec 에서 도구가 호출되지 않음 | --approve-for-me 를 붙이세요(기본 승인 정책이 MCP 도구를 차단) |
| 방금 고친 내용이 안 보이는 것 같음 | 캐시는 파일 신원(mtime·ctime·inode·크기)이 바뀌면 다시 읽고, 2초 이내 수정 파일이 있으면 캐시를 쓰지 않습니다. 의심되면 LLMWIKI_CACHE=0 으로 비교하세요. FAT/exFAT·일부 네트워크 드라이브는 변경 시각이 부정확해 LLMWIKI_CACHE=0 을 권합니다 |
| 한글 slug 로 페이지를 못 찾음 | macOS 는 파일명을 NFD 로 저장해, 직접 타이핑한 NFC 한글과 다를 수 있습니다. slug 는 wiki_expand 결과에서 복사해서 쓰세요 |
| 첫 조회만 유독 느림 | OneDrive·iCloud 의 온디맨드 파일을 내려받는 중입니다. 두 번째부터는 빨라집니다 |
| 어떤 페이지가 결과에 안 나옴 | wiki/ 안의 심볼릭 링크(파일·폴더)는 보안상 건너뜁니다. wiki/ 밖(raw/, index.md)도 대상이 아닙니다 |
Windows 에서 %·! 가 든 경로 등록이 거부됨 | 의도된 동작입니다 — JSON 설정형(env)으로 등록하세요 |
| 무엇이 느린지 보고 싶음 | LLMWIKI_DEBUG=1 로 도구별 소요 시간을 확인하세요 |
8. 업데이트와 제거
업데이트 — 최신판을 확실히 받으려면 버전을 붙이세요.
npx -y obsidian-llmwiki-mcp@latest --selftest --root "<VAULT>" # npx 로 쓰는 경우
npm i -g obsidian-llmwiki-mcp@latest # 전역 설치한 경우등록을 특정 버전에 고정하고 싶다면 등록 명령의 패키지를 [email protected] 처럼 적으면 됩니다.
제거
| 클라이언트 | 방법 |
|---|---|
| Claude Code | claude mcp remove llmwiki |
| Codex CLI | codex mcp remove llmwiki |
| agy | agy mcp remove llmwiki |
| Gemini CLI · Cursor · Windsurf · Claude Desktop · VS Code | 각 설정 파일에서 llmwiki 항목을 지우세요 |
전역 설치했다면 npm rm -g obsidian-llmwiki-mcp 도 실행하세요. 규칙 스니펫을 설치했다면 그 파일도 지웁니다. 볼트는 아무것도 바뀌지 않습니다 — 서버는 한 번도 쓰지 않았고, 볼트의 Python 하네스와도 독립적입니다.
9. 알아 둘 한계
stdio 전용 — HTTP·인증·다중 사용자 없음. 로컬 1인용 도구입니다.
응답 크기 상한 — 응답 하나는 200KB 이내로 잘립니다(잘리면
…[truncated at 200 KB]표시).볼트 규모 상한 — 마크다운 20,000개, 폴더 5,000개, 텍스트 총 512MiB. 넘으면 결과를 조용히 바꾸지 않고 오류를 냅니다.
대소문자 무시 파일시스템(macOS·Windows 기본)에서는 대소문자가 다른 slug 가 열릴 수 있습니다.
더 자세한 계약·보안 경계는 패키지 README, 설계와 검증 기록은 develop_docs/v0.8.6/ 에 있습니다.
282 files
- .claude/agents/meeting-scribe.md
- .claude/agents/wiki-cartographer.md
- .claude/agents/wiki-consolidator.md
- .claude/agents/wiki-ingestor.md
- .claude/agents/wiki-linter.md
- .claude/agents/wiki-synthesizer.md
- .claude/settings.json
- .claude/skills/meeting-minutes/SKILL.md
- .claude/skills/meeting-minutes/references/auto-watch.md
- .claude/skills/meeting-minutes/references/backend-setup.md
- .claude/skills/meeting-minutes/scripts/apikey.py
- .claude/skills/meeting-minutes/scripts/pending-recordings.py
- .claude/skills/meeting-minutes/scripts/transcribe.py
- .claude/skills/weekly-review/SKILL.md
- .claude/skills/wiki-consolidate/SKILL.md
- .claude/skills/wiki-consolidate/scripts/confidence.py
- .claude/skills/wiki-consolidate/scripts/list-claims.py
- .claude/skills/wiki-ingest/SKILL.md
- .claude/skills/wiki-ingest/scripts/concept-index.py
- .claude/skills/wiki-ingest/scripts/normalize-stamps.py
- .claude/skills/wiki-lint/SKILL.md
- .claude/skills/wiki-lint/scripts/decay.py
- .claude/skills/wiki-lint/scripts/ingest-status.py
- .claude/skills/wiki-lint/scripts/link-audit.py
- .claude/skills/wiki-lint/scripts/lint-due.py
- .claude/skills/wiki-lint/scripts/scope-expand.py
- .claude/skills/wiki-lint/scripts/search.py
- .claude/skills/wiki-lint/scripts/stamp-updated.py
- .claude/skills/wiki-lint/scripts/validate-pages.py
- .claude/skills/wiki-lint/scripts/wiki-status-check.py
- .claude/skills/wiki-moc/SKILL.md
- .claude/skills/wiki-ops/SKILL.md
- .claude/skills/wiki-query/SKILL.md
- .gitattributes
- .github/workflows/ci.yml
- .gitignore
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CLAUDE.md
- INTRO.md
- LICENSE
- README.md
- develop_docs/v0.8.3/AB-TEST.md
- develop_docs/v0.8.3/DESIGN.md
- develop_docs/v0.8.3/PRD.md
- develop_docs/v0.8.3/TECH-SUMMARY.md
- develop_docs/v0.8.3/ab-score.py
- develop_docs/v0.8.5/COMBO.md
- develop_docs/v0.8.6/DESIGN.md
- develop_docs/v0.8.6/PRD.md
- develop_docs/v0.8.6/RELEASE-NOTES-v0.11.0.md
- develop_docs/v0.8.6/todo/00-README.md
- develop_docs/v0.8.6/todo/P0-prepare.md
- develop_docs/v0.8.6/todo/P1-port-retrieval.md
- develop_docs/v0.8.6/todo/P2-mcp-server.md
- develop_docs/v0.8.6/todo/P3-release-clients.md
- develop_docs/v0.8.6/todo/P4-cache-followup.md
- develop_docs/v0.8.6/todo/baseline/.gitkeep
- develop_docs/v0.8.6/todo/evidence/.gitkeep
- develop_docs/v0.8.6/todo/review/.gitkeep
- develop_docs/v0.8.6/todo/review/P0-agy-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P0-prompt.txt
- develop_docs/v0.8.6/todo/review/P1-agy-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P1-codex-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P1-codex-r2-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P1-prompt.txt
- develop_docs/v0.8.6/todo/review/P2-agy-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P2-agy-r2-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P2-codex-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P2-codex-r2-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P2-codex-r3-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P2-prompt.txt
- develop_docs/v0.8.6/todo/review/P2-tools-list.json
- develop_docs/v0.8.6/todo/review/P3-codex-2026-09-09.md
- develop_docs/v0.8.6/todo/review/P3-prompt.txt
- develop_docs/v0.8.6/todo/review/P4-27-agy-2026-09-10.md
- develop_docs/v0.8.6/todo/review/P4-27-codex-2026-09-10.md
- develop_docs/v0.8.6/todo/review/P4-27-prompt.txt
- develop_docs/v0.8.6/todo/review/P4-agy-2026-09-10.md
- develop_docs/v0.8.6/todo/review/P4-agy-r3-2026-09-10.md
- develop_docs/v0.8.6/todo/review/P4-codex-2026-09-10.md
- develop_docs/v0.8.6/todo/review/P4-codex-r2-2026-09-10.md
- develop_docs/v0.8.6/todo/review/P4-codex-r3-2026-09-10.md
- develop_docs/v0.8.6/todo/review/P4-prompt-r2.txt
- develop_docs/v0.8.6/todo/review/P4-prompt-r3.txt
- develop_docs/v0.8.6/todo/review/P4-prompt.txt
- metrics/ab-results.csv
- metrics/cost-report.py
- raw/.gitkeep
- raw/article/.gitkeep
- raw/assets/.gitkeep
- raw/books/.gitkeep
- raw/lecture/.gitkeep
- raw/meetings/.gitkeep
- raw/notes/.gitkeep
- templates/clients/build.py
- templates/clients/claude-skill/SKILL.md
- templates/clients/codex-AGENTS.md
- templates/clients/cursor-llmwiki.mdc
- templates/clients/gemini-GEMINI.md
- templates/daily.md
- templates/mcp-client-guide.md
- templates/meeting.md
- templates/seeds/home-moc.md
- templates/seeds/index.md
- templates/seeds/log.md
- tests/parity.py
- tests/parity_fuzz.py
- tests/smoke.py
- tools/llmwiki-mcp/LICENSE
- tools/llmwiki-mcp/README.md
- tools/llmwiki-mcp/docs/install-and-usage.ko.md
- tools/llmwiki-mcp/eslint.config.js
- tools/llmwiki-mcp/package-lock.json
- tools/llmwiki-mcp/package.json
- tools/llmwiki-mcp/scripts/dump-tools-list.mjs
- tools/llmwiki-mcp/scripts/gen-pylower-table.py
- tools/llmwiki-mcp/scripts/readonly-guard.py
- tools/llmwiki-mcp/src/bm25.ts
- tools/llmwiki-mcp/src/cache.ts
- tools/llmwiki-mcp/src/cli.ts
- tools/llmwiki-mcp/src/contracts.ts
- tools/llmwiki-mcp/src/expand.ts
- tools/llmwiki-mcp/src/format.ts
- tools/llmwiki-mcp/src/graph.ts
- tools/llmwiki-mcp/src/once.ts
- tools/llmwiki-mcp/src/pack.ts
- tools/llmwiki-mcp/src/print-config.ts
- tools/llmwiki-mcp/src/pylower-table.ts
- tools/llmwiki-mcp/src/read.ts
- tools/llmwiki-mcp/src/root.ts
- tools/llmwiki-mcp/src/search.ts
- tools/llmwiki-mcp/src/server.ts
- tools/llmwiki-mcp/src/tools.ts
- tools/llmwiki-mcp/src/vault.ts
- tools/llmwiki-mcp/test/fixtures/.gitkeep
- tools/llmwiki-mcp/test/fixtures/expected/q01-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q01-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q01-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q01-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q02-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q02-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q02-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q02-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q03-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q03-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q03-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q03-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q04-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q04-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q04-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q04-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q05-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q05-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q05-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q05-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q06-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q06-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q06-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q06-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q07-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q07-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q07-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q07-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q08-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q08-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q08-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q08-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q09-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q09-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q09-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q09-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q10-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q10-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q10-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q10-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q11-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q11-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q11-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q11-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q12-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q12-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q12-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q12-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q13-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q13-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q13-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q13-search.txt
- tools/llmwiki-mcp/test/fixtures/expected/q14-expand.txt
- tools/llmwiki-mcp/test/fixtures/expected/q14-pack.txt
- tools/llmwiki-mcp/test/fixtures/expected/q14-rerank.txt
- tools/llmwiki-mcp/test/fixtures/expected/q14-search.txt
- tools/llmwiki-mcp/test/fixtures/gen-expected.py
- tools/llmwiki-mcp/test/fixtures/make-fixture.py
- tools/llmwiki-mcp/test/fixtures/queries.json
- tools/llmwiki-mcp/test/fixtures/vault/index.md
- tools/llmwiki-mcp/test/fixtures/vault/log.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L2-episodic/dup-note.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L2-episodic/query-search-briefing.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L2-episodic/session-2026-09-01.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L2-episodic/source-latency-review.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L2-episodic/source-northwind-kickoff.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/concept-alias-target.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/concept-chunking.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/concept-emoji-notes.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/concept-evaluation-harness.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/concept-linker.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/concept-prompt-caching-crlf.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/concept-reranking.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/concept-uppercase-term.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/concept-vector-index.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/dup-note.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/entity-northwind-search.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/entity-northwind-team.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/fact-latency-budget-old.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/fact-latency-budget.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/zz-🦀-crab.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L3-semantic/zz-₩-won.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L4-procedural/procedure-deploy-index.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/L4-procedural/procedure-no-type.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/moc/home-moc.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/moc/search-moc.md
- tools/llmwiki-mcp/test/fixtures/vault/wiki/moc/team-moc.md
- tools/llmwiki-mcp/test/perf/bench.py
- tools/llmwiki-mcp/test/perf/cache-bench.mjs
- tools/llmwiki-mcp/test/perf/make-synthetic-vault.py
- tools/llmwiki-mcp/test/perf/stage-bench.mjs
- tools/llmwiki-mcp/test/unit/golden.test.ts
- tools/llmwiki-mcp/test/unit/p1-01-walkmd-symlink.test.ts
- tools/llmwiki-mcp/test/unit/p1-09-pylower-unicode-version.test.ts
- tools/llmwiki-mcp/test/unit/p1-29-count-sub.test.ts
- tools/llmwiki-mcp/test/unit/p1-30-fmt1.test.ts
- tools/llmwiki-mcp/test/unit/p1-31-cmp-codepoint.test.ts
- tools/llmwiki-mcp/test/unit/p1-32-decode-text.test.ts
- tools/llmwiki-mcp/test/unit/p1-33-frontmatter.test.ts
- tools/llmwiki-mcp/test/unit/p1-34-parse-aliases.test.ts
- tools/llmwiki-mcp/test/unit/p1-35-link-re.test.ts
- tools/llmwiki-mcp/test/unit/p1-36-split-n.test.ts
- tools/llmwiki-mcp/test/unit/p1-37-extract-relations.test.ts
- tools/llmwiki-mcp/test/unit/p1-38-extract-claims.test.ts
- tools/llmwiki-mcp/test/unit/p1-39-cplen-bm25.test.ts
- tools/llmwiki-mcp/test/unit/p1-40-alias-first-wins.test.ts
- tools/llmwiki-mcp/test/unit/p1-41-dup-slug.test.ts
- tools/llmwiki-mcp/test/unit/p1-42b-pack-type-default.test.ts
- tools/llmwiki-mcp/test/unit/p1-rows-4-9-12-15-17b-21.test.ts
- tools/llmwiki-mcp/test/unit/p2-09-output-schema.test.ts
- tools/llmwiki-mcp/test/unit/p2-11-23-input-normalization-limits.test.ts
- tools/llmwiki-mcp/test/unit/p2-12-13-14-schema-names-descriptions.test.ts
- tools/llmwiki-mcp/test/unit/p2-15-27-03-cli.test.ts
- tools/llmwiki-mcp/test/unit/p2-21-symlink-leak.test.ts
- tools/llmwiki-mcp/test/unit/p2-22-path-escape.test.ts
- tools/llmwiki-mcp/test/unit/p2-26-print-config-snapshots.test.ts
- tools/llmwiki-mcp/test/unit/p2-33-once-vs-mcp.test.ts
- tools/llmwiki-mcp/test/unit/p2-helpers.ts
- tools/llmwiki-mcp/test/unit/p2-review-print-config.test.ts
- tools/llmwiki-mcp/test/unit/p2-review-server-vault-cli.test.ts
- tools/llmwiki-mcp/test/unit/p2-review-tools.test.ts
- tools/llmwiki-mcp/test/unit/p2-review2-root-limits-guards.test.ts
- tools/llmwiki-mcp/test/unit/p2-review3-envelope-budget.test.ts
- tools/llmwiki-mcp/test/unit/p2-review3-pack-input-budget.test.ts
- tools/llmwiki-mcp/test/unit/p2-review3-shq-single-quote.test.ts
- tools/llmwiki-mcp/test/unit/p2-review3-suggested-next-hint.test.ts
- tools/llmwiki-mcp/test/unit/p2-review4-field-envelope.test.ts
- tools/llmwiki-mcp/test/unit/p3-ajv-cross-check.test.ts
- tools/llmwiki-mcp/test/unit/p3-client-guide.test.ts
- tools/llmwiki-mcp/test/unit/p3-contracts.test.ts
- tools/llmwiki-mcp/test/unit/p4-12-lex-index.test.ts
- tools/llmwiki-mcp/test/unit/p4-27-default-mode-guards.test.ts
- tools/llmwiki-mcp/test/unit/p4-27-text-only-default.test.ts
- tools/llmwiki-mcp/test/unit/p4-cache-default.test.ts
- tools/llmwiki-mcp/test/unit/p4-cache.test.ts
- tools/llmwiki-mcp/test/unit/pkg-name.test.ts
- tools/llmwiki-mcp/test/unit/scaffold.test.ts
- tools/llmwiki-mcp/tsconfig.build.json
- tools/llmwiki-mcp/tsconfig.json
- wiki/.gitkeep
- wiki/L1-working/.gitkeep
- wiki/L2-episodic/.gitkeep
- wiki/L3-semantic/.gitkeep
- wiki/L4-procedural/.gitkeep
- wiki/moc/.gitkeep
Advantages
- Provides persistent, cumulative knowledge storage rather than re-discovering information on every query. evidence: README.md
- Implements a structured memory hierarchy with confidence scoring and decay management. evidence: CLAUDE.md
Limitations
- Requires manual curation of raw sources and adherence to specific frontmatter schemas. evidence: CLAUDE.md
- The system relies on specific agent-based workflows that require Claude Code to function as intended. evidence: README.md
Security
Risk level: Low risk
This brain runs
Hooks (2)
.claude/settings.json(SessionStart):python3 "$CLAUDE_PROJECT_DIR"/.claude/skills/wiki-lint/scripts/wiki-status-check.py.claude/settings.json(PostToolUse):python3 "$CLAUDE_PROJECT_DIR"/.claude/skills/wiki-lint/scripts/stamp-updated.py
Agent instructions that run or fetch something (22)
.claude/skills/meeting-minutes/SKILL.md:python3 .claude/skills/meeting-minutes/scripts/pending-recordings.py ..claude/skills/meeting-minutes/SKILL.md:`python3 .claude/skills/meeting-minutes/scripts/transcribe.py --check` 로 백엔드 가용성을 먼저 본다..claude/skills/meeting-minutes/SKILL.md:python3 $S/transcribe.py --backend local \.claude/skills/meeting-minutes/SKILL.md:python3 $S/transcribe.py --backend openai --confirm-upload \.claude/skills/meeting-minutes/SKILL.md:python3 .claude/skills/meeting-minutes/scripts/apikey.py status # 현재 출처 확인.claude/skills/meeting-minutes/SKILL.md:python3 .claude/skills/meeting-minutes/scripts/apikey.py set-keychain # 키체인에 저장.claude/skills/meeting-minutes/SKILL.md:python3 .claude/skills/meeting-minutes/scripts/apikey.py migrate # 레거시 파일 → 키체인.claude/skills/meeting-minutes/SKILL.md:| 증상 | 원인 | 대응 | |---|---|---| | `ffmpeg 없음` | 미설치 | `brew install ffmpeg` | | `로컬 전사 엔진이 없다` | mlx-whisper 미설치 | `python3 -m pip install mlx-whisper` | | openai 백엔드가 거부됨 | `--confirm-upload` 누락 | 판정을 다시 하라..claude/skills/weekly-review/SKILL.md:python3 .claude/skills/wiki-lint/scripts/scope-expand.py expand \.claude/skills/weekly-review/SKILL.md:python3 .claude/skills/wiki-lint/scripts/scope-expand.py pack $(cat /tmp/wr_cands.txt | cut -f3) > /tmp/wr_pack.md.claude/skills/wiki-consolidate/SKILL.md:`python3 .claude/skills/wiki-consolidate/scripts/list-claims.py .` — L2 전체의 `claim::` 라인 수집..claude/skills/wiki-consolidate/SKILL.md:`python3 .claude/skills/wiki-consolidate/scripts/list-claims.py .`로 L2 전체 claim 수집 + `python3 .claude/skills/wiki-ingest/scripts/concept-index.py .`로 기존 L3 카탈로그..claude/skills/wiki-consolidate/SKILL.md:승격·재확인 시 `python3 .claude/skills/wiki-consolidate/scripts/confidence.py --kinds <official,normal,verbal,…>` (또는 `--count N --official/--verbal`)로 점수를 구해 frontmatter `confidence:`에 기록..claude/skills/wiki-ingest/SKILL.md:python3 .claude/skills/wiki-ingest/scripts/concept-index.py ..claude/skills/wiki-lint/SKILL.md:python3 .claude/skills/wiki-lint/scripts/validate-pages.py . --json.claude/skills/wiki-lint/SKILL.md:python3 .claude/skills/wiki-lint/scripts/link-audit.py . --json.claude/skills/wiki-lint/SKILL.md:python3 .claude/skills/wiki-lint/scripts/decay.py --scan . --json.claude/skills/wiki-lint/SKILL.md:python3 .claude/skills/wiki-lint/scripts/search.py "<query>".claude/skills/wiki-ops/SKILL.md:python3 .claude/skills/wiki-lint/scripts/lint-due.py . 3.claude/skills/wiki-ops/SKILL.md:python3 .claude/skills/wiki-lint/scripts/ingest-status.py . # 미인제스트 raw 소스 (pending).claude/skills/wiki-ops/SKILL.md:리포트: `python3 metrics/cost-report.py` — 페이지당·소스100줄당 토큰, 낭비율, 총계.CLAUDE.md:미인제스트 raw 조회: `python3 .claude/skills/wiki-lint/scripts/ingest-status.py`.
- Low risk: network-instructions (.claude/skills/meeting-minutes/SKILL.md:130)
- Low risk: scripts-present (.claude/skills/meeting-minutes/scripts/apikey.py)
- Low risk: scripts-present (.claude/skills/meeting-minutes/scripts/pending-recordings.py)
- Low risk: scripts-present (.claude/skills/wiki-ingest/scripts/concept-index.py)
- Low risk: scripts-present (.claude/skills/wiki-lint/scripts/decay.py)
- Low risk: scripts-present (.claude/skills/wiki-lint/scripts/ingest-status.py)
- Low risk: scripts-present (.claude/skills/wiki-lint/scripts/link-audit.py)
- Low risk: scripts-present (.claude/skills/wiki-lint/scripts/lint-due.py)
- Low risk: scripts-present (.claude/skills/wiki-lint/scripts/scope-expand.py)
- Low risk: scripts-present (.claude/skills/wiki-lint/scripts/search.py)
- Low risk: scripts-present (.claude/skills/wiki-lint/scripts/stamp-updated.py)
- Low risk: scripts-present (.claude/skills/wiki-lint/scripts/validate-pages.py)
- Low risk: scripts-present (.claude/skills/wiki-lint/scripts/wiki-status-check.py)
Attribution and licence
- First committed by
cookyman74
- Publisher
- Justin (Community)
- Source
- cookyman74/llmwiki-harness · commit 139bc84
- Licence
- MIT License (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- cookyman74
AutoGineer is not affiliated with or endorsed by cookyman74.
Download
The ZIP holds the files AutoGineer serves, with ATTRIBUTION.md and the licence. Download llmwiki-harness.zip