feat: add Chiron agent framework with 6 agents and 5 integration skills
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 <atlas@opencode.dev>
This commit is contained in:
9
.sisyphus/boulder.json
Normal file
9
.sisyphus/boulder.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
@@ -336,3 +336,707 @@ All verification checks passed successfully.
|
|||||||
- Delegation is a core responsibility for both primary agents, but with different criteria
|
- Delegation is a core responsibility for both primary agents, but with different criteria
|
||||||
- Role naming consistency reinforces domain separation (centaur smith vs wise centaur)
|
- 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 <path>` 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/<name>.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/<name>.txt}` requires regex extraction for validation
|
||||||
|
|||||||
973
.sisyphus/plans/chiron-agent-framework.md
Normal file
973
.sisyphus/plans/chiron-agent-framework.md
Normal file
@@ -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)
|
||||||
50
prompts/chiron-forge.txt
Normal file
50
prompts/chiron-forge.txt
Normal file
@@ -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
|
||||||
59
prompts/chiron.txt
Normal file
59
prompts/chiron.txt
Normal file
@@ -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)
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#
|
#
|
||||||
# Validate agents.json structure and prompt files
|
# Validate agents.json structure and referenced prompt files
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# ./scripts/validate-agents.sh # Validate agents.json
|
# ./scripts/validate-agents.sh
|
||||||
# ./scripts/validate-agents.sh --help # Show help
|
|
||||||
#
|
#
|
||||||
# Checks:
|
# This script validates the agent configuration by:
|
||||||
# - agents.json is valid JSON
|
# - Parsing agents.json as valid JSON
|
||||||
# - Each agent has required fields (description, mode, model, prompt, permission)
|
# - Checking all 6 required agents are present
|
||||||
# - All referenced prompt files exist
|
# - Verifying each agent has required fields
|
||||||
# - All prompt files are non-empty
|
# - Validating agent modes (primary vs subagent)
|
||||||
|
# - Verifying all referenced prompt files exist and are non-empty
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
@@ -22,146 +22,161 @@ GREEN='\033[0;32m'
|
|||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
usage() {
|
AGENTS_FILE="$REPO_ROOT/agents/agents.json"
|
||||||
echo "Usage: $0 [OPTIONS]"
|
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 ""
|
echo ""
|
||||||
echo "Validate agents.json structure and prompt files."
|
|
||||||
echo ""
|
# Track errors
|
||||||
echo "Options:"
|
error_count=0
|
||||||
echo " --help Show this help message"
|
warning_count=0
|
||||||
echo ""
|
|
||||||
echo "Validates:"
|
# Function to print error
|
||||||
echo " - agents.json is valid JSON"
|
error() {
|
||||||
echo " - Each agent has required fields"
|
echo -e "${RED}❌ $1${NC}" >&2
|
||||||
echo " - All referenced prompt files exist"
|
((error_count++)) || true
|
||||||
echo " - All prompt files are non-empty"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
check_json_valid() {
|
# Function to print warning
|
||||||
local agents_file="$1"
|
warning() {
|
||||||
|
echo -e "${YELLOW}⚠️ $1${NC}"
|
||||||
|
((warning_count++)) || true
|
||||||
|
}
|
||||||
|
|
||||||
if ! python3 -m json.tool "$agents_file" > /dev/null 2>&1; then
|
# Function to print success
|
||||||
echo -e "${RED}❌ agents.json is not valid JSON${NC}"
|
success() {
|
||||||
return 1
|
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
|
fi
|
||||||
|
|
||||||
echo -e "${GREEN}✅ agents.json is valid JSON${NC}"
|
# Validate JSON syntax
|
||||||
return 0
|
if ! python3 -c "import json; json.load(open('$AGENTS_FILE'))" 2>/dev/null; then
|
||||||
}
|
error "agents.json is not valid JSON"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
check_required_fields() {
|
success "agents.json is valid JSON"
|
||||||
local agents_file="$1"
|
echo ""
|
||||||
local agent_name="$2"
|
|
||||||
local agent_data="$3"
|
|
||||||
|
|
||||||
local required_fields=("description" "mode" "model" "prompt" "permission")
|
# Parse agents.json
|
||||||
local missing_fields=()
|
AGENT_COUNT=$(python3 -c "import json; print(len(json.load(open('$AGENTS_FILE'))))")
|
||||||
|
success "Found $AGENT_COUNT agents in agents.json"
|
||||||
|
|
||||||
for field in "${required_fields[@]}"; do
|
# Check agent count
|
||||||
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
|
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
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Checking agent fields and modes..."
|
||||||
|
|
||||||
|
# Validate each agent
|
||||||
|
for agent_name in "${EXPECTED_AGENTS[@]}"; do
|
||||||
|
echo -n " $agent_name: "
|
||||||
|
|
||||||
|
# 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")
|
missing_fields+=("$field")
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ ${#missing_fields[@]} -gt 0 ]]; then
|
if [[ ${#missing_fields[@]} -gt 0 ]]; then
|
||||||
echo -e " ${RED}❌ Missing required fields for '$agent_name': ${missing_fields[*]}${NC}"
|
error "Missing required fields: ${missing_fields[*]}"
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e " ${GREEN}✅ '$agent_name' has all required fields${NC}"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local prompt_ref
|
# Get mode value
|
||||||
prompt_ref=$(python3 -c "import json, sys; data = json.load(open('$agents_file')); print(data['$agent_name'].get('prompt', ''))")
|
mode=$(python3 -c "import json; print(json.load(open('$AGENTS_FILE'))['$agent_name']['mode'])")
|
||||||
|
|
||||||
if ! check_prompt_file "$agent_name" "$prompt_ref"; then
|
# Validate mode
|
||||||
((failed++)) || true
|
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
|
fi
|
||||||
|
elif [[ " ${SUBAGENTS[@]} " =~ " ${agent_name} " ]]; then
|
||||||
done <<< "$agent_names"
|
if [[ "$mode" == "subagent" ]]; then
|
||||||
|
success "Mode: $mode (valid)"
|
||||||
|
else
|
||||||
|
error "Expected mode 'subagent' for agent '$agent_name', found '$mode'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
|
echo "Checking prompt files..."
|
||||||
|
|
||||||
if [[ $failed -eq 0 ]]; then
|
# Validate prompt file references
|
||||||
echo -e "${GREEN}✅ All agents validated successfully!${NC}"
|
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'])")
|
||||||
|
|
||||||
|
# Parse prompt reference: {file:./prompts/<name>.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
|
||||||
|
error "Invalid prompt reference format for agent '$agent_name': $prompt_ref"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
if [[ $error_count -eq 0 ]]; then
|
||||||
|
echo -e "${GREEN}All validations passed!${NC}"
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
echo -e "${RED}❌ $failed agent(s) failed validation${NC}"
|
echo -e "${RED}$error_count validation error(s) found${NC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
|
||||||
|
|
||||||
# Main
|
|
||||||
case "${1:-}" in
|
|
||||||
--help|-h)
|
|
||||||
usage
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
"")
|
|
||||||
validate_agents
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo -e "${RED}Unknown option: $1${NC}"
|
|
||||||
echo ""
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|||||||
315
skills/basecamp/SKILL.md
Normal file
315
skills/basecamp/SKILL.md
Normal file
@@ -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 <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Explore todos:**
|
||||||
|
```bash
|
||||||
|
# Get all todo lists in a project
|
||||||
|
get_todolists --project_id <id>
|
||||||
|
|
||||||
|
# Get all todos from a specific todo list (handles pagination automatically)
|
||||||
|
get_todos --recording_id <todo_list_id>
|
||||||
|
|
||||||
|
# Search across projects for todos/messages containing keywords
|
||||||
|
search_basecamp --query <search_term>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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 <id>
|
||||||
|
|
||||||
|
# Get all columns in a card table
|
||||||
|
get_columns --card_table_id <id>
|
||||||
|
|
||||||
|
# Get all cards in a specific column
|
||||||
|
get_cards --column_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Manage columns:**
|
||||||
|
```bash
|
||||||
|
# Create new column (e.g., "In Progress", "Done")
|
||||||
|
create_column --card_table_id <id> --title "Column Name"
|
||||||
|
|
||||||
|
# Update column title
|
||||||
|
update_column --column_id <id> --title "New Title"
|
||||||
|
|
||||||
|
# Move column to different position
|
||||||
|
move_column --column_id <id> --position 3
|
||||||
|
|
||||||
|
# Update column color
|
||||||
|
update_column_color --column_id <id> --color "red"
|
||||||
|
|
||||||
|
# Put column on hold (freeze work)
|
||||||
|
put_column_on_hold --column_id <id>
|
||||||
|
|
||||||
|
# Remove hold from column (unfreeze work)
|
||||||
|
remove_column_hold --column_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Manage cards:**
|
||||||
|
```bash
|
||||||
|
# Create new card in a column
|
||||||
|
create_card --column_id <id> --title "Task Name" --content "Description"
|
||||||
|
|
||||||
|
# Update card details
|
||||||
|
update_card --card_id <id> --title "Updated Title" --content "New content"
|
||||||
|
|
||||||
|
# Move card to different column
|
||||||
|
move_card --card_id <id> --to_column_id <new_column_id>
|
||||||
|
|
||||||
|
# Mark card as complete
|
||||||
|
complete_card --card_id <id>
|
||||||
|
|
||||||
|
# Mark card as incomplete
|
||||||
|
uncomplete_card --card_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Manage card steps (sub-tasks):**
|
||||||
|
```bash
|
||||||
|
# Get all steps for a card
|
||||||
|
get_card_steps --card_id <id>
|
||||||
|
|
||||||
|
# Create new step
|
||||||
|
create_card_step --card_id <id> --content "Sub-task description"
|
||||||
|
|
||||||
|
# Update step
|
||||||
|
update_card_step --step_id <id> --content "Updated description"
|
||||||
|
|
||||||
|
# Delete step
|
||||||
|
delete_card_step --step_id <id>
|
||||||
|
|
||||||
|
# Mark step as complete
|
||||||
|
complete_card_step --step_id <id>
|
||||||
|
|
||||||
|
# Mark step as incomplete
|
||||||
|
uncomplete_card_step --step_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Working with Messages and Campfire
|
||||||
|
|
||||||
|
**Message board:**
|
||||||
|
```bash
|
||||||
|
# Get message board for a project
|
||||||
|
get_message_board --project_id <id>
|
||||||
|
|
||||||
|
# Get all messages from a project
|
||||||
|
get_messages --project_id <id>
|
||||||
|
|
||||||
|
# Get specific message
|
||||||
|
get_message --message_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Campfire (team chat):**
|
||||||
|
```bash
|
||||||
|
# Get recent campfire lines (messages)
|
||||||
|
get_campfire_lines --campfire_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Comments:**
|
||||||
|
```bash
|
||||||
|
# Get comments for any Basecamp item (message, todo, card, etc.)
|
||||||
|
get_comments --recording_id <id>
|
||||||
|
|
||||||
|
# Create a comment
|
||||||
|
create_comment --recording_id <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 <id>
|
||||||
|
|
||||||
|
# Get all forwarded emails from a project's inbox
|
||||||
|
get_forwards --project_id <id>
|
||||||
|
|
||||||
|
# Get specific forwarded email
|
||||||
|
get_forward --forward_id <id>
|
||||||
|
|
||||||
|
# Get all replies to a forwarded email
|
||||||
|
get_inbox_replies --forward_id <id>
|
||||||
|
|
||||||
|
# Get specific reply
|
||||||
|
get_inbox_reply --reply_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Manage forwards:**
|
||||||
|
```bash
|
||||||
|
# Move forwarded email to trash
|
||||||
|
trash_forward --forward_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Documents
|
||||||
|
|
||||||
|
**Manage documents:**
|
||||||
|
```bash
|
||||||
|
# List documents in a vault
|
||||||
|
get_documents --vault_id <id>
|
||||||
|
|
||||||
|
# Get specific document
|
||||||
|
get_document --document_id <id>
|
||||||
|
|
||||||
|
# Create new document
|
||||||
|
create_document --vault_id <id> --title "Document Title" --content "Document content"
|
||||||
|
|
||||||
|
# Update document
|
||||||
|
update_document --document_id <id> --title "Updated Title" --content "New content"
|
||||||
|
|
||||||
|
# Move document to trash
|
||||||
|
trash_document --document_id <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 <id>
|
||||||
|
|
||||||
|
# Create webhook
|
||||||
|
create_webhook --project_id <id> --callback_url "https://your-service.com/webhook" --types "TodoCreated,TodoCompleted"
|
||||||
|
|
||||||
|
# Delete webhook
|
||||||
|
delete_webhook --webhook_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Daily Check-ins
|
||||||
|
|
||||||
|
**Project check-ins:**
|
||||||
|
```bash
|
||||||
|
# Get daily check-in questions for a project
|
||||||
|
get_daily_check_ins --project_id <id>
|
||||||
|
|
||||||
|
# Get answers to daily check-in questions
|
||||||
|
get_question_answers --question_id <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Attachments and Events
|
||||||
|
|
||||||
|
**Upload and track:**
|
||||||
|
```bash
|
||||||
|
# Upload file as attachment
|
||||||
|
create_attachment --recording_id <id> --file_path "/path/to/file"
|
||||||
|
|
||||||
|
# Get events for a recording
|
||||||
|
get_events --recording_id <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 <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Understanding project structure:**
|
||||||
|
```bash
|
||||||
|
# Check which tools are available in a project
|
||||||
|
get_project --project_id <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 <todo_list_id>
|
||||||
|
# Returns all pages of results
|
||||||
|
|
||||||
|
# Get all cards across all columns
|
||||||
|
get_columns --card_table_id <id>
|
||||||
|
get_cards --column_id <id> # Repeat for each column
|
||||||
|
```
|
||||||
108
skills/msteams/SKILL.md
Normal file
108
skills/msteams/SKILL.md
Normal file
@@ -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.
|
||||||
240
skills/obsidian/SKILL.md
Normal file
240
skills/obsidian/SKILL.md
Normal file
@@ -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.
|
||||||
126
skills/outline/SKILL.md
Normal file
126
skills/outline/SKILL.md
Normal file
@@ -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" |
|
||||||
231
skills/outlook/SKILL.md
Normal file
231
skills/outlook/SKILL.md
Normal file
@@ -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)
|
||||||
Reference in New Issue
Block a user