Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "obsidian-vault-manager",
|
||||||
|
"description": "Manage Obsidian knowledge base with smart capture, AI-powered tagging, and publishing workflows",
|
||||||
|
"version": "0.0.0-2025.11.28",
|
||||||
|
"author": {
|
||||||
|
"name": "Zorro Cheng",
|
||||||
|
"email": "zorrocheng.mc@gmail.com"
|
||||||
|
},
|
||||||
|
"commands": [
|
||||||
|
"./commands"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# obsidian-vault-manager
|
||||||
|
|
||||||
|
Manage Obsidian knowledge base with smart capture, AI-powered tagging, and publishing workflows
|
||||||
181
commands/bulk-auto-tag.md
Normal file
181
commands/bulk-auto-tag.md
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
---
|
||||||
|
description: Bulk AI-powered tagging for existing notes to enable Bases filtering
|
||||||
|
argument-hint: [folder-path or file-pattern]
|
||||||
|
allowed-tools:
|
||||||
|
- Read(*)
|
||||||
|
- Edit(*)
|
||||||
|
- Glob(*)
|
||||||
|
- Bash(*)
|
||||||
|
---
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
- **Today's Date:** !`date "+%Y-%m-%d"`
|
||||||
|
- **Target:** `$ARGUMENTS` (defaults to all .md files if not specified)
|
||||||
|
|
||||||
|
## Tag Taxonomy Reference
|
||||||
|
|
||||||
|
Use the same taxonomy as `/capture`:
|
||||||
|
|
||||||
|
**Content Types:** idea, video, article, study-guide, repository, reference, project
|
||||||
|
**Topics:** AI, Claude, Gemini, product, marketing, projects, workflow, architecture, design, UI-UX, coding, productivity, knowledge-management, development, learning, research, writing, tools, business, automation, data-science, web-development, personal-growth, finance
|
||||||
|
**Status:** inbox, processing, evergreen, published, archived, needs-review
|
||||||
|
**Metadata:** high-priority, quick-read, deep-dive, technical, conceptual, actionable, tutorial, inspiration
|
||||||
|
|
||||||
|
## Your Task
|
||||||
|
|
||||||
|
### Step 1: Discover Files to Tag
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# If user provided pattern:
|
||||||
|
find . -name "$ARGUMENTS" -type f
|
||||||
|
|
||||||
|
# If no arguments (tag everything):
|
||||||
|
find . -name "*.md" -type f -not -path "./.obsidian/*" -not -path "./.claude/*"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Process Each File
|
||||||
|
|
||||||
|
For each discovered file:
|
||||||
|
|
||||||
|
1. **Read the file content**
|
||||||
|
2. **Analyze existing frontmatter**:
|
||||||
|
- Check if `tags:` field exists
|
||||||
|
- Check if tags are already comprehensive (5+ tags from taxonomy)
|
||||||
|
|
||||||
|
3. **Skip if already well-tagged** (has 5+ taxonomy-compliant tags)
|
||||||
|
|
||||||
|
4. **Analyze content** to determine:
|
||||||
|
- Content type (from filename, existing tags, content)
|
||||||
|
- Main topics (2-4 from content analysis)
|
||||||
|
- Status (infer from content or default to `evergreen` for old notes)
|
||||||
|
- Metadata characteristics
|
||||||
|
|
||||||
|
5. **Generate enhanced tag array**:
|
||||||
|
```yaml
|
||||||
|
tags: [{content-type}, {topic1}, {topic2}, {topic3}, {status}, {metadata}]
|
||||||
|
```
|
||||||
|
|
||||||
|
6. **Update frontmatter** while preserving existing data:
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
title: "{existing or generated}"
|
||||||
|
tags: [{enhanced-tag-array}]
|
||||||
|
date: "{existing or file creation date}"
|
||||||
|
type: "{content-type}"
|
||||||
|
status: "{status}"
|
||||||
|
# preserve any other existing fields
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Report Progress
|
||||||
|
|
||||||
|
After processing each batch of 5-10 files, report:
|
||||||
|
```
|
||||||
|
✅ Tagged 10 files:
|
||||||
|
- 3 ideas tagged with [idea, productivity, ...]
|
||||||
|
- 2 videos tagged with [video, AI, learning, ...]
|
||||||
|
- 5 articles tagged with [article, development, ...]
|
||||||
|
|
||||||
|
📊 Progress: 10/47 files processed
|
||||||
|
🏷️ Total tags added: 73 tags
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Summary Report
|
||||||
|
|
||||||
|
After all files processed:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Bulk Tagging Report
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
- **Files processed:** 47
|
||||||
|
- **Files updated:** 43
|
||||||
|
- **Files skipped:** 4 (already well-tagged)
|
||||||
|
- **Total tags added:** 312
|
||||||
|
- **Average tags per note:** 7.3
|
||||||
|
|
||||||
|
## Tag Distribution
|
||||||
|
|
||||||
|
### By Content Type
|
||||||
|
- idea: 15 notes
|
||||||
|
- video: 8 notes
|
||||||
|
- article: 12 notes
|
||||||
|
- study-guide: 6 notes
|
||||||
|
- repository: 2 notes
|
||||||
|
|
||||||
|
### By Topic
|
||||||
|
- AI: 23 notes
|
||||||
|
- productivity: 18 notes
|
||||||
|
- knowledge-management: 15 notes
|
||||||
|
- development: 12 notes
|
||||||
|
- learning: 10 notes
|
||||||
|
|
||||||
|
### By Status
|
||||||
|
- inbox: 12 notes
|
||||||
|
- evergreen: 28 notes
|
||||||
|
- published: 7 notes
|
||||||
|
|
||||||
|
## Bases Filtering Suggestions
|
||||||
|
|
||||||
|
You can now create Bases views like:
|
||||||
|
1. **AI Learning Pipeline**: `type = video AND topic = AI AND status = inbox`
|
||||||
|
2. **Quick Wins**: `metadata = quick-read AND priority = high-priority`
|
||||||
|
3. **Technical Deep Dives**: `metadata = technical AND metadata = deep-dive`
|
||||||
|
4. **Actionable Items**: `metadata = actionable AND status != archived`
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
1. Review auto-tagged notes in Obsidian
|
||||||
|
2. Create Bases views using these tags
|
||||||
|
3. Refine tags manually if needed
|
||||||
|
4. Run `/bulk-auto-tag` periodically for new notes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Important Rules
|
||||||
|
|
||||||
|
1. **Preserve existing data**: Never delete user-added tags or properties
|
||||||
|
2. **Merge intelligently**: Combine AI tags with existing tags (deduplicate)
|
||||||
|
3. **Be conservative**: If uncertain about content type, default to `reference`
|
||||||
|
4. **Handle errors gracefully**: Skip files with invalid frontmatter, report errors
|
||||||
|
5. **Respect user intent**: If a file has explicit tags, enhance rather than replace
|
||||||
|
|
||||||
|
## Example Transformations
|
||||||
|
|
||||||
|
### Before (minimal tags):
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
tags: [idea]
|
||||||
|
date: 2025-09-15
|
||||||
|
---
|
||||||
|
|
||||||
|
# AI-powered tagging
|
||||||
|
Use Claude to auto-tag notes for better organization
|
||||||
|
```
|
||||||
|
|
||||||
|
### After (enhanced tags):
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
title: "AI-powered tagging"
|
||||||
|
tags: [idea, AI, knowledge-management, tools, evergreen, actionable, technical]
|
||||||
|
date: 2025-09-15
|
||||||
|
type: idea
|
||||||
|
status: evergreen
|
||||||
|
priority: medium
|
||||||
|
---
|
||||||
|
|
||||||
|
# AI-powered tagging
|
||||||
|
Use Claude to auto-tag notes for better organization
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Process files in batches of 10
|
||||||
|
- Show progress every batch
|
||||||
|
- Allow user to cancel with Ctrl+C
|
||||||
|
- Estimate time for large vaults: ~2-3 seconds per file
|
||||||
|
|
||||||
|
## Safety Features
|
||||||
|
|
||||||
|
1. **Dry run mode** (optional): Show what would be changed without modifying files
|
||||||
|
2. **Backup reminder**: Remind user to commit to git before bulk operations
|
||||||
|
3. **Undo support**: Provide git commands to rollback if needed
|
||||||
164
commands/capture.md
Normal file
164
commands/capture.md
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
---
|
||||||
|
description: Smart capture with AI-powered auto-tagging for Bases filtering
|
||||||
|
argument-hint: [content to capture]
|
||||||
|
allowed-tools:
|
||||||
|
- Skill(obsidian-vault-manager)
|
||||||
|
- SlashCommand(/gitingest)
|
||||||
|
- Bash(*)
|
||||||
|
- mcp__fetch__fetch
|
||||||
|
- mcp__MCP_DOCKER__get_file_contents
|
||||||
|
- mcp__MCP_DOCKER__list_commits
|
||||||
|
- mcp__MCP_DOCKER__get_video_info
|
||||||
|
- mcp__MCP_DOCKER__get_transcript
|
||||||
|
- mcp__obsidian-mcp-tools__create_vault_file
|
||||||
|
---
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Execute the `obsidian-vault-manager` skill for universal content capture.
|
||||||
|
|
||||||
|
**Input**: `$ARGUMENTS` (YouTube URL, GitHub URL, web article, or plain text)
|
||||||
|
**Operation**: Intelligent routing with AI-powered tagging
|
||||||
|
|
||||||
|
## Process
|
||||||
|
|
||||||
|
The skill will:
|
||||||
|
1. **Analyze content type** from input
|
||||||
|
- YouTube URL → Video capture workflow
|
||||||
|
- **GitHub URL → Delegate to `/gitingest` command**
|
||||||
|
- HTTP/HTTPS URL → Article capture workflow
|
||||||
|
- Plain text → Idea capture workflow
|
||||||
|
|
||||||
|
2. **Apply AI-powered tagging** from predefined taxonomy
|
||||||
|
- Content type tags (video, idea, article, repository)
|
||||||
|
- Topic tags (2-4 relevant topics: AI, productivity, development, etc.)
|
||||||
|
- Status tags (inbox for new captures)
|
||||||
|
- Metadata tags (actionable, technical, tutorial, etc.)
|
||||||
|
|
||||||
|
3. **Create properly formatted note** using bundled templates
|
||||||
|
- Smart filename generation
|
||||||
|
- Comprehensive frontmatter
|
||||||
|
- Structured content sections
|
||||||
|
- Tag analysis and Bases filtering suggestions
|
||||||
|
|
||||||
|
## GitHub Repository Handling (IMPORTANT)
|
||||||
|
|
||||||
|
**When a GitHub URL is detected:**
|
||||||
|
|
||||||
|
1. **Extract GitHub URL** from `$ARGUMENTS`
|
||||||
|
2. **Call `/gitingest` command** using `SlashCommand` tool:
|
||||||
|
```
|
||||||
|
SlashCommand("/gitingest https://github.com/owner/repo")
|
||||||
|
```
|
||||||
|
3. **The `/gitingest` command will:**
|
||||||
|
- Use MCP Docker GitHub tools (`get_file_contents`, `list_commits`)
|
||||||
|
- Analyze repository structure and contents
|
||||||
|
- Generate comprehensive markdown with proper tagging
|
||||||
|
- Auto-save to `/Users/zorro/Documents/Obsidian/Claudecode/`
|
||||||
|
4. **Return success** - `/gitingest` handles the complete workflow
|
||||||
|
|
||||||
|
**DO NOT:**
|
||||||
|
- ❌ Manually call `mcp__gitingest__*` tools (deprecated)
|
||||||
|
- ❌ Try to analyze GitHub repos yourself
|
||||||
|
- ❌ Use the obsidian-vault-manager skill for GitHub URLs
|
||||||
|
|
||||||
|
**Example Flow:**
|
||||||
|
```
|
||||||
|
User: /capture https://github.com/anthropics/claude-code
|
||||||
|
|
||||||
|
→ Detect: GitHub URL
|
||||||
|
→ Execute: SlashCommand("/gitingest https://github.com/anthropics/claude-code")
|
||||||
|
→ Result: Complete repository analysis saved to Obsidian
|
||||||
|
```
|
||||||
|
|
||||||
|
## Content Routing
|
||||||
|
|
||||||
|
The skill automatically routes based on input:
|
||||||
|
|
||||||
|
**YouTube Videos:**
|
||||||
|
- Pattern: `youtube.com/watch?v=` or `youtu.be/`
|
||||||
|
- Fetches transcript and metadata
|
||||||
|
- Template: `templates/youtube-note-template.md`
|
||||||
|
- Tags: `[video, {topics}, inbox, {metadata}]`
|
||||||
|
|
||||||
|
**GitHub Repositories:**
|
||||||
|
- Pattern: `github.com/owner/repo`
|
||||||
|
- Uses `/gitingest` command (MCP Docker GitHub tools)
|
||||||
|
- Creates comprehensive repository analysis
|
||||||
|
- Tags: `[repository, {language}, {topics}, inbox, technical]`
|
||||||
|
|
||||||
|
**Web Articles:**
|
||||||
|
- Pattern: HTTP/HTTPS URLs (not YouTube/GitHub)
|
||||||
|
- Fetches and summarizes content
|
||||||
|
- Extracts key takeaways
|
||||||
|
- Tags: `[article, {topics}, inbox, quick-read]`
|
||||||
|
|
||||||
|
**Ideas & Thoughts:**
|
||||||
|
- Pattern: Plain text without URL
|
||||||
|
- Template: `templates/idea-template.md`
|
||||||
|
- Smart filename from content
|
||||||
|
- Tags: `[idea, {topics}, inbox, {metadata}]`
|
||||||
|
|
||||||
|
## Tag Taxonomy
|
||||||
|
|
||||||
|
All tags come from the predefined taxonomy in the skill:
|
||||||
|
|
||||||
|
### Content Type (1 tag)
|
||||||
|
video, idea, article, study-guide, repository, reference, project
|
||||||
|
|
||||||
|
### Topics (2-4 tags)
|
||||||
|
AI, Claude, Gemini, product, marketing, projects, workflow, architecture,
|
||||||
|
design, UI-UX, coding, productivity, knowledge-management, development,
|
||||||
|
learning, research, writing, tools, business, automation, data-science,
|
||||||
|
web-development, personal-growth, finance
|
||||||
|
|
||||||
|
### Status (1 tag)
|
||||||
|
inbox, processing, evergreen, published, archived, needs-review
|
||||||
|
|
||||||
|
### Metadata (0-2 tags)
|
||||||
|
high-priority, quick-read, deep-dive, technical, conceptual,
|
||||||
|
actionable, tutorial, inspiration
|
||||||
|
|
||||||
|
## Expected Output
|
||||||
|
|
||||||
|
After successful capture:
|
||||||
|
- ✅ Content analyzed and type detected
|
||||||
|
- ✅ Smart tags applied (6-8 total)
|
||||||
|
- ✅ Note created with proper filename
|
||||||
|
- ✅ Template populated with content
|
||||||
|
- ✅ Tag analysis section added
|
||||||
|
- ✅ Bases filtering suggestions included
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
**YouTube video:**
|
||||||
|
```
|
||||||
|
/capture https://youtube.com/watch?v=abc123
|
||||||
|
```
|
||||||
|
→ Creates video note with transcript, learning objectives, curriculum
|
||||||
|
|
||||||
|
**GitHub repo:**
|
||||||
|
```
|
||||||
|
/capture https://github.com/anthropics/claude-code
|
||||||
|
```
|
||||||
|
→ Creates repository analysis with architecture overview
|
||||||
|
|
||||||
|
**Article:**
|
||||||
|
```
|
||||||
|
/capture https://medium.com/article-about-ai
|
||||||
|
```
|
||||||
|
→ Creates article summary with key takeaways
|
||||||
|
|
||||||
|
**Quick idea:**
|
||||||
|
```
|
||||||
|
/capture Use AI to automatically categorize notes
|
||||||
|
```
|
||||||
|
→ Creates idea note with smart filename and tags
|
||||||
|
|
||||||
|
## Integration with Bases
|
||||||
|
|
||||||
|
Tags enable powerful Bases filtering:
|
||||||
|
- `type = video AND tags contains "AI"`
|
||||||
|
- `tags contains "inbox" AND tags contains "high-priority"`
|
||||||
|
- `tags contains "actionable" AND status = "processing"`
|
||||||
|
- `type = repository AND tags contains "development"`
|
||||||
54
commands/idea.md
Normal file
54
commands/idea.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
description: Create an idea file with AI-powered smart tagging for Bases filtering
|
||||||
|
argument-hint: [idea-text] (Your idea or concept to capture)
|
||||||
|
allowed-tools:
|
||||||
|
- Skill(obsidian-vault-manager)
|
||||||
|
- Bash(*)
|
||||||
|
- mcp__obsidian-mcp-tools__create_vault_file
|
||||||
|
---
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Execute the `obsidian-vault-manager` skill for idea capture.
|
||||||
|
|
||||||
|
**Input**: `$ARGUMENTS` (Plain text idea or concept)
|
||||||
|
**Operation**: Idea note creation
|
||||||
|
**Today's Date**: Run `date "+%Y-%m-%d"` to get current date
|
||||||
|
|
||||||
|
## Process
|
||||||
|
|
||||||
|
The skill will:
|
||||||
|
1. Analyze idea content and determine main concepts
|
||||||
|
2. Apply bundled template: `templates/idea-template.md`
|
||||||
|
3. Analyze content and apply AI-powered smart tagging (using tag taxonomy)
|
||||||
|
4. Generate smart filename: `{date}-{3-5-word-idea-name}.md`
|
||||||
|
5. Substitute all template variables with analyzed data
|
||||||
|
6. Create note in vault using MCP Obsidian tools
|
||||||
|
|
||||||
|
## Tag Taxonomy Reference
|
||||||
|
|
||||||
|
**Topics:** AI, productivity, knowledge-management, development, learning, research, writing, tools, business, design, automation, data-science, web-development, personal-growth, finance
|
||||||
|
**Status:** inbox (default for new ideas)
|
||||||
|
**Metadata:** actionable, conceptual, inspiration, high-priority
|
||||||
|
|
||||||
|
## Expected Output
|
||||||
|
|
||||||
|
A comprehensive idea note with:
|
||||||
|
- Proper frontmatter (title, tags, date, type, status, priority)
|
||||||
|
- Core idea explanation
|
||||||
|
- Why it matters section
|
||||||
|
- Related concepts
|
||||||
|
- Next steps (if actionable)
|
||||||
|
- Tags analysis and filtering suggestions
|
||||||
|
- Semantic search suggestions
|
||||||
|
|
||||||
|
**File naming format**: `[date]-[3-5-word-idea-name].md`
|
||||||
|
**Tag count**: 5-8 tags total
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
**Input**: "Use AI to automatically categorize notes"
|
||||||
|
→ `2025-10-23-ai-note-categorization.md`
|
||||||
|
|
||||||
|
**Input**: "Knowledge compounds when connected properly"
|
||||||
|
→ `2025-10-23-knowledge-compound-connections.md`
|
||||||
147
commands/publish.md
Normal file
147
commands/publish.md
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
---
|
||||||
|
description: Publish note to GitHub Pages (sharehub) with proper image handling
|
||||||
|
argument-hint: [filename] (note to publish, e.g., my-article.md)
|
||||||
|
allowed-tools:
|
||||||
|
- Bash(*)
|
||||||
|
- mcp__fetch__fetch
|
||||||
|
- mcp__github__*
|
||||||
|
---
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Publish note to GitHub Pages using the bundled publish script.
|
||||||
|
|
||||||
|
**Input**: `$ARGUMENTS` (filename with or without .md extension)
|
||||||
|
**Operation**: Publish to GitHub Pages with image handling
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Run the bundled publish script directly:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
SKILL_DIR="$HOME/.claude/skills/obsidian-vault-manager"
|
||||||
|
"$SKILL_DIR/scripts/core/publish.sh" "$ARGUMENTS"
|
||||||
|
```
|
||||||
|
|
||||||
|
The script will:
|
||||||
|
1. Validate note exists in vault
|
||||||
|
2. Find all image references in note
|
||||||
|
3. Copy images from vault to sharehub repository
|
||||||
|
4. Convert image paths (./images/ → /sharehub/images/)
|
||||||
|
5. Copy note with converted paths to sharehub/documents/
|
||||||
|
6. Git commit and push to GitHub
|
||||||
|
7. Output the published URL
|
||||||
|
|
||||||
|
## After Script Completes
|
||||||
|
|
||||||
|
1. Wait for GitHub Pages deployment (~60 seconds):
|
||||||
|
```bash
|
||||||
|
sleep 60
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Verify published page using `mcp__fetch__fetch`
|
||||||
|
|
||||||
|
## Publishing Configuration
|
||||||
|
|
||||||
|
- **Vault Path**: `/Users/zorro/Documents/Obsidian/Claudecode`
|
||||||
|
- **Sharehub Path**: `/Users/zorro/Dev/sharehub`
|
||||||
|
- **Repository**: `ZorroCheng-MC/sharehub`
|
||||||
|
- **GitHub Pages URL**: `https://zorrocheng-mc.github.io/sharehub`
|
||||||
|
|
||||||
|
## Image Path Conversion
|
||||||
|
|
||||||
|
The script automatically converts:
|
||||||
|
- `./images/file.jpg` → `/sharehub/images/file.jpg`
|
||||||
|
- `images/file.jpg` → `/sharehub/images/file.jpg`
|
||||||
|
- External URLs (https://...) remain unchanged
|
||||||
|
|
||||||
|
## Expected Output
|
||||||
|
|
||||||
|
After successful publish:
|
||||||
|
- ✅ Images copied to sharehub repository
|
||||||
|
- ✅ Note copied with converted paths
|
||||||
|
- ✅ Git commit created with proper message
|
||||||
|
- ✅ Pushed to GitHub
|
||||||
|
- ✅ GitHub Pages deployment triggered
|
||||||
|
- ✅ Published URL: `https://zorrocheng-mc.github.io/sharehub/documents/{filename}.html`
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
**Publish with extension:**
|
||||||
|
```
|
||||||
|
/publish my-article.md
|
||||||
|
```
|
||||||
|
|
||||||
|
**Publish without extension (auto-adds .md):**
|
||||||
|
```
|
||||||
|
/publish my-article
|
||||||
|
```
|
||||||
|
|
||||||
|
## Password Protection (Sharehub Feature)
|
||||||
|
|
||||||
|
**Sharehub supports password-protected documents via frontmatter!**
|
||||||
|
|
||||||
|
### To Make a Document Private:
|
||||||
|
|
||||||
|
Add `access: private` to the frontmatter:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
title: "Confidential Document"
|
||||||
|
access: private
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
**How it works:**
|
||||||
|
- Documents **without** `access: private` → Publicly accessible
|
||||||
|
- Documents **with** `access: private` → Password-protected
|
||||||
|
- **Password**: "maco" (shared password for all private documents)
|
||||||
|
- **Session**: Password remembered until browser closed
|
||||||
|
|
||||||
|
### Example: Publishing Private Document
|
||||||
|
|
||||||
|
**Frontmatter:**
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
title: "Claude Dev Users: Multi-User Docker Environment"
|
||||||
|
tags:
|
||||||
|
- repository
|
||||||
|
- docker
|
||||||
|
- infrastructure
|
||||||
|
access: private
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
**Result:**
|
||||||
|
- Document published to sharehub
|
||||||
|
- Requires password "maco" to view
|
||||||
|
- Listed in index with 🔒 lock icon (after login)
|
||||||
|
|
||||||
|
### Index Page Behavior
|
||||||
|
|
||||||
|
- **Before login**: Shows only public documents
|
||||||
|
- **After login**: Shows all documents (public + private) with 🔒 icons
|
||||||
|
|
||||||
|
### Publishing Workflow
|
||||||
|
|
||||||
|
1. **Add `access: private` to frontmatter** (if needed)
|
||||||
|
2. **Run `/publish filename.md`**
|
||||||
|
3. **Script publishes** to sharehub/documents/
|
||||||
|
4. **GitHub Pages builds** (~60 seconds)
|
||||||
|
5. **Document accessible** with password protection
|
||||||
|
|
||||||
|
### Important Notes
|
||||||
|
|
||||||
|
- **Default**: Documents are public unless `access: private` is specified
|
||||||
|
- **Password**: All private documents use "maco"
|
||||||
|
- **No folder restrictions**: Protection is tag-based, not folder-based
|
||||||
|
- **Session storage**: Login persists until browser closed
|
||||||
|
|
||||||
|
## Quality Checklist
|
||||||
|
|
||||||
|
Before publishing, verify:
|
||||||
|
- [ ] Note has proper frontmatter (title, tags, date)
|
||||||
|
- [ ] Add `access: private` if document contains sensitive information
|
||||||
|
- [ ] Images exist in vault at specified paths
|
||||||
|
- [ ] Image paths are relative (./images/ or images/)
|
||||||
|
- [ ] Note is ready for viewing (public or password-protected)
|
||||||
25
commands/semantic-search.md
Normal file
25
commands/semantic-search.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
description: Perform semantic search in Obsidian vault using Smart Connections via Local REST API
|
||||||
|
allowed-tools:
|
||||||
|
- Bash(curl:*)
|
||||||
|
---
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
- **Search Query:** `$ARGUMENTS`
|
||||||
|
- **API Configuration:** Local REST API running on https://127.0.0.1:27124/
|
||||||
|
- **Smart Connections Endpoint:** `/search/smart`
|
||||||
|
|
||||||
|
## Your task
|
||||||
|
|
||||||
|
Execute a semantic search in the Obsidian vault using the Smart Connections plugin via curl.
|
||||||
|
|
||||||
|
Run this single command to perform the search:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -k -X POST \
|
||||||
|
https://127.0.0.1:27124/search/smart \
|
||||||
|
-H "Authorization: Bearer $(grep LOCAL_REST_API_KEY .env | cut -d'=' -f2)" \
|
||||||
|
-H "Content-Type: text/plain" \
|
||||||
|
-d "{\"query\": \"$ARGUMENTS\", \"filter\": {\"limit\": 5}}" | jq .
|
||||||
|
```
|
||||||
105
commands/setup.md
Normal file
105
commands/setup.md
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
---
|
||||||
|
description: Interactive setup wizard for Obsidian Vault Manager
|
||||||
|
allowed-tools:
|
||||||
|
- Bash(*)
|
||||||
|
- Read(*)
|
||||||
|
- Write(*)
|
||||||
|
---
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
- **Current Directory:** `$PWD`
|
||||||
|
- **Plugin Location:** `~/.claude/plugins/marketplaces/obsidian-vault-manager-plugin/`
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Run the interactive setup wizard to configure Obsidian Vault Manager for this vault.
|
||||||
|
|
||||||
|
**Important:** You must run Claude Code from your Obsidian vault directory for this setup to work correctly.
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Execute the setup script from the plugin directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Locate the plugin installation
|
||||||
|
PLUGIN_DIR="$HOME/.claude/plugins/marketplaces/obsidian-vault-manager-plugin"
|
||||||
|
|
||||||
|
# Check if plugin is installed
|
||||||
|
if [[ ! -d "$PLUGIN_DIR" ]]; then
|
||||||
|
echo "❌ Plugin not found. Please install it first:"
|
||||||
|
echo " claude plugin add obsidian-vault-manager"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run setup script
|
||||||
|
SETUP_SCRIPT="$PLUGIN_DIR/scripts/setup.sh"
|
||||||
|
|
||||||
|
if [[ -f "$SETUP_SCRIPT" ]]; then
|
||||||
|
chmod +x "$SETUP_SCRIPT"
|
||||||
|
bash "$SETUP_SCRIPT"
|
||||||
|
else
|
||||||
|
echo "❌ Setup script not found at: $SETUP_SCRIPT"
|
||||||
|
echo "Plugin may be corrupted. Try reinstalling:"
|
||||||
|
echo " claude plugin remove obsidian-vault-manager"
|
||||||
|
echo " claude plugin add obsidian-vault-manager"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
## What This Does
|
||||||
|
|
||||||
|
The setup wizard will:
|
||||||
|
|
||||||
|
1. **Detect Your Vault**
|
||||||
|
- Verifies you're in an Obsidian vault (checks for `.obsidian/` folder)
|
||||||
|
- Confirms the vault path
|
||||||
|
|
||||||
|
2. **Check Dependencies**
|
||||||
|
- uv/uvx (for YouTube transcripts)
|
||||||
|
- jq (for JSON processing)
|
||||||
|
- python3 (for image path conversion)
|
||||||
|
- git (for publishing)
|
||||||
|
|
||||||
|
3. **Configure GitHub Pages** (optional)
|
||||||
|
- GitHub Pages repository path
|
||||||
|
- GitHub Pages URL
|
||||||
|
- Repository name
|
||||||
|
|
||||||
|
4. **Create Configuration Files**
|
||||||
|
- `.claude/settings.local.json` (vault-specific settings)
|
||||||
|
- `.claude/config.sh` (for bash scripts)
|
||||||
|
- `.claude/.gitignore` (prevents committing personal paths)
|
||||||
|
|
||||||
|
## After Setup
|
||||||
|
|
||||||
|
Your vault will have:
|
||||||
|
|
||||||
|
```
|
||||||
|
your-vault/
|
||||||
|
└── .claude/
|
||||||
|
├── settings.local.json (vault-specific configuration)
|
||||||
|
├── config.sh (script configuration)
|
||||||
|
└── .gitignore (prevents committing personal paths)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
**"Not in vault directory"**
|
||||||
|
- Make sure you `cd` to your vault first
|
||||||
|
- Check that `.obsidian/` folder exists
|
||||||
|
|
||||||
|
**"Plugin not found"**
|
||||||
|
- Install plugin: `claude plugin add obsidian-vault-manager`
|
||||||
|
|
||||||
|
**"Missing dependencies"**
|
||||||
|
- Install with: `brew install uv jq git`
|
||||||
|
|
||||||
|
## Re-running Setup
|
||||||
|
|
||||||
|
You can run `/setup` again to:
|
||||||
|
- Update paths
|
||||||
|
- Reconfigure GitHub Pages
|
||||||
|
- Fix broken configuration
|
||||||
|
|
||||||
|
Existing configuration will be overwritten.
|
||||||
66
commands/study-guide.md
Normal file
66
commands/study-guide.md
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
description: Generate comprehensive study guide with AI-powered smart tagging from any content source
|
||||||
|
argument-hint: [content-source] (file path, URL, or direct text to create study guide from)
|
||||||
|
allowed-tools:
|
||||||
|
- Skill(obsidian-vault-manager)
|
||||||
|
- Bash(*)
|
||||||
|
- Read(*)
|
||||||
|
- mcp__fetch__fetch
|
||||||
|
- mcp__obsidian-mcp-tools__create_vault_file
|
||||||
|
- mcp__obsidian-mcp-tools__get_vault_file
|
||||||
|
---
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Execute the `obsidian-vault-manager` skill for study guide creation.
|
||||||
|
|
||||||
|
**Input**: `$ARGUMENTS` (file path, URL, or direct text)
|
||||||
|
**Operation**: Study guide creation
|
||||||
|
**Today's Date**: Run `date "+%Y-%m-%d"` to get current date
|
||||||
|
|
||||||
|
## Process
|
||||||
|
|
||||||
|
The skill will:
|
||||||
|
1. Fetch content from URL, file, or direct text
|
||||||
|
2. Apply bundled template: `templates/study-guide-template.md`
|
||||||
|
3. Analyze content complexity, topics, and learning requirements
|
||||||
|
4. Apply AI-powered smart tagging (using tag taxonomy)
|
||||||
|
5. Generate structured learning plan with objectives and assessments
|
||||||
|
6. Substitute all template variables with analyzed data
|
||||||
|
7. Create note in vault using MCP Obsidian tools
|
||||||
|
|
||||||
|
## Tag Taxonomy Reference
|
||||||
|
|
||||||
|
**Topics:** AI, productivity, knowledge-management, development, learning, research, writing, tools, business, design, automation, data-science, web-development, personal-growth, finance
|
||||||
|
**Status:** processing (default for study guides - active learning)
|
||||||
|
**Metadata:** deep-dive, technical, conceptual, actionable, tutorial
|
||||||
|
|
||||||
|
## Expected Output
|
||||||
|
|
||||||
|
A comprehensive study guide with:
|
||||||
|
- Proper frontmatter (title, tags, source, date, type, status, difficulty, estimated-time, priority)
|
||||||
|
- Overview with subject and generated date
|
||||||
|
- Learning objectives (specific, measurable, checkboxed)
|
||||||
|
- Study plan with time estimates and difficulty level
|
||||||
|
- Structured content breakdown (weekly/modular)
|
||||||
|
- Study strategies (material-specific and active learning techniques)
|
||||||
|
- Self-assessment questions (intermediate and final)
|
||||||
|
- Progress tracking section
|
||||||
|
- Related notes and connections
|
||||||
|
- Tags analysis with filtering suggestions
|
||||||
|
- Semantic search suggestions
|
||||||
|
|
||||||
|
**File naming format**: `[date]-[topic-name]-study-guide.md`
|
||||||
|
**Tag count**: 6-8 tags total
|
||||||
|
**Status**: Always `processing` (active study material)
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
**Input (URL)**: "https://example.com/machine-learning-course"
|
||||||
|
→ `2025-10-28-machine-learning-study-guide.md`
|
||||||
|
|
||||||
|
**Input (File)**: "react-advanced-patterns.md"
|
||||||
|
→ `2025-10-28-react-advanced-study-guide.md`
|
||||||
|
|
||||||
|
**Input (Text)**: "Deep dive into distributed systems architecture"
|
||||||
|
→ `2025-10-28-distributed-systems-study-guide.md`
|
||||||
49
commands/youtube-note.md
Normal file
49
commands/youtube-note.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
---
|
||||||
|
description: Fetch YouTube video transcript and create comprehensive material entry with AI-powered smart tagging
|
||||||
|
argument-hint: [youtube-url-or-video-id] (YouTube URL or video ID to process)
|
||||||
|
allowed-tools:
|
||||||
|
- Skill(obsidian-vault-manager)
|
||||||
|
- Bash(*)
|
||||||
|
- mcp__obsidian-mcp-tools__create_vault_file
|
||||||
|
- mcp__fetch__fetch
|
||||||
|
---
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Execute the `obsidian-vault-manager` skill for YouTube note capture.
|
||||||
|
|
||||||
|
**Input**: `$ARGUMENTS` (YouTube URL or video ID)
|
||||||
|
**Operation**: YouTube video note creation
|
||||||
|
**Today's Date**: Run `date "+%Y-%m-%d"` to get current date
|
||||||
|
|
||||||
|
## Process
|
||||||
|
|
||||||
|
The skill will:
|
||||||
|
1. Extract video ID from URL/argument
|
||||||
|
2. Use bundled script: `scripts/core/fetch-youtube-transcript.sh` to fetch transcript
|
||||||
|
3. Fetch video metadata from YouTube page
|
||||||
|
4. Apply bundled template: `templates/youtube-note-template.md`
|
||||||
|
5. Analyze content and apply AI-powered smart tagging (using tag taxonomy)
|
||||||
|
6. Substitute all template variables with analyzed data
|
||||||
|
7. Create note in vault using MCP Obsidian tools
|
||||||
|
|
||||||
|
## Tag Taxonomy Reference
|
||||||
|
|
||||||
|
**Topics:** AI, productivity, knowledge-management, development, learning, research, writing, tools, business, design, automation, data-science, web-development, personal-growth, finance
|
||||||
|
**Status:** inbox (default for new videos)
|
||||||
|
**Metadata:** tutorial, deep-dive, quick-read, technical, conceptual, actionable, inspiration
|
||||||
|
|
||||||
|
## Expected Output
|
||||||
|
|
||||||
|
A comprehensive video note with:
|
||||||
|
- Proper frontmatter (title, tags, url, cover, date, type, status, priority, duration, channel)
|
||||||
|
- Clickable YouTube thumbnail
|
||||||
|
- Description and learning objectives
|
||||||
|
- Structured curriculum with timestamps
|
||||||
|
- Key takeaways and insights
|
||||||
|
- Rating section
|
||||||
|
- Tags analysis and filtering suggestions
|
||||||
|
- Related topics
|
||||||
|
|
||||||
|
**File naming format**: `[date]-[creator-name]-[descriptive-title].md`
|
||||||
|
**Tag count**: 6-8 tags total
|
||||||
73
plugin.lock.json
Normal file
73
plugin.lock.json
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:ZorroCheng-MC/obsidian-vault-manager-plugin:",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "bac2f32e7fbbfd71a6e73845bda5286e3a95c3e6",
|
||||||
|
"treeHash": "4a7751003ab5351e816e51d1be19e470124a4cc20a3dbf62acbf4d6bbf27daa1",
|
||||||
|
"generatedAt": "2025-11-28T10:13:00.009507Z",
|
||||||
|
"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-vault-manager",
|
||||||
|
"description": "Manage Obsidian knowledge base with smart capture, AI-powered tagging, and publishing workflows",
|
||||||
|
"version": null
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "7a6c201e1a83cd09fc6fd150897247be650eaadb25bd6e069f86c654d721674b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "bd46fbe299eb990159296520f80e9820b09d38fb499328e650bad51e7e27c84b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/study-guide.md",
|
||||||
|
"sha256": "566caf92a77ea0e7cb2fe4d2ac91b1148260082f85616b2a36b1a7edcf696c0a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/youtube-note.md",
|
||||||
|
"sha256": "b7134beeba6a272bd7db8922b765a8efebc9925d5fba1e5ffb68c9ee0f380164"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/capture.md",
|
||||||
|
"sha256": "19c0a2422bf27696fa6132167136e228b88136d449da67f1619d9421268fa57b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/setup.md",
|
||||||
|
"sha256": "16569758cdb2e3e993cf9f487f92fac02aa43b634dfe44763d4f7bb573ebe6c9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/publish.md",
|
||||||
|
"sha256": "014af1a559e2d8f8165623ce73a67bebc557b7f5384982ae7b4705f01d957ee9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/idea.md",
|
||||||
|
"sha256": "c74b654ad4e9119ec992d13064c8e4acbc098e3e6435aceb2cae41017f47452c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/semantic-search.md",
|
||||||
|
"sha256": "d67b4500865291e9ebb5e1b3eca0d02cf556793e6ccf36515c54a1d4569dc39a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/bulk-auto-tag.md",
|
||||||
|
"sha256": "d5f15eddb68cb3b3294ef72e6218fc9779ac6a819fb7f17cba54c39f13db06ec"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "4a7751003ab5351e816e51d1be19e470124a4cc20a3dbf62acbf4d6bbf27daa1"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user