oh-my-til 0.12.2 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -133,8 +133,11 @@ MCP 서버 연결 시 Claude Code에서 사용할 수 있는 도구:
133
133
  | `vault_list_files` | 폴더 내 파일 목록 (필터링 가능) |
134
134
  | `vault_search` | vault 전체 텍스트 검색 |
135
135
  | `vault_get_active_file` | 현재 열린 파일 가져오기 |
136
- | `til_list` | 카테고리별 TIL 파일 목록 |
136
+ | `til_list` | 카테고리별 TIL 파일 목록 (`search` 필터 지원) |
137
+ | `til_exists` | category + slug로 TIL 파일 존재 여부 확인 |
138
+ | `til_save_note` | frontmatter 형식/경로 규칙을 보장하는 TIL 노트 저장 |
137
139
  | `til_backlog_status` | 백로그 진행률 요약 (체크박스 카운트) |
140
+ | `til_backlog_check` | 백로그 항목을 slug로 완료 처리 |
138
141
  | `til_get_context` | 주제 관련 기존 학습 컨텍스트 (파일, 링크 관계, 미작성 주제) |
139
142
  | `til_recent_context` | 최근 학습 활동을 날짜별로 조회 |
140
143
  | `til_dashboard` | 학습 통계 요약 |
@@ -177,6 +180,10 @@ src/
177
180
  │ ├── keyboard.ts # Shift+Enter → \n (멀티라인 지원)
178
181
  │ ├── env.ts # macOS PATH 보정 (Homebrew)
179
182
  │ ├── skills.ts # 버전 비교/플레이스홀더 치환 순수 함수
183
+ │ ├── cli.ts # CLI 인자 파싱 순수 함수
184
+ │ ├── config.ts # 설정 파일 파싱/로딩 순수 함수
185
+ │ ├── markdown.ts # 마크다운 → HTML 변환 (외부 의존성 없음)
186
+ │ ├── profile.ts # 정적 사이트 페이지 생성 (프로필, TIL 페이지, 카테고리 인덱스)
180
187
  │ └── index.ts # barrel export
181
188
  ├── ports/ # 어댑터 인터페이스
182
189
  │ ├── storage.ts # FileStorage 인터페이스
@@ -185,10 +192,12 @@ src/
185
192
  │ ├── fs-adapter.ts # node:fs 기반 (standalone)
186
193
  │ └── obsidian-adapter.ts # Obsidian App 기반
187
194
  ├── mcp/ # MCP 서버 (포트 의존, Obsidian 무관)
195
+ │ ├── context.ts # 학습 컨텍스트 도구 (topic 매칭, 카테고리 추출)
188
196
  │ ├── server.ts # HTTP 서버 + Streamable HTTP 트랜스포트
189
197
  │ └── tools.ts # MCP 도구 정의 (FileStorage + MetadataProvider 사용)
198
+ ├── plugin-install.ts # 플러그인 에셋 자동 설치/업데이트 (skills, agents, CLAUDE.md 섹션)
190
199
  ├── cli/ # 독립 CLI 진입점
191
- │ ├── index.ts # npx oh-my-til init / serve
200
+ │ ├── index.ts # npx oh-my-til init / serve / deploy
192
201
  │ └── obsidian-install.ts # Obsidian 플러그인 자동 설치 (Electron 감지, node-pty 재빌드)
193
202
  └── obsidian/ # Obsidian 플랫폼 어댑터
194
203
  ├── main.ts # 플러그인 진입점
package/README.md CHANGED
@@ -133,8 +133,11 @@ When the MCP server is connected, Claude Code can use these tools:
133
133
  | `vault_list_files` | List files in a folder with optional filtering |
134
134
  | `vault_search` | Full-text search across the vault |
135
135
  | `vault_get_active_file` | Get the currently open file |
136
- | `til_list` | List TIL files grouped by category |
136
+ | `til_list` | List TIL files grouped by category (supports `search` filter) |
137
+ | `til_exists` | Check if a TIL file exists by category + slug |
138
+ | `til_save_note` | Save a TIL note with validated frontmatter and path conventions |
137
139
  | `til_backlog_status` | Backlog progress summary with checkbox counts |
140
+ | `til_backlog_check` | Mark a backlog item as done by slug |
138
141
  | `til_get_context` | Get existing knowledge context for a topic (files, links, unresolved mentions) |
139
142
  | `til_recent_context` | Recent learning activity grouped by date |
140
143
  | `til_dashboard` | Learning statistics summary |
@@ -177,6 +180,10 @@ src/
177
180
  │ ├── keyboard.ts # Shift+Enter → \n (multiline support)
178
181
  │ ├── env.ts # macOS PATH resolution (Homebrew)
179
182
  │ ├── skills.ts # Version comparison / placeholder substitution
183
+ │ ├── cli.ts # CLI argument parsing (pure functions)
184
+ │ ├── config.ts # Config file parsing/loading (pure functions)
185
+ │ ├── markdown.ts # Markdown → HTML conversion (no external deps)
186
+ │ ├── profile.ts # Static site page generation (profile, TIL pages, category index)
180
187
  │ └── index.ts # Barrel export
181
188
  ├── ports/ # Adapter interfaces
182
189
  │ ├── storage.ts # FileStorage interface
@@ -185,10 +192,12 @@ src/
185
192
  │ ├── fs-adapter.ts # node:fs based (standalone)
186
193
  │ └── obsidian-adapter.ts # Obsidian App based
187
194
  ├── mcp/ # MCP server (port-dependent, Obsidian-free)
195
+ │ ├── context.ts # Learning context tools (topic matching, category extraction)
188
196
  │ ├── server.ts # HTTP server + Streamable HTTP transport
189
197
  │ └── tools.ts # MCP tool definitions (FileStorage + MetadataProvider)
198
+ ├── plugin-install.ts # Plugin asset auto-install/update (skills, agents, CLAUDE.md section)
190
199
  ├── cli/ # Standalone CLI entry point
191
- │ ├── index.ts # npx oh-my-til init / serve
200
+ │ ├── index.ts # npx oh-my-til init / serve / deploy
192
201
  │ └── obsidian-install.ts # Auto-install Obsidian plugin (Electron detection, node-pty rebuild)
193
202
  └── obsidian/ # Obsidian platform adapter
194
203
  ├── main.ts # Plugin entry point
package/dist/cli.js CHANGED
@@ -38784,6 +38784,28 @@ function parseBacklogSections(content) {
38784
38784
  }
38785
38785
  return sections.filter((s) => s.items.length > 0);
38786
38786
  }
38787
+ function checkBacklogItem(content, slug) {
38788
+ const lines = content.split("\n");
38789
+ let found = false;
38790
+ let alreadyDone = false;
38791
+ for (let i = 0; i < lines.length; i++) {
38792
+ const match = lines[i].match(/^(-\s+\[)([ xX])(\]\s+\[[^\[\]]*\]\()([^()]+)(\).*)/);
38793
+ if (!match)
38794
+ continue;
38795
+ const rawPath = match[4].trim();
38796
+ const pathSlug = rawPath.replace(/\.md$/, "").split("/").pop() ?? "";
38797
+ if (pathSlug !== slug)
38798
+ continue;
38799
+ found = true;
38800
+ if (match[2] !== " ") {
38801
+ alreadyDone = true;
38802
+ break;
38803
+ }
38804
+ lines[i] = `${match[1]}x${match[3]}${match[4]}${match[5]}`;
38805
+ break;
38806
+ }
38807
+ return { content: lines.join("\n"), found, alreadyDone };
38808
+ }
38787
38809
 
38788
38810
  // src/core/stats.ts
38789
38811
  var DAY_MS = 24 * 60 * 60 * 1e3;
@@ -39368,13 +39390,18 @@ ${text}` }] };
39368
39390
  "til_list",
39369
39391
  {
39370
39392
  title: "List TILs",
39371
- description: "TIL \uD30C\uC77C \uBAA9\uB85D\uACFC \uCE74\uD14C\uACE0\uB9AC\uBCC4 \uBD84\uB958\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4",
39393
+ description: "TIL \uD30C\uC77C \uBAA9\uB85D\uACFC \uCE74\uD14C\uACE0\uB9AC\uBCC4 \uBD84\uB958\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. search\uB85C \uD30C\uC77C\uBA85/\uACBD\uB85C \uD544\uD130\uB9C1 \uAC00\uB2A5.",
39372
39394
  inputSchema: external_exports3.object({
39373
- category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1")
39395
+ category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1"),
39396
+ search: external_exports3.string().optional().describe("\uD30C\uC77C \uACBD\uB85C/\uC774\uB984\uC5D0\uC11C \uAC80\uC0C9 (\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC)")
39374
39397
  })
39375
39398
  },
39376
- async ({ category }) => {
39377
- const filePaths = (await storage.listFiles()).filter((f) => f.path.startsWith(tilPath + "/") && f.extension === "md").map((f) => f.path);
39399
+ async ({ category, search }) => {
39400
+ let filePaths = (await storage.listFiles()).filter((f) => f.path.startsWith(tilPath + "/") && f.extension === "md").map((f) => f.path);
39401
+ if (search) {
39402
+ const lowerSearch = search.toLowerCase();
39403
+ filePaths = filePaths.filter((p) => p.toLowerCase().includes(lowerSearch));
39404
+ }
39378
39405
  const byCategory = groupFilesByCategory(filePaths, tilPath, category);
39379
39406
  const totalCount = Object.values(byCategory).reduce((sum, paths) => sum + paths.length, 0);
39380
39407
  const categories = Object.entries(byCategory).map(([cat, paths]) => ({
@@ -39674,6 +39701,90 @@ ${text}` }] };
39674
39701
  };
39675
39702
  }
39676
39703
  );
39704
+ server.registerTool(
39705
+ "til_exists",
39706
+ {
39707
+ title: "Check TIL Exists",
39708
+ description: "TIL \uD30C\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD558\uB294\uC9C0 \uD655\uC778\uD569\uB2C8\uB2E4",
39709
+ inputSchema: external_exports3.object({
39710
+ category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
39711
+ slug: external_exports3.string().describe("\uD30C\uC77C\uBA85 slug (\uC608: generics, hooks)")
39712
+ })
39713
+ },
39714
+ async ({ category, slug }) => {
39715
+ const path6 = `${tilPath}/${category}/${slug}.md`;
39716
+ const exists = await storage.exists(path6);
39717
+ const data = { exists, path: path6 };
39718
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
39719
+ }
39720
+ );
39721
+ server.registerTool(
39722
+ "til_save_note",
39723
+ {
39724
+ title: "Save TIL Note",
39725
+ description: "TIL \uB178\uD2B8\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. frontmatter \uD615\uC2DD\uACFC \uACBD\uB85C \uADDC\uCE59\uC744 \uC11C\uBC84\uAC00 \uBCF4\uC7A5\uD569\uB2C8\uB2E4.",
39726
+ inputSchema: external_exports3.object({
39727
+ category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
39728
+ slug: external_exports3.string().describe("\uD30C\uC77C\uBA85 slug (\uC608: generics, hooks)"),
39729
+ title: external_exports3.string().describe("\uB178\uD2B8 \uC81C\uBAA9"),
39730
+ content: external_exports3.string().describe("\uB178\uD2B8 \uBCF8\uBB38 (\uB9C8\uD06C\uB2E4\uC6B4)"),
39731
+ tags: external_exports3.array(external_exports3.string()).optional().describe('\uD0DC\uADF8 \uBAA9\uB85D (\uC608: ["typescript", "basics"])'),
39732
+ date: external_exports3.string().optional().describe("\uC791\uC131\uC77C (YYYY-MM-DD, \uC0DD\uB7B5 \uC2DC \uC624\uB298)"),
39733
+ fmCategory: external_exports3.string().optional().describe("frontmatter category \uAC12 (\uC0DD\uB7B5 \uC2DC category \uD30C\uB77C\uBBF8\uD130 \uC0AC\uC6A9)"),
39734
+ aliases: external_exports3.array(external_exports3.string()).optional().describe('aliases \uBAA9\uB85D (\uC608: ["\uD55C\uAE00 \uC81C\uBAA9", "English Title"])')
39735
+ })
39736
+ },
39737
+ async ({ category, slug, title, content, tags, date: date5, fmCategory, aliases }) => {
39738
+ const path6 = `${tilPath}/${category}/${slug}.md`;
39739
+ const noteDate = date5 || (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
39740
+ const fmLines = ["---", `title: "${title.replace(/"/g, '\\"')}"`, `date: ${noteDate}`];
39741
+ const effectiveCategory = fmCategory ?? category;
39742
+ fmLines.push(`category: ${effectiveCategory}`);
39743
+ if (tags && tags.length > 0) {
39744
+ fmLines.push("tags:");
39745
+ for (const tag of tags) {
39746
+ fmLines.push(` - ${tag}`);
39747
+ }
39748
+ }
39749
+ if (aliases && aliases.length > 0) {
39750
+ fmLines.push(`aliases: [${aliases.map((a) => `"${a.replace(/"/g, '\\"')}"`).join(", ")}]`);
39751
+ }
39752
+ fmLines.push("---", "");
39753
+ const fullContent = fmLines.join("\n") + content;
39754
+ await storage.mkdir(`${tilPath}/${category}`);
39755
+ const existed = await storage.exists(path6);
39756
+ await storage.writeFile(path6, fullContent);
39757
+ const data = { path: path6, created: !existed, category, slug, title };
39758
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
39759
+ }
39760
+ );
39761
+ server.registerTool(
39762
+ "til_backlog_check",
39763
+ {
39764
+ title: "Check Backlog Item",
39765
+ description: "\uBC31\uB85C\uADF8 \uD56D\uBAA9\uC744 \uC644\uB8CC([x]) \uCC98\uB9AC\uD569\uB2C8\uB2E4",
39766
+ inputSchema: external_exports3.object({
39767
+ category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
39768
+ slug: external_exports3.string().describe("\uCCB4\uD06C\uD560 \uD56D\uBAA9\uC758 slug (\uC608: generics)")
39769
+ })
39770
+ },
39771
+ async ({ category, slug }) => {
39772
+ const backlogPath = `${tilPath}/${category}/backlog.md`;
39773
+ const content = await storage.readFile(backlogPath);
39774
+ if (content === null) {
39775
+ return { content: [{ type: "text", text: JSON.stringify({ error: `\uBC31\uB85C\uADF8 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${backlogPath}` }) }], isError: true };
39776
+ }
39777
+ const result = checkBacklogItem(content, slug);
39778
+ if (!result.found) {
39779
+ return { content: [{ type: "text", text: JSON.stringify({ error: `"${slug}" \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4`, backlogPath }) }], isError: true };
39780
+ }
39781
+ if (result.alreadyDone) {
39782
+ return { content: [{ type: "text", text: JSON.stringify({ alreadyDone: true, slug, backlogPath }) }] };
39783
+ }
39784
+ await storage.writeFile(backlogPath, result.content);
39785
+ return { content: [{ type: "text", text: JSON.stringify({ checked: true, slug, backlogPath }) }] };
39786
+ }
39787
+ );
39677
39788
  }
39678
39789
 
39679
39790
  // src/mcp/server.ts
@@ -39764,16 +39875,16 @@ var TILMcpServer = class {
39764
39875
  };
39765
39876
 
39766
39877
  // vault-assets/skills/til/SKILL.md
