Initial commit

This commit is contained in:
Zhongwei Li
2025-11-29 18:27:22 +08:00
commit 440d018303
5 changed files with 843 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
{
"name": "obsidian",
"description": "Manage brainstorming and planning documents in Obsidian vault with structured conventions",
"version": "2.0.0",
"author": {
"name": "Fletcher Nichol",
"email": "fnichol@nichol.ca"
},
"skills": [
"./skills"
]
}

3
README.md Normal file
View File

@@ -0,0 +1,3 @@
# obsidian
Manage brainstorming and planning documents in Obsidian vault with structured conventions

49
plugin.lock.json Normal file
View File

@@ -0,0 +1,49 @@
{
"$schema": "internal://schemas/plugin.lock.v1.json",
"pluginId": "gh:fnichol/claude-code-plugins:plugins/obsidian",
"normalized": {
"repo": null,
"ref": "refs/tags/v20251128.0",
"commit": "fcfd167cc86d7bf2776b8e2c2e22e17f1bda0db7",
"treeHash": "19754dbab967d77738a69e68939bf33f0301cfde0588c1ffb1cb89d843199fea",
"generatedAt": "2025-11-28T10:16:55.363404Z",
"toolVersion": "publish_plugins.py@0.2.0"
},
"origin": {
"remote": "git@github.com:zhongweili/42plugin-data.git",
"branch": "master",
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
},
"manifest": {
"name": "obsidian",
"description": "Manage brainstorming and planning documents in Obsidian vault with structured conventions",
"version": "2.0.0"
},
"content": {
"files": [
{
"path": "README.md",
"sha256": "ca04676d317039490c12f759b59f764c42950df7e28e6d26e41f8e9c4123c57e"
},
{
"path": ".claude-plugin/plugin.json",
"sha256": "a97a2fb1a222d6a5f7c14472966001d672828b2df837f8fc9192a55a5bc11e02"
},
{
"path": "skills/project-linking/SKILL.md",
"sha256": "35e477f5cc51039038dfba8eec6c5d200fc34f820c509537200b13ae61905c1b"
},
{
"path": "skills/vault/SKILL.md",
"sha256": "dbcf94e6debd5ea0963012a35ca34ea37cce08fc7aa77dc05700909b38aa95ae"
}
],
"dirSha256": "19754dbab967d77738a69e68939bf33f0301cfde0588c1ffb1cb89d843199fea"
},
"security": {
"scannedAt": null,
"scannerVersion": null,
"flags": []
}
}

View File

