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>
37 KiB
Learnings - Chiron Agent Framework
Wave 1, Task 1: Create agents.json with 6 agent definitions
Agent Structure Pattern
Required fields per agent:
description: Clear purpose statementmode: "primary" for orchestrators, "subagent" for specialistsmodel: "zai-coding-plan/glm-4.7" (consistent across all agents)prompt: File reference pattern{file:./prompts/<name>.txt}permission: Either explicit permissions or simple "question": "allow"
Primary vs Subagent Modes
Primary agents (2): chiron, chiron-forge
- Can be invoked directly by user
- Orchestrate and delegate work
- Higher permission levels (external_directory rules)
Subagents (4): hermes, athena, apollo, calliope
- Invoked by primary agents via Task tool
- Specialized single-purpose workflows
- Simpler permission structure (question: "allow")
Permission Patterns
Primary agents: Complex permission structure
"permission": {
"external_directory": {
"~/p/**": "allow",
"*": "ask"
}
}
Subagents: Simple permission structure
"permission": {
"question": "allow"
}
Agent Domains
- chiron: Plan Mode - Read-only analysis and planning
- chiron-forge: Build Mode - Full execution with safety prompts
- hermes: Work communication (Basecamp, Outlook, Teams)
- athena: Work knowledge (Outline wiki, documentation)
- apollo: Private knowledge (Obsidian vault, personal notes)
- calliope: Writing (documentation, reports, prose)
Verification Commands
Agent count:
python3 -c "import json; data = json.load(open('agents/agents.json')); print(len(data))"
# Expected output: 6
Agent names:
python3 -c "import json; data = json.load(open('agents/agents.json')); print(sorted(data.keys()))"
# Expected output: ['apollo', 'athena', 'calliope', 'chiron', 'chiron-forge', 'hermes']
Key Takeaways
- Prompt files use file references, not inline content (Wave 2 will create these)
- Model is consistent across all agents for predictable behavior
- Permission structure matches agent capability level (more complex for primaries)
- Mode determines how agent can be invoked (direct vs delegated)
Wave 2, Task 6: Create Athena (Work Knowledge) system prompt
Prompt Structure Pattern Consistency
All subagent prompts follow identical structure from skill-creator guidance:
- Role definition: "You are [name], the Greek [role], specializing in [domain]"
- Your Core Responsibilities: Numbered list of primary duties
- Process: Numbered steps for workflow execution
- Quality Standards: Bulleted list of requirements
- Output Format: Structure specification
- Edge Cases: Bulleted list of exception handling
- Tool Usage: Instructions for tool interaction (especially Question tool)
- Boundaries: Explicit DO NOT statements with domain attribution
Athena's Domain Specialization
Role: Work knowledge specialist for Outline wiki
- Primary tool: Outline wiki integration (document CRUD, search, collections, sharing)
- Core activities: wiki search, knowledge retrieval, documentation updates, knowledge organization
- Question tool usage: Document selection, search scope clarification, collection specification
Differentiation from other agents:
- Hermes (communication): Short messages, team communication tools (Basecamp, Teams, Outlook)
- Apollo (private knowledge): Obsidian vaults, personal notes, private data
- Calliope (writing): Documentation drafting, creative prose, reports
- Athena (work knowledge): Team wiki, Outline, shared documentation repositories
Quality Focus for Knowledge Work
Key quality standards unique to Athena:
- Outline-specific understanding: collections, documents, sharing permissions, revision history
- Knowledge structure preservation: hierarchy, relationships, cross-references
- Identification of outdated information for updates
- Consistency in terminology across documentation
- Pattern recognition for organization improvements
Boundary Clarity
Boundaries section explicitly references other agents' domains:
- "Do NOT handle short communication (Hermes's domain)"
- "Do NOT access private knowledge (Apollo's domain)"
- "Do NOT write creative content (Calliope's domain)"
- Collaboration section acknowledges cross-agent workflows
Verification Approach
Used grep commands to verify domain presence:
grep -qi "outline"→ Confirms Outline tool specializationgrep -qi "wiki\|knowledge"→ Confirms knowledge base focusgrep -qi "document"→ Confirms document management capabilities
All verification checks passed successfully.
Wave 2, Task 5: Create Hermes system prompt
Prompt Structure Pattern
Consistent sections across all subagent prompts:
- Role definition (You are [role] specializing in [domain])
- Core Responsibilities (5-7 bullet points of primary duties)
- Process (5-6 numbered steps for workflow)
- Quality Standards (4-5 bullet points of output criteria)
- Output Format (3-5 lines describing structure)
- Edge Cases (5-6 bullet points of exceptional scenarios)
- Tool Usage (Question tool + domain-specific MCP tools)
- Boundaries (5-6 bullet points of what NOT to do)
Hermes-Specific Domain Elements
Greek mythology framing: Hermes - god of communication, messengers, swift transactions
Platform coverage:
- Basecamp: tasks, projects, todos, message boards, campfire
- Outlook: email drafting, sending, inbox management
- Teams: meeting scheduling, channel messages, chat conversations
Focus areas: Task updates, email drafting, meeting scheduling, quick communication
Question tool triggers:
- Platform choice ambiguous
- Recipients unclear
- Project context missing
Cross-Agent Boundaries
Hermes does NOT handle:
- Documentation repositories/wiki (Athena's domain)
- Personal tools/private knowledge (Apollo's domain)
- Long-form writing/reports (Calliope's domain)
Verification Pattern
# Required content checks
grep -qi "basecamp" prompts/hermes.txt
grep -qiE "outlook|email" prompts/hermes.txt
grep -qiE "teams|meeting" prompts/hermes.txt
Key Takeaways
- Use exact headers from SKILL.md template (line 358: "Your Core Responsibilities:")
- Second-person voice addressing agent directly
- 5-6 sections following consistent pattern
- Boundaries section explicitly references other agents' domains
- 45-50 lines is appropriate length for subagent prompts
- Include MCP tool references in Tool Usage section
Wave 2, Task 3: Create Chiron (Plan Mode) system prompt
Prompt Structure Pattern
Standard sections (from agent-development/SKILL.md):
- "You are [role]..." - Direct second-person address
- "Your Core Responsibilities:" - Numbered list (1, 2, 3), not bullet points
- "Process:" - Step-by-step workflow
- "Quality Standards:" - Evaluation criteria
- "Output Format:" - Response structure
- "Edge Cases:" - Exception handling
- "Tool Usage:" - Tool-specific guidance
- "Boundaries:" - Must NOT Do section
Chiron-Specific Design
Key role definition:
- Main orchestrator in plan/analysis mode
- Read-only permissions, delegates execution to Chiron-Forge
- Coordinates 4 subagents via Task tool delegation
Delegation logic:
- Hermes: Work communication (email, messages, meetings)
- Athena: Work knowledge (wiki, documentation, project info)
- Apollo: Private knowledge (Obsidian vault, personal notes)
- Calliope: Writing (documentation, reports, prose)
- Chiron-Forge: Execution (file modifications, commands, builds)
Question tool usage:
- REQUIRED when requests are ambiguous
- Required for unclear intent or scope
- Required before delegation or analysis
Boundaries:
- Do NOT modify files directly (read-only)
- Do NOT execute commands (delegate to Chiron-Forge)
- Do NOT access subagent domains directly (Hermes, Athena, Apollo, Calliope)
Style Reference
Used apollo.txt and calliope.txt as style guides:
- Consistent section headers with exact wording
- Second-person address throughout
- Numbered responsibilities list
- Clear separation between sections
- Specific tool usage instructions
Verification Commands
File size:
wc -c prompts/chiron.txt # Expected: > 500
Keyword validation:
grep -qi "orchestrat" prompts/chiron.txt # Should find match
grep -qi "delegat" prompts/chiron.txt # Should find match
grep -qi "hermes\|athena\|apollo\|calliope" prompts/chiron.txt # Should find all 4
Key Takeaways
- Standardized section headers critical for consistency across prompts
- Numbered lists for responsibilities (not bullet points) matches best practices
- Clear delegation routing prevents overlap between agent domains
- Question tool requirement prevents action on ambiguous requests
- Read-only orchestrator mode cleanly separates planning from execution
- All 4 subagents must be explicitly mentioned for routing clarity
Wave 2, Task 4: Create Chiron-Forge (Build Mode) system prompt
Primary Agent Prompt Structure
Primary agent prompts follow similar structure to subagents but with expanded scope:
- Role definition: "You are Chiron-Forge, the Greek centaur smith, specializing in [domain]"
- Your Core Responsibilities: Numbered list emphasizing execution over planning
- Process: 7-step workflow including delegation pattern
- Quality Standards: Focus on execution accuracy and safety
- Output Format: Execution summary structure
- Edge Cases: Handling of destructive operations and failures
- Tool Usage: Explicit permission boundaries and safety protocols
- Boundaries: Clear separation from Chiron's planning role
Chiron-Forge vs Chiron Separation
Chiron-Forge (Build Mode):
- Purpose: Execution and task completion
- Focus: Modifying files, running commands, building artifacts
- Permissions: Full write access with safety constraints
- Delegation: Routes specialized work to subagents
- Safety: Uses Question tool for destructive operations
Chiron (Plan Mode - Wave 2, Task 3):
- Purpose: Read-only analysis and planning
- Focus: Analysis, planning, coordination
- Permissions: Read-only access
- Role: Orchestrator without direct execution
Permission Structure Mapping to Prompt
From agents.json chiron-forge permissions:
"permission": {
"read": { "*": "allow", "*.env": "deny" },
"edit": "allow",
"bash": { "*": "allow", "rm *": "ask", "git push *": "ask", "sudo *": "deny" }
}
Mapped to prompt instructions:
- "Execute commands, but use Question for rm, git push"
- "Use Question tool for destructive operations"
- "DO NOT execute destructive operations without confirmation"
Delegation Pattern for Primary Agents
Primary agents have unique delegation responsibilities:
- Chiron-Forge: Delegates based on domain expertise (Hermes for communications, Athena for knowledge, etc.)
- Chiron: Delegates based on planning and coordination needs
Process includes delegation as step 5:
- Understand the Task
- Clarify Scope
- Identify Dependencies
- Execute Work
- Delegate to Subagents: Use Task tool for specialized domains
- Verify Results
- Report Completion
Verification Commands
Successful verification of prompt requirements:
# File character count > 500
wc -c prompts/chiron-forge.txt
# Output: 2598 (✓)
# Domain keyword verification
grep -qi "execut" prompts/chiron-forge.txt
# Output: Found 'execut' (✓)
grep -qi "build" prompts/chiron-forge.txt
# Output: Found 'build' (✓)
All verification checks passed successfully.
Key Takeaways
- Primary agent prompts require clear separation from each other (Chiron plans, Chiron-Forge executes)
- Permission structure in agents.json must be reflected in prompt instructions
- Safety protocols for destructive operations are critical for write-access agents
- Delegation is a core responsibility for both primary agents, but with different criteria
- Role naming consistency reinforces domain separation (centaur smith vs wise centaur)
Wave 3, Task 9: Create Basecamp Integration Skill
Skill Structure Pattern for MCP Integrations
The Basecamp skill follows the standard pattern from skill-creator with MCP-specific adaptations:
-
YAML frontmatter with comprehensive trigger list
- name:
basecamp - description: Includes all use cases and trigger keywords
- compatibility:
opencode
- name:
-
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
-
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:
-
Projects & Lists (5 tools):
get_projects,get_project,get_todolists,get_todos,search_basecamp
-
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
- Column management:
-
Messages & Communication (5 tools):
get_message_board,get_messages,get_message,get_campfire_lines,get_comments,create_comment
-
Inbox/Email Forwards (6 tools):
get_inbox,get_forwards,get_forward,get_inbox_replies,get_inbox_reply,trash_forward
-
Documents (5 tools):
get_documents,get_document,create_document,update_document,trash_document
-
Webhooks (3 tools):
get_webhooks,create_webhook,delete_webhook
-
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:
test -d skills/basecamp && test -f skills/basecamp/SKILL.md
# Expected output: ✅ File structure valid
YAML frontmatter validation:
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:
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:
- YAML frontmatter: name, description (with triggers), compatibility: opencode
- Overview: High-level description of domain and capabilities
- Core Workflows: Numbered step-by-step processes for common operations
- Advanced Features: Optional capabilities that enhance basic workflows
- Integration with Other Skills: Table showing domain boundaries and handoffs
- Common Patterns: Reusable workflow patterns
- Quality Standards: Output criteria and best practices
- Edge Cases: Exception handling
- 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:
test -d skills/outlook && test -f skills/outlook/SKILL.md
# Expected output: ✅ File structure valid
YAML frontmatter validation:
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:
-
YAML frontmatter with comprehensive triggers
- name:
obsidian - description: Covers all use cases (vault operations, note CRUD, search, daily notes)
- compatibility:
opencode
- name:
-
Prerequisites section - Critical for API integrations
- Plugin installation requirements
- API server setup (default port 27124)
- Authentication configuration
-
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
-
Note Structure Patterns - Obsidian-specific conventions
- Frontmatter patterns (date, created, type, tags, status)
- WikiLink syntax (Note Title, Note Title, Note Title#Heading)
- Tagging conventions (#tag, #nested/tag)
-
Workflow Examples - Realistic usage patterns
- Create brainstorm note with frontmatter
- Append to daily journal
- Search and link notes
- Show curl commands with JSON payloads
-
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):
-
Vault operations (3 endpoints):
GET /list- List all files in vaultGET /get-file-info- Get file metadataGET /vault-info- Get vault metadata
-
Note CRUD (5 endpoints):
POST /create-note- Create new note (content, optional path)GET /read-note- Read note by pathPUT /update-note- Update existing note (path, content)DELETE /delete-note- Delete note by path
-
Search (1 endpoint):
GET /search- Search notes (q, optional path, context-length)
-
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:
test -d skills/obsidian && test -f skills/obsidian/SKILL.md
# Expected output: ✅ Directory and file structure correct
YAML frontmatter validation:
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:
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
- Authentication: MCP server handles Graph API authentication, skill should NOT include auth flows
- Polling limits: Message retrieval requires date range specification (Microsoft APIs Terms of Use)
- Email separation: Explicitly prevents overlap with Outlook email functionality
- File storage: Channel files stored in SharePoint, requires SharePoint-specific operations
YAML Frontmatter Validation
Validated fields:
name: msteamsdescription: Includes triggers - 'Teams', 'meeting', 'channel', 'team message', 'chat', 'Teams message'compatibility: opencode
Verification command:
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
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 isskills/(plural) - Workaround: Run quick_validate.py directly with correct path
python3 skills/skill-creator/scripts/quick_validate.py skills/msteams
# Result: "Skill is valid!"
Key Takeaways
- Conciseness matters: Skill focused on essential workflows and capabilities without excessive detail
- Clear boundaries: Explicitly stated what NOT to do (authentication, email overlap, file storage)
- Workflow examples: Provide concrete, actionable examples for each common operation
- Domain integration: Clearly stated how skill integrates with Hermes agent for routing
- 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:
---
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:
test -d skills/outline && test -f skills/outline/SKILL.md
# Expected output: ✅ Directory and file structure correct
YAML frontmatter validation:
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:
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 usesskills/(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:
- File existence: Check agents.json exists
- JSON syntax validation: Use python3 json.load() for parsing
- Agent count validation: Verify exactly 6 agents present
- Agent name validation: Check all expected agents found
- Field validation: Verify required fields exist for each agent
- Mode validation: Ensure primary/subagent modes correct
- Prompt file validation: Extract file references and verify existence
- 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:
# 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:
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:
./scripts/validate-agents.sh
# Output: All validations passed!
# Exit code: 0
Missing prompt file detection:
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:
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:
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:
test -x scripts/validate-agents.sh
# Expected: Exit 0 (executable)
Successful validation:
./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 pipefailis 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