oh-my-til 0.12.3 → 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 +15 -6
- package/README.md +15 -6
- package/dist/cli.js +246 -85
- package/main.js +134 -83
- package/manifest.json +1 -1
- package/package.json +1 -1
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,16 +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
|
-
| `til_list` | 카테고리별 TIL 파일 목록 |
|
|
137
|
+
| `til_list` | 카테고리별 TIL 파일 목록 (`search` 필터 지원) |
|
|
138
|
+
| `til_save_note` | TIL 노트 저장 (frontmatter/경로 규칙 보장, 백로그 자동 체크) |
|
|
137
139
|
| `til_backlog_status` | 백로그 진행률 요약 (체크박스 카운트) |
|
|
140
|
+
| `til_backlog_check` | 백로그 항목을 slug로 완료 처리 (단독 사용 시) |
|
|
138
141
|
| `til_get_context` | 주제 관련 기존 학습 컨텍스트 (파일, 링크 관계, 미작성 주제) |
|
|
139
142
|
| `til_recent_context` | 최근 학습 활동을 날짜별로 조회 |
|
|
140
143
|
| `til_dashboard` | 학습 통계 요약 |
|
|
141
|
-
| `til_review_list` | 복습 대상 카드 목록 + 통계 (SRS) |
|
|
144
|
+
| `til_review_list` | 복습 대상 카드 목록 + 통계 (SRS, `include_content` 지원) |
|
|
142
145
|
| `til_review_update` | 복습 결과 기록 또는 복습 해제 |
|
|
143
146
|
|
|
144
147
|
## Claude 스킬
|
|
@@ -177,6 +180,10 @@ src/
|
|
|
177
180
|
│ ├── keyboard.ts # Shift+Enter → \n (멀티라인 지원)
|
|
178
181
|
│ ├── env.ts # macOS PATH 보정 (Homebrew)
|
|
179
182
|
│ ├── skills.ts # 버전 비교/플레이스홀더 치환 순수 함수
|
|
183
|
+
│ ├── cli.ts # CLI 인자 파싱 순수 함수
|
|
184
|
+
│ ├── config.ts # 설정 파일 파싱/로딩 순수 함수
|
|
185
|
+
│ ├── markdown.ts # 마크다운 → HTML 변환 (외부 의존성 없음)
|
|
186
|
+
│ ├── profile.ts # 정적 사이트 페이지 생성 (프로필, TIL 페이지, 카테고리 인덱스)
|
|
180
187
|
│ └── index.ts # barrel export
|
|
181
188
|
├── ports/ # 어댑터 인터페이스
|
|
182
189
|
│ ├── storage.ts # FileStorage 인터페이스
|
|
@@ -185,10 +192,12 @@ src/
|
|
|
185
192
|
│ ├── fs-adapter.ts # node:fs 기반 (standalone)
|
|
186
193
|
│ └── obsidian-adapter.ts # Obsidian App 기반
|
|
187
194
|
├── mcp/ # MCP 서버 (포트 의존, Obsidian 무관)
|
|
195
|
+
│ ├── context.ts # 학습 컨텍스트 도구 (topic 매칭, 카테고리 추출)
|
|
188
196
|
│ ├── server.ts # HTTP 서버 + Streamable HTTP 트랜스포트
|
|
189
197
|
│ └── tools.ts # MCP 도구 정의 (FileStorage + MetadataProvider 사용)
|
|
198
|
+
├── plugin-install.ts # 플러그인 에셋 자동 설치/업데이트 (skills, agents, CLAUDE.md 섹션)
|
|
190
199
|
├── cli/ # 독립 CLI 진입점
|
|
191
|
-
│ ├── index.ts # npx oh-my-til init / serve
|
|
200
|
+
│ ├── index.ts # npx oh-my-til init / serve / deploy
|
|
192
201
|
│ └── obsidian-install.ts # Obsidian 플러그인 자동 설치 (Electron 감지, node-pty 재빌드)
|
|
193
202
|
└── obsidian/ # Obsidian 플랫폼 어댑터
|
|
194
203
|
├── main.ts # 플러그인 진입점
|
package/README.md
CHANGED
|
@@ -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,16 +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
|
-
| `til_list` | List TIL files grouped by category |
|
|
137
|
+
| `til_list` | List TIL files grouped by category (supports `search` filter) |
|
|
138
|
+
| `til_save_note` | Save a TIL note with validated frontmatter and path conventions (auto backlog check) |
|
|
137
139
|
| `til_backlog_status` | Backlog progress summary with checkbox counts |
|
|
140
|
+
| `til_backlog_check` | Mark a backlog item as done by slug (standalone use) |
|
|
138
141
|
| `til_get_context` | Get existing knowledge context for a topic (files, links, unresolved mentions) |
|
|
139
142
|
| `til_recent_context` | Recent learning activity grouped by date |
|
|
140
143
|
| `til_dashboard` | Learning statistics summary |
|
|
141
|
-
| `til_review_list` | Due review cards list + stats (SRS) |
|
|
144
|
+
| `til_review_list` | Due review cards list + stats (SRS, supports `include_content`) |
|
|
142
145
|
| `til_review_update` | Record review result or remove from review |
|
|
143
146
|
|
|
144
147
|
## Claude Skills
|
|
@@ -177,6 +180,10 @@ src/
|
|
|
177
180
|
│ ├── keyboard.ts # Shift+Enter → \n (multiline support)
|
|
178
181
|
│ ├── env.ts # macOS PATH resolution (Homebrew)
|
|
179
182
|
│ ├── skills.ts # Version comparison / placeholder substitution
|
|
183
|
+
│ ├── cli.ts # CLI argument parsing (pure functions)
|
|
184
|
+
│ ├── config.ts # Config file parsing/loading (pure functions)
|
|
185
|
+
│ ├── markdown.ts # Markdown → HTML conversion (no external deps)
|
|
186
|
+
│ ├── profile.ts # Static site page generation (profile, TIL pages, category index)
|
|
180
187
|
│ └── index.ts # Barrel export
|
|
181
188
|
├── ports/ # Adapter interfaces
|
|
182
189
|
│ ├── storage.ts # FileStorage interface
|
|
@@ -185,10 +192,12 @@ src/
|
|
|
185
192
|
│ ├── fs-adapter.ts # node:fs based (standalone)
|
|
186
193
|
│ └── obsidian-adapter.ts # Obsidian App based
|
|
187
194
|
├── mcp/ # MCP server (port-dependent, Obsidian-free)
|
|
195
|
+
│ ├── context.ts # Learning context tools (topic matching, category extraction)
|
|
188
196
|
│ ├── server.ts # HTTP server + Streamable HTTP transport
|
|
189
197
|
│ └── tools.ts # MCP tool definitions (FileStorage + MetadataProvider)
|
|
198
|
+
├── plugin-install.ts # Plugin asset auto-install/update (skills, agents, CLAUDE.md section)
|
|
190
199
|
├── cli/ # Standalone CLI entry point
|
|
191
|
-
│ ├── index.ts # npx oh-my-til init / serve
|
|
200
|
+
│ ├── index.ts # npx oh-my-til init / serve / deploy
|
|
192
201
|
│ └── obsidian-install.ts # Auto-install Obsidian plugin (Electron detection, node-pty rebuild)
|
|
193
202
|
└── obsidian/ # Obsidian platform adapter
|
|
194
203
|
├── main.ts # Plugin entry point
|
package/dist/cli.js
CHANGED
|
@@ -38784,6 +38784,28 @@ function parseBacklogSections(content) {
|
|
|
38784
38784
|
}
|
|
38785
38785
|
return sections.filter((s) => s.items.length > 0);
|
|
38786
38786
|
}
|
|
38787
|
+
function checkBacklogItem(content, slug) {
|
|
38788
|
+
const lines = content.split("\n");
|
|
38789
|
+
let found = false;
|
|
38790
|
+
let alreadyDone = false;
|
|
38791
|
+
for (let i = 0; i < lines.length; i++) {
|
|
38792
|
+
const match = lines[i].match(/^(-\s+\[)([ xX])(\]\s+\[[^\[\]]*\]\()([^()]+)(\).*)/);
|
|
38793
|
+
if (!match)
|
|
38794
|
+
continue;
|
|
38795
|
+
const rawPath = match[4].trim();
|
|
38796
|
+
const pathSlug = rawPath.replace(/\.md$/, "").split("/").pop() ?? "";
|
|
38797
|
+
if (pathSlug !== slug)
|
|
38798
|
+
continue;
|
|
38799
|
+
found = true;
|
|
38800
|
+
if (match[2] !== " ") {
|
|
38801
|
+
alreadyDone = true;
|
|
38802
|
+
break;
|
|
38803
|
+
}
|
|
38804
|
+
lines[i] = `${match[1]}x${match[3]}${match[4]}${match[5]}`;
|
|
38805
|
+
break;
|
|
38806
|
+
}
|
|
38807
|
+
return { content: lines.join("\n"), found, alreadyDone };
|
|
38808
|
+
}
|
|
38787
38809
|
|
|
38788
38810
|
// src/core/stats.ts
|
|
38789
38811
|
var DAY_MS = 24 * 60 * 60 * 1e3;
|
|
@@ -39273,77 +39295,6 @@ function computeReviewStreak(files, tilPath, now) {
|
|
|
39273
39295
|
|
|
39274
39296
|
// src/mcp/tools.ts
|
|
39275
39297
|
function registerTools(server, storage, metadata, tilPath) {
|
|
39276
|
-
server.registerTool(
|
|
39277
|
-
"vault_read_note",
|
|
39278
|
-
{
|
|
39279
|
-
title: "Read Note",
|
|
39280
|
-
description: "Vault\uC5D0\uC11C \uB178\uD2B8 \uB0B4\uC6A9\uC744 \uC77D\uC2B5\uB2C8\uB2E4",
|
|
39281
|
-
inputSchema: external_exports3.object({
|
|
39282
|
-
path: external_exports3.string().describe("\uB178\uD2B8 \uD30C\uC77C \uACBD\uB85C (\uC608: til/typescript/generics.md)")
|
|
39283
|
-
})
|
|
39284
|
-
},
|
|
39285
|
-
async ({ path: path6 }) => {
|
|
39286
|
-
const text = await storage.readFile(path6);
|
|
39287
|
-
if (text === null) {
|
|
39288
|
-
return { content: [{ type: "text", text: `Error: \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${path6}` }], isError: true };
|
|
39289
|
-
}
|
|
39290
|
-
return { content: [{ type: "text", text }] };
|
|
39291
|
-
}
|
|
39292
|
-
);
|
|
39293
|
-
server.registerTool(
|
|
39294
|
-
"vault_list_files",
|
|
39295
|
-
{
|
|
39296
|
-
title: "List Files",
|
|
39297
|
-
description: "Vault \uD3F4\uB354 \uB0B4 \uD30C\uC77C \uBAA9\uB85D\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4",
|
|
39298
|
-
inputSchema: external_exports3.object({
|
|
39299
|
-
folder: external_exports3.string().optional().describe("\uD3F4\uB354 \uACBD\uB85C (\uC0DD\uB7B5 \uC2DC \uB8E8\uD2B8)"),
|
|
39300
|
-
extension: external_exports3.string().optional().describe("\uD544\uD130\uB9C1\uD560 \uD655\uC7A5\uC790 (\uC608: md)")
|
|
39301
|
-
})
|
|
39302
|
-
},
|
|
39303
|
-
async ({ folder, extension }) => {
|
|
39304
|
-
const files = await storage.listFiles();
|
|
39305
|
-
const filtered = files.filter((f) => {
|
|
39306
|
-
if (folder && !f.path.startsWith(folder + "/") && f.path !== folder)
|
|
39307
|
-
return false;
|
|
39308
|
-
if (extension && f.extension !== extension)
|
|
39309
|
-
return false;
|
|
39310
|
-
return true;
|
|
39311
|
-
});
|
|
39312
|
-
const list = filtered.map((f) => f.path).join("\n");
|
|
39313
|
-
return { content: [{ type: "text", text: list || "(\uD30C\uC77C \uC5C6\uC74C)" }] };
|
|
39314
|
-
}
|
|
39315
|
-
);
|
|
39316
|
-
server.registerTool(
|
|
39317
|
-
"vault_search",
|
|
39318
|
-
{
|
|
39319
|
-
title: "Search Vault",
|
|
39320
|
-
description: "Vault \uC804\uCCB4\uC5D0\uC11C \uD14D\uC2A4\uD2B8\uB97C \uAC80\uC0C9\uD569\uB2C8\uB2E4",
|
|
39321
|
-
inputSchema: external_exports3.object({
|
|
39322
|
-
query: external_exports3.string().describe("\uAC80\uC0C9\uD560 \uD14D\uC2A4\uD2B8")
|
|
39323
|
-
})
|
|
39324
|
-
},
|
|
39325
|
-
async ({ query }) => {
|
|
39326
|
-
const files = (await storage.listFiles()).filter((f) => f.extension === "md");
|
|
39327
|
-
const results = [];
|
|
39328
|
-
const lowerQuery = query.toLowerCase();
|
|
39329
|
-
const BATCH_SIZE = 20;
|
|
39330
|
-
for (let i = 0; i < files.length && results.length < 50; i += BATCH_SIZE) {
|
|
39331
|
-
const batch = files.slice(i, i + BATCH_SIZE);
|
|
39332
|
-
const texts = await Promise.all(batch.map((f) => storage.readFile(f.path)));
|
|
39333
|
-
for (let j = 0; j < batch.length; j++) {
|
|
39334
|
-
const text2 = texts[j];
|
|
39335
|
-
if (text2 !== null && text2.toLowerCase().includes(lowerQuery)) {
|
|
39336
|
-
results.push(batch[j].path);
|
|
39337
|
-
}
|
|
39338
|
-
if (results.length >= 50)
|
|
39339
|
-
break;
|
|
39340
|
-
}
|
|
39341
|
-
}
|
|
39342
|
-
const text = results.length > 0 ? `${results.length}\uAC1C \uD30C\uC77C\uC5D0\uC11C \uBC1C\uACAC:
|
|
39343
|
-
${results.join("\n")}` : `"${query}"\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4`;
|
|
39344
|
-
return { content: [{ type: "text", text }] };
|
|
39345
|
-
}
|
|
39346
|
-
);
|
|
39347
39298
|
server.registerTool(
|
|
39348
39299
|
"vault_get_active_file",
|
|
39349
39300
|
{
|
|
@@ -39368,13 +39319,18 @@ ${text}` }] };
|
|
|
39368
39319
|
"til_list",
|
|
39369
39320
|
{
|
|
39370
39321
|
title: "List TILs",
|
|
39371
|
-
description: "TIL \uD30C\uC77C \uBAA9\uB85D\uACFC \uCE74\uD14C\uACE0\uB9AC\uBCC4 \uBD84\uB958\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4",
|
|
39322
|
+
description: "TIL \uD30C\uC77C \uBAA9\uB85D\uACFC \uCE74\uD14C\uACE0\uB9AC\uBCC4 \uBD84\uB958\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. search\uB85C \uD30C\uC77C\uBA85/\uACBD\uB85C \uD544\uD130\uB9C1 \uAC00\uB2A5.",
|
|
39372
39323
|
inputSchema: external_exports3.object({
|
|
39373
|
-
category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1")
|
|
39324
|
+
category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1"),
|
|
39325
|
+
search: external_exports3.string().optional().describe("\uD30C\uC77C \uACBD\uB85C/\uC774\uB984\uC5D0\uC11C \uAC80\uC0C9 (\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC)")
|
|
39374
39326
|
})
|
|
39375
39327
|
},
|
|
39376
|
-
async ({ category }) => {
|
|
39377
|
-
|
|
39328
|
+
async ({ category, search }) => {
|
|
39329
|
+
let filePaths = (await storage.listFiles()).filter((f) => f.path.startsWith(tilPath + "/") && f.extension === "md").map((f) => f.path);
|
|
39330
|
+
if (search) {
|
|
39331
|
+
const lowerSearch = search.toLowerCase();
|
|
39332
|
+
filePaths = filePaths.filter((p) => p.toLowerCase().includes(lowerSearch));
|
|
39333
|
+
}
|
|
39378
39334
|
const byCategory = groupFilesByCategory(filePaths, tilPath, category);
|
|
39379
39335
|
const totalCount = Object.values(byCategory).reduce((sum, paths) => sum + paths.length, 0);
|
|
39380
39336
|
const categories = Object.entries(byCategory).map(([cat, paths]) => ({
|
|
@@ -39587,13 +39543,14 @@ ${text}` }] };
|
|
|
39587
39543
|
"til_review_list",
|
|
39588
39544
|
{
|
|
39589
39545
|
title: "Review List",
|
|
39590
|
-
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.",
|
|
39591
39547
|
inputSchema: external_exports3.object({
|
|
39592
39548
|
category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1"),
|
|
39593
|
-
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)")
|
|
39594
39551
|
})
|
|
39595
39552
|
},
|
|
39596
|
-
async ({ category, limit }) => {
|
|
39553
|
+
async ({ category, limit, include_content }) => {
|
|
39597
39554
|
const allFiles = await storage.listFiles();
|
|
39598
39555
|
const srsFiles = [];
|
|
39599
39556
|
for (const f of allFiles) {
|
|
@@ -39624,6 +39581,15 @@ ${text}` }] };
|
|
|
39624
39581
|
const cards = filterDueCards(srsFiles, tilPath, void 0, effectiveLimit);
|
|
39625
39582
|
const stats = computeReviewStats(srsFiles, tilPath);
|
|
39626
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
|
+
}
|
|
39627
39593
|
const data = { cards, stats, remaining };
|
|
39628
39594
|
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
39629
39595
|
}
|
|
@@ -39674,6 +39640,87 @@ ${text}` }] };
|
|
|
39674
39640
|
};
|
|
39675
39641
|
}
|
|
39676
39642
|
);
|
|
39643
|
+
server.registerTool(
|
|
39644
|
+
"til_save_note",
|
|
39645
|
+
{
|
|
39646
|
+
title: "Save TIL Note",
|
|
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.",
|
|
39648
|
+
inputSchema: external_exports3.object({
|
|
39649
|
+
category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
|
|
39650
|
+
slug: external_exports3.string().describe("\uD30C\uC77C\uBA85 slug (\uC608: generics, hooks)"),
|
|
39651
|
+
title: external_exports3.string().describe("\uB178\uD2B8 \uC81C\uBAA9"),
|
|
39652
|
+
content: external_exports3.string().describe("\uB178\uD2B8 \uBCF8\uBB38 (\uB9C8\uD06C\uB2E4\uC6B4)"),
|
|
39653
|
+
tags: external_exports3.array(external_exports3.string()).optional().describe('\uD0DC\uADF8 \uBAA9\uB85D (\uC608: ["typescript", "basics"])'),
|
|
39654
|
+
date: external_exports3.string().optional().describe("\uC791\uC131\uC77C (YYYY-MM-DD, \uC0DD\uB7B5 \uC2DC \uC624\uB298)"),
|
|
39655
|
+
fmCategory: external_exports3.string().optional().describe("frontmatter category \uAC12 (\uC0DD\uB7B5 \uC2DC category \uD30C\uB77C\uBBF8\uD130 \uC0AC\uC6A9)"),
|
|
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)")
|
|
39658
|
+
})
|
|
39659
|
+
},
|
|
39660
|
+
async ({ category, slug, title, content, tags, date: date5, fmCategory, aliases, auto_check_backlog }) => {
|
|
39661
|
+
const path6 = `${tilPath}/${category}/${slug}.md`;
|
|
39662
|
+
const noteDate = date5 || (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
39663
|
+
const fmLines = ["---", `title: "${title.replace(/"/g, '\\"')}"`, `date: ${noteDate}`];
|
|
39664
|
+
const effectiveCategory = fmCategory ?? category;
|
|
39665
|
+
fmLines.push(`category: ${effectiveCategory}`);
|
|
39666
|
+
if (tags && tags.length > 0) {
|
|
39667
|
+
fmLines.push("tags:");
|
|
39668
|
+
for (const tag of tags) {
|
|
39669
|
+
fmLines.push(` - ${tag}`);
|
|
39670
|
+
}
|
|
39671
|
+
}
|
|
39672
|
+
if (aliases && aliases.length > 0) {
|
|
39673
|
+
fmLines.push(`aliases: [${aliases.map((a) => `"${a.replace(/"/g, '\\"')}"`).join(", ")}]`);
|
|
39674
|
+
}
|
|
39675
|
+
fmLines.push("---", "");
|
|
39676
|
+
const fullContent = fmLines.join("\n") + content;
|
|
39677
|
+
await storage.mkdir(`${tilPath}/${category}`);
|
|
39678
|
+
const existed = await storage.exists(path6);
|
|
39679
|
+
await storage.writeFile(path6, fullContent);
|
|
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
|
+
}
|
|
39694
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
39695
|
+
}
|
|
39696
|
+
);
|
|
39697
|
+
server.registerTool(
|
|
39698
|
+
"til_backlog_check",
|
|
39699
|
+
{
|
|
39700
|
+
title: "Check Backlog Item",
|
|
39701
|
+
description: "\uBC31\uB85C\uADF8 \uD56D\uBAA9\uC744 \uC644\uB8CC([x]) \uCC98\uB9AC\uD569\uB2C8\uB2E4",
|
|
39702
|
+
inputSchema: external_exports3.object({
|
|
39703
|
+
category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
|
|
39704
|
+
slug: external_exports3.string().describe("\uCCB4\uD06C\uD560 \uD56D\uBAA9\uC758 slug (\uC608: generics)")
|
|
39705
|
+
})
|
|
39706
|
+
},
|
|
39707
|
+
async ({ category, slug }) => {
|
|
39708
|
+
const backlogPath = `${tilPath}/${category}/backlog.md`;
|
|
39709
|
+
const content = await storage.readFile(backlogPath);
|
|
39710
|
+
if (content === null) {
|
|
39711
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: `\uBC31\uB85C\uADF8 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${backlogPath}` }) }], isError: true };
|
|
39712
|
+
}
|
|
39713
|
+
const result = checkBacklogItem(content, slug);
|
|
39714
|
+
if (!result.found) {
|
|
39715
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: `"${slug}" \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4`, backlogPath }) }], isError: true };
|
|
39716
|
+
}
|
|
39717
|
+
if (result.alreadyDone) {
|
|
39718
|
+
return { content: [{ type: "text", text: JSON.stringify({ alreadyDone: true, slug, backlogPath }) }] };
|
|
39719
|
+
}
|
|
39720
|
+
await storage.writeFile(backlogPath, result.content);
|
|
39721
|
+
return { content: [{ type: "text", text: JSON.stringify({ checked: true, slug, backlogPath }) }] };
|
|
39722
|
+
}
|
|
39723
|
+
);
|
|
39677
39724
|
}
|
|
39678
39725
|
|
|
39679
39726
|
// src/mcp/server.ts
|
|
@@ -39763,17 +39810,109 @@ var TILMcpServer = class {
|
|
|
39763
39810
|
}
|
|
39764
39811
|
};
|
|
39765
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
|
+
|
|
39766
39905
|
// vault-assets/skills/til/SKILL.md
|
|
39767
|
-
var SKILL_default = '---\nname: til\ndescription: "Today I Learned - \uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uACE0 \uB300\uD654\uD615\uC73C\uB85C \uD559\uC2B5\uD55C \uB4A4 TIL \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uC800\uC7A5"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# TIL Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 TIL \uC800\uC7A5.\n\n## MCP \uB3C4\uAD6C\n\n- `til_list`: \uAE30\uC874 TIL \uD655\uC778 (\uB3D9\uC77C/\uC720\uC0AC \uC8FC\uC81C \uAC10\uC9C0)\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545, \uB9C1\uD06C \uD6C4\uBCF4\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790\uAC00 \uBCF4\uB294 \uD30C\uC77C \uD655\uC778\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. `til_get_context`\uB85C \uAE30\uC874 TIL \uD655\uC778. MCP \uBD88\uAC00 \uC2DC `til_list` \uD3F4\uBC31\n - \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD559\uC2B5 \uC2DC `til_backlog_status`(category) \u2192 `sections[].items[].sourceUrls` \uCC38\uC870\n - URL 1\uAC1C: `WebFetch`\uB85C \uC9C1\uC811 \uD328\uCE58\n - URL 2\uAC1C \uC774\uC0C1: `til-fetcher` subagent **1\uAC1C**\uC5D0 \uBAA8\uB4E0 URL \uC804\uB2EC\
|
|
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';
|
|
39768
39907
|
|
|
39769
39908
|
// vault-assets/skills/backlog/SKILL.md
|
|
39770
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';
|
|
39771
39910
|
|
|
39772
39911
|
// vault-assets/skills/research/SKILL.md
|
|
39773
|
-
var SKILL_default3 = '---\nname: research\ndescription: "\uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uC5EC \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uAC1C\uB150/\uC6A9\uC5B4\uB97C \uD30C\uC545\uD558\uACE0, \uBC31\uB85C\uADF8\uB85C \uC815\uB9AC"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Research Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uAC1C\uB150/\uC758\uC874 \uAD00\uACC4 \uD30C\uC545 \u2192 \uBC31\uB85C\uADF8 \uD30C\uC77C \uC800\uC7A5.\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC8FC\uC81C \uC870\uC0AC, \uD544\uC694 \uAC1C\uB150\xB7\uC6A9\uC5B4\xB7\uC120\uD589 \uC9C0\uC2DD \uD30C\uC545\
|
|
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';
|
|
39774
39913
|
|
|
39775
39914
|
// vault-assets/skills/save/SKILL.md
|
|
39776
|
-
var SKILL_default4 = '---\nname: save\ndescription: "\uD559\uC2B5 \uB0B4\uC6A9\uC744 TIL \uD30C\uC77C\uB85C \uC800\uC7A5\uD558\uACE0 Daily \uB178\uD2B8, MOC, \uBC31\uB85C\uADF8\uB97C \uC77C\uAD04 \uC5C5\uB370\uC774\uD2B8"\nargument-hint: "[\uC8FC\uC81C] [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Save Skill\n\n\uD559\uC2B5 \uB300\uD654 \u2192 TIL \uD30C\uC77C \uC800\uC7A5 \u2192 Daily/MOC/\uBC31\uB85C\uADF8 \uC5C5\uB370\uC774\uD2B8 \u2192 \uBB38\uC11C \uB9AC\uBDF0 \u2192 \uCEE4\uBC0B.\n\n## MCP \uB3C4\uAD6C\n\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545\n- `til_list`: \uAE30\uC874 TIL \uC911\uBCF5 \uD655\uC778\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790 \uD30C\uC77C \uCEE8\uD14D\uC2A4\uD2B8\n\n## Step 1: \uCEE8\uD14D\uC2A4\uD2B8 \uD655\uC778\n\
|
|
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';
|
|
39777
39916
|
|
|
39778
39917
|
// vault-assets/skills/migrate-links/SKILL.md
|
|
39779
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';
|
|
@@ -39788,10 +39927,10 @@ var SKILL_default7 = '---\nname: setup-pages\ndescription: "(deprecated) /omt-se
|
|
|
39788
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';
|
|
39789
39928
|
|
|
39790
39929
|
// vault-assets/skills/til-review/SKILL.md
|
|
39791
|
-
var SKILL_default9 = '---\nname: til-review\ndescription: "SRS \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158 (\uAC04\uACA9 \uBC18\uBCF5 \uD559\uC2B5)"\nargument-hint: "[\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Review Skill\n\nSRS(\uAC04\uACA9 \uBC18\uBCF5) \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158. SM-2 \uC54C\uACE0\uB9AC\uC998\uC73C\uB85C \uBCF5\uC2B5 \uC77C\uC815\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n\n## MCP \uB3C4\uAD6C\n\n- `til_review_list`: \uC624\uB298 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update`: \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D (grade 0-5) \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n
|
|
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';
|
|
39792
39931
|
|
|
39793
39932
|
// vault-assets/claude-md-section.md
|
|
39794
|
-
var claude_md_section_default = "## \uD559\uC2B5 \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n1. `/research <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uBC31\uB85C\uADF8 \uC0DD\uC131\n2. `/backlog [\uCE74\uD14C\uACE0\uB9AC]` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589 \uD655\uC778\n3. `/til <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 \uC800\uC7A5\n4. `/save` \u2014 TIL \uC800\uC7A5 (Daily/MOC/\uBC31\uB85C\uADF8 \uC790\uB3D9 \uC5C5\uB370\uC774\uD2B8)\n5. `/til-review [\uCE74\uD14C\uACE0\uB9AC]` \u2014 SRS \uAE30\uBC18 \uAC04\uACA9 \uBC18\uBCF5 \uBCF5\uC2B5\n\n## MCP \uB3C4\uAD6C\n\n- `
|
|
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";
|
|
39795
39934
|
|
|
39796
39935
|
// vault-assets/agents/til-fetcher.md
|
|
39797
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';
|
|
@@ -41130,13 +41269,14 @@ function generateProfileHtml(config2, summaryCardsHtml, heatmapHtml, recentTilsH
|
|
|
41130
41269
|
// src/cli/index.ts
|
|
41131
41270
|
var path5 = __toESM(require("path"));
|
|
41132
41271
|
var fs4 = __toESM(require("fs"));
|
|
41133
|
-
var VERSION = true ? "0.
|
|
41272
|
+
var VERSION = true ? "0.13.0" : "0.0.0";
|
|
41134
41273
|
function printUsage() {
|
|
41135
41274
|
console.log(`oh-my-til v${VERSION}
|
|
41136
41275
|
|
|
41137
41276
|
Usage:
|
|
41138
41277
|
oh-my-til init [<path>] [options] Install skills, rules, and CLAUDE.md
|
|
41139
|
-
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)
|
|
41140
41280
|
oh-my-til deploy [<path>] [options] Generate static site from TIL files
|
|
41141
41281
|
oh-my-til version Print version
|
|
41142
41282
|
|
|
@@ -41147,6 +41287,9 @@ Options (serve):
|
|
|
41147
41287
|
--til-path <path> TIL folder path (default: til)
|
|
41148
41288
|
--port <port> MCP server port (default: 22360)
|
|
41149
41289
|
|
|
41290
|
+
Options (mcp):
|
|
41291
|
+
--til-path <path> TIL folder path (default: til)
|
|
41292
|
+
|
|
41150
41293
|
Options (deploy):
|
|
41151
41294
|
--til-path <path> TIL folder path (default: til)
|
|
41152
41295
|
--out <path> Output directory (default: _site)
|
|
@@ -41224,6 +41367,24 @@ To start MCP server: oh-my-til serve ${basePath}`);
|
|
|
41224
41367
|
} else {
|
|
41225
41368
|
console.log("\nUsing Obsidian? Run init inside your vault to auto-install the plugin.");
|
|
41226
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);
|
|
41227
41388
|
} else if (command === "serve") {
|
|
41228
41389
|
const storage = new FsStorage(basePath);
|
|
41229
41390
|
const metadata = new FsMetadata(basePath);
|
package/main.js
CHANGED
|
@@ -21543,6 +21543,29 @@ function parseBacklogSections(content) {
|
|
|
21543
21543
|
}
|
|
21544
21544
|
return sections.filter((s) => s.items.length > 0);
|
|
21545
21545
|
}
|
|
21546
|
+
function checkBacklogItem(content, slug) {
|
|
21547
|
+
var _a4;
|
|
21548
|
+
const lines = content.split("\n");
|
|
21549
|
+
let found = false;
|
|
21550
|
+
let alreadyDone = false;
|
|
21551
|
+
for (let i = 0; i < lines.length; i++) {
|
|
21552
|
+
const match = lines[i].match(/^(-\s+\[)([ xX])(\]\s+\[[^\[\]]*\]\()([^()]+)(\).*)/);
|
|
21553
|
+
if (!match)
|
|
21554
|
+
continue;
|
|
21555
|
+
const rawPath = match[4].trim();
|
|
21556
|
+
const pathSlug = (_a4 = rawPath.replace(/\.md$/, "").split("/").pop()) != null ? _a4 : "";
|
|
21557
|
+
if (pathSlug !== slug)
|
|
21558
|
+
continue;
|
|
21559
|
+
found = true;
|
|
21560
|
+
if (match[2] !== " ") {
|
|
21561
|
+
alreadyDone = true;
|
|
21562
|
+
break;
|
|
21563
|
+
}
|
|
21564
|
+
lines[i] = `${match[1]}x${match[3]}${match[4]}${match[5]}`;
|
|
21565
|
+
break;
|
|
21566
|
+
}
|
|
21567
|
+
return { content: lines.join("\n"), found, alreadyDone };
|
|
21568
|
+
}
|
|
21546
21569
|
function extractTopicFromPath(filePath, tilPath) {
|
|
21547
21570
|
const prefix = tilPath.endsWith("/") ? tilPath : tilPath + "/";
|
|
21548
21571
|
if (!filePath.startsWith(prefix))
|
|
@@ -47454,77 +47477,6 @@ var http = __toESM(require("http"));
|
|
|
47454
47477
|
|
|
47455
47478
|
// src/mcp/tools.ts
|
|
47456
47479
|
function registerTools(server, storage, metadata, tilPath) {
|
|
47457
|
-
server.registerTool(
|
|
47458
|
-
"vault_read_note",
|
|
47459
|
-
{
|
|
47460
|
-
title: "Read Note",
|
|
47461
|
-
description: "Vault\uC5D0\uC11C \uB178\uD2B8 \uB0B4\uC6A9\uC744 \uC77D\uC2B5\uB2C8\uB2E4",
|
|
47462
|
-
inputSchema: external_exports3.object({
|
|
47463
|
-
path: external_exports3.string().describe("\uB178\uD2B8 \uD30C\uC77C \uACBD\uB85C (\uC608: til/typescript/generics.md)")
|
|
47464
|
-
})
|
|
47465
|
-
},
|
|
47466
|
-
async ({ path: path3 }) => {
|
|
47467
|
-
const text = await storage.readFile(path3);
|
|
47468
|
-
if (text === null) {
|
|
47469
|
-
return { content: [{ type: "text", text: `Error: \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${path3}` }], isError: true };
|
|
47470
|
-
}
|
|
47471
|
-
return { content: [{ type: "text", text }] };
|
|
47472
|
-
}
|
|
47473
|
-
);
|
|
47474
|
-
server.registerTool(
|
|
47475
|
-
"vault_list_files",
|
|
47476
|
-
{
|
|
47477
|
-
title: "List Files",
|
|
47478
|
-
description: "Vault \uD3F4\uB354 \uB0B4 \uD30C\uC77C \uBAA9\uB85D\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4",
|
|
47479
|
-
inputSchema: external_exports3.object({
|
|
47480
|
-
folder: external_exports3.string().optional().describe("\uD3F4\uB354 \uACBD\uB85C (\uC0DD\uB7B5 \uC2DC \uB8E8\uD2B8)"),
|
|
47481
|
-
extension: external_exports3.string().optional().describe("\uD544\uD130\uB9C1\uD560 \uD655\uC7A5\uC790 (\uC608: md)")
|
|
47482
|
-
})
|
|
47483
|
-
},
|
|
47484
|
-
async ({ folder, extension }) => {
|
|
47485
|
-
const files = await storage.listFiles();
|
|
47486
|
-
const filtered = files.filter((f) => {
|
|
47487
|
-
if (folder && !f.path.startsWith(folder + "/") && f.path !== folder)
|
|
47488
|
-
return false;
|
|
47489
|
-
if (extension && f.extension !== extension)
|
|
47490
|
-
return false;
|
|
47491
|
-
return true;
|
|
47492
|
-
});
|
|
47493
|
-
const list = filtered.map((f) => f.path).join("\n");
|
|
47494
|
-
return { content: [{ type: "text", text: list || "(\uD30C\uC77C \uC5C6\uC74C)" }] };
|
|
47495
|
-
}
|
|
47496
|
-
);
|
|
47497
|
-
server.registerTool(
|
|
47498
|
-
"vault_search",
|
|
47499
|
-
{
|
|
47500
|
-
title: "Search Vault",
|
|
47501
|
-
description: "Vault \uC804\uCCB4\uC5D0\uC11C \uD14D\uC2A4\uD2B8\uB97C \uAC80\uC0C9\uD569\uB2C8\uB2E4",
|
|
47502
|
-
inputSchema: external_exports3.object({
|
|
47503
|
-
query: external_exports3.string().describe("\uAC80\uC0C9\uD560 \uD14D\uC2A4\uD2B8")
|
|
47504
|
-
})
|
|
47505
|
-
},
|
|
47506
|
-
async ({ query }) => {
|
|
47507
|
-
const files = (await storage.listFiles()).filter((f) => f.extension === "md");
|
|
47508
|
-
const results = [];
|
|
47509
|
-
const lowerQuery = query.toLowerCase();
|
|
47510
|
-
const BATCH_SIZE = 20;
|
|
47511
|
-
for (let i = 0; i < files.length && results.length < 50; i += BATCH_SIZE) {
|
|
47512
|
-
const batch = files.slice(i, i + BATCH_SIZE);
|
|
47513
|
-
const texts = await Promise.all(batch.map((f) => storage.readFile(f.path)));
|
|
47514
|
-
for (let j = 0; j < batch.length; j++) {
|
|
47515
|
-
const text2 = texts[j];
|
|
47516
|
-
if (text2 !== null && text2.toLowerCase().includes(lowerQuery)) {
|
|
47517
|
-
results.push(batch[j].path);
|
|
47518
|
-
}
|
|
47519
|
-
if (results.length >= 50)
|
|
47520
|
-
break;
|
|
47521
|
-
}
|
|
47522
|
-
}
|
|
47523
|
-
const text = results.length > 0 ? `${results.length}\uAC1C \uD30C\uC77C\uC5D0\uC11C \uBC1C\uACAC:
|
|
47524
|
-
${results.join("\n")}` : `"${query}"\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4`;
|
|
47525
|
-
return { content: [{ type: "text", text }] };
|
|
47526
|
-
}
|
|
47527
|
-
);
|
|
47528
47480
|
server.registerTool(
|
|
47529
47481
|
"vault_get_active_file",
|
|
47530
47482
|
{
|
|
@@ -47549,13 +47501,18 @@ ${text}` }] };
|
|
|
47549
47501
|
"til_list",
|
|
47550
47502
|
{
|
|
47551
47503
|
title: "List TILs",
|
|
47552
|
-
description: "TIL \uD30C\uC77C \uBAA9\uB85D\uACFC \uCE74\uD14C\uACE0\uB9AC\uBCC4 \uBD84\uB958\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4",
|
|
47504
|
+
description: "TIL \uD30C\uC77C \uBAA9\uB85D\uACFC \uCE74\uD14C\uACE0\uB9AC\uBCC4 \uBD84\uB958\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. search\uB85C \uD30C\uC77C\uBA85/\uACBD\uB85C \uD544\uD130\uB9C1 \uAC00\uB2A5.",
|
|
47553
47505
|
inputSchema: external_exports3.object({
|
|
47554
|
-
category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1")
|
|
47506
|
+
category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1"),
|
|
47507
|
+
search: external_exports3.string().optional().describe("\uD30C\uC77C \uACBD\uB85C/\uC774\uB984\uC5D0\uC11C \uAC80\uC0C9 (\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC)")
|
|
47555
47508
|
})
|
|
47556
47509
|
},
|
|
47557
|
-
async ({ category }) => {
|
|
47558
|
-
|
|
47510
|
+
async ({ category, search }) => {
|
|
47511
|
+
let filePaths = (await storage.listFiles()).filter((f) => f.path.startsWith(tilPath + "/") && f.extension === "md").map((f) => f.path);
|
|
47512
|
+
if (search) {
|
|
47513
|
+
const lowerSearch = search.toLowerCase();
|
|
47514
|
+
filePaths = filePaths.filter((p) => p.toLowerCase().includes(lowerSearch));
|
|
47515
|
+
}
|
|
47559
47516
|
const byCategory = groupFilesByCategory(filePaths, tilPath, category);
|
|
47560
47517
|
const totalCount = Object.values(byCategory).reduce((sum, paths) => sum + paths.length, 0);
|
|
47561
47518
|
const categories = Object.entries(byCategory).map(([cat, paths]) => ({
|
|
@@ -47771,13 +47728,14 @@ ${text}` }] };
|
|
|
47771
47728
|
"til_review_list",
|
|
47772
47729
|
{
|
|
47773
47730
|
title: "Review List",
|
|
47774
|
-
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.",
|
|
47775
47732
|
inputSchema: external_exports3.object({
|
|
47776
47733
|
category: external_exports3.string().optional().describe("\uD2B9\uC815 \uCE74\uD14C\uACE0\uB9AC\uB9CC \uD544\uD130\uB9C1"),
|
|
47777
|
-
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)")
|
|
47778
47736
|
})
|
|
47779
47737
|
},
|
|
47780
|
-
async ({ category, limit }) => {
|
|
47738
|
+
async ({ category, limit, include_content }) => {
|
|
47781
47739
|
var _a4, _b;
|
|
47782
47740
|
const allFiles = await storage.listFiles();
|
|
47783
47741
|
const srsFiles = [];
|
|
@@ -47809,6 +47767,18 @@ ${text}` }] };
|
|
|
47809
47767
|
const cards = filterDueCards(srsFiles, tilPath, void 0, effectiveLimit);
|
|
47810
47768
|
const stats = computeReviewStats(srsFiles, tilPath);
|
|
47811
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
|
+
}
|
|
47812
47782
|
const data = { cards, stats, remaining };
|
|
47813
47783
|
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
47814
47784
|
}
|
|
@@ -47860,6 +47830,87 @@ ${text}` }] };
|
|
|
47860
47830
|
};
|
|
47861
47831
|
}
|
|
47862
47832
|
);
|
|
47833
|
+
server.registerTool(
|
|
47834
|
+
"til_save_note",
|
|
47835
|
+
{
|
|
47836
|
+
title: "Save TIL Note",
|
|
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.",
|
|
47838
|
+
inputSchema: external_exports3.object({
|
|
47839
|
+
category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
|
|
47840
|
+
slug: external_exports3.string().describe("\uD30C\uC77C\uBA85 slug (\uC608: generics, hooks)"),
|
|
47841
|
+
title: external_exports3.string().describe("\uB178\uD2B8 \uC81C\uBAA9"),
|
|
47842
|
+
content: external_exports3.string().describe("\uB178\uD2B8 \uBCF8\uBB38 (\uB9C8\uD06C\uB2E4\uC6B4)"),
|
|
47843
|
+
tags: external_exports3.array(external_exports3.string()).optional().describe('\uD0DC\uADF8 \uBAA9\uB85D (\uC608: ["typescript", "basics"])'),
|
|
47844
|
+
date: external_exports3.string().optional().describe("\uC791\uC131\uC77C (YYYY-MM-DD, \uC0DD\uB7B5 \uC2DC \uC624\uB298)"),
|
|
47845
|
+
fmCategory: external_exports3.string().optional().describe("frontmatter category \uAC12 (\uC0DD\uB7B5 \uC2DC category \uD30C\uB77C\uBBF8\uD130 \uC0AC\uC6A9)"),
|
|
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)")
|
|
47848
|
+
})
|
|
47849
|
+
},
|
|
47850
|
+
async ({ category, slug, title, content, tags, date: date7, fmCategory, aliases, auto_check_backlog }) => {
|
|
47851
|
+
const path3 = `${tilPath}/${category}/${slug}.md`;
|
|
47852
|
+
const noteDate = date7 || (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
47853
|
+
const fmLines = ["---", `title: "${title.replace(/"/g, '\\"')}"`, `date: ${noteDate}`];
|
|
47854
|
+
const effectiveCategory = fmCategory != null ? fmCategory : category;
|
|
47855
|
+
fmLines.push(`category: ${effectiveCategory}`);
|
|
47856
|
+
if (tags && tags.length > 0) {
|
|
47857
|
+
fmLines.push("tags:");
|
|
47858
|
+
for (const tag of tags) {
|
|
47859
|
+
fmLines.push(` - ${tag}`);
|
|
47860
|
+
}
|
|
47861
|
+
}
|
|
47862
|
+
if (aliases && aliases.length > 0) {
|
|
47863
|
+
fmLines.push(`aliases: [${aliases.map((a) => `"${a.replace(/"/g, '\\"')}"`).join(", ")}]`);
|
|
47864
|
+
}
|
|
47865
|
+
fmLines.push("---", "");
|
|
47866
|
+
const fullContent = fmLines.join("\n") + content;
|
|
47867
|
+
await storage.mkdir(`${tilPath}/${category}`);
|
|
47868
|
+
const existed = await storage.exists(path3);
|
|
47869
|
+
await storage.writeFile(path3, fullContent);
|
|
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
|
+
}
|
|
47884
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
47885
|
+
}
|
|
47886
|
+
);
|
|
47887
|
+
server.registerTool(
|
|
47888
|
+
"til_backlog_check",
|
|
47889
|
+
{
|
|
47890
|
+
title: "Check Backlog Item",
|
|
47891
|
+
description: "\uBC31\uB85C\uADF8 \uD56D\uBAA9\uC744 \uC644\uB8CC([x]) \uCC98\uB9AC\uD569\uB2C8\uB2E4",
|
|
47892
|
+
inputSchema: external_exports3.object({
|
|
47893
|
+
category: external_exports3.string().describe("\uCE74\uD14C\uACE0\uB9AC (\uC608: typescript, react)"),
|
|
47894
|
+
slug: external_exports3.string().describe("\uCCB4\uD06C\uD560 \uD56D\uBAA9\uC758 slug (\uC608: generics)")
|
|
47895
|
+
})
|
|
47896
|
+
},
|
|
47897
|
+
async ({ category, slug }) => {
|
|
47898
|
+
const backlogPath = `${tilPath}/${category}/backlog.md`;
|
|
47899
|
+
const content = await storage.readFile(backlogPath);
|
|
47900
|
+
if (content === null) {
|
|
47901
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: `\uBC31\uB85C\uADF8 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${backlogPath}` }) }], isError: true };
|
|
47902
|
+
}
|
|
47903
|
+
const result = checkBacklogItem(content, slug);
|
|
47904
|
+
if (!result.found) {
|
|
47905
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: `"${slug}" \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4`, backlogPath }) }], isError: true };
|
|
47906
|
+
}
|
|
47907
|
+
if (result.alreadyDone) {
|
|
47908
|
+
return { content: [{ type: "text", text: JSON.stringify({ alreadyDone: true, slug, backlogPath }) }] };
|
|
47909
|
+
}
|
|
47910
|
+
await storage.writeFile(backlogPath, result.content);
|
|
47911
|
+
return { content: [{ type: "text", text: JSON.stringify({ checked: true, slug, backlogPath }) }] };
|
|
47912
|
+
}
|
|
47913
|
+
);
|
|
47863
47914
|
}
|
|
47864
47915
|
|
|
47865
47916
|
// src/mcp/server.ts
|
|
@@ -47952,16 +48003,16 @@ var TILMcpServer = class {
|
|
|
47952
48003
|
};
|
|
47953
48004
|
|
|
47954
48005
|
// vault-assets/skills/til/SKILL.md
|
|
47955
|
-
var SKILL_default = '---\nname: til\ndescription: "Today I Learned - \uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uACE0 \uB300\uD654\uD615\uC73C\uB85C \uD559\uC2B5\uD55C \uB4A4 TIL \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uC800\uC7A5"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# TIL Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 TIL \uC800\uC7A5.\n\n## MCP \uB3C4\uAD6C\n\n- `til_list`: \uAE30\uC874 TIL \uD655\uC778 (\uB3D9\uC77C/\uC720\uC0AC \uC8FC\uC81C \uAC10\uC9C0)\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545, \uB9C1\uD06C \uD6C4\uBCF4\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790\uAC00 \uBCF4\uB294 \uD30C\uC77C \uD655\uC778\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. `til_get_context`\uB85C \uAE30\uC874 TIL \uD655\uC778. MCP \uBD88\uAC00 \uC2DC `til_list` \uD3F4\uBC31\n - \uBC31\uB85C\uADF8 \uD56D\uBAA9 \uD559\uC2B5 \uC2DC `til_backlog_status`(category) \u2192 `sections[].items[].sourceUrls` \uCC38\uC870\n - URL 1\uAC1C: `WebFetch`\uB85C \uC9C1\uC811 \uD328\uCE58\n - URL 2\uAC1C \uC774\uC0C1: `til-fetcher` subagent **1\uAC1C**\uC5D0 \uBAA8\uB4E0 URL \uC804\uB2EC\
|
|
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';
|
|
47956
48007
|
|
|
47957
48008
|
// vault-assets/skills/backlog/SKILL.md
|
|
47958
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';
|
|
47959
48010
|
|
|
47960
48011
|
// vault-assets/skills/research/SKILL.md
|
|
47961
|
-
var SKILL_default3 = '---\nname: research\ndescription: "\uC8FC\uC81C\uB97C \uB9AC\uC11C\uCE58\uD558\uC5EC \uD559\uC2B5\uC5D0 \uD544\uC694\uD55C \uAC1C\uB150/\uC6A9\uC5B4\uB97C \uD30C\uC545\uD558\uACE0, \uBC31\uB85C\uADF8\uB85C \uC815\uB9AC"\nargument-hint: "<\uC8FC\uC81C> [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Research Skill\n\n\uC8FC\uC81C \uB9AC\uC11C\uCE58 \u2192 \uAC1C\uB150/\uC758\uC874 \uAD00\uACC4 \uD30C\uC545 \u2192 \uBC31\uB85C\uADF8 \uD30C\uC77C \uC800\uC7A5.\n\n## Phase 1: \uC8FC\uC81C \uB9AC\uC11C\uCE58\n\n1. \uC6F9 \uAC80\uC0C9\uC73C\uB85C \uC8FC\uC81C \uC870\uC0AC, \uD544\uC694 \uAC1C\uB150\xB7\uC6A9\uC5B4\xB7\uC120\uD589 \uC9C0\uC2DD \uD30C\uC545\
|
|
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';
|
|
47962
48013
|
|
|
47963
48014
|
// vault-assets/skills/save/SKILL.md
|
|
47964
|
-
var SKILL_default4 = '---\nname: save\ndescription: "\uD559\uC2B5 \uB0B4\uC6A9\uC744 TIL \uD30C\uC77C\uB85C \uC800\uC7A5\uD558\uACE0 Daily \uB178\uD2B8, MOC, \uBC31\uB85C\uADF8\uB97C \uC77C\uAD04 \uC5C5\uB370\uC774\uD2B8"\nargument-hint: "[\uC8FC\uC81C] [\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Save Skill\n\n\uD559\uC2B5 \uB300\uD654 \u2192 TIL \uD30C\uC77C \uC800\uC7A5 \u2192 Daily/MOC/\uBC31\uB85C\uADF8 \uC5C5\uB370\uC774\uD2B8 \u2192 \uBB38\uC11C \uB9AC\uBDF0 \u2192 \uCEE4\uBC0B.\n\n## MCP \uB3C4\uAD6C\n\n- `til_get_context`: \uAD00\uB828 TIL\xB7\uBC31\uB85C\uADF8 \uD30C\uC545\n- `til_list`: \uAE30\uC874 TIL \uC911\uBCF5 \uD655\uC778\n- `vault_get_active_file`: \uC0AC\uC6A9\uC790 \uD30C\uC77C \uCEE8\uD14D\uC2A4\uD2B8\n\n## Step 1: \uCEE8\uD14D\uC2A4\uD2B8 \uD655\uC778\n\
|
|
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';
|
|
47965
48016
|
|
|
47966
48017
|
// vault-assets/skills/migrate-links/SKILL.md
|
|
47967
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';
|
|
@@ -47976,10 +48027,10 @@ var SKILL_default7 = '---\nname: setup-pages\ndescription: "(deprecated) /omt-se
|
|
|
47976
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';
|
|
47977
48028
|
|
|
47978
48029
|
// vault-assets/skills/til-review/SKILL.md
|
|
47979
|
-
var SKILL_default9 = '---\nname: til-review\ndescription: "SRS \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158 (\uAC04\uACA9 \uBC18\uBCF5 \uD559\uC2B5)"\nargument-hint: "[\uCE74\uD14C\uACE0\uB9AC]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Review Skill\n\nSRS(\uAC04\uACA9 \uBC18\uBCF5) \uAE30\uBC18 TIL \uBCF5\uC2B5 \uC138\uC158. SM-2 \uC54C\uACE0\uB9AC\uC998\uC73C\uB85C \uBCF5\uC2B5 \uC77C\uC815\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n\n## MCP \uB3C4\uAD6C\n\n- `til_review_list`: \uC624\uB298 \uBCF5\uC2B5 \uB300\uC0C1 \uCE74\uB4DC \uBAA9\uB85D + \uD1B5\uACC4\n- `til_review_update`: \uBCF5\uC2B5 \uACB0\uACFC \uAE30\uB85D (grade 0-5) \uB610\uB294 \uBCF5\uC2B5 \uD574\uC81C\n
|
|
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';
|
|
47980
48031
|
|
|
47981
48032
|
// vault-assets/claude-md-section.md
|
|
47982
|
-
var claude_md_section_default = "## \uD559\uC2B5 \uC6CC\uD06C\uD50C\uB85C\uC6B0\n\n1. `/research <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uBC31\uB85C\uADF8 \uC0DD\uC131\n2. `/backlog [\uCE74\uD14C\uACE0\uB9AC]` \u2014 \uBC31\uB85C\uADF8 \uC9C4\uD589 \uD655\uC778\n3. `/til <\uC8FC\uC81C>` \u2014 \uB9AC\uC11C\uCE58 \u2192 \uB300\uD654\uD615 \uD559\uC2B5 \u2192 \uC800\uC7A5\n4. `/save` \u2014 TIL \uC800\uC7A5 (Daily/MOC/\uBC31\uB85C\uADF8 \uC790\uB3D9 \uC5C5\uB370\uC774\uD2B8)\n5. `/til-review [\uCE74\uD14C\uACE0\uB9AC]` \u2014 SRS \uAE30\uBC18 \uAC04\uACA9 \uBC18\uBCF5 \uBCF5\uC2B5\n\n## MCP \uB3C4\uAD6C\n\n- `
|
|
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";
|
|
47983
48034
|
|
|
47984
48035
|
// vault-assets/agents/til-fetcher.md
|
|
47985
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