oh-my-til 0.13.0 → 0.14.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
@@ -55,8 +55,12 @@ git clone 없이 `npx`만으로 바로 시작할 수 있습니다.
55
55
  3. **(선택) MCP 서버 시작** — Claude Code가 TIL 파일을 조회할 수 있게 합니다:
56
56
 
57
57
  ```bash
58
+ # HTTP 모드 — 상주 서버 실행
58
59
  npx oh-my-til serve ~/my-til
59
60
  claude mcp add --transport http oh-my-til http://localhost:22360/mcp
61
+
62
+ # stdio 모드 — 필요 시 자동 실행 (서버 불필요, Claude Desktop 호환)
63
+ claude mcp add oh-my-til -- npx oh-my-til mcp ~/my-til
60
64
  ```
61
65
 
62
66
  > **팁:** 경로 없이 `npx oh-my-til init`을 실행하면 현재 디렉토리에 설치됩니다.
@@ -129,19 +133,15 @@ MCP 서버 연결 시 Claude Code에서 사용할 수 있는 도구:
129
133
 
130
134
  | 도구 | 설명 |
131
135
  |------|------|
132
- | `vault_read_note` | 경로로 노트 내용 읽기 |
133
- | `vault_list_files` | 폴더 내 파일 목록 (필터링 가능) |
134
- | `vault_search` | vault 전체 텍스트 검색 |
135
136
  | `vault_get_active_file` | 현재 열린 파일 가져오기 |
136
137
  | `til_list` | 카테고리별 TIL 파일 목록 (`search` 필터 지원) |
137
- | `til_exists` | category + slug로 TIL 파일 존재 여부 확인 |
138
- | `til_save_note` | frontmatter 형식/경로 규칙을 보장하는 TIL 노트 저장 |
138
+ | `til_save_note` | TIL 노트 저장 (frontmatter/경로 규칙 보장, 백로그 자동 체크) |
139
139
  | `til_backlog_status` | 백로그 진행률 요약 (체크박스 카운트) |
140
- | `til_backlog_check` | 백로그 항목을 slug로 완료 처리 |
140
+ | `til_backlog_check` | 백로그 항목을 slug로 완료 처리 (단독 사용 시) |
141
141
  | `til_get_context` | 주제 관련 기존 학습 컨텍스트 (파일, 링크 관계, 미작성 주제) |
142
142
  | `til_recent_context` | 최근 학습 활동을 날짜별로 조회 |
143
143
  | `til_dashboard` | 학습 통계 요약 |
144
- | `til_review_list` | 복습 대상 카드 목록 + 통계 (SRS) |
144
+ | `til_review_list` | 복습 대상 카드 목록 + 통계 (SRS, `include_content` 지원) |
145
145
  | `til_review_update` | 복습 결과 기록 또는 복습 해제 |
146
146
 
147
147
  ## Claude 스킬
package/README.md CHANGED
@@ -55,8 +55,12 @@ No git clone needed. Just `npx`.
55
55
  3. **(Optional) Start MCP server** — lets Claude Code query your TIL files:
56
56
 
57
57
  ```bash
58
+ # HTTP mode — runs a persistent server
58
59
  npx oh-my-til serve ~/my-til
59
60
  claude mcp add --transport http oh-my-til http://localhost:22360/mcp
61
+
62
+ # stdio mode — spawned on demand (no server needed, works with Claude Desktop)
63
+ claude mcp add oh-my-til -- npx oh-my-til mcp ~/my-til
60
64
  ```
61
65
 
62
66
  > **Tip:** You can also run `npx oh-my-til init` without a path to initialize the current directory.
@@ -129,19 +133,15 @@ When the MCP server is connected, Claude Code can use these tools:
129
133
 
130
134
  | Tool | Description |
131
135
  |------|-------------|
132
- | `vault_read_note` | Read note content by path |
133
- | `vault_list_files` | List files in a folder with optional filtering |
134
- | `vault_search` | Full-text search across the vault |
135
136
  | `vault_get_active_file` | Get the currently open file |