39767
- var SKILL_default = '---\nname: til\ndescription: "Today I Learned - \uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uACE0 \uB300\uD654\uD615\uC73C\uB85C \uD559\uC2B5\uD55C \uB4A4 TIL \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uC800\uC7A5"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# TIL Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 TIL \uC800\uC7A5.\n\n## MCP \uB3C4\uAD6C\n\n- `til_list`: \uAE30\uC874 TIL \uD655\uC778 (\uB3D9\uC77C/\uC720\uC0AC \uC8FC\uC81C \uAC10\uC9C0)\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545, \uB9C1\uD06C \uD6C4\uBCF4\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790\uAC00 \uBCF4\uB294 \uD30C\uC77C \uD655\uC778\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. `til_get_context`\uB85C \uAE30\uC874 TIL \uD655\uC778. MCP \uBD88\uAC00 \uC2DC `til_list` \uD3F4\uBC31\n - \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD559\uC2B5 \uC2DC `til_backlog_status`(category) \u2192 `sections[].items[].sourceUrls` \uCC38\uC870\n - URL 1\uAC1C: `WebFetch`\uB85C \uC9C1\uC811 \uD328\uCE58\n - URL 2\uAC1C \uC774\uC0C1: `til-fetcher` subagent **1\uAC1C**\uC5D0 \uBAA8\uB4E0 URL \uC804\uB2EC\n2. \uAE30\uC874 TIL \uC788\uC73C\uBA74: \uC2EC\uD654 \uD559\uC2B5 / \uC0C8\uB85C \uC791\uC131 \uC120\uD0DD\uC9C0 \uC81C\uC2DC\n3. \uAE30\uC874 TIL \uC5C6\uC73C\uBA74: \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC870\uC0AC\n4. \uD575\uC2EC \uAC1C\uB150, \uC608\uC2DC, \uAD00\uB828 \uC790\uB8CC \uC218\uC9D1 \u2192 \uC694\uC57D\n\n## Phase 2: \uB300\uD654\uD615 \uD559\uC2B5\n\n1. \uB9AC\uC11C\uCE58 \uACB0\uACFC \uAE30\uBC18 \uC124\uBA85\n2. \uC2EC\uD654 \uD559\uC2B5 \uBAA8\uB4DC: \uAE30\uC874 \uB0B4\uC6A9 \uBC18\uBCF5\uD558\uC9C0 \uC54A\uACE0 \uC0C8 \uAD00\uC810\uC5D0 \uC9D1\uC911\n3. \uC0AC\uC6A9\uC790 \uC9C8\uBB38\uC5D0 \uB2F5\uBCC0\n4. \uC0AC\uC6A9\uC790\uAC00 "\uC800\uC7A5\uD574\uC918" \uB4F1 \uC694\uCCAD \uC2DC Phase 3 \uC804\uD658 (\uC790\uB3D9 \uC804\uD658 \uAE08\uC9C0)\n\n## Phase 3: \uC800\uC7A5\n\n`/save` \uC2A4\uD0AC \uADDC\uCE59\uC744 \uB530\uB77C \uC800\uC7A5. \uC2EC\uD654 \uD559\uC2B5 \uBAA8\uB4DC\uB294 \uAE30\uC874 \uD30C\uC77C\uC5D0 \uBCD1\uD569 (`updated` \uB0A0\uC9DC \uCD94\uAC00).\n\n## \uC778\uC218\n\n- \uCCAB \uBC88\uC9F8: \uD559\uC2B5 \uC8FC\uC81C (\uD544\uC218)\n- \uB450 \uBC88\uC9F8: \uCE74\uD14C\uACE0\uB9AC (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC \uC790\uB3D9 \uCD94\uB860)\n\n## \uADDC\uCE59\n\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)` \u2014 `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0\n- \uBBFC\uAC10 \uC815\uBCF4 \uB300\uCCB4\uAC12 \uC0AC\uC6A9 (example.com, your-api-key)\n';
39878
+ var SKILL_default = '---\nname: til\ndescription: "Today I Learned - \uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uACE0 \uB300\uD654\uD615\uC73C\uB85C \uD559\uC2B5\uD55C \uB4A4 TIL \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uC800\uC7A5"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# TIL Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 TIL \uC800\uC7A5.\n\n## MCP \uB3C4\uAD6C\n\n- `til_list`: \uAE30\uC874 TIL \uD655\uC778 (\uB3D9\uC77C/\uC720\uC0AC \uC8FC\uC81C \uAC10\uC9C0)\n- `til_exists`: TIL \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \uBE60\uB978 \uD655\uC778\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545, \uB9C1\uD06C \uD6C4\uBCF4\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790\uAC00 \uBCF4\uB294 \uD30C\uC77C \uD655\uC778\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. `til_exists(category, slug)`\uB85C \uBE60\uB978 \uC874\uC7AC \uD655\uC778 \u2192 \uC788\uC73C\uBA74 \uC2EC\uD654/\uC2E0\uADDC \uC120\uD0DD\uC9C0 \uC81C\uC2DC\n2. `til_get_context`\uB85C \uAE30\uC874 TIL \uD655\uC778. MCP \uBD88\uAC00 \uC2DC `til_list` \uD3F4\uBC31\n - \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD559\uC2B5 \uC2DC `til_backlog_status`(category) \u2192 `sections[].items[].sourceUrls` \uCC38\uC870\n - URL 1\uAC1C: `WebFetch`\uB85C \uC9C1\uC811 \uD328\uCE58\n - URL 2\uAC1C \uC774\uC0C1: `til-fetcher` subagent **1\uAC1C**\uC5D0 \uBAA8\uB4E0 URL \uC804\uB2EC\n3. \uAE30\uC874 TIL \uC5C6\uC73C\uBA74: \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC870\uC0AC\n4. \uD575\uC2EC \uAC1C\uB150, \uC608\uC2DC, \uAD00\uB828 \uC790\uB8CC \uC218\uC9D1 \u2192 \uC694\uC57D\n\n## Phase 2: \uB300\uD654\uD615 \uD559\uC2B5\n\n1. \uB9AC\uC11C\uCE58 \uACB0\uACFC \uAE30\uBC18 \uC124\uBA85\n2. \uC2EC\uD654 \uD559\uC2B5 \uBAA8\uB4DC: \uAE30\uC874 \uB0B4\uC6A9 \uBC18\uBCF5\uD558\uC9C0 \uC54A\uACE0 \uC0C8 \uAD00\uC810\uC5D0 \uC9D1\uC911\n3. \uC0AC\uC6A9\uC790 \uC9C8\uBB38\uC5D0 \uB2F5\uBCC0\n4. \uC0AC\uC6A9\uC790\uAC00 "\uC800\uC7A5\uD574\uC918" \uB4F1 \uC694\uCCAD \uC2DC Phase 3 \uC804\uD658 (\uC790\uB3D9 \uC804\uD658 \uAE08\uC9C0)\n\n## Phase 3: \uC800\uC7A5\n\n`/save` \uC2A4\uD0AC \uADDC\uCE59\uC744 \uB530\uB77C \uC800\uC7A5. \uC2EC\uD654 \uD559\uC2B5 \uBAA8\uB4DC\uB294 \uAE30\uC874 \uD30C\uC77C\uC5D0 \uBCD1\uD569 (`updated` \uB0A0\uC9DC \uCD94\uAC00).\n\n## \uC778\uC218\n\n- \uCCAB \uBC88\uC9F8: \uD559\uC2B5 \uC8FC\uC81C (\uD544\uC218)\n- \uB450 \uBC88\uC9F8: \uCE74\uD14C\uACE0\uB9AC (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC \uC790\uB3D9 \uCD94\uB860)\n\n## \uADDC\uCE59\n\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)` \u2014 `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0\n- \uBBFC\uAC10 \uC815\uBCF4 \uB300\uCCB4\uAC12 \uC0AC\uC6A9 (example.com, your-api-key)\n';
39768
39879
 
39769
39880
  // vault-assets/skills/backlog/SKILL.md
39770
39881
  var SKILL_default2 = '---\nname: backlog\ndescription: "\uD559\uC2B5 \uBC31\uB85C\uADF8\uB97C \uC870\uD68C\uD558\uACE0 \uC9C4\uD589 \uC0C1\uD669\uC744 \uBCF4\uC5EC\uC900\uB2E4"\nargument-hint: "[\uCE74\uD14C\uACE0\uB9AC]"\ndisable-model-invocation: true\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Backlog Skill\n\n\uD559\uC2B5 \uBC31\uB85C\uADF8 \uC870\uD68C + \uC9C4\uD589 \uC0C1\uD669 \uC694\uC57D (\uC77D\uAE30 \uC804\uC6A9).\n\n## MCP \uB3C4\uAD6C\n\n- `til_backlog_status`: \uC804\uCCB4/\uCE74\uD14C\uACE0\uB9AC\uBCC4 \uC9C4\uD589\uB960 (category \uC9C0\uC815 \uC2DC sections \uD3EC\uD568)\n\n## \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n### \uC778\uC218 \uC5C6\uC74C (`/backlog`)\n\n1. `til_backlog_status` \uD638\uCD9C (MCP \uBD88\uAC00 \uC2DC `./til/*/backlog.md` Glob)\n2. \uBC31\uB85C\uADF8 \uC5C6\uC73C\uBA74 `/research` \uC548\uB0B4 \uD6C4 \uC885\uB8CC\n3. \uD14C\uC774\uBE14\uB85C \uC694\uC57D: \uCE74\uD14C\uACE0\uB9AC(\uB9C1\uD06C), \uC9C4\uD589\uB960, \uC644\uB8CC\uC218, \uCD5C\uADFC \uD559\uC2B5\uC77C, \uC9C4\uD589\uBC14\n\n### \uC778\uC218 \uC788\uC74C (`/backlog \uCE74\uD14C\uACE0\uB9AC`)\n\n1. `til_backlog_status`\uC5D0 category \uC804\uB2EC \u2192 sections \uD65C\uC6A9\n2. \uC139\uC158\uBCC4 \uCD9C\uB825:\n - `## {heading} ({\uC644\uB8CC\uC218}/{\uC804\uCCB4\uC218})`\n - `- (x) [{displayName}]({path})` / `- ( ) [{displayName}]({path})`\n - `- [ ]`/`- [x]` \uB9C8\uD06C\uB2E4\uC6B4 \uCCB4\uD06C\uBC15\uC2A4 \uC0AC\uC6A9 \uAE08\uC9C0 (\uD130\uBBF8\uB110 \uBBF8\uB80C\uB354\uB9C1)\n\n## \uCD9C\uB825 \uADDC\uCE59\n\n- \uBAA8\uB4E0 \uCE74\uD14C\uACE0\uB9AC\uBA85/\uD56D\uBAA9\uBA85\uC740 `[\uD45C\uC2DC\uBA85](\uACBD\uB85C)` \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C\uB85C \uCD9C\uB825\n- \uACBD\uB85C \uC9C1\uC811 \uB178\uCD9C \uAE08\uC9C0\n- \uC9C4\uD589\uBC14: 10\uCE78 (`\u2588` \uC644\uB8CC, `\u2591` \uBBF8\uC644\uB8CC)\n- \uD55C\uAD6D\uC5B4 \uCD9C\uB825\n- \uBC31\uB85C\uADF8 \uD30C\uC77C \uC218\uC815 \uAE08\uC9C0 (\uC77D\uAE30 \uC804\uC6A9)\n';
39771
39882
 
39772
39883
  // vault-assets/skills/research/SKILL.md
39773
- var SKILL_default3 = '---\nname: research\ndescription: "\uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uC5EC \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uAC1C\uB150/\uC6A9\uC5B4\uB97C \uD30C\uC545\uD558\uACE0, \uBC31\uB85C\uADF8\uB85C \uC815\uB9AC"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Research Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uAC1C\uB150/\uC758\uC874 \uAD00\uACC4 \uD30C\uC545 \u2192 \uBC31\uB85C\uADF8 \uD30C\uC77C \uC800\uC7A5.\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC8FC\uC81C \uC870\uC0AC, \uD544\uC694 \uAC1C\uB150\xB7\uC6A9\uC5B4\xB7\uC120\uD589 \uC9C0\uC2DD \uD30C\uC545\n2. \uC18C\uC8FC\uC81C \uBD84\uD574 \uD6C4 \uC9C1\uC811 \uB9AC\uC11C\uCE58\n3. \uC18C\uC8FC\uC81C \uAC04 \uC758\uC874 \uAD00\uACC4 \uBD84\uC11D\n\n## Phase 2: \uBC31\uB85C\uADF8 \uC815\uB9AC\n\n1. \uD559\uC2B5 \uC21C\uC11C \uC815\uB82C: \uC120\uD589 \uC9C0\uC2DD \u2192 \uD575\uC2EC \uAC1C\uB150 \u2192 \uC2EC\uD654\n2. \uAC01 \uD56D\uBAA9\uC5D0 1\uC904 \uC124\uBA85\n3. \uC0AC\uC6A9\uC790 \uD53C\uB4DC\uBC31 (\uCD94\uAC00/\uC81C\uAC70/\uC21C\uC11C \uBCC0\uACBD)\n\n## Phase 3: \uC800\uC7A5\n\n1. `./til/{\uCE74\uD14C\uACE0\uB9AC}/backlog.md`\uC5D0 \uC800\uC7A5 (\uD3F4\uB354 \uC790\uB3D9 \uC0DD\uC131)\n2. \uAE30\uC874 backlog.md \uC788\uC73C\uBA74 \uBCD1\uD569:\n - `[x]` \uC644\uB8CC \uD56D\uBAA9 \uBCF4\uC874\n - \uB3D9\uC77C \uD56D\uBAA9 \uCCB4\uD06C \uC0C1\uD0DC \uC720\uC9C0\n - \uAE30\uC874 sources \uBCF4\uC874, \uC0C8 \uD56D\uBAA9\uB9CC \uCD94\uAC00\n3. TIL MOC\uC5D0 \uBC31\uB85C\uADF8 \uB9C1\uD06C \uCD94\uAC00\n4. atomic commit: `\u{1F4CB} research: {\uC8FC\uC81C} \uD559\uC2B5 \uBC31\uB85C\uADF8 - {\uCE74\uD14C\uACE0\uB9AC}` (push \uC548 \uD568)\n\n## \uBC31\uB85C\uADF8 \uD15C\uD50C\uB9BF\n\n```markdown\n---\ntags: [backlog, {\uCE74\uD14C\uACE0\uB9AC}]\naliases: ["Backlog - {\uC8FC\uC81C}"]\nupdated: YYYY-MM-DD\nsources:\n slug-a: [https://url-1]\n---\n\n# {\uC8FC\uC81C} \uD559\uC2B5 \uBC31\uB85C\uADF8\n\n## \uC120\uD589 \uC9C0\uC2DD\n- [ ] [\uAC1C\uB150A](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-a}.md) - \uC124\uBA85\n\n## \uD575\uC2EC \uAC1C\uB150\n- [ ] [\uAC1C\uB150C](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-c}.md) - \uC124\uBA85\n\n## \uC2EC\uD654\n- [ ] [\uAC1C\uB150E](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-e}.md) - \uC124\uBA85\n```\n\n## \uC778\uC218\n\n- \uCCAB \uBC88\uC9F8: \uB9AC\uC11C\uCE58 \uC8FC\uC81C (\uD544\uC218)\n- \uB450 \uBC88\uC9F8: \uCE74\uD14C\uACE0\uB9AC (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC \uC790\uB3D9 \uCD94\uB860)\n\n## \uADDC\uCE59\n\n- \uD56D\uBAA9\uB2F9 1\uC904 \uC124\uBA85, 20\uAC1C \uCD08\uACFC \uC2DC \uBD84\uB9AC\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)`\n';
39884
+ var SKILL_default3 = '---\nname: research\ndescription: "\uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uC5EC \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uAC1C\uB150/\uC6A9\uC5B4\uB97C \uD30C\uC545\uD558\uACE0, \uBC31\uB85C\uADF8\uB85C \uC815\uB9AC"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Research Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uAC1C\uB150/\uC758\uC874 \uAD00\uACC4 \uD30C\uC545 \u2192 \uBC31\uB85C\uADF8 \uD30C\uC77C \uC800\uC7A5.\n\n## MCP \uB3C4\uAD6C\n\n- `til_list`: \uAE30\uC874 TIL \uD655\uC778 (search \uD30C\uB77C\uBBF8\uD130\uB85C \uC8FC\uC81C \uAC80\uC0C9)\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. `til_list(search=\uC8FC\uC81C)`\uB85C \uC774\uBBF8 \uD559\uC2B5\uD55C \uC8FC\uC81C \uD655\uC778 \u2192 \uC911\uBCF5 \uBC31\uB85C\uADF8 \uBC29\uC9C0\n2. \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC8FC\uC81C \uC870\uC0AC, \uD544\uC694 \uAC1C\uB150\xB7\uC6A9\uC5B4\xB7\uC120\uD589 \uC9C0\uC2DD \uD30C\uC545\n3. \uC18C\uC8FC\uC81C \uBD84\uD574 \uD6C4 \uC9C1\uC811 \uB9AC\uC11C\uCE58\n4. \uC18C\uC8FC\uC81C \uAC04 \uC758\uC874 \uAD00\uACC4 \uBD84\uC11D\n\n## Phase 2: \uBC31\uB85C\uADF8 \uC815\uB9AC\n\n1. \uD559\uC2B5 \uC21C\uC11C \uC815\uB82C: \uC120\uD589 \uC9C0\uC2DD \u2192 \uD575\uC2EC \uAC1C\uB150 \u2192 \uC2EC\uD654\n2. \uAC01 \uD56D\uBAA9\uC5D0 1\uC904 \uC124\uBA85\n3. \uC0AC\uC6A9\uC790 \uD53C\uB4DC\uBC31 (\uCD94\uAC00/\uC81C\uAC70/\uC21C\uC11C \uBCC0\uACBD)\n\n## Phase 3: \uC800\uC7A5\n\n1. `./til/{\uCE74\uD14C\uACE0\uB9AC}/backlog.md`\uC5D0 \uC800\uC7A5 (\uD3F4\uB354 \uC790\uB3D9 \uC0DD\uC131)\n2. \uAE30\uC874 backlog.md \uC788\uC73C\uBA74 \uBCD1\uD569:\n - `[x]` \uC644\uB8CC \uD56D\uBAA9 \uBCF4\uC874\n - \uB3D9\uC77C \uD56D\uBAA9 \uCCB4\uD06C \uC0C1\uD0DC \uC720\uC9C0\n - \uAE30\uC874 sources \uBCF4\uC874, \uC0C8 \uD56D\uBAA9\uB9CC \uCD94\uAC00\n3. TIL MOC\uC5D0 \uBC31\uB85C\uADF8 \uB9C1\uD06C \uCD94\uAC00\n4. atomic commit: `\u{1F4CB} research: {\uC8FC\uC81C} \uD559\uC2B5 \uBC31\uB85C\uADF8 - {\uCE74\uD14C\uACE0\uB9AC}` (push \uC548 \uD568)\n\n## \uBC31\uB85C\uADF8 \uD15C\uD50C\uB9BF\n\n```markdown\n---\ntags: [backlog, {\uCE74\uD14C\uACE0\uB9AC}]\naliases: ["Backlog - {\uC8FC\uC81C}"]\nupdated: YYYY-MM-DD\nsources:\n slug-a: [https://url-1]\n---\n\n# {\uC8FC\uC81C} \uD559\uC2B5 \uBC31\uB85C\uADF8\n\n## \uC120\uD589 \uC9C0\uC2DD\n- [ ] [\uAC1C\uB150A](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-a}.md) - \uC124\uBA85\n\n## \uD575\uC2EC \uAC1C\uB150\n- [ ] [\uAC1C\uB150C](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-c}.md) - \uC124\uBA85\n\n## \uC2EC\uD654\n- [ ] [\uAC1C\uB150E](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-e}.md) - \uC124\uBA85\n```\n\n## \uC778\uC218\n\n- \uCCAB \uBC88\uC9F8: \uB9AC\uC11C\uCE58 \uC8FC\uC81C (\uD544\uC218)\n- \uB450 \uBC88\uC9F8: \uCE74\uD14C\uACE0\uB9AC (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC \uC790\uB3D9 \uCD94\uB860)\n\n## \uADDC\uCE59\n\n- \uD56D\uBAA9\uB2F9 1\uC904 \uC124\uBA85, 20\uAC1C \uCD08\uACFC \uC2DC \uBD84\uB9AC\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)`\n';
39774
39885
 
39775
39886
  // vault-assets/skills/save/SKILL.md
