Optimize skill description and add eval set

Replace the broad description with a sharper, action-oriented one that
emphasizes the terminal/script context as the trigger signal and explicitly
lists concrete subcommands. Add eval/ directory with 20 trigger eval queries
and the HTML reviewer used to generate them.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
pablo-mano
2026-03-04 00:10:04 +01:00
parent b116ad4abf
commit c7b35b314d
3 changed files with 319 additions and 10 deletions
+226
View File
@@ -0,0 +1,226 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Eval Set Review - obsidian-cli</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@500;600&family=Lora:wght@400;500&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Lora', Georgia, serif; background: #faf9f5; padding: 2rem; color: #141413; }
h1 { font-family: 'Poppins', sans-serif; margin-bottom: 0.5rem; font-size: 1.5rem; }
.description { color: #b0aea5; margin-bottom: 1.5rem; font-style: italic; max-width: 900px; }
.controls { margin-bottom: 1rem; display: flex; gap: 0.5rem; }
.btn { font-family: 'Poppins', sans-serif; padding: 0.5rem 1rem; border: none; border-radius: 6px; cursor: pointer; font-size: 0.875rem; font-weight: 500; }
.btn-add { background: #6a9bcc; color: white; }
.btn-add:hover { background: #5889b8; }
.btn-export { background: #d97757; color: white; }
.btn-export:hover { background: #c4613f; }
table { width: 100%; max-width: 1100px; border-collapse: collapse; background: white; border-radius: 6px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
th { font-family: 'Poppins', sans-serif; background: #141413; color: #faf9f5; padding: 0.75rem 1rem; text-align: left; font-size: 0.875rem; }
td { padding: 0.75rem 1rem; border-bottom: 1px solid #e8e6dc; vertical-align: top; }
tr:nth-child(even) td { background: #faf9f5; }
tr:hover td { background: #f3f1ea; }
.section-header td { background: #e8e6dc; font-family: 'Poppins', sans-serif; font-weight: 500; font-size: 0.8rem; color: #141413; text-transform: uppercase; letter-spacing: 0.05em; }
.query-input { width: 100%; padding: 0.4rem; border: 1px solid #e8e6dc; border-radius: 4px; font-size: 0.875rem; font-family: 'Lora', Georgia, serif; resize: vertical; min-height: 60px; }
.query-input:focus { outline: none; border-color: #d97757; box-shadow: 0 0 0 2px rgba(217,119,87,0.15); }
.toggle { position: relative; display: inline-block; width: 44px; height: 24px; }
.toggle input { opacity: 0; width: 0; height: 0; }
.toggle .slider { position: absolute; inset: 0; background: #b0aea5; border-radius: 24px; cursor: pointer; transition: 0.2s; }
.toggle .slider::before { content: ""; position: absolute; width: 18px; height: 18px; left: 3px; bottom: 3px; background: white; border-radius: 50%; transition: 0.2s; }
.toggle input:checked + .slider { background: #d97757; }
.toggle input:checked + .slider::before { transform: translateX(20px); }
.btn-delete { background: #c44; color: white; padding: 0.3rem 0.6rem; border: none; border-radius: 4px; cursor: pointer; font-size: 0.75rem; font-family: 'Poppins', sans-serif; }
.btn-delete:hover { background: #a33; }
.summary { margin-top: 1rem; color: #b0aea5; font-size: 0.875rem; }
</style>
</head>
<body>
<h1>Eval Set Review: <span id="skill-name">obsidian-cli</span></h1>
<p class="description">Current description: <span id="skill-desc">Interact with Obsidian vaults using the official Obsidian CLI (v1.12+). Read, create, append, search, and manage notes, daily notes, properties, tags, tasks, bookmarks, templates, themes, sync, plugins, and links — all from the terminal. Use this skill whenever the user mentions Obsidian CLI, wants to automate Obsidian vault operations, manage notes programmatically, script daily note workflows, query vault metadata, or integrate Obsidian with AI agents or automation pipelines. Also trigger when the user asks about controlling Obsidian from the command line, building scripts around their knowledge base, or running headless Obsidian setups. Even if the user just says "add something to my daily note" or "search my vault" in a CLI/scripting context, this skill applies.</span></p>
<div class="controls">
<button class="btn btn-add" onclick="addRow()">+ Add Query</button>
<button class="btn btn-export" onclick="exportEvalSet()">Export Eval Set</button>
</div>
<table>
<thead>
<tr>
<th style="width:65%">Query</th>
<th style="width:18%">Should Trigger</th>
<th style="width:10%">Actions</th>
</tr>
</thead>
<tbody id="eval-body"></tbody>
</table>
<p class="summary" id="summary"></p>
<script>
const EVAL_DATA = [
{
"query": "hey i need to automatically append meeting notes to today's daily note in obsidian from a bash script that runs after each zoom call ends",
"should_trigger": true
},
{
"query": "obsidian daily:append keeps failing on my headless ubuntu server, keeps showing 'IPC socket not found' — i'm running it as a systemd service",
"should_trigger": true
},
{
"query": "how do i search my obsidian vault for all notes tagged #project/alpha using the cli and pipe the results into another script?",
"should_trigger": true
},
{
"query": "i want to write a shell script that creates a new note in obsidian from a template and then sets the status property to 'in-progress' — what's the syntax for property:set?",
"should_trigger": true
},
{
"query": "my obsidian eval command works fine but i need to run multiline javascript against app.vault — the single-line approach isn't enough for what i'm trying to do",
"should_trigger": true
},
{
"query": "setting up a cron job to run obsidian tasks every morning and email me the incomplete ones — not sure what flags I need or what the output format looks like",
"should_trigger": true
},
{
"query": "i'm building a python wrapper around the obsidian cli to batch-update frontmatter across ~200 notes in my vault. how does property:set handle list-type fields?",
"should_trigger": true
},
{
"query": "trying to use the obsidian cli on my mac but the obsidian binary isn't in my PATH even though i enabled CLI in settings and restarted",
"should_trigger": true
},
{
"query": "need to move about 50 notes from Projects/ to Archive/ in my obsidian vault without touching the GUI — is there a bulk-move option?",
"should_trigger": true
},
{
"query": "can the obsidian cli get me a list of all orphan notes (no incoming links) as JSON? i want to feed that list into a cleanup script",
"should_trigger": true
},
{
"query": "how do i install the Dataview community plugin in obsidian? i've never installed a plugin before and don't know where to find it in the settings panel",
"should_trigger": false
},
{
"query": "writing a python script to bulk-rename markdown files in ~/notes — they all need a YYYY-MM-DD date prefix added to the filename based on their creation date",
"should_trigger": false
},
{
"query": "i use Logseq for my daily notes and journaling, is there any CLI tool similar to what obsidian has that lets me append to today's journal from the terminal?",
"should_trigger": false
},
{
"query": "setting up a brand new obsidian vault for my zettelkasten — what folder structure and naming convention do you recommend for atomic notes?",
"should_trigger": false
},
{
"query": "i want to use the obsidian web clipper extension to save full articles to my vault from chrome. how do i configure the template it uses?",
"should_trigger": false
},
{
"query": "building an obsidian plugin in TypeScript that hooks into the editor and adds a custom right-click context menu for formatting commands",
"should_trigger": false
},
{
"query": "i need to read and update YAML frontmatter across a directory of markdown files using Python — something like python-frontmatter or ruamel.yaml",
"should_trigger": false
},
{
"query": "how do i sync my obsidian vault to iCloud on mac? should i put it inside Documents or in a dedicated iCloud Drive folder to avoid conflicts?",
"should_trigger": false
},
{
"query": "i want to export some obsidian notes to PDF to share with colleagues who don't use obsidian — what's the best way to do a batch export?",
"should_trigger": false
},
{
"query": "implementing full-text search over a folder of markdown files in a node.js app — what's a lightweight library or algorithm for this? something like lunr or flexsearch?",
"should_trigger": false
}
];
let evalItems = [...EVAL_DATA];
function render() {
const tbody = document.getElementById('eval-body');
tbody.innerHTML = '';
const sorted = evalItems
.map((item, origIdx) => ({ ...item, origIdx }))
.sort((a, b) => (b.should_trigger ? 1 : 0) - (a.should_trigger ? 1 : 0));
let lastGroup = null;
sorted.forEach(item => {
const group = item.should_trigger ? 'trigger' : 'no-trigger';
if (group !== lastGroup) {
const headerRow = document.createElement('tr');
headerRow.className = 'section-header';
headerRow.innerHTML = `<td colspan="3">${item.should_trigger ? 'Should Trigger' : 'Should NOT Trigger'}</td>`;
tbody.appendChild(headerRow);
lastGroup = group;
}
const idx = item.origIdx;
const tr = document.createElement('tr');
tr.innerHTML = `
<td><textarea class="query-input" onchange="updateQuery(${idx}, this.value)">${escapeHtml(item.query)}</textarea></td>
<td>
<label class="toggle">
<input type="checkbox" ${item.should_trigger ? 'checked' : ''} onchange="updateTrigger(${idx}, this.checked)">
<span class="slider"></span>
</label>
<span style="margin-left:8px;font-size:0.8rem;color:#b0aea5">${item.should_trigger ? 'Yes' : 'No'}</span>
</td>
<td><button class="btn-delete" onclick="deleteRow(${idx})">Delete</button></td>
`;
tbody.appendChild(tr);
});
updateSummary();
}
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
function updateQuery(idx, value) { evalItems[idx].query = value; updateSummary(); }
function updateTrigger(idx, value) { evalItems[idx].should_trigger = value; render(); }
function deleteRow(idx) { evalItems.splice(idx, 1); render(); }
function addRow() {
evalItems.push({ query: '', should_trigger: true });
render();
const inputs = document.querySelectorAll('.query-input');
inputs[inputs.length - 1].focus();
}
function updateSummary() {
const trigger = evalItems.filter(i => i.should_trigger).length;
const noTrigger = evalItems.filter(i => !i.should_trigger).length;
document.getElementById('summary').textContent =
`${evalItems.length} queries total: ${trigger} should trigger, ${noTrigger} should not trigger`;
}
function exportEvalSet() {
const valid = evalItems.filter(i => i.query.trim() !== '');
const data = valid.map(i => ({ query: i.query.trim(), should_trigger: i.should_trigger }));
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'eval_set.json';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
render();
</script>
</body>
</html>
+82
View File
@@ -0,0 +1,82 @@
[
{
"query": "hey i need to automatically append meeting notes to today's daily note in obsidian from a bash script that runs after each zoom call ends",
"should_trigger": true
},
{
"query": "obsidian daily:append keeps failing on my headless ubuntu server, keeps showing 'IPC socket not found' — i'm running it as a systemd service",
"should_trigger": true
},
{
"query": "how do i search my obsidian vault for all notes tagged #project/alpha using the cli and pipe the results into another script?",
"should_trigger": true
},
{
"query": "i want to write a shell script that creates a new note in obsidian from a template and then sets the status property to 'in-progress' — what's the syntax for property:set?",
"should_trigger": true
},
{
"query": "my obsidian eval command works fine but i need to run multiline javascript against app.vault — the single-line approach isn't enough for what i'm trying to do",
"should_trigger": true
},
{
"query": "setting up a cron job to run obsidian tasks every morning and email me the incomplete ones — not sure what flags I need or what the output format looks like",
"should_trigger": true
},
{
"query": "i'm building a python wrapper around the obsidian cli to batch-update frontmatter across ~200 notes in my vault. how does property:set handle list-type fields?",
"should_trigger": true
},
{
"query": "trying to use the obsidian cli on my mac but the obsidian binary isn't in my PATH even though i enabled CLI in settings and restarted",
"should_trigger": true
},
{
"query": "need to move about 50 notes from Projects/ to Archive/ in my obsidian vault without touching the GUI — is there a bulk-move option?",
"should_trigger": true
},
{
"query": "can the obsidian cli get me a list of all orphan notes (no incoming links) as JSON? i want to feed that list into a cleanup script",
"should_trigger": true
},
{
"query": "how do i install the Dataview community plugin in obsidian? i've never installed a plugin before and don't know where to find it in the settings panel",
"should_trigger": false
},
{
"query": "writing a python script to bulk-rename markdown files in ~/notes — they all need a YYYY-MM-DD date prefix added to the filename based on their creation date",
"should_trigger": false
},
{
"query": "i use Logseq for my daily notes and journaling, is there any CLI tool similar to what obsidian has that lets me append to today's journal from the terminal?",
"should_trigger": false
},
{
"query": "setting up a brand new obsidian vault for my zettelkasten — what folder structure and naming convention do you recommend for atomic notes?",
"should_trigger": false
},
{
"query": "i want to use the obsidian web clipper extension to save full articles to my vault from chrome. how do i configure the template it uses?",
"should_trigger": false
},
{
"query": "building an obsidian plugin in TypeScript that hooks into the editor and adds a custom right-click context menu for formatting commands",
"should_trigger": false
},
{
"query": "i need to read and update YAML frontmatter across a directory of markdown files using Python — something like python-frontmatter or ruamel.yaml",
"should_trigger": false
},
{
"query": "how do i sync my obsidian vault to iCloud on mac? should i put it inside Documents or in a dedicated iCloud Drive folder to avoid conflicts?",
"should_trigger": false
},
{
"query": "i want to export some obsidian notes to PDF to share with colleagues who don't use obsidian — what's the best way to do a batch export?",
"should_trigger": false
},
{
"query": "implementing full-text search over a folder of markdown files in a node.js app — what's a lightweight library or algorithm for this? something like lunr or flexsearch?",
"should_trigger": false
}
]
+11 -10
View File
@@ -1,16 +1,17 @@
---
name: obsidian-cli
description: >
Interact with Obsidian vaults using the official Obsidian CLI (v1.12+).
Read, create, append, search, and manage notes, daily notes, properties, tags,
tasks, bookmarks, templates, themes, sync, plugins, and links — all from the terminal.
Use this skill whenever the user mentions Obsidian CLI, wants to automate Obsidian
vault operations, manage notes programmatically, script daily note workflows,
query vault metadata, or integrate Obsidian with AI agents or automation pipelines.
Also trigger when the user asks about controlling Obsidian from the command line,
building scripts around their knowledge base, or running headless Obsidian setups.
Even if the user just says "add something to my daily note" or "search my vault"
in a CLI/scripting context, this skill applies.
Use this skill for any workflow where the user controls Obsidian from a terminal
or script — not the GUI. Concrete triggers: running the `obsidian` binary and its
subcommands (daily:append, eval, tasks, orphans, search, property:set, etc.);
writing bash or Python scripts that automate vault operations; scheduling Obsidian
tasks via cron or systemd timers; debugging IPC socket errors or headless Linux
setups; evaluating JavaScript against the Obsidian API from a shell; or building
programmatic wrappers around the CLI. The single clearest signal: the user is
invoking or wants to invoke the `obsidian` command from a terminal rather than
clicking through the app. Skip for GUI-only questions, installing plugins or themes
through the Obsidian interface, iCloud/sync configuration, or processing markdown
files with tools that have no connection to the `obsidian` binary.
---
# Obsidian CLI