add template
This commit is contained in:
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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를 활용하라.
|
||||||
|
"""
|
||||||
@@ -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를 활용하라.
|
||||||
|
"""
|
||||||
@@ -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를 활용하라.
|
||||||
|
"""
|
||||||
@@ -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를 활용하라.
|
||||||
|
"""
|
||||||
@@ -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}
|
||||||
|
"""
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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`를 개별 갱신한다
|
||||||
|
- 너무 큰 묶음은 나누어 처리한다
|
||||||
@@ -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)를 참조한다.
|
||||||
@@ -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자 이내
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"schemaVersion": "0.1.0",
|
||||||
|
"name": "LLM Wiki 전용",
|
||||||
|
"behavior": "create",
|
||||||
|
"noteContentFormat": "{{content}}",
|
||||||
|
"properties": [],
|
||||||
|
"triggers": [],
|
||||||
|
"noteNameFormat": "{{title}}",
|
||||||
|
"path": "Clippings"
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Legacy Notice
|
||||||
|
|
||||||
|
`output/`의 기본 컨텍스트 파일은 이제 `output/GEMINI.md`다.
|
||||||
|
|
||||||
|
- Gemini CLI는 `output/GEMINI.md`를 사용한다.
|
||||||
|
- 결과물은 `wiki/` 기반으로 작성한다는 규칙도 동일하다.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# output/ — 결과물 저장소
|
||||||
|
|
||||||
|
## 용도
|
||||||
|
|
||||||
|
`wiki/`에 구조화된 지식을 조합하여 최종 결과물을 저장한다.
|
||||||
|
|
||||||
|
## 결과물 유형
|
||||||
|
|
||||||
|
- 지식 정리 시스템 설명 문서
|
||||||
|
- 지혜의 책 초안
|
||||||
|
- 문서 융합 가이드
|
||||||
|
- 문제해결 101
|
||||||
|
- 기타 아티클, 발표문, 강의안, 기획서
|
||||||
|
|
||||||
|
## 규칙
|
||||||
|
|
||||||
|
- 결과물의 근거는 가능하면 `wiki/` 페이지에 둔다.
|
||||||
|
- `raw/`를 직접 해석해 결과물을 만들기보다, 먼저 `wiki/`에 컴파일한 뒤 사용한다.
|
||||||
|
- 결과물마다 주제별로 파일을 분리한다.
|
||||||
|
- 초안이라도 사용한 핵심 `wiki/` 페이지를 본문 또는 말미에 남긴다.
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Legacy Notice
|
||||||
|
|
||||||
|
`raw/`의 기본 컨텍스트 파일은 이제 `raw/GEMINI.md`다.
|
||||||
|
|
||||||
|
- Gemini CLI는 `raw/GEMINI.md`를 사용한다.
|
||||||
|
- `raw/`는 계속 읽기 전용이며, 변경 금지 규칙도 동일하다.
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# raw/ — 불변 원본 저장소
|
||||||
|
|
||||||
|
## 규칙
|
||||||
|
|
||||||
|
- `raw/`는 읽기 전용이다. 생성·수정·이동·삭제를 하지 않는다.
|
||||||
|
- 사용자가 직접 넣은 원본을 그대로 보존한다.
|
||||||
|
- 요약, 해석, 구조화, 연결은 `wiki/`에서 수행한다.
|
||||||
|
|
||||||
|
## 하위 폴더
|
||||||
|
|
||||||
|
| 폴더 | 용도 |
|
||||||
|
|---|---|
|
||||||
|
| `articles/` | 웹 아티클, 블로그 |
|
||||||
|
| `books/` | 책 발췌, 독서 노트 원본 |
|
||||||
|
| `videos/` | 영상 대본, 트랜스크립트 |
|
||||||
|
| `ideas/` | 순간 아이디어, 메모 |
|
||||||
|
| `work/` | BIM 개발 관련 업무 기록, 암묵지 |
|
||||||
|
|
||||||
|
## Gemini CLI 작업 원칙
|
||||||
|
|
||||||
|
- `raw/`를 참조할 때도 먼저 `wiki/index.md`와 관련 `wiki/` 페이지를 확인한다.
|
||||||
|
- `raw/` 내용을 인용할 때는 실제 원본 파일 경로를 `sources`나 본문에 남긴다.
|
||||||
|
- 대용량 책은 **1패스(목차) → 2패스(챕터별)** 순서로 처리한다.
|
||||||
@@ -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" }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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" }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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" }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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" }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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" }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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 업데이트.
|
||||||
|
```
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Legacy Notice
|
||||||
|
|
||||||
|
`wiki/`의 기본 컨텍스트 파일은 이제 `wiki/GEMINI.md`다.
|
||||||
|
|
||||||
|
- Gemini CLI는 `wiki/GEMINI.md`를 사용한다.
|
||||||
|
- 위키 운영 규칙과 frontmatter 규칙도 그 파일을 기준으로 본다.
|
||||||
@@ -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/`
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
title: "위키 인덱스"
|
||||||
|
tags: [index, meta]
|
||||||
|
created: 2026-04-13
|
||||||
|
updated: 2026-04-17
|
||||||
|
---
|
||||||
|
|
||||||
|
# Wiki Index
|
||||||
|
|
||||||
|
> 모든 위키 페이지의 마스터 목록. 항목은 한 줄, 120자 이내.
|
||||||
|
> AI는 질의 시 이 파일을 **가장 먼저** 참조한다.
|
||||||
|
|
||||||
|
## 개념
|
||||||
|
|
||||||
|
_아직 페이지 없음 — 2패스 컴파일 시 추가 예정: 문서 구조화, 개념 연계, 자료 융합, 출처 관리, 문제해결 지식베이스_
|
||||||
|
|
||||||
|
## 소스 요약
|
||||||
|
|
||||||
|
|
||||||
|
## 연결
|
||||||
|
|
||||||
|
_아직 페이지 없음_
|
||||||
+14
@@ -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
@@ -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. 궁극적 목적
|
||||||
|
|
||||||
|
남들이 쉽게 알아내기 어려운 **경제적·지능적 혜자**를 발견하고,
|
||||||
|
좋아하는 일을 하면서 수익으로 연결한다.
|
||||||
@@ -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에게 요청할 때 대상 문서, 원하는 정리 기준, 출력 형식을 구체적으로 말할수록 좋다
|
||||||
|
- 문서는 **분류 → 요약 → 연결 → 융합 → 재사용** 순서로 관리한다
|
||||||
Reference in New Issue
Block a user