oh-my-til 1.1.0 → 1.1.1
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/dist/cli.js +111 -28
- package/main.js +1778 -34560
- package/manifest.json +1 -1
- package/package.json +3 -2
package/dist/cli.js
CHANGED
|
@@ -14219,10 +14219,13 @@ var FsStorage = class {
|
|
|
14219
14219
|
return this.basePath;
|
|
14220
14220
|
}
|
|
14221
14221
|
};
|
|
14222
|
+
var LINK_SCAN_TTL_MS = 5e3;
|
|
14222
14223
|
var FsMetadata = class {
|
|
14223
|
-
constructor(basePath) {
|
|
14224
|
+
constructor(basePath, storage) {
|
|
14224
14225
|
this.basePath = basePath;
|
|
14226
|
+
this.linkScanCache = null;
|
|
14225
14227
|
this.resolvedBase = path.resolve(basePath);
|
|
14228
|
+
this.storage = storage ?? new FsStorage(basePath);
|
|
14226
14229
|
}
|
|
14227
14230
|
async getFileMetadata(filePath) {
|
|
14228
14231
|
let content;
|
|
@@ -14239,14 +14242,114 @@ var FsMetadata = class {
|
|
|
14239
14242
|
};
|
|
14240
14243
|
}
|
|
14241
14244
|
async getResolvedLinks() {
|
|
14242
|
-
|
|
14245
|
+
const cached2 = await this.getCachedLinks();
|
|
14246
|
+
return cached2.resolved;
|
|
14243
14247
|
}
|
|
14244
14248
|
async getUnresolvedLinks() {
|
|
14245
|
-
|
|
14249
|
+
const cached2 = await this.getCachedLinks();
|
|
14250
|
+
return cached2.unresolved;
|
|
14251
|
+
}
|
|
14252
|
+
async getCachedLinks() {
|
|
14253
|
+
if (this.linkScanCache && Date.now() < this.linkScanCache.expiresAt) {
|
|
14254
|
+
return this.linkScanCache;
|
|
14255
|
+
}
|
|
14256
|
+
const result = await this.scanLinks();
|
|
14257
|
+
this.linkScanCache = { ...result, expiresAt: Date.now() + LINK_SCAN_TTL_MS };
|
|
14258
|
+
return this.linkScanCache;
|
|
14246
14259
|
}
|
|
14247
14260
|
async getActiveFilePath() {
|
|
14248
14261
|
return null;
|
|
14249
14262
|
}
|
|
14263
|
+
/**
|
|
14264
|
+
* Scan all md files to build resolved/unresolved link maps.
|
|
14265
|
+
* resolved: source → { target → count } (target file exists)
|
|
14266
|
+
* unresolved: source → { linkName → count } (target file does not exist)
|
|
14267
|
+
*/
|
|
14268
|
+
async scanLinks() {
|
|
14269
|
+
const files = await this.storage.listFiles();
|
|
14270
|
+
const mdFiles = files.filter((f) => f.extension === "md");
|
|
14271
|
+
const existingPaths = new Set(files.map((f) => f.path));
|
|
14272
|
+
const existingPathsNoExt = /* @__PURE__ */ new Set();
|
|
14273
|
+
for (const f of files) {
|
|
14274
|
+
if (f.extension === "md") {
|
|
14275
|
+
existingPathsNoExt.add(f.path.replace(/\.md$/, ""));
|
|
14276
|
+
}
|
|
14277
|
+
}
|
|
14278
|
+
const resolved = {};
|
|
14279
|
+
const unresolved = {};
|
|
14280
|
+
for (const file2 of mdFiles) {
|
|
14281
|
+
const content = await this.storage.readFile(file2.path);
|
|
14282
|
+
if (content === null)
|
|
14283
|
+
continue;
|
|
14284
|
+
const links = this.extractLinks(content);
|
|
14285
|
+
if (links.length === 0)
|
|
14286
|
+
continue;
|
|
14287
|
+
const sourceDir = file2.path.substring(0, file2.path.lastIndexOf("/"));
|
|
14288
|
+
for (const link of links) {
|
|
14289
|
+
if (link.startsWith("http://") || link.startsWith("https://"))
|
|
14290
|
+
continue;
|
|
14291
|
+
const targetCandidates = this.resolveLinkTarget(link, sourceDir);
|
|
14292
|
+
let resolvedTarget = null;
|
|
14293
|
+
for (const candidate of targetCandidates) {
|
|
14294
|
+
if (existingPaths.has(candidate)) {
|
|
14295
|
+
resolvedTarget = candidate;
|
|
14296
|
+
break;
|
|
14297
|
+
}
|
|
14298
|
+
}
|
|
14299
|
+
if (resolvedTarget) {
|
|
14300
|
+
if (!resolved[file2.path])
|
|
14301
|
+
resolved[file2.path] = {};
|
|
14302
|
+
resolved[file2.path][resolvedTarget] = (resolved[file2.path][resolvedTarget] ?? 0) + 1;
|
|
14303
|
+
} else {
|
|
14304
|
+
const linkName = link.replace(/\.md$/, "").split("/").pop();
|
|
14305
|
+
if (!unresolved[file2.path])
|
|
14306
|
+
unresolved[file2.path] = {};
|
|
14307
|
+
unresolved[file2.path][linkName] = (unresolved[file2.path][linkName] ?? 0) + 1;
|
|
14308
|
+
}
|
|
14309
|
+
}
|
|
14310
|
+
}
|
|
14311
|
+
return { resolved, unresolved };
|
|
14312
|
+
}
|
|
14313
|
+
/**
|
|
14314
|
+
* Generate file path candidates from a link string.
|
|
14315
|
+
*/
|
|
14316
|
+
resolveLinkTarget(link, sourceDir) {
|
|
14317
|
+
const candidates = [];
|
|
14318
|
+
const cleanLink = link.split("#")[0];
|
|
14319
|
+
if (!cleanLink)
|
|
14320
|
+
return candidates;
|
|
14321
|
+
if (cleanLink.startsWith("/")) {
|
|
14322
|
+
const abs = cleanLink.slice(1);
|
|
14323
|
+
candidates.push(abs);
|
|
14324
|
+
if (!abs.endsWith(".md"))
|
|
14325
|
+
candidates.push(abs + ".md");
|
|
14326
|
+
} else if (cleanLink.includes("/")) {
|
|
14327
|
+
const resolved = sourceDir ? `${sourceDir}/${cleanLink}` : cleanLink;
|
|
14328
|
+
const normalized = resolved.split("/").reduce((acc, seg) => {
|
|
14329
|
+
if (seg === "..")
|
|
14330
|
+
acc.pop();
|
|
14331
|
+
else if (seg !== ".")
|
|
14332
|
+
acc.push(seg);
|
|
14333
|
+
return acc;
|
|
14334
|
+
}, []).join("/");
|
|
14335
|
+
candidates.push(normalized);
|
|
14336
|
+
if (!normalized.endsWith(".md"))
|
|
14337
|
+
candidates.push(normalized + ".md");
|
|
14338
|
+
candidates.push(cleanLink);
|
|
14339
|
+
if (!cleanLink.endsWith(".md"))
|
|
14340
|
+
candidates.push(cleanLink + ".md");
|
|
14341
|
+
} else {
|
|
14342
|
+
if (sourceDir) {
|
|
14343
|
+
candidates.push(`${sourceDir}/${cleanLink}`);
|
|
14344
|
+
if (!cleanLink.endsWith(".md"))
|
|
14345
|
+
candidates.push(`${sourceDir}/${cleanLink}.md`);
|
|
14346
|
+
}
|
|
14347
|
+
candidates.push(cleanLink);
|
|
14348
|
+
if (!cleanLink.endsWith(".md"))
|
|
14349
|
+
candidates.push(cleanLink + ".md");
|
|
14350
|
+
}
|
|
14351
|
+
return candidates;
|
|
14352
|
+
}
|
|
14250
14353
|
extractHeadings(content) {
|
|
14251
14354
|
const body = this.stripFrontmatter(content);
|
|
14252
14355
|
const headings = [];
|
|
@@ -39295,26 +39398,6 @@ function computeReviewStreak(files, tilPath, now) {
|
|
|
39295
39398
|
|
|
39296
39399
|
// src/mcp/tools.ts
|
|
39297
39400
|
function registerTools(server, storage, metadata, tilPath) {
|
|
39298
|
-
server.registerTool(
|
|
39299
|
-
"vault_get_active_file",
|
|
39300
|
-
{
|
|
39301
|
-
title: "Get Active File",
|
|
39302
|
-
description: "Returns the path and content of the file currently open in Obsidian"
|
|
39303
|
-
},
|
|
39304
|
-
async () => {
|
|
39305
|
-
const activePath = await metadata.getActiveFilePath();
|
|
39306
|
-
if (!activePath) {
|
|
39307
|
-
return { content: [{ type: "text", text: "No file is currently open" }] };
|
|
39308
|
-
}
|
|
39309
|
-
const text = await storage.readFile(activePath);
|
|
39310
|
-
if (text === null) {
|
|
39311
|
-
return { content: [{ type: "text", text: "Could not read the active file" }] };
|
|
39312
|
-
}
|
|
39313
|
-
return { content: [{ type: "text", text: `path: ${activePath}
|
|
39314
|
-
---
|
|
39315
|
-
${text}` }] };
|
|
39316
|
-
}
|
|
39317
|
-
);
|
|
39318
39401
|
server.registerTool(
|
|
39319
39402
|
"til_list",
|
|
39320
39403
|
{
|
|
@@ -39903,7 +39986,7 @@ var StdioServerTransport = class {
|
|
|
39903
39986
|
};
|
|
39904
39987
|
|
|
39905
39988
|
// skills/til/SKILL.md
|
|
39906
|
-
var SKILL_default = "---\nname: til\ndescription: \"Today I Learned \u2014 research a topic, learn interactively, then save as TIL markdown. Use when the user wants to learn about a topic, says 'teach me', 'what is X', 'deep dive into X', or asks to study something and save it as a TIL note.\"\nargument-hint: \"<topic> [category]\"\nplugin-version: \"__PLUGIN_VERSION__\"\n---\n\n# TIL Skill\n\nTopic research \u2192 Interactive learning \u2192 Save TIL.\n\n## MCP Tools\n\n- `til_list`: Check existing TILs (detect same/similar topics)\n- `til_get_context`: Find related TILs and backlog items, link candidates\n
|
|
39989
|
+
var SKILL_default = "---\nname: til\ndescription: \"Today I Learned \u2014 research a topic, learn interactively, then save as TIL markdown. Use when the user wants to learn about a topic, says 'teach me', 'what is X', 'deep dive into X', or asks to study something and save it as a TIL note.\"\nargument-hint: \"<topic> [category]\"\nplugin-version: \"__PLUGIN_VERSION__\"\n---\n\n# TIL Skill\n\nTopic research \u2192 Interactive learning \u2192 Save TIL.\n\n## MCP Tools\n\n- `til_list`: Check existing TILs (detect same/similar topics)\n- `til_get_context`: Find related TILs and backlog items, link candidates\n\n## Phase 1: Topic Research\n\n1. Use `Read` to check if `til/{category}/{slug}.md` exists \u2192 if so, offer to expand the existing TIL or start a new topic\n2. Use `til_get_context` to check existing TILs. Fall back to `til_list` if MCP is unavailable\n - When learning a backlog item, call `til_backlog_status`(category) \u2192 reference `sections[].items[].sourceUrls`\n - 1 URL: fetch directly with `WebFetch`\n - 2+ URLs: pass all URLs to a single `til-fetcher` subagent\n3. If no existing TIL is found, research the topic via web search\n4. Collect key concepts, examples, and references \u2192 summarize\n\n## Phase 2: Interactive Learning\n\n1. Explain based on research results\n2. Follow-up mode: focus on new perspectives; do not repeat existing content\n3. Answer user questions\n4. Move to Phase 3 only when the user explicitly requests to save\n\n## Phase 3: Save\n\nFollow `/save` skill rules to save. In follow-up mode, merge into the existing file (add `updated` date).\n\n## Arguments\n\n- First: learning topic (required)\n- Second: category (optional, automatically detected if omitted)\n\n## Rules\n\n- Links: `[display name](til/{category}/{slug}.md)` \u2014 no `[[wiki links]]` (links must work in static sites and non-Obsidian editors)\n- Use placeholder values for sensitive information (example.com, your-api-key) to avoid leaking real credentials\n";
|
|
39907
39990
|
|
|
39908
39991
|
// skills/backlog/SKILL.md
|
|
39909
39992
|
var SKILL_default2 = "---\nname: backlog\ndescription: \"View learning backlog and show progress. Use when the user asks 'what's left to learn', 'show my progress', 'learning todo', or wants to check remaining topics in their study plan.\"\nargument-hint: \"[category]\"\ndisable-model-invocation: true\nplugin-version: \"__PLUGIN_VERSION__\"\n---\n\n# Backlog Skill\n\nView learning backlog + summarize progress (read-only).\n\n## MCP Tools\n\n- `til_backlog_status`: Overall/per-category progress (includes sections when category is specified)\n\n## Workflow\n\n### No arguments (`/backlog`)\n\n1. Call `til_backlog_status` (fall back to `./til/*/backlog.md` Glob if MCP unavailable)\n2. If no backlog found, show `/research` guidance and exit\n3. Summarize as table: category (link), progress, completed count, last activity date, progress bar\n\n### With arguments (`/backlog category`)\n\n1. Pass category to `til_backlog_status` \u2192 use sections\n2. Output per section:\n - `## {heading} ({completed}/{total})`\n - `- (x) [{displayName}]({path})` / `- ( ) [{displayName}]({path})`\n - Do not use `- [ ]`/`- [x]` markdown checkboxes (not rendered in terminal)\n\n## Output Rules\n\n- All category/item names as `[display name](path)` markdown links\n- Do not expose raw paths\n- Progress bar: 10 slots (`\u2588` completed, `\u2591` incomplete)\n- Do not modify backlog files (read-only)\n";
|
|
@@ -39912,7 +39995,7 @@ var SKILL_default2 = "---\nname: backlog\ndescription: \"View learning backlog a
|
|
|
39912
39995
|
var SKILL_default3 = '---\nname: research\ndescription: "Research a topic to identify key concepts and terms, then organize as a learning backlog. Use when the user wants a learning roadmap, study plan, curriculum, or asks \'what should I learn about X\' \u2014 focuses on planning what to learn, not learning itself."\nargument-hint: "<topic> [category]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Research Skill\n\nTopic research \u2192 Identify concepts and dependencies \u2192 Save backlog file.\n\n## MCP Tools\n\n- `til_list`: Check existing TILs (search by topic using the search parameter)\n\n## Phase 1: Topic Research\n\n1. Use `til_list(search=topic)` to check already-learned topics \u2192 avoid duplicate backlog entries\n2. Research the topic via web search, identify required concepts, terms, and prerequisites\n3. Break down into subtopics and research each directly\n4. Analyze dependencies between subtopics\n\n## Phase 2: Organize Backlog\n\n1. Sort by learning order: Prerequisites \u2192 Core Concepts \u2192 Advanced\n2. Add a one-line description per item\n3. Gather user feedback: allow adding, removing, or reordering items\n\n## Phase 3: Save\n\n1. Save to `./til/{category}/backlog.md` (auto-create folder)\n2. If `backlog.md` already exists, merge:\n - Preserve `[x]` completed items\n - Keep check state for matching items\n - Preserve existing sources, only add new items\n3. Add backlog link to TIL MOC\n4. Commit all changes: `\u{1F4CB} research: {topic} learning backlog - {category}` (do not push)\n\n## Backlog Template\n\nRead `references/templates.md` for the exact backlog template and field descriptions.\n\n## Arguments\n\n- First: research topic (required)\n- Second: category (optional, automatically detected if omitted)\n\n## Rules\n\n- One-line description per item, split into multiple files if over 20 items (long backlogs hurt readability and cause scroll fatigue)\n- Links: `[display name](til/{category}/{slug}.md)`\n';
|
|
39913
39996
|
|
|
39914
39997
|
// skills/save/SKILL.md
|
|
39915
|
-
var SKILL_default4 = '---\nname: save\ndescription: "Save learning content as a TIL file and batch-update Daily notes, MOC, and backlog. Use when the user says \'save this\', \'write up what I learned\', \'document this as a TIL\', or wants to persist a learning conversation as a note."\nargument-hint: "[topic] [category]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Save Skill\n\nLearning conversation \u2192 Save TIL file \u2192 Update Daily/MOC/backlog \u2192 Review document \u2192 Commit.\n\n## MCP Tools\n\n- `til_get_context`: Find related TILs and backlog items\n- `til_list`: Check for duplicate existing TILs\n- `til_save_note`: Save TIL note (server guarantees frontmatter/path rules, auto_check_backlog auto-checks backlog)\n
|
|
39998
|
+
var SKILL_default4 = '---\nname: save\ndescription: "Save learning content as a TIL file and batch-update Daily notes, MOC, and backlog. Use when the user says \'save this\', \'write up what I learned\', \'document this as a TIL\', or wants to persist a learning conversation as a note."\nargument-hint: "[topic] [category]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Save Skill\n\nLearning conversation \u2192 Save TIL file \u2192 Update Daily/MOC/backlog \u2192 Review document \u2192 Commit.\n\n## MCP Tools\n\n- `til_get_context`: Find related TILs and backlog items\n- `til_list`: Check for duplicate existing TILs\n- `til_save_note`: Save TIL note (server guarantees frontmatter/path rules, auto_check_backlog auto-checks backlog)\n\n## Step 1: Check Context\n\n1. Identify topic and category. Ask the user if unclear.\n2. Use `Read` to check if `til/{category}/{slug}.md` exists.\n\n## Step 2: Identify Link Candidates\n\n1. Use `til_get_context` or MOC/backlog to find existing TILs and backlog items\n2. Existing TIL/backlog items \u2192 use markdown links in the body\n3. Concepts that don\'t exist \u2192 confirm with user, then add only to related notes\n\n## Step 3: Save TIL File\n\nPath: `./til/{category}/{topic-slug}.md` (slug: lowercase English with hyphens)\n\n**Save new file**: Save using the `til_save_note` MCP tool. The server guarantees frontmatter (title, date, category, tags, aliases) and path rules.\n\n```\ntil_save_note(category, slug, title, content, tags, date, fmCategory, aliases, auto_check_backlog: true)\n```\n\n- `date`: Get local time via `date +%Y-%m-%dT%H:%M:%S` command and pass it\n- `tags`: Must include "til"\n- `aliases`: ["Korean title", "English title"]\n- `content`: Body markdown excluding frontmatter\n\n**When a file with the same slug exists** (detected by `Read` in Step 1):\n- Auto-merge only when continuing a `/til` follow-up session (preserve existing content + reinforce, add `updated`)\n- Otherwise: ask user to confirm merge or overwrite\n- For merge: use Read\u2192Edit directly on existing content instead of `til_save_note`\n\n### TIL Body Template\n\nRead `references/templates.md` for the exact TIL body, Daily note, and MOC templates.\n\n- Links: `[display name](til/{category}/{slug}.md)` \u2014 no `[[wiki links]]`\n\n## Step 4: Update Related Files\n\nUpdate the following 3 files **directly** in sequence (no subagents \u2014 parallel edits can race and corrupt shared files like MOC):\n\n1. Daily note (`./Daily/YYYY-MM-DD.md`): Add TIL link by category (create if not exists)\n2. TIL MOC (`./til/TIL MOC.md`): Add item to category section (create if not exists)\n3. Backlog: Already handled by `til_save_note`\'s `auto_check_backlog: true` (no separate call needed)\n\nDaily/MOC: Read \u2192 find position \u2192 Edit. Create file if not exists.\n\n## Step 5: Document Review\n\nDisplay full saved TIL content \u2192 use `AskUserQuestion` to confirm ("Looks good" / "Needs revision").\n\n## Step 6: Register for Review\n\nAsk via `AskUserQuestion`: "Would you like to add this TIL to spaced repetition review?"\nIf user agrees, call `til_review_update` (action: "review", grade: 4) to create SRS metadata.\n\n## Step 7: git commit\n\n`\u{1F4DD} til: {English title}({Korean title}) - {category}` (no push)\n\n## Rules\n\n- frontmatter required: date, category, tags, aliases (fill in any missing fields before saving)\n- tags must include "til" (used to filter TILs on the static site)\n- No `[[wiki links]]` \u2014 use `[display name](path)` format only (links must work in static sites and non-Obsidian editors)\n- Always update Daily/MOC/backlog after saving the TIL\n- Use callouts: `> [!tldr]`, `> [!example]`, `> [!warning]`, `> [!tip]`\n- Visualize complex concepts with Mermaid diagrams (max 1 per TIL)\n- Use placeholder values for sensitive information (avoid leaking real credentials)\n';
|
|
39916
39999
|
|
|
39917
40000
|
// skills/dashboard/SKILL.md
|
|
39918
40001
|
var SKILL_default5 = "---\nname: dashboard\ndescription: \"Learning dashboard \u2014 stats, activity heatmap, categories, backlog progress. Use when the user asks 'my stats', 'how much have I learned', 'show my streak', 'learning summary', or wants an overview of their TIL activity.\"\ndisable-model-invocation: true\nplugin-version: \"__PLUGIN_VERSION__\"\n---\n\n# Dashboard Skill\n\nRetrieve learning stats via the `til_dashboard` MCP tool and display in terminal.\n\n## MCP Tools\n\n- `til_dashboard`: Returns summary/heatmap/categories/backlog/trends as JSON\n\n## Output Format\n\n### 1. Summary Cards\nTotal TILs, categories, this week, streak \u2014 as table.\n\n### 2. Activity Trend\nSum heatmap cells by week \u2192 sparkline (`\u2581\u2582\u2583\u2585\u2587`).\n\n### 3. Category Status\nCategory (link), count, last modified date \u2014 sorted by file count descending.\n\n### 4. Backlog Progress\nSorted by progress descending, 10-slot progress bar (`\u2588`/`\u2591`).\n\n## Fallback (MCP Unavailable)\n\nIf `til_dashboard` is unavailable, combine `til_list` + `til_backlog_status` + `til_recent_context`.\n\n## Rules\n\n- Output as markdown links (no raw paths)\n- If no data: show \"No TILs yet. Run /til to get started!\"\n";
|
|
@@ -39924,7 +40007,7 @@ var SKILL_default6 = '---\nname: omt-setup\ndescription: "oh-my-til unified setu
|
|
|
39924
40007
|
var SKILL_default7 = '---\nname: til-review\ndescription: "SRS-based TIL review session (spaced repetition). Use when the user says \'quiz me\', \'review what I learned\', \'flashcard session\', \'test my knowledge\', or wants to do spaced repetition review of their TIL notes."\nargument-hint: "[category]"\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# Review Skill\n\nSRS (spaced repetition) based TIL review session. Manages review schedule with the SM-2 algorithm.\n\n## MCP Tools\n\n- `til_review_list`: List of cards due for review today + stats (load note content with `include_content: true`)\n- `til_review_update`: Record review result (grade 0-5) or remove from review\n\n## Step 1: Load Review Cards\n\nCall `til_review_list` (`include_content: true`, pass category argument if provided).\n\n- 0 cards \u2192 Show "No reviews today" + suggest registering untracked TILs (go to Step 5)\n- Cards found \u2192 Display list + proceed to Step 2\n\n## Step 2: Select Evaluation Mode\n\nSelect via `AskUserQuestion`:\n- "Simple mode (Again / Good)"\n- "Detailed mode (Again / Hard / Good / Easy)"\n\n## Step 3: Per-Card Review Loop\n\nFor each card:\n\n1. Display title, category, review info (repetition count, EF, days overdue)\n2. Use `content` already loaded in Step 1 (no additional MCP calls needed)\n3. Present key content as questions (generate 1-2 questions based on content)\n4. Wait for user answer\n5. Provide feedback (correct answer / supplementary explanation)\n6. Input evaluation via `AskUserQuestion`:\n - Simple mode: "Good (Remembered)" / "Again (Forgot)" / "Skip" / "Stop Review"\n - Detailed mode: "Again (Failed)" / "Hard (Struggled)" / "Good (Normal)" / "Easy (Perfect)"\n - Grade mapping: Again=1, Hard=3, Good=4, Easy=5\n - "Skip": do not evaluate this card, move to next\n - "Stop Review": move to Step 4\n - Skip/Stop in detailed mode: select "Other" then type "Skip" or "Stop Review"\n7. If not skipped, call `til_review_update` (action: "review", grade)\n8. Display result summary (next review date, interval)\n\n## Step 4: Completion Stats\n\nAfter all cards are done:\n- Number of cards reviewed, average grade\n- If remaining > 0, show "N more remaining, continue tomorrow"\n- Re-call `til_review_list` to display latest stats\n\n## Step 5: Register TILs (Optional)\n\nWhen no cards exist or user requests:\n- Display full TIL list via `til_list`\n- User selects files to add to review\n- Call `til_review_update` (action: "review", grade: 4) for each selected file\n\n## Rules\n\n- Max 20 cards per session (prevent overload)\n- Prioritize overdue cards (most urgent first)\n- Remove from review: if user says "remove this card", call `til_review_update` (action: "remove")\n';
|
|
39925
40008
|
|
|
39926
40009
|
// vault-assets/claude-md-section.md
|
|
39927
|
-
var claude_md_section_default = "## Learning Workflow\n\n1. `/research <topic>` \u2014 Research \u2192 Generate backlog\n2. `/backlog [category]` \u2014 Check backlog progress\n3. `/til <topic>` \u2014 Research \u2192 Interactive learning \u2192 Save\n4. `/save` \u2014 Save TIL (auto-update Daily/MOC/backlog)\n5. `/til-review [category]` \u2014 SRS-based spaced repetition review\n\n## MCP Tools\n\n**Learning Context:**\n- `til_get_context` \u2014 Find existing TILs related to a topic (searches file paths, content, backlinks, and unresolved links)\n- `til_recent_context` \u2014 Recent learning activity (newest first)\n
|
|
40010
|
+
var claude_md_section_default = "## Learning Workflow\n\n1. `/research <topic>` \u2014 Research \u2192 Generate backlog\n2. `/backlog [category]` \u2014 Check backlog progress\n3. `/til <topic>` \u2014 Research \u2192 Interactive learning \u2192 Save\n4. `/save` \u2014 Save TIL (auto-update Daily/MOC/backlog)\n5. `/til-review [category]` \u2014 SRS-based spaced repetition review\n\n## MCP Tools\n\n**Learning Context:**\n- `til_get_context` \u2014 Find existing TILs related to a topic (searches file paths, content, backlinks, and unresolved links)\n- `til_recent_context` \u2014 Recent learning activity (newest first)\n\n**TIL Management:**\n- `til_list` \u2014 TIL list + category grouping (search filter)\n- `til_save_note` \u2014 Save TIL (ensures valid frontmatter; set auto_check_backlog to auto-mark backlog items)\n\n**Backlog:**\n- `til_backlog_status` \u2014 Backlog progress\n- `til_backlog_check` \u2014 Mark backlog item as completed (standalone use)\n\n**Review (SRS):**\n- `til_review_list` \u2014 Review card list + stats (include_content)\n- `til_review_update` \u2014 Record review result\n\n**Stats:**\n- `til_dashboard` \u2014 Learning dashboard stats\n";
|
|
39928
40011
|
|
|
39929
40012
|
// agents/til-fetcher.md
|
|
39930
40013
|
var til_fetcher_default = '---\nname: til-fetcher\ndescription: Dedicated agent that fetches source URL content and summarizes it as learning material\ntools: Read, WebFetch\nmodel: haiku\nplugin-version: "__PLUGIN_VERSION__"\n---\n\n# til-fetcher\n\nDedicated agent that fetches content from source URLs and summarizes key information needed for learning.\n\n## Role\n\n- Used as a sourceUrls fetching subagent in Phase 1 of the `/til` skill\n- Reads one or more URLs sequentially via WebFetch and summarizes key content needed for learning\n\n## Output Format\n\n- Provide a summary of the key content\n- Include code examples if any are present\n';
|
|
@@ -41261,7 +41344,7 @@ function generateProfileHtml(config2, summaryCardsHtml, heatmapHtml, recentTilsH
|
|
|
41261
41344
|
// src/cli/index.ts
|
|
41262
41345
|
var path5 = __toESM(require("path"));
|
|
41263
41346
|
var fs4 = __toESM(require("fs"));
|
|
41264
|
-
var VERSION = true ? "1.
|
|
41347
|
+
var VERSION = true ? "1.1.1" : "0.0.0";
|
|
41265
41348
|
function printUsage() {
|
|
41266
41349
|
console.log(`oh-my-til v${VERSION}
|
|
41267
41350
|
|
|
@@ -41455,7 +41538,7 @@ To start MCP server: oh-my-til serve ${basePath}`);
|
|
|
41455
41538
|
const config2 = {
|
|
41456
41539
|
title: siteTitle,
|
|
41457
41540
|
description: "",
|
|
41458
|
-
// generated
|
|
41541
|
+
// set after generated count is finalized
|
|
41459
41542
|
githubUrl,
|
|
41460
41543
|
subtitle
|
|
41461
41544
|
};
|