@@ -0,0 +1,509 @@
---
name: project-linking
description: Use when session starts with CLAUDE.local.md containing Vault project field - automatically loads vault index, enables dual-location routing (vault + local docs), style adaptation, and cross-location linking with GitHub URLs for Obsidian project documentation
---
# Obsidian Project Linking
## Overview
CLAUDE.local.md integration for Obsidian vaults. Automatically detects project configuration at session start, loads vault documentation index silently, and enables intelligent routing between vault (exploratory docs) and local repository (implementation docs).
**Requires:** The `vault` skill for basic Obsidian vault operations (CRUD, inbox, promotion, validation).
## Project Linking Configuration
**CLAUDE.local.md detection:** Check for `CLAUDE.local.md` in working directory at session start.
**Parse configuration fields:**
- `Vault project: \`project-name\`` - Links working directory to vault project
- `Local docs: ./path` - Optional local documentation directory
- `Documentation style: standard` - Optional style override
**Configuration precedence:**
- CLAUDE.local.md overrides for project-specific settings
- ~/.claude/CLAUDE.md for vault path (Primary vault:)
- Defaults: vault path `~/Obsidian/vault`, no local docs
**Example CLAUDE.local.md:**
```markdown
# Obsidian Project
Vault project: `my-project-name`
Local docs: `./docs`
Documentation style: standard
```
**Session context:**
Store parsed values in memory for the session:
- `project_name` - from Vault project field
- `local_docs_path` - from Local docs field (optional)
- `doc_style` - from Documentation style field (optional, default: adapt)
## Startup Behavior
**When CLAUDE.local.md contains `Vault project:` reference:**
### 1. Silent Index Loading
**Trigger:** Session starts in directory with CLAUDE.local.md containing Vault project field
**Process:**
1. Parse CLAUDE.local.md for `Vault project: \`name\``
2. Determine vault path from "Primary vault:" in context
3. Expand `~` to home directory in vault path
4. Construct project path: `<vault-path>/projects/<project-name>/`
5. Read all `.md` files in project folder
6. Extract from each file's frontmatter:
- filename (for reference)
- `type:` field (brainstorm, design, plan, notes, retrospective)
- `status:` field (planning, active, paused, completed, archived)
7. Store index in memory as session context
**Silent Success:**
- No output to user
- Index available for search/list operations
**Visible Warnings:**
- Vault path doesn't exist: "Warning: Vault path `<path>` not found. Check Primary vault in ~/.claude/CLAUDE.md"
- Project doesn't exist: "Note: Vault project `<name>` not found - will create on first save"
- Permission error: "Error: Cannot read vault project `<name>` at `<path>` - permission denied"
### 2. Local Docs Verification
**If `Local docs:` configured:**
1. Verify directory exists relative to working directory
2. If not found: "Warning: Local docs directory `<path>` not found. Create it or update CLAUDE.local.md"
3. Do not auto-create (respect project structure)
**Session Ready:**
After startup, Claude knows:
- All vault documents (from index)
- Local docs location (if configured)
- Ready for document operations
## Location Resolution
**Determine target location for document operations:**
### Resolution Algorithm
```
When creating document:
If user explicitly specifies location:
Use specified location
Else if Local docs configured:
If document type in [design, plan]:
→ Local docs directory
Else:
→ Vault project
Else:
→ Vault project (default)
```
### Document Type Categories
**Implementation docs** (go to local when Local docs configured):
- `design` - Architecture and technical design
- `plan` - Implementation tasks and roadmaps
**Exploratory docs** (always go to vault):
- `brainstorm` - Initial idea exploration
- `notes` - Working notes and observations
- `retrospective` - Post-completion reflections
### Location Override Examples
**Explicit overrides (user specifies location):**
- "save this design to the vault" → vault even if local docs enabled
- "create a plan in docs/" → local even without local docs config
- "save to inbox" → always vault _inbox
**Natural routing (no location specified):**
- "create a design doc" + Local docs configured → local docs/
- "create a design doc" + no Local docs → vault
- "save this brainstorm" + Local docs configured → vault (exploratory)
- "save this brainstorm" + no Local docs → vault
### Location-Specific Conventions
**Vault documents:**
- Filename: `YYYY-MM-DD-descriptive-name.md` (lowercase, hyphens)
- Frontmatter: Required (project, status, type, created)
- Linking: Wikilinks `[[filename]]`
- Updates: Add `updated: YYYY-MM-DD` to frontmatter
**Local documents:**
- Filename: Flexible (adapt to existing or use simple names like `architecture.md`)
- Frontmatter: Optional (not required)
- Linking: Relative markdown links `[text](./file.md)`
- Updates: Rely on git history (no frontmatter dates)
## Local Document Operations
**When `Local docs:` configured, enable operations in local directory:**
### Style Adaptation
**Detect existing project style (default behavior):**
1. Read 1-3 existing documents from local docs directory
2. Analyze:
- Filename patterns (kebab-case, snake_case, PascalCase, date-prefixed, etc.)
- Heading structure (ATX vs Setext, title format)
- Frontmatter presence and format
- Overall tone and structure
3. Match detected style in new documents
**Override with standard template:**
- If `Documentation style: standard` in CLAUDE.local.md
- Use consistent template regardless of existing docs
**Fallback to standard:**
- If local docs empty or unreadable
- Warn: "Couldn't detect local style, using standard template"
### GitHub Remote Detection
**Purpose:** Create portable links from vault docs to local docs
**Detection process:**
1. Parse `.git/config` in working directory
2. Look for `[remote "..."]` sections with `url` containing `github.com`
3. Extract: `org/repo` from URL patterns:
- `https://github.com/org/repo.git`
- `git@github.com:org/repo.git`
4. Determine default branch:
- Check `.git/refs/remotes/origin/HEAD`
- Common: `main` or `master`
**Link construction:**
`https://github.com/<org>/<repo>/blob/<branch>/docs/<filename>.md`
**When to skip linking:**
- Non-GitHub remote (GitLab, Bitbucket, self-hosted)
- No remote configured
- Cannot parse remote URL
**Multiple remotes:**
- Prefer `origin` if present
- Otherwise use first GitHub remote found
### Creating Local Documents
**Process for local doc creation:**
**Step 1:** Determine filename
- Adapt to existing style if detected
- Examples: `architecture.md`, `api-design.md`, `database-schema.md`
**Step 2:** Detect related vault docs
- Search vault index for related documents
- Match by project name, keywords, document type
**Step 3:** Create document
- Apply adapted style or standard template
- Add optional frontmatter if existing docs use it
- Include content based on user's request
**Step 4:** Add Related Documents section
- Link to related local docs: `[Architecture](./architecture.md)`
- Link to related vault docs via GitHub URL (if detected):
```markdown
## Related Documents
- [API Design](./api-design.md) - REST API specification
- [Initial Brainstorm](https://github.com/org/repo/blob/main/docs/brainstorm.md) - Early ideas
```
**Step 5:** Confirm creation
- "Created `docs/design.md` matching project style"
- List any links added
### Updating Local Documents
**Process:**
1. Locate document in local docs directory
2. Read current contents
3. Apply requested changes
4. Do not modify filename (preserve name)
5. Do not add frontmatter dates (rely on git)
6. Confirm changes: "Updated `docs/architecture.md`"
### Searching Local Documents
**Combine with vault search:**
- "show me design docs" → search vault index + scan local docs
- Report both locations: "Found in vault: ..., Found in docs/: ..."
- Let user disambiguate if multiple matches
**List all docs:**
- Combine vault index with local directory scan
- Show location for each: `[vault]` or `[local]`
## Enhanced Operations
**These operations extend the `vault` skill with dual-location awareness:**
### Create New Project (Enhanced)
**Check for project linking:**
- If CLAUDE.local.md exists with `Vault project:` → use that project name as suggestion
- Otherwise → ask for project name
**Apply location resolution:**
- If Local docs configured AND type in [design, plan] → create in local docs
- Otherwise → create in vault projects/<name>/
**Generate filename:**
- Vault: `YYYY-MM-DD-<type>.md`
- Local: adapt to style or use `<type>.md`
### Add Document to Project (Enhanced)
1. Check for CLAUDE.local.md with matching project name
2. Apply location resolution:
- If Local docs configured AND type in [design, plan] → create in local docs
- Otherwise → create in vault project folder
3. Search both vault and local for related docs
4. Add inline wikilinks (vault) or markdown links (local)
5. Add `## Related Documents` section with links:
- Vault docs: `[[YYYY-MM-DD-filename]]`
- Local docs: `[Title](./filename.md)`
- Cross-location: GitHub URL if detected
### List Projects (Enhanced)
- If CLAUDE.local.md configured, include linked project prominently
- Show vault doc count
- If Local docs configured, show local doc count too
**Output:**
```
Active Projects:
- obsidian-integration (3 vault docs, 2 local docs) [*linked]
Planning:
- another-project (1 vault doc)
```
[*linked] = configured in CLAUDE.local.md
### Show Project Contents (Enhanced)
1. Find project folder in vault
2. If CLAUDE.local.md links this project, also scan local docs
3. List vault documents with types/statuses from frontmatter
4. List local documents
5. Present by location, chronologically within each
**Output:**
```
obsidian-integration (status: active):
Vault documents:
- 2025-11-07-initial-brainstorm.md (brainstorm)
- 2025-11-10-retrospective.md (retrospective)
Local documents:
- architecture.md (design)
- implementation-plan.md (plan)
```
## Error Handling
### Configuration Errors
**CLAUDE.local.md missing vault project:**
- If CLAUDE.local.md exists but no `Vault project:` field
- Behavior: Treat as no project linking configured
- No warning needed
**Invalid project name format:**
- Project name contains spaces or uppercase
- Suggest: "Project name should be lowercase with hyphens: `my-project-name`"
**Both CLAUDE.md and CLAUDE.local.md specify project:**
- CLAUDE.local.md takes precedence (project-specific override)
- No warning needed
### Startup Errors
**Vault path doesn't exist:**
- Show: "Warning: Vault path `<path>` not found. Check 'Primary vault:' in ~/.claude/CLAUDE.md"
- Continue session (non-blocking)
**Vault project doesn't exist:**
- Show: "Note: Vault project `<name>` not found - will create on first save"
- Continue session (non-blocking)
- Create on first document save
**Permission denied reading vault:**
- Show: "Error: Cannot read vault project `<name>` at `<path>` - permission denied"
- Continue session but document operations will fail
- Suggest: Check file permissions
**Local docs directory missing:**
- If `Local docs: ./docs` configured but doesn't exist
- Show: "Warning: Local docs directory `./docs` not found. Create it or update CLAUDE.local.md"
- Continue session (vault still works)
### Operation Errors
**Ambiguous document reference:**
- "show me the design doc" matches both vault and local
- Show both with locations: "Found 2 matches: [vault] 2025-11-15-design.md, [local] architecture.md"
- Ask: "Which document? Specify 'vault design' or 'local design'"
**Cannot write to location:**
- Vault write fails: "Error: Cannot write to vault at `<path>` - permission denied. Try local docs instead?"
- Local write fails: "Error: Cannot write to `<path>` - permission denied. Try vault instead?"
**GitHub remote detection fails:**
- Non-GitHub remote: No cross-linking, no warning
- No remote: No cross-linking, no warning
- Multiple GitHub remotes: Use `origin` or first found
**Style adaptation fails:**
- Local docs empty: "Note: No existing docs found in `./docs`, using standard template"
- Cannot read local docs: "Warning: Cannot read local docs for style detection, using standard template"
## Common Mistakes
| Problem | Solution |
|---------|----------|
| CLAUDE.local.md not detected | Verify file exists in working directory (not subdirectory) |
| Local docs path incorrect | Check path is relative to working directory (e.g., `./docs` not `~/docs`) |
| Vault project name mismatch | Verify CLAUDE.local.md project name matches vault folder name |
| Both locations have same doc | Ask user to disambiguate: "vault design" or "local design" |
| GitHub URLs not working | Check remote is github.com (not GitLab, Bitbucket) |
| Style detection wrong | Override with `Documentation style: standard` in CLAUDE.local.md |
| Existing pattern conflicts | CLAUDE.local.md config > existing patterns. Design docs in vault when Local docs configured = misplaced. |
## Workflow Examples
### Example 1: Vault-Only Configuration
**Setup CLAUDE.local.md:**
```markdown
# Obsidian Project
Vault project: `obsidian-integration`
```
**Session Start:**
- Claude silently loads index from vault project
- No output unless warnings
**User:** "Create a design doc"
**Claude:** Creates `~/Obsidian/vault/projects/obsidian-integration/2025-11-15-design.md` with frontmatter
**User:** "Save this brainstorm"
**Claude:** Creates `~/Obsidian/vault/projects/obsidian-integration/2025-11-15-brainstorm.md`
**Result:** All docs in vault, full frontmatter tracking
---
### Example 2: Dual Location Configuration
**Setup CLAUDE.local.md:**
```markdown
# Obsidian Project
Vault project: `api-refactoring`
Local docs: `./docs`
```
**Session Start:**
- Claude silently loads vault index
- Verifies `./docs` exists
- No output unless warnings
**User:** "Create a design doc"
**Claude:**
1. Detects type: design (implementation doc)
2. Resolves to: local docs
3. Reads existing docs in `./docs` to detect style
4. Creates `./docs/architecture.md` matching detected style
**User:** "Save this brainstorm"
**Claude:**
1. Detects type: brainstorm (exploratory doc)
2. Resolves to: vault
3. Creates `~/Obsidian/vault/projects/api-refactoring/2025-11-15-brainstorm.md`
**User:** "List all project docs"
**Claude:**
```
api-refactoring (status: active):
Vault documents:
- 2025-11-07-initial-brainstorm.md (brainstorm)
- 2025-11-10-retrospective.md (retrospective)
Local documents:
- architecture.md (design)
- api-design.md (design)
```
**Result:** Implementation docs version-controlled with code, exploratory docs in vault
---
### Example 3: Cross-Location Linking
**Setup:**
- CLAUDE.local.md: `Vault project: my-app`, `Local docs: ./docs`
- Git remote: `github.com/org/my-app`
**User:** "Create a design doc that references the initial brainstorm"
**Claude:**
1. Creates `./docs/architecture.md` (local, implementation doc)
2. Searches vault for related docs
3. Finds `2025-11-07-initial-brainstorm.md` in vault
4. Detects GitHub remote
5. Adds to design doc:
```markdown
## Related Documents
- [Initial Brainstorm](https://github.com/org/my-app/blob/main/docs/2025-11-07-initial-brainstorm.md) - Early exploration
```
**Result:** Portable bidirectional links that work across machines
---
### Example 4: Style Adaptation
**Setup:**
- CLAUDE.local.md: `Vault project: legacy-app`, `Local docs: ./documentation`
- Existing docs use PascalCase: `ApiDesign.md`, `DatabaseSchema.md`
**User:** "Create a design doc for the authentication system"
**Claude:**
1. Reads existing docs to detect style
2. Detects: PascalCase filenames, specific heading structure
3. Creates `./documentation/AuthenticationDesign.md` matching detected pattern
**User:** Later decides to standardize: adds `Documentation style: standard` to CLAUDE.local.md
**User:** "Create a deployment plan"
**Claude:**
1. Checks Documentation style setting
2. Ignores existing PascalCase pattern
3. Creates `./documentation/deployment-plan.md` using standard kebab-case
**Result:** Can adapt to existing conventions or enforce standards
## Quick Reference
| Operation | Result |
|-----------|--------|
| Link project | Silent index load + dual location awareness |
| Add design (local) | `docs/design.md` (adapted style) |
| Add brainstorm (vault) | `projects/<name>/YYYY-MM-DD-brainstorm.md` |
| Show all docs | Combined vault + local listing |
| Cross-location link | GitHub URL: `https://github.com/org/repo/blob/main/...` |
**Benefits:**
- Automatic awareness of vault documentation at session start
- Smart routing between vault and local docs based on document type
- Unified view of all project documentation regardless of location
- Portable GitHub links between vault and local docs

