diff --git a/.gemini/agents/output-drafter.md b/.gemini/agents/output-drafter.md new file mode 100644 index 0000000..9f65d45 --- /dev/null +++ b/.gemini/agents/output-drafter.md @@ -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. diff --git a/.gemini/agents/vault-researcher.md b/.gemini/agents/vault-researcher.md new file mode 100644 index 0000000..6dec360 --- /dev/null +++ b/.gemini/agents/vault-researcher.md @@ -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. diff --git a/.gemini/agents/wiki-compiler.md b/.gemini/agents/wiki-compiler.md new file mode 100644 index 0000000..a984c68 --- /dev/null +++ b/.gemini/agents/wiki-compiler.md @@ -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. diff --git a/.gemini/commands/wiki/ask.toml b/.gemini/commands/wiki/ask.toml new file mode 100644 index 0000000..e34bdcb --- /dev/null +++ b/.gemini/commands/wiki/ask.toml @@ -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를 활용하라. +""" diff --git a/.gemini/commands/wiki/compile.toml b/.gemini/commands/wiki/compile.toml new file mode 100644 index 0000000..6f90a95 --- /dev/null +++ b/.gemini/commands/wiki/compile.toml @@ -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를 활용하라. +""" diff --git a/.gemini/commands/wiki/connect.toml b/.gemini/commands/wiki/connect.toml new file mode 100644 index 0000000..f561206 --- /dev/null +++ b/.gemini/commands/wiki/connect.toml @@ -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를 활용하라. +""" diff --git a/.gemini/commands/wiki/draft.toml b/.gemini/commands/wiki/draft.toml new file mode 100644 index 0000000..b5a3ec4 --- /dev/null +++ b/.gemini/commands/wiki/draft.toml @@ -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를 활용하라. +""" diff --git a/.gemini/commands/wiki/init.toml b/.gemini/commands/wiki/init.toml new file mode 100644 index 0000000..16118cb --- /dev/null +++ b/.gemini/commands/wiki/init.toml @@ -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} +""" diff --git a/.gemini/hooks/protect-raw-sources.cjs b/.gemini/hooks/protect-raw-sources.cjs new file mode 100644 index 0000000..5ae3a7e --- /dev/null +++ b/.gemini/hooks/protect-raw-sources.cjs @@ -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)|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); +} diff --git a/.gemini/hooks/wiki-write-reminder.cjs b/.gemini/hooks/wiki-write-reminder.cjs new file mode 100644 index 0000000..230e870 --- /dev/null +++ b/.gemini/hooks/wiki-write-reminder.cjs @@ -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); +} diff --git a/.gemini/settings.json b/.gemini/settings.json new file mode 100644 index 0000000..7c67f86 --- /dev/null +++ b/.gemini/settings.json @@ -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." + } + ] + } + ] + } +} diff --git a/.gemini/skills/llm-wiki-operator/SKILL.md b/.gemini/skills/llm-wiki-operator/SKILL.md new file mode 100644 index 0000000..0676eb8 --- /dev/null +++ b/.gemini/skills/llm-wiki-operator/SKILL.md @@ -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` diff --git a/.gemini/skills/llm-wiki-operator/assets/log-entry-template.md b/.gemini/skills/llm-wiki-operator/assets/log-entry-template.md new file mode 100644 index 0000000..5c47d05 --- /dev/null +++ b/.gemini/skills/llm-wiki-operator/assets/log-entry-template.md @@ -0,0 +1 @@ +- YYYY-MM-DD: `생성|수정|삭제` — 대상 페이지 `[[페이지명]]`, 소스 `[raw/...경로]`, 메모 한 줄 diff --git a/.gemini/skills/llm-wiki-operator/assets/wiki-page-template.md b/.gemini/skills/llm-wiki-operator/assets/wiki-page-template.md new file mode 100644 index 0000000..5929b6f --- /dev/null +++ b/.gemini/skills/llm-wiki-operator/assets/wiki-page-template.md @@ -0,0 +1,21 @@ +```yaml +--- +title: "페이지 제목" +tags: [] +sources: [] +created: YYYY-MM-DD +updated: YYYY-MM-DD +--- +``` + +# 페이지 제목 + +## 요약 + +## 핵심 개념 + +## 근거와 인용 + +## 연결 + +## 메모 diff --git a/.gemini/skills/llm-wiki-operator/references/source-type-playbooks.md b/.gemini/skills/llm-wiki-operator/references/source-type-playbooks.md new file mode 100644 index 0000000..bf4e6b4 --- /dev/null +++ b/.gemini/skills/llm-wiki-operator/references/source-type-playbooks.md @@ -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`를 개별 갱신한다 +- 너무 큰 묶음은 나누어 처리한다 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..b9208df --- /dev/null +++ b/CLAUDE.md @@ -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)를 참조한다. diff --git a/GEMINI.md b/GEMINI.md new file mode 100644 index 0000000..cb99910 --- /dev/null +++ b/GEMINI.md @@ -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/`은 위키 기반 조합 +- **작업 시 이 볼트를 지식 베이스로 적극 활용할 것** diff --git a/Karpathy llm wiki 핵심규칙 10가지.md b/Karpathy llm wiki 핵심규칙 10가지.md new file mode 100644 index 0000000..f955264 --- /dev/null +++ b/Karpathy llm wiki 핵심규칙 10가지.md @@ -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자 이내 \ No newline at end of file diff --git a/llm-wiki-전용-clipper.json b/llm-wiki-전용-clipper.json new file mode 100644 index 0000000..d3db911 --- /dev/null +++ b/llm-wiki-전용-clipper.json @@ -0,0 +1,10 @@ +{ + "schemaVersion": "0.1.0", + "name": "LLM Wiki 전용", + "behavior": "create", + "noteContentFormat": "{{content}}", + "properties": [], + "triggers": [], + "noteNameFormat": "{{title}}", + "path": "Clippings" +} \ No newline at end of file diff --git a/output/CLAUDE.md b/output/CLAUDE.md new file mode 100644 index 0000000..20303bb --- /dev/null +++ b/output/CLAUDE.md @@ -0,0 +1,6 @@ +# Legacy Notice + +`output/`의 기본 컨텍스트 파일은 이제 `output/GEMINI.md`다. + +- Gemini CLI는 `output/GEMINI.md`를 사용한다. +- 결과물은 `wiki/` 기반으로 작성한다는 규칙도 동일하다. diff --git a/output/GEMINI.md b/output/GEMINI.md new file mode 100644 index 0000000..b625699 --- /dev/null +++ b/output/GEMINI.md @@ -0,0 +1,20 @@ +# output/ — 결과물 저장소 + +## 용도 + +`wiki/`에 구조화된 지식을 조합하여 최종 결과물을 저장한다. + +## 결과물 유형 + +- 지식 정리 시스템 설명 문서 +- 지혜의 책 초안 +- 문서 융합 가이드 +- 문제해결 101 +- 기타 아티클, 발표문, 강의안, 기획서 + +## 규칙 + +- 결과물의 근거는 가능하면 `wiki/` 페이지에 둔다. +- `raw/`를 직접 해석해 결과물을 만들기보다, 먼저 `wiki/`에 컴파일한 뒤 사용한다. +- 결과물마다 주제별로 파일을 분리한다. +- 초안이라도 사용한 핵심 `wiki/` 페이지를 본문 또는 말미에 남긴다. diff --git a/raw/CLAUDE.md b/raw/CLAUDE.md new file mode 100644 index 0000000..0f130f1 --- /dev/null +++ b/raw/CLAUDE.md @@ -0,0 +1,6 @@ +# Legacy Notice + +`raw/`의 기본 컨텍스트 파일은 이제 `raw/GEMINI.md`다. + +- Gemini CLI는 `raw/GEMINI.md`를 사용한다. +- `raw/`는 계속 읽기 전용이며, 변경 금지 규칙도 동일하다. diff --git a/raw/GEMINI.md b/raw/GEMINI.md new file mode 100644 index 0000000..608de35 --- /dev/null +++ b/raw/GEMINI.md @@ -0,0 +1,23 @@ +# raw/ — 불변 원본 저장소 + +## 규칙 + +- `raw/`는 읽기 전용이다. 생성·수정·이동·삭제를 하지 않는다. +- 사용자가 직접 넣은 원본을 그대로 보존한다. +- 요약, 해석, 구조화, 연결은 `wiki/`에서 수행한다. + +## 하위 폴더 + +| 폴더 | 용도 | +|---|---| +| `articles/` | 웹 아티클, 블로그 | +| `books/` | 책 발췌, 독서 노트 원본 | +| `videos/` | 영상 대본, 트랜스크립트 | +| `ideas/` | 순간 아이디어, 메모 | +| `work/` | BIM 개발 관련 업무 기록, 암묵지 | + +## Gemini CLI 작업 원칙 + +- `raw/`를 참조할 때도 먼저 `wiki/index.md`와 관련 `wiki/` 페이지를 확인한다. +- `raw/` 내용을 인용할 때는 실제 원본 파일 경로를 `sources`나 본문에 남긴다. +- 대용량 책은 **1패스(목차) → 2패스(챕터별)** 순서로 처리한다. diff --git a/raw/articles/새 텍스트 문서.txt b/raw/articles/새 텍스트 문서.txt new file mode 100644 index 0000000..e69de29 diff --git a/raw/books/새 텍스트 문서.txt b/raw/books/새 텍스트 문서.txt new file mode 100644 index 0000000..e69de29 diff --git a/raw/ideas/새 텍스트 문서.txt b/raw/ideas/새 텍스트 문서.txt new file mode 100644 index 0000000..e69de29 diff --git a/raw/papers/새 텍스트 문서.txt b/raw/papers/새 텍스트 문서.txt new file mode 100644 index 0000000..e69de29 diff --git a/raw/templates/webclipper_article.json b/raw/templates/webclipper_article.json new file mode 100644 index 0000000..65631ed --- /dev/null +++ b/raw/templates/webclipper_article.json @@ -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" } + ] +} diff --git a/raw/templates/webclipper_book.json b/raw/templates/webclipper_book.json new file mode 100644 index 0000000..dd97b1c --- /dev/null +++ b/raw/templates/webclipper_book.json @@ -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\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" } + ] +} diff --git a/raw/templates/webclipper_podcast.json b/raw/templates/webclipper_podcast.json new file mode 100644 index 0000000..16c70d6 --- /dev/null +++ b/raw/templates/webclipper_podcast.json @@ -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" } + ] +} diff --git a/raw/templates/webclipper_research.json b/raw/templates/webclipper_research.json new file mode 100644 index 0000000..bf09286 --- /dev/null +++ b/raw/templates/webclipper_research.json @@ -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" } + ] +} diff --git a/raw/templates/webclipper_youtube.json b/raw/templates/webclipper_youtube.json new file mode 100644 index 0000000..5d6b445 --- /dev/null +++ b/raw/templates/webclipper_youtube.json @@ -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" } + ] +} diff --git a/raw/templates/컴파일_프롬프트.md b/raw/templates/컴파일_프롬프트.md new file mode 100644 index 0000000..1f0002b --- /dev/null +++ b/raw/templates/컴파일_프롬프트.md @@ -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 업데이트. +``` diff --git a/raw/videos/새 텍스트 문서.txt b/raw/videos/새 텍스트 문서.txt new file mode 100644 index 0000000..e69de29 diff --git a/raw/work/새 텍스트 문서.txt b/raw/work/새 텍스트 문서.txt new file mode 100644 index 0000000..e69de29 diff --git a/wiki/CLAUDE.md b/wiki/CLAUDE.md new file mode 100644 index 0000000..56fae08 --- /dev/null +++ b/wiki/CLAUDE.md @@ -0,0 +1,6 @@ +# Legacy Notice + +`wiki/`의 기본 컨텍스트 파일은 이제 `wiki/GEMINI.md`다. + +- Gemini CLI는 `wiki/GEMINI.md`를 사용한다. +- 위키 운영 규칙과 frontmatter 규칙도 그 파일을 기준으로 본다. diff --git a/wiki/GEMINI.md b/wiki/GEMINI.md new file mode 100644 index 0000000..280316d --- /dev/null +++ b/wiki/GEMINI.md @@ -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/` diff --git a/wiki/index.md b/wiki/index.md new file mode 100644 index 0000000..0abcd83 --- /dev/null +++ b/wiki/index.md @@ -0,0 +1,22 @@ +--- +title: "위키 인덱스" +tags: [index, meta] +created: 2026-04-13 +updated: 2026-04-17 +--- + +# Wiki Index + +> 모든 위키 페이지의 마스터 목록. 항목은 한 줄, 120자 이내. +> AI는 질의 시 이 파일을 **가장 먼저** 참조한다. + +## 개념 + +_아직 페이지 없음 — 2패스 컴파일 시 추가 예정: 문서 구조화, 개념 연계, 자료 융합, 출처 관리, 문제해결 지식베이스_ + +## 소스 요약 + + +## 연결 + +_아직 페이지 없음_ diff --git a/wiki/log.md b/wiki/log.md new file mode 100644 index 0000000..2d0d175 --- /dev/null +++ b/wiki/log.md @@ -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: `수정` — 볼트 운영 철학을 문서 구조화·연계·융합 중심으로 정리 diff --git a/나의 핵심 맥락.md b/나의 핵심 맥락.md new file mode 100644 index 0000000..573bcc9 --- /dev/null +++ b/나의 핵심 맥락.md @@ -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. 궁극적 목적 + +남들이 쉽게 알아내기 어려운 **경제적·지능적 혜자**를 발견하고, +좋아하는 일을 하면서 수익으로 연결한다. diff --git a/사용법.md b/사용법.md new file mode 100644 index 0000000..14a0f07 --- /dev/null +++ b/사용법.md @@ -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에게 요청할 때 대상 문서, 원하는 정리 기준, 출력 형식을 구체적으로 말할수록 좋다 +- 문서는 **분류 → 요약 → 연결 → 융합 → 재사용** 순서로 관리한다