136
137
  | `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 |
138
+ | `til_save_note` | Save a TIL note with validated frontmatter and path conventions (auto backlog check) |
139
139
  | `til_backlog_status` | Backlog progress summary with checkbox counts |
140
- | `til_backlog_check` | Mark a backlog item as done by slug |
140
+ | `til_backlog_check` | Mark a backlog item as done by slug (standalone use) |
141
141
  | `til_get_context` | Get existing knowledge context for a topic (files, links, unresolved mentions) |
142
142
  | `til_recent_context` | Recent learning activity grouped by date |
143
143
  | `til_dashboard` | Learning statistics summary |
144
- | `til_review_list` | Due review cards list + stats (SRS) |
144
+ | `til_review_list` | Due review cards list + stats (SRS, supports `include_content`) |
145
145
  | `til_review_update` | Record review result or remove from review |
146
146
 
147
147
  ## Claude Skills
package/dist/cli.js CHANGED
@@ -39295,77 +39295,6 @@ function computeReviewStreak(files, tilPath, now) {
39295
39295
 
39296
39296
  // src/mcp/tools.ts
39297
39297
  function registerTools(server, storage, metadata, tilPath) {
39298
- server.registerTool(
39299
- "vault_read_note",
39300
- {
39301
- title: "Read Note",
39302
- description: "Vault\uC5D0\uC11C \uB178\uD2B8 \uB0B4\uC6A9\uC744 \uC77D\uC2B5\uB2C8\uB2E4",
39303
- inputSchema: external_exports3.object({
39304
- path: external_exports3.string().describe("\uB178\uD2B8 \uD30C\uC77C \uACBD\uB85C (\uC608: til/typescript/generics.md)")
39305
- })
39306
- },
39307
- async ({ path: path6 }) => {
39308
- const text = await storage.readFile(path6);
39309
- if (text === null) {
39310
- return { content: [{ type: "text", text: `Error: \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${path6}` }], isError: true };
39311
- }
39312
- return { content: [{ type: "text", text }] };
39313
- }
39314
- );
39315
- server.registerTool(
39316
- "vault_list_files",
39317
- {
39318
- title: "List Files",
39319
- description: "Vault \uD3F4\uB354 \uB0B4 \uD30C\uC77C \uBAA9\uB85D\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4",
39320
- inputSchema: external_exports3.object({
39321
- folder: external_exports3.string().optional().describe("\uD3F4\uB354 \uACBD\uB85C (\uC0DD\uB7B5 \uC2DC \uB8E8\uD2B8)"),
39322
- extension: external_exports3.string().optional().describe("\uD544\uD130\uB9C1\uD560 \uD655\uC7A5\uC790 (\uC608: md)")
39323
- })
39324
- },
39325
- async ({ folder, extension }) => {
39326
- const files = await storage.listFiles();
39327
- const filtered = files.filter((f) => {
39328
- if (folder && !f.path.startsWith(folder + "/") && f.path !== folder)
39329
- return false;
39330
- if (extension && f.extension !== extension)
39331
- return false;
39332
- return true;
39333
- });
39334
- const list = filtered.map((f) => f.path).join("\n");
39335
- return { content: [{ type: "text", text: list || "(\uD30C\uC77C \uC5C6\uC74C)" }] };
39336
- }
39337
- );
39338
- server.registerTool(
39339
- "vault_search",
39340
- {
39341
- title: "Search Vault",
39342
- description: "Vault \uC804\uCCB4\uC5D0\uC11C \uD14D\uC2A4\uD2B8\uB97C \uAC80\uC0C9\uD569\uB2C8\uB2E4",
39343
- inputSchema: external_exports3.object({
39344
- query: external_exports3.string().describe("\uAC80\uC0C9\uD560 \uD14D\uC2A4\uD2B8")
39345
- })
39346
- },
39347
- async ({ query }) => {
39348
- const files = (await storage.listFiles()).filter((f) => f.extension === "md");
39349
- const results = [];
39350
- const lowerQuery = query.toLowerCase();
39351
- const BATCH_SIZE = 20;
39352
- for (let i = 0; i < files.length && results.length < 50; i += BATCH_SIZE) {
39353
- const batch = files.slice(i, i + BATCH_SIZE);
39354
- const texts = await Promise.all(batch.map((f) => storage.readFile(f.path)));
39355
- for (let j = 0; j < batch.length; j++) {
39356
- const text2 = texts[j];
39357
- if (text2 !== null && text2.toLowerCase().includes(lowerQuery)) {
39358
- results.push(batch[j].path);
39359
- }
39360
- if (results.length >= 50)
39361
- break;
39362
- }
39363
- }
39364
- const text = results.length > 0 ? `${results.length}\uAC1C \uD30C\uC77C\uC5D0\uC11C \uBC1C\uACAC:
39365
- ${results.join("\n")}` : `"${query}"\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4`;
39366
- return { content: [{ type: "text", text }] };
39367
- }
39368
- );
39369
39298
  server.registerTool(
39370
39299
  "vault_get_active_file",
39371
39300
  {
@@ -39614,13 +39543,14 @@ ${text}` }] };
39614
39543
  "til_review_list",
39615
39544
  {
39616
39545
  title: "Review List",
39617
- description: "\uC624\uB298 \uBCF5\uC2B5\uD560 TIL \uCE74\uB4DC \uBAA9\uB85D\uACFC \uD1B5\uACC4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4",
39546
+ description: "\uC624\uB298 \uBCF5\uC2B5\uD560 TIL \uCE74\uB4DC \uBAA9\uB85D\uACFC \uD1B5\uACC4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. include_content=true\uB85C \uB178\uD2B8 \uB0B4\uC6A9\uC744 \uD568\uAED8 \uAC00\uC838\uC624\uBA74 \uBCC4\uB3C4 \uD30C\uC77C \uC77D\uAE30\uB97C \uC904\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
39618
39547
  inputSchema: external_exports3.object({
39619
39548
  category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1"),
39620
- limit: external_exports3.number().min(1).max(100).optional().describe("\uCD5C\uB300 \uCE74\uB4DC \uC218 (\uAE30\uBCF8 20)")
39549
+ limit: external_exports3.number().min(1).max(100).optional().describe("\uCD5C\uB300 \uCE74\uB4DC \uC218 (\uAE30\uBCF8 20)"),
39550
+ include_content: external_exports3.boolean().optional().describe("true\uBA74 \uAC01 \uCE74\uB4DC\uC758 \uB178\uD2B8 \uB0B4\uC6A9\uC744 \uD568\uAED8 \uBC18\uD658 (\uAE30\uBCF8 false)")
39621
39551
  })
39622
39552
  },
