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:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-obsidian",
|
||||
"version": "1.3.0",
|
||||
"version": "1.4.0",
|
||||
"description": "Claude + Obsidian knowledge companion. Sets up a persistent, compounding wiki vault. Covers memory management, session notetaking, knowledge organization, and agent context across projects. Based on Andrej Karpathy's LLM Wiki pattern.",
|
||||
"author": {
|
||||
"name": "AgriciDaniel",
|
||||
|
||||
65
.cursor/rules/claude-obsidian.mdc
Normal file
65
.cursor/rules/claude-obsidian.mdc
Normal file
@@ -0,0 +1,65 @@
|
||||
---
|
||||
description: claude-obsidian: LLM Wiki Pattern for Obsidian vaults. Always-on context for any project pointed at this repo.
|
||||
globs:
|
||||
- "wiki/**/*.md"
|
||||
- ".raw/**/*"
|
||||
- "skills/**/SKILL.md"
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# claude-obsidian
|
||||
|
||||
A Claude Code plugin and Obsidian vault that builds persistent, compounding knowledge bases using Andrej Karpathy's LLM Wiki pattern. This repo works with Cursor's AI through the cross-platform Agent Skills format.
|
||||
|
||||
## What This Project Is
|
||||
|
||||
- **Vault root**: contains `wiki/` (agent-generated knowledge) and `.raw/` (source documents: immutable)
|
||||
- **Hot cache**: `wiki/hot.md` (~500 tokens) holds recent session context
|
||||
- **Index**: `wiki/index.md` is the master catalog Claude reads first
|
||||
- **Skills**: 10 skills under `skills/<name>/SKILL.md` define ingest/query/lint/save/canvas/etc
|
||||
|
||||
## Skills Available
|
||||
|
||||
| Skill | When to use |
|
||||
|---|---|
|
||||
| `wiki` | Scaffold new vault, route to sub-skills |
|
||||
| `wiki-ingest` | Ingest a file, URL, or image: creates 8-15 wiki pages |
|
||||
| `wiki-query` | Answer questions from the wiki (Quick / Standard / Deep modes) |
|
||||
| `wiki-lint` | Health check: orphans, dead links, gaps |
|
||||
| `save` | File current conversation as a wiki note |
|
||||
| `autoresearch` | Autonomous research loop |
|
||||
| `canvas` | Create/edit Obsidian canvas files |
|
||||
| `defuddle` | Clean web pages before ingest |
|
||||
| `obsidian-markdown` | Obsidian syntax reference |
|
||||
| `obsidian-bases` | Obsidian Bases (.base files) |
|
||||
|
||||
Read the relevant `skills/<name>/SKILL.md` file when the user's request matches a skill's trigger phrases.
|
||||
|
||||
## Critical Conventions
|
||||
|
||||
1. **Never modify `.raw/`**. Sources are immutable
|
||||
2. **Read `wiki/hot.md` first** when starting a session (if it exists)
|
||||
3. **Use wikilinks** (`[[Note Name]]`) for all internal references in wiki pages
|
||||
4. **Frontmatter is flat YAML**. See `skills/wiki/references/frontmatter.md`
|
||||
5. **Append to `wiki/log.md`**, never edit past entries
|
||||
6. **Hot cache is overwritten** at session end (it's a cache, not a journal)
|
||||
|
||||
## Setup for Cursor
|
||||
|
||||
To make these skills first-class in Cursor, run:
|
||||
|
||||
```bash
|
||||
ln -s "$(pwd)/skills" .cursor/skills
|
||||
```
|
||||
|
||||
Or use the bundled installer:
|
||||
|
||||
```bash
|
||||
bash bin/setup-multi-agent.sh
|
||||
```
|
||||
|
||||
## Cross-Reference
|
||||
|
||||
- Plugin: https://github.com/AgriciDaniel/claude-obsidian
|
||||
- Pattern: https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f
|
||||
- Related: https://github.com/kepano/obsidian-skills
|
||||
51
.github/copilot-instructions.md
vendored
Normal file
51
.github/copilot-instructions.md
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
# claude-obsidian: GitHub Copilot Instructions
|
||||
|
||||
This repository is a **Claude Code plugin and Obsidian vault** that builds persistent, compounding knowledge bases using Andrej Karpathy's LLM Wiki pattern. It is markdown-only. No build step, no compiled code, no runtime dependencies.
|
||||
|
||||
## Project Type
|
||||
|
||||
- Agent Skills package (cross-platform Agent Skills standard)
|
||||
- Obsidian vault (interpretable by Obsidian directly)
|
||||
- Claude Code plugin (installable via marketplace)
|
||||
|
||||
## Repository Layout
|
||||
|
||||
- `skills/`: 10 skills, each with a `SKILL.md` defining trigger phrases and instructions
|
||||
- `hooks/hooks.json`: Claude Code lifecycle hooks (SessionStart, PostCompact, PostToolUse, Stop)
|
||||
- `.claude-plugin/plugin.json`: plugin manifest
|
||||
- `wiki/`: generated knowledge base (Markdown files with YAML frontmatter)
|
||||
- `.raw/`: immutable source documents (never modify)
|
||||
- `_templates/`: Obsidian Templater templates
|
||||
- `_attachments/`: images and PDFs referenced by wiki pages
|
||||
|
||||
## Conventions Copilot Should Follow
|
||||
|
||||
When suggesting edits:
|
||||
|
||||
1. **Frontmatter is flat YAML** with plural keys: `tags`, `aliases`, `cssclasses`
|
||||
2. **Internal links are wikilinks**: `[[Note Name]]`, not Markdown links to `.md` paths
|
||||
3. **Dates are `YYYY-MM-DD`**, not ISO datetimes
|
||||
4. **`.raw/` is immutable**. Never suggest edits to anything under that path
|
||||
5. **`wiki/log.md` is append-only**, with new entries at the top
|
||||
6. **`wiki/hot.md` is overwritten** at session end, not appended to
|
||||
7. **Skills use only `name` and `description` in frontmatter**. No `allowed-tools`, no `triggers`, no `globs` (these are not part of the Agent Skills spec)
|
||||
8. **Custom callouts**: this vault defines `[!contradiction]`, `[!gap]`, `[!key-insight]`, `[!stale]` in `.obsidian/snippets/vault-colors.css`. These render only with that snippet enabled.
|
||||
|
||||
## When Editing Skills (`skills/<name>/SKILL.md`)
|
||||
|
||||
- Frontmatter: `name` (matches directory name) and `description` (single quoted line, max ~250 useful chars)
|
||||
- Body: short, imperative instructions. Reference files with backticks. Do not paste large code blocks unless they're essential.
|
||||
- Trigger phrases go in the `description` field, not in body or non-standard fields
|
||||
|
||||
## When Editing Hooks (`hooks/hooks.json`)
|
||||
|
||||
- Valid event names only: `SessionStart`, `Stop`, `PreToolUse`, `PostToolUse`, `PreCompact`, `PostCompact`, `UserPromptSubmit`
|
||||
- Hook types: `command` (shell), `prompt` (LLM), `http` (POST), `agent` (subagent)
|
||||
- `matcher` field uses regex against tool names for `PreToolUse`/`PostToolUse`
|
||||
- For `SessionStart`: matcher uses `startup`, `resume`, `clear`, or `compact`
|
||||
|
||||
## Cross-Reference
|
||||
|
||||
- Plugin: https://github.com/AgriciDaniel/claude-obsidian
|
||||
- Pattern source: https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f
|
||||
- Authoritative Obsidian-specific skills: https://github.com/kepano/obsidian-skills
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -45,6 +45,8 @@ Cosmic Brain*.png
|
||||
Untitled *.canvas
|
||||
Untitled.base
|
||||
*.base
|
||||
# Track our committed dashboard.base (Bases dashboard shipped with the vault)
|
||||
!wiki/meta/dashboard.base
|
||||
|
||||
# Scratch canvases and personal vault files
|
||||
Banana Images.canvas
|
||||
|
||||
64
.windsurf/rules/claude-obsidian.md
Normal file
64
.windsurf/rules/claude-obsidian.md
Normal file
@@ -0,0 +1,64 @@
|
||||
# claude-obsidian: Windsurf Rules
|
||||
|
||||
This repo is a knowledge companion that builds persistent, compounding Obsidian wiki vaults using Andrej Karpathy's LLM Wiki pattern. The skills are written in the cross-platform Agent Skills format and work in Cascade alongside Claude Code.
|
||||
|
||||
## Project Type
|
||||
|
||||
- **Hybrid**: Claude Code plugin + Obsidian vault
|
||||
- **Pattern**: LLM Wiki (Karpathy)
|
||||
- **Stack**: Markdown only: no build step, no runtime dependencies
|
||||
|
||||
## What's In This Repo
|
||||
|
||||
```
|
||||
claude-obsidian/
|
||||
├── skills/ ← 10 SKILL.md files (Agent Skills format)
|
||||
├── hooks/ ← SessionStart, PostCompact, PostToolUse, Stop
|
||||
├── .claude-plugin/ ← Claude Code plugin manifest
|
||||
├── _templates/ ← Obsidian Templater templates
|
||||
├── wiki/ ← Generated knowledge base
|
||||
│ ├── hot.md ← recent context cache (~500 tokens)
|
||||
│ ├── index.md ← master catalog
|
||||
│ ├── log.md ← append-only operation log
|
||||
│ ├── concepts/, entities/, sources/, comparisons/, questions/
|
||||
│ └── meta/dashboard.base ← Obsidian Bases dashboard
|
||||
└── .raw/ ← Immutable source documents
|
||||
```
|
||||
|
||||
## Skills Available to Cascade
|
||||
|
||||
Run `bash bin/setup-multi-agent.sh` once to symlink `skills/` into `.windsurf/skills/`. Then Cascade auto-discovers all 10 skills:
|
||||
|
||||
- `wiki`: orchestration, vault scaffolding, hot cache
|
||||
- `wiki-ingest`: files, URLs, images → 8-15 wiki pages
|
||||
- `wiki-query`: Quick / Standard / Deep query modes
|
||||
- `wiki-lint`: health check (orphans, dead links, gaps)
|
||||
- `save`: file conversation as wiki note
|
||||
- `autoresearch`: autonomous research loop
|
||||
- `canvas`: Obsidian canvas (.canvas) files
|
||||
- `defuddle`: clean web pages before ingest
|
||||
- `obsidian-markdown`: full Obsidian syntax reference
|
||||
- `obsidian-bases`: Obsidian Bases (.base) database views
|
||||
|
||||
## Critical Rules
|
||||
|
||||
- **Never modify `.raw/`**: those are source documents
|
||||
- **Read `wiki/hot.md` silently at session start** to restore context
|
||||
- **Use wikilinks** `[[Note Name]]` for all internal references
|
||||
- **Frontmatter is flat YAML** with plural keys (`tags`, `aliases`)
|
||||
- **Auto-commit hook** fires on every Write/Edit to `wiki/` and `.raw/`
|
||||
- **Append to `wiki/log.md`** at the top, never edit past entries
|
||||
|
||||
## Bootstrap
|
||||
|
||||
When the user opens this project in Windsurf:
|
||||
|
||||
1. Read this rules file
|
||||
2. If `wiki/hot.md` exists, silently read it
|
||||
3. Wait for triggers like "set up wiki", "ingest", or "query"
|
||||
|
||||
## Links
|
||||
|
||||
- https://github.com/AgriciDaniel/claude-obsidian
|
||||
- https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f
|
||||
- https://github.com/kepano/obsidian-skills
|
||||
61
AGENTS.md
Normal file
61
AGENTS.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# claude-obsidian: Agent Instructions
|
||||
|
||||
This repo is a Claude Code plugin **and** an Obsidian vault that builds persistent, compounding knowledge bases using Andrej Karpathy's LLM Wiki pattern. It works with **any AI coding agent** that supports the Agent Skills standard, including Codex CLI, OpenCode, and similar.
|
||||
|
||||
Originally built for Claude Code, the skills now follow the cross-platform Agent Skills spec. Frontmatter uses only `name` and `description` (no Claude-specific extensions).
|
||||
|
||||
## Skills Discovery
|
||||
|
||||
All skills live in `skills/<name>/SKILL.md`. Codex / OpenCode / other Agent Skills compatible agents will auto-discover them when you symlink the directory:
|
||||
|
||||
```bash
|
||||
# Codex CLI
|
||||
ln -s "$(pwd)/skills" ~/.codex/skills/claude-obsidian
|
||||
|
||||
# OpenCode
|
||||
ln -s "$(pwd)/skills" ~/.opencode/skills/claude-obsidian
|
||||
```
|
||||
|
||||
Or run the bundled installer:
|
||||
|
||||
```bash
|
||||
bash bin/setup-multi-agent.sh
|
||||
```
|
||||
|
||||
## Available Skills
|
||||
|
||||
| Skill | Trigger phrases |
|
||||
|---|---|
|
||||
| `wiki` | `/wiki`, set up wiki, scaffold vault |
|
||||
| `wiki-ingest` | ingest, ingest this url, ingest this image, batch ingest |
|
||||
| `wiki-query` | query, what do you know about, query quick:, query deep: |
|
||||
| `wiki-lint` | lint the wiki, health check, find orphans |
|
||||
| `save` | /save, file this conversation |
|
||||
| `autoresearch` | autoresearch, autonomous research loop |
|
||||
| `canvas` | /canvas, add to canvas, create canvas |
|
||||
| `defuddle` | clean this url, defuddle |
|
||||
| `obsidian-markdown` | obsidian syntax, wikilink, callout |
|
||||
| `obsidian-bases` | obsidian bases, .base file, dynamic table |
|
||||
|
||||
## Key Conventions
|
||||
|
||||
- **Vault root**: the directory containing `wiki/` and `.raw/`
|
||||
- **Hot cache**: `wiki/hot.md` (read at session start, updated at session end)
|
||||
- **Source documents**: `.raw/` (immutable: agents never modify these)
|
||||
- **Generated knowledge**: `wiki/` (agent-owned, links to sources via wikilinks)
|
||||
- **Manifest**: `.raw/.manifest.json` tracks ingested sources (delta tracking)
|
||||
|
||||
## Bootstrap
|
||||
|
||||
When the user opens this project for the first time:
|
||||
|
||||
1. Read this file (`AGENTS.md`) and the project `CLAUDE.md` for full context
|
||||
2. Read `skills/wiki/SKILL.md` for the orchestration pattern
|
||||
3. If `wiki/hot.md` exists, read it silently to restore recent context
|
||||
4. If the user types `/wiki` (or "set up wiki"), follow the wiki skill's scaffold workflow
|
||||
|
||||
## Reference
|
||||
|
||||
- Plugin homepage: https://github.com/AgriciDaniel/claude-obsidian
|
||||
- Pattern source: https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f
|
||||
- Cross-reference: https://github.com/kepano/obsidian-skills (authoritative Obsidian-specific skills)
|
||||
62
GEMINI.md
Normal file
62
GEMINI.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# claude-obsidian: Gemini CLI Instructions
|
||||
|
||||
This repo is a knowledge base companion that builds persistent, compounding Obsidian wiki vaults using Andrej Karpathy's LLM Wiki pattern. The skills are written in the cross-platform Agent Skills format and work in Gemini CLI / Antigravity alongside Claude Code.
|
||||
|
||||
## Skills Discovery
|
||||
|
||||
Skills live in `skills/<name>/SKILL.md`. To make them available to Gemini CLI:
|
||||
|
||||
```bash
|
||||
ln -s "$(pwd)/skills" ~/.gemini/skills/claude-obsidian
|
||||
```
|
||||
|
||||
Or run the bundled installer:
|
||||
|
||||
```bash
|
||||
bash bin/setup-multi-agent.sh
|
||||
```
|
||||
|
||||
## Skills
|
||||
|
||||
| Skill | What it does |
|
||||
|---|---|
|
||||
| `wiki` | Scaffolds a new vault, manages hot cache, routes to sub-skills |
|
||||
| `wiki-ingest` | Reads sources (files, URLs, images) and creates 8-15 wiki pages each |
|
||||
| `wiki-query` | Answers questions from the wiki with three depth modes |
|
||||
| `wiki-lint` | Health checks: orphans, dead links, stale claims, gaps |
|
||||
| `save` | Files the current conversation as a wiki note |
|
||||
| `autoresearch` | Autonomous research loop: search → fetch → synthesize → file |
|
||||
| `canvas` | Creates and edits Obsidian canvas (.canvas) files |
|
||||
| `defuddle` | Cleans web pages before ingest (saves 40-60% tokens) |
|
||||
| `obsidian-markdown` | Obsidian Flavored Markdown syntax reference |
|
||||
| `obsidian-bases` | Obsidian Bases (.base files): native database views |
|
||||
|
||||
## Trigger Phrases (Examples)
|
||||
|
||||
- "set up wiki" → `wiki`
|
||||
- "ingest this article" → `wiki-ingest`
|
||||
- "ingest https://example.com/article" → `wiki-ingest` (URL mode)
|
||||
- "what do you know about X" → `wiki-query`
|
||||
- "lint the wiki" → `wiki-lint`
|
||||
- "save this conversation" → `save`
|
||||
- "research [topic]" → `autoresearch`
|
||||
|
||||
## Vault Conventions
|
||||
|
||||
- `.raw/`: source documents, immutable (never modify)
|
||||
- `wiki/`: agent-generated knowledge (you own this)
|
||||
- `wiki/hot.md`: recent context cache (~500 tokens), read first at session start
|
||||
- `wiki/index.md`: master catalog
|
||||
- `.raw/.manifest.json`: delta tracking for ingest
|
||||
|
||||
## Bootstrap
|
||||
|
||||
On first session:
|
||||
1. Read this file + the project `CLAUDE.md`
|
||||
2. If `wiki/hot.md` exists, silently read it to restore recent context
|
||||
3. Wait for user to type `/wiki` or `ingest` or `query`
|
||||
|
||||
## Project Links
|
||||
|
||||
- Plugin: https://github.com/AgriciDaniel/claude-obsidian
|
||||
- Pattern: https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f
|
||||
70
README.md
70
README.md
@@ -14,7 +14,7 @@ Based on Andrej Karpathy's LLM Wiki pattern.
|
||||
## What It Does
|
||||
|
||||
<p align="center">
|
||||
<img src="wiki/meta/welcome-canvas.gif" alt="Welcome canvas — visual demo board" width="96%" />
|
||||
<img src="wiki/meta/welcome-canvas.gif" alt="Welcome canvas. Visual demo board" width="96%" />
|
||||
</p>
|
||||
|
||||
You drop sources. Claude reads them, extracts entities and concepts, updates cross-references, and files everything into a structured Obsidian vault. The wiki gets richer with every ingest.
|
||||
@@ -26,7 +26,7 @@ You lint. Claude finds orphans, dead links, stale claims, and missing cross-refe
|
||||
At the end of every session, Claude updates a hot cache. The next session starts with full recent context, no recap needed.
|
||||
|
||||
<p align="center">
|
||||
<img src="wiki/meta/image-example-graph-view.png" alt="Graph view — color-coded wiki nodes" width="48%" />
|
||||
<img src="wiki/meta/image-example-graph-view.png" alt="Graph view. Color-coded wiki nodes" width="48%" />
|
||||
<img src="wiki/meta/image-example-wiki-map-view.png" alt="Wiki Map canvas" width="48%" />
|
||||
</p>
|
||||
|
||||
@@ -34,7 +34,7 @@ At the end of every session, Claude updates a hot cache. The next session starts
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Option 1: Clone as vault (recommended — full setup in 2 minutes)
|
||||
### Option 1: Clone as vault (recommended: full setup in 2 minutes)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/AgriciDaniel/claude-obsidian
|
||||
@@ -56,7 +56,7 @@ Open Claude Code in the same folder. Type `/wiki`.
|
||||
claude plugin install github:AgriciDaniel/claude-obsidian
|
||||
```
|
||||
|
||||
In any Claude Code session: `/wiki` — Claude walks you through vault setup.
|
||||
In any Claude Code session: `/wiki`. Claude walks you through vault setup.
|
||||
|
||||
---
|
||||
|
||||
@@ -138,14 +138,15 @@ Modes can be combined.
|
||||
|
||||
A typical scaffold creates:
|
||||
- Folder structure for your chosen mode
|
||||
- `wiki/index.md` — master catalog
|
||||
- `wiki/log.md` — append-only operation log
|
||||
- `wiki/hot.md` — recent context cache
|
||||
- `wiki/overview.md` — executive summary
|
||||
- `wiki/meta/dashboard.md` — Dataview dashboard
|
||||
- `_templates/` — Obsidian Templater templates for each note type
|
||||
- `.obsidian/snippets/vault-colors.css` — color-coded file explorer
|
||||
- Vault `CLAUDE.md` — auto-loaded project instructions
|
||||
- `wiki/index.md`: master catalog
|
||||
- `wiki/log.md`: append-only operation log
|
||||
- `wiki/hot.md`: recent context cache
|
||||
- `wiki/overview.md`: executive summary
|
||||
- `wiki/meta/dashboard.base`: Bases dashboard (primary, native Obsidian)
|
||||
- `wiki/meta/dashboard.md`: Legacy Dataview dashboard (optional fallback)
|
||||
- `_templates/`: Obsidian Templater templates for each note type
|
||||
- `.obsidian/snippets/vault-colors.css`: color-coded file explorer
|
||||
- Vault `CLAUDE.md`: auto-loaded project instructions
|
||||
|
||||
---
|
||||
|
||||
@@ -182,9 +183,19 @@ claude mcp add-json obsidian-vault '{
|
||||
|
||||
---
|
||||
|
||||
## Plugins (pre-installed)
|
||||
## Plugins
|
||||
|
||||
These ship with the vault — enable them in **Settings → Community Plugins → enable**:
|
||||
### Core Plugins (built into Obsidian: no install needed)
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| **Bases** | Powers `wiki/meta/dashboard.base`: native database views. Available since Obsidian v1.9.10 (August 2025). **Replaces Dataview for the primary dashboard.** |
|
||||
| **Properties** | Visual frontmatter editor |
|
||||
| **Backlinks**, **Outline**, **Graph view** | Standard navigation |
|
||||
|
||||
### Pre-installed Community Plugins (ship with this vault)
|
||||
|
||||
Enable in **Settings → Community Plugins → enable**:
|
||||
|
||||
| Plugin | Purpose | Notes |
|
||||
|--------|---------|-------|
|
||||
@@ -195,15 +206,15 @@ These ship with the vault — enable them in **Settings → Community Plugins
|
||||
|
||||
\* Excalidraw `main.js` (8MB) is downloaded automatically by `setup-vault.sh`. It is not tracked in git.
|
||||
|
||||
Also install from **Community Plugins** (not pre-installed):
|
||||
### Also install from Community Plugins (not pre-installed)
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| **Dataview** | Powers the dashboard Dataview queries |
|
||||
| **Templater** | Auto-fills frontmatter from `_templates/` |
|
||||
| **Obsidian Git** | Auto-commits vault every 15 minutes |
|
||||
| **Dataview** *(optional/legacy)* | Only needed for the legacy `wiki/meta/dashboard.md` queries. The primary dashboard now uses Bases. |
|
||||
|
||||
Also install the **[Obsidian Web Clipper](https://obsidian.md/clipper)** browser extension — sends web pages to `.raw/` in one click.
|
||||
Also install the **[Obsidian Web Clipper](https://obsidian.md/clipper)** browser extension. Sends web pages to `.raw/` in one click.
|
||||
|
||||
---
|
||||
|
||||
@@ -214,8 +225,8 @@ Three snippets ship with the vault and are enabled automatically:
|
||||
| Snippet | Effect |
|
||||
|---------|--------|
|
||||
| `vault-colors` | Color-codes `wiki/` folders by type in the file explorer (blue = concepts, green = sources, purple = entities) |
|
||||
| `ITS-Dataview-Cards` | Turns Dataview `TABLE` queries into visual card grids — use ` ```dataviewjs ` with `.cards` class |
|
||||
| `ITS-Image-Adjustments` | Fine-grained image sizing in notes — append `\|100` to any image embed |
|
||||
| `ITS-Dataview-Cards` | Turns Dataview `TABLE` queries into visual card grids: use ` ```dataviewjs ` with `.cards` class |
|
||||
| `ITS-Image-Adjustments` | Fine-grained image sizing in notes: append `\|100` to any image embed |
|
||||
|
||||
---
|
||||
|
||||
@@ -244,11 +255,11 @@ claude-obsidian/
|
||||
│ ├── wiki-ingest/ # INGEST operation
|
||||
│ ├── wiki-query/ # QUERY operation
|
||||
│ ├── wiki-lint/ # LINT operation
|
||||
│ ├── save/ # /save — file conversations to wiki
|
||||
│ ├── autoresearch/ # /autoresearch — autonomous research loop
|
||||
│ ├── save/ # /save: file conversations to wiki
|
||||
│ ├── autoresearch/ # /autoresearch: autonomous research loop
|
||||
│ │ └── references/
|
||||
│ │ └── program.md # configurable research objectives
|
||||
│ └── canvas/ # /canvas — visual layer (images, PDFs, notes)
|
||||
│ └── canvas/ # /canvas: visual layer (images, PDFs, notes)
|
||||
│ └── references/
|
||||
│ └── canvas-spec.md # Obsidian canvas JSON format reference
|
||||
├── agents/
|
||||
@@ -263,13 +274,15 @@ claude-obsidian/
|
||||
│ └── hooks.json # SessionStart + Stop hot cache hooks
|
||||
├── _templates/ # Obsidian Templater templates
|
||||
├── wiki/
|
||||
│ ├── Wiki Map.canvas # visual hub — central graph node
|
||||
│ ├── Wiki Map.canvas # visual hub, central graph node
|
||||
│ ├── canvases/ # welcome.canvas + main.canvas (visual demos)
|
||||
│ ├── getting-started.md # onboarding walkthrough (inside the vault)
|
||||
│ ├── concepts/ # seeded: LLM Wiki Pattern, Hot Cache, Compounding Knowledge
|
||||
│ ├── entities/ # seeded: Andrej Karpathy
|
||||
│ ├── sources/ # populated by your first ingest
|
||||
│ └── meta/dashboard.md # Dataview dashboard
|
||||
│ └── meta/
|
||||
│ ├── dashboard.base # Bases dashboard (primary)
|
||||
│ └── dashboard.md # Legacy Dataview dashboard (optional)
|
||||
├── .raw/ # source documents (hidden in Obsidian)
|
||||
├── .obsidian/snippets/ # vault-colors.css (3-color scheme)
|
||||
├── WIKI.md # full schema reference
|
||||
@@ -296,10 +309,11 @@ The default program works for general research. Override it for your domain. A m
|
||||
|
||||
This repo ships with a seeded vault. Open it in Obsidian and you'll see:
|
||||
|
||||
- `wiki/concepts/` — LLM Wiki Pattern, Hot Cache, Compounding Knowledge
|
||||
- `wiki/entities/` — Andrej Karpathy
|
||||
- `wiki/sources/` — empty until your first ingest
|
||||
- `wiki/meta/dashboard.md` — Dataview dashboard (requires Dataview plugin)
|
||||
- `wiki/concepts/`: LLM Wiki Pattern, Hot Cache, Compounding Knowledge
|
||||
- `wiki/entities/`: Andrej Karpathy
|
||||
- `wiki/sources/`: empty until your first ingest
|
||||
- `wiki/meta/dashboard.base`: Bases dashboard (works in any Obsidian v1.9.10+)
|
||||
- `wiki/meta/dashboard.md`: Legacy Dataview dashboard (optional fallback)
|
||||
|
||||
The graph view will show a connected cluster of 5 pages. This is what the wiki looks like after one ingest. Add more sources and it grows from there.
|
||||
|
||||
|
||||
87
bin/setup-multi-agent.sh
Executable file
87
bin/setup-multi-agent.sh
Executable file
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env bash
|
||||
# claude-obsidian: multi-agent skill installer
|
||||
# Symlinks the skills/ directory into each AI agent's expected location.
|
||||
# Idempotent: safe to run multiple times.
|
||||
#
|
||||
# Supported agents:
|
||||
# - Claude Code : auto-discovered via .claude-plugin/ (no symlink needed)
|
||||
# - Codex CLI : symlink to ~/.codex/skills/claude-obsidian
|
||||
# - OpenCode : symlink to ~/.opencode/skills/claude-obsidian
|
||||
# - Gemini CLI : symlink to ~/.gemini/skills/claude-obsidian
|
||||
# - Cursor : symlink to .cursor/skills (in repo)
|
||||
# - Windsurf : symlink to .windsurf/skills (in repo)
|
||||
#
|
||||
# Bootstrap files (AGENTS.md, GEMINI.md, .cursor/rules/, .windsurf/rules/,
|
||||
# .github/copilot-instructions.md) are already committed in the repo.
|
||||
# This script just wires up the skills directory.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
SKILLS_DIR="$REPO_ROOT/skills"
|
||||
|
||||
if [ ! -d "$SKILLS_DIR" ]; then
|
||||
echo "ERROR: $SKILLS_DIR does not exist. Are you running this from the claude-obsidian repo?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
GRAY='\033[0;37m'
|
||||
NC='\033[0m'
|
||||
|
||||
link_if_missing() {
|
||||
local target="$1"
|
||||
local dest="$2"
|
||||
local agent_name="$3"
|
||||
|
||||
mkdir -p "$(dirname "$dest")"
|
||||
|
||||
if [ -L "$dest" ]; then
|
||||
local existing="$(readlink "$dest")"
|
||||
if [ "$existing" = "$target" ]; then
|
||||
echo -e "${GRAY}[$agent_name] already linked: $dest${NC}"
|
||||
return
|
||||
else
|
||||
echo -e "${YELLOW}[$agent_name] symlink exists but points elsewhere: $dest -> $existing (skipping, remove manually if you want to relink)${NC}"
|
||||
return
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -e "$dest" ]; then
|
||||
echo -e "${YELLOW}[$agent_name] path exists and is not a symlink: $dest (skipping)${NC}"
|
||||
return
|
||||
fi
|
||||
|
||||
ln -s "$target" "$dest"
|
||||
echo -e "${GREEN}[$agent_name] linked: $dest -> $target${NC}"
|
||||
}
|
||||
|
||||
echo "claude-obsidian: multi-agent skill installer"
|
||||
echo "Repo: $REPO_ROOT"
|
||||
echo
|
||||
|
||||
# Codex CLI
|
||||
link_if_missing "$SKILLS_DIR" "$HOME/.codex/skills/claude-obsidian" "Codex CLI"
|
||||
|
||||
# OpenCode
|
||||
link_if_missing "$SKILLS_DIR" "$HOME/.opencode/skills/claude-obsidian" "OpenCode"
|
||||
|
||||
# Gemini CLI
|
||||
link_if_missing "$SKILLS_DIR" "$HOME/.gemini/skills/claude-obsidian" "Gemini CLI"
|
||||
|
||||
# Cursor (workspace-local)
|
||||
link_if_missing "$SKILLS_DIR" "$REPO_ROOT/.cursor/skills" "Cursor"
|
||||
|
||||
# Windsurf (workspace-local)
|
||||
link_if_missing "$SKILLS_DIR" "$REPO_ROOT/.windsurf/skills" "Windsurf"
|
||||
|
||||
echo
|
||||
echo -e "${GREEN}Done.${NC} Bootstrap files (AGENTS.md, GEMINI.md, .cursor/rules/, .windsurf/rules/, .github/copilot-instructions.md) are already in this repo."
|
||||
echo
|
||||
echo "To verify each agent picks up the skills:"
|
||||
echo " - Claude Code: open the project, type /wiki"
|
||||
echo " - Codex CLI: codex --list-skills | grep claude-obsidian"
|
||||
echo " - Cursor: open the project, ask 'what skills do you have?'"
|
||||
echo " - Windsurf: open in Cascade, ask the same"
|
||||
echo " - Gemini CLI: gemini --list-skills (if supported)"
|
||||
26
hooks/README.md
Normal file
26
hooks/README.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# claude-obsidian Hooks
|
||||
|
||||
Plugin hooks for the claude-obsidian wiki vault. All hooks are defined in `hooks.json`.
|
||||
|
||||
## Events
|
||||
|
||||
| Event | Type | Purpose |
|
||||
|---|---|---|
|
||||
| `SessionStart` | command + prompt | Loads `wiki/hot.md` into context. Command type runs `[ -f wiki/hot.md ] && cat wiki/hot.md` as the canonical safety check (works for non-vault sessions without erroring). Prompt type complements with semantic context restoration. Matcher: `startup\|resume`. |
|
||||
| `PostCompact` | prompt | Re-loads `wiki/hot.md` after context compaction. Hook-injected context does NOT survive compaction (only `CLAUDE.md` does), so this hook restores the hot cache mid-session. |
|
||||
| `PostToolUse` | command | Auto-commits any wiki/ or .raw/ changes after Write or Edit tool calls. Guarded by `[ -d .git ]` so it never errors in non-git directories, and by `git diff --cached --quiet` so it never creates empty commits. |
|
||||
| `Stop` | prompt | Updates `wiki/hot.md` at the end of every Claude response with a brief summary of what changed. |
|
||||
|
||||
## Known Issue: Plugin Hooks STDOUT Bug
|
||||
|
||||
`anthropics/claude-code#10875` documents that **plugin hook STDOUT may not be captured** by Claude Code, while identical inline hooks in `settings.json` work correctly.
|
||||
|
||||
**Impact**: If this bug is active in your Claude Code version, the prompt-type SessionStart and PostCompact hooks may not inject context as expected.
|
||||
|
||||
**Workaround**: The command-type SessionStart hook (`cat wiki/hot.md`) is the canonical safety check. It relies on STDOUT capture for context injection, so test against this issue if hot cache restoration fails. As a fallback, copy the hook config from `hooks.json` into your user-level `~/.claude/settings.json` instead of relying on plugin hooks.
|
||||
|
||||
**Test for the bug**: After installing the plugin, open a fresh Claude Code session in a directory containing a populated `wiki/hot.md`. Ask Claude "what's in the hot cache?". If Claude has no idea, the STDOUT bug is active in your version.
|
||||
|
||||
## Non-Vault Sessions
|
||||
|
||||
The SessionStart command hook uses `[ -f wiki/hot.md ] && cat wiki/hot.md || true` so it always exits 0, even when no vault is present. This makes the plugin safe to install globally without breaking non-vault Claude Code sessions.
|
||||
@@ -1,12 +1,27 @@
|
||||
{
|
||||
"hooks": {
|
||||
"SessionStart": [
|
||||
{
|
||||
"matcher": "startup|resume",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -f wiki/hot.md ] && cat wiki/hot.md || true"
|
||||
},
|
||||
{
|
||||
"type": "prompt",
|
||||
"prompt": "If a vault is configured for this session (check CLAUDE.md for VAULT_PATH or a wiki/ folder in the current directory), silently read wiki/hot.md to restore recent context. If wiki/hot.md does not exist, do nothing. This is a non-vault session. Do not announce this. Do not report what you read. Just have the context available."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PostCompact": [
|
||||
{
|
||||
"matcher": "",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "prompt",
|
||||
"prompt": "If a vault is configured for this session (check CLAUDE.md for VAULT_PATH or a wiki/ folder in the current directory), silently read wiki/hot.md to restore recent context. Do not announce this. Do not report what you read. Just have the context available."
|
||||
"prompt": "Hook-injected context does not survive context compaction. If wiki/hot.md exists in the current directory, silently re-read it now to restore the hot cache. Do not announce this."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -17,7 +32,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "git add wiki/ .raw/ 2>/dev/null && (git diff --cached --quiet || git commit -m \"wiki: auto-commit $(date '+%Y-%m-%d %H:%M')\" 2>/dev/null) || true"
|
||||
"command": "[ -d .git ] && git add wiki/ .raw/ 2>/dev/null && (git diff --cached --quiet || git commit -m \"wiki: auto-commit $(date '+%Y-%m-%d %H:%M')\" 2>/dev/null) || true"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -28,7 +43,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "prompt",
|
||||
"prompt": "If you read or modified any wiki pages during this session, update wiki/hot.md with a brief summary of what changed (under 500 words). Use the hot cache format: Last Updated, Key Recent Facts, Recent Changes, Active Threads. Keep it factual. Overwrite the file completely — it is a cache, not a journal."
|
||||
"prompt": "If you read or modified any wiki pages during this session, update wiki/hot.md with a brief summary of what changed (under 500 words). Use the hot cache format: Last Updated, Key Recent Facts, Recent Changes, Active Threads. Keep it factual. Overwrite the file completely. It is a cache, not a journal."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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`
|
||||
|
||||
86
wiki/meta/dashboard.base
Normal file
86
wiki/meta/dashboard.base
Normal file
@@ -0,0 +1,86 @@
|
||||
filters:
|
||||
and:
|
||||
- file.inFolder("wiki")
|
||||
- 'file.ext == "md"'
|
||||
|
||||
formulas:
|
||||
age_days: '(now() - file.mtime).days'
|
||||
|
||||
properties:
|
||||
type:
|
||||
displayName: "Type"
|
||||
status:
|
||||
displayName: "Status"
|
||||
updated:
|
||||
displayName: "Updated"
|
||||
formula.age_days:
|
||||
displayName: "Days Since Edit"
|
||||
|
||||
views:
|
||||
- type: table
|
||||
name: "Recent Activity"
|
||||
limit: 15
|
||||
order:
|
||||
- file.name
|
||||
- type
|
||||
- status
|
||||
- updated
|
||||
- formula.age_days
|
||||
groupBy:
|
||||
property: type
|
||||
direction: ASC
|
||||
|
||||
- type: list
|
||||
name: "Seed Pages (Need Development)"
|
||||
filters:
|
||||
and:
|
||||
- 'status == "seed"'
|
||||
order:
|
||||
- file.name
|
||||
- updated
|
||||
|
||||
- type: list
|
||||
name: "Entities Missing Sources"
|
||||
filters:
|
||||
and:
|
||||
- file.inFolder("wiki/entities")
|
||||
- or:
|
||||
- '!sources'
|
||||
- 'sources.length == 0'
|
||||
order:
|
||||
- file.name
|
||||
|
||||
- type: list
|
||||
name: "Open Questions"
|
||||
filters:
|
||||
and:
|
||||
- file.inFolder("wiki/questions")
|
||||
- or:
|
||||
- 'status == "developing"'
|
||||
- 'status == "seed"'
|
||||
order:
|
||||
- file.name
|
||||
- updated
|
||||
|
||||
- type: table
|
||||
name: "Comparisons"
|
||||
filters:
|
||||
and:
|
||||
- file.inFolder("wiki/comparisons")
|
||||
order:
|
||||
- file.name
|
||||
- verdict
|
||||
- updated
|
||||
|
||||
- type: table
|
||||
name: "Sources"
|
||||
limit: 10
|
||||
filters:
|
||||
and:
|
||||
- file.inFolder("wiki/sources")
|
||||
- 'type == "source"'
|
||||
order:
|
||||
- file.name
|
||||
- author
|
||||
- date_published
|
||||
- updated
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
type: meta
|
||||
title: "Dashboard"
|
||||
updated: 2026-04-07
|
||||
updated: 2026-04-08
|
||||
tags:
|
||||
- meta
|
||||
- dashboard
|
||||
@@ -18,51 +18,50 @@ related:
|
||||
|
||||
Navigation: [[index]] | [[overview]] | [[log]] | [[hot]]
|
||||
|
||||
Requires the **Dataview** plugin: Settings > Community Plugins > Browse > "Dataview".
|
||||
The dashboard uses **Obsidian Bases**. A core Obsidian feature shipped in v1.9.10 (August 2025). No plugin install required.
|
||||
|
||||
> [!tip] Embedded Bases view
|
||||
> The interactive dashboard lives in [[dashboard.base]]. Open that file directly, or use the embed below.
|
||||
|
||||
![[dashboard.base]]
|
||||
|
||||
---
|
||||
|
||||
## Recent Activity
|
||||
## Legacy Dataview Dashboard (Optional)
|
||||
|
||||
If you are on Obsidian < 1.9.10 or prefer Dataview, the queries below still work. Just install the Dataview community plugin.
|
||||
|
||||
### Recent Activity
|
||||
|
||||
```dataview
|
||||
TABLE type, status, updated FROM "wiki" SORT updated DESC LIMIT 15
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Seed Pages (Need Development)
|
||||
### Seed Pages (Need Development)
|
||||
|
||||
```dataview
|
||||
LIST FROM "wiki" WHERE status = "seed" SORT updated ASC
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Entities Missing Sources
|
||||
### Entities Missing Sources
|
||||
|
||||
```dataview
|
||||
LIST FROM "wiki/entities" WHERE !sources OR length(sources) = 0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Open Questions
|
||||
### Open Questions
|
||||
|
||||
```dataview
|
||||
LIST FROM "wiki/questions" WHERE status = "developing" OR status = "seed" SORT updated DESC
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Comparisons
|
||||
### Comparisons
|
||||
|
||||
```dataview
|
||||
TABLE verdict FROM "wiki/comparisons" SORT updated DESC
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Sources
|
||||
### Sources
|
||||
|
||||
```dataview
|
||||
TABLE author, date_published, updated FROM "wiki/sources" WHERE type = "source" SORT updated DESC LIMIT 10
|
||||
|
||||
Reference in New Issue
Block a user