39776
- var SKILL_default4 = '---\nname: save\ndescription: "\uD559\uC2B5 \uB0B4\uC6A9\uC744 TIL \uD30C\uC77C\uB85C \uC800\uC7A5\uD558\uACE0 Daily \uB178\uD2B8, MOC, \uBC31\uB85C\uADF8\uB97C \uC77C\uAD04 \uC5C5\uB370\uC774\uD2B8"\nargument-hint: "[\uC8FC\uC81C] [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Save Skill\n\n\uD559\uC2B5 \uB300\uD654 \u2192 TIL \uD30C\uC77C \uC800\uC7A5 \u2192 Daily/MOC/\uBC31\uB85C\uADF8 \uC5C5\uB370\uC774\uD2B8 \u2192 \uBB38\uC11C \uB9AC\uBDF0 \u2192 \uCEE4\uBC0B.\n\n## MCP \uB3C4\uAD6C\n\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545\n- `til_list`: \uAE30\uC874 TIL \uC911\uBCF5 \uD655\uC778\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790 \uD30C\uC77C \uCEE8\uD14D\uC2A4\uD2B8\n\n## Step 1: \uCEE8\uD14D\uC2A4\uD2B8 \uD655\uC778\n\n\uC8FC\uC81C\xB7\uCE74\uD14C\uACE0\uB9AC \uD30C\uC545. \uBD88\uBA85\uD655\uD558\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C8\uBB38.\n\n## Step 2: \uB9C1\uD06C \uD6C4\uBCF4 \uD30C\uC545\n\n1. `til_get_context` \uB610\uB294 MOC/\uBC31\uB85C\uADF8\uB85C \uAE30\uC874 TIL\xB7\uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD30C\uC545\n2. \uAE30\uC874 TIL/\uBC31\uB85C\uADF8 \uD56D\uBAA9 \u2192 \uBCF8\uBB38\uC5D0\uC11C \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C \uC0AC\uC6A9\n3. \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uAC1C\uB150 \u2192 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD655\uC778 \uD6C4 \uAD00\uB828 \uB178\uD2B8\uC5D0\uB9CC \uCD94\uAC00\n\n## Step 3: TIL \uD30C\uC77C \uC800\uC7A5\n\n\uACBD\uB85C: `./til/{\uCE74\uD14C\uACE0\uB9AC}/{\uC8FC\uC81C\uC2AC\uB7EC\uADF8}.md` (\uC2AC\uB7EC\uADF8: \uC601\uBB38 \uC18C\uBB38\uC790, \uD558\uC774\uD508)\n\n\uB3D9\uC77C \uC2AC\uB7EC\uADF8 \uD30C\uC77C \uC788\uC744 \uB54C:\n- `/til` \uC2EC\uD654 \uD559\uC2B5\uC774 \uC5F0\uC18D\uB41C \uACBD\uC6B0\uB9CC \uC790\uB3D9 \uBCD1\uD569 (\uAE30\uC874 \uB0B4\uC6A9 \uC720\uC9C0 + \uBCF4\uAC15, `updated` \uCD94\uAC00)\n- \uADF8 \uC678: \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCD1\uD569/\uB36E\uC5B4\uC4F0\uAE30 \uD655\uC778\n\n### TIL \uD15C\uD50C\uB9BF\n\n```markdown\n---\ndate: YYYY-MM-DDTHH:mm:ss\ncategory: \uCE74\uD14C\uACE0\uB9AC\ntags: [til, \uD0DC\uADF81]\naliases: ["\uD55C\uAE00 \uC81C\uBAA9", "\uC601\uBB38 \uC81C\uBAA9"]\n---\n\n# \uC81C\uBAA9\n\n> [!tldr] \uD55C\uC904 \uC694\uC57D\n\n## \uD575\uC2EC \uB0B4\uC6A9\n## \uC608\uC2DC\n## \uCC38\uACE0 \uC790\uB8CC\n- [\uC81C\uBAA9](URL)\n## \uAD00\uB828 \uB178\uD2B8\n- [TIL](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)\n```\n\n- `date`: `date +%Y-%m-%dT%H:%M:%S` \uBA85\uB839\uC73C\uB85C \uB85C\uCEEC \uC2DC\uAC01 \uC870\uD68C\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)` \u2014 `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0\n\n## Step 4: \uC5F0\uAD00 \uD30C\uC77C \uC5C5\uB370\uC774\uD2B8\n\n\uC544\uB798 3\uAC1C \uD30C\uC77C\uC744 **\uC9C1\uC811** \uC21C\uCC28 \uC5C5\uB370\uC774\uD2B8\uD55C\uB2E4 (subagent \uC0AC\uC6A9 \uAE08\uC9C0):\n\n1. Daily \uB178\uD2B8 (`./Daily/YYYY-MM-DD.md`): \uCE74\uD14C\uACE0\uB9AC\uBCC4 TIL \uB9C1\uD06C \uCD94\uAC00 (\uC5C6\uC73C\uBA74 \uC0DD\uC131)\n2. TIL MOC (`./til/TIL MOC.md`): \uCE74\uD14C\uACE0\uB9AC \uC139\uC158\uC5D0 \uD56D\uBAA9 \uCD94\uAC00 (\uC5C6\uC73C\uBA74 \uC0DD\uC131)\n3. \uBC31\uB85C\uADF8 (`./til/{\uCE74\uD14C\uACE0\uB9AC}/backlog.md`): \uD574\uB2F9 \uD56D\uBAA9 `[ ]` \u2192 `[x]`\n\n\uAC01 \uD30C\uC77C: Read \u2192 \uC704\uCE58 \uD655\uC778 \u2192 Edit. \uD30C\uC77C \uC5C6\uC73C\uBA74 \uC0DD\uC131.\n\n## Step 5: \uBB38\uC11C \uB9AC\uBDF0\n\n\uC800\uC7A5\uB41C TIL \uC804\uCCB4 \uB0B4\uC6A9 \uD45C\uC2DC \u2192 `AskUserQuestion`\uC73C\uB85C \uD655\uC778 ("\uD655\uC778 \uC644\uB8CC" / "\uC218\uC815 \uD544\uC694").\n\n## Step 6: \uBCF5\uC2B5 \uB4F1\uB85D\n\n`AskUserQuestion`\uC73C\uB85C "\uC774 TIL\uC744 \uBCF5\uC2B5 \uB300\uC0C1\uC5D0 \uCD94\uAC00\uD560\uAE4C\uC694?" \uC9C8\uBB38.\n\uC0AC\uC6A9\uC790 \uB3D9\uC758 \uC2DC `til_review_update` (action: "review", grade: 4) \uD638\uCD9C\uD558\uC5EC SRS \uBA54\uD0C0\uB370\uC774\uD130 \uC0DD\uC131.\n\n## Step 7: git commit\n\n`\u{1F4DD} til: {\uD55C\uAE00 \uC81C\uBAA9}({\uC601\uBB38 \uC81C\uBAA9}) - {\uCE74\uD14C\uACE0\uB9AC}` (push \uC548 \uD568)\n\n## \uADDC\uCE59\n\n- frontmatter \uD544\uC218: date, category, tags, aliases (\uB204\uB77D \uC2DC \uC800\uC7A5 \uC804 \uBCF4\uC644)\n- tags\uC5D0 \uBC18\uB4DC\uC2DC "til" \uD3EC\uD568 (\uC815\uC801 \uC0AC\uC774\uD2B8 \uD544\uD130 \uAE30\uC900)\n- `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0 \u2014 `[\uD45C\uC2DC\uBA85](\uACBD\uB85C)` \uD615\uC2DD\uB9CC \uC0AC\uC6A9\n- TIL\uB9CC \uC800\uC7A5\uD558\uACE0 Daily/MOC/\uBC31\uB85C\uADF8 \uB204\uB77D\uD558\uC9C0 \uC54A\uB294\uB2E4\n- Callout \uD65C\uC6A9: `> [!tldr]`, `> [!example]`, `> [!warning]`, `> [!tip]`\n- \uBCF5\uC7A1\uD55C \uAC1C\uB150\uC740 Mermaid \uB2E4\uC774\uC5B4\uADF8\uB7A8\uC73C\uB85C \uC2DC\uAC01\uD654 (TIL\uB2F9 \uCD5C\uB300 1\uAC1C)\n- \uBBFC\uAC10 \uC815\uBCF4 \uB300\uCCB4\uAC12 \uC0AC\uC6A9\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n';
39887
+ var SKILL_default4 = '---\nname: save\ndescription: "\uD559\uC2B5 \uB0B4\uC6A9\uC744 TIL \uD30C\uC77C\uB85C \uC800\uC7A5\uD558\uACE0 Daily \uB178\uD2B8, MOC, \uBC31\uB85C\uADF8\uB97C \uC77C\uAD04 \uC5C5\uB370\uC774\uD2B8"\nargument-hint: "[\uC8FC\uC81C] [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Save Skill\n\n\uD559\uC2B5 \uB300\uD654 \u2192 TIL \uD30C\uC77C \uC800\uC7A5 \u2192 Daily/MOC/\uBC31\uB85C\uADF8 \uC5C5\uB370\uC774\uD2B8 \u2192 \uBB38\uC11C \uB9AC\uBDF0 \u2192 \uCEE4\uBC0B.\n\n## MCP \uB3C4\uAD6C\n\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545\n- `til_list`: \uAE30\uC874 TIL \uC911\uBCF5 \uD655\uC778\n- `til_exists`: TIL \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \uBE60\uB978 \uD655\uC778\n- `til_save_note`: TIL \uB178\uD2B8 \uC800\uC7A5 (frontmatter/\uACBD\uB85C \uADDC\uCE59 \uC11C\uBC84 \uBCF4\uC7A5)\n- `til_backlog_check`: \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uC644\uB8CC \uCC98\uB9AC\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790 \uD30C\uC77C \uCEE8\uD14D\uC2A4\uD2B8\n\n## Step 1: \uCEE8\uD14D\uC2A4\uD2B8 \uD655\uC778\n\n1. \uC8FC\uC81C\xB7\uCE74\uD14C\uACE0\uB9AC \uD30C\uC545. \uBD88\uBA85\uD655\uD558\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C8\uBB38.\n2. `til_exists(category, slug)`\uB85C \uB3D9\uC77C \uC2AC\uB7EC\uADF8 \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \uBE60\uB978 \uD655\uC778.\n\n## Step 2: \uB9C1\uD06C \uD6C4\uBCF4 \uD30C\uC545\n\n1. `til_get_context` \uB610\uB294 MOC/\uBC31\uB85C\uADF8\uB85C \uAE30\uC874 TIL\xB7\uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD30C\uC545\n2. \uAE30\uC874 TIL/\uBC31\uB85C\uADF8 \uD56D\uBAA9 \u2192 \uBCF8\uBB38\uC5D0\uC11C \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C \uC0AC\uC6A9\n3. \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uAC1C\uB150 \u2192 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD655\uC778 \uD6C4 \uAD00\uB828 \uB178\uD2B8\uC5D0\uB9CC \uCD94\uAC00\n\n## Step 3: TIL \uD30C\uC77C \uC800\uC7A5\n\n\uACBD\uB85C: `./til/{\uCE74\uD14C\uACE0\uB9AC}/{\uC8FC\uC81C\uC2AC\uB7EC\uADF8}.md` (\uC2AC\uB7EC\uADF8: \uC601\uBB38 \uC18C\uBB38\uC790, \uD558\uC774\uD508)\n\n**\uC0C8 \uD30C\uC77C \uC800\uC7A5**: `til_save_note` MCP \uB3C4\uAD6C\uB85C \uC800\uC7A5. frontmatter(title, date, category, tags, aliases)\uC640 \uACBD\uB85C \uADDC\uCE59\uC744 \uC11C\uBC84\uAC00 \uBCF4\uC7A5\uD55C\uB2E4.\n\n```\ntil_save_note(category, slug, title, content, tags, date, fmCategory, aliases)\n```\n\n- `date`: `date +%Y-%m-%dT%H:%M:%S` \uBA85\uB839\uC73C\uB85C \uB85C\uCEEC \uC2DC\uAC01\uC744 \uC870\uD68C\uD558\uC5EC \uC804\uB2EC\n- `tags`: \uBC18\uB4DC\uC2DC "til" \uD3EC\uD568\n- `aliases`: ["\uD55C\uAE00 \uC81C\uBAA9", "\uC601\uBB38 \uC81C\uBAA9"]\n- `content`: frontmatter \uC81C\uC678\uD55C \uBCF8\uBB38 \uB9C8\uD06C\uB2E4\uC6B4\n\n**\uB3D9\uC77C \uC2AC\uB7EC\uADF8 \uD30C\uC77C \uC788\uC744 \uB54C** (Step 1\uC5D0\uC11C `til_exists`\uB85C \uAC10\uC9C0):\n- `/til` \uC2EC\uD654 \uD559\uC2B5\uC774 \uC5F0\uC18D\uB41C \uACBD\uC6B0\uB9CC \uC790\uB3D9 \uBCD1\uD569 (\uAE30\uC874 \uB0B4\uC6A9 \uC720\uC9C0 + \uBCF4\uAC15, `updated` \uCD94\uAC00)\n- \uADF8 \uC678: \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCD1\uD569/\uB36E\uC5B4\uC4F0\uAE30 \uD655\uC778\n- \uBCD1\uD569 \uC2DC\uC5D0\uB294 `til_save_note` \uB300\uC2E0 \uC9C1\uC811 Read\u2192Edit\uC73C\uB85C \uAE30\uC874 \uB0B4\uC6A9\uC5D0 \uBCF4\uAC15\n\n### TIL \uBCF8\uBB38 \uD15C\uD50C\uB9BF\n\n```markdown\n# \uC81C\uBAA9\n\n> [!tldr] \uD55C\uC904 \uC694\uC57D\n\n## \uD575\uC2EC \uB0B4\uC6A9\n## \uC608\uC2DC\n## \uCC38\uACE0 \uC790\uB8CC\n- [\uC81C\uBAA9](URL)\n## \uAD00\uB828 \uB178\uD2B8\n- [TIL](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)\n```\n\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)` \u2014 `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0\n\n## Step 4: \uC5F0\uAD00 \uD30C\uC77C \uC5C5\uB370\uC774\uD2B8\n\n\uC544\uB798 3\uAC1C \uD30C\uC77C\uC744 **\uC9C1\uC811** \uC21C\uCC28 \uC5C5\uB370\uC774\uD2B8\uD55C\uB2E4 (subagent \uC0AC\uC6A9 \uAE08\uC9C0):\n\n1. Daily \uB178\uD2B8 (`./Daily/YYYY-MM-DD.md`): \uCE74\uD14C\uACE0\uB9AC\uBCC4 TIL \uB9C1\uD06C \uCD94\uAC00 (\uC5C6\uC73C\uBA74 \uC0DD\uC131)\n2. TIL MOC (`./til/TIL MOC.md`): \uCE74\uD14C\uACE0\uB9AC \uC139\uC158\uC5D0 \uD56D\uBAA9 \uCD94\uAC00 (\uC5C6\uC73C\uBA74 \uC0DD\uC131)\n3. \uBC31\uB85C\uADF8: `til_backlog_check(category, slug)` MCP \uB3C4\uAD6C\uB85C \uD574\uB2F9 \uD56D\uBAA9 \uC644\uB8CC \uCC98\uB9AC\n\nDaily/MOC: Read \u2192 \uC704\uCE58 \uD655\uC778 \u2192 Edit. \uD30C\uC77C \uC5C6\uC73C\uBA74 \uC0DD\uC131.\n\n## Step 5: \uBB38\uC11C \uB9AC\uBDF0\n\n\uC800\uC7A5\uB41C TIL \uC804\uCCB4 \uB0B4\uC6A9 \uD45C\uC2DC \u2192 `AskUserQuestion`\uC73C\uB85C \uD655\uC778 ("\uD655\uC778 \uC644\uB8CC" / "\uC218\uC815 \uD544\uC694").\n\n## Step 6: \uBCF5\uC2B5 \uB4F1\uB85D\n\n`AskUserQuestion`\uC73C\uB85C "\uC774 TIL\uC744 \uBCF5\uC2B5 \uB300\uC0C1\uC5D0 \uCD94\uAC00\uD560\uAE4C\uC694?" \uC9C8\uBB38.\n\uC0AC\uC6A9\uC790 \uB3D9\uC758 \uC2DC `til_review_update` (action: "review", grade: 4) \uD638\uCD9C\uD558\uC5EC SRS \uBA54\uD0C0\uB370\uC774\uD130 \uC0DD\uC131.\n\n## Step 7: git commit\n\n`\u{1F4DD} til: {\uD55C\uAE00 \uC81C\uBAA9}({\uC601\uBB38 \uC81C\uBAA9}) - {\uCE74\uD14C\uACE0\uB9AC}` (push \uC548 \uD568)\n\n## \uADDC\uCE59\n\n- frontmatter \uD544\uC218: date, category, tags, aliases (\uB204\uB77D \uC2DC \uC800\uC7A5 \uC804 \uBCF4\uC644)\n- tags\uC5D0 \uBC18\uB4DC\uC2DC "til" \uD3EC\uD568 (\uC815\uC801 \uC0AC\uC774\uD2B8 \uD544\uD130 \uAE30\uC900)\n- `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0 \u2014 `[\uD45C\uC2DC\uBA85](\uACBD\uB85C)` \uD615\uC2DD\uB9CC \uC0AC\uC6A9\n- TIL\uB9CC \uC800\uC7A5\uD558\uACE0 Daily/MOC/\uBC31\uB85C\uADF8 \uB204\uB77D\uD558\uC9C0 \uC54A\uB294\uB2E4\n- Callout \uD65C\uC6A9: `> [!tldr]`, `> [!example]`, `> [!warning]`, `> [!tip]`\n- \uBCF5\uC7A1\uD55C \uAC1C\uB150\uC740 Mermaid \uB2E4\uC774\uC5B4\uADF8\uB7A8\uC73C\uB85C \uC2DC\uAC01\uD654 (TIL\uB2F9 \uCD5C\uB300 1\uAC1C)\n- \uBBFC\uAC10 \uC815\uBCF4 \uB300\uCCB4\uAC12 \uC0AC\uC6A9\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n';
39777
39888
 
39778
39889
  // vault-assets/skills/migrate-links/SKILL.md
39779
39890
  var SKILL_default5 = '---\nname: migrate-links\ndescription: "vault\uC758 [[wikilink]]\uB97C \uD45C\uC900 \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C\uB85C \uC77C\uAD04 \uBCC0\uD658"\nargument-hint: ""\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Migrate Links Skill\n\n`[[wikilink]]` \u2192 `[text](path.md)` \uC77C\uAD04 \uBCC0\uD658.\n\n## CLI\n\n```bash\nnode .obsidian/plugins/oh-my-til/migrate-links.mjs . scan\nnode .obsidian/plugins/oh-my-til/migrate-links.mjs . migrate\nnode .obsidian/plugins/oh-my-til/migrate-links.mjs . verify\n```\n\n## \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n1. **\uC2A4\uCE94**: `scan` \uC2E4\uD589 \u2192 wikilink \uC5C6\uC73C\uBA74 \uC885\uB8CC, \uC788\uC73C\uBA74 `AskUserQuestion`\uC73C\uB85C \uD655\uC778\n2. **\uBCC0\uD658**: `migrate` \uC2E4\uD589\n3. **\uAC80\uC99D**: `verify` \uC2E4\uD589 \u2192 \uC794\uC5EC wikilink \uC548\uB0B4\n4. **\uCEE4\uBC0B**: `\u267B\uFE0F refactor: [[wikilink]] \u2192 \uD45C\uC900 \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C \uC77C\uAD04 \uBCC0\uD658` (push \uC548 \uD568)\n\n## \uBCC0\uD658 \uADDC\uCE59\n\n- `[[path|Display]]` \u2192 `[Display](path.md)`\n- `[[path]]` \u2192 `[path](path.md)`\n- \uCF54\uB4DC \uBE14\uB85D \uB0B4\uBD80 \uC81C\uC678, \uD14C\uC774\uBE14 `\\|` \uC774\uC2A4\uCF00\uC774\uD504 \uCC98\uB9AC\n';