39623
- async ({ category, limit }) => {
39553
+ async ({ category, limit, include_content }) => {
39624
39554
  const allFiles = await storage.listFiles();
39625
39555
  const srsFiles = [];
39626
39556
  for (const f of allFiles) {
@@ -39651,6 +39581,15 @@ ${text}` }] };
39651
39581
  const cards = filterDueCards(srsFiles, tilPath, void 0, effectiveLimit);
39652
39582
  const stats = computeReviewStats(srsFiles, tilPath);
39653
39583
  const remaining = Math.max(0, stats.dueToday - cards.length);
39584
+ if (include_content) {
39585
+ const contents = await Promise.all(cards.map((card) => storage.readFile(card.path)));
39586
+ const cardsWithContent = cards.map((card, i) => ({
39587
+ ...card,
39588
+ content: contents[i] ?? ""
39589
+ }));
39590
+ const data2 = { cards: cardsWithContent, stats, remaining };
39591
+ return { content: [{ type: "text", text: JSON.stringify(data2) }] };
39592
+ }
39654
39593
  const data = { cards, stats, remaining };
39655
39594
  return { content: [{ type: "text", text: JSON.stringify(data) }] };
39656
39595
  }
@@ -39701,28 +39640,11 @@ ${text}` }] };
39701
39640
  };
39702
39641
  }
