add template

This commit is contained in:
김경종
2026-04-17 10:35:09 +09:00
parent 5c308e14b2
commit e8f6208df1
41 changed files with 1133 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
---
name: output-drafter
description: Draft deliverables in `output/` from existing `wiki/` pages. Use for articles, lecture outlines, book drafts, service concepts, and other user-facing synthesis grounded in the vault. 한국어 요청에도 사용.
kind: local
max_turns: 16
timeout_mins: 12
---
You are the output composer for this LLM Wiki.
Rules:
1. Base new drafts on `wiki/` pages whenever possible.
2. If the knowledge base is thin, say what should be compiled into `wiki/` first.
3. Structure the deliverable for the intended audience and purpose.
4. Leave a concise note about the key `wiki/` pages that support the draft.
5. Avoid claiming certainty that is not supported by the vault.
+16
View File
@@ -0,0 +1,16 @@
---
name: vault-researcher
description: Search and reason over the vault with wiki-first retrieval. Use for questions like "내 볼트에 뭐가 있어?", comparisons between concepts, source tracing, or finding material for synthesis. 한국어 요청에도 사용.
kind: local
max_turns: 12
timeout_mins: 10
---
You are the vault researcher for this workspace.
Operating rules:
1. Start from `wiki/index.md`.
2. Search `wiki/` pages before touching `raw/`.
3. Distinguish clearly between grounded facts and synthesized interpretation.
4. When possible, mention the most relevant page paths you relied on.
5. Do not edit files unless the user explicitly asks for an update or a new page.
+20
View File
@@ -0,0 +1,20 @@
---
name: wiki-compiler
description: Compile `raw/` sources into `wiki/` pages. Use for requests such as compiling articles, book chapters, transcripts, or updating existing wiki pages with new raw material. 한국어 요청에도 사용.
kind: local
max_turns: 16
timeout_mins: 12
---
You are the dedicated compiler for this Obsidian LLM Wiki.
Rules:
1. Never mutate `raw/`.
2. Read `wiki/index.md` before deciding whether to create or update a page.
3. Prefer updating an existing wiki page over creating a new one.
4. Every wiki page must keep YAML frontmatter with `title`, `tags`, `sources`, `created`, `updated`.
5. Use `[[wikilink]]` for internal references.
6. After wiki changes, update `wiki/index.md` and append an entry to `wiki/log.md`.
7. Keep source summaries factual. Put synthesis in concept or connection pages.
Return a concise summary of what you changed and which sources you used.
+19
View File
@@ -0,0 +1,19 @@
description = "Answer a question from the vault using wiki-first retrieval."
prompt = """
다음 질문에 대해 내 볼트에서 답하라:
{{args}}
탐색 규칙:
1. 먼저 아래 인덱스를 보고 관련 범위를 좁힌다.
2. `wiki/` 페이지를 우선적으로 탐색한다.
3. `wiki/`로 충분하지 않을 때만 `raw/`를 본다.
4. 답변은 사실, 해석, 추가 탐색 필요 항목을 구분해서 쓴다.
5. 마지막에 참고한 핵심 파일 경로를 짧게 남긴다.
현재 인덱스:
@{wiki/index.md}
가능하면 `llm-wiki-operator` skill과 `vault-researcher` agent를 활용하라.
"""
+18
View File
@@ -0,0 +1,18 @@
description = "Compile one or more raw sources into structured wiki pages."
prompt = """
다음 입력을 기준으로 `raw/` 원본을 `wiki/`로 컴파일하라:
{{args}}
작업 원칙:
1. 먼저 `wiki/index.md`와 관련 `GEMINI.md` 파일을 확인한다.
2. `raw/`는 읽기만 하고 절대 수정하지 않는다.
3. 기존 wiki 페이지가 있으면 우선 업데이트하고, 꼭 필요할 때만 새 페이지를 만든다.
4. 모든 wiki 페이지에는 YAML frontmatter(`title`, `tags`, `sources`, `created`, `updated`)를 유지한다.
5. 내부 참조는 `[[wikilink]]`를 사용한다.
6. 작업 후 `wiki/index.md`와 `wiki/log.md`를 함께 갱신한다.
7. 소스 요약은 사실 위주로 쓰고, 해석은 개념 페이지에 둔다.
가능하면 `llm-wiki-operator` skill과 `wiki-compiler` agent를 활용하라.
"""
+19
View File
@@ -0,0 +1,19 @@
description = "Connect and integrate multiple concepts or documents in the vault."
prompt = """
다음 개념, 주제, 문서를 연계·융합하여 체계적으로 정리하라:
{{args}}
작업 방식:
1. `wiki/index.md`에서 관련 개념 후보를 찾는다.
2. 관련 `wiki/` 페이지를 읽어 공통점, 긴장점, 빈틈을 정리한다.
3. 사실로 확인된 내용, 관계 구조, 통합 해석을 분리해서 쓴다.
4. 가능하면 서로 다른 두 개 이상의 소스 축을 연결한다.
5. 결과가 재사용 가능하면 새로운 `wiki/` 연결·융합 페이지가 필요한지도 판단한다.
현재 인덱스:
@{wiki/index.md}
가능하면 `llm-wiki-operator` skill과 `vault-researcher` agent를 활용하라.
"""
+19
View File
@@ -0,0 +1,19 @@
description = "Draft an output document from the existing wiki knowledge base."
prompt = """
다음 요청에 맞는 결과물을 `output/`에 초안으로 작성하라:
{{args}}
작성 규칙:
1. 먼저 `wiki/index.md`와 관련 `wiki/` 페이지를 확인한다.
2. 가능하면 `raw/`를 직접 재해석하지 말고, `wiki/` 기반으로 합성한다.
3. 결과물의 구조는 목적에 맞게 설계하되, 근거가 되는 핵심 `wiki/` 페이지를 본문 또는 말미에 남긴다.
4. 새 초안을 쓰거나 기존 초안을 업데이트한 뒤, 필요하면 `wiki/log.md`에도 관련 작업을 기록한다.
5. 부족한 근거가 있으면 어떤 wiki 페이지를 먼저 보강해야 하는지 제안한다.
현재 인덱스:
@{wiki/index.md}
가능하면 `llm-wiki-operator` skill과 `output-drafter` agent를 활용하라.
"""
+16
View File
@@ -0,0 +1,16 @@
description = "Initialize or repair the LLM Wiki scaffolding for this vault."
prompt = """
이 옵시디언 볼트를 Gemini CLI 기반 LLM Wiki로 초기화하거나 점검하라.
필수 확인 항목:
1. 루트와 주요 하위 폴더에 `GEMINI.md`가 있는지 확인한다.
2. `wiki/index.md`와 `wiki/log.md`가 없으면 생성하고, 있으면 구조를 점검한다.
3. `raw/`는 읽기 전용 원칙을 유지한다.
4. `.gemini/commands/`, `.gemini/skills/`, `.gemini/agents/`, `.gemini/settings.json`, `.gemini/hooks/`가 의도대로 정리되어 있는지 확인한다.
5. 필요한 수정이 있으면 직접 반영한다.
6. 끝나면 현재 상태와 다음에 바로 쓸 수 있는 명령 예시를 간단히 요약한다.
참고 인덱스:
@{wiki/index.md}
"""
+108
View File
@@ -0,0 +1,108 @@
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
function readStdin() {
return fs.readFileSync(0, 'utf8');
}
function isInside(parent, target) {
const relative = path.relative(parent, target);
return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
}
function stripQuotes(value) {
return value.replace(/^["']|["']$/g, '');
}
function collectPathStrings(value, key = '', output = []) {
if (value == null) {
return output;
}
if (typeof value === 'string') {
if (/path|file/i.test(key)) {
output.push(value);
}
return output;
}
if (Array.isArray(value)) {
value.forEach((item) => collectPathStrings(item, key, output));
return output;
}
if (typeof value === 'object') {
Object.entries(value).forEach(([childKey, childValue]) => {
collectPathStrings(childValue, childKey, output);
});
}
return output;
}
function resolveCandidate(candidate, rootDir) {
const cleaned = stripQuotes(String(candidate).trim());
if (!cleaned || /^(https?:|file:|data:)/i.test(cleaned)) {
return null;
}
const resolved = path.isAbsolute(cleaned)
? path.resolve(cleaned)
: path.resolve(rootDir, cleaned);
return resolved;
}
function commandTouchesRaw(command, rawDir) {
if (!command || typeof command !== 'string') {
return false;
}
const normalizedRaw = rawDir.toLowerCase().replace(/\//g, path.sep);
const lower = command.toLowerCase();
const mentionsRaw =
lower.includes(normalizedRaw.toLowerCase()) ||
/(^|[\s"'`])raw([\\/]|$)/i.test(command);
if (!mentionsRaw) {
return false;
}
return /(remove-item|move-item|copy-item|set-content|add-content|out-file|new-item|\brm\b|\bdel\b|\berase\b|\bmv\b|\bmove\b|\bcp\b|\bcopy\b|>>|(?<!\d)>(?!\d)|sed\s+-i|perl\s+-pi|\btouch\b)/i.test(command);
}
function deny(reason) {
process.stdout.write(JSON.stringify({ decision: 'deny', reason }));
}
try {
const input = JSON.parse(readStdin() || '{}');
const projectDir = process.env.GEMINI_PROJECT_DIR || input.cwd || process.cwd();
const rawDir = path.resolve(projectDir, 'raw');
const toolName = input.tool_name || '';
const toolInput = input.tool_input || {};
if (toolName === 'run_shell_command') {
const command = toolInput.command || toolInput.cmd || '';
if (commandTouchesRaw(command, rawDir)) {
deny('raw/는 불변 원본이다. raw/를 수정하지 말고, 필요하면 wiki/ 또는 output/에 결과를 작성하라.');
process.exit(0);
}
process.exit(0);
}
const candidates = collectPathStrings(toolInput);
const targets = candidates
.map((candidate) => resolveCandidate(candidate, projectDir))
.filter(Boolean);
const rawTargets = targets.filter((target) => isInside(rawDir, target));
if (rawTargets.length > 0) {
deny('raw/는 불변 원본이다. 해당 경로를 수정하지 말고, 요약·해석·구조화는 wiki/에서 수행하라.');
}
} catch (error) {
process.stderr.write(String(error));
process.exit(1);
}
+94
View File
@@ -0,0 +1,94 @@
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
function readStdin() {
return fs.readFileSync(0, 'utf8');
}
function isInside(parent, target) {
const relative = path.relative(parent, target);
return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
}
function collectPathStrings(value, key = '', output = []) {
if (value == null) {
return output;
}
if (typeof value === 'string') {
if (/path|file/i.test(key)) {
output.push(value);
}
return output;
}
if (Array.isArray(value)) {
value.forEach((item) => collectPathStrings(item, key, output));
return output;
}
if (typeof value === 'object') {
Object.entries(value).forEach(([childKey, childValue]) => {
collectPathStrings(childValue, childKey, output);
});
}
return output;
}
function resolveCandidate(candidate, rootDir) {
const cleaned = String(candidate).trim().replace(/^["']|["']$/g, '');
if (!cleaned) {
return null;
}
return path.isAbsolute(cleaned)
? path.resolve(cleaned)
: path.resolve(rootDir, cleaned);
}
try {
const input = JSON.parse(readStdin() || '{}');
if (input.tool_response && input.tool_response.error) {
process.exit(0);
}
const projectDir = process.env.GEMINI_PROJECT_DIR || input.cwd || process.cwd();
const wikiDir = path.resolve(projectDir, 'wiki');
const outputDir = path.resolve(projectDir, 'output');
const indexPath = path.resolve(wikiDir, 'index.md');
const logPath = path.resolve(wikiDir, 'log.md');
const candidates = collectPathStrings(input.tool_input || {});
const targets = candidates
.map((candidate) => resolveCandidate(candidate, projectDir))
.filter(Boolean);
const wikiTargets = targets.filter((target) => isInside(wikiDir, target));
const outputTargets = targets.filter((target) => isInside(outputDir, target));
if (wikiTargets.some((target) => target !== indexPath && target !== logPath)) {
process.stdout.write(JSON.stringify({
suppressOutput: true,
hookSpecificOutput: {
additionalContext:
'wiki/ 페이지를 수정했다. 이 턴이 끝나기 전에 YAML frontmatter(title, tags, sources, created, updated), [[wikilink]], wiki/index.md 한 줄 항목, wiki/log.md 변경 기록이 모두 반영되었는지 확인하라.'
}
}));
process.exit(0);
}
if (outputTargets.length > 0) {
process.stdout.write(JSON.stringify({
suppressOutput: true,
hookSpecificOutput: {
additionalContext:
'output/ 결과물은 wiki/ 페이지에 근거해야 한다. 가능하면 사용한 핵심 wiki 페이지를 본문 또는 말미에 남기고, raw/ 직접 해석에 의존하지 마라.'
}
}));
}
} catch (error) {
process.stderr.write(String(error));
process.exit(1);
}
+37
View File
@@ -0,0 +1,37 @@
{
"context": {
"fileName": [
"GEMINI.md"
]
},
"hooks": {
"BeforeTool": [
{
"matcher": "write_file|replace|delete_file|run_shell_command",
"hooks": [
{
"name": "protect-raw-sources",
"type": "command",
"command": "node \"$GEMINI_PROJECT_DIR/.gemini/hooks/protect-raw-sources.cjs\"",
"timeout": 5000,
"description": "Prevent the agent from mutating raw/ sources."
}
]
}
],
"AfterTool": [
{
"matcher": "write_file|replace|delete_file",
"hooks": [
{
"name": "wiki-write-reminder",
"type": "command",
"command": "node \"$GEMINI_PROJECT_DIR/.gemini/hooks/wiki-write-reminder.cjs\"",
"timeout": 5000,
"description": "Remind the agent to keep wiki/index.md and wiki/log.md in sync."
}
]
}
]
}
}
+62
View File
@@ -0,0 +1,62 @@
---
name: llm-wiki-operator
description: >
Obsidian 기반 LLM Wiki 운영 전문 스킬. Use this when the user asks to
compile `raw/` sources into `wiki/`, update `wiki/index.md` and `wiki/log.md`,
answer questions from the vault with wiki-first retrieval, link and integrate
concepts into structured synthesis, or draft deliverables into `output/`.
---
# LLM Wiki Operator
이 스킬은 이 볼트를 Gemini CLI 기반 LLM Wiki로 일관되게 운영하기 위한 절차를 제공한다.
## 핵심 원칙
- `raw/`는 불변 원본이다. 읽기만 한다.
- 질의와 생성은 항상 `wiki/index.md`에서 시작한다.
- 새 페이지보다 기존 페이지 업데이트를 우선한다.
- `wiki/` 페이지를 수정했으면 `wiki/index.md``wiki/log.md`를 함께 갱신한다.
- 요약은 사실 중심, 해석과 연결은 개념 또는 연결 페이지에서 수행한다.
- 내부 참조는 `[[wikilink]]`를 사용한다.
## 워크플로우
### 1. 요청 유형 분류
- **컴파일:** `raw/` 원본을 `wiki/`로 구조화
- **탐색:** 볼트 안에서 지식 검색, 비교, 요약
- **연결·융합:** 둘 이상의 개념이나 문서를 관계 중심으로 정리하고 통합
- **결과물 작성:** `wiki/`를 기반으로 `output/` 초안 생성
### 2. 시작점
1. 루트와 관련 하위 폴더의 `GEMINI.md`를 확인한다.
2. `wiki/index.md`에서 기존 페이지와 연결 구조를 먼저 확인한다.
3. 필요할 때만 관련 `raw/` 원본을 읽는다.
### 3. 컴파일 규칙
1. 기존 `wiki/` 페이지가 있으면 먼저 업데이트한다.
2. 새 페이지를 만들 때는 `assets/wiki-page-template.md`를 따른다.
3. `sources`에는 실제 원본 경로를 남긴다.
4. 작업이 끝나면 `assets/log-entry-template.md`를 참고해 `wiki/log.md`를 갱신한다.
5. source type별 세부 기준이 필요하면 `references/source-type-playbooks.md`를 참고한다.
### 4. 탐색 및 연결 규칙
1. 사실과 해석을 분리해서 답한다.
2. 연결·융합 작업에서는 공통점, 차이점, 보완점, 통합 구조를 명시한다.
3. 연결 결과가 재사용 가치가 높으면 `wiki/` 연결 페이지로 승격할지 판단한다.
### 5. 결과물 작성 규칙
1. `output/` 결과물은 가급적 `wiki/` 기반으로 작성한다.
2. 사용한 핵심 `wiki/` 페이지를 본문 또는 말미에 남긴다.
3. 근거가 빈약하면 억지로 확장하지 말고 먼저 보강할 `wiki/` 페이지를 제안한다.
## 리소스
- source type별 컴파일 기준: `references/source-type-playbooks.md`
- wiki 페이지 기본 형식: `assets/wiki-page-template.md`
- log 기록 형식: `assets/log-entry-template.md`
@@ -0,0 +1 @@
- YYYY-MM-DD: `생성|수정|삭제` — 대상 페이지 `[[페이지명]]`, 소스 `[raw/...경로]`, 메모 한 줄
@@ -0,0 +1,21 @@
```yaml
---
title: "페이지 제목"
tags: []
sources: []
created: YYYY-MM-DD
updated: YYYY-MM-DD
---
```
# 페이지 제목
## 요약
## 핵심 개념
## 근거와 인용
## 연결
## 메모
@@ -0,0 +1,50 @@
# Source-Type Playbooks
`raw/` 원본을 `wiki/`로 컴파일할 때 타입별로 우선 확인할 질문들이다.
## Article
- 핵심 주장 1~3개는 무엇인가
- 인상적인 문장이나 직접 인용할 만한 구절은 무엇인가
- 문서 구조화, 개념 연계, 자료 융합, AI 활용과 연결되는 지점은 무엇인가
## YouTube
- 영상의 핵심 주장 또는 방법론은 무엇인가
- 타임스탬프별 핵심 포인트가 있는가
- 내 관심사와 연결되는 지점은 무엇인가
- 실천 가능한 인사이트는 무엇인가
## Podcast
- 게스트/호스트의 핵심 관점은 무엇인가
- 기억할 만한 발언이나 직접 인용은 무엇인가
- 내 관심사와의 연결점은 무엇인가
## Book — 1패스
- 폴더 구조와 각 파일의 첫 문단만 보고 목차 페이지를 만든다
- 저자, 출판연도, 핵심 thesis를 남긴다
- 파일과 챕터 제목을 매핑한 구조표를 만든다
- 파트별 한 줄 요약을 만든다
- 2패스에서 우선 읽을 챕터 순서를 제안한다
## Book — 2패스
- 챕터 핵심 주장은 무엇인가
- 핵심 개념 정의와 인용은 무엇인가
- 문서 구조화, 개념 연계, 자료 융합, AI 활용과 어떤 연결이 있는가
- 기존 wiki 페이지와 어떤 개념 링크를 만들 수 있는가
## Research
- 연구 질문과 방법론은 무엇인가
- 핵심 발견과 데이터는 무엇인가
- 한계점은 무엇인가
- 내 관심사와 연결되는 활용 가능성은 무엇인가
## Batch Compile
- `wiki_status` 또는 메타데이터가 있으면 미컴파일 원본부터 우선한다
- 파일마다 `wiki/index.md``wiki/log.md`를 개별 갱신한다
- 너무 큰 묶음은 나누어 처리한다
+7
View File
@@ -0,0 +1,7 @@
# Legacy Notice
이 프로젝트의 기본 컨텍스트 파일은 이제 `CLAUDE.md`가 아니라 `GEMINI.md`다.
- Gemini CLI는 루트와 하위 폴더의 `GEMINI.md`를 읽는다.
- 자동화는 `.gemini/commands/`, `.gemini/skills/`, `.gemini/agents/`, `.gemini/settings.json`을 사용한다.
- 최신 작업 기준은 [GEMINI.md](./GEMINI.md)를 참조한다.
+84
View File
@@ -0,0 +1,84 @@
# GEMINI.md — 찬물샤워의 옵시디언 볼트
## 나는 누구인가
- **이름:** 찬물샤워
- **하는 일:** CAD/건축/인프라 BIM 소프트웨어 개발자 (Data Structure + OOP 기반)
- **핵심 가치:** 문서를 체계적으로 정리하고, 지식 간 관계를 연계·융합하여 재사용 가능한 구조를 만든다
## 나의 역할들
### BIM 소프트웨어 개발자
- CAD 및 건축·인프라 BIM 소프트웨어 개발
- Data Structure 설계, OOP 기반 기능 구현
- 개발 과정에서 발생하는 암묵지를 옵시디언에 축적
### 지식 구조화 실천가
- 탐구 분야: 문서 구조화, 지식관리, 개념 연계, 자료 융합, AI 활용
- 흩어진 문서를 분류·요약·태깅·링크하여 찾기 쉬운 지식 체계로 전환
- 핵심 가설: 잘 정리된 문서와 명확한 관계망은 문제 해결과 결과물 생산 속도를 높인다
### 지식 관리자
- 옵시디언에 약 1,000개 문서 축적 중
- 웹 클리퍼 + Templater로 메타데이터 포함 수집
- Karpathy LLM Wiki 방식을 참고하여 AI 친화적 지식 구조 구축 중
## 나의 비전과 목표
- **이루고자 하는 것:** 남들이 쉽게 발견하지 못하는 경제적·지능적 혜자를 발굴하고, 좋아하는 일로 수익 연결
- **만들고 싶은 아웃풋:** 지식 정리 시스템, 지혜의 책, 문서 융합 가이드, 문제해결 101
- **타겟:** 복잡한 문서를 체계적으로 정리하고 활용하려는 사람
## AI에게 기대하는 것
- 이 볼트의 양질의 핵심 개념과 관련성을 검색·정리·활용해줄 것
- 문제를 던지면 관련 문서를 찾고, 개념 간 관계를 정리해 융합된 답을 내줄 것
- 암묵지를 명시지로 전환하는 과정을 도와줄 것
- Graphify X는 사용하지 않음 — Gemini CLI가 볼트를 직접 활용하는 구조를 지향
## 볼트 구조 (LLM Wiki 패턴)
```text
LLMWiki/
├── .gemini/ ← Gemini CLI 설정, commands, skills, agents, hooks
├── raw/ ← 불변 원본 (절대 수정 금지)
│ ├── articles/ ← 웹 아티클, 블로그
│ ├── books/ ← 책 발췌, 독서 노트
│ ├── videos/ ← 영상 대본, 트랜스크립트
│ ├── ideas/ ← 순간 아이디어, 메모
│ └── work/ ← BIM 개발 업무 기록, 암묵지
├── wiki/ ← AI가 컴파일하는 위키
│ ├── index.md ← 마스터 목록 (질의 시 최우선 참조)
│ └── log.md ← 모든 변경 기록
└── output/ ← 최종 결과물
```
## Gemini CLI 운영 구조
- **지속 컨텍스트:** 루트와 하위 폴더의 `GEMINI.md`
- **반복 작업:** `.gemini/commands/wiki/*.toml`
- **온디맨드 전문성:** `.gemini/skills/llm-wiki-operator/`
- **역할 분리:** `.gemini/agents/*.md`
- **자동 가드레일:** `.gemini/settings.json` + `.gemini/hooks/`
## 위키 운영 규칙 (Karpathy LLM Wiki 기반)
1. **raw/는 절대 수정 금지** — 불변 원본
2. wiki 페이지 생성/삭제 시 **index.md 필수 업데이트**
3. 모든 오퍼레이션마다 **log.md에 기록**
4. 내부 참조는 **[[wikilink]]** 형식
5. 모든 wiki 페이지에 **YAML frontmatter** (`title`, `tags`, `sources`, `created`, `updated`)
6. 모순 발견 시 **양쪽 소스 모두 인용**
7. 소스 요약은 사실만, 해석은 개념 페이지에서
8. 질의 시 **index.md 먼저**, raw/는 마지막 수단
9. **새 페이지보다 기존 페이지 업데이트 우선**
10. index 항목은 한 줄, 120자 이내
## 작업 규칙
- **언어:** 한국어 기본. 기술 용어는 영어 병기 가능
- **톤:** 간결하고 핵심만. 불필요한 수식어 제거
- **결과물 형태:** 마크다운 기반, 옵시디언 호환
- **질의 순서:** `wiki/index.md` → 관련 `wiki/` 페이지 → 필요 시 `raw/`
- **수정 원칙:** `raw/` 불변, `wiki/`는 구조화, `output/`은 위키 기반 조합
- **작업 시 이 볼트를 지식 베이스로 적극 활용할 것**
@@ -0,0 +1,12 @@
Karpathy LLM Wiki 핵심 규칙 10가지
1. **raw/는 절대 수정 금지** (불변 원본)
2. wiki 페이지 생성/삭제 시 **index.md 필수 업데이트**
3. 모든 오퍼레이션마다 **log.md에 기록**
4. 내부 참조는 **wikilink** 형식
5. 모든 wiki 페이지에 **YAML frontmatter**
6. 모순 발견 시 **양쪽 소스 모두 인용**
7. 소스 요약은 사실만, 해석은 개념 페이지에서
8. 질의 시 **index.md 먼저**, raw/는 마지막 수단
9. **새 페이지보다 기존 페이지 업데이트 우선**
10. index 항목은 한 줄, 120자 이내
+10
View File
@@ -0,0 +1,10 @@
{
"schemaVersion": "0.1.0",
"name": "LLM Wiki 전용",
"behavior": "create",
"noteContentFormat": "{{content}}",
"properties": [],
"triggers": [],
"noteNameFormat": "{{title}}",
"path": "Clippings"
}
+6
View File
@@ -0,0 +1,6 @@
# Legacy Notice
`output/`의 기본 컨텍스트 파일은 이제 `output/GEMINI.md`다.
- Gemini CLI는 `output/GEMINI.md`를 사용한다.
- 결과물은 `wiki/` 기반으로 작성한다는 규칙도 동일하다.
+20
View File
@@ -0,0 +1,20 @@
# output/ — 결과물 저장소
## 용도
`wiki/`에 구조화된 지식을 조합하여 최종 결과물을 저장한다.
## 결과물 유형
- 지식 정리 시스템 설명 문서
- 지혜의 책 초안
- 문서 융합 가이드
- 문제해결 101
- 기타 아티클, 발표문, 강의안, 기획서
## 규칙
- 결과물의 근거는 가능하면 `wiki/` 페이지에 둔다.
- `raw/`를 직접 해석해 결과물을 만들기보다, 먼저 `wiki/`에 컴파일한 뒤 사용한다.
- 결과물마다 주제별로 파일을 분리한다.
- 초안이라도 사용한 핵심 `wiki/` 페이지를 본문 또는 말미에 남긴다.
+6
View File
@@ -0,0 +1,6 @@
# Legacy Notice
`raw/`의 기본 컨텍스트 파일은 이제 `raw/GEMINI.md`다.
- Gemini CLI는 `raw/GEMINI.md`를 사용한다.
- `raw/`는 계속 읽기 전용이며, 변경 금지 규칙도 동일하다.
+23
View File
@@ -0,0 +1,23 @@
# raw/ — 불변 원본 저장소
## 규칙
- `raw/`는 읽기 전용이다. 생성·수정·이동·삭제를 하지 않는다.
- 사용자가 직접 넣은 원본을 그대로 보존한다.
- 요약, 해석, 구조화, 연결은 `wiki/`에서 수행한다.
## 하위 폴더
| 폴더 | 용도 |
|---|---|
| `articles/` | 웹 아티클, 블로그 |
| `books/` | 책 발췌, 독서 노트 원본 |
| `videos/` | 영상 대본, 트랜스크립트 |
| `ideas/` | 순간 아이디어, 메모 |
| `work/` | BIM 개발 관련 업무 기록, 암묵지 |
## Gemini CLI 작업 원칙
- `raw/`를 참조할 때도 먼저 `wiki/index.md`와 관련 `wiki/` 페이지를 확인한다.
- `raw/` 내용을 인용할 때는 실제 원본 파일 경로를 `sources`나 본문에 남긴다.
- 대용량 책은 **1패스(목차) → 2패스(챕터별)** 순서로 처리한다.
View File
View File
View File
+20
View File
@@ -0,0 +1,20 @@
{
"schemaVersion": "0.1.0",
"name": "📄 Article (LLM Wiki)",
"behavior": "create",
"noteNameFormat": "{{date}}_{{title}}",
"path": "raw/articles",
"noteContentFormat": "---\ntype: article\ntitle: \"{{title}}\"\nurl: \"{{url}}\"\nauthor: \"{{author}}\"\npublished: \"{{published}}\"\nclipped: {{date}}\ntags:\n - raw\n - article\ndomain: \"{{domain}}\"\ndescription: \"{{description}}\"\nwiki_status: not-compiled\n---\n\n## 핵심 요약\n<!-- 클리핑 후 핵심 내용 한두 줄 직접 작성 -->\n\n## 하이라이트\n{{highlights}}\n\n## 본문\n{{content}}",
"properties": [
{ "name": "type", "value": "article", "type": "text" },
{ "name": "title", "value": "{{title}}", "type": "text" },
{ "name": "url", "value": "{{url}}", "type": "text" },
{ "name": "author", "value": "{{author}}", "type": "text" },
{ "name": "published", "value": "{{published}}", "type": "text" },
{ "name": "clipped", "value": "{{date}}", "type": "date" },
{ "name": "tags", "value": "raw,article", "type": "multitext" },
{ "name": "domain", "value": "{{domain}}", "type": "text" },
{ "name": "description", "value": "{{description}}", "type": "text" },
{ "name": "wiki_status", "value": "not-compiled", "type": "text" }
]
}
+21
View File
@@ -0,0 +1,21 @@
{
"schemaVersion": "0.1.0",
"name": "📚 Book (LLM Wiki)",
"behavior": "create",
"noteNameFormat": "{{date}}_{{title}}",
"path": "raw/books",
"noteContentFormat": "---\ntype: book\ntitle: \"{{title}}\"\nurl: \"{{url}}\"\nauthor: \"{{author}}\"\npublisher: \"\"\nyear: \"\"\nisbn: \"\"\nclipped: {{date}}\ntags:\n - raw\n - book\ndescription: \"{{description}}\"\nwiki_status: not-compiled\n---\n\n## 왜 읽는가\n<!-- 이 책을 읽는 이유, 기대하는 것 직접 작성 -->\n\n## 핵심 주장\n<!-- 책의 핵심 thesis 한두 줄 -->\n\n## 하이라이트\n{{highlights}}\n\n## 내용\n{{content}}",
"properties": [
{ "name": "type", "value": "book", "type": "text" },
{ "name": "title", "value": "{{title}}", "type": "text" },
{ "name": "url", "value": "{{url}}", "type": "text" },
{ "name": "author", "value": "{{author}}", "type": "text" },
{ "name": "publisher", "value": "", "type": "text" },
{ "name": "year", "value": "", "type": "text" },
{ "name": "isbn", "value": "", "type": "text" },
{ "name": "clipped", "value": "{{date}}", "type": "date" },
{ "name": "tags", "value": "raw,book", "type": "multitext" },
{ "name": "description", "value": "{{description}}", "type": "text" },
{ "name": "wiki_status", "value": "not-compiled", "type": "text" }
]
}
+19
View File
@@ -0,0 +1,19 @@
{
"schemaVersion": "0.1.0",
"name": "🎙️ Podcast (LLM Wiki)",
"behavior": "create",
"noteNameFormat": "{{date}}_{{title}}",
"path": "raw/videos",
"noteContentFormat": "---\ntype: podcast\ntitle: \"{{title}}\"\nurl: \"{{url}}\"\npodcast_name: \"{{author}}\"\npublished: \"{{published}}\"\nclipped: {{date}}\ntags:\n - raw\n - podcast\ndescription: \"{{description}}\"\nwiki_status: not-compiled\n---\n\n## 핵심 포인트\n<!-- 청취 중 인상적인 내용 직접 작성 -->\n\n## 하이라이트\n{{highlights}}\n\n## 노트 / 트랜스크립트\n{{content}}",
"properties": [
{ "name": "type", "value": "podcast", "type": "text" },
{ "name": "title", "value": "{{title}}", "type": "text" },
{ "name": "url", "value": "{{url}}", "type": "text" },
{ "name": "podcast_name", "value": "{{author}}", "type": "text" },
{ "name": "published", "value": "{{published}}", "type": "text" },
{ "name": "clipped", "value": "{{date}}", "type": "date" },
{ "name": "tags", "value": "raw,podcast", "type": "multitext" },
{ "name": "description", "value": "{{description}}", "type": "text" },
{ "name": "wiki_status", "value": "not-compiled", "type": "text" }
]
}
+21
View File
@@ -0,0 +1,21 @@
{
"schemaVersion": "0.1.0",
"name": "🔬 Research (LLM Wiki)",
"behavior": "create",
"noteNameFormat": "{{date}}_{{title}}",
"path": "raw/articles",
"noteContentFormat": "---\ntype: research\ntitle: \"{{title}}\"\nurl: \"{{url}}\"\nauthor: \"{{author}}\"\njournal: \"\"\ndoi: \"\"\nyear: \"{{published}}\"\nclipped: {{date}}\ntags:\n - raw\n - research\ndescription: \"{{description}}\"\nwiki_status: not-compiled\n---\n\n## 연구 질문\n<!-- 이 논문/연구가 답하려는 질문 -->\n\n## 핵심 발견\n<!-- 주요 결론, 데이터, 인사이트 -->\n\n## 나의 관점\n<!-- 내 연구/사고와의 연결점 -->\n\n## 하이라이트\n{{highlights}}\n\n## 본문\n{{content}}",
"properties": [
{ "name": "type", "value": "research", "type": "text" },
{ "name": "title", "value": "{{title}}", "type": "text" },
{ "name": "url", "value": "{{url}}", "type": "text" },
{ "name": "author", "value": "{{author}}", "type": "text" },
{ "name": "journal", "value": "", "type": "text" },
{ "name": "doi", "value": "", "type": "text" },
{ "name": "year", "value": "{{published}}", "type": "text" },
{ "name": "clipped", "value": "{{date}}", "type": "date" },
{ "name": "tags", "value": "raw,research", "type": "multitext" },
{ "name": "description", "value": "{{description}}", "type": "text" },
{ "name": "wiki_status", "value": "not-compiled", "type": "text" }
]
}
+19
View File
@@ -0,0 +1,19 @@
{
"schemaVersion": "0.1.0",
"name": "🎬 YouTube (LLM Wiki)",
"behavior": "create",
"noteNameFormat": "{{date}}_{{title}}",
"path": "raw/videos",
"noteContentFormat": "---\ntype: youtube\ntitle: \"{{title}}\"\nurl: \"{{url}}\"\nchannel: \"{{author}}\"\npublished: \"{{published}}\"\nclipped: {{date}}\ntags:\n - raw\n - youtube\ndescription: \"{{description}}\"\nwiki_status: not-compiled\n---\n\n## 핵심 포인트\n<!-- 시청 중 인상적인 내용 직접 작성 -->\n\n## 하이라이트\n{{highlights}}\n\n## 트랜스크립트 / 요약\n{{content}}",
"properties": [
{ "name": "type", "value": "youtube", "type": "text" },
{ "name": "title", "value": "{{title}}", "type": "text" },
{ "name": "url", "value": "{{url}}", "type": "text" },
{ "name": "channel", "value": "{{author}}", "type": "text" },
{ "name": "published", "value": "{{published}}", "type": "text" },
{ "name": "clipped", "value": "{{date}}", "type": "date" },
{ "name": "tags", "value": "raw,youtube", "type": "multitext" },
{ "name": "description", "value": "{{description}}", "type": "text" },
{ "name": "wiki_status", "value": "not-compiled", "type": "text" }
]
}
+112
View File
@@ -0,0 +1,112 @@
# 타입별 컴파일 프롬프트
raw/에 수집한 파일을 wiki/로 컴파일할 때 사용하는 프롬프트 모음.
---
## 📄 Article
```
raw/articles/[파일명].md 읽고 wiki에 컴파일해줘.
추출할 것:
- 핵심 주장 1~3개
- 인상적인 문장 (원문 인용)
- 내 관심사(문서 구조화, 개념 연계, 자료 융합, AI 활용)와의 연결점
wiki 페이지 생성 후 index.md 등록, log.md 기록.
```
---
## 🎬 YouTube
```
raw/videos/[파일명].md 읽고 wiki에 컴파일해줘.
추출할 것:
- 영상의 핵심 주장 또는 방법론
- 타임스탬프별 핵심 포인트 (있으면)
- 내 관심사와의 연결점
- 실천 가능한 인사이트
wiki 페이지 생성 후 index.md 등록, log.md 기록.
```
---
## 🎙️ Podcast
```
raw/videos/[파일명].md 읽고 wiki에 컴파일해줘.
추출할 것:
- 게스트/호스트의 핵심 관점
- 기억할 만한 발언 (원문 인용)
- 내 관심사와의 연결점
wiki 페이지 생성 후 index.md 등록, log.md 기록.
```
---
## 📚 Book
### 1패스 (목차 먼저)
```
raw/books/[책이름]/ 폴더 구조와 각 파일의 첫 문단만 읽고
wiki에 [책이름]_목차.md를 만들어줘.
포함할 것:
- 저자, 출판연도, 핵심 thesis
- 전체 구조표 (파일 → 챕터 제목 매핑)
- 파트별 한 줄 요약
- 2패스 추천 챕터 순서 (내 관심사 기준)
index.md 등록, log.md 기록.
```
### 2패스 (챕터별)
```
raw/books/[책이름]/[챕터파일].md 읽고 wiki에 컴파일해줘.
추출할 것:
- 챕터 핵심 주장
- 핵심 개념 정의 (인용 포함)
- 내 관심사(문서 구조화, 개념 연계, 자료 융합, AI 활용)와의 연결점
- 기존 wiki 페이지와 연결 가능한 개념
기존 wiki 페이지 있으면 업데이트, 없으면 새 페이지 생성.
index.md 업데이트, log.md 기록.
```
---
## 🔬 Research
```
raw/articles/[파일명].md 읽고 wiki에 컴파일해줘.
추출할 것:
- 연구 질문과 방법론
- 핵심 발견 및 데이터
- 한계점
- 내 관심사와의 연결점 및 활용 가능성
wiki 페이지 생성 후 index.md 등록, log.md 기록.
```
---
## 일괄 컴파일 (wiki_status 기준)
```
raw/ 폴더에서 wiki_status가 "not-compiled"인 파일 목록 보여줘.
```
```
raw/articles/ 에서 wiki_status가 "not-compiled"인 파일들
순서대로 하나씩 컴파일해줘. 각 파일마다 index.md와 log.md 업데이트.
```
View File
View File
+6
View File
@@ -0,0 +1,6 @@
# Legacy Notice
`wiki/`의 기본 컨텍스트 파일은 이제 `wiki/GEMINI.md`다.
- Gemini CLI는 `wiki/GEMINI.md`를 사용한다.
- 위키 운영 규칙과 frontmatter 규칙도 그 파일을 기준으로 본다.
+35
View File
@@ -0,0 +1,35 @@
# wiki/ — AI가 컴파일하는 위키
## 규칙
- `raw/` 원본을 요약·연결·구조화하여 위키 페이지로 컴파일한다.
- 모든 페이지에 YAML frontmatter를 넣는다.
- 내부 참조는 `[[wikilink]]` 형식을 사용한다.
- 페이지 생성, 삭제, 주요 수정 시 `wiki/index.md``wiki/log.md`를 함께 갱신한다.
- 새 페이지보다 기존 페이지 업데이트를 우선한다.
- 소스 요약은 사실 위주로 쓰고, 해석은 개념 페이지에서 한다.
- 모순이 있으면 양쪽 소스를 모두 남긴다.
## 페이지 유형
- **개념 페이지:** 핵심 개념 정의, 설명, 연결
- **연결 페이지:** 둘 이상의 개념이나 문서의 관계·차이·통합 구조 정리
- **소스 요약 페이지:** 특정 원본의 사실 중심 요약
## frontmatter 템플릿
```yaml
---
title: "페이지 제목"
tags: []
sources: []
created: YYYY-MM-DD
updated: YYYY-MM-DD
---
```
## 질의 우선순위
1. `wiki/index.md`
2. 관련 `wiki/` 페이지
3. 필요 시 `raw/`
+22
View File
@@ -0,0 +1,22 @@
---
title: "위키 인덱스"
tags: [index, meta]
created: 2026-04-13
updated: 2026-04-17
---
# Wiki Index
> 모든 위키 페이지의 마스터 목록. 항목은 한 줄, 120자 이내.
> AI는 질의 시 이 파일을 **가장 먼저** 참조한다.
## 개념
_아직 페이지 없음 — 2패스 컴파일 시 추가 예정: 문서 구조화, 개념 연계, 자료 융합, 출처 관리, 문제해결 지식베이스_
## 소스 요약
## 연결
_아직 페이지 없음_
+14
View File
@@ -0,0 +1,14 @@
---
title: "위키 변경 로그"
tags: [log, meta]
created: 2026-04-13
updated: 2026-04-17
---
# Wiki Change Log
> 모든 위키 오퍼레이션(생성, 수정, 삭제)을 시간순으로 기록한다.
- 2026-04-16: `수정` — Gemini CLI 호환 구조로 운영 컨텍스트 이관 (`GEMINI.md` 계층 추가)
- 2026-04-16: `수정``.gemini/commands`, `.gemini/skills`, `.gemini/agents`, `.gemini/hooks`, `.gemini/settings.json` 추가
- 2026-04-17: `수정` — 볼트 운영 철학을 문서 구조화·연계·융합 중심으로 정리
+57
View File
@@ -0,0 +1,57 @@
## 1. 저에 대해
저는 물리적 문제를 수치해석적으로 해결하기 위한 솔버를 개발하는 개발자이자,
문서를 체계적으로 정리하고 연계·융합하는 지식 구조화 실천가입니다.
지식관리와 AI를 통해 흩어진 자료를 재사용 가능한 지식 체계로 만들고 싶습니다.
## 2. 내 전문 영역과 암묵지
- **본업:** 구조해석을 위한 유한요소법 기반 솔버 개발자
- **탐구 분야:** 다물리해석, 수치해석, 문서 구조화, 지식관리, 개념 연계, AI 활용
- **관리 도구:** 옵시디언에 문서를 체계적으로 축적하고 연결하는 중
## 3. 왜 기록하는가
일상과 업무에서 발견한 암묵지와 외부 자료를 체계적으로 발전시키고,
필요할 때 빠르게 찾고 조합할 수 있는 개인 지식베이스를 만들기 위해 기록한다.
## 4. 핵심 가설
- 자료의 구조적 정리는 지식 활용의 본질이다.
- 문서는 단순히 많이 모으는 것보다 분류, 요약, 연결, 출처 관리가 중요하다.
- 잘 정리된 문서 간 관계망은 문제 해결, 의사결정, 결과물 작성의 기반이 된다.
- AI는 원본을 대체하는 도구가 아니라 문서를 정리하고 연계·융합하는 보조 도구로 사용한다.
## 5. 선호하는 작업 방식
- 원본은 `raw/`에 보존하고, 해석과 구조화는 `wiki/`에서 수행한다.
- 개별 문서는 핵심 주장, 개념, 출처, 관련 페이지로 나누어 정리한다.
- 유사 개념은 새 페이지를 남발하지 않고 기존 페이지에 통합한다.
- 서로 다른 문서의 공통점, 차이점, 보완 관계를 명시해 융합 가능한 구조를 만든다.
## 6. 현재 상태와 병목
- 옵시디언 웹 클리퍼 + Templater로 메타데이터 포함 수집
- Gemini Search API로 RAG 활용 (RAG의 한계 인식 중)
- 안드레이 카파시의 LLM Wiki 개념에 주목
- **병목:** 양질의 자료는 있으나, AI가 잘 검색·정리·연계할 수 있는 구조가 부족
## 7. 원하는 시스템
- Graphify X는 사용 안 함
- **Gemini CLI × 옵시디언** 조합으로 AI가 볼트를 직접 활용하는 구조
- `GEMINI.md + commands + skills + agents + hooks` 조합으로 구현
- **이상적 워크플로우:** 문제를 던진다 → AI가 관련 문서를 찾는다 → 핵심 개념과 출처를 정리한다 → 관련 문서를 연계·융합한다 → 재사용 가능한 답이나 결과물이 나온다
## 8. 만들고 싶은 아웃풋
- 개인 지식베이스 운영 체계
- 지혜의 책
- 문서 정리·융합 가이드
- 문제해결 101
- **대상:** 복잡한 자료를 체계적으로 정리하고 문제 해결에 활용하려는 사람
## 9. 궁극적 목적
남들이 쉽게 알아내기 어려운 **경제적·지능적 혜자**를 발견하고,
좋아하는 일을 하면서 수익으로 연결한다.
+103
View File
@@ -0,0 +1,103 @@
# LLM Wiki 사용법
## 전체 흐름
```text
제가 raw/에 원본 투입
AI(Gemini CLI)가 wiki/로 컴파일
wiki/ 지식을 조합해서 output/ 결과물 생성
```
## 1단계: 원본 수집
raw/의 적절한 하위 폴더에 원본을 넣는다.
| 수집한 것 | 넣는 곳 |
|---|---|
| 웹 아티클, 블로그 | `raw/articles/` |
| 도서 | `raw/books/` |
| 논문 | `raw/papers/` |
| 순간 떠오른 아이디어 | `raw/ideas/` |
| 업무 기록, 암묵지 | `raw/work/` |
- 웹 클리퍼 + Templater로 메타데이터 포함 수집 가능
- 형식은 자유. 마크다운 권장
- **한번 넣은 원본은 수정하지 않는다**
## 2단계: Gemini CLI로 위키 컴파일
Gemini CLI는 이 프로젝트에서 다음 구조를 사용한다.
- 지속 컨텍스트: `GEMINI.md`, `raw/GEMINI.md`, `wiki/GEMINI.md`, `output/GEMINI.md`
- 반복 명령: `.gemini/commands/wiki/*.toml`
- 스킬: `.gemini/skills/llm-wiki-operator/`
- 서브에이전트: `.gemini/agents/*.md`
- 훅: `.gemini/settings.json`, `.gemini/hooks/*.cjs`
### 기본 사용 예시
- 자연어로 직접 요청:
- `raw/articles/문서정리방법론.md 읽고 wiki에 컴파일해줘`
- `raw/에서 '유한요소법 모델링' 관련 문서들 찾아서 wiki 페이지로 정리해줘`
- `raw/books/수치해석.md 내용을 기존 [[해석 모델링 원칙]] 페이지에 반영해줘`
- Gemini CLI 커스텀 명령 사용:
- `/wiki:compile raw/articles/문서정리방법론.md`
- `/wiki:ask 해석 모델링 원칙에 대해 내 볼트에 뭐가 있어?`
- `/wiki:connect 유한요소법 모델링과 다물리해석 문서`
- `/wiki:draft 문제해결 관련 개념을 모아 output/에 문제해결 101 초안 작성`
### AI가 자동으로 지키도록 설정된 것
- `raw/` 수정 차단 훅
- `wiki/` 수정 시 `index.md`, `log.md` 갱신 리마인더
- wiki 페이지 frontmatter 규칙
- `[[wikilink]]` 내부 링크 규칙
## 3단계: 지식 활용
### 질문하기
> `해석 모델링 원칙에 대해 내 볼트에 뭐가 있어?`
AI는 이 순서로 찾는다.
1. `wiki/index.md`
2. 관련 `wiki/` 페이지
3. `raw/`는 마지막 수단
### 문서 연계·융합 요청
> `유한요소법 모델링과 다물리해석 문서를 연계해서 공통 원칙을 정리해줘`
> `내 볼트에서 수치해석 안정성과 모델 검증 관련 지식을 찾고, 서로 보완되는 내용을 융합해줘`
### 결과물 생성
> `wiki/에서 문제해결 관련 개념들 모아서 output/에 문제해결 101 초안 만들어줘`
> `wiki/에서 문서 정리와 지식 활용 관련 내용 정리해서 가이드 초안 만들어줘`
## 4단계: 설정 변경 후 새로고침
Gemini CLI 인터랙티브 세션 안에서 아래 명령으로 구조 변경을 반영한다.
- `/memory refresh` 또는 `/memory show`
- `/commands reload`
- `/skills reload`
- `/agents reload`
- `/hooks panel`
터미널에서 빠르게 확인하려면 다음 명령도 쓸 수 있다.
- `gemini --version`
- `gemini skills list`
## 주의사항
- **raw/ 파일은 절대 수정하지 않는다** — 원본 보존이 핵심
- 위키 페이지가 이미 있으면 새로 만들지 말고 **업데이트**
- AI에게 요청할 때 대상 문서, 원하는 정리 기준, 출력 형식을 구체적으로 말할수록 좋다
- 문서는 **분류 → 요약 → 연결 → 융합 → 재사용** 순서로 관리한다