@@ -39788,10 +39899,10 @@ var SKILL_default7 = '---\nname: setup-pages\ndescription: "(deprecated) /omt-se
39788
39899
  var SKILL_default8 = '---\nname: omt-setup\ndescription: "oh-my-til \uD1B5\uD569 \uC124\uC815 \u2014 \uBC30\uD3EC \uC124\uC815"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# OMT Setup Skill\n\noh-my-til \uC124\uC815\uC744 \uD55C \uACF3\uC5D0\uC11C \uAD00\uB9AC. \uC11C\uBE0C\uCEE4\uB9E8\uB4DC\uB85C \uB3D9\uC791.\n\n## \uC11C\uBE0C\uCEE4\uB9E8\uB4DC\n\n### `/omt-setup` (\uC778\uC218 \uC5C6\uC74C)\n\n`oh-my-til.json` \uC77D\uC5B4\uC11C \uD604\uC7AC \uC124\uC815 \uD45C\uC2DC + \uC11C\uBE0C\uCEE4\uB9E8\uB4DC \uC548\uB0B4:\n- `deploy` \u2014 GitHub Pages \uBC30\uD3EC \uC124\uC815\n\n### `/omt-setup deploy`\n\nGitHub Pages \uBC30\uD3EC \uC124\uC815:\n1. `.git/` \uD655\uC778 (\uC5C6\uC73C\uBA74 \uC548\uB0B4 \uD6C4 \uC885\uB8CC)\n2. `.github/workflows/deploy-til.yml` \uD655\uC778 (\uC788\uC73C\uBA74 \uC218\uC815 \uD544\uC694 \uC5EC\uBD80 \uC9C8\uBB38)\n3. `oh-my-til.json` deploy \uC139\uC158 \uC124\uC815 (\uC81C\uBAA9, \uBD80\uC81C\uBAA9, GitHub URL)\n4. \uC6CC\uD06C\uD50C\uB85C\uC6B0 YAML \uC0DD\uC131\n5. \uC644\uB8CC \uC548\uB0B4 (Settings \u2192 Pages \u2192 GitHub Actions \uC120\uD0DD, \uCEE4\uBC0B\xB7push \uBA85\uB839\uC5B4)\n\n## \uADDC\uCE59\n\n- \uD55C\uAD6D\uC5B4 \uCD9C\uB825\n- `oh-my-til.json`\uC758 \uAE30\uC874 \uC124\uC815 \uBCF4\uC874, \uD574\uB2F9 \uC139\uC158\uB9CC \uCD94\uAC00/\uC218\uC815\n- \uCEE4\uBC0B\uC740 \uD558\uC9C0 \uC54A\uC74C (\uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBA85\uB839\uC5B4 \uC548\uB0B4\uB9CC)\n';
39789
39900
 
39790
39901
  // vault-assets/skills/til-review/SKILL.md
39791
- var SKILL_default9 = '---\nname: til-review\ndescription: "SRS \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158 (\uAC04\uACA9 \uBC18\uBCF5 \uD559\uC2B5)"\nargument-hint: "[\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Review Skill\n\nSRS(\uAC04\uACA9 \uBC18\uBCF5) \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158. SM-2 \uC54C\uACE0\uB9AC\uC998\uC73C\uB85C \uBCF5\uC2B5 \uC77C\uC815\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n\n## MCP \uB3C4\uAD6C\n\n- `til_review_list`: \uC624\uB298 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update`: \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D (grade 0-5) \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n- `vault_read_note`: \uCE74\uB4DC \uB0B4\uC6A9 \uC77D\uAE30\n\n## Step 1: \uBCF5\uC2B5 \uCE74\uB4DC \uB85C\uB4DC\n\n`til_review_list` \uD638\uCD9C (\uCE74\uD14C\uACE0\uB9AC \uC778\uC790 \uC788\uC73C\uBA74 \uC804\uB2EC).\n\n- \uCE74\uB4DC 0\uAC1C \u2192 "\uC624\uB298 \uBCF5\uC2B5 \uC5C6\uC74C" \uC548\uB0B4 + \uBBF8\uB4F1\uB85D TIL \uB4F1\uB85D \uC81C\uC548 (Step 5\uB85C)\n- \uCE74\uB4DC \uC788\uC74C \u2192 \uBAA9\uB85D \uD45C\uC2DC + Step 2\uB85C\n\n## Step 2: \uD3C9\uAC00 \uBAA8\uB4DC \uC120\uD0DD\n\n`AskUserQuestion`\uC73C\uB85C \uC120\uD0DD:\n- **\uAC04\uB2E8 \uBAA8\uB4DC**: "\uAE30\uC5B5\uB0A8 / \uBAA8\uB984" 2\uB2E8\uACC4 (\uB0B4\uBD80\uC801\uC73C\uB85C grade 4 / 1)\n- **\uC0C1\uC138 \uBAA8\uB4DC**: 0~5\uC810 \uC790\uAE30 \uD3C9\uAC00\n\n## Step 3: \uCE74\uB4DC\uBCC4 \uBCF5\uC2B5 \uB8E8\uD504\n\n\uAC01 \uCE74\uB4DC\uC5D0 \uB300\uD574:\n\n1. \uC81C\uBAA9\xB7\uCE74\uD14C\uACE0\uB9AC\xB7\uBCF5\uC2B5 \uC815\uBCF4(\uBC18\uBCF5 \uD69F\uC218, EF, \uC5F0\uCCB4\uC77C) \uD45C\uC2DC\n2. `vault_read_note`\uB85C \uB0B4\uC6A9 \uC77D\uAE30\n3. \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC9C8\uBB38 \uD615\uC2DD\uC73C\uB85C \uC81C\uC2DC (\uB0B4\uC6A9 \uAE30\uBC18\uC73C\uB85C 1~2\uAC1C \uC9C8\uBB38 \uC0DD\uC131)\n4. \uC0AC\uC6A9\uC790 \uB2F5\uBCC0 \uB300\uAE30\n5. \uD53C\uB4DC\uBC31 \uC81C\uACF5 (\uC815\uB2F5/\uBCF4\uCDA9 \uC124\uBA85)\n6. \uD3C9\uAC00 \uC785\uB825:\n - \uAC04\uB2E8 \uBAA8\uB4DC: "\uAE30\uC5B5\uB0A8" / "\uBAA8\uB984" \u2192 grade 4 / 1\n - \uC0C1\uC138 \uBAA8\uB4DC: 0~5\uC810\n7. `til_review_update` (action: "review", grade) \uD638\uCD9C\n8. \uACB0\uACFC \uC694\uC57D (\uB2E4\uC74C \uBCF5\uC2B5\uC77C, interval) \uD45C\uC2DC\n\n## Step 4: \uC644\uB8CC \uD1B5\uACC4\n\n\uBAA8\uB4E0 \uCE74\uB4DC \uC644\uB8CC \uD6C4:\n- \uBCF5\uC2B5\uD55C \uCE74\uB4DC \uC218, \uD3C9\uADE0 grade\n- remaining > 0\uC774\uBA74 "N\uAC1C \uB354 \uB0A8\uC74C, \uB0B4\uC77C \uC774\uC5B4\uC11C" \uC548\uB0B4\n- `til_review_list` \uC7AC\uD638\uCD9C\uD558\uC5EC \uCD5C\uC2E0 \uD1B5\uACC4 \uD45C\uC2DC\n\n## Step 5: TIL \uB4F1\uB85D (\uC120\uD0DD)\n\n\uCE74\uB4DC\uAC00 \uC5C6\uC744 \uB54C \uB610\uB294 \uC0AC\uC6A9\uC790 \uC694\uCCAD \uC2DC:\n- `til_list`\uB85C \uC804\uCCB4 TIL \uBAA9\uB85D \uD45C\uC2DC\n- \uC0AC\uC6A9\uC790\uAC00 \uBCF5\uC2B5 \uB300\uC0C1\uC5D0 \uCD94\uAC00\uD560 \uD30C\uC77C \uC120\uD0DD\n- \uC120\uD0DD\uB41C \uD30C\uC77C\uB9C8\uB2E4 `til_review_update` (action: "review", grade: 4) \uD638\uCD9C\n\n## \uADDC\uCE59\n\n- \uD55C \uC138\uC158 \uCD5C\uB300 20\uAC1C (\uACFC\uBD80\uD558 \uBC29\uC9C0)\n- \uC5F0\uCCB4 \uCE74\uB4DC \uC6B0\uC120 (\uAC00\uC7A5 \uAE09\uD55C \uAC83 \uBA3C\uC800)\n- \uBCF5\uC2B5 \uD574\uC81C: \uC0AC\uC6A9\uC790\uAC00 "\uC774 \uCE74\uB4DC \uC81C\uAC70"\uD558\uBA74 `til_review_update` (action: "remove") \uD638\uCD9C\n- \uD55C\uAD6D\uC5B4 \uC9C4\uD589, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n';
39902
+ var SKILL_default9 = '---\nname: til-review\ndescription: "SRS \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158 (\uAC04\uACA9 \uBC18\uBCF5 \uD559\uC2B5)"\nargument-hint: "[\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Review Skill\n\nSRS(\uAC04\uACA9 \uBC18\uBCF5) \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158. SM-2 \uC54C\uACE0\uB9AC\uC998\uC73C\uB85C \uBCF5\uC2B5 \uC77C\uC815\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n\n## MCP \uB3C4\uAD6C\n\n- `til_review_list`: \uC624\uB298 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update`: \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D (grade 0-5) \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n- `vault_read_note`: \uCE74\uB4DC \uB0B4\uC6A9 \uC77D\uAE30\n\n## Step 1: \uBCF5\uC2B5 \uCE74\uB4DC \uB85C\uB4DC\n\n`til_review_list` \uD638\uCD9C (\uCE74\uD14C\uACE0\uB9AC \uC778\uC790 \uC788\uC73C\uBA74 \uC804\uB2EC).\n\n- \uCE74\uB4DC 0\uAC1C \u2192 "\uC624\uB298 \uBCF5\uC2B5 \uC5C6\uC74C" \uC548\uB0B4 + \uBBF8\uB4F1\uB85D TIL \uB4F1\uB85D \uC81C\uC548 (Step 5\uB85C)\n- \uCE74\uB4DC \uC788\uC74C \u2192 \uBAA9\uB85D \uD45C\uC2DC + Step 2\uB85C\n\n## Step 2: \uD3C9\uAC00 \uBAA8\uB4DC \uC120\uD0DD\n\n`AskUserQuestion`\uC73C\uB85C \uC120\uD0DD:\n- "\uAC04\uB2E8 \uBAA8\uB4DC (Again / Good)"\n- "\uC0C1\uC138 \uBAA8\uB4DC (Again / Hard / Good / Easy)"\n\n## Step 3: \uCE74\uB4DC\uBCC4 \uBCF5\uC2B5 \uB8E8\uD504\n\n\uAC01 \uCE74\uB4DC\uC5D0 \uB300\uD574:\n\n1. \uC81C\uBAA9\xB7\uCE74\uD14C\uACE0\uB9AC\xB7\uBCF5\uC2B5 \uC815\uBCF4(\uBC18\uBCF5 \uD69F\uC218, EF, \uC5F0\uCCB4\uC77C) \uD45C\uC2DC\n2. `vault_read_note`\uB85C \uB0B4\uC6A9 \uC77D\uAE30\n3. \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC9C8\uBB38 \uD615\uC2DD\uC73C\uB85C \uC81C\uC2DC (\uB0B4\uC6A9 \uAE30\uBC18\uC73C\uB85C 1~2\uAC1C \uC9C8\uBB38 \uC0DD\uC131)\n4. \uC0AC\uC6A9\uC790 \uB2F5\uBCC0 \uB300\uAE30\n5. \uD53C\uB4DC\uBC31 \uC81C\uACF5 (\uC815\uB2F5/\uBCF4\uCDA9 \uC124\uBA85)\n6. `AskUserQuestion`\uC73C\uB85C \uD3C9\uAC00 \uC785\uB825:\n - \uAC04\uB2E8 \uBAA8\uB4DC: "Good (\uAE30\uC5B5\uB0A8)" / "Again (\uBAA8\uB984)" / "\uAC74\uB108\uB6F0\uAE30" / "\uBCF5\uC2B5 \uC911\uB2E8"\n - \uC0C1\uC138 \uBAA8\uB4DC: "Again (\uC2E4\uD328)" / "Hard (\uC5B4\uB835\uAC8C \uC815\uB2F5)" / "Good (\uC815\uC0C1)" / "Easy (\uC644\uBCBD)"\n - grade \uB9E4\uD551: Again=1, Hard=3, Good=4, Easy=5\n - "\uAC74\uB108\uB6F0\uAE30" \uC120\uD0DD \uC2DC \uC774 \uCE74\uB4DC\uB294 \uD3C9\uAC00\uD558\uC9C0 \uC54A\uACE0 \uB2E4\uC74C\uC73C\uB85C\n - "\uBCF5\uC2B5 \uC911\uB2E8" \uC120\uD0DD \uC2DC Step 4\uB85C \uC774\uB3D9\n - \uC0C1\uC138 \uBAA8\uB4DC\uC5D0\uC11C \uAC74\uB108\uB6F0\uAE30/\uC911\uB2E8: "Other" \uC120\uD0DD \uD6C4 "\uAC74\uB108\uB6F0\uAE30" \uB610\uB294 "\uBCF5\uC2B5 \uC911\uB2E8" \uC785\uB825\n7. \uAC74\uB108\uB6F0\uAE30\uAC00 \uC544\uB2CC \uACBD\uC6B0 `til_review_update` (action: "review", grade) \uD638\uCD9C\n8. \uACB0\uACFC \uC694\uC57D (\uB2E4\uC74C \uBCF5\uC2B5\uC77C, interval) \uD45C\uC2DC\n\n## Step 4: \uC644\uB8CC \uD1B5\uACC4\n\n\uBAA8\uB4E0 \uCE74\uB4DC \uC644\uB8CC \uD6C4:\n- \uBCF5\uC2B5\uD55C \uCE74\uB4DC \uC218, \uD3C9\uADE0 grade\n- remaining > 0\uC774\uBA74 "N\uAC1C \uB354 \uB0A8\uC74C, \uB0B4\uC77C \uC774\uC5B4\uC11C" \uC548\uB0B4\n- `til_review_list` \uC7AC\uD638\uCD9C\uD558\uC5EC \uCD5C\uC2E0 \uD1B5\uACC4 \uD45C\uC2DC\n\n## Step 5: TIL \uB4F1\uB85D (\uC120\uD0DD)\n\n\uCE74\uB4DC\uAC00 \uC5C6\uC744 \uB54C \uB610\uB294 \uC0AC\uC6A9\uC790 \uC694\uCCAD \uC2DC:\n- `til_list`\uB85C \uC804\uCCB4 TIL \uBAA9\uB85D \uD45C\uC2DC\n- \uC0AC\uC6A9\uC790\uAC00 \uBCF5\uC2B5 \uB300\uC0C1\uC5D0 \uCD94\uAC00\uD560 \uD30C\uC77C \uC120\uD0DD\n- \uC120\uD0DD\uB41C \uD30C\uC77C\uB9C8\uB2E4 `til_review_update` (action: "review", grade: 4) \uD638\uCD9C\n\n## \uADDC\uCE59\n\n- \uD55C \uC138\uC158 \uCD5C\uB300 20\uAC1C (\uACFC\uBD80\uD558 \uBC29\uC9C0)\n- \uC5F0\uCCB4 \uCE74\uB4DC \uC6B0\uC120 (\uAC00\uC7A5 \uAE09\uD55C \uAC83 \uBA3C\uC800)\n- \uBCF5\uC2B5 \uD574\uC81C: \uC0AC\uC6A9\uC790\uAC00 "\uC774 \uCE74\uB4DC \uC81C\uAC70"\uD558\uBA74 `til_review_update` (action: "remove") \uD638\uCD9C\n- \uD55C\uAD6D\uC5B4 \uC9C4\uD589, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n';
39792
39903
 
39793
39904
  // vault-assets/claude-md-section.md
39794
- var claude_md_section_default = "## \uD559\uC2B5 \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n1. `/research <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uBC31\uB85C\uADF8 \uC0DD\uC131\n2. `/backlog [\uCE74\uD14C\uACE0\uB9AC]` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589 \uD655\uC778\n3. `/til <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 \uC800\uC7A5\n4. `/save` \u2014 TIL \uC800\uC7A5 (Daily/MOC/\uBC31\uB85C\uADF8 \uC790\uB3D9 \uC5C5\uB370\uC774\uD2B8)\n5. `/til-review [\uCE74\uD14C\uACE0\uB9AC]` \u2014 SRS \uAE30\uBC18 \uAC04\uACA9 \uBC18\uBCF5 \uBCF5\uC2B5\n\n## MCP \uB3C4\uAD6C\n\n- `vault_read_note` \u2014 \uB178\uD2B8 \uC77D\uAE30\n- `vault_list_files` \u2014 \uD30C\uC77C \uBAA9\uB85D\n- `vault_search` \u2014 \uD14D\uC2A4\uD2B8 \uAC80\uC0C9\n- `vault_get_active_file` \u2014 \uD604\uC7AC \uD30C\uC77C\n- `til_list` \u2014 TIL \uBAA9\uB85D + \uCE74\uD14C\uACE0\uB9AC \uBD84\uB958\n- `til_get_context` \u2014 \uC8FC\uC81C \uAD00\uB828 \uCEE8\uD14D\uC2A4\uD2B8\n- `til_recent_context` \u2014 \uCD5C\uADFC \uD559\uC2B5 \uD750\uB984\n- `til_backlog_status` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589\uB960\n- `til_dashboard` \u2014 \uD559\uC2B5 \uD1B5\uACC4\n- `til_review_list` \u2014 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update` \u2014 \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n\n### \uC5F0\uACB0\n\n```bash\nclaude mcp add --transport http oh-my-til http://localhost:22360/mcp\n```\n";
39905
+ var claude_md_section_default = "## \uD559\uC2B5 \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n1. `/research <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uBC31\uB85C\uADF8 \uC0DD\uC131\n2. `/backlog [\uCE74\uD14C\uACE0\uB9AC]` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589 \uD655\uC778\n3. `/til <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 \uC800\uC7A5\n4. `/save` \u2014 TIL \uC800\uC7A5 (Daily/MOC/\uBC31\uB85C\uADF8 \uC790\uB3D9 \uC5C5\uB370\uC774\uD2B8)\n5. `/til-review [\uCE74\uD14C\uACE0\uB9AC]` \u2014 SRS \uAE30\uBC18 \uAC04\uACA9 \uBC18\uBCF5 \uBCF5\uC2B5\n\n## MCP \uB3C4\uAD6C\n\n- `vault_read_note` \u2014 \uB178\uD2B8 \uC77D\uAE30\n- `vault_list_files` \u2014 \uD30C\uC77C \uBAA9\uB85D\n- `vault_search` \u2014 \uD14D\uC2A4\uD2B8 \uAC80\uC0C9\n- `vault_get_active_file` \u2014 \uD604\uC7AC \uD30C\uC77C\n- `til_list` \u2014 TIL \uBAA9\uB85D + \uCE74\uD14C\uACE0\uB9AC \uBD84\uB958 (search \uD544\uD130 \uC9C0\uC6D0)\n- `til_exists` \u2014 TIL \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \uD655\uC778\n- `til_save_note` \u2014 TIL \uB178\uD2B8 \uC800\uC7A5 (frontmatter/\uACBD\uB85C \uADDC\uCE59 \uBCF4\uC7A5, category\xB7aliases \uC9C0\uC6D0)\n- `til_get_context` \u2014 \uC8FC\uC81C \uAD00\uB828 \uCEE8\uD14D\uC2A4\uD2B8\n- `til_recent_context` \u2014 \uCD5C\uADFC \uD559\uC2B5 \uD750\uB984\n- `til_backlog_status` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589\uB960\n- `til_backlog_check` \u2014 \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uC644\uB8CC \uCC98\uB9AC\n- `til_dashboard` \u2014 \uD559\uC2B5 \uD1B5\uACC4\n- `til_review_list` \u2014 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update` \u2014 \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n\n### \uC5F0\uACB0\n\n```bash\nclaude mcp add --transport http oh-my-til http://localhost:22360/mcp\n```\n";
39795
39906
 