39703
39642
  );
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
39643
  server.registerTool(
39722
39644
  "til_save_note",
39723
39645
  {
39724
39646
  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.",
39647
+ 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. auto_check_backlog=true\uB85C \uC800\uC7A5 \uD6C4 \uBC31\uB85C\uADF8 \uC790\uB3D9 \uCCB4\uD06C.",
39726
39648
  inputSchema: external_exports3.object({
39727
39649
  category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
39728
39650
  slug: external_exports3.string().describe("\uD30C\uC77C\uBA85 slug (\uC608: generics, hooks)"),
@@ -39731,10 +39653,11 @@ ${text}` }] };
39731
39653
  tags: external_exports3.array(external_exports3.string()).optional().describe('\uD0DC\uADF8 \uBAA9\uB85D (\uC608: ["typescript", "basics"])'),
39732
39654
  date: external_exports3.string().optional().describe("\uC791\uC131\uC77C (YYYY-MM-DD, \uC0DD\uB7B5 \uC2DC \uC624\uB298)"),
39733
39655
  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"])')
39656
+ aliases: external_exports3.array(external_exports3.string()).optional().describe('aliases \uBAA9\uB85D (\uC608: ["\uD55C\uAE00 \uC81C\uBAA9", "English Title"])'),
39657
+ auto_check_backlog: external_exports3.boolean().optional().describe("true\uBA74 \uC800\uC7A5 \uD6C4 \uBC31\uB85C\uADF8 \uD56D\uBAA9\uC744 \uC790\uB3D9\uC73C\uB85C \uC644\uB8CC \uCC98\uB9AC (\uAE30\uBCF8 false)")
39735
39658
  })
39736
39659
  },
39737
- async ({ category, slug, title, content, tags, date: date5, fmCategory, aliases }) => {
39660
+ async ({ category, slug, title, content, tags, date: date5, fmCategory, aliases, auto_check_backlog }) => {
39738
39661
  const path6 = `${tilPath}/${category}/${slug}.md`;
39739
39662
  const noteDate = date5 || (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
39740
39663
  const fmLines = ["---", `title: "${title.replace(/"/g, '\\"')}"`, `date: ${noteDate}`];
@@ -39755,6 +39678,19 @@ ${text}` }] };
39755
39678
  const existed = await storage.exists(path6);
39756
39679
  await storage.writeFile(path6, fullContent);
39757
39680
  const data = { path: path6, created: !existed, category, slug, title };
39681
+ if (auto_check_backlog) {
39682
+ const backlogPath = `${tilPath}/${category}/backlog.md`;
39683
+ const backlogContent = await storage.readFile(backlogPath);
39684
+ if (backlogContent !== null) {
39685
+ const result = checkBacklogItem(backlogContent, slug);
39686
+ if (result.found && !result.alreadyDone) {
39687
+ await storage.writeFile(backlogPath, result.content);
39688
+ data.backlog_checked = true;
39689
+ } else if (result.alreadyDone) {
39690
+ data.backlog_already_done = true;
39691
+ }
39692
+ }
39693
+ }
39758
39694
  return { content: [{ type: "text", text: JSON.stringify(data) }] };
39759
39695
  }
39760
39696
  );
@@ -39874,8 +39810,100 @@ var TILMcpServer = class {
39874
39810
  }
39875
39811
  };
39876
39812
 
39813
+ // node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
39814
+ var import_node_process = __toESM(require("process"), 1);
39815
+
39816
+ // node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
39817
+ var ReadBuffer = class {
39818
+ append(chunk) {
39819
+ this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
39820
+ }
39821
+ readMessage() {
39822
+ if (!this._buffer) {
39823
+ return null;
39824
+ }
39825
+ const index = this._buffer.indexOf("\n");
39826
+ if (index === -1) {
39827
+ return null;
39828
+ }
39829
+ const line = this._buffer.toString("utf8", 0, index).replace(/\r$/, "");
39830
+ this._buffer = this._buffer.subarray(index + 1);
39831
+ return deserializeMessage(line);
39832
+ }
39833
+ clear() {
39834
+ this._buffer = void 0;
39835
+ }
39836
+ };
39837
+ function deserializeMessage(line) {
39838
+ return JSONRPCMessageSchema.parse(JSON.parse(line));
39839
+ }
39840
+ function serializeMessage(message) {
39841
+ return JSON.stringify(message) + "\n";
39842
+ }
39843
+
39844
+ // node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
39845
+ var StdioServerTransport = class {
39846
+ constructor(_stdin = import_node_process.default.stdin, _stdout = import_node_process.default.stdout) {
39847
+ this._stdin = _stdin;
39848
+ this._stdout = _stdout;
39849
+ this._readBuffer = new ReadBuffer();
39850
+ this._started = false;
39851
+ this._ondata = (chunk) => {
39852
+ this._readBuffer.append(chunk);
39853
+ this.processReadBuffer();
39854
+ };
39855
+ this._onerror = (error48) => {
39856
+ this.onerror?.(error48);
39857
+ };
39858
+ }
39859
+ /**
39860
+ * Starts listening for messages on stdin.
39861
+ */
39862
+ async start() {
39863
+ if (this._started) {
39864
+ throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");
39865
+ }
39866
+ this._started = true;
39867
+ this._stdin.on("data", this._ondata);
39868
+ this._stdin.on("error", this._onerror);
39869
+ }
39870
+ processReadBuffer() {
39871
+ while (true) {
39872
+ try {
39873
+ const message = this._readBuffer.readMessage();
39874
+ if (message === null) {
39875
+ break;
39876
+ }
39877
+ this.onmessage?.(message);
39878
+ } catch (error48) {
39879
+ this.onerror?.(error48);
39880
+ }
39881
+ }
39882
+ }
39883
+ async close() {
39884
+ this._stdin.off("data", this._ondata);
39885
+ this._stdin.off("error", this._onerror);
39886
+ const remainingDataListeners = this._stdin.listenerCount("data");
39887
+ if (remainingDataListeners === 0) {
39888
+ this._stdin.pause();
39889
+ }
39890
+ this._readBuffer.clear();
39891
+ this.onclose?.();
39892
+ }
39893
+ send(message) {
39894
+ return new Promise((resolve3) => {
39895
+ const json2 = serializeMessage(message);
39896
+ if (this._stdout.write(json2)) {
39897
+ resolve3();
39898
+ } else {
39899
+ this._stdout.once("drain", resolve3);
39900
+ }
39901
+ });
39902
+ }
39903
+ };
39904
+
39877
39905
  // vault-assets/skills/til/SKILL.md
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';
39906
+ 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. `Read`\uB85C `til/{category}/{slug}.md` \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';
39879
39907
 
39880
39908
  // vault-assets/skills/backlog/SKILL.md
39881
39909
  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';
@@ -39884,7 +39912,7 @@ var SKILL_default2 = '---\nname: backlog\ndescription: "\uD559\uC2B5 \uBC31\uB85
39884
39912
  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';
39885
39913
 
39886
39914
  // vault-assets/skills/save/SKILL.md
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';
39915
+ 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_save_note`: TIL \uB178\uD2B8 \uC800\uC7A5 (frontmatter/\uACBD\uB85C \uADDC\uCE59 \uC11C\uBC84 \uBCF4\uC7A5, auto_check_backlog\uB85C \uBC31\uB85C\uADF8 \uC790\uB3D9 \uCCB4\uD06C)\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. `Read`\uB85C `til/{category}/{slug}.md` \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \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, auto_check_backlog: true)\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 `Read`\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_save_note`\uC758 `auto_check_backlog: true`\uB85C \uC774\uBBF8 \uCC98\uB9AC\uB428 (\uBCC4\uB3C4 \uD638\uCD9C \uBD88\uD544\uC694)\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';
39888
39916
 
39889
39917
  // vault-assets/skills/migrate-links/SKILL.md
39890
39918
  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';
@@ -39899,10 +39927,10 @@ var SKILL_default7 = '---\nname: setup-pages\ndescription: "(deprecated) /omt-se
39899
39927
  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';
39900
39928
 
39901
39929
  // vault-assets/skills/til-review/SKILL.md
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';
39930
+ 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 (`include_content: true`\uB85C \uB178\uD2B8 \uB0B4\uC6A9 \uD568\uAED8 \uB85C\uB4DC)\n- `til_review_update`: \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D (grade 0-5) \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n\n## Step 1: \uBCF5\uC2B5 \uCE74\uB4DC \uB85C\uB4DC\n\n`til_review_list` \uD638\uCD9C (`include_content: true`, \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. Step 1\uC5D0\uC11C \uC774\uBBF8 \uB85C\uB4DC\uB41C `content` \uC0AC\uC6A9 (\uCD94\uAC00 MCP \uD638\uCD9C \uBD88\uD544\uC694)\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';
39903
39931
 
39904
39932
  // vault-assets/claude-md-section.md
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";
39933
+ 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**\uD559\uC2B5 \uCEE8\uD14D\uC2A4\uD2B8:**\n- `til_get_context` \u2014 \uC8FC\uC81C \uAD00\uB828 \uAE30\uC874 \uD559\uC2B5 \uCEE8\uD14D\uC2A4\uD2B8 (\uACBD\uB85C/\uB0B4\uC6A9 \uB9E4\uCE6D, backlink, \uBBF8\uC791\uC131 \uB9C1\uD06C)\n- `til_recent_context` \u2014 \uCD5C\uADFC \uD559\uC2B5 \uD750\uB984 (\uC2DC\uAC04\uC21C)\n- `vault_get_active_file` \u2014 \uD604\uC7AC \uC5F4\uB9B0 \uD30C\uC77C\n\n**TIL \uAD00\uB9AC:**\n- `til_list` \u2014 TIL \uBAA9\uB85D + \uCE74\uD14C\uACE0\uB9AC \uBD84\uB958 (search \uD544\uD130)\n- `til_save_note` \u2014 TIL \uC800\uC7A5 (frontmatter \uBCF4\uC7A5, auto_check_backlog\uB85C \uBC31\uB85C\uADF8 \uC790\uB3D9 \uCCB4\uD06C)\n\n**\uBC31\uB85C\uADF8:**\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 (\uB2E8\uB3C5 \uC0AC\uC6A9 \uC2DC)\n\n**\uBCF5\uC2B5 (SRS):**\n- `til_review_list` \u2014 \uBCF5\uC2B5 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4 (include_content)\n- `til_review_update` \u2014 \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D\n\n**\uD1B5\uACC4:**\n- `til_dashboard` \u2014 \uD559\uC2B5 \uB300\uC2DC\uBCF4\uB4DC \uD1B5\uACC4\n\n### \uC5F0\uACB0\n\n```bash\n# HTTP (Obsidian \uD50C\uB7EC\uADF8\uC778 \uB610\uB294 oh-my-til serve \uC0AC\uC6A9 \uC2DC)\nclaude mcp add --transport http oh-my-til http://localhost:22360/mcp\n\n# stdio (Obsidian \uC5C6\uC774 \uB3C5\uB9BD \uC2E4\uD589, Claude Desktop scheduled task \uB4F1)\nclaude mcp add oh-my-til -- npx oh-my-til mcp /path/to/vault\n```\n";
39906
39934
 
39907
39935
  // vault-assets/agents/til-fetcher.md
39908
39936
  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';
@@ -41241,13 +41269,14 @@ function generateProfileHtml(config2, summaryCardsHtml, heatmapHtml, recentTilsH
41241
41269
  // src/cli/index.ts
41242
41270
  var path5 = __toESM(require("path"));
41243
41271
  var fs4 = __toESM(require("fs"));
41244
- var VERSION = true ? "0.12.3" : "0.0.0";
41272
+ var VERSION = true ? "0.13.0" : "0.0.0";
41245
41273
  function printUsage() {
41246
41274
  console.log(`oh-my-til v${VERSION}
41247
41275
 
41248
41276
  Usage:
41249
41277
  oh-my-til init [<path>] [options] Install skills, rules, and CLAUDE.md
41250
- oh-my-til serve [<path>] [options] Start MCP server
41278
+ oh-my-til serve [<path>] [options] Start MCP server (HTTP)
41279
+ oh-my-til mcp [<path>] [options] Start MCP server (stdio)
41251
41280
  oh-my-til deploy [<path>] [options] Generate static site from TIL files
41252
41281
  oh-my-til version Print version
41253
41282
 
@@ -41258,6 +41287,9 @@ Options (serve):
41258
41287
  --til-path <path> TIL folder path (default: til)
41259
41288
  --port <port> MCP server port (default: 22360)
41260
41289
 
41290
+ Options (mcp):
41291
+ --til-path <path> TIL folder path (default: til)
41292
+
41261
41293
  Options (deploy):
41262
41294
  --til-path <path> TIL folder path (default: til)
41263
41295
  --out <path> Output directory (default: _site)
@@ -41335,6 +41367,24 @@ To start MCP server: oh-my-til serve ${basePath}`);
41335
41367
  } else {
41336
41368
  console.log("\nUsing Obsidian? Run init inside your vault to auto-install the plugin.");
41337
41369
  }
41370
+ } else if (command === "mcp") {
41371
+ const storage = new FsStorage(basePath);
41372
+ const metadata = new FsMetadata(basePath);
41373
+ const mcpServer = new McpServer({
41374
+ name: "oh-my-til",
41375
+ version: VERSION
41376
+ });
41377
+ registerTools(mcpServer, storage, metadata, tilPath);
41378
+ const transport = new StdioServerTransport();
41379
+ await mcpServer.connect(transport);
41380
+ process.stderr.write(`oh-my-til MCP server running (stdio, tilPath=${tilPath})
41381
+ `);
41382
+ const shutdown = async () => {
41383
+ await mcpServer.close();
41384
+ process.exit(0);
41385
+ };
41386
+ process.on("SIGINT", shutdown);
41387
+ process.on("SIGTERM", shutdown);
41338
41388
  } else if (command === "serve") {
41339
41389
  const storage = new FsStorage(basePath);
41340
41390
  const metadata = new FsMetadata(basePath);
package/main.js CHANGED
@@ -47477,77 +47477,6 @@ var http = __toESM(require("http"));
47477
47477
 
47478
47478
  // src/mcp/tools.ts
47479
47479
  function registerTools(server, storage, metadata, tilPath) {
47480
- server.registerTool(
47481
- "vault_read_note",
47482
- {
47483
- title: "Read Note",
47484
- description: "Vault\uC5D0\uC11C \uB178\uD2B8 \uB0B4\uC6A9\uC744 \uC77D\uC2B5\uB2C8\uB2E4",
47485
- inputSchema: external_exports3.object({
47486
- path: external_exports3.string().describe("\uB178\uD2B8 \uD30C\uC77C \uACBD\uB85C (\uC608: til/typescript/generics.md)")
47487
- })
47488
- },
47489
- async ({ path: path3 }) => {
47490
- const text = await storage.readFile(path3);
47491
- if (text === null) {
47492
- return { content: [{ type: "text", text: `Error: \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${path3}` }], isError: true };
47493
- }
47494
- return { content: [{ type: "text", text }] };
47495
- }
47496
- );
47497
- server.registerTool(
47498
- "vault_list_files",
47499
- {
47500
- title: "List Files",
47501
- description: "Vault \uD3F4\uB354 \uB0B4 \uD30C\uC77C \uBAA9\uB85D\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4",
47502
- inputSchema: external_exports3.object({
47503
- folder: external_exports3.string().optional().describe("\uD3F4\uB354 \uACBD\uB85C (\uC0DD\uB7B5 \uC2DC \uB8E8\uD2B8)"),
47504
- extension: external_exports3.string().optional().describe("\uD544\uD130\uB9C1\uD560 \uD655\uC7A5\uC790 (\uC608: md)")
47505
- })
47506
- },
47507
- async ({ folder, extension }) => {
47508
- const files = await storage.listFiles();
47509
- const filtered = files.filter((f) => {
47510
- if (folder && !f.path.startsWith(folder + "/") && f.path !== folder)
47511
- return false;
47512
- if (extension && f.extension !== extension)
47513
- return false;
47514
- return true;
47515
- });
47516
- const list = filtered.map((f) => f.path).join("\n");
47517
- return { content: [{ type: "text", text: list || "(\uD30C\uC77C \uC5C6\uC74C)" }] };
47518
- }
47519
- );
47520
- server.registerTool(
47521
- "vault_search",
47522
- {
47523
- title: "Search Vault",
47524
- description: "Vault \uC804\uCCB4\uC5D0\uC11C \uD14D\uC2A4\uD2B8\uB97C \uAC80\uC0C9\uD569\uB2C8\uB2E4",
47525
- inputSchema: external_exports3.object({
47526
- query: external_exports3.string().describe("\uAC80\uC0C9\uD560 \uD14D\uC2A4\uD2B8")
47527
- })
47528
- },
47529
- async ({ query }) => {
47530
- const files = (await storage.listFiles()).filter((f) => f.extension === "md");
47531
- const results = [];
47532
- const lowerQuery = query.toLowerCase();
47533
- const BATCH_SIZE = 20;
47534
- for (let i = 0; i < files.length && results.length < 50; i += BATCH_SIZE) {
47535
- const batch = files.slice(i, i + BATCH_SIZE);
47536
- const texts = await Promise.all(batch.map((f) => storage.readFile(f.path)));
47537
- for (let j = 0; j < batch.length; j++) {
47538
- const text2 = texts[j];
47539
- if (text2 !== null && text2.toLowerCase().includes(lowerQuery)) {
47540
- results.push(batch[j].path);
47541
- }
47542
- if (results.length >= 50)
47543
- break;
47544
- }
47545
- }
47546
- const text = results.length > 0 ? `${results.length}\uAC1C \uD30C\uC77C\uC5D0\uC11C \uBC1C\uACAC:
47547
- ${results.join("\n")}` : `"${query}"\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4`;
47548
- return { content: [{ type: "text", text }] };
47549
- }
47550
- );
47551
47480
  server.registerTool(
47552
47481
  "vault_get_active_file",
47553
47482
  {
@@ -47799,13 +47728,14 @@ ${text}` }] };
47799
47728
  "til_review_list",
47800
47729
  {
47801
47730
  title: "Review List",
47802
- description: "\uC624\uB298 \uBCF5\uC2B5\uD560 TIL \uCE74\uB4DC \uBAA9\uB85D\uACFC \uD1B5\uACC4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4",
47731
+ description: "\uC624\uB298 \uBCF5\uC2B5\uD560 TIL \uCE74\uB4DC \uBAA9\uB85D\uACFC \uD1B5\uACC4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. include_content=true\uB85C \uB178\uD2B8 \uB0B4\uC6A9\uC744 \uD568\uAED8 \uAC00\uC838\uC624\uBA74 \uBCC4\uB3C4 \uD30C\uC77C \uC77D\uAE30\uB97C \uC904\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
47803
47732
  inputSchema: external_exports3.object({
47804
47733
  category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1"),
47805
- limit: external_exports3.number().min(1).max(100).optional().describe("\uCD5C\uB300 \uCE74\uB4DC \uC218 (\uAE30\uBCF8 20)")
47734
+ limit: external_exports3.number().min(1).max(100).optional().describe("\uCD5C\uB300 \uCE74\uB4DC \uC218 (\uAE30\uBCF8 20)"),
47735
+ include_content: external_exports3.boolean().optional().describe("true\uBA74 \uAC01 \uCE74\uB4DC\uC758 \uB178\uD2B8 \uB0B4\uC6A9\uC744 \uD568\uAED8 \uBC18\uD658 (\uAE30\uBCF8 false)")
47806
47736
  })
47807
47737
  },
47808
- async ({ category, limit }) => {
47738
+ async ({ category, limit, include_content }) => {
47809
47739
  var _a4, _b;
47810
47740
  const allFiles = await storage.listFiles();
47811
47741
  const srsFiles = [];
@@ -47837,6 +47767,18 @@ ${text}` }] };
47837
47767
  const cards = filterDueCards(srsFiles, tilPath, void 0, effectiveLimit);
47838
47768
  const stats = computeReviewStats(srsFiles, tilPath);
47839
47769
  const remaining = Math.max(0, stats.dueToday - cards.length);
47770
+ if (include_content) {
47771
+ const contents = await Promise.all(cards.map((card) => storage.readFile(card.path)));
47772
+ const cardsWithContent = cards.map((card, i) => {
47773
+ var _a5;
47774
+ return {
47775
+ ...card,
47776
+ content: (_a5 = contents[i]) != null ? _a5 : ""
47777
+ };
47778
+ });
47779
+ const data2 = { cards: cardsWithContent, stats, remaining };
47780
+ return { content: [{ type: "text", text: JSON.stringify(data2) }] };
47781
+ }
47840
47782
  const data = { cards, stats, remaining };
47841
47783
  return { content: [{ type: "text", text: JSON.stringify(data) }] };
47842
47784
  }
@@ -47888,28 +47830,11 @@ ${text}` }] };
47888
47830
  };
47889
47831
  }
47890
47832
  );
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
47833
  server.registerTool(
47909
47834
  "til_save_note",
47910
47835
  {
47911
47836
  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.",
47837
+ 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. auto_check_backlog=true\uB85C \uC800\uC7A5 \uD6C4 \uBC31\uB85C\uADF8 \uC790\uB3D9 \uCCB4\uD06C.",
47913
47838
  inputSchema: external_exports3.object({
47914
47839
  category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
47915
47840
  slug: external_exports3.string().describe("\uD30C\uC77C\uBA85 slug (\uC608: generics, hooks)"),
@@ -47918,10 +47843,11 @@ ${text}` }] };
47918
47843
  tags: external_exports3.array(external_exports3.string()).optional().describe('\uD0DC\uADF8 \uBAA9\uB85D (\uC608: ["typescript", "basics"])'),
