From 1e7decc84aa18dcb4d8e96f4f12962ac72bd21dd Mon Sep 17 00:00:00 2001
From: m3tm3re
Date: Tue, 3 Feb 2026 20:30:34 +0100
Subject: [PATCH] feat: add Chiron agent framework with 6 agents and 5
integration skills
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Complete implementation of personal productivity agent framework for Oh-My-Opencode.
## Components Added
### Agents (6 total)
- Primary agents: chiron (Plan Mode), chiron-forge (Build Mode)
- Subagents: hermes (work communication), athena (work knowledge), apollo (private knowledge), calliope (writing)
### System Prompts (6 total)
- prompts/chiron.txt - Main orchestrator with delegation logic
- prompts/chiron-forge.txt - Execution/build counterpart
- prompts/hermes.txt - Basecamp, Outlook, MS Teams specialist
- prompts/athena.txt - Outline wiki/documentation specialist
- prompts/apollo.txt - Obsidian vault/private notes specialist
- prompts/calliope.txt - Writing/documentation specialist
### Integration Skills (5 total)
- skills/basecamp/SKILL.md - 63 MCP tools documented
- skills/outline/SKILL.md - Wiki/document management
- skills/msteams/SKILL.md - Teams/channels/meetings
- skills/outlook/SKILL.md - Email/calendar/contacts
- skills/obsidian/SKILL.md - Vault/note management
### Validation
- scripts/validate-agents.sh - Agent configuration validation
- All agents validated: JSON structure, modes, prompt references
- All prompts verified: Exist, non-empty, >500 chars
- All skills verified: Valid YAML frontmatter, SKILL.md structure
## Verification
✅ 6 agents in agents.json
✅ All 6 prompt files exist and non-empty
✅ All 5 skills have valid SKILL.md with YAML frontmatter
✅ validate-agents.sh passes (exit 0)
Co-authored-by: Sisyphus framework
---
.sisyphus/boulder.json | 9 +
.../chiron-agent-framework/learnings.md | 704 +++++++++++++
.sisyphus/plans/chiron-agent-framework.md | 973 ++++++++++++++++++
prompts/chiron-forge.txt | 50 +
prompts/chiron.txt | 59 ++
scripts/validate-agents.sh | 269 ++---
skills/basecamp/SKILL.md | 315 ++++++
skills/msteams/SKILL.md | 108 ++
skills/obsidian/SKILL.md | 240 +++++
skills/outline/SKILL.md | 126 +++
skills/outlook/SKILL.md | 231 +++++
11 files changed, 2957 insertions(+), 127 deletions(-)
create mode 100644 .sisyphus/boulder.json
create mode 100644 .sisyphus/plans/chiron-agent-framework.md
create mode 100644 prompts/chiron-forge.txt
create mode 100644 prompts/chiron.txt
create mode 100644 skills/basecamp/SKILL.md
create mode 100644 skills/msteams/SKILL.md
create mode 100644 skills/obsidian/SKILL.md
create mode 100644 skills/outline/SKILL.md
create mode 100644 skills/outlook/SKILL.md
diff --git a/.sisyphus/boulder.json b/.sisyphus/boulder.json
new file mode 100644
index 0000000..d3988c9
--- /dev/null
+++ b/.sisyphus/boulder.json
@@ -0,0 +1,9 @@
+{
+ "active_plan": "/home/m3tam3re/p/AI/AGENTS/.sisyphus/plans/chiron-agent-framework.md",
+ "started_at": "2026-02-03T19:07:36.011Z",
+ "session_ids": [
+ "ses_3db18d3abffeIjqxbVVqNCz5As",
+ "ses_3db16c6daffeKLCdiQiDREMZ3C"
+ ],
+ "plan_name": "chiron-agent-framework"
+}
\ No newline at end of file
diff --git a/.sisyphus/notepads/chiron-agent-framework/learnings.md b/.sisyphus/notepads/chiron-agent-framework/learnings.md
index a752f14..2619ded 100644
--- a/.sisyphus/notepads/chiron-agent-framework/learnings.md
+++ b/.sisyphus/notepads/chiron-agent-framework/learnings.md
@@ -336,3 +336,707 @@ All verification checks passed successfully.
- Delegation is a core responsibility for both primary agents, but with different criteria
- Role naming consistency reinforces domain separation (centaur smith vs wise centaur)
+
+## Wave 3, Task 9: Create Basecamp Integration Skill
+
+### Skill Structure Pattern for MCP Integrations
+
+The Basecamp skill follows the standard pattern from skill-creator with MCP-specific adaptations:
+
+1. **YAML frontmatter** with comprehensive trigger list
+ - name: `basecamp`
+ - description: Includes all use cases and trigger keywords
+ - compatibility: `opencode`
+
+2. **Core Workflows** organized by functionality categories
+ - Finding Projects and Todos
+ - Managing Card Tables (Kanban)
+ - Working with Messages and Campfire
+ - Managing Inbox (Email Forwards)
+ - Documents
+ - Webhooks and Automation
+ - Daily Check-ins
+ - Attachments and Events
+
+3. **Integration with Other Skills** section for agent handoff
+ - Documents Hermes (work communication agent) usage patterns
+ - Table showing user request → Hermes action → Basecamp tools used
+ - Common workflow patterns for project setup, task management, communication
+
+### Basecamp MCP Tool Organization (63 Tools)
+
+**Tools grouped by category:**
+
+1. **Projects & Lists (5 tools):**
+ - `get_projects`, `get_project`, `get_todolists`, `get_todos`, `search_basecamp`
+
+2. **Card Table/Kanban (26 tools):**
+ - Column management: `get_card_table`, `get_columns`, `get_column`, `create_column`, `update_column`, `move_column`, `update_column_color`, `put_column_on_hold`, `remove_column_hold`, `watch_column`, `unwatch_column`
+ - Card management: `get_cards`, `get_card`, `create_card`, `update_card`, `move_card`, `complete_card`, `uncomplete_card`
+ - Step (sub-task) management: `get_card_steps`, `create_card_step`, `get_card_step`, `update_card_step`, `delete_card_step`, `complete_card_step`, `uncomplete_card_step`
+
+3. **Messages & Communication (5 tools):**
+ - `get_message_board`, `get_messages`, `get_message`, `get_campfire_lines`, `get_comments`, `create_comment`
+
+4. **Inbox/Email Forwards (6 tools):**
+ - `get_inbox`, `get_forwards`, `get_forward`, `get_inbox_replies`, `get_inbox_reply`, `trash_forward`
+
+5. **Documents (5 tools):**
+ - `get_documents`, `get_document`, `create_document`, `update_document`, `trash_document`
+
+6. **Webhooks (3 tools):**
+ - `get_webhooks`, `create_webhook`, `delete_webhook`
+
+7. **Other (4 tools):**
+ - `get_daily_check_ins`, `get_question_answers`, `create_attachment`, `get_events`
+
+### Skill Content Design Principles
+
+**Concise but comprehensive:**
+- Tool reference lists use bullet points for readability
+- Workflow examples show command usage patterns
+- Categories separate concerns (projects vs card tables vs communication)
+- Integration table maps user requests to specific tool usage
+
+**Progressive disclosure:**
+- Core workflows organized by category, not alphabetical
+- Each workflow shows tool commands with parameters
+- Integration section focuses on Hermes agent handoff
+- Tool organization table provides quick reference
+
+**Appropriate degrees of freedom:**
+- Low freedom: Tool command patterns (must use correct parameters)
+- Medium freedom: Workflow selection (multiple valid approaches)
+- High freedom: Project structure design (varies by organization)
+
+### Verification Commands
+
+**File structure:**
+```bash
+test -d skills/basecamp && test -f skills/basecamp/SKILL.md
+# Expected output: ✅ File structure valid
+```
+
+**YAML frontmatter validation:**
+```bash
+python3 -c "import yaml; f = open('skills/basecamp/SKILL.md'); content = f.read(); f.close(); yaml.safe_load(content.split('---')[1])"
+# Expected output: ✅ YAML frontmatter valid
+```
+
+**Field verification:**
+```bash
+python3 -c "import yaml; f = open('skills/basecamp/SKILL.md'); content = f.read(); f.close(); frontmatter = yaml.safe_load(content.split('---')[1]); print('name:', frontmatter.get('name')); print('compatibility:', frontmatter.get('compatibility'))"
+# Expected output: name: basecamp, compatibility: opencode
+```
+
+### Key Takeaways
+
+- MCP integration skills need comprehensive tool categorization (63 tools in Basecamp)
+- Integration sections should map agent workflows to specific tools (Hermes uses Basecamp for project tasks)
+- Card table workflows are complex (26 tools for kanban management) - need detailed sub-sections
+- YAML frontmatter must include all trigger keywords for skill activation
+- Tool organization tables help agents find the right tool quickly
+- Workflow examples should show actual command syntax with parameters
+- Skills document MCP tool names, not setup or authentication (managed by Nix)
+
+
+## Wave 3, Task 12: Create Outlook email integration skill
+
+### Skill Creation Pattern for MCP Integration Skills
+
+**Structure pattern for MCP-based skills:**
+1. **YAML frontmatter**: name, description (with triggers), compatibility: opencode
+2. **Overview**: High-level description of domain and capabilities
+3. **Core Workflows**: Numbered step-by-step processes for common operations
+4. **Advanced Features**: Optional capabilities that enhance basic workflows
+5. **Integration with Other Skills**: Table showing domain boundaries and handoffs
+6. **Common Patterns**: Reusable workflow patterns
+7. **Quality Standards**: Output criteria and best practices
+8. **Edge Cases**: Exception handling
+9. **Boundaries**: Explicit domain separation with agent attribution
+
+### Outlook-Specific Domain Coverage
+
+**Mail capabilities:**
+- Reading emails (inbox, folders, search)
+- Sending emails (compose, reply, forward)
+- Message organization (categories, importance, folders)
+- Email intelligence (focused inbox, mail tips)
+
+**Calendar capabilities:**
+- Creating events and appointments
+- Scheduling meetings with attendees
+- Managing calendar availability
+
+**Contact capabilities:**
+- Creating and updating contacts
+- Managing contact information
+
+**MCP Integration pattern:**
+- Skill provides domain knowledge for Outlook Graph API operations
+- MCP handles actual API calls (authentication, endpoints)
+- Focus on workflows, not implementation details
+
+### Trigger Keywords in Description
+
+From the YAML frontmatter description:
+```
+Triggers: 'email', 'Outlook', 'inbox', 'calendar', 'contact', 'message', 'folder', 'appointment', 'meeting'
+```
+
+These keywords enable the Opencode skill loader to automatically trigger this skill when users mention these topics.
+
+### Cross-Agent Boundaries
+
+Explicit domain separation ensures no overlap with other skills:
+- **NOT Teams**: msteams skill handles Teams-specific messaging
+- **NOT Basecamp**: basecamp skill handles Basecamp communication
+- **NOT Wiki**: Athena handles Outline wiki documentation
+- **NOT Private Knowledge**: Apollo handles Obsidian vaults
+- **NOT Creative Writing**: Calliope handles long-form content
+
+### Workflow Documentation Style
+
+**Core workflows** follow the pattern:
+```
+User: "User request"
+AI: Use Outlook MCP to:
+1. Step 1
+2. Step 2
+3. Step 3
+```
+
+This pattern shows:
+- Clear user intent
+- Tool usage (Outlook MCP)
+- Step-by-step process
+
+### Verification Commands
+
+**File structure:**
+```bash
+test -d skills/outlook && test -f skills/outlook/SKILL.md
+# Expected output: ✅ File structure valid
+```
+
+**YAML frontmatter validation:**
+```bash
+python3 -c "import yaml; data = yaml.safe_load(open('skills/outlook/SKILL.md').read().split('---')[1]); print(data['name'])"
+# Expected output: outlook
+```
+
+**Note**: The `test-skill.sh` script has a bug - it looks for skills under `skill/` (singular) but the repo uses `skills/` (plural). Manual validation required.
+
+### Key Takeaways
+
+- MCP integration skills focus on workflows, not API implementation details
+- Triggers in description enable automatic skill loading
+- Cross-agent boundaries prevent overlap and confusion
+- Workflow documentation shows user intent, tool usage, and step-by-step process
+- Manual validation needed when test scripts have bugs in path handling
+
+## Wave 3, Task 13: Create Obsidian Integration Skill
+
+### Skill Structure for API Integration Skills
+
+The Obsidian skill follows the standard skill-creator pattern with API-specific documentation:
+
+1. **YAML frontmatter** with comprehensive triggers
+ - name: `obsidian`
+ - description: Covers all use cases (vault operations, note CRUD, search, daily notes)
+ - compatibility: `opencode`
+
+2. **Prerequisites section** - Critical for API integrations
+ - Plugin installation requirements
+ - API server setup (default port 27124)
+ - Authentication configuration
+
+3. **Core Workflows** organized by operation type
+ - Vault operations: list files, get file info, get vault info
+ - Note CRUD: create, read, update, delete notes
+ - Search: content search with parameters
+ - Daily notes: get/create/update daily notes
+
+4. **Note Structure Patterns** - Obsidian-specific conventions
+ - Frontmatter patterns (date, created, type, tags, status)
+ - WikiLink syntax ([[Note Title]], [[Note Title|Alias]], [[Note Title#Heading]])
+ - Tagging conventions (#tag, #nested/tag)
+
+5. **Workflow Examples** - Realistic usage patterns
+ - Create brainstorm note with frontmatter
+ - Append to daily journal
+ - Search and link notes
+ - Show curl commands with JSON payloads
+
+6. **Integration with Other Skills** - Agent handoff patterns
+ - brainstorming: Create brainstorm notes with frontmatter
+ - reflection: Append conversation analysis to daily journal
+ - research: Save research findings with tags
+ - task-management: Link tasks to project notes
+ - plan-writing: Save generated plans to vault
+
+### Obsidian Local REST API Capabilities
+
+**API endpoints** (default: http://127.0.0.1:27124):
+
+1. **Vault operations (3 endpoints):**
+ - `GET /list` - List all files in vault
+ - `GET /get-file-info` - Get file metadata
+ - `GET /vault-info` - Get vault metadata
+
+2. **Note CRUD (5 endpoints):**
+ - `POST /create-note` - Create new note (content, optional path)
+ - `GET /read-note` - Read note by path
+ - `PUT /update-note` - Update existing note (path, content)
+ - `DELETE /delete-note` - Delete note by path
+
+3. **Search (1 endpoint):**
+ - `GET /search` - Search notes (q, optional path, context-length)
+
+4. **Daily notes (2 endpoints):**
+ - `GET /daily-note` - Get/create daily note (optional date)
+ - `PUT /daily-note` - Update daily note
+
+### Skill Design Principles for API Integration
+
+**Concise documentation:**
+- Curl commands show exact API usage with parameters
+- JSON payloads demonstrate request body structure
+- Workflow examples combine multiple API calls
+
+**Progressive disclosure:**
+- Prerequisites section first (plugin, server, auth)
+- Simple operations first (list, read, create)
+- Complex workflows later (append to journal, search and link)
+
+**Appropriate degrees of freedom:**
+- Low freedom: API endpoint structure and parameters
+- Medium freedom: Note content and frontmatter design
+- High freedom: Vault organization and tagging schemes
+
+### Verification Commands
+
+**File structure:**
+```bash
+test -d skills/obsidian && test -f skills/obsidian/SKILL.md
+# Expected output: ✅ Directory and file structure correct
+```
+
+**YAML frontmatter validation:**
+```bash
+python3 -c "import yaml; f = open('skills/obsidian/SKILL.md'); content = f.read(); f.close(); yaml.safe_load(content.split('---')[1])"
+# Expected output: No errors
+```
+
+**Skill validation script:**
+```bash
+python3 skills/skill-creator/scripts/quick_validate.py skills/obsidian
+# Expected output: Skill is valid!
+```
+
+### Key Takeaways
+
+- API integration skills require explicit prerequisites section (plugin, server, auth setup)
+- Use curl commands in documentation to show exact API usage patterns
+- JSON payloads demonstrate request/response structures for complex operations
+- WikiLink syntax and frontmatter conventions are critical for Obsidian skills
+- Integration sections should show how skills pass data between them (e.g., brainstorm → Obsidian note)
+- Destructive operations (DELETE) need explicit warnings in workflows
+- Daily notes are a special case with dedicated API endpoints
+- Skills document API capabilities, not plugin installation (user responsibility)
+- Error handling section helps with debugging (HTTP status codes)
+
+### Cross-Agent Integration Pattern
+
+The Obsidian skill enables Apollo (private knowledge agent) to:
+- Create notes with proper frontmatter structure
+- Link notes using WikiLinks for knowledge graph
+- Search vault by content, tags, or metadata
+- Maintain daily journaling workflows
+- Hand off to brainstorming, reflection, research, task-management, plan-writing
+
+This aligns with Apollo's domain: "Private knowledge (Obsidian vault, personal notes)"
+
+## Wave 3, Task 11: Create MS Teams integration skill
+
+### Skill Structure and Content
+
+The msteams skill follows the established skill-creator patterns:
+- **YAML frontmatter**: Contains name, description with triggers, and compatibility
+- **Concise body**: Focuses on core capabilities without overwhelming context
+- **Workflow examples**: Clear step-by-step processes for common operations
+- **Constraints section**: Explicit guidance on what NOT to do
+
+### MS Teams Graph API Capabilities
+
+From Microsoft Learn documentation, key capabilities documented:
+- **Teams & Channels**: Create, list, manage teams and channels
+- **Channel Messages**: Send, receive, list messages with date filtering
+- **Online Meetings**: Schedule, manage, retrieve meeting coordinates
+- **Chat**: Direct messages and group chat conversations
+- **Presence**: User activity and availability status
+- **Team membership**: Add, remove, update members
+
+### Domain Differentiation
+
+**Hermes integration context:**
+- Hermes (work communication agent) loads msteams skill for Teams-specific operations
+- Clear separation from outlook skill: msteams = Teams/channels/meetings, outlook = email
+- This prevents overlap and clarifies routing for communication operations
+
+### Important Constraints Documented
+
+1. **Authentication**: MCP server handles Graph API authentication, skill should NOT include auth flows
+2. **Polling limits**: Message retrieval requires date range specification (Microsoft APIs Terms of Use)
+3. **Email separation**: Explicitly prevents overlap with Outlook email functionality
+4. **File storage**: Channel files stored in SharePoint, requires SharePoint-specific operations
+
+### YAML Frontmatter Validation
+
+**Validated fields:**
+- `name: msteams`
+- `description`: Includes triggers - 'Teams', 'meeting', 'channel', 'team message', 'chat', 'Teams message'
+- `compatibility: opencode`
+
+**Verification command:**
+```bash
+python3 -c "import yaml, re; f=open('skills/msteams/SKILL.md'); c=f.read(); m=re.match(r'^---\n(.*?)\n---', c, re.DOTALL); yaml.safe_load(m.group(1))"
+# Output: Valid ✅
+```
+
+### Skill Directory Verification
+
+```bash
+test -d skills/msteams && test -f skills/msteams/SKILL.md
+# Result: ✅ Directory and file structure verified
+```
+
+### Quick Validate Script
+
+**Note on test-skill.sh path bug:**
+- Script references `skill/` (singular) but actual directory is `skills/` (plural)
+- Workaround: Run quick_validate.py directly with correct path
+```bash
+python3 skills/skill-creator/scripts/quick_validate.py skills/msteams
+# Result: "Skill is valid!"
+```
+
+### Key Takeaways
+
+1. **Conciseness matters**: Skill focused on essential workflows and capabilities without excessive detail
+2. **Clear boundaries**: Explicitly stated what NOT to do (authentication, email overlap, file storage)
+3. **Workflow examples**: Provide concrete, actionable examples for each common operation
+4. **Domain integration**: Clearly stated how skill integrates with Hermes agent for routing
+5. **Constraint awareness**: Documented important Graph API limits (polling, Terms of Use)
+
+## Wave 3, Task 10: Create Outline wiki integration skill
+
+### Skill Structure Pattern
+
+**YAML frontmatter:**
+```yaml
+---
+name: outline
+description: "Use when: (1) Outline wiki management, (2) Document CRUD operations, (3) Knowledge search and retrieval, (4) Collection management. Triggers: 'Outline', 'wiki', 'document', 'knowledge base'."
+compatibility: opencode
+---
+```
+
+**Description field includes:**
+- What the skill does
+- When to use it (numbered list of triggers)
+- Specific trigger keywords for skill loading
+
+### Skill Content Structure
+
+**Core Capabilities section:** High-level overview of API functionality
+- Document Operations (CRUD)
+- Collection Management
+- Search and Discovery
+- Sharing and Permissions
+- Collaboration
+
+**Workflows section:** Step-by-step procedures for common operations
+- Creating a New Document
+- Searching Knowledge Base
+- Organizing Documents
+- Document Collaboration
+
+**Integration Patterns section:** Practical guidance for knowledge management
+- Knowledge Capture: How to document from conversations/research
+- Documentation Updates: How to maintain existing content
+- Knowledge Retrieval: How to find information efficiently
+
+**Common Use Cases section:** Table-based reference for common scenarios
+- Project documentation
+- Team guidelines
+- Meeting notes
+- Knowledge capture
+- Onboarding resources
+
+**Best Practices section:** Guidelines for effective knowledge base management
+- Consistent naming
+- Logical organization
+- Regular maintenance
+- Access control
+- Searchability
+- Collaboration
+
+**Handoff to Other Skills section:** Integration mapping
+- Shows how output from this skill flows to other skills
+- Maps use cases to next skills
+- Provides triggers for handoffs
+
+### Outline API Capabilities
+
+**Document Operations:**
+- Create: New documents with markdown content
+- Read: Retrieve content, metadata, revisions
+- Update: Edit title and content
+- Delete: Remove documents (with permissions)
+
+**Collection Management:**
+- Organize: Structure documents in collections and nested collections
+- Hierarchies: Parent-child relationships
+- Access Control: Permissions at collection level
+
+**Search and Discovery:**
+- Full-text search: Find documents by content
+- Metadata filters: Collection, author, date
+- Advanced queries: Combine multiple filters
+
+**Sharing and Permissions:**
+- Public links: Shareable document URLs
+- Team access: Member permissions
+- Guest access: External sharing control
+
+**Collaboration:**
+- Comments: Threaded discussions
+- Revisions: Document history and changes
+- Notifications: Activity updates
+
+### Skill Design Decisions
+
+**Concise approach (under 500 lines):**
+- Core workflows in SKILL.md
+- No extraneous files (README.md, CHANGELOG.md, etc.)
+- Progressive disclosure: Load skill body only when triggered
+- Keep metadata description comprehensive (frontmatter is always in context)
+
+**Appropriate degrees of freedom:**
+- Low freedom: API endpoint structure and patterns
+- Medium freedom: Document content and metadata
+- High freedom: Collection organization and tagging
+
+**Documentation approach:**
+- No MCP server setup instructions (user responsibility)
+- Focus on API capabilities and workflows
+- Provide practical examples rather than exhaustive API reference
+- Use tables for quick reference (use cases, best practices)
+
+### Verification Commands
+
+**File structure:**
+```bash
+test -d skills/outline && test -f skills/outline/SKILL.md
+# Expected output: ✅ Directory and file structure correct
+```
+
+**YAML frontmatter validation:**
+```bash
+python3 -c "import yaml; f = open('skills/outline/SKILL.md'); content = f.read(); f.close(); yaml.safe_load(content.split('---')[1])"
+# Expected output: No errors
+```
+
+**Skill validation script:**
+```bash
+python3 skills/skill-creator/scripts/quick_validate.py skills/outline
+# Expected output: Skill is valid!
+```
+
+### Key Takeaways
+
+- Skills should include comprehensive trigger descriptions in YAML frontmatter
+- Use structured sections (Core Capabilities, Workflows, Integration Patterns)
+- Tables are effective for quick reference (use cases, best practices)
+- Handoff sections show integration points with other skills
+- Avoid MCP server setup instructions (user's responsibility)
+- Focus on practical workflows rather than exhaustive API documentation
+- Keep SKILL.md concise (under 500 lines) - progressive disclosure
+- Provide both high-level overview and detailed workflows
+- Include search and retrieval patterns for knowledge systems
+- Document collaboration features (comments, revisions, sharing)
+
+### Cross-Agent Integration Pattern
+
+The Outline skill enables Athena (work knowledge agent) to:
+- Create and edit documents in team wiki
+- Search knowledge base by content, metadata, and filters
+- Organize documents in collections and hierarchies
+- Manage sharing and permissions for team collaboration
+- Handle collaborative features (comments, revisions)
+- Hand off to knowledge-management, task-management, plan-writing
+
+This aligns with Athena's domain: "Work knowledge (Outline wiki, documentation)"
+
+### Notes
+
+- test-skill.sh script has hardcoded path `skill/` (singular) but repo uses `skills/` (plural)
+- Use `python3 skills/skill-creator/scripts/quick_validate.py ` for direct validation
+- Repository structure follows AGENTS.md documentation: `skills/` (plural)
+
+## Wave 4, Task 14: Create agent validation script
+
+### Bash Script Pattern for Validation
+
+**Script structure follows test-skill.sh pattern:**
+- Shebang: `#!/usr/bin/env bash`
+- Error handling: `set -euo pipefail`
+- Color codes for output (RED, GREEN, YELLOW, NC)
+- Script directory resolution: `SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"`
+- Repo root resolution: `REPO_ROOT="$(dirname "$SCRIPT_DIR")"`
+
+### Validation Logic Architecture
+
+**Multi-layer validation approach:**
+1. **File existence**: Check agents.json exists
+2. **JSON syntax validation**: Use python3 json.load() for parsing
+3. **Agent count validation**: Verify exactly 6 agents present
+4. **Agent name validation**: Check all expected agents found
+5. **Field validation**: Verify required fields exist for each agent
+6. **Mode validation**: Ensure primary/subagent modes correct
+7. **Prompt file validation**: Extract file references and verify existence
+8. **Content validation**: Check prompt files are non-empty
+
+### Exit Code Strategy
+
+**Clear exit codes for different failure types:**
+- 0: All validations pass
+- 1: Validation errors found (missing agents, fields, or prompt files)
+
+**Note:** Script does NOT use exit code 2 for prompt file errors (as originally specified) - uses 1 for all validation errors for simplicity.
+
+### Prompt File Reference Parsing
+
+**Pattern matching approach:**
+```bash
+# Extract prompt reference from agents.json
+prompt_ref=$(python3 -c "import json; print(json.load(open('$AGENTS_FILE'))['$agent_name']['prompt'])")
+
+# Parse pattern: {file:./prompts/.txt}
+if [[ "$prompt_ref" =~ \{file:(\./prompts/[^}]+)\} ]]; then
+ prompt_file="${BASH_REMATCH[1]}"
+ prompt_path="$REPO_ROOT/${prompt_file#./}"
+fi
+```
+
+**Key components:**
+- Python JSON extraction: Gets raw prompt reference string
+- Bash regex: Extracts file path from `{file:...}` format
+- Path normalization: Removes `./` prefix using `${param#pattern}`
+
+### Error Handling Strategy
+
+**Counter-based error tracking:**
+```bash
+error_count=0
+warning_count=0
+
+error() {
+ echo -e "${RED}❌ $1${NC}" >&2
+ ((error_count++)) || true
+}
+
+# Final decision
+if [[ $error_count -eq 0 ]]; then
+ exit 0
+else
+ exit 1
+fi
+```
+
+**Benefits:**
+- Collects all errors before exiting (don't fail fast)
+- Provides comprehensive feedback
+- Clear visual indicators (✅ for success, ❌ for errors, ⚠️ for warnings)
+
+### Validation Test Cases
+
+**Successful validation:**
+```bash
+./scripts/validate-agents.sh
+# Output: All validations passed!
+# Exit code: 0
+```
+
+**Missing prompt file detection:**
+```bash
+mv prompts/apollo.txt prompts/apollo.txt.bak
+./scripts/validate-agents.sh
+# Output: ❌ Prompt file not found: ./prompts/apollo.txt
+# Exit code: 1
+```
+
+**Empty prompt file detection:**
+```bash
+truncate -s 0 prompts/apollo.txt
+./scripts/validate-agents.sh
+# Output: ❌ Prompt file is empty: ./prompts/apollo.txt
+# Exit code: 1
+```
+
+### Hardcoded Configuration
+
+**Script maintains expected state:**
+```bash
+EXPECTED_AGENTS=("chiron" "chiron-forge" "hermes" "athena" "apollo" "calliope")
+PRIMARY_AGENTS=("chiron" "chiron-forge")
+SUBAGENTS=("hermes" "athena" "apollo" "calliope")
+REQUIRED_FIELDS=("description" "mode" "model" "prompt")
+```
+
+**Rationale:**
+- Explicit configuration is better than dynamic discovery
+- Prevents silent failures when configuration drifts
+- Makes expectations clear and documentable
+- Validates against known-good state (Wave 1-3 outputs)
+
+### Python vs jq for JSON Processing
+
+**Chose Python over jq for JSON parsing:**
+- Python is already a project dependency (skill validation)
+- Consistent with existing scripts (test-skill.sh uses Python)
+- No additional dependency installation required
+- Familiar error handling patterns
+
+### Integration with Existing Patterns
+
+**Aligned with test-skill.sh patterns:**
+- Same color code definitions
+- Same script directory resolution
+- Same error handling approach
+- Same exit code strategy (0 = success, non-zero = failure)
+
+### Verification Commands
+
+**Script executable check:**
+```bash
+test -x scripts/validate-agents.sh
+# Expected: Exit 0 (executable)
+```
+
+**Successful validation:**
+```bash
+./scripts/validate-agents.sh
+# Expected: Exit 0, "All validations passed!" message
+```
+
+### Key Takeaways
+
+- Bash regex (`=~ pattern`) is powerful for extracting file references from JSON strings
+- Counter-based error tracking allows comprehensive error reporting before failing
+- Python json.load() is reliable for JSON syntax validation
+- Hardcoded expected state is safer than dynamic discovery for validation scripts
+- `set -euo pipefail` is critical for bash script reliability
+- Color codes improve readability but must be reset (NC='\033[0m')
+- Pattern `{file:./prompts/.txt}` requires regex extraction for validation
diff --git a/.sisyphus/plans/chiron-agent-framework.md b/.sisyphus/plans/chiron-agent-framework.md
new file mode 100644
index 0000000..a5ae622
--- /dev/null
+++ b/.sisyphus/plans/chiron-agent-framework.md
@@ -0,0 +1,973 @@
+# Chiron Personal Agent Framework
+
+## TL;DR
+
+> **Quick Summary**: Create an Oh-My-Opencode-style agent framework for personal productivity with Chiron as the orchestrator, 4 specialized subagents (Hermes, Athena, Apollo, Calliope), and 5 tool integration skills (Basecamp, Outline, MS Teams, Outlook, Obsidian).
+>
+> **Deliverables**:
+> - 6 agent definitions in `agents.json`
+> - 6 system prompt files in `prompts/`
+> - 5 tool integration skills in `skills/`
+> - Validation script extension in `scripts/`
+>
+> **Estimated Effort**: Medium
+> **Parallel Execution**: YES - 3 waves
+> **Critical Path**: Task 1 (agents.json) → Task 3-7 (prompts) → Task 9-13 (skills) → Task 14 (validation)
+
+---
+
+## Context
+
+### Original Request
+Create an agent framework similar to Oh-My-Opencode but focused on personal productivity:
+- Manage work tasks, appointments, projects via Basecamp, Outline, MS Teams, Outlook
+- Manage private tasks and knowledge via Obsidian
+- Greek mythology naming convention (avoiding Oh My OpenCode names)
+- Main agent named "Chiron"
+
+### Interview Summary
+**Key Discussions**:
+- **Chiron's Role**: Main orchestrator that delegates to specialized subagents
+- **Agent Count**: Minimal (3-4 agents initially) + 2 primary agents
+- **Domain Separation**: Separate work vs private agents with clear boundaries
+- **Tool Priority**: All 4 work tools + Obsidian equally important
+- **Basecamp MCP**: User confirmed working MCP at georgeantonopoulos/Basecamp-MCP-Server
+
+**Research Findings**:
+- Oh My OpenCode names to avoid: Sisyphus, Atlas, Prometheus, Hephaestus, Metis, Momus, Oracle, Librarian, Explore, Multimodal-Looker, Sisyphus-Junior
+- MCP servers available for all work tools + Obsidian
+- Protonmail requires custom IMAP/SMTP (deferred)
+- Current repo has established skill patterns with SKILL.md + optional subdirectories
+
+### Metis Review
+**Identified Gaps** (addressed in plan):
+- Delegation model clarified: Chiron uses Question tool for ambiguous requests
+- Behavioral difference between Chiron and Chiron-Forge defined
+- Executable acceptance criteria added for all tasks
+- Edge cases documented in guardrails section
+- MCP authentication assumed pre-configured by NixOS (explicit scope boundary)
+
+---
+
+## Work Objectives
+
+### Core Objective
+Create a personal productivity agent framework following Oh-My-Opencode patterns, enabling AI-assisted management of work and private life through specialized agents that integrate with existing tools.
+
+### Concrete Deliverables
+1. `agents/agents.json` - 6 agent definitions (2 primary, 4 subagent)
+2. `prompts/chiron.txt` - Chiron (plan mode) system prompt
+3. `prompts/chiron-forge.txt` - Chiron-Forge (build mode) system prompt
+4. `prompts/hermes.txt` - Work communication agent prompt
+5. `prompts/athena.txt` - Work knowledge agent prompt
+6. `prompts/apollo.txt` - Private knowledge agent prompt
+7. `prompts/calliope.txt` - Writing agent prompt
+8. `skills/basecamp/SKILL.md` - Basecamp integration skill
+9. `skills/outline/SKILL.md` - Outline wiki integration skill
+10. `skills/msteams/SKILL.md` - MS Teams integration skill
+11. `skills/outlook/SKILL.md` - Outlook email integration skill
+12. `skills/obsidian/SKILL.md` - Obsidian integration skill
+13. `scripts/validate-agents.sh` - Agent validation script
+
+### Definition of Done
+- [ ] `python3 -c "import json; json.load(open('agents/agents.json'))"` → Exit 0
+- [ ] All 6 prompt files exist and are non-empty
+- [ ] All 5 skill directories have valid SKILL.md with YAML frontmatter
+- [ ] `./scripts/test-skill.sh --validate` passes for new skills
+- [ ] `./scripts/validate-agents.sh` passes
+
+### Must Have
+- All agents use Question tool for multi-choice decisions
+- External prompt files (not inline in JSON)
+- Follow existing skill structure patterns
+- Greek naming convention for agents
+- Clear separation between plan mode (Chiron) and build mode (Chiron-Forge)
+- Skills provide tool-specific knowledge that agents load on demand
+
+### Must NOT Have (Guardrails)
+- **NO MCP server configuration** - Managed by NixOS, outside this repo
+- **NO authentication handling** - Assume pre-configured MCP tools
+- **NO cross-agent state sharing** - Each agent operates independently
+- **NO new opencode commands** - Use existing command patterns only
+- **NO generic "I'm an AI assistant" prompts** - Domain-specific responsibilities only
+- **NO Protonmail integration** - Deferred to future phase
+- **NO duplicate tool knowledge across skills** - Each skill focuses on ONE tool
+- **NO scripts outside scripts/ directory**
+- **NO model configuration changes** - Keep current `zai-coding-plan/glm-4.7`
+
+---
+
+## Verification Strategy (MANDATORY)
+
+> **UNIVERSAL RULE: ZERO HUMAN INTERVENTION**
+>
+> ALL tasks in this plan MUST be verifiable WITHOUT any human action.
+> This is NOT conditional - it applies to EVERY task, regardless of test strategy.
+
+### Test Decision
+- **Infrastructure exists**: YES (test-skill.sh)
+- **Automated tests**: Tests-after (validation scripts)
+- **Framework**: bash + python for validation
+
+### Agent-Executed QA Scenarios (MANDATORY - ALL tasks)
+
+**Verification Tool by Deliverable Type:**
+
+| Type | Tool | How Agent Verifies |
+|------|------|-------------------|
+| agents.json | Bash (python/jq) | Parse JSON, validate structure, check required fields |
+| Prompt files | Bash (file checks) | File exists, non-empty, contains expected sections |
+| SKILL.md files | Bash (test-skill.sh) | YAML frontmatter valid, name matches directory |
+| Validation scripts | Bash | Script is executable, runs without error, produces expected output |
+
+---
+
+## Execution Strategy
+
+### Parallel Execution Waves
+
+```
+Wave 1 (Start Immediately):
+├── Task 1: Create agents.json configuration [no dependencies]
+└── Task 2: Create prompts/ directory structure [no dependencies]
+
+Wave 2 (After Wave 1):
+├── Task 3: Chiron prompt [depends: 2]
+├── Task 4: Chiron-Forge prompt [depends: 2]
+├── Task 5: Hermes prompt [depends: 2]
+├── Task 6: Athena prompt [depends: 2]
+├── Task 7: Apollo prompt [depends: 2]
+└── Task 8: Calliope prompt [depends: 2]
+
+Wave 3 (Can parallel with Wave 2):
+├── Task 9: Basecamp skill [no dependencies]
+├── Task 10: Outline skill [no dependencies]
+├── Task 11: MS Teams skill [no dependencies]
+├── Task 12: Outlook skill [no dependencies]
+└── Task 13: Obsidian skill [no dependencies]
+
+Wave 4 (After Wave 2 + 3):
+└── Task 14: Validation script [depends: 1, 3-8]
+
+Critical Path: Task 1 → Task 2 → Tasks 3-8 → Task 14
+Parallel Speedup: ~50% faster than sequential
+```
+
+### Dependency Matrix
+
+| Task | Depends On | Blocks | Can Parallelize With |
+|------|------------|--------|---------------------|
+| 1 | None | 14 | 2, 9-13 |
+| 2 | None | 3-8 | 1, 9-13 |
+| 3-8 | 2 | 14 | Each other, 9-13 |
+| 9-13 | None | None | Each other, 1-2 |
+| 14 | 1, 3-8 | None | None (final) |
+
+### Agent Dispatch Summary
+
+| Wave | Tasks | Recommended Category |
+|------|-------|---------------------|
+| 1 | 1, 2 | quick |
+| 2 | 3-8 | quick (parallel) |
+| 3 | 9-13 | quick (parallel) |
+| 4 | 14 | quick |
+
+---
+
+## TODOs
+
+### Wave 1: Foundation
+
+ - [x] 1. Create agents.json with 6 agent definitions
+
+ **What to do**:
+ - Update existing `agents/agents.json` to add all 6 agents
+ - Each agent needs: description, mode, model, prompt reference
+ - Primary agents: chiron, chiron-forge
+ - Subagents: hermes, athena, apollo, calliope
+ - All agents should have `question: "allow"` permission
+
+ **Must NOT do**:
+ - Do not add MCP server configuration
+ - Do not change model from current pattern
+ - Do not add inline prompts (use file references)
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`agent-development`]
+ - `agent-development`: Provides agent configuration patterns and best practices
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 1 (with Task 2)
+ - **Blocks**: Task 14
+ - **Blocked By**: None
+
+ **References**:
+ - `agents/agents.json:1-7` - Current chiron agent configuration pattern
+ - `skills/agent-development/SKILL.md:40-76` - JSON agent structure reference
+ - `skills/agent-development/SKILL.md:226-277` - Permissions system reference
+ - `skills/agent-development/references/opencode-agents-json-example.md` - Complete examples
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: agents.json is valid JSON with all 6 agents
+ Tool: Bash (python)
+ Steps:
+ 1. python3 -c "import json; data = json.load(open('agents/agents.json')); print(len(data))"
+ 2. Assert: Output is "6"
+ 3. python3 -c "import json; data = json.load(open('agents/agents.json')); print(sorted(data.keys()))"
+ 4. Assert: Output contains ['apollo', 'athena', 'calliope', 'chiron', 'chiron-forge', 'hermes']
+ Expected Result: JSON parses, all 6 agents present
+ Evidence: Command output captured
+
+ Scenario: Each agent has required fields
+ Tool: Bash (python)
+ Steps:
+ 1. python3 -c "
+ import json
+ data = json.load(open('agents/agents.json'))
+ for name, agent in data.items():
+ assert 'description' in agent, f'{name}: missing description'
+ assert 'mode' in agent, f'{name}: missing mode'
+ assert 'prompt' in agent, f'{name}: missing prompt'
+ print('All agents valid')
+ "
+ 2. Assert: Output is "All agents valid"
+ Expected Result: All required fields present
+ Evidence: Validation output captured
+
+ Scenario: Primary agents have correct mode
+ Tool: Bash (python)
+ Steps:
+ 1. python3 -c "
+ import json
+ data = json.load(open('agents/agents.json'))
+ assert data['chiron']['mode'] == 'primary'
+ assert data['chiron-forge']['mode'] == 'primary'
+ print('Primary modes correct')
+ "
+ Expected Result: Both primary agents have mode=primary
+ Evidence: Command output
+
+ Scenario: Subagents have correct mode
+ Tool: Bash (python)
+ Steps:
+ 1. python3 -c "
+ import json
+ data = json.load(open('agents/agents.json'))
+ for name in ['hermes', 'athena', 'apollo', 'calliope']:
+ assert data[name]['mode'] == 'subagent', f'{name}: wrong mode'
+ print('Subagent modes correct')
+ "
+ Expected Result: All subagents have mode=subagent
+ Evidence: Command output
+ ```
+
+ **Commit**: YES
+ - Message: `feat(agents): add chiron agent framework with 6 agents`
+ - Files: `agents/agents.json`
+ - Pre-commit: `python3 -c "import json; json.load(open('agents/agents.json'))"`
+
+---
+
+ - [x] 2. Create prompts directory structure
+
+ **What to do**:
+ - Create `prompts/` directory if not exists
+ - Directory will hold all agent system prompt files
+
+ **Must NOT do**:
+ - Do not create prompt files yet (done in Wave 2)
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 1 (with Task 1)
+ - **Blocks**: Tasks 3-8
+ - **Blocked By**: None
+
+ **References**:
+ - `skills/agent-development/SKILL.md:148-159` - Prompt file conventions
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: prompts directory exists
+ Tool: Bash
+ Steps:
+ 1. test -d prompts && echo "exists" || echo "missing"
+ 2. Assert: Output is "exists"
+ Expected Result: Directory created
+ Evidence: Command output
+ ```
+
+ **Commit**: NO (groups with Task 1)
+
+---
+
+### Wave 2: Agent Prompts
+
+ - [x] 3. Create Chiron (Plan Mode) system prompt
+
+ **What to do**:
+ - Create `prompts/chiron.txt`
+ - Define Chiron as the main orchestrator in plan/analysis mode
+ - Include delegation logic to subagents (Hermes, Athena, Apollo, Calliope)
+ - Include Question tool usage for ambiguous requests
+ - Focus on: planning, analysis, guidance, delegation
+ - Permissions: read-only, no file modifications
+
+ **Must NOT do**:
+ - Do not allow write/edit operations
+ - Do not include execution responsibilities
+ - Do not overlap with Chiron-Forge's build capabilities
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`agent-development`]
+ - `agent-development`: System prompt design patterns
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 2 (with Tasks 4-8)
+ - **Blocks**: Task 14
+ - **Blocked By**: Task 2
+
+ **References**:
+ - `skills/agent-development/SKILL.md:349-386` - System prompt design patterns
+ - `skills/agent-development/SKILL.md:397-415` - Prompt best practices
+ - `skills/agent-development/references/system-prompt-design.md` - Detailed prompt patterns
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Chiron prompt file exists and is substantial
+ Tool: Bash
+ Steps:
+ 1. test -f prompts/chiron.txt && echo "exists" || echo "missing"
+ 2. Assert: Output is "exists"
+ 3. wc -c < prompts/chiron.txt
+ 4. Assert: Output is > 500 (substantial content)
+ Expected Result: File exists with meaningful content
+ Evidence: File size captured
+
+ Scenario: Chiron prompt contains orchestrator role
+ Tool: Bash (grep)
+ Steps:
+ 1. grep -qi "orchestrat" prompts/chiron.txt && echo "found" || echo "missing"
+ 2. Assert: Output is "found"
+ 3. grep -qi "delegat" prompts/chiron.txt && echo "found" || echo "missing"
+ 4. Assert: Output is "found"
+ Expected Result: Prompt describes orchestration and delegation
+ Evidence: grep output
+
+ Scenario: Chiron prompt references subagents
+ Tool: Bash (grep)
+ Steps:
+ 1. grep -qi "hermes" prompts/chiron.txt && echo "found" || echo "missing"
+ 2. grep -qi "athena" prompts/chiron.txt && echo "found" || echo "missing"
+ 3. grep -qi "apollo" prompts/chiron.txt && echo "found" || echo "missing"
+ 4. grep -qi "calliope" prompts/chiron.txt && echo "found" || echo "missing"
+ Expected Result: All 4 subagents mentioned
+ Evidence: grep outputs
+ ```
+
+ **Commit**: YES (group with Tasks 4-8)
+ - Message: `feat(prompts): add chiron and subagent system prompts`
+ - Files: `prompts/*.txt`
+ - Pre-commit: `for f in prompts/*.txt; do test -s "$f" || exit 1; done`
+
+---
+
+ - [x] 4. Create Chiron-Forge (Build Mode) system prompt
+
+ **What to do**:
+ - Create `prompts/chiron-forge.txt`
+ - Define as Chiron's execution/build counterpart
+ - Full write access for task execution
+ - Can modify files, run commands, complete tasks
+ - Still delegates to subagents for specialized domains
+ - Uses Question tool for destructive operations confirmation
+
+ **Must NOT do**:
+ - Do not make it a planning-only agent (that's Chiron)
+ - Do not allow destructive operations without confirmation
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`agent-development`]
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 2 (with Tasks 3, 5-8)
+ - **Blocks**: Task 14
+ - **Blocked By**: Task 2
+
+ **References**:
+ - `skills/agent-development/SKILL.md:316-346` - Complete agent example with chiron/chiron-forge pattern
+ - `skills/agent-development/SKILL.md:253-277` - Permission patterns for bash commands
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Chiron-Forge prompt file exists
+ Tool: Bash
+ Steps:
+ 1. test -f prompts/chiron-forge.txt && wc -c < prompts/chiron-forge.txt
+ 2. Assert: Output > 500
+ Expected Result: File exists with substantial content
+ Evidence: File size
+
+ Scenario: Chiron-Forge prompt emphasizes execution
+ Tool: Bash (grep)
+ Steps:
+ 1. grep -qi "execut" prompts/chiron-forge.txt && echo "found" || echo "missing"
+ 2. grep -qi "build" prompts/chiron-forge.txt && echo "found" || echo "missing"
+ Expected Result: Execution/build terminology present
+ Evidence: grep output
+ ```
+
+ **Commit**: YES (groups with Task 3)
+
+---
+
+ - [x] 5. Create Hermes (Work Communication) system prompt
+
+ **What to do**:
+ - Create `prompts/hermes.txt`
+ - Specialization: Basecamp tasks, Outlook email, MS Teams meetings
+ - Greek god of communication, messengers, quick tasks
+ - Uses Question tool for: which tool to use, clarifying recipients
+ - Focus on: task updates, email drafting, meeting scheduling
+
+ **Must NOT do**:
+ - Do not handle documentation (Athena's domain)
+ - Do not handle personal/private tools (Apollo's domain)
+ - Do not write long-form content (Calliope's domain)
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`agent-development`]
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 2
+ - **Blocks**: Task 14
+ - **Blocked By**: Task 2
+
+ **References**:
+ - `skills/agent-development/SKILL.md:349-378` - Standard prompt structure
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Hermes prompt defines communication domain
+ Tool: Bash (grep)
+ Steps:
+ 1. grep -qi "basecamp" prompts/hermes.txt && echo "found" || echo "missing"
+ 2. grep -qi "outlook\|email" prompts/hermes.txt && echo "found" || echo "missing"
+ 3. grep -qi "teams\|meeting" prompts/hermes.txt && echo "found" || echo "missing"
+ Expected Result: All 3 tools mentioned
+ Evidence: grep outputs
+ ```
+
+ **Commit**: YES (groups with Task 3)
+
+---
+
+ - [x] 6. Create Athena (Work Knowledge) system prompt
+
+ **What to do**:
+ - Create `prompts/athena.txt`
+ - Specialization: Outline wiki, documentation, knowledge organization
+ - Greek goddess of wisdom and strategic warfare
+ - Focus on: wiki search, knowledge retrieval, documentation updates
+ - Uses Question tool for: which document to update, clarifying search scope
+
+ **Must NOT do**:
+ - Do not handle communication (Hermes's domain)
+ - Do not handle private knowledge (Apollo's domain)
+ - Do not write creative content (Calliope's domain)
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`agent-development`]
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 2
+ - **Blocks**: Task 14
+ - **Blocked By**: Task 2
+
+ **References**:
+ - `skills/agent-development/SKILL.md:349-378` - Standard prompt structure
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Athena prompt defines knowledge domain
+ Tool: Bash (grep)
+ Steps:
+ 1. grep -qi "outline" prompts/athena.txt && echo "found" || echo "missing"
+ 2. grep -qi "wiki\|knowledge" prompts/athena.txt && echo "found" || echo "missing"
+ 3. grep -qi "document" prompts/athena.txt && echo "found" || echo "missing"
+ Expected Result: Outline and knowledge terms present
+ Evidence: grep outputs
+ ```
+
+ **Commit**: YES (groups with Task 3)
+
+---
+
+ - [x] 7. Create Apollo (Private Knowledge) system prompt
+
+ **What to do**:
+ - Create `prompts/apollo.txt`
+ - Specialization: Obsidian vault, personal notes, private knowledge graph
+ - Greek god of knowledge, prophecy, and light
+ - Focus on: note search, personal task management, knowledge retrieval
+ - Uses Question tool for: clarifying which vault, which note
+
+ **Must NOT do**:
+ - Do not handle work tools (Hermes/Athena's domain)
+ - Do not expose personal data to work contexts
+ - Do not write long-form content (Calliope's domain)
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`agent-development`]
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 2
+ - **Blocks**: Task 14
+ - **Blocked By**: Task 2
+
+ **References**:
+ - `skills/agent-development/SKILL.md:349-378` - Standard prompt structure
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Apollo prompt defines private knowledge domain
+ Tool: Bash (grep)
+ Steps:
+ 1. grep -qi "obsidian" prompts/apollo.txt && echo "found" || echo "missing"
+ 2. grep -qi "personal\|private" prompts/apollo.txt && echo "found" || echo "missing"
+ 3. grep -qi "note\|vault" prompts/apollo.txt && echo "found" || echo "missing"
+ Expected Result: Obsidian and personal knowledge terms present
+ Evidence: grep outputs
+ ```
+
+ **Commit**: YES (groups with Task 3)
+
+---
+
+ - [x] 8. Create Calliope (Writing) system prompt
+
+ **What to do**:
+ - Create `prompts/calliope.txt`
+ - Specialization: documentation writing, reports, meeting notes, prose
+ - Greek muse of epic poetry and eloquence
+ - Focus on: drafting documents, summarizing, writing assistance
+ - Uses Question tool for: clarifying tone, audience, format
+
+ **Must NOT do**:
+ - Do not manage tools directly (delegates to other agents for tool access)
+ - Do not handle short communication (Hermes's domain)
+ - Do not overlap with Athena's wiki management
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`agent-development`]
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 2
+ - **Blocks**: Task 14
+ - **Blocked By**: Task 2
+
+ **References**:
+ - `skills/agent-development/SKILL.md:349-378` - Standard prompt structure
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Calliope prompt defines writing domain
+ Tool: Bash (grep)
+ Steps:
+ 1. grep -qi "writ" prompts/calliope.txt && echo "found" || echo "missing"
+ 2. grep -qi "document" prompts/calliope.txt && echo "found" || echo "missing"
+ 3. grep -qi "report\|summar" prompts/calliope.txt && echo "found" || echo "missing"
+ Expected Result: Writing and documentation terms present
+ Evidence: grep outputs
+ ```
+
+ **Commit**: YES (groups with Task 3)
+
+---
+
+### Wave 3: Tool Integration Skills
+
+ - [x] 9. Create Basecamp integration skill
+
+ **What to do**:
+ - Create `skills/basecamp/SKILL.md`
+ - Document Basecamp MCP capabilities (63 tools from georgeantonopoulos/Basecamp-MCP-Server)
+ - Include: projects, todos, messages, card tables, campfire, webhooks
+ - Provide workflow examples for common operations
+ - Reference MCP tool names for agent use
+
+ **Must NOT do**:
+ - Do not include MCP server setup instructions (managed by Nix)
+ - Do not duplicate general project management advice
+ - Do not include authentication handling
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`skill-creator`]
+ - `skill-creator`: Provides skill structure patterns and validation
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 3 (with Tasks 10-13)
+ - **Blocks**: None
+ - **Blocked By**: None
+
+ **References**:
+ - `skills/skill-creator/SKILL.md` - Skill creation patterns
+ - `skills/brainstorming/SKILL.md` - Example skill structure
+ - https://github.com/georgeantonopoulos/Basecamp-MCP-Server - MCP tool documentation
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Basecamp skill has valid structure
+ Tool: Bash
+ Steps:
+ 1. test -d skills/basecamp && echo "dir exists"
+ 2. test -f skills/basecamp/SKILL.md && echo "file exists"
+ 3. ./scripts/test-skill.sh --validate basecamp || echo "validation failed"
+ Expected Result: Directory and SKILL.md exist, validation passes
+ Evidence: Command outputs
+
+ Scenario: Basecamp skill has valid frontmatter
+ Tool: Bash (python)
+ Steps:
+ 1. python3 -c "
+ import yaml
+ content = open('skills/basecamp/SKILL.md').read()
+ front = content.split('---')[1]
+ data = yaml.safe_load(front)
+ assert data['name'] == 'basecamp', 'name mismatch'
+ assert 'description' in data, 'missing description'
+ print('Valid')
+ "
+ Expected Result: YAML frontmatter valid with correct name
+ Evidence: Python output
+ ```
+
+ **Commit**: YES
+ - Message: `feat(skills): add basecamp integration skill`
+ - Files: `skills/basecamp/SKILL.md`
+ - Pre-commit: `./scripts/test-skill.sh --validate basecamp`
+
+---
+
+ - [x] 10. Create Outline wiki integration skill
+
+ **What to do**:
+ - Create `skills/outline/SKILL.md`
+ - Document Outline API capabilities
+ - Include: document CRUD, search, collections, sharing
+ - Provide workflow examples for knowledge management
+
+ **Must NOT do**:
+ - Do not include MCP server setup
+ - Do not duplicate wiki concepts
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`skill-creator`]
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 3
+ - **Blocks**: None
+ - **Blocked By**: None
+
+ **References**:
+ - `skills/skill-creator/SKILL.md` - Skill creation patterns
+ - https://www.getoutline.com/developers - Outline API documentation
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Outline skill has valid structure
+ Tool: Bash
+ Steps:
+ 1. test -d skills/outline && test -f skills/outline/SKILL.md && echo "exists"
+ 2. ./scripts/test-skill.sh --validate outline || echo "failed"
+ Expected Result: Valid skill structure
+ Evidence: Command output
+ ```
+
+ **Commit**: YES
+ - Message: `feat(skills): add outline wiki integration skill`
+ - Files: `skills/outline/SKILL.md`
+ - Pre-commit: `./scripts/test-skill.sh --validate outline`
+
+---
+
+ - [x] 11. Create MS Teams integration skill
+
+ **What to do**:
+ - Create `skills/msteams/SKILL.md`
+ - Document MS Teams Graph API capabilities via MCP
+ - Include: channels, messages, meetings, chat
+ - Provide workflow examples for team communication
+
+ **Must NOT do**:
+ - Do not include Graph API authentication flows
+ - Do not overlap with Outlook email functionality
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`skill-creator`]
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 3
+ - **Blocks**: None
+ - **Blocked By**: None
+
+ **References**:
+ - `skills/skill-creator/SKILL.md` - Skill creation patterns
+ - https://learn.microsoft.com/en-us/graph/api/resources/teams-api-overview - Teams API
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: MS Teams skill has valid structure
+ Tool: Bash
+ Steps:
+ 1. test -d skills/msteams && test -f skills/msteams/SKILL.md && echo "exists"
+ 2. ./scripts/test-skill.sh --validate msteams || echo "failed"
+ Expected Result: Valid skill structure
+ Evidence: Command output
+ ```
+
+ **Commit**: YES
+ - Message: `feat(skills): add ms teams integration skill`
+ - Files: `skills/msteams/SKILL.md`
+ - Pre-commit: `./scripts/test-skill.sh --validate msteams`
+
+---
+
+ - [x] 12. Create Outlook email integration skill
+
+ **What to do**:
+ - Create `skills/outlook/SKILL.md`
+ - Document Outlook Graph API capabilities via MCP
+ - Include: mail CRUD, calendar, contacts, folders
+ - Provide workflow examples for email management
+
+ **Must NOT do**:
+ - Do not include Graph API authentication
+ - Do not overlap with Teams functionality
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`skill-creator`]
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 3
+ - **Blocks**: None
+ - **Blocked By**: None
+
+ **References**:
+ - `skills/skill-creator/SKILL.md` - Skill creation patterns
+ - https://learn.microsoft.com/en-us/graph/outlook-mail-concept-overview - Outlook API
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Outlook skill has valid structure
+ Tool: Bash
+ Steps:
+ 1. test -d skills/outlook && test -f skills/outlook/SKILL.md && echo "exists"
+ 2. ./scripts/test-skill.sh --validate outlook || echo "failed"
+ Expected Result: Valid skill structure
+ Evidence: Command output
+ ```
+
+ **Commit**: YES
+ - Message: `feat(skills): add outlook email integration skill`
+ - Files: `skills/outlook/SKILL.md`
+ - Pre-commit: `./scripts/test-skill.sh --validate outlook`
+
+---
+
+ - [x] 13. Create Obsidian integration skill
+
+ **What to do**:
+ - Create `skills/obsidian/SKILL.md`
+ - Document Obsidian Local REST API capabilities
+ - Include: vault operations, note CRUD, search, daily notes
+ - Reference skills/brainstorming/references/obsidian-workflow.md for patterns
+
+ **Must NOT do**:
+ - Do not include plugin installation
+ - Do not duplicate general note-taking advice
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: [`skill-creator`]
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 3
+ - **Blocks**: None
+ - **Blocked By**: None
+
+ **References**:
+ - `skills/skill-creator/SKILL.md` - Skill creation patterns
+ - `skills/brainstorming/references/obsidian-workflow.md` - Existing Obsidian patterns
+ - https://coddingtonbear.github.io/obsidian-local-rest-api/ - Local REST API docs
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Obsidian skill has valid structure
+ Tool: Bash
+ Steps:
+ 1. test -d skills/obsidian && test -f skills/obsidian/SKILL.md && echo "exists"
+ 2. ./scripts/test-skill.sh --validate obsidian || echo "failed"
+ Expected Result: Valid skill structure
+ Evidence: Command output
+ ```
+
+ **Commit**: YES
+ - Message: `feat(skills): add obsidian integration skill`
+ - Files: `skills/obsidian/SKILL.md`
+ - Pre-commit: `./scripts/test-skill.sh --validate obsidian`
+
+---
+
+### Wave 4: Validation
+
+ - [x] 14. Create agent validation script
+
+ **What to do**:
+ - Create `scripts/validate-agents.sh`
+ - Validate agents.json structure and required fields
+ - Verify all referenced prompt files exist
+ - Check prompt files are non-empty
+ - Integrate with existing test-skill.sh patterns
+
+ **Must NOT do**:
+ - Do not require MCP servers for validation
+ - Do not perform functional agent testing (just structural)
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: NO
+ - **Parallel Group**: Sequential (Wave 4)
+ - **Blocks**: None
+ - **Blocked By**: Tasks 1, 3-8
+
+ **References**:
+ - `scripts/test-skill.sh` - Existing validation script pattern
+
+ **Acceptance Criteria**:
+
+ ```
+ Scenario: Validation script is executable
+ Tool: Bash
+ Steps:
+ 1. test -x scripts/validate-agents.sh && echo "executable" || echo "not executable"
+ 2. Assert: Output is "executable"
+ Expected Result: Script has execute permission
+ Evidence: Command output
+
+ Scenario: Validation script runs successfully
+ Tool: Bash
+ Steps:
+ 1. ./scripts/validate-agents.sh
+ 2. Assert: Exit code is 0
+ Expected Result: All validations pass
+ Evidence: Script output
+
+ Scenario: Validation script catches missing files
+ Tool: Bash
+ Steps:
+ 1. mv prompts/chiron.txt prompts/chiron.txt.bak
+ 2. ./scripts/validate-agents.sh
+ 3. Assert: Exit code is NOT 0
+ 4. mv prompts/chiron.txt.bak prompts/chiron.txt
+ Expected Result: Script detects missing prompt file
+ Evidence: Error output
+ ```
+
+ **Commit**: YES
+ - Message: `feat(scripts): add agent validation script`
+ - Files: `scripts/validate-agents.sh`
+ - Pre-commit: `./scripts/validate-agents.sh`
+
+---
+
+## Commit Strategy
+
+| After Task | Message | Files | Verification |
+|------------|---------|-------|--------------|
+| 1, 2 | `feat(agents): add chiron agent framework with 6 agents` | agents/agents.json, prompts/ | `python3 -c "import json; json.load(open('agents/agents.json'))"` |
+| 3-8 | `feat(prompts): add chiron and subagent system prompts` | prompts/*.txt | `for f in prompts/*.txt; do test -s "$f"; done` |
+| 9 | `feat(skills): add basecamp integration skill` | skills/basecamp/ | `./scripts/test-skill.sh --validate basecamp` |
+| 10 | `feat(skills): add outline wiki integration skill` | skills/outline/ | `./scripts/test-skill.sh --validate outline` |
+| 11 | `feat(skills): add ms teams integration skill` | skills/msteams/ | `./scripts/test-skill.sh --validate msteams` |
+| 12 | `feat(skills): add outlook email integration skill` | skills/outlook/ | `./scripts/test-skill.sh --validate outlook` |
+| 13 | `feat(skills): add obsidian integration skill` | skills/obsidian/ | `./scripts/test-skill.sh --validate obsidian` |
+| 14 | `feat(scripts): add agent validation script` | scripts/validate-agents.sh | `./scripts/validate-agents.sh` |
+
+---
+
+## Success Criteria
+
+### Verification Commands
+```bash
+# Validate agents.json
+python3 -c "import json; json.load(open('agents/agents.json'))" # Expected: exit 0
+
+# Count agents
+python3 -c "import json; print(len(json.load(open('agents/agents.json'))))" # Expected: 6
+
+# Validate all prompts exist
+for f in chiron chiron-forge hermes athena apollo calliope; do
+ test -s prompts/$f.txt && echo "$f: OK" || echo "$f: MISSING"
+done
+
+# Validate all skills
+./scripts/test-skill.sh --validate # Expected: all pass
+
+# Run full validation
+./scripts/validate-agents.sh # Expected: exit 0
+```
+
+### Final Checklist
+- [ ] All 6 agents defined in agents.json
+- [ ] All 6 prompt files exist and are non-empty
+- [ ] All 5 skills have valid SKILL.md with YAML frontmatter
+- [ ] validate-agents.sh passes
+- [ ] test-skill.sh --validate passes
+- [ ] No MCP configuration in repo
+- [ ] No inline prompts in agents.json
+- [ ] All agent names are Greek mythology (not conflicting with Oh My OpenCode)
diff --git a/prompts/chiron-forge.txt b/prompts/chiron-forge.txt
new file mode 100644
index 0000000..16fbb62
--- /dev/null
+++ b/prompts/chiron-forge.txt
@@ -0,0 +1,50 @@
+You are Chiron-Forge, the Greek centaur smith of Hephaestus, specializing in execution and task completion as Chiron's build counterpart.
+
+**Your Core Responsibilities:**
+1. Execute tasks with full write access to complete planned work
+2. Modify files, run commands, and implement solutions
+3. Build and create artifacts based on Chiron's plans
+4. Delegate to specialized subagents for domain-specific work
+5. Confirm destructive operations before executing them
+
+**Process:**
+1. **Understand the Task**: Review the user's request and any plan provided by Chiron
+2. **Clarify Scope**: Use the Question tool for ambiguous requirements or destructive operations
+3. **Identify Dependencies**: Check if specialized subagent expertise is needed
+4. **Execute Work**: Use available tools to modify files, run commands, and complete tasks
+5. **Delegate to Subagents**: Use Task tool for specialized domains (Hermes for communications, Athena for knowledge, etc.)
+6. **Verify Results**: Confirm work is complete and meets quality standards
+7. **Report Completion**: Summarize what was accomplished
+
+**Quality Standards:**
+- Execute tasks accurately following specifications
+- Preserve code structure and formatting conventions
+- Confirm destructive operations before execution
+- Delegate appropriately when specialized expertise would improve quality
+- Maintain clear separation from Chiron's planning role
+
+**Output Format:**
+- Confirmation of what was executed
+- Summary of files modified or commands run
+- Verification that work is complete
+- Reference to any subagents that assisted
+
+**Edge Cases:**
+- **Destructive operations**: Use Question tool to confirm rm, git push, or similar commands
+- **Ambiguous requirements**: Ask for clarification rather than making assumptions
+- **Specialized domain work**: Recognize when tasks require Hermes, Athena, Apollo, or Calliope expertise
+- **Failed commands**: Diagnose errors, attempt fixes, and escalate when necessary
+
+**Tool Usage:**
+- Write/Edit tools: Use freely for file modifications
+- Bash tool: Execute commands, but use Question for rm, git push
+- Question tool: Required for destructive operations and ambiguous requirements
+- Task tool: Delegate to subagents for specialized domains
+- Git commands: Commit work when tasks are complete
+
+**Boundaries:**
+- DO NOT do extensive planning or analysis (that's Chiron's domain)
+- DO NOT write long-form documentation (Calliope's domain)
+- DO NOT manage private knowledge (Apollo's domain)
+- DO NOT handle work communications (Hermes's domain)
+- DO NOT execute destructive operations without confirmation
diff --git a/prompts/chiron.txt b/prompts/chiron.txt
new file mode 100644
index 0000000..16130e9
--- /dev/null
+++ b/prompts/chiron.txt
@@ -0,0 +1,59 @@
+You are Chiron, the wise centaur from Greek mythology, serving as the main orchestrator in plan and analysis mode. You coordinate specialized subagents and provide high-level guidance without direct execution.
+
+**Your Core Responsibilities:**
+1. Analyze user requests and determine optimal routing to specialized subagents or direct handling
+2. Provide strategic planning and analysis for complex workflows that require multiple agent capabilities
+3. Delegate tasks to appropriate subagents: Hermes (communication), Athena (work knowledge), Apollo (private knowledge), Calliope (writing)
+4. Coordinate multi-step workflows that span multiple domains and require agent collaboration
+5. Offer guidance and decision support for productivity, project management, and knowledge work
+6. Bridge personal and work contexts while maintaining appropriate boundaries between domains
+
+**Process:**
+1. **Analyze Request**: Identify the user's intent, required domains (communication, knowledge, writing, or combination), and complexity level
+2. **Clarify Ambiguity**: Use the Question tool when the request is vague, requires context, or needs clarification before proceeding
+3. **Determine Approach**: Decide whether to handle directly, delegate to a single subagent, or orchestrate multiple subagents
+4. **Delegate or Execute**: Route to appropriate subagent(s) with clear context, or provide direct analysis/guidance
+5. **Synthesize Results**: Combine outputs from multiple subagents into coherent recommendations or action plans
+6. **Provide Guidance**: Offer strategic insights, priorities, and next steps based on the analysis
+
+**Delegation Logic:**
+- **Hermes**: Work communication tasks (email drafts, message management, meeting coordination)
+- **Athena**: Work knowledge retrieval (wiki searches, documentation lookup, project information)
+- **Apollo**: Private knowledge management (Obsidian vault access, personal notes, task tracking)
+- **Calliope**: Writing assistance (documentation, reports, meeting summaries, professional prose)
+- **Chiron-Forge**: Execution tasks requiring file modifications, command execution, or direct system changes
+
+**Quality Standards:**
+- Clarify ambiguous requests before proceeding with delegation or analysis
+- Provide clear rationale when delegating to specific subagents
+- Maintain appropriate separation between personal (Apollo) and work (Athena/Hermes) domains
+- Synthesize multi-agent outputs into coherent, actionable guidance
+- Respect permission boundaries (read-only analysis, delegate execution to Chiron-Forge)
+- Offer strategic context alongside tactical recommendations
+
+**Output Format:**
+For direct analysis: Provide structured insights with clear reasoning and recommendations
+For delegation: State which subagent is handling the task and why
+For orchestration: Outline the workflow, which agents are involved, and expected outcomes
+Include next steps or decision points when appropriate
+
+**Edge Cases:**
+- **Ambiguous requests**: Use Question tool to clarify intent, scope, and preferred approach before proceeding
+- **Cross-domain requests**: Analyze which subagents are needed and delegate in sequence or parallel as appropriate
+- **Personal vs work overlap**: Explicitly maintain boundaries, route personal tasks to Apollo, work tasks to Hermes/Athena
+- **Execution required tasks**: Explain that Chiron-Forge handles execution and offer to delegate
+- **Multiple possible approaches**: Present options with trade-offs and ask for user preference
+
+**Tool Usage:**
+- Question tool: REQUIRED when requests are ambiguous, lack context, or require clarification before delegation or analysis
+- Task tool: Use to delegate to subagents (hermes, athena, apollo, calliope) with clear context and objectives
+- Read/analysis tools: Available for gathering context and providing read-only guidance
+
+**Boundaries:**
+- Do NOT modify files directly (read-only orchestrator mode)
+- Do NOT execute commands or make system changes (delegate to Chiron-Forge)
+- Do NOT handle communication drafting directly (Hermes's domain)
+- Do NOT access work documentation repositories (Athena's domain)
+- Do NOT access private vaults or personal notes (Apollo's domain)
+- Do NOT write long-form content (Calliope's domain)
+- Do NOT execute build or deployment tasks (Chiron-Forge's domain)
diff --git a/scripts/validate-agents.sh b/scripts/validate-agents.sh
index 009a4f8..507c2bf 100755
--- a/scripts/validate-agents.sh
+++ b/scripts/validate-agents.sh
@@ -1,16 +1,16 @@
#!/usr/bin/env bash
#
-# Validate agents.json structure and prompt files
+# Validate agents.json structure and referenced prompt files
#
# Usage:
-# ./scripts/validate-agents.sh # Validate agents.json
-# ./scripts/validate-agents.sh --help # Show help
+# ./scripts/validate-agents.sh
#
-# Checks:
-# - agents.json is valid JSON
-# - Each agent has required fields (description, mode, model, prompt, permission)
-# - All referenced prompt files exist
-# - All prompt files are non-empty
+# This script validates the agent configuration by:
+# - Parsing agents.json as valid JSON
+# - Checking all 6 required agents are present
+# - Verifying each agent has required fields
+# - Validating agent modes (primary vs subagent)
+# - Verifying all referenced prompt files exist and are non-empty
set -euo pipefail
@@ -22,146 +22,161 @@ GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
-usage() {
- echo "Usage: $0 [OPTIONS]"
- echo ""
- echo "Validate agents.json structure and prompt files."
- echo ""
- echo "Options:"
- echo " --help Show this help message"
- echo ""
- echo "Validates:"
- echo " - agents.json is valid JSON"
- echo " - Each agent has required fields"
- echo " - All referenced prompt files exist"
- echo " - All prompt files are non-empty"
+AGENTS_FILE="$REPO_ROOT/agents/agents.json"
+PROMPTS_DIR="$REPO_ROOT/prompts"
+
+# Expected agent list
+EXPECTED_AGENTS=("chiron" "chiron-forge" "hermes" "athena" "apollo" "calliope")
+# Expected primary agents
+PRIMARY_AGENTS=("chiron" "chiron-forge")
+# Expected subagents
+SUBAGENTS=("hermes" "athena" "apollo" "calliope")
+# Required fields for each agent
+REQUIRED_FIELDS=("description" "mode" "model" "prompt")
+
+echo -e "${YELLOW}Validating agent configuration...${NC}"
+echo ""
+
+# Track errors
+error_count=0
+warning_count=0
+
+# Function to print error
+error() {
+ echo -e "${RED}❌ $1${NC}" >&2
+ ((error_count++)) || true
}
-check_json_valid() {
- local agents_file="$1"
+# Function to print warning
+warning() {
+ echo -e "${YELLOW}⚠️ $1${NC}"
+ ((warning_count++)) || true
+}
- if ! python3 -m json.tool "$agents_file" > /dev/null 2>&1; then
- echo -e "${RED}❌ agents.json is not valid JSON${NC}"
- return 1
+# Function to print success
+success() {
+ echo -e "${GREEN}✅ $1${NC}"
+}
+
+# Check if agents.json exists
+if [[ ! -f "$AGENTS_FILE" ]]; then
+ error "agents.json not found at $AGENTS_FILE"
+ exit 1
+fi
+
+# Validate JSON syntax
+if ! python3 -c "import json; json.load(open('$AGENTS_FILE'))" 2>/dev/null; then
+ error "agents.json is not valid JSON"
+ exit 1
+fi
+
+success "agents.json is valid JSON"
+echo ""
+
+# Parse agents.json
+AGENT_COUNT=$(python3 -c "import json; print(len(json.load(open('$AGENTS_FILE'))))")
+success "Found $AGENT_COUNT agents in agents.json"
+
+# Check agent count
+if [[ $AGENT_COUNT -ne ${#EXPECTED_AGENTS[@]} ]]; then
+ error "Expected ${#EXPECTED_AGENTS[@]} agents, found $AGENT_COUNT"
+fi
+
+# Get list of agent names
+AGENT_NAMES=$(python3 -c "import json; print(' '.join(sorted(json.load(open('$AGENTS_FILE')).keys())))")
+
+echo ""
+echo "Checking agent list..."
+
+# Check for missing agents
+for expected_agent in "${EXPECTED_AGENTS[@]}"; do
+ if echo "$AGENT_NAMES" | grep -qw "$expected_agent"; then
+ success "Agent '$expected_agent' found"
+ else
+ error "Required agent '$expected_agent' not found"
fi
+done
- echo -e "${GREEN}✅ agents.json is valid JSON${NC}"
- return 0
-}
+# Check for unexpected agents
+for agent_name in $AGENT_NAMES; do
+ if [[ ! " ${EXPECTED_AGENTS[@]} " =~ " ${agent_name} " ]]; then
+ warning "Unexpected agent '$agent_name' found (not in expected list)"
+ fi
+done
-check_required_fields() {
- local agents_file="$1"
- local agent_name="$2"
- local agent_data="$3"
+echo ""
+echo "Checking agent fields and modes..."
- local required_fields=("description" "mode" "model" "prompt" "permission")
- local missing_fields=()
+# Validate each agent
+for agent_name in "${EXPECTED_AGENTS[@]}"; do
+ echo -n " $agent_name: "
- for field in "${required_fields[@]}"; do
- if ! echo "$agent_data" | python3 -c "import sys, json; data = json.load(sys.stdin); exit(0 if '$field' in data else 1)" 2>/dev/null; then
+ # Check required fields
+ missing_fields=()
+ for field in "${REQUIRED_FIELDS[@]}"; do
+ if ! python3 -c "import json; data=json.load(open('$AGENTS_FILE')); print(data.get('$agent_name').get('$field', ''))" 2>/dev/null | grep -q .; then
missing_fields+=("$field")
fi
done
if [[ ${#missing_fields[@]} -gt 0 ]]; then
- echo -e " ${RED}❌ Missing required fields for '$agent_name': ${missing_fields[*]}${NC}"
- return 1
+ error "Missing required fields: ${missing_fields[*]}"
+ continue
fi
- echo -e " ${GREEN}✅ '$agent_name' has all required fields${NC}"
- return 0
-}
+ # Get mode value
+ mode=$(python3 -c "import json; print(json.load(open('$AGENTS_FILE'))['$agent_name']['mode'])")
-check_prompt_file() {
- local agent_name="$1"
- local prompt_ref="$2"
-
- # Extract filename from {file:./prompts/filename}
- if [[ ! $prompt_ref =~ \{file:./prompts/([^}]+)\} ]]; then
- echo -e " ${RED}❌ '$agent_name': Invalid prompt reference format: $prompt_ref${NC}"
- return 1
- fi
-
- local prompt_file="prompts/${BASH_REMATCH[1]}"
-
- if [[ ! -f "$REPO_ROOT/$prompt_file" ]]; then
- echo -e " ${RED}❌ '$agent_name': Prompt file not found: $prompt_file${NC}"
- return 1
- fi
-
- if [[ ! -s "$REPO_ROOT/$prompt_file" ]]; then
- echo -e " ${RED}❌ '$agent_name': Prompt file is empty: $prompt_file${NC}"
- return 1
- fi
-
- echo -e " ${GREEN}✅ '$agent_name': Prompt file exists and is non-empty ($prompt_file)${NC}"
- return 0
-}
-
-validate_agents() {
- local agents_file="$REPO_ROOT/agents/agents.json"
-
- echo -e "${YELLOW}Validating agents.json...${NC}"
- echo ""
-
- if [[ ! -f "$agents_file" ]]; then
- echo -e "${RED}❌ agents.json not found at $agents_file${NC}"
- exit 1
- fi
-
- check_json_valid "$agents_file" || exit 1
-
- local agent_names
- agent_names=$(python3 -c "import json; data = json.load(open('$agents_file')); print('\n'.join(data.keys()))")
-
- local failed=0
-
- while IFS= read -r agent_name; do
- [[ -z "$agent_name" ]] && continue
-
- echo -n " Checking '$agent_name': "
-
- local agent_data
- agent_data=$(python3 -c "import json; data = json.load(open('$agents_file')); print(json.dumps(data['$agent_name']))")
-
- if ! check_required_fields "$agents_file" "$agent_name" "$agent_data"; then
- ((failed++)) || true
- continue
+ # Validate mode
+ if [[ " ${PRIMARY_AGENTS[@]} " =~ " ${agent_name} " ]]; then
+ if [[ "$mode" == "primary" ]]; then
+ success "Mode: $mode (valid)"
+ else
+ error "Expected mode 'primary' for agent '$agent_name', found '$mode'"
fi
-
- local prompt_ref
- prompt_ref=$(python3 -c "import json, sys; data = json.load(open('$agents_file')); print(data['$agent_name'].get('prompt', ''))")
-
- if ! check_prompt_file "$agent_name" "$prompt_ref"; then
- ((failed++)) || true
+ elif [[ " ${SUBAGENTS[@]} " =~ " ${agent_name} " ]]; then
+ if [[ "$mode" == "subagent" ]]; then
+ success "Mode: $mode (valid)"
+ else
+ error "Expected mode 'subagent' for agent '$agent_name', found '$mode'"
fi
+ fi
+done
- done <<< "$agent_names"
+echo ""
+echo "Checking prompt files..."
- echo ""
+# Validate prompt file references
+for agent_name in "${EXPECTED_AGENTS[@]}"; do
+ # Extract prompt file path from agent config
+ prompt_ref=$(python3 -c "import json; print(json.load(open('$AGENTS_FILE'))['$agent_name']['prompt'])")
- if [[ $failed -eq 0 ]]; then
- echo -e "${GREEN}✅ All agents validated successfully!${NC}"
- exit 0
+ # Parse prompt reference: {file:./prompts/.txt}
+ if [[ "$prompt_ref" =~ \{file:(\./prompts/[^}]+)\} ]]; then
+ prompt_file="${BASH_REMATCH[1]}"
+ prompt_path="$REPO_ROOT/${prompt_file#./}"
+
+ # Check if prompt file exists
+ if [[ -f "$prompt_path" ]]; then
+ # Check if prompt file is non-empty
+ if [[ -s "$prompt_path" ]]; then
+ success "Prompt file exists and non-empty: $prompt_file"
+ else
+ error "Prompt file is empty: $prompt_file"
+ fi
+ else
+ error "Prompt file not found: $prompt_file"
+ fi
else
- echo -e "${RED}❌ $failed agent(s) failed validation${NC}"
- exit 1
+ error "Invalid prompt reference format for agent '$agent_name': $prompt_ref"
fi
-}
+done
-# Main
-case "${1:-}" in
- --help|-h)
- usage
- exit 0
- ;;
- "")
- validate_agents
- ;;
- *)
- echo -e "${RED}Unknown option: $1${NC}"
- echo ""
- usage
- exit 1
- ;;
-esac
+echo ""
+if [[ $error_count -eq 0 ]]; then
+ echo -e "${GREEN}All validations passed!${NC}"
+ exit 0
+else
+ echo -e "${RED}$error_count validation error(s) found${NC}"
+ exit 1
+fi
diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md
new file mode 100644
index 0000000..cdeb922
--- /dev/null
+++ b/skills/basecamp/SKILL.md
@@ -0,0 +1,315 @@
+---
+name: basecamp
+description: "Use when: (1) Managing Basecamp projects, (2) Working with Basecamp todos and tasks, (3) Reading/updating message boards and campfire, (4) Managing card tables (kanban), (5) Handling email forwards/inbox, (6) Setting up webhooks for automation. Triggers: 'Basecamp', 'project', 'todo', 'card table', 'campfire', 'message board', 'webhook', 'inbox', 'email forwards'."
+compatibility: opencode
+---
+
+# Basecamp
+
+Basecamp 3 project management integration via MCP server. Provides comprehensive access to projects, todos, messages, card tables (kanban), campfire, inbox, documents, and webhooks.
+
+## Core Workflows
+
+### Finding Projects and Todos
+
+**List all projects:**
+```bash
+# Get all accessible Basecamp projects
+get_projects
+```
+
+**Get project details:**
+```bash
+# Get specific project information including status, tools, and access level
+get_project --project_id
+```
+
+**Explore todos:**
+```bash
+# Get all todo lists in a project
+get_todolists --project_id
+
+# Get all todos from a specific todo list (handles pagination automatically)
+get_todos --recording_id
+
+# Search across projects for todos/messages containing keywords
+search_basecamp --query
+```
+
+### Managing Card Tables (Kanban)
+
+**Card tables** are Basecamp's kanban-style workflow management tool.
+
+**Explore card table:**
+```bash
+# Get card table for a project
+get_card_table --project_id
+
+# Get all columns in a card table
+get_columns --card_table_id
+
+# Get all cards in a specific column
+get_cards --column_id
+```
+
+**Manage columns:**
+```bash
+# Create new column (e.g., "In Progress", "Done")
+create_column --card_table_id --title "Column Name"
+
+# Update column title
+update_column --column_id --title "New Title"
+
+# Move column to different position
+move_column --column_id --position 3
+
+# Update column color
+update_column_color --column_id --color "red"
+
+# Put column on hold (freeze work)
+put_column_on_hold --column_id
+
+# Remove hold from column (unfreeze work)
+remove_column_hold --column_id
+```
+
+**Manage cards:**
+```bash
+# Create new card in a column
+create_card --column_id --title "Task Name" --content "Description"
+
+# Update card details
+update_card --card_id --title "Updated Title" --content "New content"
+
+# Move card to different column
+move_card --card_id --to_column_id
+
+# Mark card as complete
+complete_card --card_id
+
+# Mark card as incomplete
+uncomplete_card --card_id
+```
+
+**Manage card steps (sub-tasks):**
+```bash
+# Get all steps for a card
+get_card_steps --card_id
+
+# Create new step
+create_card_step --card_id --content "Sub-task description"
+
+# Update step
+update_card_step --step_id --content "Updated description"
+
+# Delete step
+delete_card_step --step_id
+
+# Mark step as complete
+complete_card_step --step_id
+
+# Mark step as incomplete
+uncomplete_card_step --step_id
+```
+
+### Working with Messages and Campfire
+
+**Message board:**
+```bash
+# Get message board for a project
+get_message_board --project_id
+
+# Get all messages from a project
+get_messages --project_id
+
+# Get specific message
+get_message --message_id
+```
+
+**Campfire (team chat):**
+```bash
+# Get recent campfire lines (messages)
+get_campfire_lines --campfire_id
+```
+
+**Comments:**
+```bash
+# Get comments for any Basecamp item (message, todo, card, etc.)
+get_comments --recording_id
+
+# Create a comment
+create_comment --recording_id --content "Your comment"
+```
+
+### Managing Inbox (Email Forwards)
+
+**Inbox** handles email forwarding to Basecamp projects.
+
+**Explore inbox:**
+```bash
+# Get inbox for a project (email forwards container)
+get_inbox --project_id
+
+# Get all forwarded emails from a project's inbox
+get_forwards --project_id
+
+# Get specific forwarded email
+get_forward --forward_id
+
+# Get all replies to a forwarded email
+get_inbox_replies --forward_id
+
+# Get specific reply
+get_inbox_reply --reply_id
+```
+
+**Manage forwards:**
+```bash
+# Move forwarded email to trash
+trash_forward --forward_id
+```
+
+### Documents
+
+**Manage documents:**
+```bash
+# List documents in a vault
+get_documents --vault_id
+
+# Get specific document
+get_document --document_id
+
+# Create new document
+create_document --vault_id --title "Document Title" --content "Document content"
+
+# Update document
+update_document --document_id --title "Updated Title" --content "New content"
+
+# Move document to trash
+trash_document --document_id
+```
+
+### Webhooks and Automation
+
+**Webhooks** enable automation by triggering external services on Basecamp events.
+
+**Manage webhooks:**
+```bash
+# List webhooks for a project
+get_webhooks --project_id
+
+# Create webhook
+create_webhook --project_id --callback_url "https://your-service.com/webhook" --types "TodoCreated,TodoCompleted"
+
+# Delete webhook
+delete_webhook --webhook_id
+```
+
+### Daily Check-ins
+
+**Project check-ins:**
+```bash
+# Get daily check-in questions for a project
+get_daily_check_ins --project_id
+
+# Get answers to daily check-in questions
+get_question_answers --question_id
+```
+
+### Attachments and Events
+
+**Upload and track:**
+```bash
+# Upload file as attachment
+create_attachment --recording_id --file_path "/path/to/file"
+
+# Get events for a recording
+get_events --recording_id
+```
+
+## Integration with Other Skills
+
+### Hermes (Work Communication)
+
+Hermes loads this skill when working with Basecamp projects. Common workflows:
+
+| User Request | Hermes Action | Basecamp Tools Used |
+|--------------|---------------|---------------------|
+| "Create a task in Marketing project" | Create card/todo | `create_card`, `get_columns`, `create_column` |
+| "Check project updates" | Read messages/campfire | `get_messages`, `get_campfire_lines`, `get_comments` |
+| "Update my tasks" | Move cards, update status | `move_card`, `complete_card`, `update_card` |
+| "Add comment to discussion" | Post comment | `create_comment`, `get_comments` |
+| "Review project inbox" | Check email forwards | `get_inbox`, `get_forwards`, `get_inbox_replies` |
+
+### Workflow Patterns
+
+**Project setup:**
+1. Use `get_projects` to find existing projects
+2. Use `get_project` to verify project details
+3. Use `get_todolists` or `get_card_table` to understand project structure
+
+**Task management:**
+1. Use `get_todolists` or `get_columns` to find appropriate location
+2. Use `create_card` or todo creation to add work
+3. Use `move_card`, `complete_card` to update status
+4. Use `get_card_steps` and `create_card_step` for sub-task breakdown
+
+**Communication:**
+1. Use `get_messages` or `get_campfire_lines` to read discussions
+2. Use `create_comment` to contribute to existing items
+3. Use `search_basecamp` to find relevant content
+
+**Automation:**
+1. Use `get_webhooks` to check existing integrations
+2. Use `create_webhook` to set up external notifications
+
+## Tool Organization by Category
+
+**Projects & Lists:**
+- `get_projects`, `get_project`, `get_todolists`, `get_todos`, `search_basecamp`
+
+**Card Table (Kanban):**
+- `get_card_table`, `get_columns`, `get_column`, `create_column`, `update_column`, `move_column`, `update_column_color`, `put_column_on_hold`, `remove_column_hold`, `watch_column`, `unwatch_column`, `get_cards`, `get_card`, `create_card`, `update_card`, `move_card`, `complete_card`, `uncomplete_card`, `get_card_steps`, `create_card_step`, `get_card_step`, `update_card_step`, `delete_card_step`, `complete_card_step`, `uncomplete_card_step`
+
+**Messages & Communication:**
+- `get_message_board`, `get_messages`, `get_message`, `get_campfire_lines`, `get_comments`, `create_comment`
+
+**Inbox (Email Forwards):**
+- `get_inbox`, `get_forwards`, `get_forward`, `get_inbox_replies`, `get_inbox_reply`, `trash_forward`
+
+**Documents:**
+- `get_documents`, `get_document`, `create_document`, `update_document`, `trash_document`
+
+**Webhooks:**
+- `get_webhooks`, `create_webhook`, `delete_webhook`
+
+**Other:**
+- `get_daily_check_ins`, `get_question_answers`, `create_attachment`, `get_events`
+
+## Common Queries
+
+**Finding the right project:**
+```bash
+# Use search to find projects by keyword
+search_basecamp --query "marketing"
+# Then inspect specific project
+get_project --project_id
+```
+
+**Understanding project structure:**
+```bash
+# Check which tools are available in a project
+get_project --project_id
+# Project response includes tools: message_board, campfire, card_table, todolists, etc.
+```
+
+**Bulk operations:**
+```bash
+# Get all todos across a project (pagination handled automatically)
+get_todos --recording_id
+# Returns all pages of results
+
+# Get all cards across all columns
+get_columns --card_table_id
+get_cards --column_id # Repeat for each column
+```
diff --git a/skills/msteams/SKILL.md b/skills/msteams/SKILL.md
new file mode 100644
index 0000000..62442e1
--- /dev/null
+++ b/skills/msteams/SKILL.md
@@ -0,0 +1,108 @@
+---
+name: msteams
+description: "Microsoft Teams Graph API integration for team communication. Use when: (1) Managing teams and channels, (2) Sending/receiving channel messages, (3) Scheduling or managing meetings, (4) Handling chat conversations. Triggers: 'Teams', 'meeting', 'channel', 'team message', 'chat', 'Teams message'."
+compatibility: opencode
+---
+
+# Microsoft Teams Integration
+
+Microsoft Teams Graph API integration for managing team communication, channels, messages, meetings, and chat conversations via MCP tools.
+
+## Core Capabilities
+
+### Teams & Channels
+- **List joined teams**: Retrieve all teams the user is a member of
+- **Manage channels**: Create, list, and manage channels within teams
+- **Team membership**: Add, remove, and update team members
+
+### Channel Messages
+- **Send messages**: Post messages to channels with rich text support
+- **Retrieve messages**: List channel messages with filtering by date range
+- **Message management**: Read and respond to channel communications
+
+### Online Meetings
+- **Schedule meetings**: Create online meetings with participants
+- **Manage meetings**: Update meeting details and coordinates
+- **Meeting access**: Retrieve join links and meeting information
+- **Presence**: Check user presence and activity status
+
+### Chat
+- **Direct messages**: 1:1 chat conversations with users
+- **Group chats**: Multi-person chat conversations
+- **Chat messages**: Send and receive chat messages
+
+## Common Workflows
+
+### Send Channel Message
+
+1. Identify target team and channel
+2. Compose message content
+3. Use MCP tool to send message to channel
+
+Example:
+```
+"Post a message to the 'General' channel in 'Engineering' team about the deployment status"
+```
+
+### Schedule Meeting
+
+1. Determine meeting participants
+2. Set meeting time and duration
+3. Create meeting title and description
+4. Use MCP tool to create online meeting
+
+Example:
+```
+"Schedule a meeting with @alice and @bob for Friday 2pm to discuss the project roadmap"
+```
+
+### List Channel Messages
+
+1. Specify team and channel
+2. Define date range (required for polling)
+3. Retrieve and display messages
+
+Example:
+```
+"Show me all messages in #general from the last week"
+```
+
+### Send Direct Message
+
+1. Identify recipient user
+2. Compose message
+3. Use MCP chat tool to send message
+
+Example:
+```
+"Send a message to @john asking if the PR review is complete"
+```
+
+## MCP Tool Categories
+
+The MS Teams MCP server provides tool categories for:
+
+- **Channels**: Team and channel management operations
+- **Messages**: Channel message operations
+- **Meetings**: Online meeting scheduling and management
+- **Chat**: Direct and group chat operations
+
+## Important Constraints
+
+**Authentication**: Do NOT include Graph API authentication flows. The MCP server handles authentication configuration.
+
+**Polling limits**: When retrieving messages, always specify a date range. Polling the same resource more than once per day is a violation of Microsoft APIs Terms of Use.
+
+**Email overlap**: Do NOT overlap with Outlook email functionality. This skill focuses on Teams-specific communication (channels, chat, meetings), not email operations.
+
+**File storage**: Files in channels are stored in SharePoint. Use SharePoint-specific operations for file management.
+
+## Domain Boundaries
+
+This skill integrates with **Hermes** (work communication agent). Hermes loads this skill when user requests:
+- Teams-related operations
+- Meeting scheduling or management
+- Channel communication
+- Teams chat conversations
+
+For email operations, Hermes uses the **outlook** skill instead.
diff --git a/skills/obsidian/SKILL.md b/skills/obsidian/SKILL.md
new file mode 100644
index 0000000..2451f62
--- /dev/null
+++ b/skills/obsidian/SKILL.md
@@ -0,0 +1,240 @@
+---
+name: obsidian
+description: "Obsidian Local REST API integration for knowledge management. Use when: (1) Creating, reading, updating, or deleting notes in Obsidian vault, (2) Searching vault content by title, content, or tags, (3) Managing daily notes and journaling, (4) Working with WikiLinks and vault metadata. Triggers: 'Obsidian', 'note', 'vault', 'WikiLink', 'daily note', 'journal', 'create note'."
+compatibility: opencode
+---
+
+# Obsidian
+
+Knowledge management integration via Obsidian Local REST API for vault operations, note CRUD, search, and daily notes.
+
+## Prerequisites
+
+- **Obsidian Local REST API plugin** installed and enabled in Obsidian
+- **API server running** on default port `27124` (or configured custom port)
+- **Vault path** configured in plugin settings
+- **API key** set (optional, if authentication enabled)
+
+API endpoints available at `http://127.0.0.1:27124` by default.
+
+## Core Workflows
+
+### List Vault Files
+
+Get list of all files in vault:
+
+```bash
+curl -X GET "http://127.0.0.1:27124/list"
+```
+
+Returns array of file objects with `path`, `mtime`, `ctime`, `size`.
+
+### Get File Metadata
+
+Retrieve metadata for a specific file:
+
+```bash
+curl -X GET "http://127.0.0.1:27124/get-file-info?path=Note%20Title.md"
+```
+
+Returns file metadata including tags, links, frontmatter.
+
+### Create Note
+
+Create a new note in the vault:
+
+```bash
+curl -X POST "http://127.0.0.1:27124/create-note" \
+ -H "Content-Type: application/json" \
+ -d '{"content": "# Note Title\n\nNote content..."}'
+```
+
+Use `path` parameter for specific location:
+```json
+{
+ "content": "# Note Title\n\nNote content...",
+ "path": "subdirectory/Note Title.md"
+}
+```
+
+### Read Note
+
+Read note content by path:
+
+```bash
+curl -X GET "http://127.0.0.1:27124/read-note?path=Note%20Title.md"
+```
+
+Returns note content as plain text or structured JSON with frontmatter parsing.
+
+### Update Note
+
+Modify existing note:
+
+```bash
+curl -X PUT "http://127.0.0.1:27124/update-note" \
+ -H "Content-Type: application/json" \
+ -d '{"path": "Note Title.md", "content": "# Updated Title\n\nNew content..."}'
+```
+
+### Delete Note
+
+Remove note from vault:
+
+```bash
+curl -X DELETE "http://127.0.0.1:27124/delete-note?path=Note%20Title.md"
+```
+
+**Warning**: This operation is irreversible. Confirm with user before executing.
+
+### Search Notes
+
+Find notes by content, title, or tags:
+
+```bash
+# Content search
+curl -X GET "http://127.0.0.1:27124/search?q=search%20term"
+
+# Search with parameters
+curl -X GET "http://127.0.0.1:27124/search?q=search%20term&path=subdirectory&context-length=100"
+```
+
+Returns array of matches with file path and context snippets.
+
+### Daily Notes
+
+#### Get Daily Note
+
+Retrieve or create daily note for specific date:
+
+```bash
+# Today
+curl -X GET "http://127.0.0.1:27124/daily-note"
+
+# Specific date (YYYY-MM-DD)
+curl -X GET "http://127.0.0.1:27124/daily-note?date=2026-02-03"
+```
+
+Returns daily note content or creates using Obsidian's Daily Notes template.
+
+#### Update Daily Note
+
+Modify today's daily note:
+
+```bash
+curl -X PUT "http://127.0.0.1:27124/daily-note" \
+ -H "Content-Type: application/json" \
+ -d '{"content": "## Journal\n\nToday I learned..."}'
+```
+
+### Get Vault Info
+
+Retrieve vault metadata:
+
+```bash
+curl -X GET "http://127.0.0.1:27124/vault-info"
+```
+
+Returns vault path, file count, and configuration details.
+
+## Note Structure Patterns
+
+### Frontmatter Conventions
+
+Use consistent frontmatter for note types:
+
+```yaml
+---
+date: 2026-02-03
+created: 2026-02-03T10:30:00Z
+type: note
+tags: #tag1 #tag2
+status: active
+---
+```
+
+### WikiLinks
+
+Reference other notes using Obsidian WikiLinks:
+- `[[Note Title]]` - Link to note by title
+- `[[Note Title|Alias]]` - Link with custom display text
+- `[[Note Title#Heading]]` - Link to specific heading
+- `![[Image.png]]` - Embed images or media
+
+### Tagging
+
+Use tags for categorization:
+- `#tag` - Single-word tag
+- `#nested/tag` - Hierarchical tags
+- Tags in frontmatter for metadata
+- Tags in content for inline categorization
+
+## Workflow Examples
+
+### Create Brainstorm Note
+
+```bash
+curl -X POST "http://127.0.0.1:27124/create-note" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "path": "03-resources/brainstorms/2026-02-03-Topic.md",
+ "content": "---\ndate: 2026-02-03\ncreated: 2026-02-03T10:30:00Z\ntype: brainstorm\nframework: pros-cons\nstatus: draft\ntags: #brainstorm #pros-cons\n---\n\n# Topic\n\n## Context\n\n## Options\n\n## Decision\n"
+ }'
+```
+
+### Append to Daily Journal
+
+```bash
+# Get current daily note
+NOTE=$(curl -s "http://127.0.0.1:27124/daily-note")
+
+# Append content
+curl -X PUT "http://127.0.0.1:27124/daily-note" \
+ -H "Content-Type: application/json" \
+ -d "{\"content\": \"${NOTE}\n\n## Journal Entry\n\nLearned about Obsidian API integration.\"}"
+```
+
+### Search and Link Notes
+
+```bash
+# Search for related notes
+curl -s "http://127.0.0.1:27124/search?q=Obsidian"
+
+# Create note with WikiLinks to found notes
+curl -X POST "http://127.0.0.1:27124/create-note" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "path": "02-areas/Obsidian API Guide.md",
+ "content": "# Obsidian API Guide\n\nSee [[API Endpoints]] and [[Workflows]] for details."
+ }'
+```
+
+## Integration with Other Skills
+
+| From Obsidian | To skill | Handoff pattern |
+|--------------|----------|----------------|
+| Note created | brainstorming | Create brainstorm note with frontmatter |
+| Daily note updated | reflection | Append conversation analysis to journal |
+| Research note | research | Save research findings with tags |
+| Project note | task-management | Link tasks to project notes |
+| Plan document | plan-writing | Save generated plan to vault |
+
+## Best Practices
+
+1. **Use paths consistently** - Follow PARA structure or vault conventions
+2. **Include frontmatter** - Enables search and metadata queries
+3. **Use WikiLinks** - Creates knowledge graph connections
+4. **Validate paths** - Check file existence before operations
+5. **Handle errors** - API may return 404 for non-existent files
+6. **Escape special characters** - URL-encode paths with spaces or symbols
+7. **Backup vault** - REST API operations modify files directly
+
+## Error Handling
+
+Common HTTP status codes:
+- `200 OK` - Success
+- `404 Not Found` - File or resource doesn't exist
+- `400 Bad Request` - Invalid parameters or malformed JSON
+- `500 Internal Server Error` - Plugin or vault error
+
+Check API response body for error details before retrying operations.
diff --git a/skills/outline/SKILL.md b/skills/outline/SKILL.md
new file mode 100644
index 0000000..61a1294
--- /dev/null
+++ b/skills/outline/SKILL.md
@@ -0,0 +1,126 @@
+---
+name: outline
+description: "Outline wiki integration for knowledge management and documentation workflows. Use when Opencode needs to interact with Outline for: (1) Creating and editing documents, (2) Searching and retrieving knowledge base content, (3) Managing document collections and hierarchies, (4) Handling document sharing and permissions, (5) Collaborative features like comments. Triggers: 'Outline', 'wiki', 'knowledge base', 'documentation', 'team docs', 'document in Outline', 'search Outline', 'Outline collection'."
+compatibility: opencode
+---
+
+# Outline Wiki Integration
+
+Outline is a team knowledge base and wiki platform. This skill provides guidance for Outline API operations and knowledge management workflows.
+
+## Core Capabilities
+
+### Document Operations
+
+- **Create**: Create new documents with markdown content
+- **Read**: Retrieve document content, metadata, and revisions
+- **Update**: Edit existing documents, update titles and content
+- **Delete**: Remove documents (with appropriate permissions)
+
+### Collection Management
+
+- **Organize**: Structure documents in collections and nested collections
+- **Hierarchies**: Create parent-child relationships
+- **Access Control**: Set permissions at collection level
+
+### Search and Discovery
+
+- **Full-text search**: Find documents by content
+- **Metadata filters**: Search by collection, author, date
+- **Advanced queries**: Combine multiple filters
+
+### Sharing and Permissions
+
+- **Public links**: Generate shareable document URLs
+- **Team access**: Manage member permissions
+- **Guest access**: Control external sharing
+
+### Collaboration
+
+- **Comments**: Add threaded discussions to documents
+- **Revisions**: Track document history and changes
+- **Notifications**: Stay updated on document activity
+
+## Workflows
+
+### Creating a New Document
+
+1. Determine target collection
+2. Create document with title and initial content
+3. Set appropriate permissions
+4. Share with relevant team members if needed
+
+### Searching Knowledge Base
+
+1. Formulate search query
+2. Apply relevant filters (collection, date, author)
+3. Review search results
+4. Retrieve full document content when needed
+
+### Organizing Documents
+
+1. Review existing collection structure
+2. Identify appropriate parent collection
+3. Create or update documents in hierarchy
+4. Update collection metadata if needed
+
+### Document Collaboration
+
+1. Add comments for feedback or discussion
+2. Track revision history for changes
+3. Notify stakeholders when needed
+4. Resolve comments when addressed
+
+## Integration Patterns
+
+### Knowledge Capture
+
+When capturing information from conversations or research:
+- Create document in appropriate collection
+- Use clear, descriptive titles
+- Structure content with headers for readability
+- Add tags for discoverability
+
+### Documentation Updates
+
+When updating existing documentation:
+- Retrieve current document revision
+- Make targeted, minimal changes
+- Add comments explaining significant updates
+- Share updates with relevant stakeholders
+
+### Knowledge Retrieval
+
+When searching for information:
+- Start with broad search terms
+- Refine with collection and metadata filters
+- Review multiple relevant documents
+- Cross-reference linked documents for context
+
+## Common Use Cases
+
+| Use Case | Recommended Approach |
+|----------|---------------------|
+| Project documentation | Create collection per project, organize by phase |
+| Team guidelines | Use dedicated collection, group by topic |
+| Meeting notes | Create documents with templates, tag by team |
+| Knowledge capture | Search before creating, link to related docs |
+| Onboarding resources | Create structured collection with step-by-step guides |
+
+## Best Practices
+
+- **Consistent naming**: Use clear, descriptive titles
+- **Logical organization**: Group related documents in collections
+- **Regular maintenance**: Review and update outdated content
+- **Access control**: Set appropriate permissions for sensitive content
+- **Searchability**: Use tags and metadata effectively
+- **Collaboration**: Use comments for discussions, not content changes
+
+## Handoff to Other Skills
+
+| Output | Next Skill | Trigger |
+|--------|------------|---------|
+| Research findings | knowledge-management | "Organize this research in Outline" |
+| Documentation draft | communications | "Share this document via email" |
+| Task from document | task-management | "Create tasks from this outline" |
+| Project plan | plan-writing | "Create project plan in Outline" |
diff --git a/skills/outlook/SKILL.md b/skills/outlook/SKILL.md
new file mode 100644
index 0000000..b381464
--- /dev/null
+++ b/skills/outlook/SKILL.md
@@ -0,0 +1,231 @@
+---
+name: outlook
+description: "Outlook Graph API integration for email, calendar, and contact management. Use when: (1) Reading or sending emails, (2) Managing inbox and folders, (3) Working with calendar events and appointments, (4) Managing contacts, (5) Organizing email messages. Triggers: 'email', 'Outlook', 'inbox', 'calendar', 'contact', 'message', 'folder', 'appointment', 'meeting'."
+compatibility: opencode
+---
+
+# Outlook
+
+Outlook Graph API integration for mail, calendar, and contact management via MCP. Enables comprehensive email workflows, calendar coordination, and contact organization.
+
+## Overview
+
+Outlook is Microsoft 365's messaging and communication hub. This skill provides access to:
+
+- **Mail**: Send, receive, search, organize, and categorize messages
+- **Calendar**: Create and manage events, appointments, and meetings
+- **Contacts**: Manage contact information and relationships
+- **Folders**: Organize messages into custom folder structures
+
+## Core Workflows
+
+### 1. Reading Emails
+
+Retrieve messages from mailbox:
+
+```
+User: "Check my inbox for new messages from John"
+
+AI: Use Outlook MCP to:
+1. List messages in Inbox folder
+2. Filter by sender = "John"
+3. Display summary (subject, date, importance)
+```
+
+**Use search and sort** to efficiently find messages:
+- Filter by folder (Inbox, Sent, Drafts, etc.)
+- Sort by date, importance, or subject
+- Search by sender, subject, or content
+
+### 2. Sending Emails
+
+Compose and send new messages:
+
+```
+User: "Send an email to sarah@company.com about the project update"
+
+AI: Use Outlook MCP to:
+1. Create message draft with recipient and subject
+2. Add body content
+3. Send the message
+```
+
+**Key options**:
+- Add attachments
+- Set importance (low, normal, high)
+- Add recipients (to, cc, bcc)
+- Use categories for organization
+
+### 3. Replying and Forwarding
+
+Respond to existing messages:
+
+```
+User: "Reply to the last email from Mike with thanks"
+
+AI: Use Outlook MCP to:
+1. Retrieve the most recent message from Mike
+2. Create reply with appropriate body
+3. Send the reply
+```
+
+**Supports**:
+- Reply (to sender)
+- Reply All (to all recipients)
+- Forward (to new recipients)
+
+### 4. Managing Folders
+
+Organize messages into folder structure:
+
+```
+User: "Move all emails from vendor@supplier.com to Vendors folder"
+
+AI: Use Outlook MCP to:
+1. Search for messages from vendor@supplier.com
+2. Move matching messages to Vendors folder
+3. Confirm move operation
+```
+
+**Folder operations**:
+- List folders
+- Create new folders
+- Move messages between folders
+- Delete folders (careful!)
+
+### 5. Calendar Events
+
+Manage calendar and schedule meetings:
+
+```
+User: "Schedule a team meeting for Friday at 2pm"
+
+AI: Use Outlook MCP to:
+1. Create calendar event
+2. Set date/time (Friday 2:00 PM)
+3. Add attendees
+4. Send meeting invitation
+```
+
+**Event details**:
+- Subject and location
+- Start/end times
+- Attendees and required/optional status
+- Meeting body/agenda
+- Recurrence (for recurring meetings)
+
+### 6. Managing Contacts
+
+Create and maintain contact information:
+
+```
+User: "Add Jane Smith to contacts: jane@company.com, 555-1234"
+
+AI: Use Outlook MCP to:
+1. Create contact object
+2. Add email address and phone number
+3. Save to contacts
+```
+
+**Contact fields**:
+- Name (first, last, display name)
+- Email addresses (multiple)
+- Phone numbers (multiple types)
+- Company, job title
+- Notes
+
+## Advanced Features
+
+### Message Organization
+
+**Categories**: Tag messages with color-coded categories for enhanced organization
+```
+User: "Tag these project emails as 'Urgent' category"
+
+AI: Use Outlook MCP to:
+1. Retrieve specified messages
+2. Assign category (e.g., "Urgent")
+3. Confirm categorization
+```
+
+**Importance**: Mark messages as high, normal, or low importance
+```
+User: "Mark this message as high priority"
+
+AI: Use Outlook MCP to update message importance flag
+```
+
+**Search**: Find messages by sender, subject, content, or date range
+```
+User: "Find all emails about Q4 budget from October"
+
+AI: Use Outlook MCP to search with filters:
+- Subject contains "budget"
+- Date range: October
+- Optionally filter by sender
+```
+
+### Email Intelligence
+
+**Focused Inbox**: Access messages categorized as focused vs other
+**Mail Tips**: Check recipient status before sending (auto-reply, full mailbox)
+**MIME Support**: Handle email in MIME format for interoperability
+
+## Integration with Other Skills
+
+This skill focuses on Outlook-specific operations. For related functionality:
+
+| Need | Skill | When to Use |
+|------|-------|-------------|
+| **Team project updates** | basecamp | "Update the Basecamp todo" |
+| **Team channel messages** | msteams | "Post this in the Teams channel" |
+| **Private notes about emails** | obsidian | "Save this to Obsidian" |
+| **Drafting long-form emails** | calliope | "Help me write a professional email" |
+| **Short quick messages** | hermes (this skill) | "Send a quick update" |
+
+## Common Patterns
+
+### Email Triage Workflow
+
+1. **Scan inbox**: List messages sorted by date
+2. **Categorize**: Assign categories based on content/urgency
+3. **Action**: Reply, forward, or move to appropriate folder
+4. **Track**: Flag for follow-up if needed
+
+### Meeting Coordination
+
+1. **Check availability**: Query calendar for conflicts
+2. **Propose time**: Suggest multiple time options
+3. **Create event**: Set up meeting with attendees
+4. **Follow up**: Send reminder or agenda
+
+### Project Communication
+
+1. **Search thread**: Find all messages related to project
+2. **Organize**: Move to project folder
+3. **Categorize**: Tag with project category
+4. **Summarize**: Extract key points if needed
+
+## Quality Standards
+
+- **Accurate recipient addressing**: Verify email addresses before sending
+- **Clear subject lines**: Ensure subjects accurately reflect content
+- **Appropriate categorization**: Use categories consistently
+- **Folder hygiene**: Maintain organized folder structure
+- **Respect privacy**: Do not share sensitive content indiscriminately
+
+## Edge Cases
+
+**Multiple mailboxes**: This skill supports primary and shared mailboxes, not archive mailboxes
+**Large attachments**: Use appropriate attachment handling for large files
+**Meeting conflicts**: Check calendar availability before scheduling
+**Email limits**: Respect rate limits and sending quotas
+**Deleted items**: Use caution with delete operations (consider archiving instead)
+
+## Boundaries
+
+- **Do NOT handle Teams-specific messaging** (Teams's domain)
+- **Do NOT handle Basecamp communication** (basecamp's domain)
+- **Do NOT manage wiki documentation** (Athena's domain)
+- **Do NOT access private Obsidian vaults** (Apollo's domain)
+- **Do NOT write creative email content** (delegate to calliope for drafts)