39796
39907
  // vault-assets/agents/til-fetcher.md
39797
39908
  var til_fetcher_default = '---\nname: til-fetcher\ndescription: \uC18C\uC2A4 URL \uCF58\uD150\uCE20\uB97C \uD328\uCE58\uD558\uC5EC \uD559\uC2B5 \uC790\uB8CC\uB85C \uC694\uC57D\uD558\uB294 \uC804\uC6A9 \uC5D0\uC774\uC804\uD2B8\ntools: Read, WebFetch\nmodel: haiku\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# til-fetcher\n\n\uC18C\uC2A4 URL\uC758 \uCF58\uD150\uCE20\uB97C \uD328\uCE58\uD558\uACE0 \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC694\uC57D\uD558\uB294 \uC804\uC6A9 \uC5D0\uC774\uC804\uD2B8.\n\n## \uC5ED\uD560\n\n- `/til` \uC2A4\uD0AC\uC758 Phase 1\uC5D0\uC11C sourceUrls \uD328\uCE58 subagent\uB85C \uC0AC\uC6A9\uB41C\uB2E4\n- \uC8FC\uC5B4\uC9C4 URL(1\uAC1C \uB610\uB294 \uC5EC\uB7EC \uAC1C)\uC744 WebFetch\uB85C \uC21C\uCC28 \uC77D\uACE0 \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC694\uC57D\uD55C\uB2E4\n- \uC5EC\uB7EC URL\uC774 \uC804\uB2EC\uB418\uBA74 \uAC01\uAC01 \uD328\uCE58 \uD6C4 \uD1B5\uD569 \uC694\uC57D\uC744 \uBC18\uD658\uD55C\uB2E4\n\n## \uCD9C\uB825 \uD615\uC2DD\n\n- \uD575\uC2EC \uB0B4\uC6A9 \uC694\uC57D (\uD55C\uAD6D\uC5B4, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30)\n- \uCF54\uB4DC \uC608\uC2DC\uAC00 \uC788\uC73C\uBA74 \uD3EC\uD568\n';
@@ -41130,7 +41241,7 @@ function generateProfileHtml(config2, summaryCardsHtml, heatmapHtml, recentTilsH
41130
41241
  // src/cli/index.ts
41131
41242
  var path5 = __toESM(require("path"));
41132
41243
  var fs4 = __toESM(require("fs"));
41133
- var VERSION = true ? "0.12.1" : "0.0.0";
41244
+ var VERSION = true ? "0.12.3" : "0.0.0";
41134
41245
  function printUsage() {
41135
41246
  console.log(`oh-my-til v${VERSION}
41136
41247
 
package/main.js CHANGED
@@ -21543,6 +21543,29 @@ function parseBacklogSections(content) {
21543
21543
  }
21544
21544
  return sections.filter((s) => s.items.length > 0);
21545
21545
  }
21546
+ function checkBacklogItem(content, slug) {
21547
+ var _a4;
21548
+ const lines = content.split("\n");
21549
+ let found = false;
21550
+ let alreadyDone = false;
21551
+ for (let i = 0; i < lines.length; i++) {
21552
+ const match = lines[i].match(/^(-\s+\[)([ xX])(\]\s+\[[^\[\]]*\]\()([^()]+)(\).*)/);
21553
+ if (!match)
21554
+ continue;
21555
+ const rawPath = match[4].trim();
21556
+ const pathSlug = (_a4 = rawPath.replace(/\.md$/, "").split("/").pop()) != null ? _a4 : "";
21557
+ if (pathSlug !== slug)
21558
+ continue;
21559
+ found = true;
21560
+ if (match[2] !== " ") {
21561
+ alreadyDone = true;
21562
+ break;
21563
+ }
21564
+ lines[i] = `${match[1]}x${match[3]}${match[4]}${match[5]}`;
21565
+ break;
21566
+ }
21567
+ return { content: lines.join("\n"), found, alreadyDone };
21568
+ }
21546
21569
  function extractTopicFromPath(filePath, tilPath) {
21547
21570
  const prefix = tilPath.endsWith("/") ? tilPath : tilPath + "/";
21548
21571
  if (!filePath.startsWith(prefix))
@@ -47549,13 +47572,18 @@ ${text}` }] };
47549
47572
  "til_list",
47550
47573
  {
47551
47574
  title: "List TILs",
47552
- description: "TIL \uD30C\uC77C \uBAA9\uB85D\uACFC \uCE74\uD14C\uACE0\uB9AC\uBCC4 \uBD84\uB958\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4",
47575
+ description: "TIL \uD30C\uC77C \uBAA9\uB85D\uACFC \uCE74\uD14C\uACE0\uB9AC\uBCC4 \uBD84\uB958\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. search\uB85C \uD30C\uC77C\uBA85/\uACBD\uB85C \uD544\uD130\uB9C1 \uAC00\uB2A5.",
47553
47576
  inputSchema: external_exports3.object({
47554
- category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1")
47577
+ category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1"),
47578
+ search: external_exports3.string().optional().describe("\uD30C\uC77C \uACBD\uB85C/\uC774\uB984\uC5D0\uC11C \uAC80\uC0C9 (\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC)")
47555
47579
  })
47556
47580
  },
47557
- async ({ category }) => {
47558
- const filePaths = (await storage.listFiles()).filter((f) => f.path.startsWith(tilPath + "/") && f.extension === "md").map((f) => f.path);
47581
+ async ({ category, search }) => {
47582
+ let filePaths = (await storage.listFiles()).filter((f) => f.path.startsWith(tilPath + "/") && f.extension === "md").map((f) => f.path);
47583
+ if (search) {
47584
+ const lowerSearch = search.toLowerCase();
47585
+ filePaths = filePaths.filter((p) => p.toLowerCase().includes(lowerSearch));
47586
+ }
47559
47587
  const byCategory = groupFilesByCategory(filePaths, tilPath, category);
47560
47588
  const totalCount = Object.values(byCategory).reduce((sum, paths) => sum + paths.length, 0);
47561
47589
  const categories = Object.entries(byCategory).map(([cat, paths]) => ({
@@ -47860,6 +47888,90 @@ ${text}` }] };
47860
47888
  };
47861
47889
  }
47862
47890
  );
47891
+ server.registerTool(
47892
+ "til_exists",
47893
+ {
47894
+ title: "Check TIL Exists",
47895
+ description: "TIL \uD30C\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD558\uB294\uC9C0 \uD655\uC778\uD569\uB2C8\uB2E4",
47896
+ inputSchema: external_exports3.object({
47897
+ category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
47898
+ slug: external_exports3.string().describe("\uD30C\uC77C\uBA85 slug (\uC608: generics, hooks)")
47899
+ })
47900
+ },
47901
+ async ({ category, slug }) => {
47902
+ const path3 = `${tilPath}/${category}/${slug}.md`;
47903
+ const exists = await storage.exists(path3);
47904
+ const data = { exists, path: path3 };
47905
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
47906
+ }
47907
+ );
47908
+ server.registerTool(
47909
+ "til_save_note",
47910
+ {
47911
+ title: "Save TIL Note",
47912
+ description: "TIL \uB178\uD2B8\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. frontmatter \uD615\uC2DD\uACFC \uACBD\uB85C \uADDC\uCE59\uC744 \uC11C\uBC84\uAC00 \uBCF4\uC7A5\uD569\uB2C8\uB2E4.",
47913
+ inputSchema: external_exports3.object({
47914
+ category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
47915
+ slug: external_exports3.string().describe("\uD30C\uC77C\uBA85 slug (\uC608: generics, hooks)"),
47916
+ title: external_exports3.string().describe("\uB178\uD2B8 \uC81C\uBAA9"),
47917
+ content: external_exports3.string().describe("\uB178\uD2B8 \uBCF8\uBB38 (\uB9C8\uD06C\uB2E4\uC6B4)"),
47918
+ tags: external_exports3.array(external_exports3.string()).optional().describe('\uD0DC\uADF8 \uBAA9\uB85D (\uC608: ["typescript", "basics"])'),
47919
+ date: external_exports3.string().optional().describe("\uC791\uC131\uC77C (YYYY-MM-DD, \uC0DD\uB7B5 \uC2DC \uC624\uB298)"),
47920
+ fmCategory: external_exports3.string().optional().describe("frontmatter category \uAC12 (\uC0DD\uB7B5 \uC2DC category \uD30C\uB77C\uBBF8\uD130 \uC0AC\uC6A9)"),
47921
+ aliases: external_exports3.array(external_exports3.string()).optional().describe('aliases \uBAA9\uB85D (\uC608: ["\uD55C\uAE00 \uC81C\uBAA9", "English Title"])')
47922
+ })
47923
+ },
47924
+ async ({ category, slug, title, content, tags, date: date7, fmCategory, aliases }) => {
47925
+ const path3 = `${tilPath}/${category}/${slug}.md`;
47926
+ const noteDate = date7 || (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
47927
+ const fmLines = ["---", `title: "${title.replace(/"/g, '\\"')}"`, `date: ${noteDate}`];
47928
+ const effectiveCategory = fmCategory != null ? fmCategory : category;
47929
+ fmLines.push(`category: ${effectiveCategory}`);
47930
+ if (tags && tags.length > 0) {
47931
+ fmLines.push("tags:");
47932
+ for (const tag of tags) {
47933
+ fmLines.push(` - ${tag}`);
47934
+ }
47935
+ }
47936
+ if (aliases && aliases.length > 0) {
47937
+ fmLines.push(`aliases: [${aliases.map((a) => `"${a.replace(/"/g, '\\"')}"`).join(", ")}]`);
47938
+ }
47939
+ fmLines.push("---", "");
47940
+ const fullContent = fmLines.join("\n") + content;
47941
+ await storage.mkdir(`${tilPath}/${category}`);
47942
+ const existed = await storage.exists(path3);
47943
+ await storage.writeFile(path3, fullContent);
47944
+ const data = { path: path3, created: !existed, category, slug, title };
47945
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
47946
+ }
47947
+ );
47948
+ server.registerTool(
47949
+ "til_backlog_check",
47950
+ {
47951
+ title: "Check Backlog Item",
47952
+ description: "\uBC31\uB85C\uADF8 \uD56D\uBAA9\uC744 \uC644\uB8CC([x]) \uCC98\uB9AC\uD569\uB2C8\uB2E4",
47953
+ inputSchema: external_exports3.object({
47954
+ category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
47955
+ slug: external_exports3.string().describe("\uCCB4\uD06C\uD560 \uD56D\uBAA9\uC758 slug (\uC608: generics)")
47956
+ })
47957
+ },
47958
+ async ({ category, slug }) => {
47959
+ const backlogPath = `${tilPath}/${category}/backlog.md`;
47960
+ const content = await storage.readFile(backlogPath);
47961
+ if (content === null) {
47962
+ return { content: [{ type: "text", text: JSON.stringify({ error: `\uBC31\uB85C\uADF8 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${backlogPath}` }) }], isError: true };
47963
+ }
47964
+ const result = checkBacklogItem(content, slug);
47965
+ if (!result.found) {
47966
+ return { content: [{ type: "text", text: JSON.stringify({ error: `"${slug}" \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4`, backlogPath }) }], isError: true };
47967
+ }
47968
+ if (result.alreadyDone) {
47969
+ return { content: [{ type: "text", text: JSON.stringify({ alreadyDone: true, slug, backlogPath }) }] };
47970
+ }
47971
+ await storage.writeFile(backlogPath, result.content);
47972
+ return { content: [{ type: "text", text: JSON.stringify({ checked: true, slug, backlogPath }) }] };
47973
+ }
47974
+ );
47863
47975
  }
47864
47976
 
47865
47977
  // src/mcp/server.ts
@@ -47952,16 +48064,16 @@ var TILMcpServer = class {
47952
48064
  };
47953
48065
 
47954
48066
  // vault-assets/skills/til/SKILL.md
47955
- var SKILL_default = '---\nname: til\ndescription: "Today I Learned - \uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uACE0 \uB300\uD654\uD615\uC73C\uB85C \uD559\uC2B5\uD55C \uB4A4 TIL \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uC800\uC7A5"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# TIL Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 TIL \uC800\uC7A5.\n\n## MCP \uB3C4\uAD6C\n\n- `til_list`: \uAE30\uC874 TIL \uD655\uC778 (\uB3D9\uC77C/\uC720\uC0AC \uC8FC\uC81C \uAC10\uC9C0)\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545, \uB9C1\uD06C \uD6C4\uBCF4\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790\uAC00 \uBCF4\uB294 \uD30C\uC77C \uD655\uC778\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. `til_get_context`\uB85C \uAE30\uC874 TIL \uD655\uC778. MCP \uBD88\uAC00 \uC2DC `til_list` \uD3F4\uBC31\n - \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD559\uC2B5 \uC2DC `til_backlog_status`(category) \u2192 `sections[].items[].sourceUrls` \uCC38\uC870\n - URL 1\uAC1C: `WebFetch`\uB85C \uC9C1\uC811 \uD328\uCE58\n - URL 2\uAC1C \uC774\uC0C1: `til-fetcher` subagent **1\uAC1C**\uC5D0 \uBAA8\uB4E0 URL \uC804\uB2EC\n2. \uAE30\uC874 TIL \uC788\uC73C\uBA74: \uC2EC\uD654 \uD559\uC2B5 / \uC0C8\uB85C \uC791\uC131 \uC120\uD0DD\uC9C0 \uC81C\uC2DC\n3. \uAE30\uC874 TIL \uC5C6\uC73C\uBA74: \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC870\uC0AC\n4. \uD575\uC2EC \uAC1C\uB150, \uC608\uC2DC, \uAD00\uB828 \uC790\uB8CC \uC218\uC9D1 \u2192 \uC694\uC57D\n\n## Phase 2: \uB300\uD654\uD615 \uD559\uC2B5\n\n1. \uB9AC\uC11C\uCE58 \uACB0\uACFC \uAE30\uBC18 \uC124\uBA85\n2. \uC2EC\uD654 \uD559\uC2B5 \uBAA8\uB4DC: \uAE30\uC874 \uB0B4\uC6A9 \uBC18\uBCF5\uD558\uC9C0 \uC54A\uACE0 \uC0C8 \uAD00\uC810\uC5D0 \uC9D1\uC911\n3. \uC0AC\uC6A9\uC790 \uC9C8\uBB38\uC5D0 \uB2F5\uBCC0\n4. \uC0AC\uC6A9\uC790\uAC00 "\uC800\uC7A5\uD574\uC918" \uB4F1 \uC694\uCCAD \uC2DC Phase 3 \uC804\uD658 (\uC790\uB3D9 \uC804\uD658 \uAE08\uC9C0)\n\n## Phase 3: \uC800\uC7A5\n\n`/save` \uC2A4\uD0AC \uADDC\uCE59\uC744 \uB530\uB77C \uC800\uC7A5. \uC2EC\uD654 \uD559\uC2B5 \uBAA8\uB4DC\uB294 \uAE30\uC874 \uD30C\uC77C\uC5D0 \uBCD1\uD569 (`updated` \uB0A0\uC9DC \uCD94\uAC00).\n\n## \uC778\uC218\n\n- \uCCAB \uBC88\uC9F8: \uD559\uC2B5 \uC8FC\uC81C (\uD544\uC218)\n- \uB450 \uBC88\uC9F8: \uCE74\uD14C\uACE0\uB9AC (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC \uC790\uB3D9 \uCD94\uB860)\n\n## \uADDC\uCE59\n\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)` \u2014 `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0\n- \uBBFC\uAC10 \uC815\uBCF4 \uB300\uCCB4\uAC12 \uC0AC\uC6A9 (example.com, your-api-key)\n';
48067
+ var SKILL_default = '---\nname: til\ndescription: "Today I Learned - \uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uACE0 \uB300\uD654\uD615\uC73C\uB85C \uD559\uC2B5\uD55C \uB4A4 TIL \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uC800\uC7A5"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# TIL Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 TIL \uC800\uC7A5.\n\n## MCP \uB3C4\uAD6C\n\n- `til_list`: \uAE30\uC874 TIL \uD655\uC778 (\uB3D9\uC77C/\uC720\uC0AC \uC8FC\uC81C \uAC10\uC9C0)\n- `til_exists`: TIL \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \uBE60\uB978 \uD655\uC778\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545, \uB9C1\uD06C \uD6C4\uBCF4\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790\uAC00 \uBCF4\uB294 \uD30C\uC77C \uD655\uC778\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. `til_exists(category, slug)`\uB85C \uBE60\uB978 \uC874\uC7AC \uD655\uC778 \u2192 \uC788\uC73C\uBA74 \uC2EC\uD654/\uC2E0\uADDC \uC120\uD0DD\uC9C0 \uC81C\uC2DC\n2. `til_get_context`\uB85C \uAE30\uC874 TIL \uD655\uC778. MCP \uBD88\uAC00 \uC2DC `til_list` \uD3F4\uBC31\n - \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD559\uC2B5 \uC2DC `til_backlog_status`(category) \u2192 `sections[].items[].sourceUrls` \uCC38\uC870\n - URL 1\uAC1C: `WebFetch`\uB85C \uC9C1\uC811 \uD328\uCE58\n - URL 2\uAC1C \uC774\uC0C1: `til-fetcher` subagent **1\uAC1C**\uC5D0 \uBAA8\uB4E0 URL \uC804\uB2EC\n3. \uAE30\uC874 TIL \uC5C6\uC73C\uBA74: \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC870\uC0AC\n4. \uD575\uC2EC \uAC1C\uB150, \uC608\uC2DC, \uAD00\uB828 \uC790\uB8CC \uC218\uC9D1 \u2192 \uC694\uC57D\n\n## Phase 2: \uB300\uD654\uD615 \uD559\uC2B5\n\n1. \uB9AC\uC11C\uCE58 \uACB0\uACFC \uAE30\uBC18 \uC124\uBA85\n2. \uC2EC\uD654 \uD559\uC2B5 \uBAA8\uB4DC: \uAE30\uC874 \uB0B4\uC6A9 \uBC18\uBCF5\uD558\uC9C0 \uC54A\uACE0 \uC0C8 \uAD00\uC810\uC5D0 \uC9D1\uC911\n3. \uC0AC\uC6A9\uC790 \uC9C8\uBB38\uC5D0 \uB2F5\uBCC0\n4. \uC0AC\uC6A9\uC790\uAC00 "\uC800\uC7A5\uD574\uC918" \uB4F1 \uC694\uCCAD \uC2DC Phase 3 \uC804\uD658 (\uC790\uB3D9 \uC804\uD658 \uAE08\uC9C0)\n\n## Phase 3: \uC800\uC7A5\n\n`/save` \uC2A4\uD0AC \uADDC\uCE59\uC744 \uB530\uB77C \uC800\uC7A5. \uC2EC\uD654 \uD559\uC2B5 \uBAA8\uB4DC\uB294 \uAE30\uC874 \uD30C\uC77C\uC5D0 \uBCD1\uD569 (`updated` \uB0A0\uC9DC \uCD94\uAC00).\n\n## \uC778\uC218\n\n- \uCCAB \uBC88\uC9F8: \uD559\uC2B5 \uC8FC\uC81C (\uD544\uC218)\n- \uB450 \uBC88\uC9F8: \uCE74\uD14C\uACE0\uB9AC (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC \uC790\uB3D9 \uCD94\uB860)\n\n## \uADDC\uCE59\n\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)` \u2014 `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0\n- \uBBFC\uAC10 \uC815\uBCF4 \uB300\uCCB4\uAC12 \uC0AC\uC6A9 (example.com, your-api-key)\n';
47956
48068
 
