feat: implement Obsidian MCP Bundle MVP (Phase 1-3)

- Complete project setup with TypeScript, Jest, MCPB manifest
- Implement foundational infrastructure (CLI executor, logger, error handler)
- Add 9 file operation tools for User Story 1
- Full MCP protocol compliance with stdio transport
- Input validation and sanitization for security
- Comprehensive error handling with actionable messages
- Constitutional compliance: all 6 principles satisfied

MVP includes:
- obsidian_create_note, read, append, prepend, delete, move, rename, open, file_info
- Zod validation schemas for all parameters
- 30s timeout configuration with per-command overrides
- Stderr-only logging with sanitized output
- Graceful shutdown handling

Build:  0 errors, 0 vulnerabilities
Tasks: 48/167 complete (MVP milestone)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-03-22 11:21:38 -05:00
parent e9e0112240
commit 622b28e42c
35 changed files with 5139 additions and 35 deletions

37
tests/fixtures/mock-cli-responses.json vendored Normal file
View File

@@ -0,0 +1,37 @@
{
"vault_list": {
"stdout": "Vault1\nVault2\nTestVault\n",
"stderr": "",
"exitCode": 0
},
"note_read_success": {
"stdout": "# Sample Note\n\nContent here",
"stderr": "",
"exitCode": 0
},
"note_not_found": {
"stdout": "",
"stderr": "Error: Note 'nonexistent.md' not found in vault 'TestVault'\n",
"exitCode": 1
},
"obsidian_not_running": {
"stdout": "",
"stderr": "Error: Obsidian is not running. Please start Obsidian and try again.\n",
"exitCode": 1
},
"ambiguous_note_name": {
"stdout": "",
"stderr": "Error: Multiple notes found with name 'Meeting':\n- notes/work/Meeting.md\n- notes/personal/Meeting.md\nPlease specify the exact path.\n",
"exitCode": 1
},
"create_note_success": {
"stdout": "Created note: MyNote.md\n",
"stderr": "",
"exitCode": 0
},
"search_results": {
"stdout": "notes/project-plan.md\nnotes/ideas.md\nnotes/meeting-2026-03-22.md\n",
"stderr": "",
"exitCode": 0
}
}