47919
47844
  date: external_exports3.string().optional().describe("\uC791\uC131\uC77C (YYYY-MM-DD, \uC0DD\uB7B5 \uC2DC \uC624\uB298)"),
47920
47845
  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"])')
47846
+ aliases: external_exports3.array(external_exports3.string()).optional().describe('aliases \uBAA9\uB85D (\uC608: ["\uD55C\uAE00 \uC81C\uBAA9", "English Title"])'),
47847
+ auto_check_backlog: external_exports3.boolean().optional().describe("true\uBA74 \uC800\uC7A5 \uD6C4 \uBC31\uB85C\uADF8 \uD56D\uBAA9\uC744 \uC790\uB3D9\uC73C\uB85C \uC644\uB8CC \uCC98\uB9AC (\uAE30\uBCF8 false)")
47922
47848
  })
47923
47849
  },
47924
- async ({ category, slug, title, content, tags, date: date7, fmCategory, aliases }) => {
47850
+ async ({ category, slug, title, content, tags, date: date7, fmCategory, aliases, auto_check_backlog }) => {
47925
47851
  const path3 = `${tilPath}/${category}/${slug}.md`;
47926
47852
  const noteDate = date7 || (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
47927
47853
  const fmLines = ["---", `title: "${title.replace(/"/g, '\\"')}"`, `date: ${noteDate}`];
@@ -47942,6 +47868,19 @@ ${text}` }] };
47942
47868
  const existed = await storage.exists(path3);
47943
47869
  await storage.writeFile(path3, fullContent);
47944
47870
  const data = { path: path3, created: !existed, category, slug, title };
47871
+ if (auto_check_backlog) {
47872
+ const backlogPath = `${tilPath}/${category}/backlog.md`;
47873
+ const backlogContent = await storage.readFile(backlogPath);
47874
+ if (backlogContent !== null) {
47875
+ const result = checkBacklogItem(backlogContent, slug);
47876
+ if (result.found && !result.alreadyDone) {
47877
+ await storage.writeFile(backlogPath, result.content);
47878
+ data.backlog_checked = true;
47879
+ } else if (result.alreadyDone) {
47880
+ data.backlog_already_done = true;
47881
+ }
47882
+ }
47883
+ }
47945
47884
  return { content: [{ type: "text", text: JSON.stringify(data) }] };
47946
47885
  }
47947
47886
  );
@@ -48064,7 +48003,7 @@ var TILMcpServer = class {
48064
48003
  };
48065
48004
 
48066
48005
  // vault-assets/skills/til/SKILL.md
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';
48006
+ 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. `Read`\uB85C `til/{category}/{slug}.md` \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';
48068
48007
 
48069
48008
  // vault-assets/skills/backlog/SKILL.md
48070
48009
  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';
@@ -48073,7 +48012,7 @@ var SKILL_default2 = '---\nname: backlog\ndescription: "\uD559\uC2B5 \uBC31\uB85
48073
48012
  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';
48074
48013
 
48075
48014
  // vault-assets/skills/save/SKILL.md
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';
48015
+ 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_save_note`: TIL \uB178\uD2B8 \uC800\uC7A5 (frontmatter/\uACBD\uB85C \uADDC\uCE59 \uC11C\uBC84 \uBCF4\uC7A5, auto_check_backlog\uB85C \uBC31\uB85C\uADF8 \uC790\uB3D9 \uCCB4\uD06C)\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. `Read`\uB85C `til/{category}/{slug}.md` \uD30C\uC77C \uC874\uC7AC \uC5EC\uBD80 \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, auto_check_backlog: true)\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 `Read`\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_save_note`\uC758 `auto_check_backlog: true`\uB85C \uC774\uBBF8 \uCC98\uB9AC\uB428 (\uBCC4\uB3C4 \uD638\uCD9C \uBD88\uD544\uC694)\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';
48077
48016
 
48078
48017
  // vault-assets/skills/migrate-links/SKILL.md
48079
48018
  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';
@@ -48088,10 +48027,10 @@ var SKILL_default7 = '---\nname: setup-pages\ndescription: "(deprecated) /omt-se
48088
48027
  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';
48089
48028
 
48090
48029
  // vault-assets/skills/til-review/SKILL.md
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';
48030
+ 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 (`include_content: true`\uB85C \uB178\uD2B8 \uB0B4\uC6A9 \uD568\uAED8 \uB85C\uB4DC)\n- `til_review_update`: \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D (grade 0-5) \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n\n## Step 1: \uBCF5\uC2B5 \uCE74\uB4DC \uB85C\uB4DC\n\n`til_review_list` \uD638\uCD9C (`include_content: true`, \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. Step 1\uC5D0\uC11C \uC774\uBBF8 \uB85C\uB4DC\uB41C `content` \uC0AC\uC6A9 (\uCD94\uAC00 MCP \uD638\uCD9C \uBD88\uD544\uC694)\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';
48092
48031
 
48093
48032
  // vault-assets/claude-md-section.md
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";
48033
+ 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**\uD559\uC2B5 \uCEE8\uD14D\uC2A4\uD2B8:**\n- `til_get_context` \u2014 \uC8FC\uC81C \uAD00\uB828 \uAE30\uC874 \uD559\uC2B5 \uCEE8\uD14D\uC2A4\uD2B8 (\uACBD\uB85C/\uB0B4\uC6A9 \uB9E4\uCE6D, backlink, \uBBF8\uC791\uC131 \uB9C1\uD06C)\n- `til_recent_context` \u2014 \uCD5C\uADFC \uD559\uC2B5 \uD750\uB984 (\uC2DC\uAC04\uC21C)\n- `vault_get_active_file` \u2014 \uD604\uC7AC \uC5F4\uB9B0 \uD30C\uC77C\n\n**TIL \uAD00\uB9AC:**\n- `til_list` \u2014 TIL \uBAA9\uB85D + \uCE74\uD14C\uACE0\uB9AC \uBD84\uB958 (search \uD544\uD130)\n- `til_save_note` \u2014 TIL \uC800\uC7A5 (frontmatter \uBCF4\uC7A5, auto_check_backlog\uB85C \uBC31\uB85C\uADF8 \uC790\uB3D9 \uCCB4\uD06C)\n\n**\uBC31\uB85C\uADF8:**\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 (\uB2E8\uB3C5 \uC0AC\uC6A9 \uC2DC)\n\n**\uBCF5\uC2B5 (SRS):**\n- `til_review_list` \u2014 \uBCF5\uC2B5 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4 (include_content)\n- `til_review_update` \u2014 \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D\n\n**\uD1B5\uACC4:**\n- `til_dashboard` \u2014 \uD559\uC2B5 \uB300\uC2DC\uBCF4\uB4DC \uD1B5\uACC4\n\n### \uC5F0\uACB0\n\n```bash\n# HTTP (Obsidian \uD50C\uB7EC\uADF8\uC778 \uB610\uB294 oh-my-til serve \uC0AC\uC6A9 \uC2DC)\nclaude mcp add --transport http oh-my-til http://localhost:22360/mcp\n\n# stdio (Obsidian \uC5C6\uC774 \uB3C5\uB9BD \uC2E4\uD589, Claude Desktop scheduled task \uB4F1)\nclaude mcp add oh-my-til -- npx oh-my-til mcp /path/to/vault\n```\n";
48095
48034
 
48096
48035
  // vault-assets/agents/til-fetcher.md
48097
48036
  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.13.0",
4
+ "version": "0.14.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.13.0",
3
+ "version": "0.14.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": {