47957
48069
  // vault-assets/skills/backlog/SKILL.md
47958
48070
  var SKILL_default2 = '---\nname: backlog\ndescription: "\uD559\uC2B5 \uBC31\uB85C\uADF8\uB97C \uC870\uD68C\uD558\uACE0 \uC9C4\uD589 \uC0C1\uD669\uC744 \uBCF4\uC5EC\uC900\uB2E4"\nargument-hint: "[\uCE74\uD14C\uACE0\uB9AC]"\ndisable-model-invocation: true\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Backlog Skill\n\n\uD559\uC2B5 \uBC31\uB85C\uADF8 \uC870\uD68C + \uC9C4\uD589 \uC0C1\uD669 \uC694\uC57D (\uC77D\uAE30 \uC804\uC6A9).\n\n## MCP \uB3C4\uAD6C\n\n- `til_backlog_status`: \uC804\uCCB4/\uCE74\uD14C\uACE0\uB9AC\uBCC4 \uC9C4\uD589\uB960 (category \uC9C0\uC815 \uC2DC sections \uD3EC\uD568)\n\n## \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n### \uC778\uC218 \uC5C6\uC74C (`/backlog`)\n\n1. `til_backlog_status` \uD638\uCD9C (MCP \uBD88\uAC00 \uC2DC `./til/*/backlog.md` Glob)\n2. \uBC31\uB85C\uADF8 \uC5C6\uC73C\uBA74 `/research` \uC548\uB0B4 \uD6C4 \uC885\uB8CC\n3. \uD14C\uC774\uBE14\uB85C \uC694\uC57D: \uCE74\uD14C\uACE0\uB9AC(\uB9C1\uD06C), \uC9C4\uD589\uB960, \uC644\uB8CC\uC218, \uCD5C\uADFC \uD559\uC2B5\uC77C, \uC9C4\uD589\uBC14\n\n### \uC778\uC218 \uC788\uC74C (`/backlog \uCE74\uD14C\uACE0\uB9AC`)\n\n1. `til_backlog_status`\uC5D0 category \uC804\uB2EC \u2192 sections \uD65C\uC6A9\n2. \uC139\uC158\uBCC4 \uCD9C\uB825:\n - `## {heading} ({\uC644\uB8CC\uC218}/{\uC804\uCCB4\uC218})`\n - `- (x) [{displayName}]({path})` / `- ( ) [{displayName}]({path})`\n - `- [ ]`/`- [x]` \uB9C8\uD06C\uB2E4\uC6B4 \uCCB4\uD06C\uBC15\uC2A4 \uC0AC\uC6A9 \uAE08\uC9C0 (\uD130\uBBF8\uB110 \uBBF8\uB80C\uB354\uB9C1)\n\n## \uCD9C\uB825 \uADDC\uCE59\n\n- \uBAA8\uB4E0 \uCE74\uD14C\uACE0\uB9AC\uBA85/\uD56D\uBAA9\uBA85\uC740 `[\uD45C\uC2DC\uBA85](\uACBD\uB85C)` \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C\uB85C \uCD9C\uB825\n- \uACBD\uB85C \uC9C1\uC811 \uB178\uCD9C \uAE08\uC9C0\n- \uC9C4\uD589\uBC14: 10\uCE78 (`\u2588` \uC644\uB8CC, `\u2591` \uBBF8\uC644\uB8CC)\n- \uD55C\uAD6D\uC5B4 \uCD9C\uB825\n- \uBC31\uB85C\uADF8 \uD30C\uC77C \uC218\uC815 \uAE08\uC9C0 (\uC77D\uAE30 \uC804\uC6A9)\n';
47959
48071
 
47960
48072
  // vault-assets/skills/research/SKILL.md
47961
- var SKILL_default3 = '---\nname: research\ndescription: "\uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uC5EC \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uAC1C\uB150/\uC6A9\uC5B4\uB97C \uD30C\uC545\uD558\uACE0, \uBC31\uB85C\uADF8\uB85C \uC815\uB9AC"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Research Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uAC1C\uB150/\uC758\uC874 \uAD00\uACC4 \uD30C\uC545 \u2192 \uBC31\uB85C\uADF8 \uD30C\uC77C \uC800\uC7A5.\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC8FC\uC81C \uC870\uC0AC, \uD544\uC694 \uAC1C\uB150\xB7\uC6A9\uC5B4\xB7\uC120\uD589 \uC9C0\uC2DD \uD30C\uC545\n2. \uC18C\uC8FC\uC81C \uBD84\uD574 \uD6C4 \uC9C1\uC811 \uB9AC\uC11C\uCE58\n3. \uC18C\uC8FC\uC81C \uAC04 \uC758\uC874 \uAD00\uACC4 \uBD84\uC11D\n\n## Phase 2: \uBC31\uB85C\uADF8 \uC815\uB9AC\n\n1. \uD559\uC2B5 \uC21C\uC11C \uC815\uB82C: \uC120\uD589 \uC9C0\uC2DD \u2192 \uD575\uC2EC \uAC1C\uB150 \u2192 \uC2EC\uD654\n2. \uAC01 \uD56D\uBAA9\uC5D0 1\uC904 \uC124\uBA85\n3. \uC0AC\uC6A9\uC790 \uD53C\uB4DC\uBC31 (\uCD94\uAC00/\uC81C\uAC70/\uC21C\uC11C \uBCC0\uACBD)\n\n## Phase 3: \uC800\uC7A5\n\n1. `./til/{\uCE74\uD14C\uACE0\uB9AC}/backlog.md`\uC5D0 \uC800\uC7A5 (\uD3F4\uB354 \uC790\uB3D9 \uC0DD\uC131)\n2. \uAE30\uC874 backlog.md \uC788\uC73C\uBA74 \uBCD1\uD569:\n - `[x]` \uC644\uB8CC \uD56D\uBAA9 \uBCF4\uC874\n - \uB3D9\uC77C \uD56D\uBAA9 \uCCB4\uD06C \uC0C1\uD0DC \uC720\uC9C0\n - \uAE30\uC874 sources \uBCF4\uC874, \uC0C8 \uD56D\uBAA9\uB9CC \uCD94\uAC00\n3. TIL MOC\uC5D0 \uBC31\uB85C\uADF8 \uB9C1\uD06C \uCD94\uAC00\n4. atomic commit: `\u{1F4CB} research: {\uC8FC\uC81C} \uD559\uC2B5 \uBC31\uB85C\uADF8 - {\uCE74\uD14C\uACE0\uB9AC}` (push \uC548 \uD568)\n\n## \uBC31\uB85C\uADF8 \uD15C\uD50C\uB9BF\n\n```markdown\n---\ntags: [backlog, {\uCE74\uD14C\uACE0\uB9AC}]\naliases: ["Backlog - {\uC8FC\uC81C}"]\nupdated: YYYY-MM-DD\nsources:\n slug-a: [https://url-1]\n---\n\n# {\uC8FC\uC81C} \uD559\uC2B5 \uBC31\uB85C\uADF8\n\n## \uC120\uD589 \uC9C0\uC2DD\n- [ ] [\uAC1C\uB150A](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-a}.md) - \uC124\uBA85\n\n## \uD575\uC2EC \uAC1C\uB150\n- [ ] [\uAC1C\uB150C](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-c}.md) - \uC124\uBA85\n\n## \uC2EC\uD654\n- [ ] [\uAC1C\uB150E](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-e}.md) - \uC124\uBA85\n```\n\n## \uC778\uC218\n\n- \uCCAB \uBC88\uC9F8: \uB9AC\uC11C\uCE58 \uC8FC\uC81C (\uD544\uC218)\n- \uB450 \uBC88\uC9F8: \uCE74\uD14C\uACE0\uB9AC (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC \uC790\uB3D9 \uCD94\uB860)\n\n## \uADDC\uCE59\n\n- \uD56D\uBAA9\uB2F9 1\uC904 \uC124\uBA85, 20\uAC1C \uCD08\uACFC \uC2DC \uBD84\uB9AC\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)`\n';
48073
+ var SKILL_default3 = '---\nname: research\ndescription: "\uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uC5EC \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uAC1C\uB150/\uC6A9\uC5B4\uB97C \uD30C\uC545\uD558\uACE0, \uBC31\uB85C\uADF8\uB85C \uC815\uB9AC"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Research Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uAC1C\uB150/\uC758\uC874 \uAD00\uACC4 \uD30C\uC545 \u2192 \uBC31\uB85C\uADF8 \uD30C\uC77C \uC800\uC7A5.\n\n## MCP \uB3C4\uAD6C\n\n- `til_list`: \uAE30\uC874 TIL \uD655\uC778 (search \uD30C\uB77C\uBBF8\uD130\uB85C \uC8FC\uC81C \uAC80\uC0C9)\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. `til_list(search=\uC8FC\uC81C)`\uB85C \uC774\uBBF8 \uD559\uC2B5\uD55C \uC8FC\uC81C \uD655\uC778 \u2192 \uC911\uBCF5 \uBC31\uB85C\uADF8 \uBC29\uC9C0\n2. \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC8FC\uC81C \uC870\uC0AC, \uD544\uC694 \uAC1C\uB150\xB7\uC6A9\uC5B4\xB7\uC120\uD589 \uC9C0\uC2DD \uD30C\uC545\n3. \uC18C\uC8FC\uC81C \uBD84\uD574 \uD6C4 \uC9C1\uC811 \uB9AC\uC11C\uCE58\n4. \uC18C\uC8FC\uC81C \uAC04 \uC758\uC874 \uAD00\uACC4 \uBD84\uC11D\n\n## Phase 2: \uBC31\uB85C\uADF8 \uC815\uB9AC\n\n1. \uD559\uC2B5 \uC21C\uC11C \uC815\uB82C: \uC120\uD589 \uC9C0\uC2DD \u2192 \uD575\uC2EC \uAC1C\uB150 \u2192 \uC2EC\uD654\n2. \uAC01 \uD56D\uBAA9\uC5D0 1\uC904 \uC124\uBA85\n3. \uC0AC\uC6A9\uC790 \uD53C\uB4DC\uBC31 (\uCD94\uAC00/\uC81C\uAC70/\uC21C\uC11C \uBCC0\uACBD)\n\n## Phase 3: \uC800\uC7A5\n\n1. `./til/{\uCE74\uD14C\uACE0\uB9AC}/backlog.md`\uC5D0 \uC800\uC7A5 (\uD3F4\uB354 \uC790\uB3D9 \uC0DD\uC131)\n2. \uAE30\uC874 backlog.md \uC788\uC73C\uBA74 \uBCD1\uD569:\n - `[x]` \uC644\uB8CC \uD56D\uBAA9 \uBCF4\uC874\n - \uB3D9\uC77C \uD56D\uBAA9 \uCCB4\uD06C \uC0C1\uD0DC \uC720\uC9C0\n - \uAE30\uC874 sources \uBCF4\uC874, \uC0C8 \uD56D\uBAA9\uB9CC \uCD94\uAC00\n3. TIL MOC\uC5D0 \uBC31\uB85C\uADF8 \uB9C1\uD06C \uCD94\uAC00\n4. atomic commit: `\u{1F4CB} research: {\uC8FC\uC81C} \uD559\uC2B5 \uBC31\uB85C\uADF8 - {\uCE74\uD14C\uACE0\uB9AC}` (push \uC548 \uD568)\n\n## \uBC31\uB85C\uADF8 \uD15C\uD50C\uB9BF\n\n```markdown\n---\ntags: [backlog, {\uCE74\uD14C\uACE0\uB9AC}]\naliases: ["Backlog - {\uC8FC\uC81C}"]\nupdated: YYYY-MM-DD\nsources:\n slug-a: [https://url-1]\n---\n\n# {\uC8FC\uC81C} \uD559\uC2B5 \uBC31\uB85C\uADF8\n\n## \uC120\uD589 \uC9C0\uC2DD\n- [ ] [\uAC1C\uB150A](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-a}.md) - \uC124\uBA85\n\n## \uD575\uC2EC \uAC1C\uB150\n- [ ] [\uAC1C\uB150C](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-c}.md) - \uC124\uBA85\n\n## \uC2EC\uD654\n- [ ] [\uAC1C\uB150E](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug-e}.md) - \uC124\uBA85\n```\n\n## \uC778\uC218\n\n- \uCCAB \uBC88\uC9F8: \uB9AC\uC11C\uCE58 \uC8FC\uC81C (\uD544\uC218)\n- \uB450 \uBC88\uC9F8: \uCE74\uD14C\uACE0\uB9AC (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC \uC790\uB3D9 \uCD94\uB860)\n\n## \uADDC\uCE59\n\n- \uD56D\uBAA9\uB2F9 1\uC904 \uC124\uBA85, 20\uAC1C \uCD08\uACFC \uC2DC \uBD84\uB9AC\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)`\n';
47962
48074
 
47963
48075
  // vault-assets/skills/save/SKILL.md