270
skills/vault/SKILL.md Normal file
View File

@@ -0,0 +1,270 @@
---
name: vault
description: Use when user says "save this", "create project", "promote from inbox" - manages Obsidian vault documentation with frontmatter (project/status/type/created), file naming (YYYY-MM-DD-name.md), wikilinks, and project structure in projects/ folders
---
# Obsidian Vault Operations
## Overview
Direct file system management for Obsidian project documentation. Enforces YYYY-MM-DD-name.md naming, generates frontmatter, maintains wikilinks, organizes into projects/<name>/ and _inbox/.
**For project linking features** (CLAUDE.local.md integration, dual locations, automatic startup), see the `project-linking` skill.
## Configuration
**Vault path:** Look for "Primary vault:" in conversation context (from CLAUDE.md).
- Use the most recent occurrence if multiple are present (user override takes precedence)
- Default: `~/Obsidian/vault` if not specified
- Expand `~` to user's home directory before using
## When to Use
**User triggers:**
- "Save this" / "create project" / "save to inbox"
- "Create a [design/plan/brainstorm] doc for [project]"
- "Promote that note to a project"
- "Update [doc] in [project]"
- "List projects" / "show me what's in [project]"
**Use this skill for:** Project documentation, design docs, brainstorms, plans, retrospectives
**Don't use for:** Code documentation (use project CLAUDE.md), one-off notes outside vault
**Note:** If session has CLAUDE.local.md with project linking, use `project-linking` skill instead for advanced features.
## Quick Reference
| Operation | Command Pattern | Result |
|-----------|----------------|--------|
| New project | "save as new project" | `projects/<name>/YYYY-MM-DD-<type>.md` |
| Save inbox | "save to inbox" | `projects/_inbox/YYYY-MM-DD-<desc>.md` |
| Add to project | "create [type] doc for [project]" | New doc + wikilinks to related |
| Update doc | "update [doc] in [project]" | Edit + `updated: YYYY-MM-DD` frontmatter |
| Promote inbox | "promote to project" | Move + update frontmatter + rename |
| List projects | "list projects" | Show all with status (skip _inbox) |
| Show contents | "what's in [project]" | List docs chronologically |
| Update status | "mark [project] as active" | Update all doc frontmatter |
| Validate | "check frontmatter" | Report missing/invalid fields |
**Conventions:**
- Filename: `YYYY-MM-DD-descriptive-name.md` (lowercase, hyphens)
- Links: Wikilinks `[[filename]]` (no .md, no path if same folder)
- Always add `## Related Documents` section to project docs
## Frontmatter
**Required fields:**
```yaml
---
project: project-name # Matches folder name or "inbox"
status: planning # planning|active|paused|completed|archived
type: brainstorm # brainstorm|design|plan|notes|retrospective
created: YYYY-MM-DD # File creation date
---
```
**Optional fields:**
- `updated: YYYY-MM-DD` - Added when document revised (filename stays same)
- `promoted: YYYY-MM-DD` - Added when moved from inbox to project
**Valid values:**
- **status:** planning, active, paused, completed, archived
- **type:** brainstorm, design, plan, notes, retrospective
## Core Operations
### Create New Project
**Trigger:** "save this as a new project"
1. Determine vault path from conversation context
2. Ask for project name → validate (lowercase, hyphens, no spaces)
3. Create `<vault-path>/projects/<project-name>/`
4. Infer doc type from conversation (brainstorming → brainstorm, planning → plan)
5. Generate filename: `YYYY-MM-DD-<type>.md`
6. Write frontmatter with `status: planning`
7. Add `## Related Documents` section
8. Confirm: "Created projects/<name>/YYYY-MM-DD-<type>.md"
### Save to Inbox
**Trigger:** "save to inbox" / "quick idea"
1. Determine vault path from conversation context
2. Create in `<vault-path>/projects/_inbox/`
3. Use descriptive filename from content
4. Frontmatter: `project: inbox`, `status: planning`, `type: notes`
5. Confirm creation
### Add Document to Existing Project
**Trigger:** "create a [design/plan] doc for [project-name]"
1. Search `projects/` for matching folder
2. If not found → ask to clarify or create new project
3. If multiple matches → present options
4. Create new doc in project folder
5. Search vault for related docs
6. Add inline wikilinks where relevant
7. Add `## Related Documents` section with links: `[[YYYY-MM-DD-filename]]`
8. Confirm creation + report links added
### Update Existing Document
**Trigger:** "update the [doc] in [project]"
1. Find document in project folder
2. Read current contents
3. Make requested updates
4. Add/update `updated: YYYY-MM-DD` in frontmatter
5. **Preserve filename** (creation date unchanged)
6. Confirm what changed
### Promote from Inbox
**Trigger:** "promote that note to a project" / "make this a proper project"
1. Identify inbox note from conversation context
2. Search `_inbox/` for related notes (similar topics, keywords)
3. Present related notes → ask which to include
4. Ask for project name
5. Create `projects/<project-name>/`
6. Move selected files → rename if needed (e.g., -idea.md → -initial-brainstorm.md)
7. Update frontmatter:
- `project: inbox``project: <project-name>`
- Add `promoted: YYYY-MM-DD`
- Update `type` if needed (ask user or infer)
8. Confirm with list of moved files
### List Projects
**Trigger:** "list projects" / "show me all projects"
1. Determine vault path from conversation context
2. Read `<vault-path>/projects/` (skip `_inbox/`)
3. For each project, read one doc to get status
4. Sort by status: active → planning → paused → completed → archived
5. Show count of documents per project
**Output:**
```
Active Projects:
- project-name (3 docs)
Planning:
- another-project (1 doc)
```
### Show Project Contents
**Trigger:** "what's in [project]" / "show me [project]"
1. Find project folder
2. List all documents with types and statuses from frontmatter
3. Present chronologically
**Output:**
```
project-name (status: active):
- 2025-11-07-initial-brainstorm.md (brainstorm)
- 2025-11-10-design-doc.md (design)
```
### Update Project Status
**Trigger:** "mark [project] as active" / "set status to completed"
1. Find project folder
2. Read all documents
3. Update `status` field in all frontmatter
4. Confirm count of documents updated
### Validate Frontmatter
**Trigger:** "check [project] frontmatter" / "validate frontmatter"
1. Find project folder → read all documents
2. Check each has: project, status, type, created
3. Verify `project` matches folder name
4. Verify `status` in valid values
5. Verify `type` in valid values
6. Verify dates are YYYY-MM-DD format
7. Report issues found
**Auto-validate before creating any file.**
## Structure & Naming
**Directory:**
```
<vault-path>/projects/
_inbox/ # Quick captures
project-name/ # One folder per project
YYYY-MM-DD-desc.md
```
**Naming rules:**
- **Files:** `YYYY-MM-DD-descriptive-name.md` (lowercase, hyphens, concise)
- **Projects:** `project-name` (lowercase, hyphens, matches folder)
- **No spaces or underscores**
**Examples:**
- `obsidian-integration/2025-11-07-initial-brainstorm.md`
- `api-refactoring/2025-11-08-design-doc.md`
## Linking
**Internal:** `[[YYYY-MM-DD-filename]]` (no .md, no path if same folder)
**External:** `[text](url)`
**Always add to project docs:**
```markdown
## Related Documents
- [[YYYY-MM-DD-brainstorm]] - Brief description
- [[YYYY-MM-DD-design]] - Brief description
```
**Auto-linking:**
- Add inline wikilinks where contextually relevant
- Search vault when creating new docs
- Link to related project docs in Related Documents section
## Pre-flight Checks
**Before ANY file operation:**
- [ ] Path exists or can be created
- [ ] Filename matches `YYYY-MM-DD-name.md`
- [ ] Frontmatter has: project, status, type, created
- [ ] Dates are `YYYY-MM-DD` format
- [ ] Status/type are valid values
**Before updates:**
- [ ] File exists → read current contents
- [ ] Preserve creation date in filename (only update frontmatter)
## Common Mistakes
| Problem | Solution |
|---------|----------|
| Project not found | Search partial matches → offer to create → list available |
| Invalid frontmatter | Report issue → fix before proceeding |
| File exists | Ask to update in-place or use different filename |
| Permission denied | Report error → suggest checking vault path in ~/.claude/CLAUDE.md |
| Vault path not found | Check for "Primary vault:" in context → use default ~/Obsidian/vault |
| Wrong date in filename | Preserve creation date (filename) when updating → only change `updated` |
## Example
**User:** "Save this brainstorm as a new project called obsidian-integration"
**You:** Create `projects/obsidian-integration/2025-11-07-initial-brainstorm.md` with frontmatter
**User:** "Create a design doc for obsidian-integration"
**You:** Create `2025-11-08-architecture-design.md`, link to `[[2025-11-07-initial-brainstorm]]`
**User:** "Promote that git-worktrees note from inbox to a project"
**You:**
1. Found `_inbox/2025-11-07-git-worktrees-idea.md`
2. Create `projects/git-worktrees/`
3. Move and rename → `2025-11-07-initial-brainstorm.md`
4. Update frontmatter: `project: git-worktrees`, add `promoted: 2025-11-08`