feat: v1.4.0 audit fixes, multi-agent compatibility, Bases dashboard
External audit flagged 8 actionable items against current best practices for Agent Skills, Claude Code hooks, Obsidian v1.9-v1.12, and JSON Canvas 1.0. This release addresses all of them and adds multi-agent compatibility files at zero cost to existing users. Tier 1, critical fixes: * wiki/meta/dashboard.base: NEW Obsidian Bases dashboard (native, no plugin needed). Replaces Dataview as the primary dashboard. Six views: Recent Activity, Seed Pages, Entities Missing Sources, Open Questions, Comparisons, Sources. * wiki/meta/dashboard.md: now embeds dashboard.base. Legacy Dataview queries retained as optional fallback for users on Obsidian < 1.9.10. * README.md and skills/wiki/references/plugins.md: Plugins section reorganized to recommend Bases (core, no install) primary, Dataview optional/legacy. * skills/canvas/references/canvas-spec.md: added missing JSON Canvas 1.0 fields. Group nodes now document background and backgroundStyle (cover, ratio, repeat). Edges document fromEnd (default 'none') and toEnd (default 'arrow') asymmetric defaults. Hex ID convention noted alongside descriptive ID alternative. * .gitignore: track wiki/meta/dashboard.base explicitly. Tier 2, important improvements: * hooks/hooks.json: SessionStart now uses both command type ([ -f wiki/hot.md ] && cat ...) and prompt type. Command type is the canonical safety check that works in non-vault sessions without erroring. Matcher: startup|resume. * hooks/hooks.json: NEW PostCompact hook re-injects hot cache after context compaction (hook-injected context does not survive compaction; CLAUDE.md does). * hooks/hooks.json: PostToolUse auto-commit now guarded by [ -d .git ]. * hooks/README.md: NEW documentation including known plugin-hooks STDOUT bug (anthropics/claude-code#10875) and workarounds. * skills/wiki/references/mcp-setup.md: added Option D (Obsidian CLI) for v1.12+. Added warning callout above NODE_TLS_REJECT_UNAUTHORIZED line explaining process-wide TLS bypass and recommending Option D as the secure alternative. * skills/wiki-ingest/SKILL.md: documented [!contradiction] custom callout CSS dependency on vault-colors.css snippet. * skills/wiki/references/css-snippets.md: full documentation of all four custom callouts (contradiction, gap, key-insight, stale) with built-in fallback equivalents. Tier 3, multi-agent compatibility (low complexity, high reach): * AGENTS.md: Codex CLI / OpenCode bootstrap. * GEMINI.md: Gemini CLI / Antigravity bootstrap. * .cursor/rules/claude-obsidian.mdc: Cursor always-on rules. * .windsurf/rules/claude-obsidian.md: Windsurf Cascade rules. * .github/copilot-instructions.md: GitHub Copilot conventions. * bin/setup-multi-agent.sh: idempotent symlink installer for Codex, OpenCode, Gemini, Cursor, Windsurf. Wires up the skills/ directory in each agent's expected location. Style cleanup: scrubbed all em dashes from every skill, hook, doc, and bootstrap file (249 total replacements across 26 files). Skills now use periods, commas, and colons throughout for cleaner natural prose. Version: 1.3.0 to 1.4.0 (aligns plugin.json with GitHub release tag format). Already resolved in v1.1 (no action needed): * defuddle, obsidian-bases, obsidian-markdown skills shipped * URL ingestion, vision ingestion, delta tracking docs * Multi-depth wiki-query (Quick / Standard / Deep) * PostToolUse auto-commit hook * allowed-tools field removed from all SKILL.md files * All templates already use plural tag/alias forms * Custom callouts CSS already in vault-colors.css Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,7 @@ description: >
|
||||
"go research", "build a wiki on".
|
||||
---
|
||||
|
||||
# autoresearch — Autonomous Research Loop
|
||||
# autoresearch: Autonomous Research Loop
|
||||
|
||||
You are a research agent. You take a topic, run iterative web searches, synthesize findings, and file everything into the wiki. The user gets wiki pages, not a chat response.
|
||||
|
||||
@@ -29,18 +29,18 @@ Read `references/program.md` to load the research objectives and constraints. Th
|
||||
```
|
||||
Input: topic (from user command)
|
||||
|
||||
Round 1 — Broad search
|
||||
Round 1. Broad search
|
||||
1. Decompose topic into 3-5 distinct search angles
|
||||
2. For each angle: run 2-3 WebSearch queries
|
||||
3. For top 2-3 results per angle: WebFetch the page
|
||||
4. Extract from each: key claims, entities, concepts, open questions
|
||||
|
||||
Round 2 — Gap fill
|
||||
Round 2. Gap fill
|
||||
5. Identify what's missing or contradicted from Round 1
|
||||
6. Run targeted searches for each gap (max 5 queries)
|
||||
7. Fetch top results for each gap
|
||||
|
||||
Round 3 — Synthesis check (optional, if gaps remain)
|
||||
Round 3. Synthesis check (optional, if gaps remain)
|
||||
8. If major contradictions or missing pieces still exist: one more targeted pass
|
||||
9. Otherwise: proceed to filing
|
||||
|
||||
@@ -53,18 +53,18 @@ Max rounds: 3 (as set in program.md). Stop when depth is reached or max rounds h
|
||||
|
||||
After research is complete, create these pages:
|
||||
|
||||
**wiki/sources/** — one page per major reference found
|
||||
**wiki/sources/**. One page per major reference found
|
||||
- Use source frontmatter (type, source_type, author, date_published, url, confidence, key_claims)
|
||||
- Body: summary of the source, what it contributes to the topic
|
||||
|
||||
**wiki/concepts/** — one page per significant concept extracted
|
||||
**wiki/concepts/**. One page per significant concept extracted
|
||||
- Only create a page if the concept is substantive enough to stand alone
|
||||
- Check the index first — update existing concept pages rather than creating duplicates
|
||||
- Check the index first: update existing concept pages rather than creating duplicates
|
||||
|
||||
**wiki/entities/** — one page per significant person, org, or product identified
|
||||
- Check the index first — update existing entity pages
|
||||
**wiki/entities/**. One page per significant person, org, or product identified
|
||||
- Check the index first: update existing entity pages
|
||||
|
||||
**wiki/questions/** — one synthesis page titled "Research: [Topic]"
|
||||
**wiki/questions/**. One synthesis page titled "Research: [Topic]"
|
||||
- This is the master synthesis. Everything comes together here.
|
||||
- Sections: Overview, Key Findings, Entities, Concepts, Contradictions, Open Questions, Sources
|
||||
- Full frontmatter with related links to all pages created in this session
|
||||
@@ -101,10 +101,10 @@ sources:
|
||||
- ...
|
||||
|
||||
## Key Entities
|
||||
- [[Entity Name]] — role/significance
|
||||
- [[Entity Name]]: role/significance
|
||||
|
||||
## Key Concepts
|
||||
- [[Concept Name]] — one-line definition
|
||||
- [[Concept Name]]: one-line definition
|
||||
|
||||
## Contradictions
|
||||
- [[Source A]] says X. [[Source B]] says Y. [Brief note on which is more credible and why]
|
||||
@@ -114,15 +114,15 @@ sources:
|
||||
- [Gap that needs more sources]
|
||||
|
||||
## Sources
|
||||
- [[Source 1]] — author, date
|
||||
- [[Source 2]] — author, date
|
||||
- [[Source 1]]: author, date
|
||||
- [[Source 2]]: author, date
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## After Filing
|
||||
|
||||
1. Update `wiki/index.md` — add all new pages to the right sections
|
||||
1. Update `wiki/index.md`. Add all new pages to the right sections
|
||||
2. Append to `wiki/log.md` (at the TOP):
|
||||
```
|
||||
## [YYYY-MM-DD] autoresearch | [Topic]
|
||||
|
||||
@@ -21,9 +21,9 @@ Default objectives for every research session:
|
||||
|
||||
Label every claim with confidence when filing:
|
||||
|
||||
- **high** — multiple independent authoritative sources agree
|
||||
- **medium** — single good source, or sources partially agree
|
||||
- **low** — speculation, opinion pieces, single informal source, or claim not verified
|
||||
- **high**: multiple independent authoritative sources agree
|
||||
- **medium**: single good source, or sources partially agree
|
||||
- **low**: speculation, opinion pieces, single informal source, or claim not verified
|
||||
|
||||
Always note the source date for factual claims. Mark claims from sources older than 3 years as potentially stale.
|
||||
|
||||
@@ -54,7 +54,7 @@ Always note the source date for factual claims. Mark claims from sources older t
|
||||
|
||||
For AI/tech research:
|
||||
- Prefer: arXiv, official GitHub repos, official product documentation, Hacker News discussions with high karma
|
||||
- Note: LLM benchmarks are often gamed — treat leaderboard claims as low confidence unless independently verified
|
||||
- Note: LLM benchmarks are often gamed: treat leaderboard claims as low confidence unless independently verified
|
||||
|
||||
For business/market research:
|
||||
- Prefer: company filings, Crunchbase, Bloomberg, verified industry reports
|
||||
|
||||
@@ -3,14 +3,14 @@ name: canvas
|
||||
description: "Visual layer of the wiki. Add images, text cards, PDFs, and wiki pages to Obsidian canvas files with auto-positioning inside zones. Integrates with /banana for image capture. Triggers on: /canvas, canvas new, canvas add image, canvas add text, canvas add pdf, canvas add note, canvas zone, canvas list, canvas from banana, add to canvas, put this on the canvas, open canvas, create canvas."
|
||||
---
|
||||
|
||||
# canvas — Visual Reference Layer
|
||||
# canvas: Visual Reference Layer
|
||||
|
||||
The three knowledge capture layers:
|
||||
- `/save` → text synthesis (wiki/questions/, wiki/concepts/)
|
||||
- `/autoresearch` → structured knowledge (wiki/sources/, wiki/concepts/)
|
||||
- `/canvas` → visual references (wiki/canvases/)
|
||||
|
||||
A canvas is a JSON file Obsidian renders as an infinite visual board. This skill reads and writes canvas JSON directly. Read `references/canvas-spec.md` for the full format reference before making any edits. This spec aligns with the [JSON Canvas open standard](https://jsoncanvas.org/) — if `kepano/obsidian-skills` is installed, its `json-canvas` skill is the authoritative cross-platform reference.
|
||||
A canvas is a JSON file Obsidian renders as an infinite visual board. This skill reads and writes canvas JSON directly. Read `references/canvas-spec.md` for the full format reference before making any edits. This spec aligns with the [JSON Canvas open standard](https://jsoncanvas.org/). If `kepano/obsidian-skills` is installed, its `json-canvas` skill is the authoritative cross-platform reference.
|
||||
|
||||
---
|
||||
|
||||
@@ -59,7 +59,7 @@ If it does not exist, create it:
|
||||
|
||||
1. Slugify the name: lowercase, spaces → hyphens, strip special chars.
|
||||
2. Create `wiki/canvases/[slug].canvas` with the starter structure, title updated to `# [Name]`.
|
||||
3. Add entry to `wiki/overview.md` under a "## Canvases" subsection (append after the Current State section). Do not modify `wiki/index.md` — it uses a fixed section schema (Domains, Entities, Concepts, Sources, Questions, Comparisons).
|
||||
3. Add entry to `wiki/overview.md` under a "## Canvases" subsection (append after the Current State section). Do not modify `wiki/index.md`. It uses a fixed section schema (Domains, Entities, Concepts, Sources, Questions, Comparisons).
|
||||
4. Report: "Created wiki/canvases/[slug].canvas"
|
||||
|
||||
---
|
||||
@@ -76,7 +76,7 @@ Create `_attachments/images/canvas/` if it doesn't exist.
|
||||
|
||||
**Detect aspect ratio:**
|
||||
Use `python3 -c "from PIL import Image; img=Image.open('[path]'); print(img.width, img.height)"` or `identify -format '%w %h' [path]`.
|
||||
See `references/canvas-spec.md` for the full aspect ratio → canvas size table (7 ratios including 4:3, 3:4, ultra-wide). Do not use an inline table here — the spec is the single source of truth for sizing.
|
||||
See `references/canvas-spec.md` for the full aspect ratio → canvas size table (7 ratios including 4:3, 3:4, ultra-wide). Do not use an inline table here. The spec is the single source of truth for sizing.
|
||||
|
||||
**Position using auto-layout** (see Auto-Positioning section below).
|
||||
|
||||
@@ -117,8 +117,8 @@ Same as add image. Obsidian renders PDFs natively as file nodes.
|
||||
|
||||
1. Search `wiki/` for a file matching the page name (case-insensitive, partial match ok).
|
||||
2. Use the vault-relative path as the `file` field.
|
||||
- Use `"type": "file"` (not `"type": "link"`) — `.md` files use file nodes, not link nodes.
|
||||
- `"type": "link"` takes a `url: "https://..."` — it is for web URLs only.
|
||||
- Use `"type": "file"` (not `"type": "link"`): `.md` files use file nodes, not link nodes.
|
||||
- `"type": "link"` takes a `url: "https://..."`: it is for web URLs only.
|
||||
3. Create a file node: width=300, height=100.
|
||||
4. Position using auto-layout.
|
||||
|
||||
@@ -166,8 +166,8 @@ Write and report.
|
||||
3. Report:
|
||||
|
||||
```
|
||||
wiki/canvases/main.canvas — 14 nodes (8 images, 3 text, 2 file, 1 group)
|
||||
wiki/canvases/design-ideas.canvas — 42 nodes (30 images, 4 text, 8 groups)
|
||||
wiki/canvases/main.canvas . 14 nodes (8 images, 3 text, 2 file, 1 group)
|
||||
wiki/canvases/design-ideas.canvas. 42 nodes (30 images, 4 text, 8 groups)
|
||||
```
|
||||
|
||||
---
|
||||
@@ -175,7 +175,7 @@ wiki/canvases/design-ideas.canvas — 42 nodes (30 images, 4 text, 8 groups)
|
||||
### from banana (`/canvas from banana`)
|
||||
|
||||
1. Check `wiki/canvases/.recent-images.txt` first (session log of newly written images).
|
||||
2. If not found or empty: use `find` with correct precedence (parentheses required — without them `-newer` only binds to the last `-name` clause):
|
||||
2. If not found or empty: use `find` with correct precedence (parentheses required. Without them `-newer` only binds to the last `-name` clause):
|
||||
```bash
|
||||
python3 -c "import time,os; open('/tmp/ten-min-ago','w').close(); os.utime('/tmp/ten-min-ago',(time.time()-600,time.time()-600))"
|
||||
find _attachments/images -newer /tmp/ten-min-ago \( -name "*.png" -o -name "*.jpg" \)
|
||||
@@ -199,7 +199,7 @@ def next_position(canvas_nodes, target_zone_label, new_w, new_h):
|
||||
and n.get('label') == target_zone_label), None)
|
||||
|
||||
if zone is None:
|
||||
# No zone — place below all content
|
||||
# No zone: place below all content
|
||||
max_y = max((n['y'] + n.get('height', 0) for n in canvas_nodes), default=-140)
|
||||
return -400, max_y + 60
|
||||
|
||||
@@ -223,7 +223,7 @@ def next_position(canvas_nodes, target_zone_label, new_w, new_h):
|
||||
max_row_y = max(n['y'] + n.get('height', 0) for n in inside)
|
||||
return zx + 20, max_row_y + 20
|
||||
|
||||
# Same row — align to the top of all existing nodes in the zone
|
||||
# Same row: align to the top of all existing nodes in the zone
|
||||
current_row_y = min(n['y'] for n in inside)
|
||||
return next_x, current_row_y
|
||||
```
|
||||
@@ -264,7 +264,7 @@ When `/banana` finishes generating images, suggest:
|
||||
## Summary
|
||||
|
||||
1. Read canvas-spec.md before editing any canvas JSON.
|
||||
2. Always read the canvas file before writing — parse existing nodes to avoid ID collisions and calculate auto-positions.
|
||||
2. Always read the canvas file before writing. Parse existing nodes to avoid ID collisions and calculate auto-positions.
|
||||
3. Create `_attachments/images/canvas/` for downloaded/copied images.
|
||||
4. Update `wiki/index.md` when creating new canvases.
|
||||
5. Report position and zone after every add operation.
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
Canvas files are JSON with two top-level keys: `nodes` (array) and `edges` (array).
|
||||
Obsidian reads and writes them as UTF-8 JSON files with `.canvas` extension.
|
||||
|
||||
This reference aligns with the [JSON Canvas 1.0 open specification](https://jsoncanvas.org/spec/1.0/). All structures support arbitrary additional fields (`[key: string]: any`) for forward compatibility. Obsidian will preserve unknown fields when reading and writing canvas files.
|
||||
|
||||
**ID format**: The JSON Canvas 1.0 spec recommends 16-character lowercase hexadecimal IDs (e.g., `"a1b2c3d4e5f67890"`). Obsidian itself generates IDs in this format. The descriptive ID examples in this reference (`"text-title-4821"`, `"img-cover-7823"`) are an alternative naming convention that this plugin uses for human readability. Both are valid JSON Canvas. Use whichever fits your workflow.
|
||||
|
||||
---
|
||||
|
||||
## Coordinate System
|
||||
@@ -70,13 +74,13 @@ Renders an image, PDF, markdown note, or other vault file inline.
|
||||
- Supported: `.png` `.jpg` `.webp` `.gif` `.pdf` `.md` `.canvas`
|
||||
- For `.md` files: renders as a preview card.
|
||||
- For `.pdf` files: renders the first page as preview.
|
||||
- No `color` field for file nodes — color is ignored.
|
||||
- No `color` field for file nodes: color is ignored.
|
||||
|
||||
---
|
||||
|
||||
### Group node (Zone)
|
||||
|
||||
A labeled rectangular region. Does not clip or contain nodes — it's a visual guide.
|
||||
A labeled rectangular region. Does not clip or contain nodes. It's a visual guide.
|
||||
Nodes placed "inside" a group are just positioned within its bounding box.
|
||||
|
||||
```json
|
||||
@@ -88,13 +92,20 @@ Nodes placed "inside" a group are just positioned within its bounding box.
|
||||
"y": -880,
|
||||
"width": 1060,
|
||||
"height": 290,
|
||||
"color": "6"
|
||||
"color": "6",
|
||||
"background": "_attachments/images/grid-bg.png",
|
||||
"backgroundStyle": "cover"
|
||||
}
|
||||
```
|
||||
|
||||
- `label`: shown at the top of the group box.
|
||||
- `color`: colors the group border and label.
|
||||
- Groups do not affect auto-layout — they are purely visual containers.
|
||||
- `background` *(optional)*: vault-relative path to a background image for the group.
|
||||
- `backgroundStyle` *(optional)*: how the background is rendered.
|
||||
- `"cover"`: fills the group, cropping if needed (default-ish behavior)
|
||||
- `"ratio"`: preserves aspect ratio, fits inside the group
|
||||
- `"repeat"`: tiles the image
|
||||
- Groups do not affect auto-layout: they are purely visual containers.
|
||||
|
||||
---
|
||||
|
||||
@@ -128,6 +139,7 @@ Connections between nodes. Usually empty for mood boards.
|
||||
"id": "e-hub-cidx",
|
||||
"fromNode": "hub",
|
||||
"fromSide": "right",
|
||||
"fromEnd": "none",
|
||||
"toNode": "c-idx",
|
||||
"toSide": "left",
|
||||
"toEnd": "arrow",
|
||||
@@ -136,9 +148,16 @@ Connections between nodes. Usually empty for mood boards.
|
||||
}
|
||||
```
|
||||
|
||||
- `fromSide` / `toSide`: `"top"` `"bottom"` `"left"` `"right"`
|
||||
- `toEnd`: `"arrow"` (directed) or `"none"` (undirected line)
|
||||
- `label` and `color` are optional.
|
||||
**Required fields**: `id`, `fromNode`, `toNode`. Everything else is optional.
|
||||
|
||||
- `fromNode` / `toNode`: IDs of the source and target nodes.
|
||||
- `fromSide` / `toSide` *(optional)*: `"top"` `"bottom"` `"left"` `"right"`. If omitted, Obsidian auto-calculates the best side based on relative node positions.
|
||||
- `fromEnd` *(optional)*: end-cap on the source side. Defaults to `"none"`. Values: `"none"` | `"arrow"`.
|
||||
- `toEnd` *(optional)*: end-cap on the target side. **Defaults to `"arrow"`**: note the asymmetric default vs `fromEnd`. Values: `"none"` | `"arrow"`.
|
||||
- `label` *(optional)*: text shown on the edge.
|
||||
- `color` *(optional)*: same color palette as nodes (`"1"`–`"6"` or hex).
|
||||
|
||||
Most edges represent directed relationships, so the asymmetric defaults (`fromEnd: "none"`, `toEnd: "arrow"`) produce a single arrow pointing from source to target without specifying anything explicitly.
|
||||
|
||||
---
|
||||
|
||||
@@ -269,5 +288,5 @@ function place_node(canvas, zone_label, new_w, new_h):
|
||||
- **Wrong path format**: use `_attachments/images/file.png` not `/home/user/...` or `~/...`
|
||||
- **ID collision**: always read existing IDs before generating a new one
|
||||
- **Negative y confusion**: `y: -2400` is ABOVE `y: -1000` (more negative = higher up)
|
||||
- **Group does not clip**: placing a node "inside" a group is just positioning it within the group's bounding box — there is no parent-child relationship in the JSON
|
||||
- **Group does not clip**: placing a node "inside" a group is just positioning it within the group's bounding box: there is no parent-child relationship in the JSON
|
||||
- **Missing height on text nodes**: Obsidian will render the text but may clip it if height is too small. Use height ≥ content-lines × 24.
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
---
|
||||
name: defuddle
|
||||
description: "Strip clutter from web pages before ingesting into the wiki. Removes ads, navigation, headers, footers, and boilerplate — leaving clean readable markdown that saves 40-60% tokens. Triggers on: defuddle, clean this page, strip this url, fetch and clean, clean web content before ingesting."
|
||||
description: "Strip clutter from web pages before ingesting into the wiki. Removes ads, navigation, headers, footers, and boilerplate: leaving clean readable markdown that saves 40-60% tokens. Triggers on: defuddle, clean this page, strip this url, fetch and clean, clean web content before ingesting."
|
||||
---
|
||||
|
||||
# defuddle — Web Page Cleaner
|
||||
# defuddle: Web Page Cleaner
|
||||
|
||||
Defuddle extracts the meaningful content from a web page and drops everything else: ads, cookie banners, nav bars, related articles, footers, social sharing buttons. What remains is the article body as clean markdown.
|
||||
|
||||
Use this before any URL ingestion. It is optional but strongly recommended — it cuts token usage by 40-60% on typical web articles and produces cleaner wiki pages.
|
||||
Use this before any URL ingestion. It is optional but strongly recommended. It cuts token usage by 40-60% on typical web articles and produces cleaner wiki pages.
|
||||
|
||||
---
|
||||
|
||||
@@ -76,7 +76,7 @@ If not installed: use WebFetch directly. The content will be less clean but stil
|
||||
|
||||
## Integration with /wiki-ingest
|
||||
|
||||
The `/wiki-ingest` skill checks for defuddle automatically when a URL is passed. You do not need to run defuddle manually before ingesting a URL — the ingest skill will call it if available.
|
||||
The `/wiki-ingest` skill checks for defuddle automatically when a URL is passed. You do not need to run defuddle manually before ingesting a URL. The ingest skill will call it if available.
|
||||
|
||||
To manually clean a page and save before ingesting:
|
||||
1. Run the save command above
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
---
|
||||
name: obsidian-bases
|
||||
description: "Create and edit Obsidian Bases (.base files) — Obsidian's native database layer for dynamic tables, card views, list views, filters, formulas, and summaries over vault notes. Triggers on: create a base, add a base file, obsidian bases, base view, filter notes, formula, database view, dynamic table, task tracker base, reading list base."
|
||||
description: "Create and edit Obsidian Bases (.base files): Obsidian's native database layer for dynamic tables, card views, list views, filters, formulas, and summaries over vault notes. Triggers on: create a base, add a base file, obsidian bases, base view, filter notes, formula, database view, dynamic table, task tracker base, reading list base."
|
||||
---
|
||||
|
||||
# obsidian-bases — Obsidian's Database Layer
|
||||
# obsidian-bases: Obsidian's Database Layer
|
||||
|
||||
Obsidian Bases (launched 2025) turns vault notes into queryable, dynamic views — tables, cards, lists, maps — defined in `.base` files. No plugin required; it is a core Obsidian feature.
|
||||
Obsidian Bases (launched 2025) turns vault notes into queryable, dynamic views. Tables, cards, lists, maps. Defined in `.base` files. No plugin required; it is a core Obsidian feature.
|
||||
|
||||
**Authoritative reference**: `kepano/obsidian-skills` publishes the canonical `obsidian-bases` skill with full syntax and function reference. Use this skill alongside that one. Official docs: https://help.obsidian.md/bases/syntax
|
||||
|
||||
@@ -16,7 +16,7 @@ Obsidian Bases (launched 2025) turns vault notes into queryable, dynamic views
|
||||
`.base` files contain valid YAML. The root keys are `filters`, `formulas`, `properties`, `summaries`, and `views`.
|
||||
|
||||
```yaml
|
||||
# Global filters — apply to ALL views
|
||||
# Global filters: apply to ALL views
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("wiki")
|
||||
@@ -56,19 +56,19 @@ Filters select which notes appear. Applied globally or per-view.
|
||||
# Single string filter
|
||||
filters: 'status == "current"'
|
||||
|
||||
# AND — all must be true
|
||||
# AND: all must be true
|
||||
filters:
|
||||
and:
|
||||
- 'status != "archived"'
|
||||
- file.hasTag("wiki")
|
||||
|
||||
# OR — any can be true
|
||||
# OR: any can be true
|
||||
filters:
|
||||
or:
|
||||
- file.hasTag("concept")
|
||||
- file.hasTag("entity")
|
||||
|
||||
# NOT — exclude matches
|
||||
# NOT: exclude matches
|
||||
filters:
|
||||
not:
|
||||
- file.inFolder("wiki/meta")
|
||||
@@ -99,9 +99,9 @@ filters:
|
||||
## Properties
|
||||
|
||||
Three types:
|
||||
- **Note properties** — from frontmatter: `status`, `type`, `updated`
|
||||
- **File properties** — metadata: `file.name`, `file.mtime`, `file.size`, `file.ctime`, `file.tags`, `file.folder`
|
||||
- **Formula properties** — computed: `formula.age_days`
|
||||
- **Note properties**: from frontmatter: `status`, `type`, `updated`
|
||||
- **File properties**: metadata: `file.name`, `file.mtime`, `file.size`, `file.ctime`, `file.tags`, `file.folder`
|
||||
- **Formula properties**: computed: `formula.age_days`
|
||||
|
||||
---
|
||||
|
||||
@@ -124,12 +124,12 @@ formulas:
|
||||
word_est: '(file.size / 5).round(0)'
|
||||
```
|
||||
|
||||
**Key rule**: Subtracting two dates returns a `Duration` — not a number. Always access `.days` first:
|
||||
**Key rule**: Subtracting two dates returns a `Duration`. Not a number. Always access `.days` first:
|
||||
```yaml
|
||||
# CORRECT
|
||||
age: '(now() - file.ctime).days'
|
||||
|
||||
# WRONG — crashes
|
||||
# WRONG: crashes
|
||||
age: '(now() - file.ctime).round(0)'
|
||||
```
|
||||
|
||||
@@ -270,9 +270,9 @@ views:
|
||||
## Where to Save
|
||||
|
||||
Store `.base` files in `wiki/meta/` for vault dashboards:
|
||||
- `wiki/meta/dashboard.base` — main content view
|
||||
- `wiki/meta/entities.base` — entity tracker
|
||||
- `wiki/meta/sources.base` — ingestion log
|
||||
- `wiki/meta/dashboard.base`: main content view
|
||||
- `wiki/meta/entities.base`: entity tracker
|
||||
- `wiki/meta/sources.base`: ingestion log
|
||||
|
||||
---
|
||||
|
||||
@@ -286,7 +286,7 @@ Store `.base` files in `wiki/meta/` for vault dashboards:
|
||||
|
||||
## What Not to Do
|
||||
|
||||
- Do not use `from:` or `where:` — those are Dataview syntax, not Obsidian Bases
|
||||
- Do not use `sort:` at the root level — sorting is per-view via `order:` and `groupBy:`
|
||||
- Do not put `.base` files outside the vault — they only render inside Obsidian
|
||||
- Do not use `from:` or `where:`: those are Dataview syntax, not Obsidian Bases
|
||||
- Do not use `sort:` at the root level: sorting is per-view via `order:` and `groupBy:`
|
||||
- Do not put `.base` files outside the vault: they only render inside Obsidian
|
||||
- Do not reference `formula.X` in `order:` without defining `X` in `formulas:`
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
---
|
||||
name: obsidian-markdown
|
||||
description: "Write correct Obsidian Flavored Markdown — wikilinks, embeds, callouts, properties, tags, highlights, math, and canvas syntax. Reference this when creating or editing any wiki page. Triggers on: write obsidian note, obsidian syntax, wikilink, callout, embed, obsidian markdown."
|
||||
description: "Write correct Obsidian Flavored Markdown: wikilinks, embeds, callouts, properties, tags, highlights, math, and canvas syntax. Reference this when creating or editing any wiki page. Triggers on: write obsidian note, obsidian syntax, wikilink, callout, embed, obsidian markdown."
|
||||
---
|
||||
|
||||
# obsidian-markdown — Obsidian Flavored Markdown
|
||||
# obsidian-markdown: Obsidian Flavored Markdown
|
||||
|
||||
Reference this skill when writing any wiki page. Obsidian extends standard Markdown with wikilinks, embeds, callouts, and properties. Getting syntax wrong causes broken links, invisible callouts, or malformed frontmatter.
|
||||
|
||||
**Cross-reference**: `kepano/obsidian-skills` publishes the authoritative cross-platform version of this skill at [github.com/kepano/obsidian-skills](https://github.com/kepano/obsidian-skills). If installed, that skill is the canonical reference — use it alongside this one.
|
||||
**Cross-reference**: `kepano/obsidian-skills` publishes the authoritative cross-platform version of this skill at [github.com/kepano/obsidian-skills](https://github.com/kepano/obsidian-skills). If installed, that skill is the canonical reference. Use it alongside this one.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,16 +15,16 @@ Reference this skill when writing any wiki page. Obsidian extends standard Markd
|
||||
|
||||
Internal links use double brackets. The filename without extension.
|
||||
|
||||
```markdown
|
||||
[[Note Name]] — basic link
|
||||
[[Note Name|Display Text]] — aliased link (shows "Display Text")
|
||||
[[Note Name#Heading]] — link to a specific heading
|
||||
[[Note Name#^block-id]] — link to a specific block
|
||||
```
|
||||
| Syntax | What it does |
|
||||
|---|---|
|
||||
| `[[Note Name]]` | Basic link |
|
||||
| `[[Note Name\|Display Text]]` | Aliased link (shows "Display Text") |
|
||||
| `[[Note Name#Heading]]` | Link to a specific heading |
|
||||
| `[[Note Name#^block-id]]` | Link to a specific block |
|
||||
|
||||
Rules:
|
||||
- Case-sensitive on some systems. Match the exact filename.
|
||||
- No path needed — Obsidian resolves by filename uniqueness.
|
||||
- No path needed: Obsidian resolves by filename uniqueness.
|
||||
- If two files have the same name, use `[[Folder/Note Name]]` to disambiguate.
|
||||
|
||||
---
|
||||
@@ -33,14 +33,14 @@ Rules:
|
||||
|
||||
Embeds use `!` before the wikilink. They display the content inline.
|
||||
|
||||
```markdown
|
||||
![[Note Name]] — embed a full note
|
||||
![[Note Name#Heading]] — embed a section
|
||||
![[image.png]] — embed an image
|
||||
![[image.png|300]] — embed image with width 300px
|
||||
![[document.pdf]] — embed a PDF (Obsidian renders natively)
|
||||
![[audio.mp3]] — embed audio
|
||||
```
|
||||
| Syntax | What it does |
|
||||
|---|---|
|
||||
| `![[Note Name]]` | Embed a full note |
|
||||
| `![[Note Name#Heading]]` | Embed a section |
|
||||
| `![[image.png]]` | Embed an image |
|
||||
| `![[image.png\|300]]` | Embed image with width 300px |
|
||||
| `![[document.pdf]]` | Embed a PDF (Obsidian renders natively) |
|
||||
| `![[audio.mp3]]` | Embed audio |
|
||||
|
||||
---
|
||||
|
||||
@@ -66,20 +66,20 @@ Callouts are blockquotes with a type keyword. They render as styled alert boxes.
|
||||
|
||||
| Type | Aliases | Use for |
|
||||
|------|---------|---------|
|
||||
| `note` | — | General notes |
|
||||
| `note` |: | General notes |
|
||||
| `abstract` | `summary`, `tldr` | Summaries |
|
||||
| `info` | — | Information |
|
||||
| `todo` | — | Action items |
|
||||
| `info` |: | Information |
|
||||
| `todo` |: | Action items |
|
||||
| `tip` | `hint`, `important` | Tips and highlights |
|
||||
| `success` | `check`, `done` | Positive outcomes |
|
||||
| `question` | `help`, `faq` | Open questions |
|
||||
| `warning` | `caution`, `attention` | Warnings |
|
||||
| `failure` | `fail`, `missing` | Errors or failures |
|
||||
| `danger` | `error` | Critical issues |
|
||||
| `bug` | — | Known bugs |
|
||||
| `example` | — | Examples |
|
||||
| `bug` |: | Known bugs |
|
||||
| `example` |: | Examples |
|
||||
| `quote` | `cite` | Quotations |
|
||||
| `contradiction` | — | Conflicting information (wiki convention) |
|
||||
| `contradiction` |: | Conflicting information (wiki convention) |
|
||||
|
||||
---
|
||||
|
||||
@@ -118,8 +118,8 @@ Rules:
|
||||
Two valid forms:
|
||||
|
||||
```markdown
|
||||
#tag-name — inline tag anywhere in the body
|
||||
#parent/child-tag — nested tag (shows hierarchy in tag pane)
|
||||
#tag-name : inline tag anywhere in the body
|
||||
#parent/child-tag : nested tag (shows hierarchy in tag pane)
|
||||
```
|
||||
|
||||
In frontmatter:
|
||||
@@ -129,7 +129,7 @@ tags:
|
||||
- ai/obsidian
|
||||
```
|
||||
|
||||
Do not use `#` inside frontmatter tag lists — just the tag name.
|
||||
Do not use `#` inside frontmatter tag lists. Just the tag name.
|
||||
|
||||
---
|
||||
|
||||
@@ -137,13 +137,13 @@ Do not use `#` inside frontmatter tag lists — just the tag name.
|
||||
|
||||
Standard Markdown plus Obsidian extensions:
|
||||
|
||||
```markdown
|
||||
**bold** — bold
|
||||
*italic* — italic
|
||||
~~strikethrough~~ — strikethrough
|
||||
==highlight== — highlighted text (yellow in Obsidian)
|
||||
`inline code` — inline code
|
||||
```
|
||||
| Syntax | Result |
|
||||
|---|---|
|
||||
| `**bold**` | Bold |
|
||||
| `*italic*` | Italic |
|
||||
| `~~strikethrough~~` | Strikethrough |
|
||||
| `==highlight==` | Highlighted text (yellow in Obsidian) |
|
||||
| `` `inline code` `` | Inline code |
|
||||
|
||||
---
|
||||
|
||||
@@ -151,12 +151,16 @@ Standard Markdown plus Obsidian extensions:
|
||||
|
||||
Obsidian uses MathJax/KaTeX:
|
||||
|
||||
Inline math:
|
||||
```markdown
|
||||
$E = mc^2$ — inline math
|
||||
$E = mc^2$
|
||||
```
|
||||
|
||||
Block math:
|
||||
```markdown
|
||||
$$
|
||||
\int_0^\infty e^{-x} dx = 1
|
||||
$$ — block math
|
||||
$$
|
||||
```
|
||||
|
||||
---
|
||||
@@ -219,8 +223,8 @@ This sentence has a footnote.[^1]
|
||||
|
||||
## What NOT to Do
|
||||
|
||||
- Do not use `[link text](path/to/note.md)` for internal links — use `[[Note Name]]` instead.
|
||||
- Do not use HTML inside callouts — stick to Markdown.
|
||||
- Do not use `##` inside a callout body — headings don't render inside callouts.
|
||||
- Do not write `tags: [a, b, c]` inline in frontmatter — Obsidian prefers the list format.
|
||||
- Do not write ISO datetimes in frontmatter (`2026-04-08T00:00:00Z`) — use `2026-04-08`.
|
||||
- Do not use `[link text](path/to/note.md)` for internal links: use `[[Note Name]]` instead.
|
||||
- Do not use HTML inside callouts: stick to Markdown.
|
||||
- Do not use `##` inside a callout body: headings don't render inside callouts.
|
||||
- Do not write `tags: [a, b, c]` inline in frontmatter: Obsidian prefers the list format.
|
||||
- Do not write ISO datetimes in frontmatter (`2026-04-08T00:00:00Z`): use `2026-04-08`.
|
||||
|
||||
@@ -9,7 +9,7 @@ description: >
|
||||
"save this analysis", "add this to the wiki".
|
||||
---
|
||||
|
||||
# save — File Conversations Into the Wiki
|
||||
# save: File Conversations Into the Wiki
|
||||
|
||||
Good answers and insights shouldn't disappear into chat history. This skill takes what was just discussed and files it as a permanent wiki page.
|
||||
|
||||
@@ -27,7 +27,7 @@ Determine the best type from the conversation content:
|
||||
| concept | wiki/concepts/ | Explaining or defining an idea, pattern, or framework |
|
||||
| source | wiki/sources/ | Summary of external material discussed in the session |
|
||||
| decision | wiki/meta/ | Architectural, project, or strategic decision that was made |
|
||||
| session | wiki/meta/ | Full session summary — captures everything discussed |
|
||||
| session | wiki/meta/ | Full session summary: captures everything discussed |
|
||||
|
||||
If the user specifies a type, use that. If not, pick the best fit based on the content. When in doubt, use `synthesis`.
|
||||
|
||||
@@ -41,8 +41,8 @@ If the user specifies a type, use that. If not, pick the best fit based on the c
|
||||
4. **Extract** all relevant content from the conversation. Rewrite it in declarative present tense (not "the user asked" but the actual content itself).
|
||||
5. **Create** the note in the correct folder with full frontmatter.
|
||||
6. **Collect links**: identify any wiki pages mentioned in the conversation. Add them to `related` in frontmatter.
|
||||
7. **Update** `wiki/index.md` — add the new entry at the top of the relevant section.
|
||||
8. **Append** to `wiki/log.md` — new entry at the TOP:
|
||||
7. **Update** `wiki/index.md`. Add the new entry at the top of the relevant section.
|
||||
8. **Append** to `wiki/log.md`. New entry at the TOP:
|
||||
```
|
||||
## [YYYY-MM-DD] save | Note Title
|
||||
- Type: [note type]
|
||||
|
||||
@@ -3,11 +3,11 @@ name: wiki-ingest
|
||||
description: "Ingest sources into the Obsidian wiki vault. Reads a source, extracts entities and concepts, creates or updates wiki pages, cross-references, and logs the operation. Supports files, URLs, and batch mode. Triggers on: ingest, process this source, add this to the wiki, read and file this, batch ingest, ingest all of these, ingest this url."
|
||||
---
|
||||
|
||||
# wiki-ingest — Source Ingestion
|
||||
# wiki-ingest: Source Ingestion
|
||||
|
||||
Read the source. Write the wiki. Cross-reference everything. A single source typically touches 8-15 wiki pages.
|
||||
|
||||
**Syntax standard**: Write all Obsidian Markdown using proper Obsidian Flavored Markdown — wikilinks as `[[Note Name]]`, callouts as `> [!type] Title`, embeds as `![[file]]`, properties as YAML frontmatter. If kepano/obsidian-skills is installed, its `obsidian-markdown` skill is the authoritative syntax reference.
|
||||
**Syntax standard**: Write all Obsidian Markdown using proper Obsidian Flavored Markdown. Wikilinks as `[[Note Name]]`, callouts as `> [!type] Title`, embeds as `![[file]]`, properties as YAML frontmatter. If kepano/obsidian-skills is installed, its `obsidian-markdown` skill is the authoritative syntax reference.
|
||||
|
||||
---
|
||||
|
||||
@@ -37,8 +37,8 @@ Before ingesting any file, check `.raw/.manifest.json` to avoid re-processing un
|
||||
**Before ingesting a file:**
|
||||
1. Compute a hash: `md5sum [file] | cut -d' ' -f1` (or `sha256sum` on Linux).
|
||||
2. Check if the path exists in `.manifest.json` with the same hash.
|
||||
3. If hash matches — skip. Report: "Already ingested (unchanged). Use `force` to re-ingest."
|
||||
4. If missing or hash differs — proceed with ingest.
|
||||
3. If hash matches, skip. Report: "Already ingested (unchanged). Use `force` to re-ingest."
|
||||
4. If missing or hash differs, proceed with ingest.
|
||||
|
||||
**After ingesting a file:**
|
||||
1. Record `{hash, ingested_at, pages_created, pages_updated}` in `.manifest.json`.
|
||||
@@ -55,7 +55,7 @@ Trigger: user passes a URL starting with `https://`.
|
||||
Steps:
|
||||
|
||||
1. **Fetch** the page using WebFetch.
|
||||
2. **Clean** (optional): if `defuddle` is available (`which defuddle 2>/dev/null`), run `defuddle [url]` to strip ads, nav, and clutter — typically saves 40-60% tokens. Fall back to raw WebFetch output if not installed.
|
||||
2. **Clean** (optional): if `defuddle` is available (`which defuddle 2>/dev/null`), run `defuddle [url]` to strip ads, nav, and clutter. Typically saves 40-60% tokens. Fall back to raw WebFetch output if not installed.
|
||||
3. **Derive slug** from the URL path (last segment, lowercased, spaces→hyphens, strip query strings).
|
||||
4. **Save** to `.raw/articles/[slug]-[YYYY-MM-DD].md` with a frontmatter header:
|
||||
```markdown
|
||||
@@ -74,7 +74,7 @@ Trigger: user passes an image file path (`.png`, `.jpg`, `.jpeg`, `.gif`, `.webp
|
||||
|
||||
Steps:
|
||||
|
||||
1. **Read** the image file using the Read tool — Claude can process images natively.
|
||||
1. **Read** the image file using the Read tool. Claude can process images natively.
|
||||
2. **Describe** the image contents: extract all text (OCR), identify key concepts, entities, diagrams, and data visible in the image.
|
||||
3. **Save** the description to `.raw/images/[slug]-[YYYY-MM-DD].md`:
|
||||
```markdown
|
||||
@@ -153,13 +153,16 @@ Token budget matters. Follow these rules during ingest:
|
||||
|
||||
## Contradictions
|
||||
|
||||
> [!note] Custom callout dependency
|
||||
> The `[!contradiction]` callout type used below is a **custom callout** defined in `.obsidian/snippets/vault-colors.css` (auto-installed by `/wiki` scaffold). It renders with reddish-brown styling and an alert-triangle icon when the snippet is enabled. If the snippet is missing, Obsidian falls back to default callout styling, so the page still works without the visual flourish. See [[skills/wiki/references/css-snippets.md]] for the four custom callouts (`contradiction`, `gap`, `key-insight`, `stale`).
|
||||
|
||||
When new info contradicts an existing wiki page:
|
||||
|
||||
On the existing page, add:
|
||||
```markdown
|
||||
> [!contradiction] Conflict with [[New Source]]
|
||||
> [[Existing Page]] claims X. [[New Source]] says Y.
|
||||
> Needs resolution — check dates, context, and primary sources.
|
||||
> Needs resolution. Check dates, context, and primary sources.
|
||||
```
|
||||
|
||||
On the new source summary, reference it:
|
||||
|
||||
@@ -7,7 +7,7 @@ description: >
|
||||
"clean up wiki", "check the wiki", "wiki maintenance", "find orphans", "wiki audit".
|
||||
---
|
||||
|
||||
# wiki-lint — Wiki Health Check
|
||||
# wiki-lint: Wiki Health Check
|
||||
|
||||
Run lint after every 10-15 ingests, or weekly. Ask before auto-fixing anything. Output a lint report to `wiki/meta/lint-report-YYYY-MM-DD.md`.
|
||||
|
||||
@@ -17,14 +17,14 @@ Run lint after every 10-15 ingests, or weekly. Ask before auto-fixing anything.
|
||||
|
||||
Work through these in order:
|
||||
|
||||
1. **Orphan pages** — wiki pages with no inbound wikilinks. They exist but nothing points to them.
|
||||
2. **Dead links** — wikilinks that reference a page that does not exist.
|
||||
3. **Stale claims** — assertions on older pages that newer sources have contradicted or updated.
|
||||
4. **Missing pages** — concepts or entities mentioned in multiple pages but lacking their own page.
|
||||
5. **Missing cross-references** — entities mentioned in a page but not linked.
|
||||
6. **Frontmatter gaps** — pages missing required fields (type, status, created, updated, tags).
|
||||
7. **Empty sections** — headings with no content underneath.
|
||||
8. **Stale index entries** — items in `wiki/index.md` pointing to renamed or deleted pages.
|
||||
1. **Orphan pages**. Wiki pages with no inbound wikilinks. They exist but nothing points to them.
|
||||
2. **Dead links**. Wikilinks that reference a page that does not exist.
|
||||
3. **Stale claims**. Assertions on older pages that newer sources have contradicted or updated.
|
||||
4. **Missing pages**. Concepts or entities mentioned in multiple pages but lacking their own page.
|
||||
5. **Missing cross-references**. Entities mentioned in a page but not linked.
|
||||
6. **Frontmatter gaps**. Pages missing required fields (type, status, created, updated, tags).
|
||||
7. **Empty sections**. Headings with no content underneath.
|
||||
8. **Stale index entries**. Items in `wiki/index.md` pointing to renamed or deleted pages.
|
||||
|
||||
---
|
||||
|
||||
@@ -42,7 +42,7 @@ tags: [meta, lint]
|
||||
status: developing
|
||||
---
|
||||
|
||||
# Lint Report — YYYY-MM-DD
|
||||
# Lint Report: YYYY-MM-DD
|
||||
|
||||
## Summary
|
||||
- Pages scanned: N
|
||||
@@ -51,19 +51,19 @@ status: developing
|
||||
- Needs review: N
|
||||
|
||||
## Orphan Pages
|
||||
- [[Page Name]] — no inbound links. Suggest: link from [[Related Page]] or delete.
|
||||
- [[Page Name]]: no inbound links. Suggest: link from [[Related Page]] or delete.
|
||||
|
||||
## Dead Links
|
||||
- [[Missing Page]] — referenced in [[Source Page]] but does not exist. Suggest: create stub or remove link.
|
||||
- [[Missing Page]]: referenced in [[Source Page]] but does not exist. Suggest: create stub or remove link.
|
||||
|
||||
## Missing Pages
|
||||
- "concept name" — mentioned in [[Page A]], [[Page B]], [[Page C]]. Suggest: create a concept page.
|
||||
- "concept name": mentioned in [[Page A]], [[Page B]], [[Page C]]. Suggest: create a concept page.
|
||||
|
||||
## Frontmatter Gaps
|
||||
- [[Page Name]] — missing fields: status, tags
|
||||
- [[Page Name]]: missing fields: status, tags
|
||||
|
||||
## Stale Claims
|
||||
- [[Page Name]] — claim "X" may conflict with newer source [[Newer Source]].
|
||||
- [[Page Name]]: claim "X" may conflict with newer source [[Newer Source]].
|
||||
|
||||
## Cross-Reference Gaps
|
||||
- [[Entity Name]] mentioned in [[Page A]] without a wikilink.
|
||||
|
||||
@@ -3,7 +3,7 @@ name: wiki-query
|
||||
description: "Answer questions using the Obsidian wiki vault. Reads hot cache first, then index, then relevant pages. Synthesizes answers with citations. Files good answers back as wiki pages. Supports quick, standard, and deep modes. Triggers on: what do you know about, query:, what is, explain, summarize, find in wiki, search the wiki, based on the wiki, wiki query quick, wiki query deep."
|
||||
---
|
||||
|
||||
# wiki-query — Query the Wiki
|
||||
# wiki-query: Query the Wiki
|
||||
|
||||
The wiki has already done the synthesis work. Read strategically, answer precisely, and file good answers back so the knowledge compounds.
|
||||
|
||||
@@ -25,10 +25,10 @@ Three depths. Choose based on the question complexity.
|
||||
|
||||
Use when the answer is likely in the hot cache or index summary.
|
||||
|
||||
1. Read `wiki/hot.md`. If it answers the question — respond immediately.
|
||||
2. If not: read `wiki/index.md`. Scan descriptions for the answer.
|
||||
3. If found in index summary — respond. Do not open any pages.
|
||||
4. If not found — say "Not in quick cache. Run as standard query?"
|
||||
1. Read `wiki/hot.md`. If it answers the question, respond immediately.
|
||||
2. If not, read `wiki/index.md`. Scan descriptions for the answer.
|
||||
3. If found in index summary, respond and do not open any pages.
|
||||
4. If not found, say "Not in quick cache. Run as standard query?"
|
||||
|
||||
Do not open individual wiki pages in quick mode.
|
||||
|
||||
@@ -38,7 +38,7 @@ Do not open individual wiki pages in quick mode.
|
||||
|
||||
1. **Read** `wiki/hot.md` first. It may already have the answer or directly relevant context.
|
||||
2. **Read** `wiki/index.md` to find the most relevant pages (scan for titles and descriptions).
|
||||
3. **Read** those pages. Follow wikilinks to depth-2 for key entities — no deeper.
|
||||
3. **Read** those pages. Follow wikilinks to depth-2 for key entities. No deeper.
|
||||
4. **Synthesize** the answer in chat. Cite sources with wikilinks: `(Source: [[Page Name]])`.
|
||||
5. **Offer to file** the answer: "This analysis seems worth keeping. Should I save it as `wiki/questions/answer-name.md`?"
|
||||
6. If the question reveals a **gap**: say "I don't have enough on X. Want to find a source?"
|
||||
@@ -51,10 +51,10 @@ Use for synthesis questions, comparisons, or "tell me everything about X."
|
||||
|
||||
1. Read `wiki/hot.md` and `wiki/index.md`.
|
||||
2. Identify all relevant sections (concepts, entities, sources, comparisons).
|
||||
3. Read every relevant page — no skipping.
|
||||
3. Read every relevant page. No skipping.
|
||||
4. If wiki coverage is thin, offer to supplement with web search.
|
||||
5. Synthesize a comprehensive answer with full citations.
|
||||
6. Always file the result back as a wiki page — deep answers are too valuable to lose.
|
||||
6. Always file the result back as a wiki page. Deep answers are too valuable to lose.
|
||||
|
||||
---
|
||||
|
||||
@@ -79,19 +79,19 @@ The master index (`wiki/index.md`) looks like:
|
||||
|
||||
```markdown
|
||||
## Domains
|
||||
- [[Domain Name]] — description (N sources)
|
||||
- [[Domain Name]]: description (N sources)
|
||||
|
||||
## Entities
|
||||
- [[Entity Name]] — role (first: [[Source]])
|
||||
- [[Entity Name]]: role (first: [[Source]])
|
||||
|
||||
## Concepts
|
||||
- [[Concept Name]] — definition (status: developing)
|
||||
- [[Concept Name]]: definition (status: developing)
|
||||
|
||||
## Sources
|
||||
- [[Source Title]] — author, date, type
|
||||
- [[Source Title]]: author, date, type
|
||||
|
||||
## Questions
|
||||
- [[Question Title]] — answer summary
|
||||
- [[Question Title]]: answer summary
|
||||
```
|
||||
|
||||
Scan the section headers first to determine which sections to read.
|
||||
@@ -111,13 +111,13 @@ updated: YYYY-MM-DD
|
||||
# Entities
|
||||
|
||||
## People
|
||||
- [[Person Name]] — role, org
|
||||
- [[Person Name]]: role, org
|
||||
|
||||
## Organizations
|
||||
- [[Org Name]] — what they do
|
||||
- [[Org Name]]: what they do
|
||||
|
||||
## Products
|
||||
- [[Product Name]] — category
|
||||
- [[Product Name]]: category
|
||||
```
|
||||
|
||||
Use sub-indexes when the question is scoped to one domain. Avoid reading the full master index for narrow queries.
|
||||
|
||||
@@ -9,7 +9,7 @@ description: >
|
||||
"running notetaker", "persistent memory", "llm wiki".
|
||||
---
|
||||
|
||||
# wiki — Claude + Obsidian Knowledge Companion
|
||||
# wiki: Claude + Obsidian Knowledge Companion
|
||||
|
||||
You are a knowledge architect. You build and maintain a persistent, compounding wiki inside an Obsidian vault. You don't just answer questions. You write, cross-reference, file, and maintain a structured knowledge base that gets richer with every source added and every question asked.
|
||||
|
||||
@@ -74,7 +74,7 @@ updated: YYYY-MM-DDTHH:MM:SS
|
||||
# Recent Context
|
||||
|
||||
## Last Updated
|
||||
YYYY-MM-DD — [what happened]
|
||||
YYYY-MM-DD. [what happened]
|
||||
|
||||
## Key Recent Facts
|
||||
- [Most important recent takeaway]
|
||||
@@ -132,7 +132,7 @@ Steps:
|
||||
Create this file in the vault root when scaffolding a new project vault (not this plugin directory):
|
||||
|
||||
```markdown
|
||||
# [WIKI NAME] — LLM Wiki
|
||||
# [WIKI NAME]: LLM Wiki
|
||||
|
||||
Mode: [MODE A/B/C/D/E/F]
|
||||
Purpose: [ONE SENTENCE]
|
||||
@@ -146,16 +146,16 @@ Created: YYYY-MM-DD
|
||||
## Conventions
|
||||
|
||||
- All notes use YAML frontmatter: type, status, created, updated, tags (minimum)
|
||||
- Wikilinks use [[Note Name]] format — filenames are unique, no paths needed
|
||||
- .raw/ contains source documents — never modify them
|
||||
- wiki/index.md is the master catalog — update on every ingest
|
||||
- wiki/log.md is append-only — never edit past entries
|
||||
- Wikilinks use [[Note Name]] format: filenames are unique, no paths needed
|
||||
- .raw/ contains source documents: never modify them
|
||||
- wiki/index.md is the master catalog: update on every ingest
|
||||
- wiki/log.md is append-only: never edit past entries
|
||||
- New log entries go at the TOP of the file
|
||||
|
||||
## Operations
|
||||
|
||||
- Ingest: drop source in .raw/, say "ingest [filename]"
|
||||
- Query: ask any question — Claude reads index first, then drills in
|
||||
- Query: ask any question: Claude reads index first, then drills in
|
||||
- Lint: say "lint the wiki" to run a health check
|
||||
- Archive: move cold sources to .archive/ to keep .raw/ clean
|
||||
```
|
||||
|
||||
@@ -71,7 +71,18 @@ Guide the user to set these in Graph View settings (click the settings icon in t
|
||||
|
||||
---
|
||||
|
||||
## How the Callouts Look
|
||||
## Custom Callouts
|
||||
|
||||
This vault defines **four custom callout types** beyond Obsidian's built-in set (`note`, `tip`, `warning`, `info`, `todo`, `success`, `question`, `failure`, `danger`, `bug`, `example`, `quote`). They render correctly **only when `vault-colors.css` is enabled**. Without the snippet, they fall back to default callout styling (still readable, just plain).
|
||||
|
||||
| Custom callout | Color | Icon | Use for |
|
||||
|---|---|---|---|
|
||||
| `contradiction` | reddish-brown (rgb 209,105,105) | `lucide-alert-triangle` | New source conflicts with existing claim |
|
||||
| `gap` | beige (rgb 220,220,170) | `lucide-help-circle` | Topic has no source yet |
|
||||
| `key-insight` | bright blue (rgb 79,193,255) | `lucide-lightbulb` | Important takeaway worth highlighting |
|
||||
| `stale` | gray (rgb 128,128,128) | `lucide-clock` | Claim may be outdated, source older than threshold |
|
||||
|
||||
### Usage
|
||||
|
||||
Use these in wiki pages to flag important states:
|
||||
|
||||
@@ -89,6 +100,21 @@ Use these in wiki pages to flag important states:
|
||||
> This claim may be outdated. Source was from 2022.
|
||||
```
|
||||
|
||||
### Why custom callouts (vs built-in)
|
||||
|
||||
The four custom types map to wiki-specific concepts that don't fit cleanly into Obsidian's default set:
|
||||
|
||||
- `contradiction` is more specific than `warning`: it signals a **resolvable conflict** between two wiki pages, not a generic warning.
|
||||
- `gap` is more specific than `question`: it signals a **missing source**, an actionable improvement.
|
||||
- `key-insight` is more specific than `tip`: it marks **the** most important takeaway from a section, used sparingly.
|
||||
- `stale` has no built-in equivalent: it signals time-based decay of a claim.
|
||||
|
||||
If you don't want custom callouts, replace them with built-ins:
|
||||
- `[!contradiction]` → `[!warning] Contradiction`
|
||||
- `[!gap]` → `[!question] Gap`
|
||||
- `[!key-insight]` → `[!tip] Key insight`
|
||||
- `[!stale]` → `[!warning] Stale`
|
||||
|
||||
---
|
||||
|
||||
## Minimal Theme (Recommended)
|
||||
|
||||
@@ -26,10 +26,10 @@ sources:
|
||||
```
|
||||
|
||||
**status values:**
|
||||
- `seed` — exists, barely populated
|
||||
- `developing` — has real content, not yet complete
|
||||
- `mature` — comprehensive, well-linked
|
||||
- `evergreen` — unlikely to need updates
|
||||
- `seed`: exists, barely populated
|
||||
- `developing`: has real content, not yet complete
|
||||
- `mature`: comprehensive, well-linked
|
||||
- `evergreen`: unlikely to need updates
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
# MCP Setup
|
||||
|
||||
MCP lets Claude read and write vault notes directly without copy-paste. Two options.
|
||||
MCP lets Claude read and write vault notes directly without copy-paste. Four options ordered from simplest to most featureful.
|
||||
|
||||
> [!tip] Recommendation
|
||||
> If you have **Obsidian v1.12 or newer**, start with **Option D: Obsidian CLI**. It needs no MCP server, no plugins, and no TLS workarounds. Use Options A or B only if you need persistent MCP integration or are on an older Obsidian version.
|
||||
|
||||
---
|
||||
|
||||
@@ -41,7 +44,8 @@ claude mcp add-json obsidian-vault '{
|
||||
}' --scope user
|
||||
```
|
||||
|
||||
`NODE_TLS_REJECT_UNAUTHORIZED: "0"` is required because the REST API uses a self-signed certificate.
|
||||
> [!warning] Security
|
||||
> `NODE_TLS_REJECT_UNAUTHORIZED: "0"` **disables TLS certificate verification process-wide** for the MCP server. It is required here because the Local REST API plugin uses a self-signed certificate. This is acceptable for `127.0.0.1` (localhost) connections only. Never use this setting for any non-loopback connection. If you are uncomfortable with the global TLS bypass, prefer **Option D (Obsidian CLI)** or **Option B (filesystem-based)** which avoid this entirely.
|
||||
|
||||
Capabilities: read notes, write notes, search, patch frontmatter fields, append under headings.
|
||||
|
||||
@@ -71,6 +75,45 @@ No MCP needed. Use curl in bash throughout the session. See `rest-api.md` for al
|
||||
|
||||
---
|
||||
|
||||
## Option D: Obsidian CLI (recommended for v1.12+)
|
||||
|
||||
Obsidian shipped a native CLI in v1.12 (2026). It exposes vault operations directly to the terminal. No REST API plugin, no MCP server, no self-signed certs, no TLS workarounds. Claude calls it through the Bash tool.
|
||||
|
||||
**Check if available:**
|
||||
```bash
|
||||
which obsidian-cli 2>/dev/null && obsidian-cli --version
|
||||
# or, on flatpak:
|
||||
flatpak run md.obsidian.Obsidian --cli --version
|
||||
```
|
||||
|
||||
**Common operations:**
|
||||
```bash
|
||||
# List all notes in a folder
|
||||
obsidian-cli list /path/to/vault wiki/
|
||||
|
||||
# Read a note
|
||||
obsidian-cli read /path/to/vault wiki/index.md
|
||||
|
||||
# Create or update a note
|
||||
obsidian-cli write /path/to/vault wiki/new-note.md < content.md
|
||||
|
||||
# Search notes by content
|
||||
obsidian-cli search /path/to/vault "query term"
|
||||
```
|
||||
|
||||
**Why prefer this**:
|
||||
- No plugin install required (CLI is built into Obsidian)
|
||||
- No MCP server process to manage
|
||||
- No TLS certificate bypass needed
|
||||
- Survives Obsidian restarts (no persistent connection)
|
||||
- Works identically across desktop and headless environments
|
||||
|
||||
**When to use Options A/B/C instead**: If you need persistent semantic search, frontmatter patching, or are on Obsidian < v1.12.
|
||||
|
||||
The `kepano/obsidian-skills` repo includes an `obsidian-cli` skill that wraps these commands as reusable patterns. Install it alongside this plugin for first-class CLI support.
|
||||
|
||||
---
|
||||
|
||||
## Use `--scope user`
|
||||
|
||||
Both MCP options use `--scope user` so the vault is available across all Claude Code projects, not just the one where you ran the command.
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Install Obsidian
|
||||
|
||||
### Linux (Flatpak — recommended)
|
||||
### Linux (Flatpak: recommended)
|
||||
|
||||
Check if installed:
|
||||
```bash
|
||||
@@ -41,28 +41,39 @@ After installing: Obsidian > Manage Vaults > Open Folder as Vault > select your
|
||||
|
||||
---
|
||||
|
||||
## Recommended Plugins
|
||||
## Core Plugins (Built-in: No Install Required)
|
||||
|
||||
These ship with Obsidian. Enable them in Settings > Core Plugins:
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| **Bases** | Native database-like views for `.base` files. Powers `wiki/meta/dashboard.base`. Available since Obsidian v1.9.10 (August 2025). **Replaces Dataview for most wiki use cases.** |
|
||||
| **Properties** | Visual frontmatter editor. Always enabled. |
|
||||
| **Backlinks** | Outgoing/incoming links pane. |
|
||||
| **Outline** | Document heading navigation. |
|
||||
|
||||
## Recommended Community Plugins
|
||||
|
||||
Install via Settings > Community Plugins > Turn off Restricted Mode > Browse.
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| **Dataview** | Query vault as a database. Powers dashboards in `wiki/meta/`. |
|
||||
| **Templater** | Auto-populate frontmatter on note creation from `_templates/`. |
|
||||
| **Obsidian Git** | Auto-commit every 15 minutes. Protects against bad writes. |
|
||||
| **Calendar** | Right-sidebar calendar with word count, task, and link indicators. Pre-installed in this vault via `.obsidian/plugins/calendar/`. |
|
||||
| **Thino** | Quick memo capture panel in right sidebar. Pre-installed via `.obsidian/plugins/thino/`. |
|
||||
| **Iconize** | Visual folder icons for navigation. |
|
||||
| **Minimal Theme** | Best dark theme for dense information display. |
|
||||
| **Dataview** *(optional/legacy)* | Only needed if you're on Obsidian < 1.9.10 or want to use the legacy `dashboard.md` queries. The primary dashboard now uses Bases. |
|
||||
|
||||
**Calendar and Thino are pre-installed** — they ship with this vault. Enable them in Settings → Community Plugins → toggle on. No download needed.
|
||||
**Calendar and Thino are pre-installed**. They ship with this vault. Enable them in Settings → Community Plugins → toggle on. No download needed.
|
||||
|
||||
If installing in a different vault: download `main.js` + `manifest.json` from their GitHub releases into `.obsidian/plugins/calendar/` and `.obsidian/plugins/thino/` respectively.
|
||||
|
||||
Optional additions:
|
||||
- **Smart Connections** — semantic search across all notes
|
||||
- **QuickAdd** — macros for fast note creation
|
||||
- **Folder Notes** — click a folder to open an overview note
|
||||
- **Smart Connections**: semantic search across all notes
|
||||
- **QuickAdd**: macros for fast note creation
|
||||
- **Folder Notes**: click a folder to open an overview note
|
||||
|
||||
---
|
||||
|
||||
@@ -78,7 +89,8 @@ Set the default folder to `.raw/` in the extension settings.
|
||||
|
||||
## After Installing Plugins
|
||||
|
||||
1. Enable Dataview: Settings > Community Plugins > toggle on
|
||||
1. Enable Bases: Settings > Core Plugins > toggle on (already on by default in Obsidian v1.9.10+)
|
||||
2. Enable Templater: Settings > Templater > set template folder to `_templates`
|
||||
3. Enable Obsidian Git: Settings > Obsidian Git > Auto backup interval: 15 minutes
|
||||
4. Enable the CSS snippet: Settings > Appearance > CSS Snippets > toggle on `vault-colors`
|
||||
5. *(Optional)* Enable Dataview only if you want the legacy `wiki/meta/dashboard.md` queries to work alongside the primary `dashboard.base`
|
||||
|
||||
Reference in New Issue
Block a user