47964
- var SKILL_default4 = '---\nname: save\ndescription: "\uD559\uC2B5 \uB0B4\uC6A9\uC744 TIL \uD30C\uC77C\uB85C \uC800\uC7A5\uD558\uACE0 Daily \uB178\uD2B8, MOC, \uBC31\uB85C\uADF8\uB97C \uC77C\uAD04 \uC5C5\uB370\uC774\uD2B8"\nargument-hint: "[\uC8FC\uC81C] [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Save Skill\n\n\uD559\uC2B5 \uB300\uD654 \u2192 TIL \uD30C\uC77C \uC800\uC7A5 \u2192 Daily/MOC/\uBC31\uB85C\uADF8 \uC5C5\uB370\uC774\uD2B8 \u2192 \uBB38\uC11C \uB9AC\uBDF0 \u2192 \uCEE4\uBC0B.\n\n## MCP \uB3C4\uAD6C\n\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545\n- `til_list`: \uAE30\uC874 TIL \uC911\uBCF5 \uD655\uC778\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790 \uD30C\uC77C \uCEE8\uD14D\uC2A4\uD2B8\n\n## Step 1: \uCEE8\uD14D\uC2A4\uD2B8 \uD655\uC778\n\n\uC8FC\uC81C\xB7\uCE74\uD14C\uACE0\uB9AC \uD30C\uC545. \uBD88\uBA85\uD655\uD558\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C8\uBB38.\n\n## Step 2: \uB9C1\uD06C \uD6C4\uBCF4 \uD30C\uC545\n\n1. `til_get_context` \uB610\uB294 MOC/\uBC31\uB85C\uADF8\uB85C \uAE30\uC874 TIL\xB7\uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD30C\uC545\n2. \uAE30\uC874 TIL/\uBC31\uB85C\uADF8 \uD56D\uBAA9 \u2192 \uBCF8\uBB38\uC5D0\uC11C \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C \uC0AC\uC6A9\n3. \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uAC1C\uB150 \u2192 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD655\uC778 \uD6C4 \uAD00\uB828 \uB178\uD2B8\uC5D0\uB9CC \uCD94\uAC00\n\n## Step 3: TIL \uD30C\uC77C \uC800\uC7A5\n\n\uACBD\uB85C: `./til/{\uCE74\uD14C\uACE0\uB9AC}/{\uC8FC\uC81C\uC2AC\uB7EC\uADF8}.md` (\uC2AC\uB7EC\uADF8: \uC601\uBB38 \uC18C\uBB38\uC790, \uD558\uC774\uD508)\n\n\uB3D9\uC77C \uC2AC\uB7EC\uADF8 \uD30C\uC77C \uC788\uC744 \uB54C:\n- `/til` \uC2EC\uD654 \uD559\uC2B5\uC774 \uC5F0\uC18D\uB41C \uACBD\uC6B0\uB9CC \uC790\uB3D9 \uBCD1\uD569 (\uAE30\uC874 \uB0B4\uC6A9 \uC720\uC9C0 + \uBCF4\uAC15, `updated` \uCD94\uAC00)\n- \uADF8 \uC678: \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCD1\uD569/\uB36E\uC5B4\uC4F0\uAE30 \uD655\uC778\n\n### TIL \uD15C\uD50C\uB9BF\n\n```markdown\n---\ndate: YYYY-MM-DDTHH:mm:ss\ncategory: \uCE74\uD14C\uACE0\uB9AC\ntags: [til, \uD0DC\uADF81]\naliases: ["\uD55C\uAE00 \uC81C\uBAA9", "\uC601\uBB38 \uC81C\uBAA9"]\n---\n\n# \uC81C\uBAA9\n\n> [!tldr] \uD55C\uC904 \uC694\uC57D\n\n## \uD575\uC2EC \uB0B4\uC6A9\n## \uC608\uC2DC\n## \uCC38\uACE0 \uC790\uB8CC\n- [\uC81C\uBAA9](URL)\n## \uAD00\uB828 \uB178\uD2B8\n- [TIL](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)\n```\n\n- `date`: `date +%Y-%m-%dT%H:%M:%S` \uBA85\uB839\uC73C\uB85C \uB85C\uCEEC \uC2DC\uAC01 \uC870\uD68C\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)` \u2014 `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0\n\n## Step 4: \uC5F0\uAD00 \uD30C\uC77C \uC5C5\uB370\uC774\uD2B8\n\n\uC544\uB798 3\uAC1C \uD30C\uC77C\uC744 **\uC9C1\uC811** \uC21C\uCC28 \uC5C5\uB370\uC774\uD2B8\uD55C\uB2E4 (subagent \uC0AC\uC6A9 \uAE08\uC9C0):\n\n1. Daily \uB178\uD2B8 (`./Daily/YYYY-MM-DD.md`): \uCE74\uD14C\uACE0\uB9AC\uBCC4 TIL \uB9C1\uD06C \uCD94\uAC00 (\uC5C6\uC73C\uBA74 \uC0DD\uC131)\n2. TIL MOC (`./til/TIL MOC.md`): \uCE74\uD14C\uACE0\uB9AC \uC139\uC158\uC5D0 \uD56D\uBAA9 \uCD94\uAC00 (\uC5C6\uC73C\uBA74 \uC0DD\uC131)\n3. \uBC31\uB85C\uADF8 (`./til/{\uCE74\uD14C\uACE0\uB9AC}/backlog.md`): \uD574\uB2F9 \uD56D\uBAA9 `[ ]` \u2192 `[x]`\n\n\uAC01 \uD30C\uC77C: Read \u2192 \uC704\uCE58 \uD655\uC778 \u2192 Edit. \uD30C\uC77C \uC5C6\uC73C\uBA74 \uC0DD\uC131.\n\n## Step 5: \uBB38\uC11C \uB9AC\uBDF0\n\n\uC800\uC7A5\uB41C TIL \uC804\uCCB4 \uB0B4\uC6A9 \uD45C\uC2DC \u2192 `AskUserQuestion`\uC73C\uB85C \uD655\uC778 ("\uD655\uC778 \uC644\uB8CC" / "\uC218\uC815 \uD544\uC694").\n\n## Step 6: \uBCF5\uC2B5 \uB4F1\uB85D\n\n`AskUserQuestion`\uC73C\uB85C "\uC774 TIL\uC744 \uBCF5\uC2B5 \uB300\uC0C1\uC5D0 \uCD94\uAC00\uD560\uAE4C\uC694?" \uC9C8\uBB38.\n\uC0AC\uC6A9\uC790 \uB3D9\uC758 \uC2DC `til_review_update` (action: "review", grade: 4) \uD638\uCD9C\uD558\uC5EC SRS \uBA54\uD0C0\uB370\uC774\uD130 \uC0DD\uC131.\n\n## Step 7: git commit\n\n`\u{1F4DD} til: {\uD55C\uAE00 \uC81C\uBAA9}({\uC601\uBB38 \uC81C\uBAA9}) - {\uCE74\uD14C\uACE0\uB9AC}` (push \uC548 \uD568)\n\n## \uADDC\uCE59\n\n- frontmatter \uD544\uC218: date, category, tags, aliases (\uB204\uB77D \uC2DC \uC800\uC7A5 \uC804 \uBCF4\uC644)\n- tags\uC5D0 \uBC18\uB4DC\uC2DC "til" \uD3EC\uD568 (\uC815\uC801 \uC0AC\uC774\uD2B8 \uD544\uD130 \uAE30\uC900)\n- `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0 \u2014 `[\uD45C\uC2DC\uBA85](\uACBD\uB85C)` \uD615\uC2DD\uB9CC \uC0AC\uC6A9\n- TIL\uB9CC \uC800\uC7A5\uD558\uACE0 Daily/MOC/\uBC31\uB85C\uADF8 \uB204\uB77D\uD558\uC9C0 \uC54A\uB294\uB2E4\n- Callout \uD65C\uC6A9: `> [!tldr]`, `> [!example]`, `> [!warning]`, `> [!tip]`\n- \uBCF5\uC7A1\uD55C \uAC1C\uB150\uC740 Mermaid \uB2E4\uC774\uC5B4\uADF8\uB7A8\uC73C\uB85C \uC2DC\uAC01\uD654 (TIL\uB2F9 \uCD5C\uB300 1\uAC1C)\n- \uBBFC\uAC10 \uC815\uBCF4 \uB300\uCCB4\uAC12 \uC0AC\uC6A9\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n';
48076
+ var SKILL_default4 = '---\nname: save\ndescription: "\uD559\uC2B5 \uB0B4\uC6A9\uC744 TIL \uD30C\uC77C\uB85C \uC800\uC7A5\uD558\uACE0 Daily \uB178\uD2B8, MOC, \uBC31\uB85C\uADF8\uB97C \uC77C\uAD04 \uC5C5\uB370\uC774\uD2B8"\nargument-hint: "[\uC8FC\uC81C] [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Save Skill\n\n\uD559\uC2B5 \uB300\uD654 \u2192 TIL \uD30C\uC77C \uC800\uC7A5 \u2192 Daily/MOC/\uBC31\uB85C\uADF8 \uC5C5\uB370\uC774\uD2B8 \u2192 \uBB38\uC11C \uB9AC\uBDF0 \u2192 \uCEE4\uBC0B.\n\n## MCP \uB3C4\uAD6C\n\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545\n- `til_list`: \uAE30\uC874 TIL \uC911\uBCF5 \uD655\uC778\n- `til_exists`: TIL \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \uBE60\uB978 \uD655\uC778\n- `til_save_note`: TIL \uB178\uD2B8 \uC800\uC7A5 (frontmatter/\uACBD\uB85C \uADDC\uCE59 \uC11C\uBC84 \uBCF4\uC7A5)\n- `til_backlog_check`: \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uC644\uB8CC \uCC98\uB9AC\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790 \uD30C\uC77C \uCEE8\uD14D\uC2A4\uD2B8\n\n## Step 1: \uCEE8\uD14D\uC2A4\uD2B8 \uD655\uC778\n\n1. \uC8FC\uC81C\xB7\uCE74\uD14C\uACE0\uB9AC \uD30C\uC545. \uBD88\uBA85\uD655\uD558\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C8\uBB38.\n2. `til_exists(category, slug)`\uB85C \uB3D9\uC77C \uC2AC\uB7EC\uADF8 \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \uBE60\uB978 \uD655\uC778.\n\n## Step 2: \uB9C1\uD06C \uD6C4\uBCF4 \uD30C\uC545\n\n1. `til_get_context` \uB610\uB294 MOC/\uBC31\uB85C\uADF8\uB85C \uAE30\uC874 TIL\xB7\uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD30C\uC545\n2. \uAE30\uC874 TIL/\uBC31\uB85C\uADF8 \uD56D\uBAA9 \u2192 \uBCF8\uBB38\uC5D0\uC11C \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C \uC0AC\uC6A9\n3. \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uAC1C\uB150 \u2192 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD655\uC778 \uD6C4 \uAD00\uB828 \uB178\uD2B8\uC5D0\uB9CC \uCD94\uAC00\n\n## Step 3: TIL \uD30C\uC77C \uC800\uC7A5\n\n\uACBD\uB85C: `./til/{\uCE74\uD14C\uACE0\uB9AC}/{\uC8FC\uC81C\uC2AC\uB7EC\uADF8}.md` (\uC2AC\uB7EC\uADF8: \uC601\uBB38 \uC18C\uBB38\uC790, \uD558\uC774\uD508)\n\n**\uC0C8 \uD30C\uC77C \uC800\uC7A5**: `til_save_note` MCP \uB3C4\uAD6C\uB85C \uC800\uC7A5. frontmatter(title, date, category, tags, aliases)\uC640 \uACBD\uB85C \uADDC\uCE59\uC744 \uC11C\uBC84\uAC00 \uBCF4\uC7A5\uD55C\uB2E4.\n\n```\ntil_save_note(category, slug, title, content, tags, date, fmCategory, aliases)\n```\n\n- `date`: `date +%Y-%m-%dT%H:%M:%S` \uBA85\uB839\uC73C\uB85C \uB85C\uCEEC \uC2DC\uAC01\uC744 \uC870\uD68C\uD558\uC5EC \uC804\uB2EC\n- `tags`: \uBC18\uB4DC\uC2DC "til" \uD3EC\uD568\n- `aliases`: ["\uD55C\uAE00 \uC81C\uBAA9", "\uC601\uBB38 \uC81C\uBAA9"]\n- `content`: frontmatter \uC81C\uC678\uD55C \uBCF8\uBB38 \uB9C8\uD06C\uB2E4\uC6B4\n\n**\uB3D9\uC77C \uC2AC\uB7EC\uADF8 \uD30C\uC77C \uC788\uC744 \uB54C** (Step 1\uC5D0\uC11C `til_exists`\uB85C \uAC10\uC9C0):\n- `/til` \uC2EC\uD654 \uD559\uC2B5\uC774 \uC5F0\uC18D\uB41C \uACBD\uC6B0\uB9CC \uC790\uB3D9 \uBCD1\uD569 (\uAE30\uC874 \uB0B4\uC6A9 \uC720\uC9C0 + \uBCF4\uAC15, `updated` \uCD94\uAC00)\n- \uADF8 \uC678: \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCD1\uD569/\uB36E\uC5B4\uC4F0\uAE30 \uD655\uC778\n- \uBCD1\uD569 \uC2DC\uC5D0\uB294 `til_save_note` \uB300\uC2E0 \uC9C1\uC811 Read\u2192Edit\uC73C\uB85C \uAE30\uC874 \uB0B4\uC6A9\uC5D0 \uBCF4\uAC15\n\n### TIL \uBCF8\uBB38 \uD15C\uD50C\uB9BF\n\n```markdown\n# \uC81C\uBAA9\n\n> [!tldr] \uD55C\uC904 \uC694\uC57D\n\n## \uD575\uC2EC \uB0B4\uC6A9\n## \uC608\uC2DC\n## \uCC38\uACE0 \uC790\uB8CC\n- [\uC81C\uBAA9](URL)\n## \uAD00\uB828 \uB178\uD2B8\n- [TIL](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)\n```\n\n- \uB9C1\uD06C: `[\uD45C\uC2DC\uBA85](til/{\uCE74\uD14C\uACE0\uB9AC}/{slug}.md)` \u2014 `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0\n\n## Step 4: \uC5F0\uAD00 \uD30C\uC77C \uC5C5\uB370\uC774\uD2B8\n\n\uC544\uB798 3\uAC1C \uD30C\uC77C\uC744 **\uC9C1\uC811** \uC21C\uCC28 \uC5C5\uB370\uC774\uD2B8\uD55C\uB2E4 (subagent \uC0AC\uC6A9 \uAE08\uC9C0):\n\n1. Daily \uB178\uD2B8 (`./Daily/YYYY-MM-DD.md`): \uCE74\uD14C\uACE0\uB9AC\uBCC4 TIL \uB9C1\uD06C \uCD94\uAC00 (\uC5C6\uC73C\uBA74 \uC0DD\uC131)\n2. TIL MOC (`./til/TIL MOC.md`): \uCE74\uD14C\uACE0\uB9AC \uC139\uC158\uC5D0 \uD56D\uBAA9 \uCD94\uAC00 (\uC5C6\uC73C\uBA74 \uC0DD\uC131)\n3. \uBC31\uB85C\uADF8: `til_backlog_check(category, slug)` MCP \uB3C4\uAD6C\uB85C \uD574\uB2F9 \uD56D\uBAA9 \uC644\uB8CC \uCC98\uB9AC\n\nDaily/MOC: Read \u2192 \uC704\uCE58 \uD655\uC778 \u2192 Edit. \uD30C\uC77C \uC5C6\uC73C\uBA74 \uC0DD\uC131.\n\n## Step 5: \uBB38\uC11C \uB9AC\uBDF0\n\n\uC800\uC7A5\uB41C TIL \uC804\uCCB4 \uB0B4\uC6A9 \uD45C\uC2DC \u2192 `AskUserQuestion`\uC73C\uB85C \uD655\uC778 ("\uD655\uC778 \uC644\uB8CC" / "\uC218\uC815 \uD544\uC694").\n\n## Step 6: \uBCF5\uC2B5 \uB4F1\uB85D\n\n`AskUserQuestion`\uC73C\uB85C "\uC774 TIL\uC744 \uBCF5\uC2B5 \uB300\uC0C1\uC5D0 \uCD94\uAC00\uD560\uAE4C\uC694?" \uC9C8\uBB38.\n\uC0AC\uC6A9\uC790 \uB3D9\uC758 \uC2DC `til_review_update` (action: "review", grade: 4) \uD638\uCD9C\uD558\uC5EC SRS \uBA54\uD0C0\uB370\uC774\uD130 \uC0DD\uC131.\n\n## Step 7: git commit\n\n`\u{1F4DD} til: {\uD55C\uAE00 \uC81C\uBAA9}({\uC601\uBB38 \uC81C\uBAA9}) - {\uCE74\uD14C\uACE0\uB9AC}` (push \uC548 \uD568)\n\n## \uADDC\uCE59\n\n- frontmatter \uD544\uC218: date, category, tags, aliases (\uB204\uB77D \uC2DC \uC800\uC7A5 \uC804 \uBCF4\uC644)\n- tags\uC5D0 \uBC18\uB4DC\uC2DC "til" \uD3EC\uD568 (\uC815\uC801 \uC0AC\uC774\uD2B8 \uD544\uD130 \uAE30\uC900)\n- `[[\uC704\uD0A4\uB9C1\uD06C]]` \uAE08\uC9C0 \u2014 `[\uD45C\uC2DC\uBA85](\uACBD\uB85C)` \uD615\uC2DD\uB9CC \uC0AC\uC6A9\n- TIL\uB9CC \uC800\uC7A5\uD558\uACE0 Daily/MOC/\uBC31\uB85C\uADF8 \uB204\uB77D\uD558\uC9C0 \uC54A\uB294\uB2E4\n- Callout \uD65C\uC6A9: `> [!tldr]`, `> [!example]`, `> [!warning]`, `> [!tip]`\n- \uBCF5\uC7A1\uD55C \uAC1C\uB150\uC740 Mermaid \uB2E4\uC774\uC5B4\uADF8\uB7A8\uC73C\uB85C \uC2DC\uAC01\uD654 (TIL\uB2F9 \uCD5C\uB300 1\uAC1C)\n- \uBBFC\uAC10 \uC815\uBCF4 \uB300\uCCB4\uAC12 \uC0AC\uC6A9\n- \uD55C\uAD6D\uC5B4 \uC791\uC131, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n';
47965
48077
 
47966
48078
  // vault-assets/skills/migrate-links/SKILL.md
47967
48079
  var SKILL_default5 = '---\nname: migrate-links\ndescription: "vault\uC758 [[wikilink]]\uB97C \uD45C\uC900 \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C\uB85C \uC77C\uAD04 \uBCC0\uD658"\nargument-hint: ""\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Migrate Links Skill\n\n`[[wikilink]]` \u2192 `[text](path.md)` \uC77C\uAD04 \uBCC0\uD658.\n\n## CLI\n\n```bash\nnode .obsidian/plugins/oh-my-til/migrate-links.mjs . scan\nnode .obsidian/plugins/oh-my-til/migrate-links.mjs . migrate\nnode .obsidian/plugins/oh-my-til/migrate-links.mjs . verify\n```\n\n## \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n1. **\uC2A4\uCE94**: `scan` \uC2E4\uD589 \u2192 wikilink \uC5C6\uC73C\uBA74 \uC885\uB8CC, \uC788\uC73C\uBA74 `AskUserQuestion`\uC73C\uB85C \uD655\uC778\n2. **\uBCC0\uD658**: `migrate` \uC2E4\uD589\n3. **\uAC80\uC99D**: `verify` \uC2E4\uD589 \u2192 \uC794\uC5EC wikilink \uC548\uB0B4\n4. **\uCEE4\uBC0B**: `\u267B\uFE0F refactor: [[wikilink]] \u2192 \uD45C\uC900 \uB9C8\uD06C\uB2E4\uC6B4 \uB9C1\uD06C \uC77C\uAD04 \uBCC0\uD658` (push \uC548 \uD568)\n\n## \uBCC0\uD658 \uADDC\uCE59\n\n- `[[path|Display]]` \u2192 `[Display](path.md)`\n- `[[path]]` \u2192 `[path](path.md)`\n- \uCF54\uB4DC \uBE14\uB85D \uB0B4\uBD80 \uC81C\uC678, \uD14C\uC774\uBE14 `\\|` \uC774\uC2A4\uCF00\uC774\uD504 \uCC98\uB9AC\n';
@@ -47976,10 +48088,10 @@ var SKILL_default7 = '---\nname: setup-pages\ndescription: "(deprecated) /omt-se
47976
48088
  var SKILL_default8 = '---\nname: omt-setup\ndescription: "oh-my-til \uD1B5\uD569 \uC124\uC815 \u2014 \uBC30\uD3EC \uC124\uC815"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# OMT Setup Skill\n\noh-my-til \uC124\uC815\uC744 \uD55C \uACF3\uC5D0\uC11C \uAD00\uB9AC. \uC11C\uBE0C\uCEE4\uB9E8\uB4DC\uB85C \uB3D9\uC791.\n\n## \uC11C\uBE0C\uCEE4\uB9E8\uB4DC\n\n### `/omt-setup` (\uC778\uC218 \uC5C6\uC74C)\n\n`oh-my-til.json` \uC77D\uC5B4\uC11C \uD604\uC7AC \uC124\uC815 \uD45C\uC2DC + \uC11C\uBE0C\uCEE4\uB9E8\uB4DC \uC548\uB0B4:\n- `deploy` \u2014 GitHub Pages \uBC30\uD3EC \uC124\uC815\n\n### `/omt-setup deploy`\n\nGitHub Pages \uBC30\uD3EC \uC124\uC815:\n1. `.git/` \uD655\uC778 (\uC5C6\uC73C\uBA74 \uC548\uB0B4 \uD6C4 \uC885\uB8CC)\n2. `.github/workflows/deploy-til.yml` \uD655\uC778 (\uC788\uC73C\uBA74 \uC218\uC815 \uD544\uC694 \uC5EC\uBD80 \uC9C8\uBB38)\n3. `oh-my-til.json` deploy \uC139\uC158 \uC124\uC815 (\uC81C\uBAA9, \uBD80\uC81C\uBAA9, GitHub URL)\n4. \uC6CC\uD06C\uD50C\uB85C\uC6B0 YAML \uC0DD\uC131\n5. \uC644\uB8CC \uC548\uB0B4 (Settings \u2192 Pages \u2192 GitHub Actions \uC120\uD0DD, \uCEE4\uBC0B\xB7push \uBA85\uB839\uC5B4)\n\n## \uADDC\uCE59\n\n- \uD55C\uAD6D\uC5B4 \uCD9C\uB825\n- `oh-my-til.json`\uC758 \uAE30\uC874 \uC124\uC815 \uBCF4\uC874, \uD574\uB2F9 \uC139\uC158\uB9CC \uCD94\uAC00/\uC218\uC815\n- \uCEE4\uBC0B\uC740 \uD558\uC9C0 \uC54A\uC74C (\uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBA85\uB839\uC5B4 \uC548\uB0B4\uB9CC)\n';
47977
48089
 
47978
48090
  // vault-assets/skills/til-review/SKILL.md
