diff --git a/.agents/cmd-thiscode-km-bootstrap.yaml b/.agents/cmd-thiscode-km-bootstrap.yaml deleted file mode 100644 index 9a9fa68..0000000 --- a/.agents/cmd-thiscode-km-bootstrap.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: cmd-thiscode-km-bootstrap -description: Slash command /thiscode:km-bootstrap — one-shot installer wrapper for the 4-Tier search stack. -version: 1.0.0 -provides_commands: - - /thiscode:km-bootstrap -tier: external -allowedTools: - - Bash diff --git a/.agents/cmd-thiscode-km.yaml b/.agents/cmd-thiscode-km.yaml deleted file mode 100644 index 9454956..0000000 --- a/.agents/cmd-thiscode-km.yaml +++ /dev/null @@ -1,9 +0,0 @@ -name: cmd-thiscode-km -description: Slash command /thiscode:km — dispatches to km-lite (default) / km-at / km-plain based on flags. Wizard if no args. -version: 1.0.0 -provides_commands: - - /thiscode:km -tier: external -allowedTools: - - Bash - - AskUserQuestion diff --git a/.agents/cmd-thiscode-search.yaml b/.agents/cmd-thiscode-search.yaml deleted file mode 100644 index 7971c8b..0000000 --- a/.agents/cmd-thiscode-search.yaml +++ /dev/null @@ -1,9 +0,0 @@ -name: cmd-search -description: Slash command /thiscode:search — 4-Tier search dispatcher (forwards to search skill). -version: 1.0.0 -provides_commands: - - /thiscode:search -tier: external -allowedTools: - - Bash - - mcp__vault-search__* diff --git a/.agents/cmd-thiscode-setup.yaml b/.agents/cmd-thiscode-setup.yaml deleted file mode 100644 index 0518a94..0000000 --- a/.agents/cmd-thiscode-setup.yaml +++ /dev/null @@ -1,10 +0,0 @@ -name: cmd-thiscode-setup -description: Slash command /thiscode:setup — interactive bootstrap wizard (Tier 1-4 install choices), invokes bootstrap skill. -version: 1.0.0 -provides_commands: - - /thiscode:setup -tier: external -allowedTools: - - Bash - - AskUserQuestion - - Write diff --git a/.agents/knowledge-manager-at.yaml b/.agents/knowledge-manager-at.yaml deleted file mode 100644 index 058c633..0000000 --- a/.agents/knowledge-manager-at.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: knowledge-manager-at -description: Knowledge Manager Agent Teams variant — Mode R (Reorganization) workflow with category lead + worker split via parallel-agent orchestration pattern. Advanced KM for team vaults. -version: 1.0.0 -license: MIT -homepage: https://github.com/treylom/ThisCode -provides_tools: - - knowledge_manager_at - - claude_discode_km_at -provides_commands: - - /thiscode:km -tier: experimental -model: opus[1m] -allowedTools: - - Bash - - Read - - Write - - Glob - - Grep - - mcp__vault-search__* -phases: - preflight: - auto: true - scope: read-only - checks: - - broken_wikilinks - - folder_entropy - - orphan_notes - output: meetings/{date}-km-at-preflight-report.md - apply: - auto: false - dry_run_required: true diff --git a/.agents/knowledge-manager-bootstrap.yaml b/.agents/knowledge-manager-bootstrap.yaml deleted file mode 100644 index fac17bb..0000000 --- a/.agents/knowledge-manager-bootstrap.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: knowledge-manager-bootstrap -description: One-shot environment installer for the 4-Tier search stack — installs Obsidian CLI (optional), vault-search MCP, GraphRAG server (optional), records vault_root. -version: 1.0.0 -license: MIT -homepage: https://github.com/treylom/ThisCode -provides_tools: - - knowledge_manager_bootstrap - - claude_discode_km_bootstrap -provides_commands: - - /thiscode:km-bootstrap -tier: external -model: opus[1m] -allowedTools: - - Bash - - AskUserQuestion - - Write - - Read diff --git a/.agents/knowledge-manager-lite.yaml b/.agents/knowledge-manager-lite.yaml deleted file mode 100644 index b8b088a..0000000 --- a/.agents/knowledge-manager-lite.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: knowledge-manager-lite -description: Knowledge Manager lite — Phase 1 (ingestion) + Phase 2 (extract/classify) for individual vault. Default KM variant per docs/01-mode-i.md. -version: 1.0.0 -license: MIT -homepage: https://github.com/treylom/ThisCode -provides_tools: - - knowledge_manager_lite - - claude_discode_km_lite - - claude_discode_ingest -provides_commands: - - /thiscode:km -tier: external -model: opus[1m] -allowedTools: - - Bash - - Read - - Write - - Glob - - Grep - - mcp__vault-search__* diff --git a/.agents/knowledge-manager-plain.yaml b/.agents/knowledge-manager-plain.yaml deleted file mode 100644 index fa8d368..0000000 --- a/.agents/knowledge-manager-plain.yaml +++ /dev/null @@ -1,18 +0,0 @@ -name: knowledge-manager-plain -description: Knowledge Manager headless variant — no AskUserQuestion prompts, suitable for CI/cron unattended ingestion. -version: 1.0.0 -license: MIT -homepage: https://github.com/treylom/ThisCode -provides_tools: - - knowledge_manager_plain - - claude_discode_km_plain -provides_commands: - - /thiscode:km -tier: internal -model: opus[1m] -allowedTools: - - Bash - - Read - - Write - - Glob - - Grep diff --git a/.agents/knowledge-manager.yaml b/.agents/knowledge-manager.yaml deleted file mode 100644 index e9b241e..0000000 --- a/.agents/knowledge-manager.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: knowledge-manager -description: Knowledge Manager — vault 7-Layer Fusion + Orchestrator Pipeline + agent-office/km-tools 풀 본문 (vault `.claude/commands/knowledge-manager.md` mirror). Mode I/R/G 모두 지원, 단일 에이전트 순차 처리. v2.2 옵션 C pure Mirror. -version: 2.2.0 -license: MIT -homepage: https://github.com/treylom/ThisCode -provides_tools: - - knowledge_manager -provides_commands: - - /thiscode:km -tier: external -model: opus[1m] -allowedTools: - - Bash - - Read - - Write - - Glob - - Grep - - WebFetch - - AskUserQuestion diff --git a/.agents/search-lite.yaml b/.agents/search-lite.yaml deleted file mode 100644 index 8fd4c5b..0000000 --- a/.agents/search-lite.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: search-lite -description: Search Lite — Obsidian CLI / MCP / Grep 3-Tier Cascade (GraphRAG 의존 없음). vault `.claude/commands/search-lite.md` mirror. v2.2 옵션 C pure Mirror. -version: 2.2.0 -license: MIT -homepage: https://github.com/treylom/ThisCode -provides_tools: - - search_lite -provides_commands: - - /thiscode:search -tier: external -model: sonnet -allowedTools: - - Bash - - Read - - Glob - - Grep diff --git a/.agents/search.yaml b/.agents/search.yaml deleted file mode 100644 index 225b9d1..0000000 --- a/.agents/search.yaml +++ /dev/null @@ -1,38 +0,0 @@ -name: search -description: 4-Tier vault search dispatcher — Tier 1 GraphRAG (FastAPI semantic + graph) → Tier 2 Obsidian CLI (full-text safety net) → Tier 3 vault-search MCP (embedding) → Tier 4 ripgrep (literal). Recall-first fallback. v2.1 정정 — GraphRAG primary, CLI second fallback. -version: 1.0.0 -license: MIT -homepage: https://github.com/treylom/ThisCode - -provides_tools: - - search - - claude_discode_search -provides_commands: - - /thiscode:search - -tier: external -model: opus[1m] -allowedTools: - - Bash - - Read - - Glob - - Grep - - mcp__vault-search__* - -gates: - - id: latency-p95 - expr: "latency_ms_p95 < 2000" - evaluator: simple - - id: recall-minimum - expr: "recall_at_5 > 0.5" - evaluator: simple - -benchmark: - fixtures: benchmark/fixtures/queries.yaml - axes: - - latency_ms - - recall_at_k - - cost_tokens - - setup_time_min - - kg_depth - baseline_tier: 4 diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 088f99f..2fb415d 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ { "name": "thiscode", "description": "Claude Code 환경 + Discord 봇 + tmux/oh-my-tmux 통합 셋업 플러그인. WSL/Linux/macOS 자동 detect.", - "version": "1.3.2", + "version": "1.4.0", "source": "./", "author": { "name": "treylom", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index d0f063e..81f32cf 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "thiscode", - "description": "Claude Code 환경 + Discord/Slack 봇 + tmux/oh-my-tmux 통합 셋업 플러그인. WSL/Linux/macOS 자동 detect. 슬래시: /thiscode:start, /thiscode:init, /thiscode:create-bot, /thiscode:create-discord-bot, /thiscode:add-bot, /thiscode:create-slack-bot, /thiscode:slack-configure, /thiscode:install-hooks, /thiscode:open-meeting, /thiscode:km, /thiscode:km-bootstrap, /thiscode:search, /thiscode:test, /thiscode:codex-check, /thiscode:self-update, /thiscode:prompt, /thiscode:help.", - "version": "1.3.2", + "description": "Claude Code 환경 + Discord/Slack 봇 + tmux/oh-my-tmux 통합 셋업 플러그인. WSL/Linux/macOS 자동 detect. 지식관리·볼트 검색은 km 플러그인이 담당하며 /thiscode:km·/thiscode:km-bootstrap은 설치와 목적지 명령만 안내. commands/: /thiscode:add-bot, /thiscode:codex-check, /thiscode:init, /thiscode:install-browser, /thiscode:km-bootstrap, /thiscode:km, /thiscode:open-meeting, /thiscode:slack-configure, /thiscode:start, /thiscode:test.", + "version": "1.4.0", "author": { "name": "treylom", "email": "treylom@users.noreply.github.com" diff --git a/AGENTS.md b/AGENTS.md index deb0a31..0da1d14 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,9 +4,9 @@ ## What this plugin provides -- **KM ingestion** (Mode I/R/G per `contracts/km-mode-spec.md`) -- **4-Tier vault search** per `contracts/search-fallback-4tier.md` -- **3 variants** per `contracts/km-variant-matrix.md`: `lite` / `at` / `plain` +- **Bot-harness operations**: setup/installers, meetings, shared memory, model routing, and Codex/Discord bridges. +- **Knowledge management and vault search are outside ThisCode 1.4.0**. Install the km plugin and use `/km:search`, + `/km:knowledge-manager`, and `/km:setup` for those capabilities. ## Packaging layers @@ -29,17 +29,26 @@ bash scripts/km-version.sh Compares plugin contracts vs the vault mirror at `/.claude/reference/contracts/`. Exits non-zero on any version mismatch. -## Slash commands +## Claude Code entry points -| Command | Variant | Purpose | +| Entry point | Surface | Purpose | |---|---|---| -| `/thiscode:km` | auto-routes | Mode I/R/G dispatch (see km-variant-matrix) | -| `/thiscode:search` | n/a | 4-Tier search | -| `/thiscode:km-bootstrap` | wizard | First-time install + config write | +| `/thiscode:add-bot` | `commands/add-bot.md` | Add a Discord bot to an existing setup | +| `/thiscode:codex-check` | `commands/codex-check.md` | Verify the Codex CLI bridge | +| `/thiscode:init` | `commands/init.md` | Detect the environment and guide selected ThisCode local setup scripts | +| `/thiscode:install-browser` | `commands/install-browser.md` | Install and verify the browser tool | +| `/thiscode:km-bootstrap` | `commands/km-bootstrap.md` | Point to ThisCode local search-tool scripts and km plugin setup | +| `/thiscode:km` | `commands/km.md` | Point to `/km:search` and `/km:knowledge-manager` | +| `/thiscode:open-meeting` | `commands/open-meeting.md` | Create the standard multi-bot meeting files | +| `/thiscode:slack-configure` | `commands/slack-configure.md` | Connect a Claude Code session to Slack | +| `/thiscode:start` | `commands/start.md` | Run the main Discord bot setup wizard | +| `/thiscode:test` | `commands/test.md` | Run feature smoke tests | + +`/thiscode:setup` is the separate `skills/setup/SKILL.md` entry point, not a file under `commands/`. Knowledge management and vault-search behavior are provided by the km plugin; the two ThisCode `km*` commands above are migration pointers, not local implementations. ## Cross-harness invocation reference -- **Claude Code**: `Skill(search)` -- **Hermes Agent**: `claude_discode_search` tool (auto-registered via `hermes-plugin/__init__.py`) +- **Claude Code**: `Skill()` for any skill under `skills/`; vault search uses the km plugin (`/km:search`) +- **Hermes Agent**: the runtime registers the `on_session_start` drift-check hook; KM/search surfaces are not registered here - **Gemini CLI**: read `GEMINI.md` on startup; skills auto-discovered from `skills/` - **OpenCode / Goose / Cursor**: standard agentskills.io SKILL.md frontmatter (`name` + `description`) makes them visible diff --git a/GEMINI.md b/GEMINI.md index 50e1144..60b9263 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -2,13 +2,13 @@ This is the Gemini CLI / multi-harness entry context for the `thiscode` plugin. -> thiscode brings a portable knowledge manager + 4-Tier vault search to any agentskills.io-compatible runtime. +> thiscode brings bot-harness operations to agentskills.io-compatible runtimes. Knowledge management and vault search +> are provided by the separate km plugin. ## When to use -- Student needs to ingest a URL / file / inline text into a local markdown vault. -- Student asks a vault question and wants graded fallback (GraphRAG → Obsidian CLI → vault-search MCP → ripgrep). -- Student is debugging why search returns "Tier 4: 텍스트 검색 결과입니다" — invoke `/thiscode-km-bootstrap`. +- Student needs to configure the ThisCode bot harness, meetings, shared memory, or model routing. +- Student needs knowledge management or vault search — install the km plugin and follow its command documentation. ## Layout (L3 — npm gemini-extension wrapper) @@ -20,12 +20,11 @@ This is the Gemini CLI / multi-harness entry context for the `thiscode` plugin. ## Key facts -- **Single source of truth** for behavior: `contracts/search-fallback-4tier.md`, `contracts/km-mode-spec.md`, `contracts/km-variant-matrix.md`. Any client MUST follow these. -- **Variants** (`contracts/km-variant-matrix.md`): `lite` (default, Phase 1·2), `at` (Phase 3 Agent Teams), `plain` (headless). -- Drift detection: `bash scripts/km-version.sh` — compares plugin contracts vs vault mirror. +- ThisCode's source of truth covers bot-harness operations and its installation contracts. +- KM behavior and command variants are documented by the km plugin; thiscode does not bundle those skills. +- Drift detection: `bash scripts/km-version.sh` — compares the remaining plugin contracts vs vault mirror. ## Suggested first actions -1. `/thiscode-km-bootstrap` — install + wire 4-Tier stack. -2. `/thiscode:km ` — ingest a first article. -3. `/thiscode:search "MCP"` — verify search. +1. `/thiscode:setup` — configure the ThisCode bot harness and installer surfaces. +2. Install the km plugin, then follow `/km:setup`, `/km:search`, and `/km:knowledge-manager` in its documentation. diff --git a/README.ko.md b/README.ko.md index 74df239..c1b067c 100644 --- a/README.ko.md +++ b/README.ko.md @@ -6,6 +6,8 @@ > > **역할 경계**: ThisCode = 봇 하네스 운영 번들(운영 규칙·GraphRAG 운영 vendor·배포 계약). 범용 지식관리 제품은 [knowledge-manager](https://github.com/treylom/knowledge-manager), 플러그인 설치 창구는 [tofukyung-plugins](https://github.com/treylom/tofukyung-plugins)가 정본입니다. > +> 지식관리와 vault 검색은 **knowledge-manager** 플러그인이 제공합니다 — `claude plugin marketplace add treylom/tofukyung-plugins` + `claude plugin install km@tofukyung-plugins` 로 설치한 뒤 `/km:search` 와 `/km:knowledge-manager` 를 사용하세요. ThisCode 1.4.0 부터는 이 스킬들의 자체 사본을 포함하지 않습니다. +> > 🌐 **English version**: [README.md](README.md) · 📘 **Setup**: [docs/SETUP.md](docs/SETUP.md) (개발자) · 🌱 [docs/SETUP-BEGINNER.md](docs/SETUP-BEGINNER.md) (초보자) · 🧩 [docs/AGENTS.md](docs/AGENTS.md) (Custom Hybrid v1.0) · ⚙️ **[설정 가이드](docs/SETUP-CONFIG-GUIDE.md)** (CLAUDE.md · soul.md · rules · Skills 2.0) · 🆕 **[최근 변경](docs/RECENT-CHANGES.md)** (설치 시 읽기 — AI가 자동 반영할 최신 변경 요약) · 📖 **[시작 안내서 (한국어 PDF)](docs/getting-started/ThisCode-ThisCodex-getting-started.pdf)** (초보자, 14p) · 📄 **[전체 정리 한 장 (HTML)](docs/SUMMARY.html)** · 🤝 **[ThisCodex](https://github.com/treylom/ThisCodex)** (Codex 동반 런타임) ## AI에게 설치 맡기기 @@ -22,7 +24,7 @@ https://github.com/treylom/ThisCode 에 있는 설치 파일을 따라 단계별 ![ThisCode + ThisCodex 상세 배선 (tmux · app-server · 디스코드 · 볼트)](assets/architecture.png) -WSL / Linux / macOS 어디서든 `bash install.sh` 한 줄로 Claude Code + tmux 환경을 세팅합니다. **핵심 가치**: *구조화된 옵시디언 볼트* 안에서 *각 작업 디렉토리에 적합한 봇*을 두고, *디스코드*로 쓰며, *봇끼리 협업*하게 하는 것. 4-Tier 볼트 검색(GraphRAG → vault-search MCP → Obsidian CLI → ripgrep) + LLM 모델 라우팅은 그 봇들을 쓸모 있게 만드는 보조 기능이지 핵심이 아닙니다. +WSL / Linux / macOS 어디서든 `bash install.sh` 한 줄로 Claude Code + tmux 환경을 세팅합니다. **핵심 가치**: *구조화된 옵시디언 볼트* 안에서 *각 작업 디렉토리에 적합한 봇*을 두고, *디스코드*로 쓰며, *봇끼리 협업*하게 하는 것. 지식관리·볼트 검색은 km 플러그인이 맡고, ThisCode의 LLM 모델 라우팅과 봇 운영 기능은 그 봇들을 쓸모 있게 만드는 보조 기능입니다. > **시작 전 권고:** (1) 옵시디언 **폴더 구조**부터 잡으세요; (2) 메모리·내부검색을 제대로 쓰려면 **옵시디언 설치** 권장. **옵시디언 없이?** 단순 연결용 디스코드 봇만 띄울 수도 있지만, 그 경우 볼트 메모리·내부 검색 품질은 **보장되지 않습니다**. @@ -92,8 +94,7 @@ Claude Code 는 플러그인의 **`commands/` 와 `skills/` 를 둘 다** 슬래 - `/thiscode:init` — 경험자용 경량 셋업 - `/thiscode:add-bot` — 추가 Discord 봇 1개 신설 (soul.md 템플릿 + token + 페어링) - `/thiscode:slack-configure` — Discord 대신(또는 추가로) Slack에 봇 연결 (claude-channel-server 브리지 자동 셋업) -- `/thiscode:km` — 지능형 variant 라우팅 knowledge manager (lite/at/plain) -- `/thiscode:search` — 4-tier vault 검색 (quick/deep 모드) +- `/thiscode:km` — knowledge-manager 플러그인 안내 (`/km:knowledge-manager`) - `/thiscode:open-meeting` — 다봇 협업용 회의실 구조 생성 - `/thiscode:codex-check` — Codex CLI 브리지 연결 확인 - `/thiscode:install-hooks` — SessionStart / UserPromptSubmit / PreToolUse / Stop 훅의 등록 상태를 검사합니다 (**플러그인을 설치하면 훅은 이미 등록됩니다** — 동봉된 `hooks/hooks.json` 을 Claude Code 가 직접 싣습니다). 훅은 **봇 세션에서만**(`DISCORD_STATE_DIR` 이 있을 때) 동작하고, 일반 세션에서는 아무 출력도 동작 변화도 없습니다. 플러그인 설치본에서는 등록을 검사하고 옛 `~/.claude/settings.json` 병합 잔존을 정리하며(안 지우면 같은 훅이 두 번 발화), `hooks/hooks.json` 이 없는 체크아웃에서는 예전처럼 병합합니다. `/thiscode:create-bot` 이 같은 `scripts/install-hooks.sh` 를 대신 실행합니다. @@ -101,13 +102,13 @@ Claude Code 는 플러그인의 **`commands/` 와 `skills/` 를 둘 다** 슬래 ### 스킬 -각 스킬 (bootstrap, knowledge-manager, search, meetings 등)의 SKILL.md 에는 **"How to Use This Skill"** 절이 있어 언제 호출하는지, 무엇을 하는지 설명합니다. vault 관련 스킬은 검색에, knowledge-manager 스킬은 콘텐츠 수집과 재정리에 초점을 맞추며 각 variant (lite/at/plain/full) 마다 기능 세트가 다릅니다. +각 스킬 (bootstrap, init, meetings, shared-memory 등)의 SKILL.md 에는 **"How to Use This Skill"** 절이 있어 언제 호출하는지, 무엇을 하는지 설명합니다. 지식관리·vault 검색 스킬은 이제 여기 포함되지 않습니다 — knowledge-manager 플러그인을 설치해 `/km:knowledge-manager` · `/km:search` 를 쓰십시오. --- ## 선택: Discord 봇 + Agent Teams -본 플러그인의 Discord 봇 및 Agent Teams 통합은 선택사항입니다. vault-first 검색만으로도 완전히 작동하며, Discord 페어링 및 tmux 세션은 advanced use case 용입니다. +본 플러그인의 Discord 봇 및 Agent Teams 통합은 선택사항입니다. km 플러그인의 볼트 검색은 독립적으로 작동하며, Discord 페어링 및 tmux 세션은 고급 다중 봇 운영에만 필요합니다. > **Slack을 쓰고 싶다면?** Discord 대신(또는 추가로) Slack으로도 봇을 페어링할 수 있습니다 — `/thiscode:slack-configure` 실행 시 CLI 로그인·앱 설치 승인·토큰 입력 같은 사람 관문만 안내받고 나머지는 자동으로 처리됩니다. 상세: [skills/slack-configure/SKILL.md](skills/slack-configure/SKILL.md). 운영·트러블슈팅 참조: [skills/slack-bridge/SKILL.md](skills/slack-bridge/SKILL.md). @@ -125,9 +126,9 @@ Claude Code 는 플러그인의 **`commands/` 와 `skills/` 를 둘 다** 슬래 --- -## 📊 4-Tier Search Benchmark +## 📊 검색 백엔드 벤치마크 -thiscode 의 4-Tier search 가 일반 `obsidian-cli` / `/search` / `/vault-search` 대비 어떤 trade-off 를 보이는지 5-axis 로 측정합니다. **본인 vault 에서 직접 측정** 하면 본인 환경의 실제 trade-off 가 보입니다. +이 저장소에는 GraphRAG·vault-search MCP·Obsidian CLI·ripgrep의 성능 특성을 비교하는 개발자용 벤치마크 러너가 남아 있습니다. 사용자용 지식관리·볼트 검색 명령은 km 플러그인이 제공하므로 실제 사용은 `/km:search` 안내를 따르십시오. **본인 vault에서 직접 측정**하면 환경별 차이를 확인할 수 있습니다. ```bash # 본인 vault 로 측정 (Tier 1 GraphRAG 사용 시 server 별도 띄움 필요) @@ -204,8 +205,7 @@ Claude Code 는 플러그인의 **`commands/*.md` 와 `skills//SKILL.md` - `/thiscode:create-bot` — 신규 봇 디렉토리 + soul.md template 셋업 - `/thiscode:add-bot` — 추가 Discord 봇 1개를 기존 셋업에 신설 - `/thiscode:create-slack-bot` — Slack 워크스페이스 연결 (claude-channel-server 브리지 자동 셋업, 별칭: `/thiscode:slack-configure`) -- `/thiscode:km` — knowledge-manager 진입점 (variant 자동 라우팅 — lite / at / plain) -- `/thiscode:search` — vault 통합 검색 4-Tier (GraphRAG → Obsidian → MCP → grep) +- `/thiscode:km` — knowledge-manager 플러그인 안내 (`/km:knowledge-manager` · `/km:search`) - `/thiscode:open-meeting` — 회의실 폴더 신설 (다 봇 협업 4-file) - `/thiscode:codex-check` — Codex CLI 설치 + OAuth 인증 + 모델 picker 검증 - … 그 밖에 다수 (`/` → `thiscode:` 필터로 현재 세션의 전량 확인) @@ -299,13 +299,6 @@ thiscode/ │ # skills 도 /thiscode: 으로 직접 호출된다 │ # install-hooks · create-bot · create-slack-bot · │ # self-update · help 가 여기 산다 -│ ├── knowledge-manager/ # vault 풀 7-Layer Fusion -│ ├── knowledge-manager-at/ # Agent Teams 변종 -│ ├── knowledge-manager-lite/ # Lite 단일 에이전트 -│ ├── knowledge-manager-bootstrap/ # 4-Tier install 합본 -│ ├── knowledge-manager-plain/ # headless variant -│ ├── search/ # 4-Tier vault search -│ ├── search-lite/ # 3-Tier (GraphRAG 의존 없음) │ ├── codex-exec-bridge/ # vault skill mirror (폴더) │ ├── init/ # onboarding wizard skill │ ├── bootstrap/ # plugin 설치 wizard @@ -452,7 +445,6 @@ bash scripts/install-graphrag.sh --apply # venv 생성 + pip install + nohup - `meetings` — 4-file 회의 프로토콜 + 출처 기반 크로스체크 + Discord REST API 스레드 - `slack-bridge` — Slack 브리지 운영·트러블슈팅 (발신자 게이트, 봇간 통신 허용목록, 라이브 회의 캔버스 레시피) - `codex-exec-bridge` — Codex CLI 서브프로세스 + `/tofu-at-codex` 참조 -- `knowledge-manager-at` — km-at Mode R 사전점검 (읽기 전용 진단 + dry-run 적용) ### Codex CLI 브리지 diff --git a/README.md b/README.md index 2140e75..6564147 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ > **Role boundary**: ThisCode is the bot-harness operations bundle (operating rules, GraphRAG ops vendor, deployment contracts). The general-purpose knowledge product is [knowledge-manager](https://github.com/treylom/knowledge-manager); plugin installs go through [tofukyung-plugins](https://github.com/treylom/tofukyung-plugins). +> Knowledge management and vault search are provided by the **knowledge-manager** plugin — install it with `claude plugin marketplace add treylom/tofukyung-plugins` + `claude plugin install km@tofukyung-plugins`, then use `/km:search` and `/km:knowledge-manager`. ThisCode 1.4.0 no longer bundles its own copies of these skills. + > Claude Code + Discord bot + Codex CLI bridge plugin — personal vault automation + multi-agent ops. > > 🇰🇷 **한국어 버전**: [README.ko.md](README.ko.md) · 📘 **Setup**: [docs/SETUP.md](docs/SETUP.md) (developer) · 🌱 [docs/SETUP-BEGINNER.md](docs/SETUP-BEGINNER.md) (beginner) · 🧩 [docs/AGENTS.md](docs/AGENTS.md) (Custom Hybrid v1.0) · ⚙️ **[Config Guide](docs/SETUP-CONFIG-GUIDE.md)** (CLAUDE.md · soul.md · rules · Skills 2.0) · 🆕 **[Recent changes](docs/RECENT-CHANGES.md)** (read on install — newest-first digest the install AI should auto-reflect) · 📖 **[Getting started guide (English PDF)](docs/getting-started/ThisCode-ThisCodex-getting-started.en.pdf)** (beginner, 14p) · 📄 **[전체 정리 한 장 (HTML)](docs/SUMMARY.html)** · 🤝 **[ThisCodex](https://github.com/treylom/ThisCodex)** (Codex companion) @@ -22,7 +24,7 @@ Follow the install files in https://github.com/treylom/ThisCode step by step. St ![ThisCode + ThisCodex detailed wiring (tmux · app-server · Discord · vault)](assets/architecture.png) -`bash install.sh` boots a Claude Code + tmux environment (WSL / Linux / macOS). **Core value**: a *structured Obsidian vault* where each working directory gets an *appropriate bot*, all usable from *Discord*, with bots that can *talk to each other*. The 4-Tier vault search (GraphRAG → vault-search MCP → Obsidian CLI → ripgrep) + LLM model routing are the capabilities that make those bots useful — supporting, not the point. +`bash install.sh` boots a Claude Code + tmux environment (WSL / Linux / macOS). **Core value**: a *structured Obsidian vault* where each working directory gets an *appropriate bot*, all usable from *Discord*, with bots that can *talk to each other*. The km plugin owns vault retrieval; thiscode's LLM model routing and bot operations make those bots useful — supporting, not the point. > **Before you start (recommended):** (1) lay out your Obsidian **folder structure** first; (2) **install Obsidian** for full memory + internal-search. **No Obsidian?** You can still wire a plain Discord bot for connectivity only — but vault memory and internal-search quality are **not guaranteed** without it. @@ -117,8 +119,7 @@ Claude Code exposes **both** `commands/*.md` and `skills//SKILL.md` as sla - `/thiscode:init` — Alternative lightweight setup for experienced users - `/thiscode:create-bot` — Create a new Discord bot with soul.md template - `/thiscode:create-slack-bot` — Connect a bot to Slack instead of (or in addition to) Discord (automates the claude-channel-server bridge; alias: `/thiscode:slack-configure`) -- `/thiscode:km` — Knowledge manager with intelligent variant routing (lite/at/plain) -- `/thiscode:search` — 4-tier vault search with quick or deep modes +- `/thiscode:km` — Pointer to the knowledge-manager plugin (`/km:knowledge-manager`) - `/thiscode:open-meeting` — Create meeting room structure for multi-bot collaboration - `/thiscode:codex-check` — Validate Codex CLI bridge connectivity - `/thiscode:install-hooks` — Check the SessionStart / UserPromptSubmit / PreToolUse / Stop hooks (**installing the plugin registers them** via the bundled `hooks/hooks.json`). Every hook runs **only in bot sessions** — when `DISCORD_STATE_DIR` is set; other sessions see no output and no behavior change. On a plugin install this command verifies the registration and clears leftovers from the older `~/.claude/settings.json` merge (which would otherwise fire the same hook twice); on a checkout without `hooks/hooks.json` it still performs that merge. `/thiscode:create-bot` runs the same `scripts/install-hooks.sh` for you. @@ -126,13 +127,13 @@ Claude Code exposes **both** `commands/*.md` and `skills//SKILL.md` as sla ### Skills -Each skill (bootstrap, knowledge-manager, search, meetings, etc.) includes a **"How to Use This Skill"** section in its SKILL.md. These explain when to invoke each skill and what it does. Search skills are focused on vault operations; knowledge-manager skills handle content ingestion and reorganization with different feature sets (lite/at/plain/full). +Each skill (bootstrap, init, meetings, shared-memory, etc.) includes a **"How to Use This Skill"** section in its SKILL.md. These explain when to invoke each skill and what it does. Knowledge management and vault search skills are no longer bundled here — install the knowledge-manager plugin and use `/km:knowledge-manager` and `/km:search`. --- ## Optional: Discord bot + Agent Teams -Discord bot integration and tmux-based Agent Teams are **opt-in extras**. The 4-Tier vault search works standalone — Discord pairing is for advanced multi-bot orchestration. +Discord bot integration and tmux-based Agent Teams are **opt-in extras**. The km plugin's vault retrieval works independently — Discord pairing is for advanced multi-bot orchestration. > **Prefer Slack?** You can pair a bot over Slack instead of (or in addition to) Discord — run `/thiscode:create-slack-bot` (alias: `/thiscode:slack-configure`); it walks you through the human gates (CLI login, workspace install approval, token paste) and automates the rest. Details: [skills/slack-configure/SKILL.md](skills/slack-configure/SKILL.md). Ops & troubleshooting reference: [skills/slack-bridge/SKILL.md](skills/slack-bridge/SKILL.md). @@ -301,13 +302,6 @@ thiscode/ ├── commands/ # Slash discovery surface ① (incl. /thiscode:init) ├── skills/ # Slash discovery surface ② — skills are callable as │ # /thiscode: too (vault-mirror policy) -│ ├── knowledge-manager/ # full vault 7-Layer Fusion -│ ├── knowledge-manager-at/ # Agent Teams variant -│ ├── knowledge-manager-lite/ # Lite single-agent -│ ├── knowledge-manager-bootstrap/ # 4-Tier install bundle -│ ├── knowledge-manager-plain/ # headless variant -│ ├── search/ # 4-Tier vault search -│ ├── search-lite/ # 3-Tier (no GraphRAG) │ ├── codex-exec-bridge/ # vault skill mirror (folder) │ ├── init/ # onboarding wizard skill │ ├── bootstrap/ # plugin install wizard @@ -440,7 +434,6 @@ The `--apply` mode: - `meetings` — 4-file meeting protocol + source-backed cross-check + Discord REST API threads - `slack-bridge` — Slack bridge operations & troubleshooting (sender gates, bot-interop allowlist, live meeting canvas recipes) - `codex-exec-bridge` — Codex CLI subprocess + `/tofu-at-codex` reference -- `knowledge-manager-at` — km-at Mode R preflight (read-only diagnostics + dry-run apply) ### Codex CLI bridge diff --git a/agents.yaml b/agents.yaml index 722abd8..3d4caa4 100644 --- a/agents.yaml +++ b/agents.yaml @@ -1,6 +1,6 @@ index_version: 1 -generated_at: '2026-05-15' -count: 17 +generated_at: '2026-09-04' +count: 6 agents: - name: bootstrap version: 1.0.0 @@ -9,28 +9,6 @@ agents: Plugin first-run bootstrap — verifies tools, registers vault_root, prints status table. Triggered on /thiscode:setup or first session_start. file: .agents/bootstrap.yaml - - name: cmd-thiscode-km-bootstrap - version: 1.0.0 - tier: external - description: Slash command /thiscode:km-bootstrap — one-shot installer wrapper for the 4-Tier search stack. - file: .agents/cmd-thiscode-km-bootstrap.yaml - - name: cmd-thiscode-km - version: 1.0.0 - tier: external - description: Slash command /thiscode:km — dispatches to km-lite (default) / km-at / km-plain based on flags. Wizard if no args. - file: .agents/cmd-thiscode-km.yaml - - name: cmd-search - version: 1.0.0 - tier: external - description: Slash command /thiscode:search — 4-Tier search dispatcher (forwards to search skill). - file: .agents/cmd-search.yaml - - name: cmd-thiscode-setup - version: 1.0.0 - tier: external - description: >- - Slash command /thiscode:setup — interactive bootstrap wizard (Tier 1-4 install choices), invokes - bootstrap skill. - file: .agents/cmd-thiscode-setup.yaml - name: codex-exec-bridge version: 1.0.0 tier: experimental @@ -45,39 +23,6 @@ agents: 8 Phase progressive install wizard — env detect + vault note count + tools/resources 기반 Phase 추천 (current/recommended/later). 사용자 v2.1 spec. file: .agents/init.yaml - - name: knowledge-manager-at - version: 1.0.0 - tier: experimental - description: >- - Knowledge Manager Agent Teams variant — Mode R (Reorganization) workflow with category lead + worker split via - parallel-agent orchestration pattern. Advanced KM for team vaults. - file: .agents/knowledge-manager-at.yaml - - name: knowledge-manager-bootstrap - version: 1.0.0 - tier: external - description: >- - One-shot environment installer for the 4-Tier search stack — installs Obsidian CLI (optional), vault-search MCP, - GraphRAG server (optional), records vault_root. - file: .agents/knowledge-manager-bootstrap.yaml - - name: knowledge-manager-lite - version: 1.0.0 - tier: external - description: >- - Knowledge Manager lite — Phase 1 (ingestion) + Phase 2 (extract/classify) for individual vault. Default KM variant - per docs/01-mode-i.md. - file: .agents/knowledge-manager-lite.yaml - - name: knowledge-manager-plain - version: 1.0.0 - tier: internal - description: Knowledge Manager headless variant — no AskUserQuestion prompts, suitable for CI/cron unattended ingestion. - file: .agents/knowledge-manager-plain.yaml - - name: knowledge-manager - version: 2.2.0 - tier: external - description: >- - Knowledge Manager — vault 7-Layer Fusion + Orchestrator Pipeline + agent-office/km-tools 풀 본문 (vault - `.claude/commands/knowledge-manager.md` mirror). Mode I/R/G 모두 지원, 단일 에이전트 순차 처리. v2.2 옵션 C pure Mirror. - file: .agents/knowledge-manager.yaml - name: meetings version: 1.0.0 tier: external @@ -90,20 +35,6 @@ agents: tier: external description: 검색 결과 후 응답 생성 시 task complexity 따라 LLM 모델 선택 (haiku/sonnet/opus 또는 codex). dispatcher 가 query 분석 → 자동 routing. file: .agents/model-router.yaml - - name: search-lite - version: 2.2.0 - tier: external - description: >- - Search Lite — Obsidian CLI / MCP / Grep 3-Tier Cascade (GraphRAG 의존 없음). vault `.claude/commands/search-lite.md` - mirror. v2.2 옵션 C pure Mirror. - file: .agents/search-lite.yaml - - name: search - version: 1.0.0 - tier: external - description: >- - 4-Tier vault search dispatcher — Tier 1 GraphRAG (FastAPI semantic + graph) → Tier 2 vault-search MCP (embedding) - → Tier 3 Obsidian CLI (index) → Tier 4 ripgrep (literal). 정확도 우선 fallback. v2.0 정정 — 사용자 spec. - file: .agents/search.yaml - name: shared-memory version: 1.0.0 tier: internal diff --git a/bin/thiscode.mjs b/bin/thiscode.mjs index b4d16df..dc1a6ab 100644 --- a/bin/thiscode.mjs +++ b/bin/thiscode.mjs @@ -5,7 +5,7 @@ import { msg } from '../scripts/lib/i18n.mjs'; import { loadState, saveState, mergeAnswer, resumeSummary } from '../scripts/lib/state.mjs'; import { SCRIPT, nextQuestion, isInScope } from '../scripts/lib/questions.mjs'; import { injectMarkerBlock, backupFile } from '../scripts/lib/apply.mjs'; -import { applyCodexSync } from '../scripts/lib/codexsync.mjs'; +import { applyCodexSync, planCodexSync } from '../scripts/lib/codexsync.mjs'; import { loadManifest } from '../scripts/lib/manifest.mjs'; import { runManifest } from '../scripts/lib/manifest-runner.mjs'; import { join } from 'node:path'; @@ -101,6 +101,12 @@ if (!interactive) { } if (mode === 'check') { + const codexPlan = planCodexSync(join(repoRoot, 'skills'), join(homedir(), '.agents', 'skills')); + if (codexPlan.length === 0) { + console.log('Codex skill sync: nothing to export in 1.4.0 (knowledge skills moved to the km plugin)'); + } else { + console.log(`Codex skill sync: ${codexPlan.map(({ skill }) => skill).join(', ')}`); + } console.log(msg('check_only_notice', register)); process.exit(0); } @@ -115,7 +121,11 @@ saveState(repoRoot, state); if (['codex','both'].includes(state.answers.harness) && state.answers.codex_skill_layer !== 'repo') { const dest = join(homedir(), '.agents', 'skills'); const synced = applyCodexSync(join(repoRoot, 'skills'), dest); - console.log(`🔁 Codex skill sync → ${dest} (${synced.join(', ')})`); + if (synced.length === 0) { + console.log('Codex skill sync: nothing to export in 1.4.0 (knowledge skills moved to the km plugin)'); + } else { + console.log(`🔁 Codex skill sync → ${dest} (${synced.join(', ')})`); + } } console.log('✅ apply 완료. state: .thiscode-init-state.json'); process.exit(0); diff --git a/commands/init.md b/commands/init.md index a332e2b..5e62d3a 100644 --- a/commands/init.md +++ b/commands/init.md @@ -1,5 +1,5 @@ --- -description: thiscode 환경 감지 + 8 Phase progressive install wizard (사용자 v2.1 spec) +description: thiscode 환경 감지 + 8 Phase 로컬 도구 안내 (사용자 v2.1 spec) allowedTools: Bash, AskUserQuestion, Read --- @@ -11,30 +11,32 @@ $ARGUMENTS ## Purpose -vault 상태 / OS / 도구 / 자원 감지 → 8 Phase progressive journey 추천 (현재 가능 / 권장 / 나중). 사용자 y/n 선택 후 install dispatch. +vault 상태 / OS / 도구 / 자원 감지 → 8 Phase progressive journey 추천 (현재 가능 / 권장 / 나중). 사용자 y/n 선택 후 에이전트가 선택한 ThisCode 스크립트를 실행한다. ## 8 Phase 진행 (Phase 0~7, 사용자 v2.1 spec) | Phase | trigger | install | |---|---|---| | 0 | vault 미설치 | Obsidian app (link 안내) | -| 1 | vault 시작 | ripgrep (default Tier 4) | -| 2 | Zettelkasten 시도 | obsidian-cli (Tier 3) | -| 3 | 100+ 노트 의미 검색 갈증 | vault-search MCP (Tier 2) | -| 4 | 500+ 권유 / 1000+ strong / 옵션 언제나 | GraphRAG (Tier 1) | -| 5 | 2000+ 노트 혼란 | km-at Mode R preflight (read-only) | +| 1 | vault 시작 | ThisCode `scripts/install-ripgrep.sh` (ripgrep, Tier 4) | +| 2 | Zettelkasten 시도 | ThisCode `scripts/install-obsidian-cli.sh` (Obsidian CLI, Tier 3) | +| 3 | 100+ 노트 의미 검색 갈증 | ThisCode `scripts/install-vault-search.sh` (vault-search MCP, Tier 2) | +| 4 | 500+ 권유 / 1000+ strong / 옵션 언제나 | ThisCode `scripts/install-graphrag.sh` (GraphRAG, Tier 1) | +| 5 | 2000+ 노트 혼란 | km 플러그인 `/km:knowledge-manager-at` 의 Mode R preflight (Claude Code 전용 — Codex는 km 플러그인 문서를 따름) | | 6 | 3000+ + GraphRAG installed | Dashboard 시각화 (선택, 외부 link) | | 7 | advanced | 하이브리드 4채널 (선택, Journey-12/13) | ## Flow 1. `bash $CLAUDE_DISCODE_HOME/scripts/claude-discode-init.sh` 실행 — env detect + Phase 추천 + interactive prompt -2. 사용자가 y 선택한 Phase 마다 해당 install script dispatch: +2. 감지 스크립트 자체는 검색 Tier를 설치하지 않는다. 사용자가 y를 선택한 Phase마다 에이전트가 해당 ThisCode 로컬 스크립트를 실행한다: + - phase-1-ripgrep → `scripts/install-ripgrep.sh --apply` - phase-2-cli-install → `scripts/install-obsidian-cli.sh` - phase-3-mcp → `scripts/install-vault-search.sh --apply` - phase-4-graphrag / strong → `scripts/install-graphrag.sh --apply` - - phase-5-mode-r-preflight → km-at Skill 의 Mode R preflight (read-only 진단) -3. 완료 후 healthcheck 실행 +3. `/km:search`는 검색 fallback을 실행하고 `/km:setup`은 km 저장 위치·MCP·설정을 구성한다. `/km:setup`은 검색 Tier 설치 명령이 아니다. +4. phase-5-mode-r-preflight → km 플러그인 `/km:knowledge-manager-at` 의 Mode R preflight (Claude Code 전용 — Codex는 km 플러그인 문서를 따름; read-only 진단 — km 미설치면 README 의 km 설치 포인터 안내) +5. 완료 후 healthcheck 실행 ## Fallback diff --git a/commands/km-bootstrap.md b/commands/km-bootstrap.md index c66d070..1f369ab 100644 --- a/commands/km-bootstrap.md +++ b/commands/km-bootstrap.md @@ -1,15 +1,25 @@ --- -description: thiscode 검색 환경 초기 설치 (Obsidian CLI / vault-search MCP / GraphRAG 서버) -allowedTools: Bash, AskUserQuestion, Write, Read +description: 검색 환경 안내 — ThisCode 로컬 도구와 km 플러그인 설정 +allowedTools: Read --- # /thiscode:km-bootstrap -> **⚡ 실행 지시**: 이 문서는 슬래시 커맨드 본문이다 — 로드된 것 자체가 사용자의 실행 요청이다. 문서 요약·소개 출력이나 "실행할까요?" 확인 질문으로 멈추지 말고 **아래 단계를 지금 즉시 실행**한다. (본문이 명시하는 인터뷰·AskUserQuestion 단계는 그 지점에서 그대로 수행 — 그 외 추가 확인 ❌) +> **⚡ 실행 지시**: 이 문서는 슬래시 커맨드 본문이다 — 로드된 것 자체가 사용자의 실행 요청이다. 아래 안내를 지금 즉시 사용자에게 출력한다. -Invokes the `knowledge-manager-bootstrap` skill — detects environment, prompts for vault_root + install matrix, runs install-*.sh scripts. +검색 환경은 두 부분으로 나뉜다. 로컬 검색 도구는 ThisCode의 `scripts/install-*.sh`가 제공하고, 검색 fallback과 km 설정은 각각 km 플러그인의 `/km:search`와 `/km:setup`이 담당한다. `/km:setup`은 검색 Tier 설치 명령이 아니다. -Use this command when: -- 처음 설치 -- `/thiscode:search` 가 4-Tier 전부 실패 메시지 출력 -- 머신 옮긴 후 환경 재구성 +## km 플러그인 설치 + +``` +claude plugin marketplace add treylom/tofukyung-plugins +claude plugin install km@tofukyung-plugins +``` + +## 로컬 검색 도구 + +필요한 Tier에 따라 ThisCode의 `scripts/install-ripgrep.sh`, `install-obsidian-cli.sh`, `install-vault-search.sh`, `install-graphrag.sh`를 사용한다. 자세한 실행 방법은 `docs/SETUP.md` §3을 따른다. + +처음 설치할 때, 검색이 모든 단계에서 실패할 때, 머신을 옮긴 뒤 환경을 다시 잡을 때 이 안내를 쓴다. 이 명령 자체는 도구나 설정을 설치하지 않는다. + +설치된 km 플러그인의 설정 생성과 재설정은 `/km:setup`을 직접 실행한다. diff --git a/commands/km.md b/commands/km.md index 40714c3..f186420 100644 --- a/commands/km.md +++ b/commands/km.md @@ -1,29 +1,22 @@ --- -description: thiscode knowledge-manager 진입점 — variant 자동 라우팅 (lite/at/plain) -allowedTools: Read, Write, Bash, AskUserQuestion, WebFetch, Glob, Grep +description: km 플러그인 안내 — 지식관리·vault 검색은 km 플러그인으로 이동했다 +allowedTools: Read --- # /thiscode:km -> **⚡ 실행 지시**: 이 문서는 슬래시 커맨드 본문이다 — 로드된 것 자체가 사용자의 실행 요청이다. 문서 요약·소개 출력이나 "실행할까요?" 확인 질문으로 멈추지 말고 **아래 단계를 지금 즉시 실행**한다. (본문이 명시하는 인터뷰·AskUserQuestion 단계는 그 지점에서 그대로 수행 — 그 외 추가 확인 ❌) +> **⚡ 실행 지시**: 이 문서는 슬래시 커맨드 본문이다 — 로드된 것 자체가 사용자의 실행 요청이다. 아래 안내를 지금 즉시 사용자에게 출력한다. -$ARGUMENTS +ThisCode 1.4.0 부터 지식관리와 vault 검색은 **km 플러그인**이 제공한다. ThisCode 는 이 스킬들의 자체 사본을 더 이상 포함하지 않는다. -## Variant routing - -1. Parse `$ARGUMENTS` for `--variant lite|at|plain` flag. -2. If absent: - - $CLAUDE_DISCODE_HEADLESS=1 → variant = plain - - "아카이브 정리" / "카테고리 재편" / "그래프 구축" keywords → variant = at - - else → variant = lite (Phase 1·2 default) -3. Invoke the matching skill via `Skill` tool: - - `knowledge-manager-lite` / `knowledge-manager-at` / `knowledge-manager-plain` -4. If skill emits "config missing" → invoke the `knowledge-manager-bootstrap` skill. - -## Examples +## 설치 ``` -/thiscode:km https://example.com/article -/thiscode:km --variant at "아카이브 정리: 020-Library/Research" -/thiscode:km --variant plain "이 텍스트 저장: ..." +claude plugin marketplace add treylom/tofukyung-plugins +claude plugin install km@tofukyung-plugins ``` + +## 설치 후 + +- vault 검색 = `/km:search` +- 지식관리·수집·분류·저장 = `/km:knowledge-manager` (km 플러그인의 기본 명령) diff --git a/commands/search.md b/commands/search.md deleted file mode 100644 index 4d4cd87..0000000 --- a/commands/search.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -description: thiscode vault 통합 검색 — 4-Tier (GraphRAG → Obsidian → MCP → grep) -allowedTools: Bash, Read, Glob, Grep, mcp__vault-search__* ---- - -# /thiscode:search - -> **⚡ 실행 지시**: 이 문서는 슬래시 커맨드 본문이다 — 로드된 것 자체가 사용자의 실행 요청이다. 문서 요약·소개 출력이나 "실행할까요?" 확인 질문으로 멈추지 말고 **아래 단계를 지금 즉시 실행**한다. (본문이 명시하는 인터뷰·AskUserQuestion 단계는 그 지점에서 그대로 수행 — 그 외 추가 확인 ❌) - -$ARGUMENTS - -Invokes the `search` skill which runs Tier 1→4 per `contracts/search-fallback-4tier.md`. - -## Flags -- `--quick` / `-q` → 3-5줄 즉답 -- `--deep` / `-d` → 상세 분석 -- `--no-moc` → MOC 우선 라우팅 제외 - -## Examples - -``` -/thiscode:search MCP란? -/thiscode:search --deep "GraphRAG vs Obsidian search 차이" -/thiscode:search --no-moc "specific note title" -``` diff --git a/docs/04-obsidian-cli.md b/docs/04-obsidian-cli.md index 6d6ed74..22978cd 100644 --- a/docs/04-obsidian-cli.md +++ b/docs/04-obsidian-cli.md @@ -76,7 +76,7 @@ VAULT="/mnt/c/Users//Documents/Obsidian/" # 예: ``` -⚠️ **경로 정규화 주의**: Claude Code 슬래시 (`/search`, `/knowledge-manager`) 가 vault root 기준 **상대 경로** 만 받음. 다음 패턴 금지: +⚠️ **경로 정규화 주의**: Claude Code 슬래시 (`/km:search` 등) 가 vault root 기준 **상대 경로** 만 받음. 다음 패턴 금지: ``` ❌ Second_Brain/Library/Zettelkasten/note.md # 중첩! diff --git a/docs/06-claude-code-server.md b/docs/06-claude-code-server.md index e51e217..5969616 100644 --- a/docs/06-claude-code-server.md +++ b/docs/06-claude-code-server.md @@ -69,7 +69,7 @@ MCP Discord 서버는 본 환경변수로 봇 계정 (토큰 + access.json) 분 ## MCP server integration -`.mcp.json` 으로 MCP server 등록 시 claude 가 host. Custom MCP server (예: vault-search, knowledge-manager) 를 봇이 활용: +`.mcp.json` 으로 MCP server 등록 시 claude 가 host. Custom MCP server (예: vault-search) 를 봇이 활용: ```json { diff --git a/docs/08-chapter-mapping.md b/docs/08-chapter-mapping.md index 5710c2a..5fa65d5 100644 --- a/docs/08-chapter-mapping.md +++ b/docs/08-chapter-mapping.md @@ -24,7 +24,7 @@ status: draft (v0.2.0) - 영상 길이: 6-8 min. ### C3. 막혔을 때 사용자 묻지 말고 스킬 시도 -- 학습: `/knowledge-manager` / `/autoresearch` / `/search` 로 끝까지 시도 후 보고. A/B/C/D 4지선택 안티패턴. +- 학습: `/km:search` / `/autoresearch` 로 끝까지 시도 후 보고. A/B/C/D 4지선택 안티패턴. - 영상 길이: 7 min. ### C4. 응답 echo drift 차단 @@ -53,8 +53,8 @@ status: draft (v0.2.0) - contract: `contracts/search-fallback-4tier.md` v0.1.0. - 영상 길이: 12-15 min. -### C9. KM Mode I/R/G + variant lite/at/plain -- 학습: variant matrix per `contracts/km-variant-matrix.md`. lite (Phase 1·2 default) / at (Agent Teams) / plain (headless). +### C9. KM plugin commands and boundary +- 학습: 지식관리와 vault 검색은 km 플러그인이 담당한다. `/km:search` · `/km:knowledge-manager` · `/km:setup` 문서를 따른다. - 영상 길이: 10 min. ### C10. 4-Tier search drift 감지 (km-version.sh) diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 7a4e05b..30157ac 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -11,8 +11,8 @@ YAML 은 의미 단위로 5 block 으로 나뉩니다. `name`, `description`, `version`, `license`, `homepage` — Claude / Cursor / Aider 모두 인식 가능한 portable metadata. ```yaml -name: search -description: 4-Tier vault search ... +name: bootstrap +description: Plugin first-run bootstrap — verifies tools, registers vault_root, prints status table ... version: 1.0.0 license: MIT homepage: https://github.com/treylom/ThisCode @@ -23,9 +23,9 @@ homepage: https://github.com/treylom/ThisCode 플러그인이 호스트에 어떤 tool/hook/command 를 등록할지 명시. ```yaml -provides_tools: [claude_discode_search] +provides_tools: [claude_discode_bootstrap] provides_hooks: [on_session_start] -provides_commands: [/thiscode:search] +provides_commands: [/thiscode:setup] ``` ### Block C — thiscode extension (classroom policy) @@ -104,6 +104,8 @@ benchmark: ## Tier 순서 +로컬 검색 도구용 스크립트는 ThisCode의 `scripts/install-*.sh`에 있고, 아래 fallback 순서는 km 플러그인의 `/km:search`가 실행합니다. `/km:setup`은 km 설정 위저드이며 검색 도구를 설치하지 않습니다. + | Tier | Method | 이유 | |---|---|---| | 1 | GraphRAG | LLM + graph, recall 0.80-0.95 | diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 6fbb2b5..bc84813 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -2,9 +2,9 @@ thiscode 의 구조 + 흐름을 mermaid 차트로 시각화. GitHub 에서 자동 render — 별도 도구 불필요. -## 1. 4-Tier Search Fallback +## 1. KM plugin search fallback (external) -검색 dispatcher 가 빠른 도구부터 시도 + 결과 부족 시 더 정확한 도구로 fallback. +아래 검색 fallback은 km 플러그인이 소유하고 실행합니다. ThisCode는 봇 하네스와 각 Tier의 로컬 도구 설치기를 제공하지만 이 검색 흐름을 실행하지 않습니다. ```mermaid flowchart TD @@ -32,30 +32,24 @@ flowchart TD class T4 tier4 ``` -각 Tier 는 독립 설치 가능 — Tier 4 만 깔아도 즉시 작동. 사용자가 점진적으로 Tier 3 → 2 → 1 추가. +각 Tier의 로컬 도구는 ThisCode의 `scripts/install-*.sh`로 설치합니다. `/km:search`는 검색 fallback을 실행하고 `/km:setup`은 km 저장 위치·MCP·설정을 구성하며, 검색 Tier를 설치하지 않습니다. --- -## 2. KM 3 variants — 언제 어떤 걸 쓰나 +## 2. KM plugin commands — 외부 플러그인 ```mermaid flowchart LR - User([사용자]) -->|`/thiscode:km`| Disp{KM dispatcher} - - Disp -->|default
개인 vault| Lite[KM lite
Phase 1 + 2
tier: external] - Disp -->|`--at`
팀 vault 100+ files| AT[KM at
Agent Teams
category lead + worker
tier: experimental] - Disp -->|`--plain`
CI/cron| Plain[KM plain
headless
no AskUserQuestion
tier: internal] - - Lite --> Out1([vault index 갱신]) - AT --> Out2([대량 ingestion + 재정리]) - Plain --> Out3([log + exit code]) - - classDef lite fill:#e3f2fd,stroke:#1976d2 - classDef at fill:#fff8e1,stroke:#f57c00 - classDef plain fill:#f5f5f5,stroke:#616161 - class Lite lite - class AT at - class Plain plain + User([사용자]) -->|`/km:search`| Search[검색 fallback] + User -->|`/km:knowledge-manager`| Knowledge[지식관리 workflow] + User -->|`/km:setup`| Setup[플러그인 설정 생성] + + Search --> Out1([검색 결과]) + Knowledge --> Out2([수집·분류·저장]) + Setup --> Out3([설정 완료]) + + classDef command fill:#e3f2fd,stroke:#1976d2 + class Search,Knowledge,Setup command ``` --- @@ -156,12 +150,16 @@ flowchart LR end subgraph Plugin[thiscode plugin] - Search[/thiscode:search
4-Tier dispatcher/] - KM[/thiscode:km
lite/at/plain/] Meet[/thiscode:meetings
회의실/] Setup[/thiscode:setup
bootstrap/] end + subgraph KMPlugin[km plugin — external] + Search[/km:search
vault fallback/] + Knowledge[/km:knowledge-manager
지식관리/] + KMSetup[/km:setup
configuration/] + end + subgraph Backend[검색 backend] T1[Tier 1
GraphRAG] T2[Tier 2
vault-search MCP] @@ -176,7 +174,8 @@ flowchart LR end CC --> Search - CC --> KM + CC --> Knowledge + CC --> KMSetup CC --> Meet CC --> Setup @@ -197,10 +196,12 @@ flowchart LR classDef user fill:#e3f2fd,stroke:#1976d2 classDef plugin fill:#fff8e1,stroke:#f57c00 + classDef external fill:#ede7f6,stroke:#6a1b9a classDef backend fill:#e8f5e9,stroke:#388e3c classDef ci fill:#fce4ec,stroke:#c2185b class CC,Vault user - class Search,KM,Meet,Setup plugin + class Meet,Setup plugin + class Search,Knowledge,KMSetup external class T1,T2,T3,T4 backend class VA,BM,BT1,README ci ``` diff --git a/docs/GLOSSARY.md b/docs/GLOSSARY.md index 63a43ab..3fa7542 100644 --- a/docs/GLOSSARY.md +++ b/docs/GLOSSARY.md @@ -115,7 +115,7 @@ Claude Code 의 task 단위 정의 (`.claude/skills//SKILL.md`). Claude Code 에 등록되는 skill + command + hook 묶음. ### slash command -`/thiscode:search` 같은 명령. Claude Code 안에서 입력. +`/thiscode:init` 같은 명령. Claude Code 안에서 입력. ### YAML "YAML Ain't Markup Language" — 사람이 읽기 쉬운 설정 파일 형식. diff --git a/docs/HERMES-STATUS.md b/docs/HERMES-STATUS.md index 1f2fb18..ffb549e 100644 --- a/docs/HERMES-STATUS.md +++ b/docs/HERMES-STATUS.md @@ -1,61 +1,59 @@ -# Hermes plugin — status: partial / deferred +# Hermes plugin — status: runtime subset / deferred > Decision: maintainer, 2026-05-16, option ② (redesign to current structure + > document deferred — do **not** reconstruct the missing dispatchers). ## TL;DR -The `hermes-plugin/` registers thiscode tools into a Hermes Agent host. Its -**programmatic search/ingest path is deferred**. Use the Claude Code path -(`/search`, `/thiscode:km`, or the skills via an LLM agent) for real work. +The `hermes-plugin/` metadata advertises the broader ThisCode Claude Code +surface, while `hermes-plugin/__init__.py` deliberately registers only the +session-start drift-check hook at runtime. Knowledge management and vault +search belong to the km plugin. ## What works (active) | Piece | State | |---|---| -| Plugin registration (`__init__.py`) | ✅ tools/commands/hook register cleanly | +| Runtime registration (`__init__.py`) | ✅ session-start drift-check hook registers cleanly | | `session_start_drift_check` | ✅ real — shells out to `scripts/km-version.sh` (exists) | -| `plugin.yaml` metadata / agent-spec aggregation | ✅ | +| `plugin.yaml` metadata / agent-spec aggregation | ✅ manifest remains the source for the Claude Code surface | ## What is deferred (and why) -| Piece | State | Why | +| Manifest-only surface | State | Why | |---|---|---| -| `handle_search` / `cmd_search` (`claude_discode_search`) | ⏸️ deferred | needs `skills/search/references/tier-implementations.md.sh` | -| `handle_ingest` / `cmd_km` (`claude_discode_ingest`) | ⏸️ deferred | needs `skills/knowledge-manager-lite/references/extract-and-classify.md.sh` | - -**Root cause (verified 2026-05-16, independent cross-validation):** thiscode skills -are **LLM-instruction documents** (`SKILL.md` + `references/*.md`), not -executable shell dispatchers. The literate-bash `*.md.sh` dispatchers the -Hermes handlers shell out to were never vendored to the public repo (they -existed only in a private workspace). A programmatic plugin cannot -byte-identically "run" an LLM-instruction skill, so reconstructing the -dispatchers from a guess was explicitly rejected (reconstruction risk). +| `claude_discode_bootstrap` | ⏸️ deferred | declared for the Claude Code/plugin surface; no Hermes runtime handler in 1.4.0 | +| `claude_discode_meetings` | ⏸️ deferred | declared for the Claude Code/plugin surface; no Hermes runtime handler in 1.4.0 | +| `claude_discode_codex_invoke` | ⏸️ deferred | declared for the Claude Code/plugin surface; no Hermes runtime handler in 1.4.0 | +| `claude_discode_shared_memory` | ⏸️ deferred | declared for the Claude Code/plugin surface; no Hermes runtime handler in 1.4.0 | +| `claude_discode_route_model` | ⏸️ deferred | declared for the Claude Code/plugin surface; no Hermes runtime handler in 1.4.0 | +| `/thiscode:setup` | ⏸️ deferred | declared for the Claude Code/plugin surface; no Hermes runtime command in 1.4.0 | +| `on_stop` | ⏸️ deferred | declared for the Claude Code/plugin surface; no Hermes runtime hook in 1.4.0 | + +**Root cause (verified 2026-05-16, independent cross-validation):** ThisCode's +portable skills are **LLM-instruction documents** (`SKILL.md` + `references/*.md`) +and the manifest describes Claude Code surfaces. Hermes does not receive +programmatic implementations for those manifest-only surfaces in 1.4.0, so +the runtime stays limited to the drift-check hook instead of pretending that +metadata entries are live registrations. ## Current behavior (honest, non-failing) -- `handle_search` / `handle_ingest`: if the dispatcher file is absent they - return a structured **`{"status":"deferred", ...}`** JSON pointing here and - at the Claude Code path. They never raise (Hermes contract) and never fake a - result. -- The four shell tests that exercised the dispatchers - (`tests/test-search-tier4-fallback.sh`, `tests/test-integration-cascade.sh`, - `tests/dogfood/scenario-1-grep-only.sh`, `tests/test-km-lite-plain-write.sh`) - now **SKIP with a reason + exit 0** when the dispatcher is absent (same - `SKIP:` convention `scenario-1` already used for a missing sample-vault) — - so CI is honest, not red, and not falsely green. +- `register(ctx)` registers only `on_session_start`; no removed KM/search + runtime tools or commands are exposed by Hermes. +- The manifest-only surfaces above remain visible for host metadata and are + explicitly deferred rather than represented as live Hermes registrations. ## Supported path instead Use thiscode through **Claude Code** (or any LLM agent that reads `SKILL.md`): -- Search: `/search ""` (4-Tier fallback) — `skills/search/SKILL.md` -- KM ingest: `/thiscode:km` / `/knowledge-manager-lite` — `skills/knowledge-manager-lite/SKILL.md` +- Install the km plugin (`claude plugin marketplace add treylom/tofukyung-plugins` + + `claude plugin install km@tofukyung-plugins`) and use its search and + knowledge commands — `/km:search` for the documented fallback. ## How to un-defer (future) -To make the Hermes programmatic path real, add executable dispatchers at the -two paths above that implement the 4-Tier search / km-lite extract contracts -(`contracts/search-fallback-4tier.md`, `contracts/km-*.md`). Once present, the -handlers' `*.exists()` guard automatically resumes the normal `_run(...)` path -and the four tests stop skipping — no further code change required. +To expose a manifest-only surface in Hermes, implement and register a handler +for that surface, add its schema where needed, and update the runtime-manifest +test plus this deferred table in the same change. diff --git a/docs/MANUAL.en.typ b/docs/MANUAL.en.typ index 8a2f75b..2437611 100644 --- a/docs/MANUAL.en.typ +++ b/docs/MANUAL.en.typ @@ -38,32 +38,44 @@ = What is thiscode? -A Knowledge Manager plugin that bundles Claude Code + Discord bots + Codex calls + a 4-Tier vault search. +A bot-harness operations plugin that bundles Claude Code + Discord bots + Codex calls. Knowledge management and vault search are provided by the km plugin. == The one-line differentiator -It cascades the existing tools (`obsidian-cli` alone / `/search` alone / `/vault-search` alone) through a 4-Tier fallback. Fast tools first → if results are insufficient, escalate to more accurate tools. +ThisCode focuses on bot operations, installation, meetings, shared memory, and model routing; the km plugin owns knowledge management and vault-search fallback. -= Install — 5 steps += Install — ThisCode + the km plugin ```bash # 1. Prerequisites (node 18+, jq, git) -# 2. Plugin install +# 2. ThisCode bot-harness install git clone https://github.com/treylom/ThisCode ~/.claude/plugins/thiscode -# 3. Tier 2 MCP (5 min, recommended) -bash ~/.claude/plugins/thiscode/scripts/install-vault-search.sh --apply +# 3. Install the km plugin +claude plugin marketplace add treylom/tofukyung-plugins +claude plugin install km@tofukyung-plugins + +# 4. In Claude Code, configure KM storage, MCP integrations, and settings: /km:setup +# (This command does not install the search tiers.) + +# 5. Tier 4 ripgrep (local tool) +bash ~/.claude/plugins/thiscode/scripts/install-ripgrep.sh --apply -# 4. Tier 3 Obsidian CLI (optional, Obsidian users only) +# 6. Tier 3 Obsidian CLI detection and Obsidian app guidance (optional) bash ~/.claude/plugins/thiscode/scripts/install-obsidian-cli.sh -# 5. Tier 1 GraphRAG (optional, advanced — 25 min) +# 7. Tier 2 vault-search MCP (recommended) +bash ~/.claude/plugins/thiscode/scripts/install-vault-search.sh --apply + +# 8. Tier 1 GraphRAG (optional; advanced) bash ~/.claude/plugins/thiscode/scripts/install-graphrag.sh --apply -# 6. Healthcheck +# 9. ThisCode bot-harness healthcheck bash ~/.claude/plugins/thiscode/scripts/healthcheck.sh ``` +ThisCode provides the local search-tool scripts. Run `/km:setup` separately in Claude Code to configure KM storage, MCP integrations, and settings; use `/km:search` to run the fallback. + For a branching, beginner-friendly guide: SETUP-BEGINNER.md = 4-Tier Search @@ -80,15 +92,15 @@ For a branching, beginner-friendly guide: SETUP-BEGINNER.md [4], [ripgrep (literal)], [30-100ms], [Low], [0 min], ) -The dispatcher tries Tier 1 → falls back to Tier 2 if results are insufficient → and so on. +The km plugin's dispatcher tries Tier 1 → falls back to Tier 2 if results are insufficient → and so on. -= Knowledge Manager (KM) += Knowledge Manager (KM plugin) -Three variants: +Knowledge management and search are not bundled in ThisCode. Install the km plugin and use: -- `/thiscode:km` (lite, default) — personal vault -- `/thiscode:km at` (experimental) — team vault + Agent Teams -- `/thiscode:km plain` (internal) — CI / cron, headless +- `/km:search` — vault search and fallback +- `/km:knowledge-manager` — knowledge capture, classification, and storage +- `/km:setup` — create and update km plugin configuration #pagebreak() diff --git a/docs/MANUAL.typ b/docs/MANUAL.typ index bf137d5..5ded4ef 100644 --- a/docs/MANUAL.typ +++ b/docs/MANUAL.typ @@ -38,32 +38,44 @@ = thiscode 가 뭐예요? -Claude Code + Discord 봇 + Codex 호출 + 4-Tier vault search 가 통합된 Knowledge Manager 플러그인. +Claude Code + Discord 봇 + Codex 호출을 묶은 bot-harness operations 플러그인. 지식관리와 vault 검색은 km 플러그인이 담당합니다. == 차별점 한 줄 -기존 도구 (obsidian-cli 단독 / `/search` 단독 / `/vault-search` 단독) 를 4-Tier fallback 으로 자동 cascading. 빠른 도구 먼저 → 결과 부족 시 정확한 도구로. +ThisCode는 봇 운영·설치·모델 라우팅에 집중하고, 지식관리와 vault 검색은 km 플러그인의 명령으로 연결합니다. -= 설치 — 5단계 += 설치 — ThisCode + km 플러그인 ```bash # 1. Prereq (node 18+, jq, git) -# 2. Plugin install +# 2. ThisCode bot-harness install git clone https://github.com/treylom/ThisCode ~/.claude/plugins/thiscode -# 3. Tier 2 MCP (5분, 권장) -bash ~/.claude/plugins/thiscode/scripts/install-vault-search.sh --apply +# 3. km plugin install +claude plugin marketplace add treylom/tofukyung-plugins +claude plugin install km@tofukyung-plugins + +# 4. Claude Code에서 km 저장 위치·MCP·설정 구성: /km:setup +# (검색 Tier 설치 명령이 아님) + +# 5. Tier 4 ripgrep (로컬 도구) +bash ~/.claude/plugins/thiscode/scripts/install-ripgrep.sh --apply -# 4. Tier 3 Obsidian CLI (선택, Obsidian 사용자만) +# 6. Tier 3 Obsidian CLI 감지·Obsidian 앱 안내 (선택) bash ~/.claude/plugins/thiscode/scripts/install-obsidian-cli.sh -# 5. Tier 1 GraphRAG (선택, advanced 25분) +# 7. Tier 2 vault-search MCP (권장) +bash ~/.claude/plugins/thiscode/scripts/install-vault-search.sh --apply + +# 8. Tier 1 GraphRAG (선택, advanced) bash ~/.claude/plugins/thiscode/scripts/install-graphrag.sh --apply -# 6. Healthcheck +# 9. ThisCode bot-harness healthcheck bash ~/.claude/plugins/thiscode/scripts/healthcheck.sh ``` +로컬 검색 도구용 스크립트는 ThisCode가 제공합니다. Claude Code에서 `/km:setup`을 별도로 실행해 km 저장 위치·MCP·설정을 구성하고, 검색 fallback은 `/km:search`로 실행합니다. + 자세한 분기 가이드: SETUP-BEGINNER.md = 4-Tier Search @@ -80,15 +92,15 @@ bash ~/.claude/plugins/thiscode/scripts/healthcheck.sh [4], [ripgrep (literal)], [30-100ms], [낮음], [0분], ) -dispatcher 가 Tier 1 시도 → 결과 부족 시 Tier 2 → ... 순서 fallback. +km 플러그인의 dispatcher가 Tier 1 시도 → 결과 부족 시 Tier 2 → ... 순서 fallback. -= Knowledge Manager (KM) += Knowledge Manager (KM plugin) -3 variant: +지식관리·검색은 ThisCode에 내장되지 않습니다. km 플러그인을 설치한 뒤 다음 명령을 사용합니다. -- `/thiscode:km` (lite, default) — 개인 vault -- `/thiscode:km at` (experimental) — 팀 vault + Agent Teams -- `/thiscode:km plain` (internal) — CI/cron headless +- `/km:search` — vault 검색과 fallback +- `/km:knowledge-manager` — 지식관리·수집·분류·저장 +- `/km:setup` — km 플러그인 설정 생성·재설정 #pagebreak() diff --git a/docs/RECENT-CHANGES.md b/docs/RECENT-CHANGES.md index 114507e..6bb6af8 100644 --- a/docs/RECENT-CHANGES.md +++ b/docs/RECENT-CHANGES.md @@ -26,6 +26,31 @@ auto-activate. The `/thiscode setup` skill drives this step. --- +## 2026-09-05 — ThisCode 1.4.0 KM boundary + +### Removed (no replacement) + +- The `knowledge-manager-lite` and `knowledge-manager-plain` variants. +- The seven KM-family `.agents/*.yaml` registrations: `knowledge-manager`, + `knowledge-manager-at`, `knowledge-manager-bootstrap`, `knowledge-manager-lite`, + `knowledge-manager-plain`, `search`, and `search-lite`. +- Hermes search/ingest runtime registrations, including the former search and + ingest tools and commands. +- The empty Codex export surface: there is no longer an export list in ThisCode + 1.4.0. + +### Moved to the km plugin + +- `knowledge-manager`, `knowledge-manager-at`, and `search`. +- The lite flow is absorbed by the km plugin's search fallback. +- KM configuration creation is `/km:setup`. + +ThisCode retains its bot-harness operations. The underlying installer scripts +remain for compatibility, while the supported KM and search setup path is the +km plugin's `/km:setup`. + +--- + ## 2026-06-10 — Fresh-install audit fixes (vendored vault-search MCP + portability) - **vault-search MCP is now vendored** at `vendor/vault-search-mcp/` and diff --git a/docs/SETUP-BEGINNER.en.typ b/docs/SETUP-BEGINNER.en.typ index c020b1b..ffac1fe 100644 --- a/docs/SETUP-BEGINNER.en.typ +++ b/docs/SETUP-BEGINNER.en.typ @@ -320,14 +320,15 @@ bash ~/.claude/plugins/thiscode/scripts/healthcheck.sh Inside Claude Code: ``` -/thiscode:search "hello first search" +/thiscode:help ``` -Or test with the sample-vault: +For vault search, install the km plugin first: ``` -/thiscode:search "NuriFlow ARR" \ - --vault ~/.claude/plugins/thiscode/sample-vault +claude plugin marketplace add treylom/tofukyung-plugins +claude plugin install km@tofukyung-plugins +/km:search "hello first search" ``` Congratulations! 🎉 diff --git a/docs/SETUP-BEGINNER.md b/docs/SETUP-BEGINNER.md index c3ed9ea..f817186 100644 --- a/docs/SETUP-BEGINNER.md +++ b/docs/SETUP-BEGINNER.md @@ -233,13 +233,15 @@ cat ~/.thiscode-setup.log Claude Code 안에서: ``` -/thiscode:search "안녕 첫 검색" +/thiscode:help ``` -또는 sample-vault 에서 테스트: +vault 검색을 써 보려면 km 플러그인을 먼저 설치합니다: ``` -/thiscode:search "NuriFlow ARR" --vault ~/.claude/plugins/thiscode/sample-vault +claude plugin marketplace add treylom/tofukyung-plugins +claude plugin install km@tofukyung-plugins +/km:search "안녕 첫 검색" ``` 축하합니다! 🎉 diff --git a/docs/SETUP-BEGINNER.typ b/docs/SETUP-BEGINNER.typ index 27c90f5..5cb157d 100644 --- a/docs/SETUP-BEGINNER.typ +++ b/docs/SETUP-BEGINNER.typ @@ -320,14 +320,15 @@ bash ~/.claude/plugins/thiscode/scripts/healthcheck.sh Claude Code 안에서: ``` -/thiscode:search "안녕 첫 검색" +/thiscode:help ``` -또는 sample-vault 에서 테스트: +vault 검색을 써 보려면 km 플러그인을 먼저 설치합니다: ``` -/thiscode:search "NuriFlow ARR" \ - --vault ~/.claude/plugins/thiscode/sample-vault +claude plugin marketplace add treylom/tofukyung-plugins +claude plugin install km@tofukyung-plugins +/km:search "안녕 첫 검색" ``` 축하합니다! 🎉 diff --git a/docs/SETUP-CONFIG-GUIDE.md b/docs/SETUP-CONFIG-GUIDE.md index 058de66..368d816 100644 --- a/docs/SETUP-CONFIG-GUIDE.md +++ b/docs/SETUP-CONFIG-GUIDE.md @@ -279,20 +279,20 @@ Plain intro: [memory-dreaming.md](memory-dreaming.md). ## §4 — How to set up & how to ask (first run) -![4-Tier vault search with Obsidian-less degradation — GraphRAG → vault-search MCP → Obsidian CLI → ripgrep fallback](../assets/search-fallback-4tier.png) +![km plugin vault-search fallback with Obsidian-less degradation — GraphRAG → vault-search MCP → Obsidian CLI → ripgrep](../assets/search-fallback-4tier.png) After install + the three files above: ``` /thiscode:setup # (re)configure tiers -/thiscode:search "..." # 4-Tier vault search +/km:search "..." # vault search fallback (km plugin) ``` Example prompts and what to expect: | You ask | The bot does | |---|---| -| "Summarize my notes on attention mechanisms" | vault search (Tier 1→4 fallback) → grounded summary with source paths | +| "Summarize my notes on attention mechanisms" | km plugin vault search (Tier 1→4 fallback) → grounded summary with source paths | | "Set yourself up as a scheduling bot" | reads `templates/soul-schedule-bot.md`, helps you fill `soul.md` | | "Why did you do X?" | answers from the loaded soul + the rule that applied (it tells you which) | @@ -325,18 +325,17 @@ cd ~/projects/research && claude # repeat with discord-writing + its WD `docs/05-meeting-thread-protocol.md`. Bots address each other **only** via Discord mentions — never by typing into each other's terminals. -### §4.6 — Which knowledge-manager variant? +### §4.6 — Knowledge management and vault search -| Variant | Best for | Needs | -|---|---|---| -| `knowledge-manager-lite` | first install, single bot | none (keyword presets, no popups) | -| `knowledge-manager` (full) | interactive single-bot use | AskUserQuestion UI | -| `knowledge-manager-plain` | headless / Codex bots / cron | none (never asks) | -| `knowledge-manager-at` | 2+ bots coordinating (Agent Teams) | Agent Teams support | -| `knowledge-manager-bootstrap` | one-time env setup / "Tier X 실패" repair | run once | +These are not bundled with ThisCode 1.4.0 — install the km plugin: + +``` +claude plugin marketplace add treylom/tofukyung-plugins +claude plugin install km@tofukyung-plugins +``` -New user: start with `-lite` (or `-plain` for unattended bots); move to `-at` -only when multiple bots need to split one ingestion job. +Then use `/km:search` for vault search; the plugin documents its own +ingestion entry points and variants. ## §5 — Skills 2.0 conformance checklist @@ -504,7 +503,7 @@ harness 가 실제 노출하는 모델 id 로. 충돌 우선순위 = **사용자 명시 지시 > rule 파일 > inline 기본**. ### §4 설정·질문 방법 -설치 후 `/thiscode:setup`, `/thiscode:search "질의"`. 예: "내 attention 노트 +설치 후 `/thiscode:setup`, 그리고 km 플러그인의 `/km:search "질의"`. 예: "내 attention 노트 요약" → 4-Tier 검색 후 출처 경로 포함 요약. 응답이 페르소나/규칙을 벗어나면 soul.md frontmatter 유효성 + INDEX 트리거 매칭을 점검. diff --git a/docs/SETUP.md b/docs/SETUP.md index c3d388e..9752168 100644 --- a/docs/SETUP.md +++ b/docs/SETUP.md @@ -44,67 +44,39 @@ advanced (1-line installer): `curl -fsSL https://raw.githubusercontent.com/treyl troubleshooting: `~/.claude/plugins/` 디렉토리 없으면 `mkdir -p ~/.claude/plugins` 먼저 -## 2.5 Codex에서 KM 쓰기 (Codex 봇 사용자만, 3분) +## 2.5 Codex 에서 지식관리 쓰기 (Codex 봇 사용자만) -§2 의 plugin install 은 **Claude Code** 에 ThisCode skills(`knowledge-manager` -계열 등)를 노출합니다. **Codex CLI 봇은 그 경로를 읽지 않습니다** — Codex 의 -개인 skill 스캔 경로는 `~/.agents/skills/` 입니다(Claude Code `~/.claude/skills/` -↔ Codex `~/.agents/skills/` 1:1, [ThisCodex/docs/skill-portability.md](https://github.com/treylom/ThisCodex/blob/master/docs/skill-portability.md) §1·§2). +ThisCode 1.4.0 부터 지식관리·vault 검색 스킬은 이 레포에 들어 있지 않습니다 — km 플러그인이 +제공합니다(`claude plugin marketplace add treylom/tofukyung-plugins` + +`claude plugin install km@tofukyung-plugins`). Codex 쪽 사용법은 그 플러그인 문서를 따릅니다. -ThisCode 가 skill 의 **단일 기준 출처(SoT)** 입니다. Codex 에서 쓰려면 그 -SoT 를 `~/.agents/skills/` 로 단방향 sync 합니다(복사본은 편집 ❌): +1.4.0 부터 ThisCode 의 Codex 스킬 내보내기 목록은 비어 있습니다. 과거 목록은 KM 계열뿐이었고, +그 기능은 km 플러그인이 Codex 를 직접 지원하므로 ThisCode 에서 내보낼 항목이 없습니다. +`--check` 와 `--apply` 는 이 상태를 "nothing to export"로 알립니다. ```bash -node bin/thiscode.mjs --check # 미리보기(무변경) — Codex 호환성 포함 -node bin/thiscode.mjs --apply # ~/.agents/skills/ 로 sync (harness=codex/both 선택 시) +node bin/thiscode.mjs --check # 미리보기(무변경, nothing to export) +node bin/thiscode.mjs --apply # 내보낼 항목 없음 (harness=codex/both 선택 시에도 동일) ``` -검증: 새 Codex 세션 또는 `codex exec` 의 active skill 목록에 KM 이 뜨는지 -확인. `knowledge-manager-lite` / `-plain` 부터 smoke. +## 3. km 플러그인 설정과 선택 검색 도구 -### Codex 호환성 매트릭스 (정직 고지 — 노출 ≠ full 동작) +`/km:setup`은 km 저장 위치·Playwright/Obsidian MCP·`km-config.json`·vault 경로와 구조 문서를 구성합니다. 검색 Tier 설치 명령은 아닙니다. -KM 일부는 Claude Code 전용 도구에 의존하므로 Codex 에서는 노출돼도 저하/미지원입니다: - -| Skill | Codex | 사유 | -|---|---|---| -| `knowledge-manager-plain` | ✅ **지원** | `AskUserQuestion` 無, 외부 MCP 의존 최소 | -| `knowledge-manager-lite` | ✅ **지원** | `AskUserQuestion` 無 (`mcp__obsidian` 미노출 시 plain write fallback) | -| `knowledge-manager` (full) | ⚠️ **degraded** | `AskUserQuestion` + `mcp__obsidian/notion/playwright/*` 의존 → 대화형 설정·Obsidian MCP 없으면 저하 | -| `knowledge-manager-bootstrap` | ⚠️ **degraded** | `AskUserQuestion` 으로 vault_root·install matrix 확정 → Codex 미노출 시 env/기본값 필요 | -| `knowledge-manager-at` | ❌ **미지원** | Agent Teams(`TeamCreate`·`SendMessage`·`Task*`) = Claude Code 전용, Codex 미노출 | - -→ Codex 봇은 **`-lite`/`-plain` 우선** 사용. `full`·`-at` 가 필요한 작업은 -Claude Code 봇(ThisCode plugin)으로 라우팅하세요. - -## 3. Tier 2 — vault-search MCP (5분, 권장) - -```bash -bash ~/.claude/plugins/thiscode/scripts/install-vault-search.sh --apply -claude mcp list | grep vault-search # 검증: vault-search 항목 출력 +```text +/km:setup ``` -Claude Code 재시작 필요. troubleshooting: `npm install` 실패 시 `nvm use 18` - -## 4. Tier 3 — obsidian-cli (3분, Obsidian 사용자만) +로컬 검색 도구가 필요하면 ThisCode의 아래 스크립트 중 필요한 Tier만 선택해 실행합니다. ```bash +bash ~/.claude/plugins/thiscode/scripts/install-ripgrep.sh --apply bash ~/.claude/plugins/thiscode/scripts/install-obsidian-cli.sh -which obsidian-cli # 검증: path 출력 -``` - -Obsidian 미사용 시 skip. - -## 5. Tier 1 — GraphRAG (20-30분, advanced) - -Python 3.10+, Docker (선택) 필요. - -```bash +bash ~/.claude/plugins/thiscode/scripts/install-vault-search.sh --apply bash ~/.claude/plugins/thiscode/scripts/install-graphrag.sh --apply -curl localhost:8400/health # 검증: {"status":"ok"} ``` -첫 indexing 시간 ~15분 (vault 크기 의존). troubleshooting: port 8400 충돌 시 `GRAPHRAG_PORT=8401 bash scripts/...` +검색 fallback 실행은 km 플러그인의 `/km:search`, km 플러그인 설정 생성·재설정은 `/km:setup`이 담당합니다. ## 검증 (전체) @@ -130,9 +102,11 @@ Exit code: `0` = all required OK / `1` = required FAIL / `2` = intentional SKIP ## 사용 ``` -/thiscode:search "your query" # 4-Tier fallback 자동 -/thiscode:km # KM wizard -/thiscode:setup # 재설정 (Tier 추가/제거) +/thiscode:km # km 플러그인 설치 안내 (검색·지식관리) +/thiscode:init # ThisCode 환경 감지·설정 인터뷰 +/thiscode:setup # ThisCode 봇 하네스 재설정 +/km:setup # km 저장 위치·MCP·설정 구성 +/km:search "your query" # km 플러그인 설치 후 검색 fallback 자동 ``` ## 벤치마크 (선택) diff --git a/gemini-extension.json b/gemini-extension.json index b43a2f9..6361ddb 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,7 +1,7 @@ { "name": "thiscode", "version": "0.2.0", - "description": "KM ingestion + 4-Tier vault search packaged for Gemini CLI / OpenCode / multi-harness use.", + "description": "Bot-harness operations packaged for Gemini CLI / OpenCode / multi-harness use; knowledge management is provided by the km plugin.", "contextFileName": "GEMINI.md", "skillsDir": "skills", "commandsDir": "commands", diff --git a/hermes-plugin/__init__.py b/hermes-plugin/__init__.py index 802f440..386151d 100644 --- a/hermes-plugin/__init__.py +++ b/hermes-plugin/__init__.py @@ -1,26 +1,13 @@ """thiscode — Hermes plugin entry point. -Wires the thiscode 4-Tier search + KM ingestion tools into Hermes Agent. -Bridges to the bash-based dispatcher in ../skills/search/references/ -and the km-lite variant in ../skills/knowledge-manager-lite/references/ via subprocess. +The 1.4.0 runtime surface is deliberately limited to the session-start drift +check. The manifest continues to describe the broader Claude Code plugin +surface; Hermes-only registrations not implemented here are documented as +deferred in docs/HERMES-STATUS.md. """ -from . import schemas, tools +from . import tools def register(ctx): - ctx.register_tool( - name="claude_discode_search", - toolset="research", - schema=schemas.SEARCH_SCHEMA, - handler=tools.handle_search, - ) - ctx.register_tool( - name="claude_discode_ingest", - toolset="knowledge", - schema=schemas.INGEST_SCHEMA, - handler=tools.handle_ingest, - ) ctx.register_hook("on_session_start", tools.session_start_drift_check) - ctx.register_command("/search", tools.cmd_search) - ctx.register_command("/thiscode-km", tools.cmd_km) diff --git a/hermes-plugin/plugin.yaml b/hermes-plugin/plugin.yaml index 93e34ec..9b9ffa5 100644 --- a/hermes-plugin/plugin.yaml +++ b/hermes-plugin/plugin.yaml @@ -1,14 +1,8 @@ name: thiscode version: 1.0.0 -description: KM ingestion + 4-Tier vault search (GraphRAG → Obsidian CLI → vault-search MCP → ripgrep). Discord-friendly knowledge manager for individual + team vaults. +description: "Discord/Slack bot harness for Claude Code: setup, bots, meetings, shared memory, model router (knowledge management via the km plugin)." # Aggregated from .agents/*.yaml (source of truth — see scripts/generate-agents-index.mjs) provides_tools: - - claude_discode_search - - claude_discode_km_lite - - claude_discode_km_at - - claude_discode_km_plain - - claude_discode_km_bootstrap - - claude_discode_ingest - claude_discode_bootstrap - claude_discode_meetings - claude_discode_codex_invoke @@ -18,9 +12,6 @@ provides_hooks: - on_session_start - on_stop provides_commands: - - /thiscode:km - - /thiscode:km-bootstrap - - /thiscode:search - /thiscode:setup author: treylom homepage: https://github.com/treylom/ThisCode @@ -31,7 +22,7 @@ platforms: - wsl requires_env: [] metadata: - hermes_status: "partial/deferred — programmatic search/ingest deferred; see docs/HERMES-STATUS.md. Active: registration + drift-check hook." + hermes_status: "runtime subset: on_session_start drift-check hook; manifest-only tools/commands are deferred — see docs/HERMES-STATUS.md." contract_version: "0.1.0" contract_path: "contracts/search-fallback-4tier.md" agent_spec_version: "1.0.0" @@ -41,7 +32,3 @@ metadata: - 2: vault-search MCP - 3: Obsidian CLI - 4: ripgrep - km_variants: - - lite - - at - - plain diff --git a/hermes-plugin/schemas.py b/hermes-plugin/schemas.py deleted file mode 100644 index a425990..0000000 --- a/hermes-plugin/schemas.py +++ /dev/null @@ -1,38 +0,0 @@ -"""JSON-schema definitions for thiscode Hermes tools.""" - -SEARCH_SCHEMA = { - "type": "object", - "description": "4-Tier vault search (GraphRAG → Obsidian CLI → MCP → ripgrep).", - "properties": { - "query": {"type": "string", "description": "Search query in natural language."}, - "mode": { - "type": "string", - "enum": ["quick", "deep", "auto"], - "default": "auto", - }, - "no_moc": {"type": "boolean", "default": False, "description": "Skip MOC priority routing."}, - "force_tier": { - "type": "integer", - "minimum": 1, - "maximum": 4, - "description": "Optional: force a specific Tier for debugging.", - }, - }, - "required": ["query"], -} - -INGEST_SCHEMA = { - "type": "object", - "description": "Mode I — ingest a URL / file / inline text into the vault (km-lite variant).", - "properties": { - "content": {"type": "string", "description": "Inline text to ingest (alternative to source)."}, - "source": {"type": "string", "description": "URL or file path."}, - "title": {"type": "string"}, - "variant": { - "type": "string", - "enum": ["lite", "plain"], - "default": "lite", - }, - }, - "anyOf": [{"required": ["content"]}, {"required": ["source"]}], -} diff --git a/hermes-plugin/tools.py b/hermes-plugin/tools.py index 08440c7..871c19c 100644 --- a/hermes-plugin/tools.py +++ b/hermes-plugin/tools.py @@ -1,24 +1,17 @@ -"""Tool handlers for the thiscode Hermes plugin. +"""Runtime helpers for the thiscode Hermes plugin. -Hermes programmatic search/ingest are DEFERRED (see docs/HERMES-STATUS.md): -thiscode skills are LLM-instruction (SKILL.md), not shell dispatchers, and the -literate-bash `.md.sh` dispatchers were never vendored to the public repo. -Handlers therefore return a structured "deferred" JSON pointing at the -supported Claude Code path. session_start_drift_check (km-version.sh) is real -and stays active. Handlers MUST return JSON strings and MUST NOT raise. +The active Hermes runtime helper is the session-start contract drift check. +Knowledge management and vault search are supplied by the km plugin, while +the remaining manifest-only ThisCode surfaces are documented as deferred. """ -import json import os -import shlex import subprocess from pathlib import Path PLUGIN_DIR = Path(__file__).resolve().parent REPO_ROOT = PLUGIN_DIR.parent -SEARCH_DISPATCHER = REPO_ROOT / "skills" / "search" / "references" / "tier-implementations.md.sh" -KM_LITE_CORE = REPO_ROOT / "skills" / "knowledge-manager-lite" / "references" / "extract-and-classify.md.sh" DRIFT_CHECK = REPO_ROOT / "scripts" / "km-version.sh" @@ -42,43 +35,6 @@ def _run(cmd: list[str], env_extra: dict[str, str] | None = None, timeout: int = return {"ok": False, "stdout": "", "stderr": f"missing binary: {exc}", "returncode": -2} -_DEFER = { - "status": "deferred", - "reason": "Hermes programmatic dispatch deferred — thiscode skills are LLM-instruction (SKILL.md), not shell dispatchers; the .md.sh dispatcher was not vendored to the public repo.", - "use_instead": "Claude Code: /search or /thiscode:km (or invoke the skill via an LLM agent).", - "doc": "docs/HERMES-STATUS.md", -} - - -def _deferred(extra: dict) -> str: - return json.dumps({**_DEFER, **extra}) - - -def handle_search(args: dict, **_kwargs) -> str: - query = args.get("query", "").strip() - if not query: - return json.dumps({"error": "empty query"}) - env = {} - if "force_tier" in args: - env["CLAUDE_DISCODE_FORCE_TIER"] = str(args["force_tier"]) - if not SEARCH_DISPATCHER.exists(): - return _deferred({"query": query}) - res = _run(["bash", str(SEARCH_DISPATCHER), query], env_extra=env) - return json.dumps({"query": query, **res}) - - -def handle_ingest(args: dict, **_kwargs) -> str: - cmd: list[str] = ["bash", str(KM_LITE_CORE)] - for key in ("content", "source", "title"): - if args.get(key): - flag = {"content": "--content", "source": "--source-url", "title": "--title"}[key] - cmd.extend([flag, args[key]]) - if not KM_LITE_CORE.exists(): - return _deferred({"variant": args.get("variant", "lite")}) - res = _run(cmd) - return json.dumps({"variant": args.get("variant", "lite"), **res}) - - def session_start_drift_check(*_args, **_kwargs) -> dict: """Emit a drift warning to the session if thiscode contracts diverge from the vault mirror.""" res = _run(["bash", str(DRIFT_CHECK)], timeout=5) @@ -89,27 +45,3 @@ def session_start_drift_check(*_args, **_kwargs) -> dict: ) } return {} - - -def cmd_search(args: list[str] | str, **_kwargs) -> str: - if isinstance(args, list): - query = " ".join(args) - else: - query = str(args) - return handle_search({"query": query}) - - -def cmd_km(args: list[str] | str, **_kwargs) -> str: - if isinstance(args, list): - # primitive parse: --source URL or --content "..." - kv = {} - i = 0 - while i < len(args): - if args[i].startswith("--") and i + 1 < len(args): - kv[args[i][2:]] = args[i + 1] - i += 2 - else: - i += 1 - return handle_ingest({"source": kv.get("source"), "content": kv.get("content"), "title": kv.get("title")}) - # single string fallback — treat as inline content - return handle_ingest({"content": str(args)}) diff --git a/package.json b/package.json index 83d8b16..cdcb19b 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,12 @@ "version": "1.0.0", "private": true, "type": "module", - "description": "KM ingestion + 4-Tier vault search (GraphRAG → Obsidian CLI → vault-search MCP → ripgrep). Multi-harness: Claude Code / Hermes / Gemini / OpenCode.", + "description": "Discord/Slack bot harness for Claude Code: setup, bots, meetings, shared memory, model router (knowledge management via the km plugin).", "keywords": [ "claude-code", "hermes-agent", "gemini-cli", "agentskills", - "knowledge-manager", "vault-search", "graphrag", "obsidian" diff --git a/rules/porting-infra.md b/rules/porting-infra.md index 7defbc8..ac93b2d 100644 --- a/rules/porting-infra.md +++ b/rules/porting-infra.md @@ -45,7 +45,7 @@ adding an MCP server; writing API code. numbering, in-house bot/channel names) easily; one grep line before push, by the pushing agent, replaces them with public vocabulary. The grep list also covers in-house jargon, not only course terms (2026-09-04, - knowledge-manager (km) 1.3.0 retrospective): words whose meaning is fixed only inside the bot + km 1.3.0 retrospective): words whose meaning is fixed only inside the bot team — e.g. "canonical source", "feed back into", "linting", "work order", "orchestrator", "SoT" — leaked through a gate that only checked course terms (7 + 3 + 2 hits in one new skill file). Same leak layer as course terms; on diff --git a/scripts/lib/codexsync.mjs b/scripts/lib/codexsync.mjs index 25d841b..4dd5d0e 100644 --- a/scripts/lib/codexsync.mjs +++ b/scripts/lib/codexsync.mjs @@ -1,32 +1,30 @@ // scripts/lib/codexsync.mjs // Node port of scripts/sync-skills-to-codex.sh (baseline bc37eec). One-way: -// ThisCode/skills/ → //. ThisCode is SoT; copies not edited. +// ThisCode/skills/ → //. ThisCode is SoT; copies not edited. import { cpSync, existsSync, mkdirSync } from 'node:fs'; import { join } from 'node:path'; -export const KM_SKILLS = [ - 'knowledge-manager', 'knowledge-manager-lite', 'knowledge-manager-plain', - 'knowledge-manager-at', 'knowledge-manager-bootstrap', -]; +// 1.4.0: the knowledge/search skill family moved out of this repo, so nothing +// is on the Codex sync list any more. Add skill directory names here to resume +// syncing; keep this array and scripts/sync-skills-to-codex.sh in step. +export const KM_SKILLS = []; -// compat parity with bash compat(): plain/lite=supported, full/bootstrap=degraded, at=unsupported -export function compat(skill) { - if (skill === 'knowledge-manager-plain' || skill === 'knowledge-manager-lite') return 'supported'; - if (skill === 'knowledge-manager-at') return 'unsupported'; - return 'degraded'; +// compat parity with bash compat(): anything not explicitly classified +export function compat(_skill) { + return 'unknown'; } -export function planCodexSync(srcSkillsDir, destDir) { +export function planCodexSync(srcSkillsDir, destDir, skills = KM_SKILLS) { const plan = []; - for (const skill of KM_SKILLS) { + for (const skill of skills) { const from = join(srcSkillsDir, skill); if (existsSync(from)) plan.push({ skill, from, to: join(destDir, skill), compat: compat(skill) }); } return plan; } -export function applyCodexSync(srcSkillsDir, destDir) { - const plan = planCodexSync(srcSkillsDir, destDir); +export function applyCodexSync(srcSkillsDir, destDir, skills = KM_SKILLS) { + const plan = planCodexSync(srcSkillsDir, destDir, skills); if (plan.length === 0) return []; // DA-review fix: no empty ~/.agents/skills dir on zero-plan mkdirSync(destDir, { recursive: true }); const done = []; diff --git a/scripts/sync-skills-to-codex.sh b/scripts/sync-skills-to-codex.sh index 0df7536..f204e8a 100644 --- a/scripts/sync-skills-to-codex.sh +++ b/scripts/sync-skills-to-codex.sh @@ -7,7 +7,7 @@ fi echo "[thiscode] Node not found — legacy bash sync (deprecated)" >&2 set -euo pipefail # sync-skills-to-codex.sh — thiscode -# Expose ThisCode skills (knowledge-manager family etc.) to a Codex CLI agent. +# Expose ThisCode skills to a Codex CLI agent. # # Why: ThisCode is a *Claude Code* plugin (.claude-plugin/) — `/plugin install # thiscode@thiscode-marketplace` exposes its skills/ to Claude Code. Codex does @@ -25,19 +25,15 @@ SRC_SKILLS="$THISCODE_HOME/skills" DEST="${CODEX_SKILLS_DIR:-$HOME/.agents/skills}" LOG="${HOME}/.thiscode-setup.log" -# Skills to sync. KM family first (the documented target); add others as needed. -SKILLS=(knowledge-manager knowledge-manager-lite knowledge-manager-plain knowledge-manager-at knowledge-manager-bootstrap) +# Skills to sync. 1.4.0: the knowledge/search family moved out of this repo, so +# the list is empty; add skill directory names here to resume syncing. Keep in +# step with scripts/lib/codexsync.mjs (KM_SKILLS). +SKILLS=() -# Codex compatibility (allowedTools-derived — see SETUP.md "Codex에서 KM 쓰기"): -# plain/lite = supported (no AskUserQuestion; mcp__obsidian optional→fallback) -# full/bootstrap = degraded (AskUserQuestion-dependent) -# at = unsupported (Agent Teams: TeamCreate/SendMessage = Claude-only) +# Codex compatibility (allowedTools-derived): anything not explicitly classified. compat() { case "$1" in - knowledge-manager-plain|knowledge-manager-lite) echo "supported" ;; - knowledge-manager|knowledge-manager-bootstrap) echo "degraded (AskUserQuestion-dependent)" ;; - knowledge-manager-at) echo "UNSUPPORTED (Agent Teams = Claude Code only)" ;; - *) echo "unknown" ;; + *) echo "unknown" ;; esac } @@ -63,7 +59,7 @@ echo "[sync] dest: $DEST" echo "" fail=0 -for s in "${SKILLS[@]}"; do +for s in ${SKILLS[@]+"${SKILLS[@]}"}; do src="$SRC_SKILLS/$s" if [ ! -f "$src/SKILL.md" ]; then echo " ✗ $s — source missing ($src/SKILL.md)"; fail=1; continue @@ -81,13 +77,9 @@ done echo "" if [ "$MODE" = "--check" ]; then - echo "[sync] dry run only. Re-run with --apply to copy. Codex compatibility:" - echo " supported = knowledge-manager-plain, knowledge-manager-lite" - echo " degraded = knowledge-manager, knowledge-manager-bootstrap (AskUserQuestion)" - echo " UNSUPPORTED = knowledge-manager-at (Agent Teams = Claude Code only)" + echo "[sync] dry run only. Re-run with --apply to copy." else echo "[sync] done. Verify: start a Codex session / 'codex exec' and check the" - echo " active skill list includes the synced skills. Smoke-test" - echo " knowledge-manager-lite / -plain first (the supported ones)." + echo " active skill list includes the synced skills." fi exit $fail diff --git a/skills/help/SKILL.md b/skills/help/SKILL.md index 67c60c1..2cc32ef 100644 --- a/skills/help/SKILL.md +++ b/skills/help/SKILL.md @@ -41,7 +41,7 @@ disable-model-invocation: true | 토큰(출입증)을 어디 넣을지 모름 | `.env` 파일 위치 안내 | 토큰은 **사용자가 직접** 붙여넣는다 — 봇/AI 에게 토큰을 보여주거나 채팅에 붙이지 말 것 | | 봇을 서버에 초대했는데 안 보임 | 초대 링크 권한 확인 | 권한 미체크·다른 서버 초대 → 초대 링크 재생성 | | 봇이 대답을 안 함 | 봇 프로세스 살아있나 + 채널 규칙 | 멘션 필요한 채널에서 멘션 없이 말 걸었거나, 봇 꺼짐 → 재기동 후 1회 왕복 확인 | -| 자료정리(km)·검색이 안 됨 — "config missing" 류 안내 | 에러 문구에 config/설정 언급이 있는지 | km 설정 파일 미생성 → `/thiscode:km-bootstrap` 1회 실행(필요한 설정을 자동 생성) 후 원래 명령 재시도 | +| 자료정리(km)·검색이 안 됨 — "config missing" 류 안내 | 에러 문구에 config/설정 언급이 있는지 | km 설정 파일 미생성 → km 플러그인의 `/km:setup` 실행 후 원래 `/km:*` 명령 재시도 | | **TUI(터미널)를 재시작했더니 봇이 죽음** | 재기동 절차 밟았는지 | 세션 재시작 후엔 봇도 다시 켜야 한다 — 재기동 명령 안내 + 다시 왕복 확인 | | Slack 연결 관문에서 막힘 (로그인/앱 생성/토큰/첫 채널) | 어느 관문인지 특정 | `/thiscode:create-slack-bot` 은 사람 관문이 4+1개뿐 — 관문별 화면 기준 안내, 필요시 STEP 2.5 | | 위에 없는 증상 | 에러 문구 전문 확보 | STEP 2.5 직접 개입 또는 에러 문구 기반 개별 진단 | @@ -88,9 +88,8 @@ disable-model-invocation: true **지식·검색·협업** | 명령 | 언제 | |---|---| -| `/thiscode:km` | 자료를 옵시디언 금고(vault)에 정리해 넣기 | -| `/thiscode:km-bootstrap` | km 이 "설정이 없다(config missing)"고 할 때 1회 — 설정 자동 생성 | -| `/thiscode:search` | 금고 안 내용 검색 | +| `/thiscode:km` | km 플러그인 설치와 `/km:knowledge-manager`·`/km:search` 사용 안내 | +| `/thiscode:km-bootstrap` | ThisCode 로컬 검색 도구 스크립트와 km 플러그인 설치·`/km:setup` 안내(직접 설치하지 않음) | | `/thiscode:prompt` | AI 프롬프트 생성기 | | `/thiscode:open-meeting` | 봇 여럿이 협업할 회의방 만들기 | | `/thiscode:codex-check` | Codex 연동 상태 점검 | diff --git a/skills/knowledge-manager-at/SKILL.md b/skills/knowledge-manager-at/SKILL.md deleted file mode 100644 index 93275a9..0000000 --- a/skills/knowledge-manager-at/SKILL.md +++ /dev/null @@ -1,316 +0,0 @@ ---- -name: knowledge-manager-at -description: Use when the user asks to organize or save knowledge into the vault and Agent Teams is available — full parallel KM (Category Lead + RALPH workers + DA cross-check). -allowedTools: Task, Read, Write, Bash, Glob, Grep, mcp__obsidian__*, mcp__notion__*, mcp__playwright__*, mcp__hyperbrowser__*, WebFetch, AskUserQuestion, TeamCreate, TeamDelete, TaskCreate, TaskUpdate, TaskList, TaskGet, SendMessage ---- - -> **Contracts**: `.claude/reference/contracts/{km-mode-spec, km-variant-matrix}.md` v0.1.0. Mode I/R/G + variant 책임 경계는 본 contracts 와 일치해야 함. - -# Knowledge Manager - Agent Teams 호출 - -> **이 명령어는 풀스케일 Agent Teams(9명)를 자동 구성합니다.** -> 단일 에이전트 버전: `/knowledge-manager` (Agent Teams 미지원 환경용) -> 에이전트 정의: `.claude/agents/knowledge-manager-at.md` 참조 -> 공유 사양: `.claude/agents/knowledge-manager.md` 참조 - ---- - -## 팀 아키텍처 요약 - -``` -Lead (Main) - Opus 1M - +-- vault-intel-lead (Sonnet 1M) — Category Lead - | +-- @graph-navigator (Sonnet 1M, Explore) - | +-- @retrieval-specialist (Sonnet 1M, Explore) - | +-- @link-curator (Haiku, Explore) - +-- content-proc-lead (Sonnet 1M) — Category Lead - | +-- @content-extractor (Sonnet 1M, general-purpose) - | +-- @deep-reader (Sonnet 1M, Explore) - | +-- @content-analyzer (Sonnet 1M, general-purpose) - +-- @devils-advocate (Sonnet 1M) — DA -``` - ---- - -## STEP 0: 환경 확인 (가장 먼저 실행!) - -**환경 확인 후 Agent Office URL을 사용자에게 항상 표시합니다.** - -### 0-0. Agent Office 대시보드 부트스트랩 (간소화 — ensure-server.sh) - -**단일 스크립트로 서버 확인 + 자동 시작을 처리합니다.** - -``` -# === Agent Office 경로 감지 (2단계) === -1. Glob("**/agent-office/ensure-server.sh") → 찾으면 agent_office_path = dirname 결과 -2. Glob("agent-office/server.js") → 찾으면 agent_office_path = "agent-office" -3. 모두 실패 → agent_office_path = null - -# === 대시보드 자동 실행 (한 줄 — CRITICAL) === - -IF agent_office_path != null: - Bash("bash {agent_office_path}/ensure-server.sh $(pwd)") - dashboard_available = (exit code == 0) - - # 브라우저 자동 오픈 (WSL 환경 대응) - Bash("cmd.exe /c start http://localhost:3747 2>/dev/null || open http://localhost:3747 2>/dev/null || xdg-open http://localhost:3747 2>/dev/null || true") - - # URL 항상 표시 (자동 오픈 성공 여부 무관 — CRITICAL) - "Agent Office 대시보드: http://localhost:3747" - - # WSL/tmux 환경 수동 접근 안내 - IF env_platform == "wsl": - "tmux 세션에서 브라우저가 자동으로 열리지 않을 수 있습니다." - "Windows 브라우저에서 직접 http://localhost:3747 을 열어주세요." - -ELSE: - dashboard_available = false - "Agent Office 미설치. 대시보드 없이 진행." -``` - -### 0-1. .team-os/ 인프라 확인 (크로스 플랫폼) - -``` -# Step 1: 프로젝트 루트 절대 경로 획득 -Bash("pwd") → {project_root} - -# Step 2: 절대 경로로 Glob (WSL 상대 경로 실패 방지) -Glob("{project_root}/.team-os/registry.yaml") → 존재하면 Team OS 활성화 -Glob("{project_root}/.team-os/spawn-prompts/*.md") → Spawn Prompt 사용 가능 여부 - -# Step 3: Glob 빈 결과 시 Bash 폴백 -Bash("ls -la .team-os/registry.yaml 2>/dev/null && echo EXISTS || echo NOT_FOUND") -Bash("ls .team-os/spawn-prompts/*.md 2>/dev/null | wc -l") -``` - -### 0-2. Obsidian 환경 확인 (3-Tier) - -```bash -OBSIDIAN_CLI="/mnt/c/Program Files/Obsidian/Obsidian.com" - -# Tier 1: CLI 확인 (우선) -"$OBSIDIAN_CLI" version 2>/dev/null -→ 응답 있으면: obsidian_method = "cli" - -# Tier 2: CLI 실패 시 MCP 확인 -mcp__obsidian__list_notes({}) → 응답 여부 -→ 응답 있으면: obsidian_method = "mcp" - -# Tier 3: 둘 다 실패 → obsidian_method = "filesystem" -``` - -> 팀원 에이전트 스폰 시 `obsidian_method` 값을 컨텍스트로 전달 - -### 0-3. tmux 확인 - -``` -Bash("which tmux && echo AVAILABLE || echo NOT_FOUND") - -tmux 없으면: - → 사용자에게 안내: "Agent Teams는 tmux가 필요합니다. /knowledge-manager (단일 에이전트 버전)을 사용해주세요." - → 중단 -``` - ---- - -## STEP 0.5: 모드 감지 (Mode Detection) - -**STEP 1 진행 전에 사용자 요청을 분석하여 모드를 결정합니다.** - -| 사용자 표현 | 모드 | -|------------|------| -| URL, "정리해줘", "분석해줘", 외부 콘텐츠 | **Mode I** (Content Ingestion) — 기존 워크플로우 | -| "아카이브 정리", "카테고리 재편", "일괄 링크", "대규모 재편" | **Mode R** (Archive Reorganization) | -| 기존 vault 폴더 50+ 파일 지칭 | **Mode R 제안** (사용자에게 확인) | -| "그래프 구축", "GraphRAG", "지식그래프", "인사이트 분석", "커뮤니티 탐색", "그래프 업데이트", "프론트매터 동기화" | **Mode G** (GraphRAG) | - -### Mode R 팀 아키텍처 (AT 버전) - -``` -Mode R Team: -Lead (Opus 1M) — 전체 조율 + 모든 파일 쓰기 (Python 배치 직접 실행) -├── analyst-1..N (Sonnet 1M, Explore) — Phase R1 병렬 분석 -│ - 파일 수에 따라 2-5개 스폰 -│ - Progressive Reading (frontmatter + 첫 5줄) -│ - 산출물: topic_clusters, series, reply_chains, hubs, cross_links -├── @devils-advocate (Sonnet 1M) — Phase R2/R3 규칙 검증 -│ - CATEGORY_DESIGN.md 검증 -│ - {TARGET}_RULES.md 검증 -│ - CONCERN → 수정 → ACCEPTABLE (최대 3회) -└── [쓰기 워커 없음 — Lead가 Python으로 직접 실행] - - CRITICAL: worktree 버그로 팀원 쓰기 위임 금지 - - Lead가 apply_footers.py, update_mocs.py 등 직접 생성+실행 -``` - -### Mode R 감지 시 분기 - -``` -Mode R 선택 시: -→ km-archive-reorganization.md 스킬의 Phase R0-R5 실행 -→ 아래 STEP 1-6 (Mode I) 대신 Mode R 워크플로우 -→ 팀 구성: analyst-1..N + DA (쓰기 워커 없음) - -Mode R 추가 질문: 대상 폴더, 재편 범위, auto-commit 여부 -(상세: km-archive-reorganization.md 사전 질문 섹션 참조) -``` - -### Mode G 팀 아키텍처 (AT 버전) - -``` -Mode G Team: -Lead (Opus 1M) -├── graph-build-lead (Sonnet 1M, Category Lead) -│ ├── @ontology-designer (Sonnet 1M, Explore) -│ ├── @entity-extractor (Sonnet 1M, Explore) -│ └── @community-analyst (Sonnet 1M, Explore) -├── graph-query-lead (Sonnet 1M, Category Lead) -│ ├── @insight-researcher (Sonnet 1M, Explore) -│ └── @panorama-scanner (Sonnet 1M, Explore) -└── @devils-advocate (Sonnet 1M) -``` - -### Mode G 감지 시 분기 - -``` -Mode G 선택 시: -→ km-graphrag-workflow.md 스킬의 Phase G0-G6 실행 -→ 아래 STEP 1-6 (Mode I) 대신 Mode G 워크플로우 -→ 팀 구성: graph-build-lead + graph-query-lead + DA - -Mode G phases: G0(delta) → G1(온톨로지) → G2(엔티티 추출) → G3(관계 구축) → - G4(커뮤니티 탐지) → G5(인사이트 분석) → G6(frontmatter 동기화) -``` - -**Mode I 선택 시** → 아래 STEP 1부터 기존 워크플로우 계속. - ---- - -## STEP 1: 사용자 선호도 확인 (필수!) - -**콘텐츠 처리/읽기 전에 반드시 AskUserQuestion을 호출하세요!** -**4개 질문을 한 번의 호출로 모두 물어봅니다!** - -```json -AskUserQuestion({ - "questions": [ - { - "question": "콘텐츠를 얼마나 상세하게 정리할까요?", - "header": "상세 수준", - "options": [ - {"label": "요약 (1-2p)", "description": "핵심만 간략히"}, - {"label": "보통 (3-5p)", "description": "주요 내용 + 약간의 설명"}, - {"label": "상세 (5p+) (권장)", "description": "모든 내용을 꼼꼼히"} - ], - "multiSelect": false - }, - { - "question": "어떤 영역에 중점을 둘까요?", - "header": "중점 영역", - "options": [ - {"label": "전체 균형 (권장)", "description": "모든 영역을 균형있게"}, - {"label": "개념/이론", "description": "핵심 아이디어와 원리"}, - {"label": "실용/활용", "description": "사용법, 예시, 튜토리얼"}, - {"label": "기술/코드", "description": "구현, 아키텍처, 코드"} - ], - "multiSelect": false - }, - { - "question": "노트를 어떻게 분할할까요?", - "header": "노트 분할", - "options": [ - {"label": "3-tier 계층 (기본)", "description": "메인MOC + 카테고리MOC + 원자노트"}, - {"label": "주제별 분할 (2-tier)", "description": "주요 주제마다 별도 노트 (MOC 포함)"}, - {"label": "원자적 분할", "description": "최대한 작은 단위로 분할 (Zettelkasten)"}, - {"label": "단일 노트", "description": "모든 내용을 하나의 노트에 — 선택 시 그대로 적용"} - ], - "multiSelect": false - }, - { - "question": "기존 노트와 얼마나 연결할까요?", - "header": "연결 수준", - "options": [ - {"label": "최대 (기본)", "description": "태그 + 링크 + 기존 노트와 자동 연결 탐색"}, - {"label": "보통", "description": "태그 + 관련 노트 링크 제안"}, - {"label": "최소", "description": "태그만 추가"} - ], - "multiSelect": false - } - ] -}) -``` - -> AT 버전에서는 RALPH가 항상 ON (max 5회), DA가 항상 ON입니다. -> 별도 질문 없이 자동 적용됩니다. - -> **기본값 정책 (전 변형 공통)**: 분할/연결 미지정·헤드리스 호출 = **3-tier + 최대 연결** 기본. 사용자의 명시 선택(단일·2-tier 포함)은 항상 기본값보다 우선. - -> **kordoc fallback**: HWP·HWPX·복잡한 표 문서·한국어 PDF 등 직접 읽기가 깨지는 형식은 `npx kordoc ` ([github.com/chrisryugj/kordoc](https://github.com/chrisryugj/kordoc))으로 md 변환 후 ingest. PDF 경로는 peer `pdfjs-dist@4` 필요(v6 비호환). - -> **퀵 프리셋은 `/knowledge-manager-m` 전용입니다.** 이 커맨드에서는 항상 STEP 1 질문을 수행합니다. - ---- - -## STEP 1.5A: 이미지 자동 추출 (질문 없이 항상 실행) - -> **이미지 추출은 사용자가 명시적으로 "텍스트만"이라고 말하지 않는 한 항상 자동 실행됩니다.** - -### 이미지 추출 자동 판별 - -| 소스 유형 | image_extraction | 근거 | -|----------|-----------------|------| -| 웹 URL (일반) | **auto** (모든 콘텐츠 이미지, 최대 15개) | 기본 활성화 | -| PDF | **auto** (모든 콘텐츠 이미지, 최대 15개) | 기본 활성화 | -| 소셜 미디어 | **auto** (본문 이미지, 최대 10개) | 기본 활성화 | -| Vault 종합 | **auto** (기존 Resources/images 참조 + 누락 이미지 보완) | 기본 활성화 | -| 사용자 "이미지도", "이미지 포함" | **true** (전체, 제한 없음) | 명시적 확장 | -| 사용자 "텍스트만", "이미지 제외" | **false** | 명시적 제외 (유일한 비활성 조건) | - -**자동 실행 동작:** -- `image_extraction_enabled = true` (기본값) -- content-extractor에게 Image Catalog 생성 지시 자동 포함 -- Phase 5.25 (이미지 저장 및 임베딩) 항상 활성화 -- 참조 스킬: `km-image-pipeline.md` - ---- - -## STEP 1.5B: PDF 처리 방식 확인 (PDF인 경우만!) - -PDF 파일이 입력된 경우에만 이 질문을 합니다: - -```json -AskUserQuestion({ - "questions": [ - { - "question": "대용량 PDF입니까? /pdf 스킬로 처리하시겠습니까?", - "header": "PDF 처리", - "options": [ - {"label": "아니오 (기본)", "description": "Read로 직접 읽기 시도"}, - {"label": "예", "description": "/pdf 스킬로 전체 변환 후 처리"} - ], - "multiSelect": false - } - ] -}) -``` - ---- - -## STEP 2~4: 팀 구성 → 스폰 → 결과 수집 (RALPH · DA) - -See `references/` for detailed procedures only when the matched step asks for them. - -> **전체 절차 = [references/team-pipeline.md](references/team-pipeline.md) Read 후 수행** (팀 9-spec · 병렬 스폰 · RALPH 루프 · DA cross-check · 대시보드). progressive disclosure. - -## STEP 5~6: 노트 생성 → 이미지 → 연결 강화 → 보고 - -> **전체 절차 = [references/store-finalize.md](references/store-finalize.md) Read 후 수행** (STEP5 노트생성 · 5.25 이미지 임베딩 · STEP6 연결강화·팀정리 · 처리결과 보고 템플릿 · 참조 스킬 표). - -## 사용자 요청 내용 - -$ARGUMENTS - ---- - -## How to Use This Skill - -Use this skill for large-scale vault reorganization tasks (archive cleanup, category restructuring, bulk linking, insight generation). This variant (AT mode) uses Agent Teams for parallel processing. Recommend when managing 500+ notes or performing complex graph operations. diff --git a/skills/knowledge-manager-at/references/store-finalize.md b/skills/knowledge-manager-at/references/store-finalize.md deleted file mode 100644 index 8b1bd7b..0000000 --- a/skills/knowledge-manager-at/references/store-finalize.md +++ /dev/null @@ -1,310 +0,0 @@ -# knowledge-manager-at — STEP 5~6 + 결과 보고 + 참조 스킬 - -> SKILL.md 에서 분리. 노트 생성/이미지/연결강화/보고는 on-demand. - -## STEP 5: 노트 생성 (Main이 직접 실행!) - -**CRITICAL**: 노트 생성은 **반드시 Main이 직접** 수행합니다. -팀원에게 쓰기 작업을 위임하면 안 됩니다! (Bug-2025-12-12-2056) - -### 5-1. Obsidian 노트 생성 - -```bash -# Tier 1: CLI (우선) -"$OBSIDIAN_CLI" create path="적절한/경로/파일명.md" content="YAML frontmatter + 노트 내용" - -# Tier 2: MCP (CLI 실패 시) -mcp__obsidian__create_note({ - path: "적절한/경로/파일명.md", - content: "YAML frontmatter + 노트 내용" -}) - -# Tier 3: Write (MCP 실패 시) -Write({ file_path: "{vault_absolute_path}/적절한/경로/파일명.md", content: "..." }) -``` - -**경로 규칙** (CLAUDE.md 참조): -- Vault root = `AI_Second_Brain` -- 경로는 vault root 기준 상대 경로 -- `AI_Second_Brain/`를 prefix로 붙이지 말 것! - -### 5-0. 저장 경로 결정 (CRITICAL — 모든 노트 생성 전 필수!) - -**Mine/ vs Library/ 라우팅**: 노트 생성 전 반드시 아래 규칙으로 경로를 결정합니다. - -``` -Q: "이 콘텐츠의 원저자가 vault 주인(owner)인가?" - -YES → Mine/ 하위: - - 얼룩소 원문 → Mine/얼룩소/ - - 본인 Threads/SNS 원문 → Mine/Threads/ - - 참고 자료 → Resources/ - - 에세이/분석/에버그린 → Mine/Essays/ - - 업무 산출물 (CV 등) → Mine/Projects/ - -NO → Library/ 하위 (기본): - - YouTube/웹 정리 → Library/Zettelkasten/{적절한 주제폴더}/ - - 대규모 리서치 (3-tier) → Library/Research/{프로젝트명}/ - - 외부 Threads → Library/Threads/ - - 학술 논문 → Library/Papers/ - - 웹 클리핑/가이드 → Library/Clippings/ - - 기타 외부 리소스 → Library/Resources/ -``` - -**판별 시그널 (우선순위)**: -1. author 필드 = vault 주인 핸들(사용자 CLAUDE.md 에 선언) → Mine/ -2. source URL에 본인 핸들 포함 → Mine/Threads/ -3. tags에 본인 핸들 포함 → Mine/ -4. 위 해당 없음 → Library/ - -### 5-2. 3-tier 구조 (해당 시) - -3-tier 선택 시 다음 순서로 생성: -1. 원자적 노트들 (각 개념당 1개) -2. 카테고리 MOC (각 챕터당 1개) -3. 메인 MOC (전체 요약 + 모든 카테고리 MOC 링크) - -**모든 노트에 네비게이션 푸터 포함!** (km-export-formats.md 참조) - -### 5-3. 저장 검증 (필수!) - -``` -모든 create_note 호출 후: -1. 응답에서 "created successfully" 확인 -2. Glob으로 파일 존재 확인 -3. 실패 시 Write 도구로 폴백 -``` - ---- - -## STEP 5.25: 이미지 저장 및 임베딩 (image_extraction_enabled 시 — Main 직접 실행!) - -**CRITICAL**: 이 Phase는 `image_extraction_enabled = true`일 때만 실행합니다. -**CRITICAL**: 파일 저장은 반드시 Main이 직접 수행! (Task 에이전트 쓰기 버그 방지) - -참조 스킬: `km-image-pipeline.md` - -### Phase 5.25 워크플로우 - -``` -1. content-extractor Image Catalog 파싱: - - content-proc-lead 보고서에서 Image Catalog 테이블 추출 - - 각 이미지의 Type, Source, URL/Path, Context, Placement 확인 - -2. Resources/images/{topic-folder}/ 디렉토리 생성: - Bash("mkdir -p /AI_Second_Brain/Resources/images/{topic-folder}/") - -3. 각 이미지 다운로드/복사: - - 웹 이미지: - Bash("curl -sLo '/AI_Second_Brain/Resources/images/{topic-folder}/{NN}-{descriptive-name}.{ext}' '{url}'") - - PDF 이미지 (marker 출력): - Bash("cp km-temp/{name}/images/{file} '/AI_Second_Brain/Resources/images/{topic-folder}/{NN}-{descriptive-name}.{ext}'") - -4. 다운로드 실패 시 Playwright 스크린샷 폴백: - - 원본 URL로 navigate - - browser_take_screenshot으로 해당 요소 캡처 - - 저장 경로: Resources/images/{topic-folder}/{NN}-screenshot.png - -5. 노트 콘텐츠에 이미지 임베드 (본문 흐름 배치!): - - 개념 설명 → (빈 줄) → ![[Resources/images/{topic-folder}/{filename}]] → (빈 줄) → 상세 설명 - - content-analyzer의 Placement 제안에 따라 적절한 위치에 삽입 - - 이미지 연속 배치 금지 (반드시 텍스트로 분리) - -6. Notion 페이로드에 이미지 블록 추가: - - 외부 URL 이미지: { "type": "image", "image": { "type": "external", "external": { "url": "{원본URL}" } } } - - 로컬 전용 이미지: callout 블록으로 대체 — "[이미지: Resources/images/{topic-folder}/{filename}]" - -7. 저장 검증: - Glob("AI_Second_Brain/Resources/images/{topic-folder}/*") → 파일 존재 확인 - 각 이미지 파일 크기 > 0 확인 -``` - -### 대시보드 진행률 (Phase 5.25) - -``` -IF dashboard_available AND image_extraction_enabled: - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"Lead\",\"progress\":72,\"task\":\"이미지 저장 중\",\"note\":\"Phase 5.25\"}' --connect-timeout 2 || true") -``` - ---- - -## STEP 6: 연결 강화 + 팀 정리 - -### 6-1. 연결 강화 (연결 수준 "보통" 또는 "최대"일 때) - -상세 워크플로우: `km-link-strengthening.md` 참조 - -``` -1. 새 노트 핵심 키워드 추출 -2. CLI `"$OBSIDIAN_CLI" search` / MCP search_vault로 관련 노트 탐색 - - CLI `"$OBSIDIAN_CLI" deadends` → 나가는 링크 없는 파일 = 연결 강화 우선 후보 (format 옵션 미지원, 플레인 텍스트 목록 반환) -3. 관련성 점수 3점 이상인 노트와 양방향 링크 생성 -4. CLI `"$OBSIDIAN_CLI" append` / MCP update_note로 기존 노트에 역방향 링크 추가 - - CLI `"$OBSIDIAN_CLI" prepend` → 네비게이션 헤더 추가 시 사용 -``` - -### 6-2. 팀 셧다운 + 활동 로그 (tofu-at STEP 7-7 패턴) - -``` -PRECONDITION (셧다운 전제 조건 — DA 활성화): - da_review.recommendation == "ACCEPTABLE" - OR da_iteration >= 3 - -# DA 미승인 시 셧다운 불가 — STEP 4 Phase 3 완료 후에만 진행 - -0. 전 agent Progress → 95% curl push (셧다운 직전): - FOR each agent in [Lead, vault-intel-lead, content-proc-lead, graph-navigator, retrieval-specialist, link-curator, content-extractor, deep-reader, content-analyzer, devils-advocate]: - TEAM_PROGRESS.md: Progress → 95%, Note → shutting down - IF dashboard_available: - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"{agent}\",\"progress\":95,\"task\":\"shutdown\",\"note\":\"shutting down\"}' --connect-timeout 2 || true") - -1. 각 팀원에게 shutdown_request: - FOR each member in [vault-intel-lead, content-proc-lead, graph-navigator, retrieval-specialist, content-extractor, deep-reader, content-analyzer, link-curator, devils-advocate]: - SendMessage({ type: "shutdown_request", recipient: "{member}", content: "작업 완료." }) - -2. shutdown_response 대기 (최대 10초): - 각 팀원의 shutdown_response를 대기. - 10초 내 응답 없는 팀원은 아래 3번에서 강제 정리. - -3. 잔류 tmux pane 강제 정리 (CRITICAL — scurrying 방지): - Read("~/.claude/teams/km-at-{주제키워드}/config.json") - FOR each member in team_config.members (리드 제외): - IF member.tmuxPaneId: - Bash("tmux kill-pane -t {member.tmuxPaneId} 2>/dev/null || true") - FOR each member in team_config.members (리드 제외): - IF member.isActive != false: - config.json에서 해당 member의 isActive = false 설정 - -4. TeamDelete() - -4.1. Results 보고서 자동 전송 (MANDATORY — TeamDelete 직후): - report = { - "id": "{timestamp}-km-at-{주제키워드}", - "timestamp": "{ISO 8601}", - "teamName": "km-at-{주제키워드}", - "subject": "{주제}", - "complexity": "AT Full-Scale", - "duration": "{실행 소요 시간}", - "sourceCommand": "/knowledge-manager-at", - "team": [각 role의 { name, role, model, status }], - "steps": [각 step의 { id, step, assignee, status }], - "checkpoints": [각 checkpoint의 { name, done }], - "bulletin": [{최근 bulletin 항목들}], - "results": { "summary": "...", "details": "...", "artifacts": [...] }, - "ralph": { "iterations": {...}, "verdict": "..." }, - "da": { "recommendation": "...", "iterations": N } - } - - # Primary: Agent Office 서버로 POST - IF dashboard_available: - Bash("curl -s -X POST http://localhost:3747/api/reports -H 'Content-Type: application/json' -d '{report JSON}' --connect-timeout 5") - - # Fallback: curl 실패 시 파일로 직접 저장 - IF curl 실패 (exit code != 0 또는 HTTP != 200/201): - Bash("mkdir -p .team-os/reports") - Write(".team-os/reports/{report.id}.json", JSON.stringify(report, null, 2)) - -5. 대시보드 아티팩트 정리: - IF dashboard_available: - Bash("curl -s -X POST http://localhost:3747/api/session/clear --connect-timeout 2 || true") - → .team-os/artifacts/TEAM_*.md 삭제 (MEMORY.md 유지) - → 대시보드가 stale 팀 데이터 표시하지 않도록 방지 - -6. TEAM_FINDINGS.md → MEMORY.md 이관: - Read(".team-os/artifacts/TEAM_FINDINGS.md") - → Key Insights → MEMORY.md Lessons Learned 테이블에 추가 - → 주요 결정사항 → MEMORY.md Decisions 테이블에 추가 - → Session Log 테이블에 현재 세션 기록 추가: - | # | 날짜 | 주제 | 팀규모 | 생성노트 | 연결수 | RALPH횟수 | DA판정 | -``` - -### 6-3. 결과 보고 - -``` -## 처리 결과 보고 - -### 입력 요약 -- 소스: [URL/파일/vault종합] -- 모드: Agent Teams (풀스케일, 9명) -- Team OS: 활성 -- Agent Office: [실행 중 / 미실행] -- Dashboard Push: [활성 / 비활성] - -### Agent Teams 요약 -| 계층 | 팀원 | 역할 | 모델 | 결과 | -|------|------|------|------|------| -| Cat.Lead | vault-intel-lead | Vault 탐색 조율 | Sonnet 1M | 핵심 {N}개, 관계 {N}개 | -| Cat.Lead | content-proc-lead | 콘텐츠 처리 조율 | Sonnet 1M | 추출 완료, 구조 설계 | -| Worker | @graph-navigator | 그래프 탐색 | Sonnet 1M | Hub {N}개, 1-hop {N}개 | -| Worker | @retrieval-specialist | 키워드 검색 | Sonnet 1M | 관련 노트 {N}개 | -| Worker | @content-extractor | 콘텐츠 추출 | Sonnet 1M | {N} words | -| Worker | @deep-reader | 깊이 읽기 | Sonnet 1M | 교차 분석 {N}개 | -| Worker | @content-analyzer | 구조 설계 | Sonnet 1M | 노트 {N}개 제안 | -| Worker | @link-curator | 링크 추천 | Haiku | 연결 후보 {N}개 | -| DA | @devils-advocate | 반론 검증 | Sonnet 1M | {반론수} 반론, {수용수} 수용 | - -### RALPH Loop 요약 -| 이터레이션 | 대상 | 피드백 | 결과 | -|-----------|------|--------|------| -| 1 | ... | ... | accepted/retry | - -### 처리 요약 -- 검색된 관련 노트: N개 -- 교차 검증 핵심 노트: N개 -- 생성된 노트: N개 -- 추가된 양방향 링크: N개 -- 이미지 추출 (활성 시): N개 다운로드, N개 임베딩 -- 이미지 실패 (있으면): N개 (사유 포함) - -### 출력 위치 -| 노트 | 경로 | 상태 | -|------|------|------| -| [MOC명] | Research/... | 성공 | - -### Checkpoints 요약 -| # | Checkpoint | 상태 | -|---|-----------|------| -| 1 | All workers spawned | ✅/❌ | -| 2 | All workers completed | ✅/❌ | -| 3 | Artifacts generated | ✅/❌ | - -### DA 종합 리뷰 -- Recommendation: {ACCEPTABLE/CONCERN} -- Iterations: {N} -- Rework 대상: {목록 또는 없음} - -### Team OS 아티팩트 -- TEAM_BULLETIN: .team-os/artifacts/TEAM_BULLETIN.md -- MEMORY: .team-os/artifacts/MEMORY.md -- Findings: .team-os/artifacts/TEAM_FINDINGS.md -- Results: .team-os/reports/{report-id}.json (Agent Office 전송 실패 시) -``` - ---- - -## 참조 스킬 (상세 워크플로우) - -| 기능 | 참조 스킬 | -|------|----------| -| 전체 워크플로우 | `km-workflow.md` | -| 환경 감지 | `km-environment-detection.md` | -| 콘텐츠 추출 | `km-content-extraction.md` | -| **YouTube 트랜스크립트** | `km-youtube-transcript.md` | -| 소셜 미디어 | `km-social-media.md` | -| 출력 형식 | `km-export-formats.md` | -| 연결 강화 | `km-link-strengthening.md` | -| 연결 감사 | `km-link-audit.md` | -| Obsidian 노트 형식 | `zettelkasten-note.md` | -| 다이어그램 | `drawio-diagram.md` | -| **Mode R: 아카이브 재편** | `km-archive-reorganization.md` | -| **Mode R: 규칙 엔진** | `km-rules-engine.md` | -| **Mode R: 배치 실행** | `km-batch-python.md` | -| **Mode G: GraphRAG 워크플로우** | `km-graphrag-workflow.md` | -| **Mode G: 온톨로지 설계** | `km-graphrag-ontology.md` | -| **Mode G: 그래프 검색** | `km-graphrag-search.md` | -| **Mode G: 인사이트 리포트** | `km-graphrag-report.md` | -| **Mode G: Frontmatter 동기화** | `km-graphrag-sync.md` | - ---- diff --git a/skills/knowledge-manager-at/references/team-pipeline.md b/skills/knowledge-manager-at/references/team-pipeline.md deleted file mode 100644 index c8e6cda..0000000 --- a/skills/knowledge-manager-at/references/team-pipeline.md +++ /dev/null @@ -1,590 +0,0 @@ -# knowledge-manager-at — STEP 2~4 상세 (팀 구성 / 스폰 / 결과 수집·RALPH·DA) - -> SKILL.md 에서 분리(Skills 2.0 ≤500, progressive disclosure). 본 STEP 실행 시 Read 후 그대로 수행. - -## STEP 2: 팀 구성 + 공유 메모리 초기화 - -### 2-1. 팀 생성 - -``` -TeamCreate({ - team_name: "km-at-{주제키워드}", - description: "{사용자 요청 요약} - Agent Teams 풀스케일", - agent_type: "knowledge-manager-at-lead" -}) -``` - -### 2-2. 공유 메모리 초기화 (계층 + Steps 포함) - -``` -# 세션별 파일 초기화 (MEMORY.md는 유지!) - -# TEAM_PLAN.md — Steps 테이블 + Hierarchy 포함 (Agent Office 계층 그래프 렌더링용) -Write(".team-os/artifacts/TEAM_PLAN.md", """ -# TEAM_PLAN - -## Topic: {주제} -## Complexity: AT Full-Scale -## Team Size: 9 - -## Team -| # | name | role | model | Status | -|---|------|------|-------|--------| -| 1 | Lead | 총괄 오케스트레이션 (Main Lead) | opus 1M | active | -| 2 | vault-intel-lead | Vault Intelligence Category Lead | sonnet 1M | pending | -| 3 | content-proc-lead | Content Processing Category Lead | sonnet 1M | pending | -| 4 | @graph-navigator | Wikilink 그래프 탐색 | sonnet 1M | pending | -| 5 | @retrieval-specialist | 키워드+태그 검색 | sonnet 1M | pending | -| 6 | @link-curator | 양방향 링크 추천 | haiku | pending | -| 7 | @content-extractor | 소스 콘텐츠 추출 | sonnet 1M | pending | -| 8 | @deep-reader | Hub 노트 정독 + 교차 분석 | sonnet 1M | pending | -| 9 | @content-analyzer | 노트 구조 설계 + 태그 추천 | sonnet 1M | pending | -| 10 | @devils-advocate | 반론 + 교차 검증 | sonnet 1M | pending | - -## Hierarchy -| parent | children | -|--------|----------| -| Lead | vault-intel-lead, content-proc-lead, @devils-advocate | -| vault-intel-lead | @graph-navigator, @retrieval-specialist, @link-curator | -| content-proc-lead | @content-extractor, @deep-reader, @content-analyzer | - -## Steps -| # | Step | Assignee | Dependency | Status | -|---|------|----------|------------|--------| -| S1 | 소스 콘텐츠 추출 | @content-extractor | - | pending | -| S2 | Wikilink 그래프 탐색 | @graph-navigator | - | pending | -| S3 | 키워드+태그 넓은 검색 | @retrieval-specialist | - | pending | -| S4 | Hub 노트 정독 + 교차 분석 | @deep-reader | S2 | pending | -| S5 | 양방향 링크 후보 추천 | @link-curator | S2 | pending | -| S6 | Vault Intelligence 통합 | vault-intel-lead | S2,S3,S5 | pending | -| S7 | Content Processing 통합 | content-proc-lead | S1,S4 | pending | -| S8 | 노트 구조 설계 + 태그 추천 | @content-analyzer | S1 | pending | -| S9 | 최종 반론 + 교차 검증 | @devils-advocate | S6,S7,S8 | pending | - -## Quality Targets -| Metric | Target | Measure | -|--------|--------|---------| -| Hub 노트 발견 | 최소 2개 | Graph ∩ Retrieval 교차 확인 | -| 교차 검증 핵심 노트 | 최소 3개 | 2개+ 소스에서 확인 | -| 연결 후보 | 최소 5개 | 양방향 링크 가능 | -| 원문 추출 커버리지 | 90%+ | 주요 섹션 기준 | -| 이미지 추출 (활성 시) | 주요 차트/그래프 90%+ | Image Catalog 기준 | -| RALPH SHIP 기준 | 4개 차원 모두 충족 | vault/content 기준별 | -| DA ACCEPTABLE 기준 | 워커 간 일관성 + 커버리지 누락 없음 | 종합 검토 | -""") - -Write(".team-os/artifacts/TEAM_BULLETIN.md", "# TEAM_BULLETIN\n\n## Updates\n\n(팀원 발견사항이 여기에 추가됩니다)\n") -Write(".team-os/artifacts/TEAM_PROGRESS.md", """ -# TEAM_PROGRESS - -## Status Board - -| Agent | Task | Progress | Updated | Note | -|-------|------|----------|---------|------| -| Lead | 팀 구성 중 | 5% | {timestamp} | active | -| vault-intel-lead | | 0% | {timestamp} | pending | -| content-proc-lead | | 0% | {timestamp} | pending | -| @graph-navigator | | 0% | {timestamp} | pending | -| @retrieval-specialist | | 0% | {timestamp} | pending | -| @link-curator | | 0% | {timestamp} | pending | -| @content-extractor | | 0% | {timestamp} | pending | -| @deep-reader | | 0% | {timestamp} | pending | -| @content-analyzer | | 0% | {timestamp} | pending | -| @devils-advocate | | 0% | {timestamp} | pending | - -## Checkpoints - -| # | Name | Condition | Done | -|---|------|-----------|------| -| 1 | All workers spawned | 모든 워커 Task 생성 완료 | [ ] | -| 2 | All workers completed | 모든 워커 결과 수신 | [ ] | -| 3 | Artifacts generated | 최종 산출물 생성 | [ ] | -""") -Write(".team-os/artifacts/TEAM_FINDINGS.md", "# TEAM_FINDINGS\n\n## Session: {주제}\n\n(교차 검증 결과가 여기에 기록됩니다)\n") - -# MEMORY.md에서 이전 세션 교훈 읽기 -Read(".team-os/artifacts/MEMORY.md") → 관련 Lessons Learned 확인 -``` - -### 2-3. 태스크 생성 (TaskCreate) - -``` -# Category Leads -TaskCreate("vault-intel-lead: Vault Intelligence 조율 - graph/retrieval/link 워커 관리") -TaskCreate("content-proc-lead: Content Processing 조율 - extractor/reader/analyzer 워커 관리") - -# Vault Intelligence Workers -TaskCreate("graph-navigator: Wikilink 2-hop 그래프 탐색 - Hub 노트 식별") -TaskCreate("retrieval-specialist: 키워드+태그 넓은 검색 - TOP 20 정리") -TaskCreate("link-curator: 양방향 링크 후보 추천", blockedBy: [graph-navigator task ID]) - -# Content Processing Workers -TaskCreate("content-extractor: 소스 콘텐츠 추출") -TaskCreate("deep-reader: Hub 노트 깊이 읽기 + 교차 분석") -TaskCreate("content-analyzer: 노트 구조 설계 + 태그 추천") - -# Devil's Advocate -TaskCreate("devils-advocate: 최종 결과 반론 + 교차 검증") -``` - -### 2-4. Agent Office 능동 대시보드 연동 (CRITICAL — 실시간 Push) - -**원칙: 모든 상태 전환에서 curl API push + TEAM_PROGRESS.md + TEAM_BULLETIN.md 3중 업데이트 수행.** - -> 파일 watcher만으로는 15초 폴링 지연이 발생합니다. -> curl API push를 함께 사용하면 SSE로 실시간 반영됩니다. - -``` -IF dashboard_available: - # 팀 생성 직후 초기 progress push (Lead: 5%, "팀 구성 중") - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"Lead\",\"progress\":5,\"task\":\"팀 구성 중\",\"note\":\"active\"}' --connect-timeout 2 || true") - - # TEAM_BULLETIN.md 초기 기록 - TEAM_BULLETIN.md에 Append: - ## [{timestamp}] - Lead - **Task**: Team created - **Findings**: KM-AT 풀스케일 팀 ({주제}) 생성 완료. 9명 스폰 대기. - **Status**: active - -ELSE: - # dashboard_available = false → curl 호출 생략, 파일 업데이트만 수행 - "Agent Office 미실행. 파일 기반 진행률만 기록." -``` - -> **진행률 갱신 규칙 (8레벨 스케일 — CRITICAL for Agent Office 실시간 반영)**: -> - 5%(created) → 10%(spawned) → 20%(first_message) → 30-70%(active, 작업 비례) → 80%(results_sent / SHIP) → 90%(DA review) → 95%(shutdown) → 100%(team_deleted) -> - Explore 워커: 10%(spawned) → 25→50→75%(active) → 80%(results_sent) → 95%(shutdown) → 100%(team_deleted) -> - Done(100%)은 TeamDelete 후에만 표시. 80-99%는 "Wrapping up"으로 표시. -> - 최소 2분마다 1회 갱신 (Agent Office 15초 폴링 + SSE로 실시간 반영) - ---- - -## STEP 3: 팀원 스폰 (병렬!) - -**반드시 하나의 메시지에서 모든 Task를 병렬로 호출하세요!** - -> Spawn Prompt 로드: `.team-os/spawn-prompts/{role}.md`를 Read로 읽어서 프롬프트에 포함. -> `{{TOPIC}}`, `{{REPORT_TO}}`, `{{PREFERENCES}}` 등 변수를 실제 값으로 치환. - -### 3-0. progress_update_rule 주입 확인 (CRITICAL) - -각 spawn prompt에 `` 섹션이 포함되어야 합니다. -- **general-purpose 워커** (content-extractor, content-analyzer): curl 기반 직접 push -- **Category Lead** (vault-intel-lead, content-proc-lead): curl 직접 push + Explore 워커 진행률 중계 -- **Explore 워커** (graph-navigator, retrieval-specialist, link-curator, deep-reader): SendMessage 기반 보고 (Bash 불가) -- **DA** (devils-advocate): curl 기반 직접 push (아래 inline prompt에 포함) - -spawn prompt 파일에 ``이 이미 포함되어 있으므로 별도 주입 불필요. -단, 변수 치환 시 `{{REPORT_TO}}`가 정확히 치환되었는지 확인. - -``` -# ⚠️ 1M 컨텍스트 규칙: 모든 sonnet/opus 스폰은 model: "sonnet[1m]" / "opus[1m]" 사용. haiku만 200K. -# 9명 동시 호출 (하나의 메시지에 모든 Task 포함): - -# === Category Lead: Vault Intelligence === -Task(@vault-intel-lead): - subagent_type: "general-purpose" - model: "sonnet[1m]" - team_name: "km-at-{주제키워드}" - name: "vault-intel-lead" - run_in_background: true - prompt: | - [.team-os/spawn-prompts/vault-intel-lead.md 내용] - ({{REPORT_TO}} = 'Lead', {{TOPIC}} = '{주제}', {{TOPIC_KEYWORD}} = '{키워드}') - -# === Category Lead: Content Processing === -Task(@content-proc-lead): - subagent_type: "general-purpose" - model: "sonnet[1m]" - team_name: "km-at-{주제키워드}" - name: "content-proc-lead" - run_in_background: true - prompt: | - [.team-os/spawn-prompts/content-proc-lead.md 내용] - ({{REPORT_TO}} = 'Lead', {{TOPIC}} = '{주제}', {{SOURCE_URL}} = '{URL}', {{PREFERENCES}} = '{선호도}') - -# === Vault Intelligence Workers === -Task(@graph-navigator): - subagent_type: "Explore" - model: "sonnet[1m]" - team_name: "km-at-{주제키워드}" - name: "graph-navigator" - run_in_background: true - prompt: | - [.team-os/spawn-prompts/graph-navigator.md 내용] - ({{REPORT_TO}} = 'vault-intel-lead', {{TOPIC}} = '{주제}', {{TOPIC_KEYWORD}} = '{키워드}') - -Task(@retrieval-specialist): - subagent_type: "Explore" - model: "sonnet[1m]" - team_name: "km-at-{주제키워드}" - name: "retrieval-specialist" - run_in_background: true - prompt: | - [.team-os/spawn-prompts/retrieval-specialist.md 내용] - ({{REPORT_TO}} = 'vault-intel-lead', {{TOPIC}} = '{주제}') - -Task(@link-curator): - subagent_type: "Explore" - model: "haiku" - team_name: "km-at-{주제키워드}" - name: "link-curator" - run_in_background: true - prompt: | - [.team-os/spawn-prompts/link-curator.md 내용] - ({{REPORT_TO}} = 'vault-intel-lead', {{TOPIC}} = '{주제}', {{NEW_NOTES}} = '생성 예정 노트 목록') - -# === Content Processing Workers === -Task(@content-extractor): - subagent_type: "general-purpose" - model: "sonnet[1m]" - team_name: "km-at-{주제키워드}" - name: "content-extractor" - run_in_background: true - prompt: | - [.team-os/spawn-prompts/content-extractor.md 내용] - ({{REPORT_TO}} = 'content-proc-lead', {{SOURCE_URL}} = '{URL}', {{SOURCE_TYPE}} = '{type}', {{TOPIC}} = '{주제}') - -Task(@deep-reader): - subagent_type: "Explore" - model: "sonnet[1m]" - team_name: "km-at-{주제키워드}" - name: "deep-reader" - run_in_background: true - prompt: | - [.team-os/spawn-prompts/deep-reader.md 내용] - ({{REPORT_TO}} = 'content-proc-lead', {{TOPIC}} = '{주제}', {{HUB_NOTES}} = 'graph-navigator가 식별 예정') - -Task(@content-analyzer): - subagent_type: "general-purpose" - model: "sonnet[1m]" - team_name: "km-at-{주제키워드}" - name: "content-analyzer" - run_in_background: true - prompt: | - [.team-os/spawn-prompts/content-analyzer.md 내용] - ({{REPORT_TO}} = 'content-proc-lead', {{TOPIC}} = '{주제}', {{PREFERENCES}} = '{사용자선호}') - -# === Devil's Advocate === -Task(@devils-advocate): - subagent_type: "general-purpose" - model: "sonnet[1m]" - team_name: "km-at-{주제키워드}" - name: "devils-advocate" - run_in_background: true - prompt: | - 당신은 Devil's Advocate입니다. km-at-{주제키워드} 팀의 DA로서, - Lead의 최종 결과에 대해 반론을 제기합니다. - Lead가 결과를 보내면 다음을 검토하세요: - 1. 누락된 관점/정보 - 2. 편향된 해석 - 3. 불완전한 연결 - 4. 대안적 구조 제안 - 평소에는 대기합니다. Lead가 메시지를 보내면 활동합니다. - - - 작업 시작 시: - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"@devils-advocate\",\"progress\":10,\"task\":\"대기 중\"}'") - 검토 시작 시: progress=30, 검토 중 50, 반론 작성 80, 완료 100 - curl 실패해도 무시. - -``` - -### 3-1. 스폰 후 초기 진행 업데이트 (대시보드 연동 — tofu-at STEP 7-4-2 패턴) - -**모든 Task 스폰 직후, 대시보드에 실행 상태를 반영합니다.** - -``` -# 모든 Task 스폰 직후: -FOR each spawned_role in [vault-intel-lead, content-proc-lead, graph-navigator, retrieval-specialist, link-curator, content-extractor, deep-reader, content-analyzer, devils-advocate]: - TEAM_PROGRESS.md의 해당 Agent 행 업데이트: - Progress: 0% → 10% - Note: pending → spawned - Updated: {current_timestamp} - - IF dashboard_available: - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"{spawned_role}\",\"progress\":10,\"task\":\"초기화 중\",\"note\":\"spawned\"}' --connect-timeout 2 || true") - -# Lead Progress 업데이트: 5% → 10% -TEAM_PROGRESS.md: Lead → Progress: 10%, Note: spawning complete -IF dashboard_available: - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"Lead\",\"progress\":10,\"task\":\"팀 스폰 완료\",\"note\":\"spawning complete\"}' --connect-timeout 2 || true") - -# Checkpoint 1 업데이트: -TEAM_PROGRESS.md의 Checkpoints: - | 1 | All workers spawned | 모든 워커 Task 생성 완료 | [x] | - -# TEAM_BULLETIN.md에 Append: - ## [{timestamp}] - Lead - **Task**: Team spawn complete - **Findings**: 9명 워커 스폰 완료: vault-intel-lead, content-proc-lead, graph-navigator, retrieval-specialist, link-curator, content-extractor, deep-reader, content-analyzer, devils-advocate - **Status**: active -``` - -### 3-4. 사용자 알림 - -팀 구성 후 사용자에게 표시: - -``` -Knowledge Manager AT가 풀스케일 Agent Teams 모드로 실행됩니다. - -| 계층 | 팀원 | 역할 | 모델 | 상태 | -|------|------|------|------|------| -| Lead | Main | 총괄 오케스트레이션 | Opus 1M | 실행 중 | -| Cat.Lead | vault-intel-lead | Vault 탐색 조율 | Sonnet 1M | 실행 중 | -| Cat.Lead | content-proc-lead | 콘텐츠 처리 조율 | Sonnet 1M | 실행 중 | -| Worker | @graph-navigator | Wikilink 그래프 탐색 | Sonnet 1M | 실행 중 | -| Worker | @retrieval-specialist | 키워드+태그 검색 | Sonnet 1M | 실행 중 | -| Worker | @content-extractor | 소스 콘텐츠 추출 | Sonnet 1M | 실행 중 | -| Worker | @deep-reader | 핵심 노트 정독 | Sonnet 1M | 실행 중 | -| Worker | @content-analyzer | 노트 구조 설계 | Sonnet 1M | 실행 중 | -| Worker | @link-curator | 연결 후보 추천 | Haiku | 대기 중 | -| DA | @devils-advocate | 결과 반론 검증 | Sonnet 1M | 대기 중 | - -RALPH Loop: ON (최대 5회) | DA: ON -팀원들이 병렬 처리 중입니다. Category Lead가 결과를 통합하여 보고합니다. -``` - -### Phase A-G: GraphRAG 하이브리드 검색 (Dense + Sparse + Reranker) - -``` -VAULT_ROOT="${VAULT_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}" -DB_PATH="${VAULT_ROOT}/.team-os/graphrag/index/vault_graph.db" -INDEX_DIR="${VAULT_ROOT}/.team-os/graphrag/index" - -IF DB 존재: - 1. 하이브리드 검색 (Dense Embedding + FTS5 Sparse + Reranker): - Bash("python3 .team-os/graphrag/scripts/graph_search.py hybrid '{키워드}' --top-k 20 2>/dev/null || echo '[]'") - → JSON 결과 파싱: results[].entity, results[].source_note, results[].score, results[].source - → 실패 시 기존 LIKE 폴백: - Bash("python3 -c \"import sqlite3; c=sqlite3.connect('{DB_PATH}').cursor(); [print(r) for r in c.execute(\\\"SELECT name, type, description, source_note FROM entities WHERE name LIKE '%{키워드}%' OR name_ko LIKE '%{키워드}%' LIMIT 20\\\")]\"") - - 2. 관계 탐색 (1-2홉): - 발견된 엔티티의 source/target 관계 조회: - Bash("python3 -c \"import sqlite3; c=sqlite3.connect('{DB_PATH}').cursor(); [print(r) for r in c.execute(\\\"SELECT r.type, e2.name, e2.source_note FROM relationships r JOIN entities e2 ON r.target_id=e2.id WHERE r.source_id IN (SELECT id FROM entities WHERE name LIKE '%{키워드}%') LIMIT 30\\\")]\"") - - 3. 커뮤니티 연관 노트: - 엔티티가 속한 커뮤니티의 다른 멤버 조회: - Bash("python3 -c \"import sqlite3; c=sqlite3.connect('{DB_PATH}').cursor(); [print(r) for r in c.execute(\\\"SELECT DISTINCT e2.name, e2.source_note FROM entities e1 JOIN entities e2 ON e1.community_id=e2.community_id WHERE e1.name LIKE '%{키워드}%' AND e2.name!=e1.name LIMIT 15\\\")]\"") - - 4. 결과를 graphrag_results에 저장 → Phase C 교차 검증에 포함 - -ELSE: - → GraphRAG DB 미존재. Phase A-G 스킵. -``` - -> **하이브리드 검색**: Dense Embedding(시멘틱) + FTS5(키워드) + Reranker 자동 결합. -> embedding index 미존재 시 기존 LIKE 검색으로 graceful fallback. - ---- - -## STEP 4: 결과 수집 + RALPH + DA (대시보드 실시간 갱신 포함) - -### Phase 1: Category Lead 결과 수신 (Health Check 루프 강화 — tofu-at STEP 7-5.5) - -``` -# Category Lead들이 워커 결과를 통합하여 SendMessage로 보고 -# 대기: vault-intel-lead + content-proc-lead 모두 보고할 때까지 - -WHILE (미완료 Category Lead 존재): - # TEAM_PROGRESS.md에서 각 에이전트의 마지막 업데이트 시간 확인 - FOR each active_lead in [vault-intel-lead, content-proc-lead]: - last_update = TEAM_PROGRESS.md에서 해당 Agent의 Updated 열 파싱 - elapsed = current_time - last_update - - IF elapsed > 5분: - # 1차: 상태 확인 메시지 전송 - SendMessage( - recipient: "{active_lead}", - content: "상태 확인: 마지막 업데이트로부터 5분 경과. 현재 진행 상황을 보고해주세요.", - summary: "Health check for {active_lead}" - ) - - # 2차 (10분 경과 시): 셧다운 + 교체 판단 - IF elapsed > 10분 AND 이미 상태 확인 메시지 전송 완료: - → SendMessage(type: "shutdown_request", recipient: "{active_lead}") - → 새 에이전트 스폰 (같은 이름 재사용 금지! e.g., vault-intel-lead-2) - → TEAM_BULLETIN.md에 기록: "Agent {active_lead} replaced due to inactivity" - → TEAM_PROGRESS.md: 해당 Agent Note → "replaced (inactivity)" - - WAIT # 메시지 자동 수신 대기 -``` - -### Phase 2: RALPH Loop (자동, 최대 5회 — 대시보드 3중 업데이트) - -``` -FOR iteration IN 1..5: - vault_intel_result = vault-intel-lead 보고서 - content_proc_result = content-proc-lead 보고서 - - # 평가 기준 - vault_criteria: - - Hub 노트 >= 2개 - - 교차 검증 핵심 노트 >= 3개 - - 연결 후보 >= 5개 - - content_criteria: - - 원문 주요 섹션 90%+ 추출 - - 교차 분석 항목 >= 3개 - - 노트 구조 제안 포함 - - 태그 추천 >= 5개 - - IF vault_intel 충족: - # === SHIP 판정: 3중 업데이트 === - TEAM_PROGRESS.md: vault-intel-lead → Progress: 80%, Note: SHIP (DA 리뷰 대기) - IF dashboard_available: - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"vault-intel-lead\",\"progress\":80,\"task\":\"SHIP - DA 리뷰 대기\",\"note\":\"awaiting DA comprehensive review\"}' --connect-timeout 2 || true") - TEAM_BULLETIN.md에 Append: - ## [{timestamp}] - vault-intel-lead - **Task**: Vault Intelligence 통합 - **Findings**: {결과 요약 1-2줄} - **Status**: SHIP (DA 리뷰 대기) - - SendMessage(recipient: "vault-intel-lead", content: "SHIP 판정. DA 종합 리뷰 대기 중입니다.", summary: "SHIP - awaiting DA review") - - ELSE: - # === REVISE 판정: 3중 업데이트 === - TEAM_PROGRESS.md: vault-intel-lead → Progress: 50%, Note: REVISE #{iteration} - IF dashboard_available: - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"vault-intel-lead\",\"progress\":50,\"task\":\"REVISE\",\"note\":\"iteration #{iteration}\"}' --connect-timeout 2 || true") - TEAM_BULLETIN.md에 Append: - ## [{timestamp}] - Lead (RALPH) - **Iteration**: {iteration}/5 - **Target**: vault-intel-lead - **Feedback**: {구체적 부족 항목} - **Status**: retry - - SendMessage({ - type: "message", - recipient: "vault-intel-lead", - content: "REVISE #{iteration}: {구체적 부족 항목}. 추가 탐색 요청.", - summary: "RALPH: Vault Intel 보완 요청" - }) - → 보완 결과 대기 - - # content-proc-lead에 대해서도 동일한 SHIP/REVISE 3중 업데이트 패턴 적용 - # (위 vault-intel-lead 패턴을 content-proc-lead로 변경하여 반복) - - IF 모두 SHIP: - BREAK → Phase 3으로 -``` - -### Phase 3: DA 종합 리뷰 (2-Phase Review — tofu-at STEP 7-6.5 패턴) - -**모든 Category Lead 결과 수집 완료 후, DA에게 전체 결과를 종합 검토하도록 요청합니다.** - -``` -# PRECONDITION: 모든 Category Lead 결과 수집 완료 (각 lead progress == 80%) - -# Phase 3-A: DA에게 전체 결과 종합 검토 요청 -all_results_summary = vault_intel_report + content_proc_report 종합 1페이지 요약 -SendMessage( - recipient: "devils-advocate", - content: "전체 결과를 종합 검토해주세요:\n\n{all_results_summary}\n\n검토 관점:\n1. Category Lead 간 결과 일관성\n2. 전체 커버리지 누락 여부\n3. 교차 검증 불일치\n4. 종합 recommendation: ACCEPTABLE 또는 CONCERN + 재작업 대상", - summary: "DA comprehensive review request" -) - -# DA 응답 수신 -da_review = DA 메시지 자동 수신 -da_iteration = 0 - -# Phase 3-B: DA 판정 처리 -IF da_review.recommendation == "ACCEPTABLE": - # 모든 워커/리드 100%로 업데이트 - FOR each agent in [vault-intel-lead, content-proc-lead, graph-navigator, retrieval-specialist, link-curator, content-extractor, deep-reader, content-analyzer]: - TEAM_PROGRESS.md: Progress → 100%, Note → completed (DA ACCEPTABLE) - IF dashboard_available: - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"{agent}\",\"progress\":100,\"task\":\"completed\",\"note\":\"DA ACCEPTABLE\"}' --connect-timeout 2 || true") - - # Checkpoint 2 업데이트 - TEAM_PROGRESS.md: | 2 | All workers completed | 모든 워커 결과 수신 | [x] | - → Phase 4로 - -ELIF da_review.recommendation == "CONCERN": - da_iteration += 1 - rework_targets = da_review에서 재작업 필요 대상 추출 - - WHILE da_iteration < 3 AND rework_targets not empty: - FOR each rework_target in rework_targets: - SendMessage( - recipient: "{rework_target}", - content: "DA 종합 리뷰 피드백:\n{da_review.feedback}\n\n수정 후 다시 결과를 보내주세요.", - summary: "DA rework request for {rework_target}" - ) - # 3중 업데이트 (REVISE) - TEAM_PROGRESS.md: {rework_target} → Progress: 50%, Note: DA rework #{da_iteration} - IF dashboard_available: - Bash("curl -s -X POST http://localhost:3747/api/progress -H 'Content-Type: application/json' -d '{\"agent\":\"{rework_target}\",\"progress\":50,\"task\":\"DA rework\",\"note\":\"iteration #{da_iteration}\"}' --connect-timeout 2 || true") - TEAM_BULLETIN.md에 Append: - ## [{timestamp}] - Lead (DA CONCERN) - **Target**: {rework_target} - **Feedback**: {da_review.feedback 요약} - **Status**: DA rework #{da_iteration} - - # 수정 결과 재수신 - FOR each rework_target: - reworked_result = 메시지 자동 수신 - TEAM_PROGRESS.md: {rework_target} → Progress: 80%, Note: rework submitted - - # DA 재검토 - da_iteration += 1 - SendMessage( - recipient: "devils-advocate", - content: "수정된 결과를 재검토해주세요:\n{reworked_results_summary}\n\nrecommendation: ACCEPTABLE 또는 CONCERN", - summary: "DA re-review #{da_iteration}" - ) - da_review = DA 메시지 자동 수신 - - IF da_review.recommendation == "ACCEPTABLE": - FOR each agent: - TEAM_PROGRESS.md: Progress → 100%, Note → completed (DA ACCEPTABLE) - IF dashboard_available: - Bash("curl ... progress:100 ...") - BREAK - - rework_targets = da_review에서 재작업 필요 대상 추출 - - IF da_iteration >= 3: - → 경고: "DA 리뷰 최대 반복(3)에 도달. 현재 결과로 진행." - FOR each agent: - TEAM_PROGRESS.md: Progress → 100%, Note → completed (DA max iterations) - -# TEAM_FINDINGS.md에 DA 결과 기록 -TEAM_FINDINGS.md: - ## DA Review - - Recommendation: {ACCEPTABLE/CONCERN} - - Iterations: {da_iteration} - - Feedback: {da_review 전문} - - Lead Decision: {판정 사유} -``` - -### Phase 4: 교차 검증 통합 - -``` -# 최종 교차 검증 -Graph ∩ Retrieval → 핵심 노트 (확실히 관련) -Graph only → 관계 기반 발견 (간접 연결) -Retrieval only → 고립 노트 (링크 후보) - -# Checkpoint 2 업데이트 (Phase 3에서 미완료 시) -TEAM_PROGRESS.md: | 2 | All workers completed | 모든 워커 결과 수신 | [x] | - -# TEAM_FINDINGS.md 최종 작성 -TEAM_FINDINGS.md: - ## Cross-Validation Summary - | Category | Count | Notes | - |----------|-------|-------| - | Core (Graph ∩ Retrieval) | N | ... | - | Graph Only | N | ... | - | Retrieval Only | N | ... | - - ## Key Insights - 1. ... - - ## DA Review - - Recommendation: {ACCEPTABLE/CONCERN} - - Iterations: {da_iteration} - - Lead Decision: ... -``` - ---- diff --git a/skills/knowledge-manager-bootstrap/SKILL.md b/skills/knowledge-manager-bootstrap/SKILL.md deleted file mode 100644 index 06a9703..0000000 --- a/skills/knowledge-manager-bootstrap/SKILL.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -name: knowledge-manager-bootstrap -description: Use when installing the 4-Tier search stack for the first time, recovering from "search Tier X 실패", or recording vault_root with Obsidian CLI, vault-search MCP, and optional GraphRAG setup. -allowedTools: Bash, AskUserQuestion, Write, Read ---- - -# knowledge-manager-bootstrap - -## Trigger -- Slash: `/thiscode:km-bootstrap` -- Failure escalation from `search` when all 4 Tiers fail - -## Workflow - -1. Detect environment: OS (uname -s), WSL (/proc/version), shell, claude version. -2. Detect existing assets: - - Obsidian (`../../scripts/install-obsidian-cli.sh --check`) - - vault-search MCP (`../../scripts/install-vault-search.sh --dry-run`) - - GraphRAG server (`../../scripts/install-graphrag.sh --check`) -3. Detect vault_root candidates (cwd / $CLAUDE_DISCODE_VAULT env / `~/.thiscode-config` / `~/obsidian-ai-vault` / `~/Documents/Obsidian`). -4. AskUserQuestion 1회: vault_root 확정 (multiple choice from candidates + Other). -5. Write `~/.thiscode-config` with selected vault_root. -6. AskUserQuestion 1회: install matrix (Obsidian only / +vault-search MCP / +GraphRAG (full)). -7. Run corresponding `install-*.sh --apply` scripts in order. -8. Verify by calling `search` with sample query. -9. Print install summary + next-step suggestions. - -## Config file format - -`~/.thiscode-config`: -```yaml -vault_root: -search: - tiers: - - graphrag - - obsidian - - mcp - - grep - graphrag_endpoint: http://127.0.0.1:8400 -km: - variant: lite # default Phase 1·2 - mode_r: false # at variant only -``` - -See `references/setup-wizard.md` for exact AskUserQuestion prompts. - ---- - -## How to Use This Skill - -Use this skill when knowledge-manager reports "config missing" or when first setting up knowledge manager. It generates necessary configuration files and vault structure templates to prepare your vault for content ingestion. diff --git a/skills/knowledge-manager-bootstrap/references/setup-wizard.md b/skills/knowledge-manager-bootstrap/references/setup-wizard.md deleted file mode 100644 index 06214ba..0000000 --- a/skills/knowledge-manager-bootstrap/references/setup-wizard.md +++ /dev/null @@ -1,14 +0,0 @@ -# Setup Wizard Prompts (for AskUserQuestion) - -## Prompt 1: vault_root -- header: vault 위치 -- question: "knowledge base 가 들어갈 vault root 폴더를 선택해주세요." -- options: + "직접 입력" - -## Prompt 2: install matrix -- header: 설치 범위 -- question: "어느 Tier 까지 설치할까요? 입문 사용자는 보통 #2 부터 시작합니다." -- options: - 1. Obsidian + grep only (최소) - 2. + vault-search MCP (Tier 3 활성, 추천) - 3. + GraphRAG server (Tier 1 활성, full) diff --git a/skills/knowledge-manager-lite/SKILL.md b/skills/knowledge-manager-lite/SKILL.md deleted file mode 100644 index 06ad459..0000000 --- a/skills/knowledge-manager-lite/SKILL.md +++ /dev/null @@ -1,486 +0,0 @@ ---- -name: knowledge-manager-lite -description: Use when running knowledge management in a minimal, distributed, or headless environment — keyword-based auto-preset, no AskUserQuestion, no kakao/mobile notifications. -allowedTools: Read, Write, Bash, Glob, Grep, mcp__obsidian__*, mcp__notion__*, mcp__playwright__*, mcp__hyperbrowser__*, WebFetch ---- - -> **Contracts**: `.claude/reference/contracts/{km-mode-spec, km-variant-matrix}.md` v0.1.0. Mode I/R/G + variant 책임 경계는 본 contracts 와 일치해야 함. - -# Knowledge Manager Lite 호출 (경량 · 배포용) - -> **이 커맨드는 키워드 기반 자동 프리셋으로 동작합니다.** -> 콘텐츠 설정(상세/중점/분할/연결)은 AskUserQuestion 없이 자동 결정됩니다. -> **카카오 전송 로직과 모바일 ntfy 알림이 제거된 배포용 버전입니다.** -> 개인용 대화형 버전: `/knowledge-manager` (전체 AskUserQuestion 사용) -> 개인용 모바일/카카오 연동 버전: `/knowledge-manager-m` -> 에이전트 정의: `.claude/agents/knowledge-manager.md` 참조 - ---- - -## 아키텍처 - -``` -Main (Opus 1M, 단일 세션, AskUserQuestion 없음) - └── 키워드 기반 자동 프리셋 → 순차 실행: - 0. 환경 확인 - 0.5. 모드 감지 + 자동 프리셋 결정 - 2. 콘텐츠 추출 - 3. Vault 그래프 탐색 - 4. 콘텐츠 분석 + 노트 구조 설계 - 5. 노트 생성 - 6. 연결 강화 + 결과 보고 -``` - -**어디서든 동작** (tmux 없어도, Agent Teams 없어도, SSH/headless에서도, 공용 PC 환경에서도). - ---- - -## STEP 0: 환경 확인 (간소화) - -**사용자에게 표시할 필요 없음. 내부적으로 판단만 수행.** - -### Obsidian 접근 방식 확인 (3-Tier) - -```bash -OBSIDIAN_CLI="/mnt/c/Program Files/Obsidian/Obsidian.com" - -# Tier 1: CLI 확인 (우선) -"$OBSIDIAN_CLI" version 2>/dev/null -→ 응답 있으면: obsidian_method = "cli" - -# Tier 2: CLI 실패 시 MCP 확인 -mcp__obsidian__list_notes({}) → 응답 여부 -→ 응답 있으면: obsidian_method = "mcp" - -# Tier 3: 둘 다 실패 시 -→ obsidian_method = "filesystem" -→ Write/Read/Grep 도구로 직접 파일 저장 -``` - ---- - -## STEP 0.5: 자동 프리셋 결정 (AskUserQuestion 없음) - -**CRITICAL**: 이 커맨드는 AskUserQuestion을 일체 사용하지 않습니다. -모든 설정(상세/중점/분할/연결/이미지/수신자)은 $ARGUMENTS 텍스트 분석으로 자동 결정됩니다. - -### 0.5-1. 모드 감지 (Mode Detection) - -$ARGUMENTS 텍스트를 분석하여 모드를 자동 결정합니다. - -| $ARGUMENTS 패턴 | 모드 | -|----------------|------| -| URL, "정리해줘", "분석해줘", 외부 콘텐츠 | **Mode I** (Content Ingestion) | -| "아카이브 정리", "카테고리 재편", "일괄 링크", "대규모 재편" | **Mode R** (Archive Reorganization) | -| 기존 vault 폴더명 지칭 | **Mode R** (자동 진입) | -| "그래프", "GraphRAG", "인사이트" | **Mode G** (GraphRAG) | - -**Mode R 자동 파라미터 (질문 없이 기본값 적용):** - -| 파라미터 | 기본값 | 오버라이드 키워드 | -|---------|--------|-----------------| -| 대상 폴더 | $ARGUMENTS에서 경로 추출 | 명시적 폴더 경로 | -| 재편 범위 | 풀 재편 | "링크만"→링크 강화, "카테고리만"→카테고리 재분류 | -| Auto-commit | 예 (매 배치 후 즉시 commit) | "커밋 안함", "no commit"→아니오 | - -Mode R 선택 시 → `km-archive-reorganization.md` 스킬의 Phase R0-R5 실행. - -### 0.5-2. 복합 프리셋 매칭 (최우선) - -$ARGUMENTS에서 아래 키워드를 순서대로 매칭합니다. **첫 매칭이 적용됩니다.** - -| $ARGUMENTS 키워드 | 상세 수준 | 중점 영역 | 노트 분할 | 연결 수준 | -|---|---|---|---|---| -| "빠르게", "간단히" | 요약 (1-2p) | 전체 균형 | 단일 노트 | 최소 | -| "요약해줘", "요약" | 요약 (1-2p) | 전체 균형 | 단일 노트 | 최대 | -| "상세하게 요약해줘", "상세 요약" | 보통 (3-5p) | 전체 균형 | 주제별 분할 | 최대 | -| "꼼꼼히", "자세히", "체계적으로" | 상세 (5p+) | 전체 균형 | 원자적 분할 | 최대 | -| "기본으로", "기본" | 상세 (5p+) | 전체 균형 | 3-tier | 최대 | -| "연구보고서", "논문정리" | 상세 (5p+) | 개념/이론 | 3-tier | 최대 | -| "실무용", "실용적으로" | 보통 (3-5p) | 실용/활용 | 주제별 분할 | 보통 | -| "레퍼런스", "참고용" | 보통 (3-5p) | 기술/코드 | 단일 노트 | 보통 | -| "공부용", "학습용" | 상세 (5p+) | 개념/이론 | 원자적 분할 | 최대 | - -### 0.5-3. 개별 파라미터 오버라이드 (복합 미매칭 시) - -복합 프리셋에 매칭되지 않은 경우, 개별 키워드로 각 파라미터를 결정합니다. - -**상세 수준:** - -| 키워드 | 값 | -|--------|---| -| "요약", "간략", "summary", "brief" | 요약 (1-2p) | -| "보통", "적당", "standard" | 보통 (3-5p) | -| "상세", "자세", "detailed", "comprehensive" | 상세 (5p+) | -| (매칭 없음) | **상세 (5p+)** | - -**중점 영역:** - -| 키워드 | 값 | -|--------|---| -| "실용", "활용", "사용법", "practical" | 실용/활용 | -| "이론", "개념", "concept" | 개념/이론 | -| "기술", "코드", "technical", "code" | 기술/코드 | -| "인사이트", "분석", "insight" | 인사이트 | -| (매칭 없음) | **전체 균형** | - -**노트 분할 (상세 수준에 연동):** - -| 키워드 | 값 | -|--------|---| -| "단일", "하나로", "single" | 단일 노트 | -| "분할", "나눠", "주제별", "2티어", "2-tier", "split" | 주제별 분할 (2-tier) | -| "원자", "zettelkasten", "atomic" | 원자적 분할 | -| "3-tier", "계층", "tier" | 3-tier 계층 | -| (매칭 없음 + 요약) | **단일 노트** | -| (매칭 없음 + 보통) | **3-tier 계층** (기본화 — 명시 선택은 항상 우선) | -| (매칭 없음 + 상세) | **3-tier 계층** | - -**연결 수준:** - -| 키워드 | 값 | -|--------|---| -| "연결 최소", "태그만", "minimal" | 최소 | -| "연결 보통", "moderate" | 보통 | -| (매칭 없음) | **최대** | - -### 0.5-4. 부가 옵션 자동 판별 - -**이미지 추출:** - -| 키워드 | 값 | -|--------|---| -| "이미지도", "이미지 포함", "차트 포함", "그래프 포함", "images" | **true** | -| "텍스트만", "이미지 빼고", "text only" | **false** | -| (매칭 없음) | **false** (기본값 — 텍스트만 추출) | - -**PDF 처리 (PDF 입력 시만):** - -``` -PDF 파일 감지 시: - → 파일 크기 > 5MB 또는 페이지 수 > 20 → marker_single (중량 처리) - → 그 외 → Read 도구 직접 읽기 (경량 처리) -질문 없이 자동 분기합니다. -``` - -### 0.5-5. 프리셋 결과 출력 (필수!) - -자동 결정 완료 후 **반드시** 다음 테이블을 사용자에게 출력합니다 (확인용, 블로킹 아님): - -``` -**자동 프리셋 적용 결과:** - -| 항목 | 설정값 | 감지 키워드 | -|------|--------|-----------| -| 모드 | {Mode I / Mode R / Mode G} | {감지 근거} | -| 상세 수준 | {값} | {매칭 키워드 또는 "기본값"} | -| 중점 영역 | {값} | {매칭 키워드 또는 "기본값"} | -| 노트 분할 | {값} | {매칭 키워드 또는 "기본값"} | -| 연결 수준 | {값} | {매칭 키워드 또는 "기본값"} | -| 이미지 추출 | {auto/true/false} | {매칭 키워드 또는 "기본값"} | - -진행합니다... -``` - ---- - -## STEP 2: 콘텐츠 추출 (Main 직접) - -Main이 입력 소스를 직접 추출합니다. 스킬 참조: `km-content-extraction.md`, `km-youtube-transcript.md`, `km-social-media.md` - -### 소스 유형별 추출 - -| 입력 유형 | 추출 방법 | -|----------|----------| -| **YouTube** | `youtube-transcript-api` → `yt-dlp` 폴백 → 스킬: `km-youtube-transcript.md` | -| **소셜 미디어 (Threads/Instagram)** | `playwright-cli open → snapshot` ⭐ **1순위** (scrapling은 첫 포스트만 반환, SNS에서 MCP 사용 금지) | -| **일반 웹 URL** | `scrapling-crawl.py --mode dynamic` (1순위) → `--mode stealth` (2순위) → `playwright-cli` (3순위) → `WebFetch` (정적) | -| **PDF (작은)** | Read 직접 시도 (< 5MB, < 20p) | -| **PDF (큰)** | /pdf 스킬 또는 marker_single | -| **DOCX/XLSX/PPTX** | Read 또는 해당 스킬 도구 | -| **Notion URL** | mcp__notion__API-get-block-children | -| **Vault 종합 ("종합해줘")** | CLI: `"$OBSIDIAN_CLI" search` + 순차 `read` / MCP 폴백: search_vault + read_multiple_notes | - -### 이미지 URL 수집 (image_extraction != false 시) - -``` -콘텐츠 추출과 동시에 이미지 URL 수집 (인라인 모드): - -1. browser_snapshot HTML에서 img/figure 태그 파싱 -2. 필터링: < 100x100px 제외, 광고/트래커 제외, 아이콘 제외 -3. 우선순위 분류: - - auto: 차트/다이어그램/인포그래픽만 (우선순위 1-2) - - true: 모든 콘텐츠 이미지 (우선순위 1-4) -4. 경량 제한: auto 최대 5개, true 최대 10개 -5. 차트/SVG → browser_take_screenshot으로 캡처 -6. 메모리 내 리스트로 보관 (Catalog 불필요) -``` - -### 추출 결과 정리 - -``` -추출 완료 후 다음 정보를 정리: -- 제목, 저자, 날짜 -- 전체 콘텐츠 (Markdown) -- 섹션 구조 -- 미디어/이미지 URL (수집된 이미지 리스트 포함) -- 인용/참조 -``` - ---- - -## STEP 3: Vault 탐색 (Main 직접 - 순차) - -### Phase A: 그래프 탐색 (graph-navigator 로직) - -``` -1. Hub 노트 식별: - - Grep으로 [[키워드]] 패턴 검색 - Grep({ pattern: "\\[\\[.*{키워드}.*\\]\\]", path: "{VAULT_PATH}" }) - - 가장 많이 참조되는 노트 = Hub 노트 (최소 2개 식별) - -2. 1-hop 추적: - - Hub 노트 Read → 내부의 모든 [[wikilink]] 추출 - - 각 링크된 노트의 제목, 태그, 첫 3줄 확인 - - CLI: `"$OBSIDIAN_CLI" read path="..."` / MCP: mcp__obsidian__read_note / Tier 3: Read - -3. 2-hop 추적 (3-tier/원자적 선택 시): - - 1-hop 노트들의 wikilink를 한 번 더 추적 - - 간접 연결 노트 목록 생성 -``` - -### Phase A-G: GraphRAG 하이브리드 검색 (선택적 — DB 존재 시만) - -``` -VAULT_ROOT="${VAULT_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}" -DB_PATH="${VAULT_ROOT}/.team-os/graphrag/index/vault_graph.db" - -IF DB 존재: - - GraphRAG 하이브리드 검색 수행 (search_server:app 또는 graph_search.py) - - 결과를 Phase C 교차 검증에 포함 - -ELSE: - - GraphRAG DB 미존재. Phase A-G 스킵. Phase B (키워드 검색)에만 의존. - - 이것은 배포 환경에서 정상입니다. -``` - -> 배포용 경량 환경에서는 GraphRAG 미설치가 기본입니다. Phase A(wikilink 탐색) + Phase B(키워드 검색)만으로 충분히 동작합니다. - -### Phase B: 키워드 검색 (retrieval-specialist 로직) - -``` -1. 키워드 검색: - - CLI: `"$OBSIDIAN_CLI" search query="{핵심 키워드}" format=json limit=20` - - MCP: `mcp__obsidian__search_vault` (컨텍스트 포함) - - Grep: vault 전체 검색 (한국어 + 영어 키워드) - - 결과 TOP 20 정리 - -2. 태그 검색: - - CLI: `"$OBSIDIAN_CLI" tags counts sort=count format=json` - - Grep으로 tags: 또는 #태그 패턴 검색 (폴백) - -3. 폴더 기반 검색: - - vault 내 관련 폴더 식별 - - Research/ MOC 파일 검색 - - 사용자 콘텐츠 폴더 검색 -``` - -### Phase C: 교차 검증 - -``` -Graph 결과 ∩ Retrieval 결과: - -- 양쪽 모두 발견 → 핵심 노트 (확실히 관련) → 우선 처리 -- Graph에만 있음 → 관계 기반 발견 (간접 연결) → 보조 참조 -- Retrieval에만 있음 → 고립 노트 (키워드 매칭, 연결 없음) → 링크 후보 - -교차 검증 결과 테이블: -| Category | Count | Notes | -|----------|-------|-------| -| Core (양쪽 발견) | N | ... | -| Graph Only | N | ... | -| Retrieval Only | N | ... | -``` - ---- - -## STEP 4: 콘텐츠 분석 + 노트 구조 설계 - -### 4-1. 콘텐츠 분석 - -``` -추출된 콘텐츠 + vault 탐색 결과를 종합하여: - -1. 핵심 개념 추출 및 분류 -2. 자동 프리셋 반영한 깊이/초점 조정 -3. 기존 vault 노트와의 관계 분석 -``` - -### 4-2. 노트 구조 설계 - -``` -자동 프리셋 결과에 따라: - -단일 노트: - → 하나의 포괄 노트 설계 - -주제별 분할: - → 주요 주제마다 별도 노트 + MOC - -원자적 분할: - → 각 개념당 1개 노트 + MOC - -3-tier 계층: - → 메인MOC + 카테고리MOC + 원자노트 - → Research/[프로젝트명]/ 디렉토리 구조 -``` - -### 4-3. 태그 추천 - -``` -기존 vault 태그 체계 기반: -- 상태: status/open, status/resolved -- 도메인: AI-Safety, ai-agent, MCP, claude-code -- 유형: MOC, research -``` - -### 4-4. 시각화 기회 감지 - -``` -프로세스 감지 → Flowchart 제안 -시스템 구조 감지 → Architecture 제안 -비교 데이터 → 비교 테이블 제안 -``` - ---- - -## STEP 5: 노트 생성 (Main 직접!) - -**CRITICAL**: 노트 생성은 **반드시 Main이 직접** 수행합니다. - -### 5-1. Obsidian 노트 생성 - -``` -# Tier 1: CLI (우선) -"$OBSIDIAN_CLI" create path="적절한/경로/파일명.md" content="YAML frontmatter + 노트 내용" - -# Tier 2: MCP (CLI 실패 시) -mcp__obsidian__create_note({ - path: "적절한/경로/파일명.md", - content: "YAML frontmatter + 노트 내용" -}) - -# Tier 3: Write (MCP 실패 시) -Write({ file_path: "{vault_absolute_path}/적절한/경로/파일명.md", content: "..." }) -``` - -**경로 규칙** (CLAUDE.md 참조): -- vault root 기준 상대 경로 사용 -- 절대 경로 또는 중첩 prefix 금지 - -### 5-2. 3-tier 구조 (해당 시) - -3-tier 선택 시 다음 순서로 생성: -1. 원자적 노트들 (각 개념당 1개) -2. 카테고리 MOC (각 챕터당 1개) -3. 메인 MOC (전체 요약 + 모든 카테고리 MOC 링크) - -**모든 노트에 네비게이션 푸터 포함!** (km-export-formats.md 참조) - -### 5-3. 저장 검증 (필수!) - -``` -모든 create_note 호출 후: -1. 응답에서 "created successfully" 확인 -2. Glob으로 파일 존재 확인 -3. 실패 시 Write 도구로 폴백 -``` - -### 5-4. 이미지 저장 및 임베딩 (image_extraction != false 시) - -**참조 스킬**: `km-image-pipeline.md` - -``` -1. Resources/images/{topic-folder}/ 디렉토리 생성 -2. 수집된 이미지 다운로드 (curl → Playwright 폴백) -3. 노트 콘텐츠에 이미지 임베드 삽입 (본문 흐름 배치) -4. Glob으로 파일 존재 확인 -``` - -**경량 제한**: auto 최대 5개, true 최대 10개, > 2MB 이미지 스킵 - ---- - -## STEP 6: 연결 강화 + 결과 보고 - -### 6-1. 연결 강화 (연결 수준 "보통" 또는 "최대"일 때) - -상세 워크플로우: `km-link-strengthening.md` 참조 - -``` -1. 새 노트 핵심 키워드 추출 -2. CLI/MCP로 관련 노트 탐색 -3. 관련성 점수 3점 이상인 노트와 양방향 링크 생성 -4. 기존 노트에 역방향 링크 추가 -``` - -### 6-2. 결과 보고 - -``` -## 처리 결과 보고 - -### 입력 요약 -- 소스: [URL/파일/vault종합] -- 모드: 경량 자동 프리셋 (배포용) - -### 자동 프리셋 -- 상세 수준: {값} -- 중점 영역: {값} -- 노트 분할: {값} -- 연결 수준: {값} - -### Vault 탐색 결과 -| 카테고리 | 수 | 비고 | -|----------|---|------| -| 핵심 노트 (교차검증) | N | Graph ∩ Retrieval | -| 관계 기반 발견 | N | Graph only | -| 키워드 매칭 | N | Retrieval only | - -### 처리 요약 -- 검색된 관련 노트: N개 -- 교차 검증 핵심 노트: N개 -- 생성된 노트: N개 -- 추가된 양방향 링크: N개 - -### 이미지 처리 (image_extraction != false 시) -- 수집 이미지: N개 -- 다운로드 성공: N개 -- 임베딩 완료: N개 -- 저장 경로: Resources/images/{topic-folder}/ - -### 출력 위치 -| 노트 | 경로 | 상태 | -|------|------|------| -| [MOC명] | Research/... | 성공 | -| ... | ... | ... | -``` - ---- - -## 사용자 요청 내용 - -$ARGUMENTS - ---- - -## 참조 - -See `references/` for detailed procedures only when the matched step asks for them. - -- 사용 예시 · KM 변종 비교 · 참조 스킬 · Auto-Learned Patterns: [references/usage.md](references/usage.md) - ---- - -## How to Use This Skill - -Use this skill for lightweight, headless knowledge management — no interactive prompts, no notifications. Ideal for automated pipelines, distributed environments, and CLI-only setups. Ingest URLs, text, or reorganize vault structure with automatic preset detection. diff --git a/skills/knowledge-manager-lite/references/usage.md b/skills/knowledge-manager-lite/references/usage.md deleted file mode 100644 index 04da987..0000000 --- a/skills/knowledge-manager-lite/references/usage.md +++ /dev/null @@ -1,58 +0,0 @@ -# knowledge-manager-lite — 참조 (사용 예시 · 변종 비교 · 참조 스킬) - -> SKILL.md 에서 분리(Skills 2.0 ≤500). 운영 흐름은 SKILL.md, 본 파일은 on-demand 참조. - -## 참조 스킬 (상세 워크플로우) - -| 기능 | 참조 스킬 | -|------|----------| -| 전체 워크플로우 | `km-workflow.md` | -| 콘텐츠 추출 | `km-content-extraction.md` | -| **YouTube 트랜스크립트** | `km-youtube-transcript.md` | -| 소셜 미디어 | `km-social-media.md` | -| 출력 형식 | `km-export-formats.md` | -| 연결 강화 | `km-link-strengthening.md` | -| 연결 감사 | `km-link-audit.md` | -| Obsidian 노트 형식 | `zettelkasten-note.md` | -| 다이어그램 | `drawio-diagram.md` | -| **이미지 파이프라인** | `km-image-pipeline.md` | -| **Mode R: 아카이브 재편** | `km-archive-reorganization.md` | - ---- - -## /knowledge-manager-lite 와 다른 KM 변종 비교 - -| 변종 | 대상 | AskUserQuestion | 카카오 전송 | ntfy 알림 | 권장 환경 | -|------|------|-----------------|-----------|-----------|----------| -| `/knowledge-manager` | 개인 연구/창작 | 있음 (콘텐츠 설정 대화형) | 옵션 | 옵션 | 개인 데스크탑 대화형 | -| `/knowledge-manager-at` | Agent Teams 병렬 | 있음 | 옵션 | 있음 | 대용량 병렬 처리 | -| `/knowledge-manager-m` | 개인 모바일/카카오 | 카카오 수신자만 1회 | 필수 | 필수 | 운영자 개인 모바일 워크플로우 | -| **`/knowledge-manager-lite`** | **배포·공용 환경** | **없음** | **제거됨** | **제거됨** | **배포·최소 설정 환경** | - ---- - -## 사용 예시 - -```bash -# 기본 URL 정리 (기본 프리셋: 상세, 전체균형, 3-tier, 최대) -/knowledge-manager-lite https://example.com/article - -# 빠른 요약 (최소 프리셋) -/knowledge-manager-lite https://threads.net/@user/post/123 빠르게 - -# 상세 분석 -/knowledge-manager-lite https://arxiv.org/paper 꼼꼼히 - -# 실용 중심 정리 -/knowledge-manager-lite https://docs.example.com 실무용 - -# 아카이브 재편 (Mode R) -/knowledge-manager-lite Research/외부자료 아카이브 재편 - -# vault 종합 -/knowledge-manager-lite AI-Safety 주제 종합해줘 간단히 -``` - -## Auto-Learned Patterns - -- [2026-04-12] 배포 환경에서 카카오톡/ntfy 알림과 AskUserQuestion을 제거한 경량 KM 버전 분리 — 공용 환경에서 개인 알림 설정 없이 동작 가능. 키워드 기반 자동 프리셋("빠르게/꼼꼼히/실무용")으로 대체 (source: 2026-04-12-0023) diff --git a/skills/knowledge-manager-plain/SKILL.md b/skills/knowledge-manager-plain/SKILL.md deleted file mode 100644 index cc59035..0000000 --- a/skills/knowledge-manager-plain/SKILL.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: knowledge-manager-plain -description: Use when running headless or non-interactive knowledge management without AskUserQuestion, especially when $CLAUDE_DISCODE_HEADLESS=1 or the user requests --variant plain. -allowedTools: Read, Write, WebFetch, Bash, Glob, Grep ---- - -# knowledge-manager-plain - -> Implements Mode I from `contracts/km-mode-spec.md`. Plain variant per `contracts/km-variant-matrix.md` (no AskUserQuestion). - -## Trigger -- $CLAUDE_DISCODE_HEADLESS=1 + any KM Mode I request -- `/thiscode:km --variant plain ...` - -## Workflow - -1. Read `~/.thiscode-config` for vault_root. If missing, write to `$HOME/Inbox/` with notice. -2. Extract (URL/file/text) — same as km-lite Step 2. -3. Generate frontmatter — same as km-lite Step 3, but auto-derive tags from title only (no AskUserQuestion). -4. Determine sub-folder: always `Inbox/`. -5. Write via `Write` tool only (no Obsidian CLI/MCP — even if present, skip for determinism). -6. Print stored path. - -## Why no Obsidian even when present -Plain variant guarantees byte-identical output regardless of environment — important for batch ingestion and headless CI use. - ---- - -## How to Use This Skill - -Use this skill for straightforward knowledge management without Agent Teams or parallel processing. Supports Mode I (ingestion) and Mode R (reorganization). Good for single-note operations and when parallel execution is not needed. diff --git a/skills/knowledge-manager/SKILL.md b/skills/knowledge-manager/SKILL.md deleted file mode 100644 index 7e213d5..0000000 --- a/skills/knowledge-manager/SKILL.md +++ /dev/null @@ -1,433 +0,0 @@ ---- -name: knowledge-manager -description: Use when the user asks to organize or save researched content into the Obsidian vault in an environment without Agent Teams — single-agent sequential KM pipeline (extract → analyze → structure → store → link). -allowedTools: Read, Write, Bash, Glob, Grep, mcp__obsidian__*, mcp__notion__*, mcp__playwright__*, mcp__hyperbrowser__*, WebFetch, AskUserQuestion ---- - -> **Contracts**: `.claude/reference/contracts/{km-mode-spec, km-variant-matrix}.md` v0.1.0. Mode I/R/G + variant 책임 경계는 본 contracts 와 일치해야 함. - -# Knowledge Manager 호출 (단일 에이전트) - -> **이 명령어는 단일 에이전트가 모든 작업을 순차적으로 직접 수행합니다.** -> Agent Teams 풀스케일 버전: `/knowledge-manager-at` (tmux + .team-os 필요) -> 에이전트 정의: `.claude/agents/knowledge-manager.md` 참조 -> **⚡ Orchestrator Pipeline**: vault-internal 오버레이 (Linting + Filed Back + Q&A — 번들 미포함, 없으면 기본 흐름대로 진행) - ---- - -## 아키텍처 - -``` -Main (Opus 1M, 단일 세션) — Karpathy 7-Layer Fusion - └── Phase 0: /using-superpowers 게이트 + 환경 감지 + 모드/선호도 - └── Phase 1: DATA INGEST — 콘텐츠 추출 - └── Phase 2: EXTRA TOOLS — Vault 탐색 + GraphRAG (Mode I에서도 항상) - └── Phase 3: COMPILE — raw→wiki 컴파일 + Q&A 양방향 [NEW] - └── Phase 4: LINTING — /autoresearch 지식 Health Check [NEW] - └── Phase 5: KNOWLEDGE STORE — 저장 + 연결 강화 + Cross-phase 검증 - └── Phase 6: OUTPUTS + FILED BACK — 산출 + Wiki 환류 [NEW] -``` - -**어디서든 동작** (tmux 없어도, Agent Teams 없어도, VS Code/SDK에서도). - ---- - -## STEP 0: 스킬 게이트 + 환경 확인 - -> **⚠️ MANDATORY: 아래 두 스킬을 반드시 호출한 후 진행.** - -### 0-PRE. 필수 스킬 활성화 (생략 금지) - -``` -MUST: Skill("/using-superpowers") 호출 - → 적용 가능 스킬 목록 식별, 작업 순서에 매핑 - → 이 호출 없이 STEP 1 이후 진행 금지 - -참조: Orchestrator Pipeline 오버레이 (vault-internal — 번들 미포함) - → STEP 4.5에서 /autoresearch 패턴 적용 (lint 루프) -``` - -### 0-0. 환경 확인 (간소화) - -**사용자에게 표시할 필요 없음. 내부적으로 판단만 수행.** - -### Obsidian 접근 방식 확인 (3-Tier) - -```bash -OBSIDIAN_CLI="/mnt/c/Program Files/Obsidian/Obsidian.com" - -# Tier 1: CLI 확인 (우선) -"$OBSIDIAN_CLI" version 2>/dev/null -→ 응답 있으면: obsidian_method = "cli" - -# Tier 2: CLI 실패 시 MCP 확인 -mcp__obsidian__list_notes({}) → 응답 여부 -→ 응답 있으면: obsidian_method = "mcp" - -# Tier 3: 둘 다 실패 시 -→ obsidian_method = "filesystem" -→ Write/Read/Grep 도구로 직접 파일 저장 -``` - -### 0-1. 파이프라인 상태 초기화 (HARD GATE) - -``` -Bash("python3 agent-office/km-tools/km-tools.py state init") -→ JSON 응답에서 session_id 확인 -→ 이후 모든 STEP 완료 시 state complete 호출 필수: - Bash("python3 agent-office/km-tools/km-tools.py state complete STEP-N") -→ error 응답(STEP_SKIP_DETECTED) 시 즉시 중단, 누락된 STEP 실행 -``` - ---- - -## STEP 0.5: 모드 감지 (Mode Detection) - -**STEP 1 진행 전에 사용자 요청을 분석하여 모드를 결정합니다.** - -| 사용자 표현 | 모드 | -|------------|------| -| URL, "정리해줘", "분석해줘", 외부 콘텐츠 | **Mode I** (Content Ingestion) — 기존 워크플로우 | -| "아카이브 정리", "카테고리 재편", "일괄 링크", "대규모 재편" | **Mode R** (Archive Reorganization) | -| 기존 vault 폴더 50+ 파일 지칭 | **Mode R 제안** (사용자에게 확인) | -| "그래프 구축", "GraphRAG", "지식그래프", "인사이트 분석", "커뮤니티 탐색", "그래프 업데이트", "프론트매터 동기화" | **Mode G** (GraphRAG) | - -### Mode R 감지 시 - -``` -사용자 요청이 Mode R에 해당합니다. -대규모 vault 재편 모드(Mode R)로 진행할까요? - -Mode R은 다음을 수행합니다: -- Phase R0: 사전 정리 (merge conflict, dead link, 레거시 폴더) -- Phase R1: Progressive Reading + 분석 -- Phase R2: 카테고리 설계 + DA 검증 -- Phase R3: 규칙서 생성 + DA 검증 -- Phase R4: Python 배치 실행 -- Phase R5: 검증 + 보고 - -참조 스킬: km-archive-reorganization.md -``` - -**Mode R 선택 시** → `km-archive-reorganization.md` 스킬의 Phase R0-R5 실행. 아래 STEP 1-6 대신 Mode R 워크플로우를 따릅니다. - -**Mode R 추가 질문:** - -```json -AskUserQuestion({ - "questions": [ - { - "question": "재편 대상 폴더와 범위를 알려주세요.", - "header": "대상 폴더", - "options": [ - {"label": "특정 폴더", "description": "vault 내 특정 폴더 지정"}, - {"label": "전체 vault", "description": "vault 전체 재편"} - ] - }, - { - "question": "어떤 재편을 원하시나요?", - "header": "재편 범위", - "options": [ - {"label": "카테고리 재분류", "description": "파일을 새 카테고리로 재배치"}, - {"label": "링크 강화", "description": "기존 구조 유지, 교차 링크만 추가"}, - {"label": "풀 재편", "description": "카테고리 + 링크 + MOC + 시리즈 전체"} - ] - }, - { - "question": "매 배치 후 auto-commit 할까요?", - "header": "Auto-commit", - "options": [ - {"label": "예 (권장)", "description": "매 Python 배치 후 즉시 commit+push (auto-sync 경합 방지)"}, - {"label": "아니오", "description": "모든 작업 완료 후 한 번에 커밋"} - ] - } - ] -}) -``` - -### Mode G 감지 시 - -``` -사용자 요청이 Mode G에 해당합니다. -그래프 구축 모드(Mode G)로 진행할까요? - -Mode G는 다음을 수행합니다: -- Phase G0: Delta 감지 (frontmatter_hash 비교, 변경 노트 확인) -- Phase G1: 온톨로지 설계 (엔티티 타입, 관계 타입 정의) -- Phase G2: 엔티티 추출 (노트 → 그래프 엔티티 변환) -- Phase G3: 관계 구축 (엔티티 간 typed 관계 생성) -- Phase G4: 커뮤니티 탐지 (클러스터링, 커뮤니티 ID 부여) -- Phase G5: 인사이트 분석 (커뮤니티 요약, 글로벌 인사이트) -- Phase G6: Frontmatter 동기화 (graph_entity/community/connections 갱신) - -참조 스킬: km-graphrag-workflow.md -``` - -**Mode G 선택 시** → `km-graphrag-workflow.md` 스킬의 Phase G0-G6 실행. 아래 STEP 1-6 대신 Mode G 워크플로우를 따릅니다. - -**Mode I 선택 시** → 아래 STEP 1부터 기존 워크플로우 계속. - ---- - -## STEP 1: 사용자 선호도 확인 (필수!) - -**콘텐츠 처리/읽기 전에 반드시 AskUserQuestion을 호출하세요!** -**4개 질문을 한 번의 호출로 모두 물어봅니다!** - -```json -AskUserQuestion({ - "questions": [ - { - "question": "콘텐츠를 얼마나 상세하게 정리할까요?", - "header": "상세 수준", - "options": [ - {"label": "요약 (1-2p)", "description": "핵심만 간략히"}, - {"label": "보통 (3-5p)", "description": "주요 내용 + 약간의 설명"}, - {"label": "상세 (5p+) (권장)", "description": "모든 내용을 꼼꼼히"} - ], - "multiSelect": false - }, - { - "question": "어떤 영역에 중점을 둘까요?", - "header": "중점 영역", - "options": [ - {"label": "전체 균형 (권장)", "description": "모든 영역을 균형있게"}, - {"label": "개념/이론", "description": "핵심 아이디어와 원리"}, - {"label": "실용/활용", "description": "사용법, 예시, 튜토리얼"}, - {"label": "기술/코드", "description": "구현, 아키텍처, 코드"} - ], - "multiSelect": false - }, - { - "question": "노트를 어떻게 분할할까요?", - "header": "노트 분할", - "options": [ - {"label": "3-tier 계층 (기본)", "description": "메인MOC + 카테고리MOC + 원자노트"}, - {"label": "주제별 분할 (2-tier)", "description": "주요 주제마다 별도 노트 (MOC 포함)"}, - {"label": "원자적 분할", "description": "최대한 작은 단위로 분할 (Zettelkasten)"}, - {"label": "단일 노트", "description": "모든 내용을 하나의 노트에 — 선택 시 그대로 적용"} - ], - "multiSelect": false - }, - { - "question": "기존 노트와 얼마나 연결할까요?", - "header": "연결 수준", - "options": [ - {"label": "최대 (기본)", "description": "태그 + 링크 + 기존 노트와 자동 연결 탐색"}, - {"label": "보통", "description": "태그 + 관련 노트 링크 제안"}, - {"label": "최소", "description": "태그만 추가"} - ], - "multiSelect": false - } - ] -}) -``` - -> 단일 에이전트 버전에서는 RALPH/DA 관련 질문이 없습니다 (미사용). - -> **기본값 정책 (전 변형 공통)**: 사용자가 답하지 않거나 AskUserQuestion 불가 컨텍스트(자율 봇·배치·헤드리스)에서는 **노트 분할 = 3-tier 계층, 연결 수준 = 최대**를 기본값으로 적용한다. 단 요약 분량(1-2p)은 단일 노트 carve-out. **사용자가 단일 노트·2-tier(주제별)·원자적을 명시 선택하면 그 선택이 항상 우선** — 기본값은 미지정 시에만 작동한다. - -> **파일 ingest 변환 fallback = kordoc**: 입력이 로컬 문서 파일인데 기본 경로(Read·기존 어댑터)로 충실히 못 읽는 형식 — **HWP·HWPX, 표 복잡한 XLSX/DOCX, 한국어 PDF** — 은 [kordoc](https://github.com/chrisryugj/kordoc)으로 md 변환 후 STEP 진행: `npx kordoc -d ` (PDF는 `pdfjs-dist@4` peer 필요 — v6 비호환 실측). 변환 md 는 원문 보존 검증(표 행수·수치 표본 대조) 후 사용. - -### 이미지 추출 판별 (키워드 감지 시에만 활성화) - -| 사용자 표현 | image_extraction | 근거 | -|------------|-----------------|------| -| "이미지", "이미지도", "이미지 포함" | **true** (모든 콘텐츠 이미지, 최대 15개) | 명시적 요청 | -| "그래프", "차트", "다이어그램", "그래프 포함" | **auto** (차트/다이어그램만, 최대 10개) | 시각 자료 요청 | -| "텍스트만", "이미지 제외" | **false** | 명시적 제외 | -| (키워드 없음) | **false** | 기본값 — 텍스트만 추출 | - -> **이미지 추출은 사용자가 관련 키워드를 명시할 때만 활성화됩니다.** -> `/knowledge-manager-at`은 항상 자동 추출합니다. -> 참조 스킬: `km-image-pipeline.md` - -> **퀵 프리셋은 `/knowledge-manager-m` 전용입니다.** 이 커맨드에서는 항상 STEP 1 질문을 수행합니다. - ---- - -## STEP 1.5: PDF 처리 방식 확인 (PDF인 경우만!) - -PDF 파일이 입력된 경우에만 이 질문을 합니다: - -```json -AskUserQuestion({ - "questions": [ - { - "question": "대용량 PDF입니까? /pdf 스킬로 처리하시겠습니까?", - "header": "PDF 처리", - "options": [ - {"label": "아니오 (기본)", "description": "Read로 직접 읽기 시도"}, - {"label": "예", "description": "/pdf 스킬로 전체 변환 후 처리"} - ], - "multiSelect": false - } - ] -}) -``` - -- **"아니오"** → Read로 직접 읽기 -- **"예"** → `marker_single "파일.pdf" --output_format markdown --output_dir ./km-temp` - ---- - -## STEP 2: 콘텐츠 추출 (Main 직접) - -Main이 입력 소스를 직접 추출합니다. 스킬 참조: `km-content-extraction.md`, `km-youtube-transcript.md`, `km-social-media.md` - -### 소스 유형별 추출 - -| 입력 유형 | 추출 방법 | -|----------|----------| -| **YouTube** | `youtube-transcript-api` → `yt-dlp` 폴백 → 스킬: `km-youtube-transcript.md` | -| **소셜 미디어 (Threads/Instagram)** | `playwright-cli open → snapshot` ⭐ **1순위** (scrapling은 첫 포스트만 반환, SNS에서 MCP 사용 금지) | -| **일반 웹 URL** | `scrapling-crawl.py --mode dynamic` (1순위) → `--mode stealth` (2순위) → `playwright-cli` (3순위) → `WebFetch` (정적) | -| **PDF (작은)** | Read 직접 시도 (< 5MB, < 20p) | -| **PDF (큰)** | /pdf 스킬 또는 marker_single | -| **DOCX/XLSX/PPTX** | Read 또는 해당 스킬 도구 | -| **Notion URL** | mcp__notion__API-get-block-children | -| **Vault 종합 ("종합해줘")** | CLI: `"$OBSIDIAN_CLI" search` + 순차 `read` / MCP 폴백: search_vault + read_multiple_notes | - -### 증분 처리 — 중복 소스 감지 + 변경점 자동 추출 (Incremental Processing) - -> **Andrej Karpathy 원칙: "새 소스가 도착하면 LLM이 읽고, 핵심 정보를 추출하고, 기존 위키에 통합한다."** -> 단순히 "있는지 없는지"만 보는 게 아니라, **"뭐가 바뀌었는지"까지 자동으로 추출**해야 한다. - -``` -추출 완료 직후, vault에 동일 소스가 이미 존재하는지 확인: - -1. 소스 감지 (3단계 탐색): - a) URL 매칭: Grep("source: {추출된_URL}", vault_path) - b) 제목/키워드 매칭: CLI: "$OBSIDIAN_CLI" search query="{소스 제목}" format=json - c) 폴더 매칭: 소스명에서 프로젝트명 추출 → vault 내 동명 폴더 탐색 - (예: "CC101" → Library/Research/CC101-Guide/ 폴더 발견) - -2. 판정: - - 기존 노트 없음 → 신규 처리 (기존 흐름 계속) - - 기존 노트 발견 → 사용자에게 질문: - "이 소스는 이미 처리된 적이 있습니다: {기존_노트_경로} - 1) 업데이트 (변경점 추출 → 기존 노트에 반영) - 2) 새로 생성 (별도 노트로 생성) - 3) 스킵 (처리 중단)" - -3. 업데이트 모드 — 변경점 자동 추출 (km-tools diff): - a) 기존 노트를 임시 파일로 저장, 새 추출 콘텐츠도 임시 파일로 저장 - b) km-tools diff 실행: - Bash("python3 agent-office/km-tools/km-tools.py diff {existing_tmp} {new_tmp}") - → JSON 응답의 sections 배열: NEW/CHANGED/REMOVED/RENAMED 자동 분류 - → markdown 필드: "## 변경점 요약" 섹션 텍스트 (draft에 직접 삽입 가능) - c) 변경점 분류 (km-tools가 자동 수행): - - [NEW] 새로 추가된 섹션/콘텐츠 - - [CHANGED] 내용이 수정된 섹션 (유사도 점수 포함) - - [REMOVED] 삭제된 섹션 - - [RENAMED] 이름/번호가 변경된 섹션 - d) 변경점 요약을 STEP 4로 전달 (draft에 "## 변경점 요약" 섹션 자동 생성) -``` - -### 추출 결과 정리 - -``` -추출 완료 후 다음 정보를 정리: -- 제목, 저자, 날짜 -- 전체 콘텐츠 (Markdown) -- 섹션 구조 -- 미디어/이미지 URL -- 인용/참조 -- [증분 모드 시] 기존 노트 대비 변경된 부분만 표시 -``` - -### 이미지 URL 수집 (image_extraction != false 일 때) - -콘텐츠 추출과 **동시에** 이미지 정보도 수집합니다: - -``` -1. 웹 URL: browser_snapshot에서 img/figure 요소의 src, alt, 주변 heading 수집 - - 필터링: km-image-pipeline.md 기준 (< 100x100px 제외, 광고 도메인 제외) - - auto 모드: 차트/다이어그램만 (우선순위 1-2), 최대 10개 - - 차트/그래프 감지: canvas/SVG → browser_take_screenshot -2. PDF: marker 출력의 images/ 폴더 스캔 -3. 수집 결과를 메모리에 보관 (별도 파일 불필요): - collected_images = [ - { type: "chart", url: "...", context: "...", placement: "..." }, - ... - ] -``` - -> 참조 스킬: `km-content-extraction.md` 2F, `km-image-pipeline.md` - ---- - -## STEP 3: Vault 탐색 (Main 직접 - 순차) - -See `references/` for detailed procedures only when the matched step asks for them. - -> **전체 절차 = [references/vault-search.md](references/vault-search.md) Read 후 수행** (Phase A 그래프 / A-G GraphRAG 하이브리드 / B 키워드 / C 교차검증). progressive disclosure. - -## STEP 4~5.5: COMPILE → LINTING → STORE → PROPAGATE - -> **전체 절차 = [references/steps-compile-store.md](references/steps-compile-store.md) 를 Read 후 그대로 수행** (progressive disclosure — SKILL.md ≤500). -- STEP 4 COMPILE: raw→wiki draft 생성 -- STEP 4.5 LINTING: 지식 Health Check (HARD GATE — 통과 draft만 STORE) -- STEP 5 STORE: 노트 저장 (3-Tier CLI→MCP→Write) -- STEP 5.5 PROPAGATE: 기존 노트 업데이트 (Wiki Pattern) - -## STEP 6: 연결 강화 + 결과 보고 - -### 6-1. 연결 강화 (연결 수준 "보통" 또는 "최대"일 때) - -상세 워크플로우: `km-link-strengthening.md` 참조 - -``` -1. 새 노트 핵심 키워드 추출 -2. CLI `"$OBSIDIAN_CLI" search` / MCP search_vault로 관련 노트 탐색 - - CLI `"$OBSIDIAN_CLI" deadends` → 나가는 링크 없는 파일 = 연결 강화 우선 후보 (format 옵션 미지원, 플레인 텍스트 목록 반환) -3. 관련성 점수 3점 이상인 노트와 양방향 링크 생성 -4. CLI `"$OBSIDIAN_CLI" append` / MCP update_note로 기존 노트에 역방향 링크 추가 - - CLI `"$OBSIDIAN_CLI" prepend` → 네비게이션 헤더 추가 시 사용 -``` - -### 6-2. Filed Back — 환류 (Explorations add up) - -> **Karpathy 핵심: "모든 탐색은 Wiki로 환류된다."** -> 이번 세션에서 생성된 산출물과 발견을 Wiki에 축적한다. - -``` -1. 이번 세션 산출물 목록화: - - 생성된 노트 목록 - - STEP 4.5 lint에서 발견된 인사이트 - - STEP 4.5-1 규칙 3 "Suggest new articles" 결과 - -2. 환류 실행: - - lint 과정에서 발견된 기존 노트 오류 → 해당 노트 수정 - - "Suggest new articles" 항목 → Open Questions 노트 생성 - 경로: Library/Research/{프로젝트명}/Open-Questions-{날짜}.md - - Open Questions는 다음 KM 세션의 탐색 시드가 된다 - -3. 환류 노트 생성 (Open Questions가 있을 때): - --- - title: "Open Questions — {주제}" - tags: [status/open, research, open-questions] - source_session: "{날짜} KM 세션" - --- - ## 탐색 시드 (다음 세션용) - - [ ] {질문 1} — 출처: {관련 draft 노트} - - [ ] {질문 2} — 출처: {lint 규칙 3에서 제안} - - [ ] {질문 3} — 출처: {Q&A 미답변} -``` - -### 6-3. 결과 보고 - -``` -## 결과 보고 · Vault 동기화 · 참조 스킬 - -> 상세 = [references/reporting-sync.md](references/reporting-sync.md) (결과 보고 템플릿 · STEP7 WSL→Win 동기화 · 참조 스킬 표 · Auto-Learned). - -## 사용자 요청 내용 - -$ARGUMENTS - ---- - -## How to Use This Skill - -Use this skill for full-featured knowledge management with all interactive features — AskUserQuestion prompts, variant selection, detailed content settings. Default choice for personal vault operations with full UI/notification support. diff --git a/skills/knowledge-manager/references/reporting-sync.md b/skills/knowledge-manager/references/reporting-sync.md deleted file mode 100644 index 6611bc1..0000000 --- a/skills/knowledge-manager/references/reporting-sync.md +++ /dev/null @@ -1,188 +0,0 @@ -# knowledge-manager — 결과 보고 / Vault 동기화 / 참조 스킬 / Auto-Learned - -> SKILL.md 에서 분리. 보고·동기화·참조는 on-demand. - -## 처리 결과 보고 - -### 입력 요약 -- 소스: [URL/파일/vault종합] -- 모드: 단일 에이전트 순차 처리 (Orchestrator Pipeline) - -### Vault 탐색 결과 -| 카테고리 | 수 | 비고 | -|----------|---|------| -| 핵심 노트 (교차검증) | N | Graph ∩ GraphRAG ∩ Retrieval | -| GraphRAG 연관 | N | 커뮤니티 기반 발견 | -| 관계 기반 발견 | N | Graph only | -| 키워드 매칭 | N | Retrieval only | - -### Lint 결과 (STEP 4.5) -- lint_score: {score} / 1.0 (통과 기준: 0.7) -- 반복 횟수: {round}/3 -- 주요 수정: [inconsistency N건, missing data N건, connections N건] - -### 처리 요약 -- 검색된 관련 노트: N개 -- 교차 검증 핵심 노트: N개 -- 생성된 노트: N개 -- 추가된 양방향 링크: N개 - -### Filed Back (환류) -- 기존 노트 수정: N건 -- Open Questions 생성: N건 → {경로} -- 다음 세션 탐색 시드: N개 - -### 이미지 처리 (image_extraction != false 시) -- 수집 이미지: N개 -- 다운로드 성공: N개 -- 임베딩 완료: N개 -- 저장 경로: Resources/images/{topic-folder}/ - -### 출력 위치 -| 노트 | 경로 | 상태 | -|------|------|------| -| [MOC명] | Research/... | 성공 | -| [Open Questions] | Research/.../Open-Questions-... | 환류 | -| ... | ... | ... | - -### 파이프라인 실행 체크 (STEP 스킵 방지) -> ⚠️ 아래 체크리스트에서 미실행 STEP이 있으면 보고 전에 반드시 실행. - -- [ ] STEP 2: 콘텐츠 추출 (증분 감지 포함) -- [ ] STEP 3: Vault 탐색 (GraphRAG 포함) -- [ ] STEP 4: COMPILE (draft 생성 + Q&A + 모순 표기) -- [ ] STEP 4.5: LINTING (6가지 규칙 + lint_score) -- [ ] STEP 5: STORE (Cross-phase 검증 + 저장) -- [ ] STEP 5.5: PROPAGATE (기존 노트 업데이트) -- [ ] STEP 6-1: 연결 강화 (양방향 wikilink) -- [ ] STEP 6-2: Filed Back (환류 + Open Questions) -- [ ] STEP 6-4: 엔티티 페이지 제안 -- [ ] STEP 6-5: 세션 로그 (_km-log.md append) -- [ ] STEP 7: Vault 동기화 -``` - -### 6-4. 엔티티 페이지 자동 생성 제안 - -> **Andrej Karpathy 패턴: log.md는 시간순, 추가 전용(append-only), grep 파싱 가능.** - -``` -STEP 6 결과 보고 완료 후, vault의 _km-log.md에 자동 append: - -LOG_PATH = "Library/Research/_km-log.md" - -# 파일 미존재 시 생성: -IF NOT Glob(vault_path + "/" + LOG_PATH): - CLI: "$OBSIDIAN_CLI" create path="{LOG_PATH}" content="--- -title: Knowledge Manager 세션 로그 -type: log -tags: [km, log] ---- -# KM Session Log -> 추가 전용. grep 파싱: grep '^## \[' _km-log.md | tail -10 -" - -# 세션 기록 append: -CLI: "$OBSIDIAN_CLI" append path="{LOG_PATH}" content=" -## [{날짜}] {모드} | {소스 제목} -- 소스: {URL 또는 파일명} -- 생성: {N} notes, 업데이트: {N} notes, 링크: {N} -- lint_score: {score}, coverage: {rate}% -- propagation: {N} notes touched -- open_questions: {N} -- filed_back: {N} items -" -``` - -### 6-5. 세션 로그 자동 기록 (_km-log.md) — 모든 작업 완료 후 마지막 - -> **Karpathy 패턴: 엔티티별 전용 페이지가 있어야 새 소스마다 정보가 축적된다.** - -``` -STEP 5.5 Propagation 중 발견된 엔티티 중, -vault에 전용 페이지가 없는 주요 엔티티를 식별: - -1. GraphRAG entities에서 centrality 상위 엔티티 추출 -2. 각 엔티티에 대해 vault 노트 존재 여부 확인: - Grep("^title:.*{entity_name}", vault_path) 또는 - CLI: "$OBSIDIAN_CLI" search query="{entity_name}" format=json limit=5 - -3. 전용 페이지 없는 엔티티 → 생성 제안 목록에 추가: - "다음 엔티티에 대한 전용 페이지를 만들까요?" - - {entity_name} (centrality: {score}, 언급 횟수: {count}) - -4. 사용자 승인 시 엔티티 페이지 생성: - --- - title: "{entity_name}" - type: entity-page - tags: [{관련 태그}] - graph_entity: "{entity_id}" - auto_generated: true - --- - # {entity_name} - ## 개요 (자동 생성 — 관련 노트에서 종합) - ## 관련 소스 (자동 누적) - ## 연결 -``` - ---- - -## STEP 7: Vault 동기화 (WSL→Windows) - -**노트 생성/수정 후 반드시 실행.** WSL에서 `/mnt/c/` 경로로 직접 쓰면 Windows Obsidian이 즉시 감지하지 못할 수 있습니다. - -```bash -# Obsidian vault 파일 시스템 동기화 (touch로 mtime 갱신) -find "" -name "*.md" -newer /tmp/.km-sync-marker -exec touch {} + 2>/dev/null - -# 또는 rsync로 WSL→Windows 강제 동기화 (생성/수정된 파일만) -rsync -av --update --include="*.md" --exclude="*" \ - "/Library/" \ - "/Library/" \ - 2>/dev/null || true -``` - -**간단 버전 (새로 생성한 파일만):** -```bash -# 생성한 노트의 mtime을 강제 갱신 → Obsidian 파일와쳐 트리거 -for f in {새로 생성한 파일 경로들}; do - touch "$f" 2>/dev/null -done -``` - -> 이 단계 이후 Obsidian에서 노트가 보이지 않으면 `Ctrl+R`(Obsidian 리로드) 안내. - ---- - -## 참조 스킬 (상세 워크플로우) - -| 기능 | 참조 스킬 | -|------|----------| -| **Orchestrator Pipeline 오버레이** | (vault-internal — 번들 미포함) | -| 전체 워크플로우 | `km-workflow.md` | -| 콘텐츠 추출 | `km-content-extraction.md` | -| **YouTube 트랜스크립트** | `km-youtube-transcript.md` | -| 소셜 미디어 | `km-social-media.md` | -| 출력 형식 | `km-export-formats.md` | -| 연결 강화 | `km-link-strengthening.md` | -| 연결 감사 | `km-link-audit.md` | -| Obsidian 노트 형식 | `zettelkasten-note.md` | -| 다이어그램 | `drawio-diagram.md` | -| **이미지 파이프라인** | `km-image-pipeline.md` | -| **Mode R: 아카이브 재편** | `km-archive-reorganization.md` | -| **Mode R: 규칙 엔진** | `km-rules-engine.md` | -| **Mode R: 배치 실행** | `km-batch-python.md` | -| **Mode G: GraphRAG 워크플로우** | `km-graphrag-workflow.md` | -| **Mode G: 온톨로지 설계** | `km-graphrag-ontology.md` | -| **Mode G: 그래프 검색** | `km-graphrag-search.md` | -| **Mode G: 인사이트 리포트** | `km-graphrag-report.md` | -| **Mode G: Frontmatter 동기화** | `km-graphrag-sync.md` | - ---- - - - -## Auto-Learned Patterns - -- [2026-04-04] STEP 0에 /using-superpowers 강제 게이트를 삽입해야 스킬 호출 누락을 방지할 수 있다 — 없으면 파이프라인 전체 무효화 위험 (source: 2026-04-04-1732.md) -- [2026-04-05] 증분 모드에서 소스 감지는 URL 매칭만이 아닌 3단계 탐색(URL + 제목 + 폴더)이 필요하다 — 단일 매칭 방식은 근본 결함 (source: 2026-04-05-0349.md) -- [2026-04-05] STEP 6-3 결과 보고에 파이프라인 실행 체크리스트를 포함해야 STEP 스킵을 방지할 수 있다 (source: 2026-04-05-0339.md) diff --git a/skills/knowledge-manager/references/steps-compile-store.md b/skills/knowledge-manager/references/steps-compile-store.md deleted file mode 100644 index bedd125..0000000 --- a/skills/knowledge-manager/references/steps-compile-store.md +++ /dev/null @@ -1,454 +0,0 @@ -# knowledge-manager — STEP 4~5.5 상세 (COMPILE / LINTING / STORE / PROPAGATE) - -> SKILL.md 에서 분리(Skills 2.0 ≤500, progressive disclosure). 본 STEP 실행 시 본 파일을 Read 해 그대로 수행. - -## STEP 4: COMPILE — raw→wiki 컴파일 (draft 생성) - -> **Orchestrator 핵심: "raw → wiki는 컴파일이다."** -> 이 단계의 출력은 **draft** — 아직 확정이 아니다. -> draft는 STEP 4.5 Linting을 통과해야만 STEP 5에서 저장된다. - -### 4-1. 콘텐츠 분석 (Compile Phase 1) - -``` -추출된 콘텐츠 (STEP 2) + vault 탐색 결과 (STEP 3)를 종합하여: - -1. 핵심 개념 추출 및 분류 -2. 사용자 선호도 반영한 깊이/초점 조정 -3. 기존 vault 노트와의 관계 분석 -4. [NEW] 모순 즉시 표기 (Orchestrator Ingest 패턴): - - STEP 3 교차검증 Core 노트의 핵심 주장 추출 - - 새 소스의 주장과 비교 - - 모순 발견 시 draft에 인라인 표기: - "⚠️ 모순: 기존 [[노트명]]에서는 ~라고 했으나, 이 소스에서는 ~" - - lint 단계를 기다리지 않고 컴파일 시점에 바로 표기 - - 참고: 이미 표기된 모순은 STEP 4.5 lint 규칙 1에서 중복 탐지하지 않음 (dedupe) -``` - -### 4-2. 노트 구조 설계 (Compile Phase 2) - -``` -사용자 선택에 따라: - -단일 노트: - → 하나의 포괄 노트 설계 - -주제별 분할: - → 주요 주제마다 별도 노트 + MOC - -원자적 분할: - → 각 개념당 1개 노트 + MOC - -3-tier 계층: - → 메인MOC + 카테고리MOC + 원자노트 - → Research/[프로젝트명]/ 디렉토리 구조 -``` - -### 4-3. 태그 추천 - -``` -기존 vault 태그 체계 기반: -- 상태: status/open, status/resolved -- 도메인: AI-Safety, ai-agent, MCP, claude-code -- 유형: MOC, research -``` - -### 4-4. 시각화 기회 감지 - -``` -프로세스 감지 → Flowchart 제안 -시스템 구조 감지 → Architecture 제안 -비교 데이터 → 비교 테이블 제안 -``` - -### 4-5. Draft 노트 생성 (Compile Phase 3) - -``` -위 분석 결과를 바탕으로 draft Wiki 노트를 메모리에 생성. -(아직 Vault에 저장하지 않는다 — STEP 5에서 lint 통과 후 저장) - -draft 생성 시 포함: -- YAML frontmatter (tags, author, date, source) -- 본문 (Markdown, wikilink 포함) -- Mine/ vs Library/ 경로 결정 (5-0 라우팅 규칙 사전 적용) - -[증분 모드 시 필수] "## 변경점 요약" 섹션: - 이 섹션이 없으면 draft는 lint 불통과. 반드시 포함해야 한다. - --- - ## 변경점 요약 (vs 기존 노트) - ### 추가된 내용 [NEW] - - {섹션/내용}: {요약} - ### 수정된 내용 [CHANGED] - - {섹션}: {기존} → {변경} - ### 삭제된 내용 [REMOVED] - - {섹션}: (삭제됨) - ### 구조 변경 [RENAMED/REORDERED] - - {변경 사항} - --- -``` - -### 4-6. Q&A 양방향 보강 - -``` -컴파일된 draft에서 추가 질문을 도출하여 품질을 높인다: - -1. draft에서 "아직 답하지 못한 질문" 3개 도출 - - 본문에서 언급되었으나 설명이 부족한 개념 - - 관련 주제인데 draft가 다루지 않은 영역 - - 기존 vault 노트와 연결 가능하지만 근거가 불충분한 주장 - -2. STEP 3 enriched_context에서 답변 탐색 - - 교차 검증 Core 노트에서 답변 검색 - - GraphRAG 커뮤니티 관련 노트에서 보강 정보 확인 - -3. 답변 발견 시 → draft에 반영 (본문 보강) - 답변 미발견 시 → draft에 "## Open Questions" 섹션 추가 - - Open Questions는 다음 KM 세션의 탐색 시드가 된다 -``` - ---- - -## STEP 4.5: LINTING — 지식 Health Check - -> **⚠️ Orchestrator 핵심: "지식에도 Linting이 필요하다."** -> draft 노트의 품질을 검증하고 자동 수정하는 health check 루프. -> **lint 통과 전까지 STEP 5 저장 진행 금지.** -> 참조 스킬: Orchestrator Pipeline 오버레이 (vault-internal — 번들 미포함, 없으면 본 단계 기본 흐름대로) - -### 4.5-1. Lint 규칙 6가지 - -``` -1. Find inconsistencies (모순 탐지) - - draft 노트 vs 기존 vault 노트 간 모순/불일치 - - 같은 개념에 대한 상충 설명, 날짜 오류, 사실관계 충돌 - - STEP 3 교차검증 Core 노트와 비교 - -2. Impute missing data (누락 보완) - - frontmatter 누락 필드 (tags, author, date, source) - - 본문에서 언급되었으나 정의되지 않은 용어 - - wikilink 대상이 vault에 존재하지 않는 경우 → forward ref 표시 - -3. Suggest new articles (신규 노트 제안) - - draft가 다루지 않은 관련 주제 식별 - - "이 노트가 있으면 vault 그래프가 더 촘촘해질 것" 후보 - - Open Questions에서 파생 가능한 독립 노트 주제 - -4. Find connections (숨겨진 연결 발견) - - draft와 기존 vault 노트 사이의 숨겨진 연결 - - 태그 공유, 개념 유사, 동일 GraphRAG 커뮤니티 소속 - - STEP 3 교차검증에서 "Retrieval Only"였던 고립 노트와의 연결 시도 - -5. Source coverage check (원문 커버리지 검증) ← LKB self-improve 패턴 - [신규 모드] 원문 키포인트 → draft 커버리지 매핑 → MISSING 보충 - [증분 모드] 원문 변경점 → 기존 노트 반영 여부 검증 → 미반영 항목 표기 - - 증분 시 "## 변경점 요약" 섹션이 draft에 없으면 → lint 실패 (HARD GATE) - -6. Orphan detection (고아 페이지 탐지) ← Orchestrator Lint 패턴 - - CLI: "$OBSIDIAN_CLI" orphans → 들어오는 링크(inbound) 없는 페이지 목록 - - CLI: "$OBSIDIAN_CLI" deadends → 나가는 링크(outbound) 없는 페이지 목록 - - 고아 페이지 중 draft와 관련된 것 → wikilink 연결 제안 - - 장기 고아 (30일+ 미연결) → 삭제 또는 통합 제안 - - STEP 2에서 추출한 원문의 주요 섹션/키포인트 목록 생성 - - draft의 각 섹션이 원문 키포인트를 커버하는지 매핑 - - 커버리지 매트릭스: 원문 섹션 × COVERED/MISSING - - 미커버 포인트 → lint 이슈로 등록 → draft에 보충 또는 Open Questions로 이동 - - "원문에서 이 부분을 빠뜨렸습니다: {섹션명}" 피드백 - - 웹 소스 시: 빠뜨린 부분에 대해 WebSearch로 보충 정보 자동 탐색 (선택적) -``` - -### 4.5-2. lint_score 채점 (km-tools 자동 계산) - -``` -LLM이 3개 지표를 0.0-1.0으로 평가한 후 km-tools로 실제 계산: - -Bash("python3 agent-office/km-tools/km-tools.py lint {draft_path} --consistency {X} --suggestions {Y} --coverage {Z}") - -→ completeness (frontmatter 5필드) + connections (wikilink 수)는 Python이 자동 계산 -→ consistency, suggestions, coverage는 LLM이 인자로 전달 -→ 가중 합산: consistency×0.25 + completeness×0.20 + connections×0.20 + suggestions×0.15 + coverage×0.20 -→ passed=true (≥ 0.7) 시 STEP 5 진행 -→ passed=false 시 수정 후 재실행 (최대 3회) -→ LLM 인자 누락 시 해당 지표 0.0 + warnings 배열에 경고 -``` - -### 4.5-3. Lint 반복 루프 (/autoresearch 패턴) - -``` -baseline = lint_score(draft) # 초기 측정 - -FOR round IN 1..3: # 최대 3회 반복 (무한루프 방지) - IF lint_score ≥ 0.7: - → PASS. "Lint 통과 (score={lint_score}, round={round})" - → STEP 5로 진행 - → BREAK - - # 6가지 규칙 실행 → 문제 목록 생성 - issues = run_lint_rules(draft) - - # draft 수정 (가장 심각한 이슈부터) - draft = fix_issues(draft, issues) - - # 재측정 - new_score = lint_score(draft) - - # /autoresearch 판정: 개선 시 keep, 악화 시 discard - IF new_score > prev_score: - → keep: "Lint R{round}: {prev_score} → {new_score} (+{delta})" - prev_score = new_score - ELSE: - → discard: 수정 롤백, 다른 접근 시도 (keep/discard 단순 판정) - draft = rollback(draft) - -IF lint_score < 0.7 after 3 rounds: - → lint_status = "WARN" (미통과이나 lint는 실행됨) - → "Lint 미통과 (score={lint_score}). 최선 draft로 진행합니다." - → STEP 5 진행 가능 (lint를 실행했으므로 게이트 통과) - → 단, 보고서에 lint 미통과 사유 + 잔여 이슈 목록 필수 포함 -``` - ---- - -## STEP 5: STORE — 노트 저장 (lint 통과된 draft만!) - -**CRITICAL**: 노트 생성은 **반드시 Main이 직접** 수행합니다. -**CRITICAL**: **STEP 4.5 lint를 실행한 draft만 저장한다.** lint 미실행(스킵) 시 이 단계 진입 금지. -> lint_status가 "PASS" 또는 "WARN"이면 진행 가능. lint 자체를 실행하지 않은 경우만 차단. - -### 5-PRE. Cross-phase 검증 (저장 직전 최종 확인) - -``` -저장 전 3가지 Cross-phase 검증 수행: - -1. 제목 중복 체크: - Grep("^# {draft_title}", vault_path) 또는 - CLI: "$OBSIDIAN_CLI" search query="{draft_title}" → 동일 제목 노트 존재 여부 - → 중복 시: 기존 노트에 append 또는 제목 변경 제안 - -2. 태그 일관성 체크: - draft의 tags vs STEP 4.5에서 확정된 tags 비교 - → 불일치 시: lint 확정 태그로 교정 - -3. 이미지:임베딩 비율 체크 (image_extraction != false 시): - 수집된 이미지 수 vs 본문 ![[]] 임베딩 수 - → 불일치 시: 누락 임베딩 추가 또는 미사용 이미지 제거 -``` - -### 5-1. Obsidian 노트 생성 - -``` -# Tier 1: CLI (우선) -"$OBSIDIAN_CLI" create path="적절한/경로/파일명.md" content="YAML frontmatter + 노트 내용" - -# Tier 2: MCP (CLI 실패 시) -mcp__obsidian__create_note({ - path: "적절한/경로/파일명.md", - content: "YAML frontmatter + 노트 내용" -}) - -# Tier 3: Write (MCP 실패 시) -Write({ file_path: "{vault_absolute_path}/적절한/경로/파일명.md", content: "..." }) -``` - -**경로 규칙** (CLAUDE.md 참조): -- Vault root = `AI_Second_Brain` -- 경로는 vault root 기준 상대 경로 -- `AI_Second_Brain/`를 prefix로 붙이지 말 것! - -### 5-0. 저장 경로 결정 (CRITICAL — 모든 노트 생성 전 필수!) - -**Mine/ vs Library/ 라우팅**: 노트 생성 전 반드시 아래 규칙으로 경로를 결정합니다. - -``` -Q: "이 콘텐츠의 원저자가 vault 주인(owner)인가?" - -YES → Mine/ 하위: - - 얼룩소 원문 → Mine/얼룩소/ - - 본인 Threads/SNS 원문 → Mine/Threads/ - - 참고 자료 → Resources/ - - 에세이/분석/에버그린 → Mine/Essays/ - - 업무 산출물 (CV 등) → Mine/Projects/ - -NO → Library/ 하위 (기본): - - YouTube/웹 정리 → Library/Zettelkasten/{적절한 주제폴더}/ - - 대규모 리서치 (3-tier) → Library/Research/{프로젝트명}/ - - 외부 Threads → Library/Threads/ - - 학술 논문 → Library/Papers/ - - 웹 클리핑/가이드 → Library/Clippings/ - - 기타 외부 리소스 → Library/Resources/ -``` - -**판별 시그널 (우선순위)**: -1. author 필드 = vault 주인 핸들(사용자 CLAUDE.md 에 선언) → Mine/ -2. source URL에 본인 핸들 포함 → Mine/Threads/ -3. tags에 본인 핸들 포함 → Mine/ -4. 위 해당 없음 → Library/ - -### 5-0-PLUS. 기존 상위 MOC parent 자동 등록 (2026-04-21 운영 규율) - -> **"하나의 문서, 복수 MOC 소속."** Phase A0 `candidate_parent_mocs` 중 -> 작성자·주제와 일치하는 MOC를 새 노트 frontmatter `parent` 필드에 복수 등록. - -``` -IF len(candidate_parent_mocs) > 0: - matched_mocs = [moc for moc in candidate_parent_mocs if moc.score >= 3] - # 기준: 작성자 일치(+3) 또는 태그 2개+ 일치 - - IF len(matched_mocs) > 0: - # 최대 3개까지 복수 소속 허용 - new_note.frontmatter.parent = [ - f'"[[{moc.name}]]"' for moc in matched_mocs[:3] - ] - # YAML 다중값 예시: - # parent: - # - "[[기초부터-시작하는-AI생활-specal1849-MOC]]" - # - "[[specal1849-전체-MOC]]" - ELSE: - # 딱 맞는 상위 MOC 없음 → STEP 4.5 lint 규칙 3 "Suggest new articles" - # 에서 "작성자/주제 허브 MOC 신설" 자동 제안 - lint_suggestions.append({ - "type": "new_hub_moc", - "reason": "저자·주제 일치 상위 MOC 부재 — 신설 고려" - }) -``` - -**실제 적용 근거**: 2026-04-21 specal1849 임베딩편 저장 시 이 규율로 parent 2개(카테고리 + 작성자 허브) 소속 구조 완성. - -### 5-2. 3-tier 구조 (해당 시) - -3-tier 선택 시 다음 순서로 생성: -1. 원자적 노트들 (각 개념당 1개) -2. 카테고리 MOC (각 챕터당 1개) -3. 메인 MOC (전체 요약 + 모든 카테고리 MOC 링크) - -**모든 노트에 네비게이션 푸터 포함!** (km-export-formats.md 참조) - -### 5-3. 저장 검증 (필수!) - -``` -모든 create_note 호출 후: -1. 응답에서 "created successfully" 확인 -2. Glob으로 파일 존재 확인 -3. 실패 시 Write 도구로 폴백 -``` - -### 5-4. 이미지 저장 및 임베딩 (image_extraction != false 시) - -**참조 스킬**: `km-image-pipeline.md` - -``` -1. Resources/images/{topic-folder}/ 디렉토리 생성: - Bash("mkdir -p /AI_Second_Brain/Resources/images/{topic-folder}/") - -2. 수집된 이미지 다운로드: - 웹 이미지: Bash("curl -sLo '{경로}' '{url}'") - PDF 이미지: Bash("cp km-temp/{name}/images/{file} '{경로}'") - 실패 시: Playwright 스크린샷 폴백 - -3. 노트 콘텐츠에 이미지 임베드 삽입 (본문 흐름 배치!): - - 개념 설명 → (빈 줄) → ![[Resources/images/{topic-folder}/{filename}]] → (빈 줄) → 상세 설명 - - 이미지 연속 배치 금지 (반드시 텍스트로 분리) - -4. 검증: - Glob("AI_Second_Brain/Resources/images/{topic-folder}/*") → 파일 존재 확인 -``` - -**auto 모드 제한**: 차트/다이어그램만, 최대 10개, > 2MB 이미지 스킵 - ---- - -## STEP 5.5: PROPAGATE — 기존 노트 업데이트 (Orchestrator Wiki Pattern) - -> **Orchestrator 핵심: "단일 소스가 10-15개 기존 위키 페이지를 터치한다."** -> 새 노트를 생성하는 것만으로는 지식이 복리로 쌓이지 않는다. -> 기존 노트에 새 정보를 반영해야 위키가 compounding artifact가 된다. - -### 5.5-0. 상위 MOC 역링크 자동 추가 (2026-04-21 운영 규율) - -> 새 노트가 `parent` 필드로 등록한 상위 MOC에 역방향 wikilink 등록. 중복 방지. - -``` -FOR EACH parent_moc IN new_note.frontmatter.parent: - 1. parent_moc 파일 Read - 2. 적절한 섹션 탐색 (우선순위): - - "## 📚 시리즈 구성" 또는 "## 📖 원자 노트" - - "## 🗺️ 시리즈 MOC" (작성자 허브 MOC용) - - "## 관련 노트" - - 섹션 미발견 시: 파일 끝에 "## 📎 자동 등록 노트" 섹션 신설 - 3. 중복 체크: 기존 내용에 `[[{new_note_name}]]` 존재 여부 → 있으면 skip - 4. append: - - 시리즈/카테고리 MOC: "- [[{new_note_name}]] — {한 줄 설명}" - - 작성자 허브 MOC: "- {한 줄 설명} — [[{new_note_name}]]" - 5. parent_moc frontmatter `graph_connections`에 - `"{new_note_name} (contains)"` 추가 (기존 리스트에 append) -``` - -**실제 적용 근거**: 2026-04-21 specal1849 허브 구축 시 이 규율로 6개 MOC에 parent 역링크 전파. 수동 수행을 자동화로 승격. - -### 5.5-1. 핵심 엔티티/개념 추출 - -``` -새로 저장된 draft에서 핵심 엔티티와 개념을 추출: - -1. frontmatter tags에서 주요 키워드 추출 -2. 본문 heading(##)에서 주제어 추출 -3. wikilink 대상 노트 목록 수집 -4. GraphRAG entities 테이블에서 관련 엔티티 조회 (DB 존재 시): - Bash("python3 -c \"import sqlite3, os; db=os.environ.get('DB_PATH') or os.popen('git rev-parse --show-toplevel 2>/dev/null').read().strip()+'/.team-os/graphrag/index/vault_graph.db'; c=sqlite3.connect(db).cursor(); [print(r) for r in c.execute(\\\"SELECT name, source_note FROM entities WHERE name LIKE '%{키워드}%' LIMIT 20\\\")]\"") -``` - -### 5.5-2. 기존 노트 업데이트 대상 식별 - -``` -추출된 엔티티/개념으로 업데이트 대상 노트 탐색: - -1. wikilink 역추적: - Grep("\\[\\[{draft_title}\\]\\]", vault_path) → 이미 이 노트를 참조하는 기존 노트 - -2. 동일 태그 노트: - CLI: "$OBSIDIAN_CLI" tags path="{관련폴더}" → 동일 태그를 가진 노트 - -3. GraphRAG 커뮤니티 소속 노트: - 같은 community_id를 가진 다른 엔티티의 source_note - -4. MOC/인덱스 노트: - 해당 주제의 MOC에 새 노트가 아직 등록되지 않았으면 등록 대상 - -→ 업데이트 대상 목록 (최대 15개, 관련도순 정렬) -``` - -### 5.5-3. 업데이트 실행 - -``` -FOR EACH target_note IN update_targets (최대 15개): - - 1. target_note Read → 현재 내용 확인 - - 2. 업데이트 유형 판별: - a) MOC/인덱스 → 새 노트 항목 추가 (append) - b) 엔티티/개념 페이지 → "## 최근 업데이트" 또는 관련 섹션에 새 정보 추가 - c) 관련 주제 노트 → "## 관련 노트" 섹션에 wikilink 추가 - d) 모순 발견 → "⚠️ 모순" 인라인 표기 + 태그 추가 - - 3. 업데이트 실행: - CLI: "$OBSIDIAN_CLI" append path="{target_path}" content="{추가 내용}" - 또는 MCP: mcp__obsidian__update_note (surgical edit 필요 시) - 또는 Write (폴백) - - 4. 변경 기록: - propagation_log에 추가: {target_note, update_type, content_added} -``` - -### 5.5-4. Propagation 보고 - -``` -## Propagation 결과 -- 업데이트 대상 식별: N개 -- 실제 업데이트: N개 - - MOC/인덱스 등록: N건 - - 정보 추가: N건 - - wikilink 추가: N건 - - 모순 표기: N건 -- 스킵 (변경 불필요): N건 -``` - ---- diff --git a/skills/knowledge-manager/references/vault-search.md b/skills/knowledge-manager/references/vault-search.md deleted file mode 100644 index 81a4da5..0000000 --- a/skills/knowledge-manager/references/vault-search.md +++ /dev/null @@ -1,125 +0,0 @@ -# knowledge-manager — STEP 3 Vault 탐색 상세 (Phase A / A-G / B / C) - -> SKILL.md 에서 분리(Skills 2.0 ≤500). STEP 3 실행 시 본 파일 Read 후 그대로 수행. - -## STEP 3: Vault 탐색 (Main 직접 - 순차) - -### Phase A0: MOC 우선 탐색 (2026-04-21 운영 규율) - -> **"상위 MOC부터 보도록."** 원자 노트보다 상위 MOC를 먼저 식별해 -> (1) 기존 카테고리 파악 + (2) 새 노트의 parent 후보 선확정. - -``` -1. MOC 후보군 수집 (vault 전역): - - Grep frontmatter type: `grep -rlE '^type:.*-?MOC' {vault_path}/Library/` - - Grep tags MOC: `grep -rlE '^\s*-\s*MOC\b|MOC/' {vault_path}/Library/` - - 파일명 규칙: find "{vault_path}/Library/" -name "*-MOC*.md" - -2. 관련도 점수 계산 (각 후보 MOC에 대해): - - 작성자 일치 (MOC.author == 새 콘텐츠 author) → +3 - - 태그 교집합 → +2 per tag - - 주제 키워드 부분 일치 → +1 - -3. 상위 5개 MOC를 `candidate_parent_mocs`에 저장 - → STEP 4.5 lint 규칙 4(connections) + STEP 5-0-PLUS + STEP 5.5-0에서 활용 -``` - -### Phase A: 그래프 탐색 (graph-navigator 로직) - -``` -1. Hub 노트 식별: - - Grep으로 [[키워드]] 패턴 검색 - Grep({ pattern: "\\[\\[.*{키워드}.*\\]\\]", path: "" }) - - 가장 많이 참조되는 노트 = Hub 노트 (최소 2개 식별) - -2. 1-hop 추적: - - Hub 노트 Read → 내부의 모든 [[wikilink]] 추출 - - 각 링크된 노트의 제목, 태그, 첫 3줄 확인 - - CLI: `"$OBSIDIAN_CLI" read path="..."` / MCP: mcp__obsidian__read_note / Tier 3: Read - -3. 2-hop 추적 (3-tier/원자적 선택 시): - - 1-hop 노트들의 wikilink를 한 번 더 추적 - - 간접 연결 노트 목록 생성 -``` - -### Phase A-G: GraphRAG 하이브리드 검색 (Dense + Sparse + Reranker) - -> **⚡ Mode I에서도 항상 실행.** GraphRAG 검색은 Mode G 전용이 아니다. -> Orchestrator 원칙: "Search/CLI tools는 모든 컴파일에 참여한다." -> DB 미존재 시에만 스킵 (graceful fallback). - -``` -VAULT_ROOT="${VAULT_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}" -DB_PATH="${VAULT_ROOT}/.team-os/graphrag/index/vault_graph.db" -INDEX_DIR="${VAULT_ROOT}/.team-os/graphrag/index" - -IF DB 존재 (Mode I, Mode G 모두 해당): - 1. 하이브리드 검색 (Dense Embedding + FTS5 Sparse + Reranker): - Bash("python3 .team-os/graphrag/scripts/graph_search.py hybrid '{키워드}' --top-k 20 2>/dev/null || echo '[]'") - → JSON 결과 파싱: results[].entity, results[].source_note, results[].score, results[].source - → 실패 시 기존 LIKE 폴백: - Bash("python3 -c \"import sqlite3; c=sqlite3.connect('{DB_PATH}').cursor(); [print(r) for r in c.execute(\\\"SELECT name, type, description, source_note FROM entities WHERE name LIKE '%{키워드}%' OR name_ko LIKE '%{키워드}%' LIMIT 20\\\")]\"") - - 2. 관계 탐색 (1-2홉): - 발견된 엔티티의 source/target 관계 조회: - Bash("python3 -c \"import sqlite3; c=sqlite3.connect('{DB_PATH}').cursor(); [print(r) for r in c.execute(\\\"SELECT r.type, e2.name, e2.source_note FROM relationships r JOIN entities e2 ON r.target_id=e2.id WHERE r.source_id IN (SELECT id FROM entities WHERE name LIKE '%{키워드}%') LIMIT 30\\\")]\"") - - 3. 커뮤니티 연관 노트: - 엔티티가 속한 커뮤니티의 다른 멤버 조회: - Bash("python3 -c \"import sqlite3; c=sqlite3.connect('{DB_PATH}').cursor(); [print(r) for r in c.execute(\\\"SELECT DISTINCT e2.name, e2.source_note FROM entities e1 JOIN entities e2 ON e1.community_id=e2.community_id WHERE e1.name LIKE '%{키워드}%' AND e2.name!=e1.name LIMIT 15\\\")]\"") - - > sqlite3 CLI가 미설치된 환경에서도 Python sqlite3 모듈로 동작합니다. - - 4. 결과를 graphrag_results에 저장 → Phase C 교차 검증에 포함 - -ELSE: - → GraphRAG DB 미존재. Phase A-G 스킵. - → 안내: "GraphRAG 빌드가 필요합니다. /km Mode G 또는 매일 20:00 자동 빌드를 기다려주세요." -``` - -> **Phase A-G는 Phase A(wikilink)와 병행 실행 가능.** 둘 다 읽기 전용이므로 충돌 없음. -> 하이브리드 검색이 Dense Embedding(시멘틱) + FTS5(키워드) + Reranker를 자동 결합합니다. -> embedding index 미존재 시 기존 LIKE 검색으로 graceful fallback합니다. - -### Phase B: 키워드 검색 (retrieval-specialist 로직) - -``` -1. 키워드 검색: - - CLI: `"$OBSIDIAN_CLI" search query="{핵심 키워드}" format=json limit=20` → 파일 목록 반환 - - 컨텍스트 필요 시: MCP `mcp__obsidian__search_vault` 사용 (매칭 라인 컨텍스트 포함) - - ⚠️ CLI `search:context`는 v1.12.4에서 불안정 (exit 255) → CLI `search` + MCP 컨텍스트로 대체 - - Grep으로 vault 전체 검색 (한국어 + 영어 키워드) - - 결과 TOP 20 정리 - -2. 태그 검색: - - CLI: `"$OBSIDIAN_CLI" tags counts sort=count format=json` → vault 전체 태그 + 빈도 - - CLI: `"$OBSIDIAN_CLI" tags path="{관련폴더}" format=json` → 폴더 한정 태그 - - Grep으로 tags: 또는 #태그 패턴 검색 (폴백) - - 관련 태그 식별 및 해당 노트 수집 - -3. 폴더 기반 검색: - - Library/Zettelkasten/ 하위 관련 폴더 식별 - - Library/Research/ MOC 파일 검색 - - Mine/ 하위 사용자 직접 작성 콘텐츠 검색 -``` - -### Phase C: 교차 검증 - -``` -3-way 교차 검증: Graph(A) ∩ GraphRAG(A-G) ∩ Retrieval(B): - -- 3가지 모두 발견 → 최우선 핵심 노트 (강한 확신) -- 2가지에서 발견 → 핵심 노트 (높은 확신) → 우선 처리 -- Graph(A)에만 있음 → wikilink 기반 발견 (구조적 연결) → 보조 참조 -- GraphRAG(A-G)에만 있음 → 의미적 연관 발견 (엔티티/커뮤니티 기반) → 보조 참조 -- Retrieval(B)에만 있음 → 고립 노트 (키워드 매칭, 연결 없음) → 링크 후보 - -교차 검증 결과 테이블: -| Category | Count | Notes | -|----------|-------|-------| -| Core (양쪽 발견) | N | ... | -| Graph Only | N | ... | -| Retrieval Only | N | ... | -``` - ---- diff --git a/skills/search-lite/SKILL.md b/skills/search-lite/SKILL.md deleted file mode 100644 index 461cb01..0000000 --- a/skills/search-lite/SKILL.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -name: search-lite -description: Use when searching the vault in a minimal or distributed environment without GraphRAG — Obsidian CLI / MCP / Grep 3-Tier cascade. -allowedTools: Bash, Read, Glob, Grep, mcp__obsidian__* ---- - -# /search-lite — vault 통합 검색 (경량 배포용) - -$ARGUMENTS - -> **이 커맨드는 GraphRAG 서버를 사용하지 않습니다.** 로컬에 Python uvicorn 서버나 KuzuDB가 없어도 동작합니다. -> 풀스펙 버전(`/search`)는 GraphRAG 하이브리드 검색을 사용하며 별도 인프라가 필요합니다. -> 배포·최소 환경용 버전이 이 `/search-lite`입니다. - - -## Phase 0: 모드 결정 - -query = "$ARGUMENTS" - -IF query가 비어있으면: - → "사용법: `/search-lite <질문>` or `/search-lite --deep <질문>`" - → "예시: `/search-lite MCP란?` | `/search-lite --deep 프롬프트 엔지니어링 기법 비교`" - → 종료 - -### 플래그 파싱 -- `--quick` 또는 `-q` → **QUICK** (플래그 제거 후 나머지가 query) -- `--deep` 또는 `-d` → **DEEP** (플래그 제거 후 나머지가 query) -- 플래그 없음 → **AUTO** - -### AUTO 라우팅 - -DEEP: 문장형 5단어+, "~하려면/방법/비교/차이/관계/영향", 분석 요청("설명해줘/정리해줘"), 복수 개념("A vs B"), 방법론("어떻게/왜") -QUICK: 그 외 (키워드 1-3개, 정의형 "~란?", 노트 찾기) - - - -## Vault 경로 결정 - -우선순위: -1. 환경변수 `OBSIDIAN_VAULT_PATH` 설정 시 사용 -2. CLAUDE.md 프로젝트 컨텍스트에 명시된 vault 경로 -3. 현재 작업 디렉토리가 `.obsidian/` 폴더를 포함하면 그것이 vault root -4. 상위 디렉토리 탐색 (최대 3레벨 위까지) — `.obsidian/` 감지 - -모두 실패 시: -→ "vault 경로를 찾을 수 없습니다. 환경변수 OBSIDIAN_VAULT_PATH를 설정하거나, vault 폴더 안에서 실행해주세요." -→ 종료 - - - -## 공통 검색 엔진 — 3-Tier Cascade (GraphRAG 미사용) - -### Tier 1 — Obsidian CLI (우선, 설치되어 있을 경우) - -```bash -# Windows(WSL 포함) -"/mnt/c/Program Files/Obsidian/Obsidian.com" search "${QUERY}" --vault "${VAULT_NAME}" --format json 2>/dev/null - -# macOS -open "obsidian://search?vault=${VAULT_NAME}&query=${QUERY_ENCODED}" - -# 검색 결과 JSON 파싱 → 상위 N개 추출 -``` - -CLI 부재 또는 exit 255(알려진 버그) 시 → Tier 2로 폴백. - -### Tier 2 — Obsidian MCP (CLI 실패 시) - -``` -mcp__obsidian__simple_search({ - query: "${QUERY}", - context_length: 100 -}) -``` - -MCP 서버 미연결 시 → Tier 3로 폴백. - -### Tier 3 — Grep 직접 검색 (비상 폴백) - -```bash -# vault 전체 grep -grep -rn "${QUERY}" "${VAULT_PATH}" --include="*.md" 2>/dev/null | head -50 - -# 또는 frontmatter tag 검색 -grep -rln "^tags:.*${TAG}" "${VAULT_PATH}" --include="*.md" -``` - -### 모드별 파라미터 -- **QUICK**: 상위 5개 결과, 노트 읽기 1-2개 -- **DEEP**: 상위 10개 결과, 노트 읽기 3-5개 - - - -## QUICK 모드 — 즉답 (3-5줄) - -### 노트 읽기 -검색 결과 상위 1-2개의 파일을 Read: -- vault 루트 기준 상대 경로로 접근 -- frontmatter + 첫 문단/핵심 섹션만 추출 - -### 출력 -``` -**답변:** -[3~5줄 직접 답변. 노트 내용 기반.] - -**근거 노트:** -1. **[노트 제목]** — [핵심 한 줄] (`경로`) -2. **[노트 제목]** — [핵심 한 줄] (`경로`) -``` - - - -## DEEP 모드 — 상세 분석 - -### 노트 읽기 (CRITICAL) -검색 결과 상위 3-5개의 파일을 실제 Read: -- 각 노트에서 제목, 요약, 핵심 섹션 추출 -- 여러 노트 내용을 종합 - -### 답변 합성 -읽은 노트 내용을 종합하여 **질문에 직접 답변**. 번호 목록, 테이블, 단계별 설명 활용. - -### 출력 -``` -## {질문 요약} - -{답변 본문. 구조화된 분석.} - -### 출처 -1. [[노트1]] — {핵심 정보 1줄} (`경로`) -2. [[노트2]] — {핵심 정보 1줄} (`경로`) -3. [[노트3]] — {핵심 정보 1줄} (`경로`) -``` - - - -## 제약 - -- **읽기 전용**: 노트 생성/수정 금지 -- **hallucination 금지**: 반드시 실제 노트 내용 기반 -- **노트에 없는 내용**: "vault에 관련 자료가 없습니다" 명시 -- **출처 필수**: 실제 읽은 노트 경로 표기 -- **질문/스킬/에이전트 스폰 금지**: 직접 검색만 수행 -- **상태 메시지 금지**: 바로 결과 출력 -- Read 실패 시 건너뛰고 다음 노트 시도 -- QUICK: 5줄 이내 + 출처 1-2개 -- DEEP: 제한 없음 + 출처 3-5개 - -### 결과 없음 -``` -vault에서 "{query}" 관련 자료를 찾지 못했습니다. -/knowledge-manager-lite로 자료를 수집해보세요. -``` - - - -## /search-lite 와 /search 차이점 - -| 항목 | /search (풀스펙) | /search-lite (경량) | -|------|-----------------|-------------------| -| 엔진 | GraphRAG 하이브리드 (Dense+Sparse+Entity+Decomposed) | Obsidian CLI/MCP/Grep 3-Tier | -| 의존성 | Python uvicorn(8400), KuzuDB, embedding index | Obsidian 또는 grep만 | -| 정확도 | 높음 (의미 기반 + 엔티티 그래프) | 중간 (텍스트 매칭 기반) | -| 속도 | 100-500ms (서버 warm 시) | 50-300ms (vault 크기에 따라) | -| 설치 | .team-os/graphrag 필요 + 일일 빌드 cron | 설치 불필요 (Obsidian/grep만) | -| 권장 환경 | 연구/창작/분석 | **배포·개인 PC 최소 환경** | - - ---- - -## Auto-Learned Patterns - -- [2026-04-12] 배포 환경에서 GraphRAG 서버 의존성 없는 경량 검색 커맨드를 `/search`에서 분리 생성 — 3-Tier Cascade(Obsidian CLI → MCP → Grep) 구조로 설치 없이 동작. `/search`와 동일한 QUICK/DEEP/AUTO 라우팅 유지 (source: 2026-04-12-0021) - ---- - -## How to Use This Skill - -Use this skill for lightweight, headless vault search without interactive mode selection. Pass `--quick` or `--deep` for immediate mode choice. Ideal for automated queries and non-interactive environments. diff --git a/skills/search/SKILL.md b/skills/search/SKILL.md deleted file mode 100644 index 4603b2a..0000000 --- a/skills/search/SKILL.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -name: search -description: Use when the user asks to search the vault or find notes by concept — GraphRAG-backed unified search with quick (direct answer) or deep (analysis) depth. -allowedTools: Bash, Read, Glob, Grep ---- - -> **Contract**: `.claude/reference/contracts/search-fallback-4tier.md` v0.1.0. Tier 순서·인터페이스는 본 contract 와 일치해야 함. drift 감지: `~/code/thiscode/scripts/km-version.sh`. - -# /search — vault 통합 검색 - -$ARGUMENTS - - -## Phase 0: 모드 결정 - -query = "$ARGUMENTS" - -IF query가 비어있으면: - → "사용법: `/search <질문>` or `/search --deep <질문>`" - → "예시: `/search MCP란?` | `/search --deep 프롬프트 엔지니어링 기법 비교`" - → 종료 - -### 플래그 파싱 -- `--quick` 또는 `-q` → **QUICK** (플래그 제거 후 나머지가 query) -- `--deep` 또는 `-d` → **DEEP** (플래그 제거 후 나머지가 query) -- 플래그 없음 → **AUTO** - -### AUTO 라우팅 - -DEEP: 문장형 5단어+, "~하려면/방법/비교/차이/관계/영향", 분석 요청("설명해줘/정리해줘"), 복수 개념("A vs B"), 방법론("어떻게/왜") -QUICK: 그 외 (키워드 1-3개, 정의형 "~란?", 노트 찾기) - - - -## Phase 0.5: MOC 우선 라우팅 (공통 — 2026-04-21 운영 규율) - -**"상위 MOC부터 보도록."** 검색 결과 중 MOC 성격 노트를 최상위로 고정한다. - -### MOC 판별 -다음 중 하나라도 참이면 MOC로 간주: -- frontmatter `type` 값에 `MOC` 포함 (예: `MOC`, `author-hub-MOC`, `series-category-MOC`) -- frontmatter `tags:`에 `MOC` 또는 `MOC/*` 포함 -- 파일명에 `-MOC` 포함 - -판별 Bash (각 source_note에 대해): -```bash -grep -lE '^type:.*-?MOC|^\s*-\s*MOC\b|MOC/' "{source_note}" 2>/dev/null || \ - basename "{source_note}" | grep -qE '\-MOC' -``` - -### 재정렬 규칙 -1. 검색 결과를 MOC / 원자 노트로 분류 -2. 상위 **최대 3개 MOC를 맨 위로 고정** (score 순) -3. 원자 노트는 그 아래, 기존 점수 순 유지 -4. 표시: `📌 상위 MOC (N)` 섹션 + `📄 원자 노트 (N)` 섹션 분리 - -### Why -- 운영 규율(2026-04-21): 문서가 많아질수록 원자 나열은 찾기·업데이트 어려움 → MOC가 허브·진입점 역할 -- MOC를 먼저 보면 해당 주제의 카테고리·관련 시리즈를 한눈에 파악 가능 - -### 플래그 -- `--no-moc` → MOC 제외, 원자 전용 모드 (Phase 0 플래그 파싱에 추가) -- MOC 0개 시 `📌` 섹션 생략 (자동) - - - -## 공통 검색 엔진 — GraphRAG → Obsidian CLI fallback (QUICK/DEEP 동일) - -내용 recall 기본값은 GraphRAG입니다. GraphRAG가 불가하거나 실패하면 Obsidian CLI full-text를 2순위 안전망으로 사용합니다. CLI는 파일명·frontmatter·본문·wikilink를 찾지만 relevance ranking이 약하므로 흔한 질의는 `limit=1000`까지 확장합니다. - -### 1차 — FastAPI 서버 (port 8400): -```bash -QUERY_ENCODED=$(python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "${QUERY}") -curl -s "http://127.0.0.1:8400/api/search?q=${QUERY_ENCODED}&top_k=${TOP_K}&mode=hybrid" --connect-timeout 3 -``` - -> Weight params removed 2026-07-29 (contract v0.2.0): hard-coded client weights silently overrode the server's launch-config weights (the SoT). Clients MUST NOT pass channel weights. - -### 2차 — Obsidian CLI fallback (GraphRAG 불가·실패 시): -```bash -OBSIDIAN_CLI="/Applications/Obsidian.app/Contents/MacOS/obsidian-cli" -"$OBSIDIAN_CLI" search query="${QUERY}" format=json limit=1000 -``` - -### 3차 — GraphRAG CLI fallback (FastAPI만 불가 시): -```bash -# repo root 및 python 실행기 자동 감지 (Mac venv 우선, 없으면 시스템 python3) -for REPO_ROOT in ; do - [ -d "$REPO_ROOT/.team-os/graphrag/scripts" ] && break -done -PY="python3" -[ -x "$REPO_ROOT/.team-os/graphrag/.venv/bin/python" ] && PY="$REPO_ROOT/.team-os/graphrag/.venv/bin/python" -cd "$REPO_ROOT" && PYTHONPATH=".team-os/graphrag/scripts" "$PY" .team-os/graphrag/scripts/graph_search.py hybrid "${QUERY}" --rerank --top-k ${TOP_K} --json 2>/dev/null -``` - -### 4차 — 비상 폴백: -vault-search MCP → Grep 순서로 폴백. 이 경우 답변에 "GraphRAG 서버 미실행으로 텍스트 검색 결과입니다" 명시. - -### 모드별 파라미터 -- **QUICK**: top_k=5, 노트 읽기 1-2개 -- **DEEP**: top_k=10, 노트 읽기 3-5개 - - - -## QUICK 모드 — 즉답 (3-5줄) - -### 노트 읽기 -검색 결과 상위 1-2개의 source_note만 Read: -- vault 경로 (Mac): `/{source_note}` -- vault 경로 (WSL): `/{source_note}` -- 실패 시 repo 경로 시도: Mac `/AI_Second_Brain/{source_note}` · WSL `/{source_note}` -- frontmatter + 첫 문단/핵심 섹션만 추출 - -### 출력 -``` -**답변:** -[3~5줄 직접 답변. 노트 내용 기반.] - -📌 **상위 MOC** (N) — Phase 0.5 재정렬 반영 -1. **[[MOC 제목]]** — [범위·역할 한 줄] (`경로`) - -📄 **원자 노트** (N) -1. **[노트 제목]** — [핵심 한 줄] (`경로`) -2. **[노트 제목]** — [핵심 한 줄] (`경로`) -``` - -> MOC 0개 시 `📌` 섹션 생략. `--no-moc` 플래그 시 MOC 제외. - - - -## DEEP 모드 — 상세 분석 - -### 노트 읽기 (CRITICAL) -검색 결과 상위 3-5개의 source_note를 실제 Read: -- vault 경로 (Mac): `/{source_note}` -- vault 경로 (WSL): `/{source_note}` -- 실패 시 repo 경로 시도: Mac `/AI_Second_Brain/{source_note}` · WSL `/{source_note}` -- 각 노트에서 제목, 요약, 핵심 섹션 추출 - -### 답변 합성 -읽은 노트 내용을 종합하여 **질문에 직접 답변**. 번호 목록, 테이블, 단계별 설명 활용. - -### 출력 -``` -## {질문 요약} - -{답변 본문. 구조화된 분석.} - -### 📌 상위 MOC (진입점) — Phase 0.5 재정렬 반영 -1. [[MOC1]] — {범위·역할 1줄} (`경로`) - -### 📄 원자 노트 (출처) -1. [[노트1]] — {핵심 정보 1줄} (`경로`) -2. [[노트2]] — {핵심 정보 1줄} (`경로`) -3. [[노트3]] — {핵심 정보 1줄} (`경로`) -``` - -> MOC 0개 시 `📌` 섹션 생략. `--no-moc` 플래그 시 MOC 제외. - - - -## 제약 - -- **읽기 전용**: 노트 생성/수정 금지 -- **hallucination 금지**: 반드시 실제 노트 내용 기반 -- **노트에 없는 내용**: "vault에 관련 자료가 없습니다" 명시 -- **출처 필수**: 실제 읽은 노트 경로 표기 -- **질문/스킬/에이전트 스폰 금지**: 직접 검색만 수행 -- **상태 메시지 금지**: 바로 결과 출력 -- Read 실패 시 건너뛰고 다음 노트 시도 -- QUICK: 5줄 이내 + 출처 1-2개 -- DEEP: 제한 없음 + 출처 3-5개 - -### 결과 없음 -``` -vault에서 "{query}" 관련 자료를 찾지 못했습니다. -/knowledge-manager로 자료를 수집해보세요. -``` - - ---- - -## How to Use This Skill - -Use this skill for intelligent vault search with automatic mode selection (quick/deep). Supports 4-tier fallback (GraphRAG → Obsidian CLI → vault-search MCP → ripgrep), MOC prioritization, and flexible query depth. Main entry point for vault queries. diff --git a/skills/slack-configure/SKILL.md b/skills/slack-configure/SKILL.md index e5ebd80..5d68b69 100644 --- a/skills/slack-configure/SKILL.md +++ b/skills/slack-configure/SKILL.md @@ -398,7 +398,7 @@ sed -e "s||${BOT_NAME}|g" \ 🔴 위 sed 3종은 시작일 뿐이다 — 템플릿에는 자리표시자가 종류별로 12~19개 있고(2026-08-06 루돌프 WSL round 2 실측: general-assistant 15종 중 12종이 꺾쇠 stub 그대로 실려 **SOUL-CAPSULE 블록 통째가 속 빈 껍데기**가 됐다), 고정 sed 목록을 늘리는 방식은 템플릿이 바뀔 때마다 같은 병이 재발한다. 이 스킬의 실행 주체는 Claude 세션이므로 남은 자리는 **에이전트가 직접 채운다**: -0. 🔴 **조사 먼저 — 즉석 창작 금지** (2026-08-06 재경님 지시: "실제 스킬 사용때는 자료조사하고 vault조사하고 하면서 제대로 찾아야 합니다"): 자리를 채우기 **전에** 그 사용자의 실제 맥락을 근거로 수집한다 — ⓐ워크스페이스에 vault·노트가 있으면 검색(`/search`·knowledge-manager·grep)으로 실제 어휘·업무 영역·반복 작업을 훑고 ⓑ기존 봇 soul.md 들이 있으면 어휘·경계 규약을 대조하고 ⓒ둘 다 없는 환경(신규 사용자)이면 **사용자에게 짧은 인터뷰**(주 업무 2~3개·자주 쓰는 말투/단어·봇이 하면 안 되는 일 1개)로 받는다. `$BOT_NAME`·`$ROLE_DESC` 만 보고 지어내면 결과가 **일반 비서 톤으로 수렴**한다 — 같은 경고가 Discord 판에 이미 실측으로 박혀 있다(create-bot SKILL.md "실제 코퍼스를 먼저 수집" 절: 상상으로 채우면 어떤 모티브든 비슷한 비서 톤 수렴, 사용자가 "봇 특성을 못 살린다"고 느끼는 1순위 원인). 2026-08-06 WSL 라이브에서도 조사 없이 채운 캡슐이 "노트 정리를 갈무리해 돕는 일반 비서"로 수렴했다 — 그럴듯한 창작 ≠ 그 사용자의 실제 맥락. +0. 🔴 **조사 먼저 — 즉석 창작 금지** (2026-08-06 재경님 지시: "실제 스킬 사용때는 자료조사하고 vault조사하고 하면서 제대로 찾아야 합니다"): 자리를 채우기 **전에** 그 사용자의 실제 맥락을 근거로 수집한다 — ⓐ워크스페이스에 vault·노트가 있으면 검색(`/km:search`·grep)으로 실제 어휘·업무 영역·반복 작업을 훑고 ⓑ기존 봇 soul.md 들이 있으면 어휘·경계 규약을 대조하고 ⓒ둘 다 없는 환경(신규 사용자)이면 **사용자에게 짧은 인터뷰**(주 업무 2~3개·자주 쓰는 말투/단어·봇이 하면 안 되는 일 1개)로 받는다. `$BOT_NAME`·`$ROLE_DESC` 만 보고 지어내면 결과가 **일반 비서 톤으로 수렴**한다 — 같은 경고가 Discord 판에 이미 실측으로 박혀 있다(create-bot SKILL.md "실제 코퍼스를 먼저 수집" 절: 상상으로 채우면 어떤 모티브든 비슷한 비서 톤 수렴, 사용자가 "봇 특성을 못 살린다"고 느끼는 1순위 원인). 2026-08-06 WSL 라이브에서도 조사 없이 채운 캡슐이 "노트 정리를 갈무리해 돕는 일반 비서"로 수렴했다 — 그럴듯한 창작 ≠ 그 사용자의 실제 맥락. 1. **잔여 전수 나열**: `command grep -n '<[^>]*>' "$BOT_DIR/soul.md"` 2. **각 자리를 0번 조사 결과를 근거로 채운다**(Edit 도구) — `$BOT_NAME`·`$ROLE_DESC`·`$SOUL_TYPE` 맥락에 맞게. 특히 SOUL-CAPSULE 안의 `<페르소나 어휘 마커 1~3개>`·`<시그니처 1~3>`·`<경계 1줄>`·`<출력·언어 규약 1줄>`이 핵심이다 — 여기가 비면 "매 응답 자가 점검" 규율이 작동하지 않는다. **시그니처 이모지 1~3종**도 여기서 정한다(2026-08-06 재경님 요청 "각 봇별로 이모지 다르게") — 캡슐에 "반응(react)은 주로 `<이모지1>`·`<이모지2>` 를 쓴다" 1줄을 넣으면 봇마다 다른 이모지로 반응한다. 0번 조사 결과(그 사용자·봇 성격에 맞는 이모지)를 근거로 고른다. 단 **지어낼 수 없는 실 ID 계열**(`<@본인 봇 ID>` 등)은 날조하지 말고 `(Step 15-A에서 실측 기입)` 마커로 바꿔둔다. 3. **Slack 맥락화**: 템플릿은 Discord 판 공용이라 Discord 전용 문구가 남는다 — "Discord DM/mention 수신 시" → Slack 등가로, `mcp__plugin_discord_discord__reply` 도구 지시 → "Slack 응답은 `slack-channel` MCP reply 도구로만" 으로 치환. **Slack 봇에게 Discord 도구를 시키는 문장이 남으면 조용한 오작동을 유발한다**(루돌프 실측: 생성된 soul.md L83). 🔴 **같은 자리에 DM thread_ts 캐치 1줄을 덧붙인다**(2026-08-10, 루돌프 실측 — DM 1:1 답장이 댓글 스레드로 접히는 결함. 코드 레이어 방어는 `claude-channel-server/src/server.ts` handleReply에 별도로 있지만, 모델이 규칙을 모르면 애초에 `thread_ts`를 넘기는 시도 자체가 반복된다): "DM(1:1)에서는 `reply` 도구에 `thread_ts`를 넘기지 않는다 — 받은 메시지의 ts를 되돌려 넣으면 1:1 대화가 댓글 스레드로 접힌다. 인바운드 `` 태그에 `thread_ts`가 실제로 실려 있을 때만 echo한다(사용자가 스스로 DM 안에서 스레드를 연 경우). 채널 응답은 스레드가 기본이며 브리지가 채운다 — 이 규칙은 DM 한정." diff --git a/skills/thiscode_agy/README.md b/skills/thiscode_agy/README.md index 26c31e4..f2afbce 100644 --- a/skills/thiscode_agy/README.md +++ b/skills/thiscode_agy/README.md @@ -104,7 +104,6 @@ thiscode_agy/ ## Related ThisCode skills - `thiscodex/` — same pattern for OpenAI Codex CLI -- `knowledge-manager/` — vault ingest pipeline (Karpathy/Orchestrator Pattern) - `prompt/` — prompt engineering library ## License & attribution diff --git a/tests/agents/test-all-yamls.sh b/tests/agents/test-all-yamls.sh index 53aada7..57c2a58 100755 --- a/tests/agents/test-all-yamls.sh +++ b/tests/agents/test-all-yamls.sh @@ -17,9 +17,10 @@ for f in "$ROOT"/.agents/*.yaml; do fi done -# 13 expected: 9 skills + 4 commands -if [ "$COUNT" -lt 13 ]; then - echo "FAIL: expected 13+ agents, got $COUNT" +# 6 expected after 1.4.0 (bootstrap, codex-exec-bridge, init, meetings, +# model-router, shared-memory) — measured, not guessed. +if [ "$COUNT" -lt 6 ]; then + echo "FAIL: expected 6+ agents, got $COUNT" exit 1 fi diff --git a/tests/agents/test-hermes-runtime-manifest.sh b/tests/agents/test-hermes-runtime-manifest.sh new file mode 100755 index 0000000..5608382 --- /dev/null +++ b/tests/agents/test-hermes-runtime-manifest.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# Verify that Hermes runtime registrations are a subset of plugin.yaml and +# that every manifest-only tool/command is explicitly documented as deferred. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +SELF_TEST=0 +if [ "${1:-}" = "--self-test" ]; then + SELF_TEST=1 +fi + +python3 - "$ROOT" "$SELF_TEST" <<'PY' +import re +import sys +from pathlib import Path + +root = Path(sys.argv[1]) +self_test = sys.argv[2] == "1" +entry = (root / "hermes-plugin" / "__init__.py").read_text() +manifest = (root / "hermes-plugin" / "plugin.yaml").read_text() +status = (root / "docs" / "HERMES-STATUS.md").read_text() + +def yaml_list(key): + match = re.search(rf"(?ms)^{re.escape(key)}:\s*\n((?:\s+-\s+[^\n]+\n?)+)", manifest) + if not match: + raise SystemExit(f"FAIL hermes runtime manifest: missing YAML list {key}") + return {line.strip()[2:].strip().strip('"\'') for line in match.group(1).splitlines() if line.strip().startswith("-")} + +manifest_tools = yaml_list("provides_tools") +manifest_hooks = yaml_list("provides_hooks") +manifest_commands = yaml_list("provides_commands") +runtime_tools = set(re.findall(r"register_tool\s*\(\s*name\s*=\s*['\"]([^'\"]+)", entry)) +runtime_hooks = set(re.findall(r"register_hook\s*\(\s*['\"]([^'\"]+)", entry)) +runtime_commands = set(re.findall(r"register_command\s*\(\s*['\"]([^'\"]+)", entry)) + +if self_test: + runtime_tools.add("__thiscode_manifest_self_test_fake__") + +errors = [] +for label, runtime, advertised in ( + ("tool", runtime_tools, manifest_tools), + ("hook", runtime_hooks, manifest_hooks), + ("command", runtime_commands, manifest_commands), +): + for name in sorted(runtime - advertised): + errors.append(f"runtime {label} is not in manifest: {name}") + +if "## What is deferred" not in status: + raise SystemExit("FAIL hermes runtime manifest: missing HERMES-STATUS deferred section") +deferred_section = status.split("## What is deferred", 1)[1].split("## ", 1)[0] +for label, runtime, advertised in ( + ("tool", runtime_tools, manifest_tools), + ("command", runtime_commands, manifest_commands), +): + for name in sorted(advertised - runtime): + if name not in deferred_section: + errors.append(f"manifest-only {label} missing from HERMES-STATUS deferred table: {name}") + +if errors: + print("FAIL hermes runtime manifest") + for error in errors: + print(f" {error}") + sys.exit(1) + +print( + "PASS hermes runtime manifest " + f"(runtime tools={len(runtime_tools)}, commands={len(runtime_commands)}, hooks={len(runtime_hooks)}; " + f"manifest tools={len(manifest_tools)}, commands={len(manifest_commands)}, hooks={len(manifest_hooks)})" +) +PY diff --git a/tests/agents/test-router-yaml.sh b/tests/agents/test-router-yaml.sh index 882be24..e587453 100755 --- a/tests/agents/test-router-yaml.sh +++ b/tests/agents/test-router-yaml.sh @@ -4,7 +4,7 @@ ROOT="$(cd "$(dirname "$0")/../.." && pwd)" SCHEMA="$ROOT/schemas/agent-spec.json" AJV_OPTS="--spec=draft2019 --strict=false -c ajv-formats" -ajv validate -s "$SCHEMA" -d "$ROOT/.agents/thiscode-model-router.yaml" $AJV_OPTS || { echo "FAIL: router yaml schema"; exit 1; } -yq -e '.tier == "external"' "$ROOT/.agents/thiscode-model-router.yaml" >/dev/null -yq -e '.provides_tools | contains(["claude_discode_route_model"])' "$ROOT/.agents/thiscode-model-router.yaml" >/dev/null +ajv validate -s "$SCHEMA" -d "$ROOT/.agents/model-router.yaml" $AJV_OPTS || { echo "FAIL: router yaml schema"; exit 1; } +yq -e '.tier == "external"' "$ROOT/.agents/model-router.yaml" >/dev/null +yq -e '.provides_tools | contains(["claude_discode_route_model"])' "$ROOT/.agents/model-router.yaml" >/dev/null echo "PASS router yaml" diff --git a/tests/agents/test-search-v2.sh b/tests/agents/test-search-v2.sh deleted file mode 100755 index a5e9e56..0000000 --- a/tests/agents/test-search-v2.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -set -e -F=$HOME/code/ThisCode/.agents/search.yaml -grep -q "Tier 2 Obsidian CLI" "$F" || { echo "FAIL: search description Tier 2 = CLI"; exit 1; } -grep -q "Tier 3 vault-search MCP" "$F" || { echo "FAIL: search description Tier 3 = MCP"; exit 1; } -echo "PASS search v2.1" diff --git a/tests/dogfood/run-all.sh b/tests/dogfood/run-all.sh index 113eca8..2e044a1 100755 --- a/tests/dogfood/run-all.sh +++ b/tests/dogfood/run-all.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Dogfood orchestrator — run all 3 sandbox scenarios + report. +# Dogfood orchestrator — run the sandbox scenarios + report. set -e ROOT="${CLAUDE_DISCODE_HOME:-/thiscode}" @@ -15,7 +15,7 @@ LOG="$HERE/dogfood-results-$(date +%Y-%m-%d).md" } > "$LOG" pass=0; fail=0 -for s in scenario-1-grep-only.sh scenario-2-mcp.sh scenario-3-graphrag.sh; do +for s in scenario-2-mcp.sh scenario-3-graphrag.sh; do echo "=== $s ===" if bash "$HERE/$s"; then pass=$((pass + 1)) diff --git a/tests/dogfood/scenario-1-grep-only.sh b/tests/dogfood/scenario-1-grep-only.sh deleted file mode 100755 index 0d45165..0000000 --- a/tests/dogfood/scenario-1-grep-only.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -# Dog-1: Obsidian absent + ripgrep only. Expect Tier 4 notice on search. -set -e - -ROOT="${CLAUDE_DISCODE_HOME:-/thiscode}" -VAULT="${CLAUDE_DISCODE_VAULT:-$ROOT/sample-vault}" -DISP="$ROOT/skills/search/references/tier-implementations.md.sh" -[ -f "$DISP" ] || { echo "SKIP Dog-1: Hermes search dispatcher deferred — see docs/HERMES-STATUS.md"; exit 0; } - -if [ ! -d "$VAULT" ]; then - echo "scenario-1 SKIP: sample-vault not present at $VAULT (run Phase A first)" - exit 0 -fi - -echo "[Dog-1] Tier 4 (ripgrep) only — forcing CLAUDE_DISCODE_FORCE_TIER=4" -OUT=$(CLAUDE_DISCODE_VAULT="$VAULT" CLAUDE_DISCODE_FORCE_TIER=4 bash "$DISP" "회사" 2>&1 || true) -echo "$OUT" | head -5 -echo "$OUT" | grep -q "Tier 4: 텍스트 검색 결과입니다" \ - || { echo "FAIL Dog-1: Tier 4 notice missing"; exit 1; } - -echo "PASS Dog-1" diff --git a/tests/init/codexsync.test.mjs b/tests/init/codexsync.test.mjs index 15484af..eac0afc 100644 --- a/tests/init/codexsync.test.mjs +++ b/tests/init/codexsync.test.mjs @@ -7,29 +7,52 @@ import { join } from 'node:path'; import { planCodexSync, applyCodexSync, KM_SKILLS } from '../../scripts/lib/codexsync.mjs'; test('KM_SKILLS matches bash SKILLS array (behavior parity)', () => { - assert.deepEqual(KM_SKILLS, ['knowledge-manager','knowledge-manager-lite', - 'knowledge-manager-plain','knowledge-manager-at','knowledge-manager-bootstrap']); + assert.deepEqual(KM_SKILLS, []); }); test('planCodexSync is dry (no writes), lists src→dest pairs', () => { const src = mkdtempSync(join(tmpdir(), 'src-')); - mkdirSync(join(src, 'knowledge-manager-plain'), { recursive: true }); - writeFileSync(join(src, 'knowledge-manager-plain', 'SKILL.md'), '# k'); + const skill = KM_SKILLS[0] ?? 'sample-skill'; + mkdirSync(join(src, skill), { recursive: true }); + writeFileSync(join(src, skill, 'SKILL.md'), '# k'); const dest = mkdtempSync(join(tmpdir(), 'dst-')); - const before = existsSync(join(dest, 'knowledge-manager-plain')); + const before = existsSync(join(dest, skill)); const plan = planCodexSync(src, dest); assert.equal(before, false); - assert.equal(existsSync(join(dest, 'knowledge-manager-plain')), false, 'plan must not write'); - assert.ok(plan.some(p => p.skill === 'knowledge-manager-plain')); + assert.equal(existsSync(join(dest, skill)), false, 'plan must not write'); + assert.equal(plan.length, KM_SKILLS.length ? 1 : 0, 'plan lists exactly the synced skills'); rmSync(src, { recursive: true, force: true }); rmSync(dest, { recursive: true, force: true }); }); test('applyCodexSync copies SKILL.md into dest layer', () => { const src = mkdtempSync(join(tmpdir(), 'src-')); - mkdirSync(join(src, 'knowledge-manager-lite'), { recursive: true }); - writeFileSync(join(src, 'knowledge-manager-lite', 'SKILL.md'), '# lite'); + const skill = KM_SKILLS[0] ?? 'sample-skill'; + mkdirSync(join(src, skill), { recursive: true }); + writeFileSync(join(src, skill, 'SKILL.md'), '# lite'); const dest = mkdtempSync(join(tmpdir(), 'dst-')); - applyCodexSync(src, dest); - assert.equal(readFileSync(join(dest, 'knowledge-manager-lite', 'SKILL.md'), 'utf8'), '# lite'); + const done = applyCodexSync(src, dest); + if (KM_SKILLS.length) { + assert.equal(readFileSync(join(dest, skill, 'SKILL.md'), 'utf8'), '# lite'); + } else { + assert.deepEqual(done, [], 'empty sync list must copy nothing'); + assert.equal(existsSync(join(dest, skill)), false, 'empty sync list must not write'); + } + rmSync(src, { recursive: true, force: true }); rmSync(dest, { recursive: true, force: true }); +}); + +test('injected skill list plans and copies a real temporary skill', () => { + const src = mkdtempSync(join(tmpdir(), 'src-')); + const dest = mkdtempSync(join(tmpdir(), 'dst-')); + const skills = ['tmp-skill']; + mkdirSync(join(src, skills[0]), { recursive: true }); + writeFileSync(join(src, skills[0], 'SKILL.md'), '# temporary'); + + const plan = planCodexSync(src, dest, skills); + assert.deepEqual(plan.map(({ skill }) => skill), skills); + assert.equal(existsSync(join(dest, skills[0])), false, 'plan must remain dry with injected skills'); + + const done = applyCodexSync(src, dest, skills); + assert.deepEqual(done, skills); + assert.equal(readFileSync(join(dest, skills[0], 'SKILL.md'), 'utf8'), '# temporary'); rmSync(src, { recursive: true, force: true }); rmSync(dest, { recursive: true, force: true }); }); diff --git a/tests/init/test-km-at-preflight-doc.sh b/tests/init/test-km-at-preflight-doc.sh deleted file mode 100644 index d3005bb..0000000 --- a/tests/init/test-km-at-preflight-doc.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -set -e -ROOT="$(cd "$(dirname "$0")/../.." && pwd)" - -test -f "$ROOT/skills/knowledge-manager-at/references/mode-r-preflight.md" || { echo "FAIL: preflight doc missing"; exit 1; } -grep -q "read-only" "$ROOT/skills/knowledge-manager-at/SKILL.md" || { echo "FAIL: SKILL.md read-only 안내 누락"; exit 1; } -grep -q "broken_wikilinks" "$ROOT/skills/knowledge-manager-at/references/mode-r-preflight.md" || { echo "FAIL: preflight checks 누락"; exit 1; } - -echo "PASS km-at preflight doc" diff --git a/tests/init/test-km-at-preflight-yaml.sh b/tests/init/test-km-at-preflight-yaml.sh deleted file mode 100644 index 6110aff..0000000 --- a/tests/init/test-km-at-preflight-yaml.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -set -e -ROOT="$(cd "$(dirname "$0")/../.." && pwd)" -YAML="$ROOT/.agents/knowledge-manager-at.yaml" - -yq -e '.phases.preflight.auto == true' "$YAML" >/dev/null || { echo "FAIL: phases.preflight.auto missing"; exit 1; } -yq -e '.phases.preflight.scope == "read-only"' "$YAML" >/dev/null || { echo "FAIL: read-only scope missing"; exit 1; } -yq -e '.phases.apply.dry_run_required == true' "$YAML" >/dev/null || { echo "FAIL: dry_run_required missing"; exit 1; } -yq -e '.phases.preflight.checks | contains(["broken_wikilinks"])' "$YAML" >/dev/null -yq -e '.phases.preflight.checks | contains(["folder_entropy"])' "$YAML" >/dev/null -yq -e '.phases.preflight.checks | contains(["orphan_notes"])' "$YAML" >/dev/null - -echo "PASS km-at mode-r preflight yaml" diff --git a/tests/test-dogfood-wsl-sandbox.md b/tests/test-dogfood-wsl-sandbox.md deleted file mode 100644 index 899d020..0000000 --- a/tests/test-dogfood-wsl-sandbox.md +++ /dev/null @@ -1,38 +0,0 @@ -# Dogfood Test Scenario — WSL Sandbox - -> Run manually on a fresh WSL Ubuntu 20.04+ instance OR a Docker container with no Obsidian preinstalled. - -## Setup - -```bash -# 1. Install Claude Code -curl -fsSL https://claude.ai/install | bash - -# 2. Install thiscode plugin -cd ~ && git clone https://github.com/treylom/ThisCode-marketplace -claude marketplace add ~/thiscode-marketplace -claude plugin install thiscode -``` - -## Scenarios - -### Dog-1: Obsidian absent + grep only -- Run `/thiscode:km-bootstrap` -- Select "Obsidian + grep only" install matrix -- Run `/thiscode:search "test"` → expect "Tier 4: 텍스트 검색 결과입니다" notice -- Run `/thiscode:km ` → expect file in `~/Inbox/` (or chosen vault_root) -- Pass criteria: no error, files written, search returns the new file - -### Dog-2: Obsidian + vault-search MCP -- After Dog-1, run `/thiscode:km-bootstrap` again -- Choose "+vault-search MCP" -- Run `/thiscode:search "test"` → expect MCP results (no Tier 4 notice) -- Pass criteria: Tier 3 succeeds, MCP server visible in `claude --list-mcp` - -### Dog-3: Full GraphRAG -- Run `/thiscode:km-bootstrap` → "+GraphRAG server" -- Run `/thiscode:search "test"` → expect Tier 1 JSON results -- Pass criteria: FastAPI 8400 up, score-ranked results - -## Hand-off -Each scenario takes ~10 min. Record results in `~/code/thiscode/tests/dogfood-results-.md`. diff --git a/tests/test-integration-cascade.sh b/tests/test-integration-cascade.sh deleted file mode 100755 index f1c8f07..0000000 --- a/tests/test-integration-cascade.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash -# Integration test: 4-Tier cascade behavior end-to-end. -set -e -TMPDIR=$(mktemp -d) -mkdir -p "$TMPDIR/vault" -cat > "$TMPDIR/vault/n.md" <<'MD' ---- -type: atomic ---- -# Test -MCP details here. -MD - -DISP="$HOME/code/thiscode/skills/search/references/tier-implementations.md.sh" -[ -f "$DISP" ] || { echo "SKIP: Hermes search dispatcher deferred — see docs/HERMES-STATUS.md"; exit 0; } - -# T2.1 — cascade must produce a non-empty response (Tier 1 if GraphRAG server is up, else Tier 4) -CLAUDE_DISCODE_VAULT="$TMPDIR/vault" bash "$DISP" "MCP" > "$TMPDIR/out.txt" 2>&1 || true -[ -s "$TMPDIR/out.txt" ] || { echo "FAIL T2.1: empty cascade response"; exit 1; } - -# T2.2 — Force Tier 4 explicitly -CLAUDE_DISCODE_VAULT="$TMPDIR/vault" CLAUDE_DISCODE_FORCE_TIER=4 bash "$DISP" "MCP" > "$TMPDIR/out2.txt" -grep -q "Tier 4: 텍스트 검색 결과입니다" "$TMPDIR/out2.txt" || { echo "FAIL T2.2"; cat "$TMPDIR/out2.txt"; exit 1; } - -echo "PASS" -rm -rf "$TMPDIR" diff --git a/tests/test-km-lite-plain-write.sh b/tests/test-km-lite-plain-write.sh deleted file mode 100755 index a053ebf..0000000 --- a/tests/test-km-lite-plain-write.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -# Test: km-lite saves URL content as markdown when Obsidian is absent. -set -e -TMPDIR=$(mktemp -d) -mkdir -p "$TMPDIR/vault" - -INPUT_CONTENT="# Sample Article\n\nThis is the article body about MCP." - -DISP="$HOME/code/thiscode/skills/knowledge-manager-lite/references/extract-and-classify.md.sh" -[ -f "$DISP" ] || { echo "SKIP: Hermes km-lite dispatcher deferred — see docs/HERMES-STATUS.md"; exit 0; } -CLAUDE_DISCODE_VAULT="$TMPDIR/vault" CLAUDE_DISCODE_NO_OBSIDIAN=1 bash "$DISP" --content "$INPUT_CONTENT" --source-url "https://example.com/x" --title "Sample" - -NEW=$(find "$TMPDIR/vault" -name '*.md' 2>/dev/null | head -1) -[ -n "$NEW" ] || { echo "FAIL: no file written"; exit 1; } -grep -q "Sample Article" "$NEW" || { echo "FAIL: content missing"; cat "$NEW"; exit 1; } -grep -q "^source:" "$NEW" || { echo "FAIL: frontmatter source missing"; cat "$NEW"; exit 1; } - -echo "PASS" -rm -rf "$TMPDIR" diff --git a/tests/test-search-tier4-fallback.sh b/tests/test-search-tier4-fallback.sh deleted file mode 100755 index 22d7af8..0000000 --- a/tests/test-search-tier4-fallback.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash -# Test: when only ripgrep is available, search produces Tier 4 results with notice. -set -e -TMPDIR=$(mktemp -d) -mkdir -p "$TMPDIR/vault" -cat > "$TMPDIR/vault/note1.md" <<'MD' ---- -type: atomic ---- -# MCP 정의 -MCP는 Model Context Protocol 의 약자다. -MD - -DISP="$HOME/code/thiscode/skills/search/references/tier-implementations.md.sh" -[ -f "$DISP" ] || { echo "SKIP: Hermes search dispatcher deferred — see docs/HERMES-STATUS.md"; exit 0; } - -CLAUDE_DISCODE_VAULT="$TMPDIR/vault" \ - CLAUDE_DISCODE_FORCE_TIER=4 \ - bash "$DISP" "MCP" \ - > "$TMPDIR/out.txt" 2>&1 || true - -grep -q "note1.md" "$TMPDIR/out.txt" || { echo "FAIL: result missing"; cat "$TMPDIR/out.txt"; exit 1; } -grep -q "Tier 4: 텍스트 검색 결과입니다" "$TMPDIR/out.txt" || { echo "FAIL: notice missing"; cat "$TMPDIR/out.txt"; exit 1; } - -echo "PASS" -rm -rf "$TMPDIR" diff --git a/tests/test-vault-regression.sh b/tests/test-vault-regression.sh deleted file mode 100755 index 4c27de5..0000000 --- a/tests/test-vault-regression.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash -# T4 — vault regression: existing /knowledge-manager + /search still work after mirror align. -set -e - -VAULT="${CLAUDE_DISCODE_VAULT:-${VAULT_ROOT:-$HOME/obsidian-ai-vault}}" -if [ ! -d "$VAULT" ]; then - echo "SKIP: vault not found at $VAULT (set CLAUDE_DISCODE_VAULT or VAULT_ROOT)" - exit 0 -fi - -# T4.1 — /knowledge-manager.md still references 7-Layer + Mode I/R/G -grep -qE "7-Layer|Mode I|Mode R|Mode G" "$VAULT/.claude/commands/knowledge-manager.md" || \ - { echo "FAIL T4.1: 7-Layer / Mode markers missing"; exit 1; } - -# T4.2 — /search.md Tier 1 references GraphRAG FastAPI 8400 -grep -qE "8400|GraphRAG" "$VAULT/.claude/commands/search.md" || \ - { echo "FAIL T4.2: Tier 1 GraphRAG ref missing"; exit 1; } - -# T4.3 — Contract banner added (mirror align indicator) -grep -qE "Contract|contracts/" "$VAULT/.claude/commands/search.md" || \ - { echo "FAIL T4.3: contract banner missing in search.md"; exit 1; } - -grep -qE "Contracts|contracts/" "$VAULT/.claude/commands/knowledge-manager.md" || \ - { echo "FAIL T4.3b: contract banner missing in knowledge-manager.md"; exit 1; } - -# T4.4 — Orchestrator/Karpathy Pipeline reference still in km (legacy "Karpathy Pipeline" name supported in vault mirror) -grep -qE "Orchestrator Pipeline|km-orchestrator-pipeline|Karpathy Pipeline|km-karpathy-pipeline" "$VAULT/.claude/commands/knowledge-manager.md" || \ - { echo "FAIL T4.4: Pipeline ref missing"; exit 1; } - -echo "PASS"