47979
- var SKILL_default9 = '---\nname: til-review\ndescription: "SRS \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158 (\uAC04\uACA9 \uBC18\uBCF5 \uD559\uC2B5)"\nargument-hint: "[\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Review Skill\n\nSRS(\uAC04\uACA9 \uBC18\uBCF5) \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158. SM-2 \uC54C\uACE0\uB9AC\uC998\uC73C\uB85C \uBCF5\uC2B5 \uC77C\uC815\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n\n## MCP \uB3C4\uAD6C\n\n- `til_review_list`: \uC624\uB298 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update`: \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D (grade 0-5) \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n- `vault_read_note`: \uCE74\uB4DC \uB0B4\uC6A9 \uC77D\uAE30\n\n## Step 1: \uBCF5\uC2B5 \uCE74\uB4DC \uB85C\uB4DC\n\n`til_review_list` \uD638\uCD9C (\uCE74\uD14C\uACE0\uB9AC \uC778\uC790 \uC788\uC73C\uBA74 \uC804\uB2EC).\n\n- \uCE74\uB4DC 0\uAC1C \u2192 "\uC624\uB298 \uBCF5\uC2B5 \uC5C6\uC74C" \uC548\uB0B4 + \uBBF8\uB4F1\uB85D TIL \uB4F1\uB85D \uC81C\uC548 (Step 5\uB85C)\n- \uCE74\uB4DC \uC788\uC74C \u2192 \uBAA9\uB85D \uD45C\uC2DC + Step 2\uB85C\n\n## Step 2: \uD3C9\uAC00 \uBAA8\uB4DC \uC120\uD0DD\n\n`AskUserQuestion`\uC73C\uB85C \uC120\uD0DD:\n- **\uAC04\uB2E8 \uBAA8\uB4DC**: "\uAE30\uC5B5\uB0A8 / \uBAA8\uB984" 2\uB2E8\uACC4 (\uB0B4\uBD80\uC801\uC73C\uB85C grade 4 / 1)\n- **\uC0C1\uC138 \uBAA8\uB4DC**: 0~5\uC810 \uC790\uAE30 \uD3C9\uAC00\n\n## Step 3: \uCE74\uB4DC\uBCC4 \uBCF5\uC2B5 \uB8E8\uD504\n\n\uAC01 \uCE74\uB4DC\uC5D0 \uB300\uD574:\n\n1. \uC81C\uBAA9\xB7\uCE74\uD14C\uACE0\uB9AC\xB7\uBCF5\uC2B5 \uC815\uBCF4(\uBC18\uBCF5 \uD69F\uC218, EF, \uC5F0\uCCB4\uC77C) \uD45C\uC2DC\n2. `vault_read_note`\uB85C \uB0B4\uC6A9 \uC77D\uAE30\n3. \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC9C8\uBB38 \uD615\uC2DD\uC73C\uB85C \uC81C\uC2DC (\uB0B4\uC6A9 \uAE30\uBC18\uC73C\uB85C 1~2\uAC1C \uC9C8\uBB38 \uC0DD\uC131)\n4. \uC0AC\uC6A9\uC790 \uB2F5\uBCC0 \uB300\uAE30\n5. \uD53C\uB4DC\uBC31 \uC81C\uACF5 (\uC815\uB2F5/\uBCF4\uCDA9 \uC124\uBA85)\n6. \uD3C9\uAC00 \uC785\uB825:\n - \uAC04\uB2E8 \uBAA8\uB4DC: "\uAE30\uC5B5\uB0A8" / "\uBAA8\uB984" \u2192 grade 4 / 1\n - \uC0C1\uC138 \uBAA8\uB4DC: 0~5\uC810\n7. `til_review_update` (action: "review", grade) \uD638\uCD9C\n8. \uACB0\uACFC \uC694\uC57D (\uB2E4\uC74C \uBCF5\uC2B5\uC77C, interval) \uD45C\uC2DC\n\n## Step 4: \uC644\uB8CC \uD1B5\uACC4\n\n\uBAA8\uB4E0 \uCE74\uB4DC \uC644\uB8CC \uD6C4:\n- \uBCF5\uC2B5\uD55C \uCE74\uB4DC \uC218, \uD3C9\uADE0 grade\n- remaining > 0\uC774\uBA74 "N\uAC1C \uB354 \uB0A8\uC74C, \uB0B4\uC77C \uC774\uC5B4\uC11C" \uC548\uB0B4\n- `til_review_list` \uC7AC\uD638\uCD9C\uD558\uC5EC \uCD5C\uC2E0 \uD1B5\uACC4 \uD45C\uC2DC\n\n## Step 5: TIL \uB4F1\uB85D (\uC120\uD0DD)\n\n\uCE74\uB4DC\uAC00 \uC5C6\uC744 \uB54C \uB610\uB294 \uC0AC\uC6A9\uC790 \uC694\uCCAD \uC2DC:\n- `til_list`\uB85C \uC804\uCCB4 TIL \uBAA9\uB85D \uD45C\uC2DC\n- \uC0AC\uC6A9\uC790\uAC00 \uBCF5\uC2B5 \uB300\uC0C1\uC5D0 \uCD94\uAC00\uD560 \uD30C\uC77C \uC120\uD0DD\n- \uC120\uD0DD\uB41C \uD30C\uC77C\uB9C8\uB2E4 `til_review_update` (action: "review", grade: 4) \uD638\uCD9C\n\n## \uADDC\uCE59\n\n- \uD55C \uC138\uC158 \uCD5C\uB300 20\uAC1C (\uACFC\uBD80\uD558 \uBC29\uC9C0)\n- \uC5F0\uCCB4 \uCE74\uB4DC \uC6B0\uC120 (\uAC00\uC7A5 \uAE09\uD55C \uAC83 \uBA3C\uC800)\n- \uBCF5\uC2B5 \uD574\uC81C: \uC0AC\uC6A9\uC790\uAC00 "\uC774 \uCE74\uB4DC \uC81C\uAC70"\uD558\uBA74 `til_review_update` (action: "remove") \uD638\uCD9C\n- \uD55C\uAD6D\uC5B4 \uC9C4\uD589, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n';
48091
+ var SKILL_default9 = '---\nname: til-review\ndescription: "SRS \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158 (\uAC04\uACA9 \uBC18\uBCF5 \uD559\uC2B5)"\nargument-hint: "[\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Review Skill\n\nSRS(\uAC04\uACA9 \uBC18\uBCF5) \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158. SM-2 \uC54C\uACE0\uB9AC\uC998\uC73C\uB85C \uBCF5\uC2B5 \uC77C\uC815\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n\n## MCP \uB3C4\uAD6C\n\n- `til_review_list`: \uC624\uB298 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update`: \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D (grade 0-5) \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n- `vault_read_note`: \uCE74\uB4DC \uB0B4\uC6A9 \uC77D\uAE30\n\n## Step 1: \uBCF5\uC2B5 \uCE74\uB4DC \uB85C\uB4DC\n\n`til_review_list` \uD638\uCD9C (\uCE74\uD14C\uACE0\uB9AC \uC778\uC790 \uC788\uC73C\uBA74 \uC804\uB2EC).\n\n- \uCE74\uB4DC 0\uAC1C \u2192 "\uC624\uB298 \uBCF5\uC2B5 \uC5C6\uC74C" \uC548\uB0B4 + \uBBF8\uB4F1\uB85D TIL \uB4F1\uB85D \uC81C\uC548 (Step 5\uB85C)\n- \uCE74\uB4DC \uC788\uC74C \u2192 \uBAA9\uB85D \uD45C\uC2DC + Step 2\uB85C\n\n## Step 2: \uD3C9\uAC00 \uBAA8\uB4DC \uC120\uD0DD\n\n`AskUserQuestion`\uC73C\uB85C \uC120\uD0DD:\n- "\uAC04\uB2E8 \uBAA8\uB4DC (Again / Good)"\n- "\uC0C1\uC138 \uBAA8\uB4DC (Again / Hard / Good / Easy)"\n\n## Step 3: \uCE74\uB4DC\uBCC4 \uBCF5\uC2B5 \uB8E8\uD504\n\n\uAC01 \uCE74\uB4DC\uC5D0 \uB300\uD574:\n\n1. \uC81C\uBAA9\xB7\uCE74\uD14C\uACE0\uB9AC\xB7\uBCF5\uC2B5 \uC815\uBCF4(\uBC18\uBCF5 \uD69F\uC218, EF, \uC5F0\uCCB4\uC77C) \uD45C\uC2DC\n2. `vault_read_note`\uB85C \uB0B4\uC6A9 \uC77D\uAE30\n3. \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC9C8\uBB38 \uD615\uC2DD\uC73C\uB85C \uC81C\uC2DC (\uB0B4\uC6A9 \uAE30\uBC18\uC73C\uB85C 1~2\uAC1C \uC9C8\uBB38 \uC0DD\uC131)\n4. \uC0AC\uC6A9\uC790 \uB2F5\uBCC0 \uB300\uAE30\n5. \uD53C\uB4DC\uBC31 \uC81C\uACF5 (\uC815\uB2F5/\uBCF4\uCDA9 \uC124\uBA85)\n6. `AskUserQuestion`\uC73C\uB85C \uD3C9\uAC00 \uC785\uB825:\n - \uAC04\uB2E8 \uBAA8\uB4DC: "Good (\uAE30\uC5B5\uB0A8)" / "Again (\uBAA8\uB984)" / "\uAC74\uB108\uB6F0\uAE30" / "\uBCF5\uC2B5 \uC911\uB2E8"\n - \uC0C1\uC138 \uBAA8\uB4DC: "Again (\uC2E4\uD328)" / "Hard (\uC5B4\uB835\uAC8C \uC815\uB2F5)" / "Good (\uC815\uC0C1)" / "Easy (\uC644\uBCBD)"\n - grade \uB9E4\uD551: Again=1, Hard=3, Good=4, Easy=5\n - "\uAC74\uB108\uB6F0\uAE30" \uC120\uD0DD \uC2DC \uC774 \uCE74\uB4DC\uB294 \uD3C9\uAC00\uD558\uC9C0 \uC54A\uACE0 \uB2E4\uC74C\uC73C\uB85C\n - "\uBCF5\uC2B5 \uC911\uB2E8" \uC120\uD0DD \uC2DC Step 4\uB85C \uC774\uB3D9\n - \uC0C1\uC138 \uBAA8\uB4DC\uC5D0\uC11C \uAC74\uB108\uB6F0\uAE30/\uC911\uB2E8: "Other" \uC120\uD0DD \uD6C4 "\uAC74\uB108\uB6F0\uAE30" \uB610\uB294 "\uBCF5\uC2B5 \uC911\uB2E8" \uC785\uB825\n7. \uAC74\uB108\uB6F0\uAE30\uAC00 \uC544\uB2CC \uACBD\uC6B0 `til_review_update` (action: "review", grade) \uD638\uCD9C\n8. \uACB0\uACFC \uC694\uC57D (\uB2E4\uC74C \uBCF5\uC2B5\uC77C, interval) \uD45C\uC2DC\n\n## Step 4: \uC644\uB8CC \uD1B5\uACC4\n\n\uBAA8\uB4E0 \uCE74\uB4DC \uC644\uB8CC \uD6C4:\n- \uBCF5\uC2B5\uD55C \uCE74\uB4DC \uC218, \uD3C9\uADE0 grade\n- remaining > 0\uC774\uBA74 "N\uAC1C \uB354 \uB0A8\uC74C, \uB0B4\uC77C \uC774\uC5B4\uC11C" \uC548\uB0B4\n- `til_review_list` \uC7AC\uD638\uCD9C\uD558\uC5EC \uCD5C\uC2E0 \uD1B5\uACC4 \uD45C\uC2DC\n\n## Step 5: TIL \uB4F1\uB85D (\uC120\uD0DD)\n\n\uCE74\uB4DC\uAC00 \uC5C6\uC744 \uB54C \uB610\uB294 \uC0AC\uC6A9\uC790 \uC694\uCCAD \uC2DC:\n- `til_list`\uB85C \uC804\uCCB4 TIL \uBAA9\uB85D \uD45C\uC2DC\n- \uC0AC\uC6A9\uC790\uAC00 \uBCF5\uC2B5 \uB300\uC0C1\uC5D0 \uCD94\uAC00\uD560 \uD30C\uC77C \uC120\uD0DD\n- \uC120\uD0DD\uB41C \uD30C\uC77C\uB9C8\uB2E4 `til_review_update` (action: "review", grade: 4) \uD638\uCD9C\n\n## \uADDC\uCE59\n\n- \uD55C \uC138\uC158 \uCD5C\uB300 20\uAC1C (\uACFC\uBD80\uD558 \uBC29\uC9C0)\n- \uC5F0\uCCB4 \uCE74\uB4DC \uC6B0\uC120 (\uAC00\uC7A5 \uAE09\uD55C \uAC83 \uBA3C\uC800)\n- \uBCF5\uC2B5 \uD574\uC81C: \uC0AC\uC6A9\uC790\uAC00 "\uC774 \uCE74\uB4DC \uC81C\uAC70"\uD558\uBA74 `til_review_update` (action: "remove") \uD638\uCD9C\n- \uD55C\uAD6D\uC5B4 \uC9C4\uD589, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30\n';
47980
48092
 
47981
48093
  // vault-assets/claude-md-section.md
47982
- var claude_md_section_default = "## \uD559\uC2B5 \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n1. `/research <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uBC31\uB85C\uADF8 \uC0DD\uC131\n2. `/backlog [\uCE74\uD14C\uACE0\uB9AC]` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589 \uD655\uC778\n3. `/til <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 \uC800\uC7A5\n4. `/save` \u2014 TIL \uC800\uC7A5 (Daily/MOC/\uBC31\uB85C\uADF8 \uC790\uB3D9 \uC5C5\uB370\uC774\uD2B8)\n5. `/til-review [\uCE74\uD14C\uACE0\uB9AC]` \u2014 SRS \uAE30\uBC18 \uAC04\uACA9 \uBC18\uBCF5 \uBCF5\uC2B5\n\n## MCP \uB3C4\uAD6C\n\n- `vault_read_note` \u2014 \uB178\uD2B8 \uC77D\uAE30\n- `vault_list_files` \u2014 \uD30C\uC77C \uBAA9\uB85D\n- `vault_search` \u2014 \uD14D\uC2A4\uD2B8 \uAC80\uC0C9\n- `vault_get_active_file` \u2014 \uD604\uC7AC \uD30C\uC77C\n- `til_list` \u2014 TIL \uBAA9\uB85D + \uCE74\uD14C\uACE0\uB9AC \uBD84\uB958\n- `til_get_context` \u2014 \uC8FC\uC81C \uAD00\uB828 \uCEE8\uD14D\uC2A4\uD2B8\n- `til_recent_context` \u2014 \uCD5C\uADFC \uD559\uC2B5 \uD750\uB984\n- `til_backlog_status` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589\uB960\n- `til_dashboard` \u2014 \uD559\uC2B5 \uD1B5\uACC4\n- `til_review_list` \u2014 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update` \u2014 \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n\n### \uC5F0\uACB0\n\n```bash\nclaude mcp add --transport http oh-my-til http://localhost:22360/mcp\n```\n";
48094
+ var claude_md_section_default = "## \uD559\uC2B5 \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n1. `/research <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uBC31\uB85C\uADF8 \uC0DD\uC131\n2. `/backlog [\uCE74\uD14C\uACE0\uB9AC]` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589 \uD655\uC778\n3. `/til <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 \uC800\uC7A5\n4. `/save` \u2014 TIL \uC800\uC7A5 (Daily/MOC/\uBC31\uB85C\uADF8 \uC790\uB3D9 \uC5C5\uB370\uC774\uD2B8)\n5. `/til-review [\uCE74\uD14C\uACE0\uB9AC]` \u2014 SRS \uAE30\uBC18 \uAC04\uACA9 \uBC18\uBCF5 \uBCF5\uC2B5\n\n## MCP \uB3C4\uAD6C\n\n- `vault_read_note` \u2014 \uB178\uD2B8 \uC77D\uAE30\n- `vault_list_files` \u2014 \uD30C\uC77C \uBAA9\uB85D\n- `vault_search` \u2014 \uD14D\uC2A4\uD2B8 \uAC80\uC0C9\n- `vault_get_active_file` \u2014 \uD604\uC7AC \uD30C\uC77C\n- `til_list` \u2014 TIL \uBAA9\uB85D + \uCE74\uD14C\uACE0\uB9AC \uBD84\uB958 (search \uD544\uD130 \uC9C0\uC6D0)\n- `til_exists` \u2014 TIL \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \uD655\uC778\n- `til_save_note` \u2014 TIL \uB178\uD2B8 \uC800\uC7A5 (frontmatter/\uACBD\uB85C \uADDC\uCE59 \uBCF4\uC7A5, category\xB7aliases \uC9C0\uC6D0)\n- `til_get_context` \u2014 \uC8FC\uC81C \uAD00\uB828 \uCEE8\uD14D\uC2A4\uD2B8\n- `til_recent_context` \u2014 \uCD5C\uADFC \uD559\uC2B5 \uD750\uB984\n- `til_backlog_status` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589\uB960\n- `til_backlog_check` \u2014 \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uC644\uB8CC \uCC98\uB9AC\n- `til_dashboard` \u2014 \uD559\uC2B5 \uD1B5\uACC4\n- `til_review_list` \u2014 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update` \u2014 \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n\n### \uC5F0\uACB0\n\n```bash\nclaude mcp add --transport http oh-my-til http://localhost:22360/mcp\n```\n";
47983
48095
 
47984
48096
  // vault-assets/agents/til-fetcher.md
47985
48097
  var til_fetcher_default = '---\nname: til-fetcher\ndescription: \uC18C\uC2A4 URL \uCF58\uD150\uCE20\uB97C \uD328\uCE58\uD558\uC5EC \uD559\uC2B5 \uC790\uB8CC\uB85C \uC694\uC57D\uD558\uB294 \uC804\uC6A9 \uC5D0\uC774\uC804\uD2B8\ntools: Read, WebFetch\nmodel: haiku\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# til-fetcher\n\n\uC18C\uC2A4 URL\uC758 \uCF58\uD150\uCE20\uB97C \uD328\uCE58\uD558\uACE0 \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC694\uC57D\uD558\uB294 \uC804\uC6A9 \uC5D0\uC774\uC804\uD2B8.\n\n## \uC5ED\uD560\n\n- `/til` \uC2A4\uD0AC\uC758 Phase 1\uC5D0\uC11C sourceUrls \uD328\uCE58 subagent\uB85C \uC0AC\uC6A9\uB41C\uB2E4\n- \uC8FC\uC5B4\uC9C4 URL(1\uAC1C \uB610\uB294 \uC5EC\uB7EC \uAC1C)\uC744 WebFetch\uB85C \uC21C\uCC28 \uC77D\uACE0 \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC694\uC57D\uD55C\uB2E4\n- \uC5EC\uB7EC URL\uC774 \uC804\uB2EC\uB418\uBA74 \uAC01\uAC01 \uD328\uCE58 \uD6C4 \uD1B5\uD569 \uC694\uC57D\uC744 \uBC18\uD658\uD55C\uB2E4\n\n## \uCD9C\uB825 \uD615\uC2DD\n\n- \uD575\uC2EC \uB0B4\uC6A9 \uC694\uC57D (\uD55C\uAD6D\uC5B4, \uAE30\uC220 \uC6A9\uC5B4 \uC6D0\uC5B4 \uBCD1\uAE30)\n- \uCF54\uB4DC \uC608\uC2DC\uAC00 \uC788\uC73C\uBA74 \uD3EC\uD568\n';
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "oh-my-til",
3
3
  "name": "Oh My TIL",
4
- "version": "0.12.2",
4
+ "version": "0.13.0",
5
5
  "minAppVersion": "1.5.0",
6
6
  "description": "Embedded Claude Code terminal for TIL learning workflows",
7
7
  "author": "SongYunSeop",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-til",
3
- "version": "0.12.2",
3
+ "version": "0.13.0",
4
4
  "description": "Oh My TIL — Claude Code plugin for TIL learning workflow, with Obsidian integration",
5
5
  "main": "main.js",
6
6
  "bin": {