UNPKG

claude-flow-novice

Version:

Claude Flow Novice - Advanced orchestration platform for multi-agent AI workflows with CFN Loop architecture Includes CodeSearch (hybrid SQLite + pgvector), mem0/memgraph specialists, and all CFN skills.

736 lines (586 loc) 16.3 kB
# Skill Output Format Specification **Task 5.4: Eliminate Bash Output Parsing** This document specifies the structured JSON output format for all CFN Loop skills, replacing fragile bash output parsing with reliable JSON parsing. ## Overview ### Problem Statement Legacy skills used unstructured text output: ```bash echo "SUCCESS" echo "Confidence: 0.92" echo "Created: src/file.ts" ``` This approach was fragile and error-prone: - ❌ Brittle regex parsing - ❌ Inconsistent formats across skills - ❌ No schema validation - ❌ Difficult to extend ### Solution All skills now output structured JSON: ```json { "success": true, "confidence": 0.92, "deliverables": ["src/file.ts"], "metrics": { "execution_time_ms": 1234 }, "errors": [] } ``` This approach provides: - ✅ Reliable parsing with validation - ✅ Consistent format across all skills - ✅ Strong typing and schema validation - ✅ Easy to extend with custom metrics ## JSON Schema ### Complete Schema ```json { "success": true, "confidence": 0.92, "deliverables": ["src/file.ts", "tests/file.test.ts"], "metrics": { "execution_time_ms": 1234, "files_modified": 2, "custom_metric": 42 }, "errors": [ { "code": "VALIDATION_FAILED", "message": "Schema validation failed", "context": { "field": "confidence" } } ] } ``` ### Required Fields #### `success` (boolean) Whether skill execution succeeded. **Examples:** ```json { "success": true } // Skill completed successfully { "success": false } // Skill failed ``` **Validation:** - Must be boolean type - Required in all outputs #### `confidence` (number) Confidence score indicating execution quality (0.0-1.0). **Examples:** ```json { "confidence": 0.95 } // Very confident { "confidence": 0.85 } // Moderately confident { "confidence": 0.60 } // Low confidence ``` **Validation:** - Must be number type - Must be >= 0.0 and <= 1.0 - Required in all outputs **Guidelines:** - `0.90-1.00`: Excellent - All checks passed, high quality - `0.75-0.89`: Good - Minor issues, acceptable quality - `0.60-0.74`: Fair - Some concerns, may need review - `0.00-0.59`: Poor - Significant issues, needs attention #### `deliverables` (array) Files created or modified during execution. **Examples:** ```json { "deliverables": [ "src/auth.ts", "tests/auth.test.ts", "docs/API.md" ] } ``` **Validation:** - Must be array type - Each element must be string (file path) - Can be empty array `[]` - Paths can be absolute or relative **Guidelines:** - Use relative paths from project root when possible - Include all files created or modified - Order doesn't matter #### `metrics` (object) Execution metrics (extensible). **Standard Metrics:** ```json { "metrics": { "execution_time_ms": 1234, "files_modified": 2 } } ``` **Custom Metrics:** ```json { "metrics": { "execution_time_ms": 1234, "files_modified": 2, "lines_of_code": 450, "test_coverage": 0.92, "validation_score": 0.88 } } ``` **Validation:** - Must be object type - Can be empty object `{}` - All values must be numeric (integer or float) - Custom metrics are allowed **Standard Metric Names:** - `execution_time_ms` - Execution time in milliseconds - `files_modified` - Number of files modified - `files_created` - Number of files created - `files_deleted` - Number of files deleted #### `errors` (array) Errors encountered during execution. **Examples:** ```json { "errors": [ { "code": "VALIDATION_FAILED", "message": "Schema validation failed", "context": { "field": "confidence", "expected": "number", "received": "string" } }, { "code": "FILE_NOT_FOUND", "message": "Configuration file not found", "context": { "path": "./config.json" } } ] } ``` **Validation:** - Must be array type - Can be empty array `[]` - Each error must have `code` and `message` (strings) - Optional fields: `stack`, `context` **Error Codes:** - Use UPPER_SNAKE_CASE - Be specific and descriptive - Examples: `VALIDATION_FAILED`, `FILE_NOT_FOUND`, `TIMEOUT`, `PARSE_ERROR` ## Implementation Guide ### Basic Implementation ```bash #!/bin/bash set -euo pipefail # Skill logic here echo "Executing skill..." >&2 # Log to stderr # Output JSON to stdout cat << 'EOF_JSON' { "success": true, "confidence": 0.85, "deliverables": [], "metrics": { "execution_time_ms": 0 }, "errors": [] } EOF_JSON ``` ### Advanced Implementation with Variables ```bash #!/bin/bash set -euo pipefail # Track execution time START_TIME=$(date +%s%3N) # Initialize variables SUCCESS=true CONFIDENCE=0.92 DELIVERABLES=() ERRORS=() # Skill logic if create_file "src/auth.ts"; then DELIVERABLES+=("src/auth.ts") else SUCCESS=false CONFIDENCE=0.5 ERRORS+=('{"code":"FILE_WRITE_FAILED","message":"Failed to create auth.ts"}') fi # Calculate execution time END_TIME=$(date +%s%3N) EXECUTION_TIME=$((END_TIME - START_TIME)) # Build deliverables array (JSON format) if [ ${#DELIVERABLES[@]} -eq 0 ]; then DELIVERABLES_JSON="[]" else DELIVERABLES_JSON=$(printf '%s\n' "${DELIVERABLES[@]}" | jq -R . | jq -s .) fi # Build errors array if [ ${#ERRORS[@]} -eq 0 ]; then ERRORS_JSON="[]" else ERRORS_JSON=$(printf '%s\n' "${ERRORS[@]}" | jq -s .) fi # Output structured JSON cat << EOF { "success": ${SUCCESS}, "confidence": ${CONFIDENCE}, "deliverables": ${DELIVERABLES_JSON}, "metrics": { "execution_time_ms": ${EXECUTION_TIME}, "files_modified": ${#DELIVERABLES[@]} }, "errors": ${ERRORS_JSON} } EOF ``` ### TypeScript/Node.js Implementation ```typescript import { SkillOutput } from '@/lib/skill-output-parser'; async function executeSkill(): Promise<void> { const startTime = Date.now(); const deliverables: string[] = []; const errors: any[] = []; let success = true; try { // Skill logic here await createFile('src/auth.ts'); deliverables.push('src/auth.ts'); } catch (error) { success = false; errors.push({ code: 'FILE_WRITE_FAILED', message: error.message, }); } const output: SkillOutput = { success, confidence: success ? 0.92 : 0.5, deliverables, metrics: { execution_time_ms: Date.now() - startTime, files_modified: deliverables.length, }, errors, }; // Output JSON to stdout console.log(JSON.stringify(output, null, 2)); } executeSkill(); ``` ## Parsing ### Using SkillOutputParser ```typescript import { SkillOutputParser } from '@/lib/skill-output-parser'; const parser = new SkillOutputParser(); // Parse skill output const output = execSync('./execute.sh').toString(); const result = parser.parse(output); if (result.success) { console.log('Parse successful'); console.log(`Confidence: ${result.output.confidence}`); console.log(`Deliverables: ${result.output.deliverables.join(', ')}`); console.log(`Parse method: ${result.parseMethod}`); // 'json' or 'legacy' } else { console.error('Parse failed:', result.errors); } ``` ### Parser Configuration ```typescript const parser = new SkillOutputParser({ enableLegacyParsing: false, // Disable fallback to legacy parsing defaultConfidence: 0.5, // Default for legacy outputs strictValidation: true, // Enable strict schema validation }); ``` ### Batch Parsing ```typescript const outputs = [ execSync('./skill1/execute.sh').toString(), execSync('./skill2/execute.sh').toString(), execSync('./skill3/execute.sh').toString(), ]; const results = parser.parseBatch(outputs); for (const result of results) { console.log(`Parse method: ${result.parseMethod}`); console.log(`Confidence: ${result.output.confidence}`); } ``` ## Migration ### Migration Tool Migrate existing skills to JSON output: ```bash # Migrate single skill ./scripts/migrate-skill-outputs.ts \ --skill-path .claude/skills/my-skill/execute.sh # Dry run (preview changes) ./scripts/migrate-skill-outputs.ts \ --dry-run \ --skill-dir .claude/skills/ # Migrate all skills with verbose output ./scripts/migrate-skill-outputs.ts \ --verbose \ --skill-dir .claude/skills/ ``` ### Manual Migration 1. **Identify legacy output patterns:** ```bash echo "SUCCESS" echo "Confidence: 0.92" echo "Created: src/file.ts" ``` 2. **Comment out legacy patterns:** ```bash # LEGACY (replaced with JSON): echo "SUCCESS" # LEGACY (replaced with JSON): echo "Confidence: 0.92" # LEGACY (replaced with JSON): echo "Created: src/file.ts" ``` 3. **Add JSON output at the end:** ```bash # Output structured JSON cat << 'EOF_JSON' { "success": true, "confidence": 0.92, "deliverables": ["src/file.ts"], "metrics": { "execution_time_ms": 1234 }, "errors": [] } EOF_JSON ``` 4. **Test JSON output:** ```bash ./execute.sh | jq . ./execute.sh | jq -e '.success, .confidence, .deliverables, .metrics, .errors' ``` ### Migration Checklist - [ ] Backup existing skill (migration tool does this automatically) - [ ] Identify all legacy output patterns - [ ] Comment out or remove legacy patterns - [ ] Add JSON output block at end of execute.sh - [ ] Test JSON output is valid (`./execute.sh | jq .`) - [ ] Verify all required fields present - [ ] Validate confidence is in range 0.0-1.0 - [ ] Test with SkillOutputParser - [ ] Update skill documentation ## Validation ### JSON Validation ```bash # Validate JSON syntax ./execute.sh | jq . # Validate required fields exist ./execute.sh | jq -e '.success, .confidence, .deliverables, .metrics, .errors' # Validate confidence range ./execute.sh | jq -e '.confidence >= 0.0 and .confidence <= 1.0' # Validate success is boolean ./execute.sh | jq -e '.success | type == "boolean"' # Validate deliverables is array ./execute.sh | jq -e '.deliverables | type == "array"' ``` ### Schema Validation ```bash # Validate against JSON schema ajv validate \ -s schemas/skill-output-v1.schema.json \ -d <(./execute.sh) ``` ### Integration Testing ```bash # Test skill output parsing npm test -- tests/skill-output-parser.test.ts # Test specific skill ./execute.sh | node -e " const { SkillOutputParser } = require('./src/lib/skill-output-parser'); const parser = new SkillOutputParser(); const input = require('fs').readFileSync(0, 'utf-8'); const result = parser.parse(input); console.log('Parse method:', result.parseMethod); console.log('Success:', result.success); if (!result.success) { console.error('Errors:', result.errors); process.exit(1); } " ``` ## Performance ### Performance Targets - JSON parsing: **< 10ms** (per output) - Validation: **< 50ms** (per output) - Batch parsing: **< 100ms** (for 100 outputs) ### Optimization Tips 1. **Use heredoc for JSON output** (faster than echo) 2. **Minimize jq usage** (use native bash when possible) 3. **Cache parser instance** (reuse across multiple parses) 4. **Use batch parsing** (for multiple outputs) ### Performance Testing ```bash # Test parsing performance npm test -- tests/skill-output-parser.test.ts -t "Performance" # Benchmark skill execution time ./execute.sh | jq . ``` ## Examples ### Example 1: Simple Skill ```bash #!/bin/bash set -euo pipefail # Simple validation skill VALID=true if [ ! -f "config.json" ]; then VALID=false fi cat << EOF { "success": ${VALID}, "confidence": $([ "$VALID" = true ] && echo "0.95" || echo "0.0"), "deliverables": [], "metrics": {}, "errors": $([ "$VALID" = false ] && echo '[{"code":"FILE_NOT_FOUND","message":"config.json not found"}]' || echo '[]') } EOF ``` ### Example 2: File Creation Skill ```bash #!/bin/bash set -euo pipefail # Create authentication module START_TIME=$(date +%s%3N) # Create file cat > src/auth.ts << 'EOF' export function authenticate() { // Implementation here } EOF END_TIME=$(date +%s%3N) cat << EOF { "success": true, "confidence": 0.92, "deliverables": ["src/auth.ts"], "metrics": { "execution_time_ms": $((END_TIME - START_TIME)), "files_created": 1, "lines_of_code": 4 }, "errors": [] } EOF ``` ### Example 3: Multi-Step Skill with Error Handling ```bash #!/bin/bash set -euo pipefail START_TIME=$(date +%s%3N) DELIVERABLES=() ERRORS=() SUCCESS=true # Step 1: Create directory if mkdir -p src/api 2>/dev/null; then echo "Created directory" >&2 else SUCCESS=false ERRORS+=('{"code":"MKDIR_FAILED","message":"Failed to create directory"}') fi # Step 2: Create files if [ "$SUCCESS" = true ]; then for file in routes.ts controllers.ts middleware.ts; do if touch "src/api/$file" 2>/dev/null; then DELIVERABLES+=("src/api/$file") else SUCCESS=false ERRORS+=("{\"code\":\"FILE_CREATE_FAILED\",\"message\":\"Failed to create $file\"}") fi done fi # Build JSON arrays DELIVERABLES_JSON=$(printf '%s\n' "${DELIVERABLES[@]}" | jq -R . | jq -s .) ERRORS_JSON=$([ ${#ERRORS[@]} -eq 0 ] && echo '[]' || printf '%s\n' "${ERRORS[@]}" | jq -s .) END_TIME=$(date +%s%3N) cat << EOF { "success": ${SUCCESS}, "confidence": $([ "$SUCCESS" = true ] && echo "0.95" || echo "0.5"), "deliverables": ${DELIVERABLES_JSON}, "metrics": { "execution_time_ms": $((END_TIME - START_TIME)), "files_created": ${#DELIVERABLES[@]} }, "errors": ${ERRORS_JSON} } EOF ``` ## Troubleshooting ### Common Issues #### Issue: `SyntaxError: Unexpected token` **Cause:** Invalid JSON syntax **Solution:** ```bash # Test JSON syntax ./execute.sh | jq . # Common issues: # - Missing quotes around strings # - Trailing commas # - Unescaped quotes in strings ``` #### Issue: `Parse failed: Missing required field: confidence` **Cause:** JSON missing required fields **Solution:** ```bash # Ensure all required fields present: { "success": true, # Required "confidence": 0.85, # Required "deliverables": [], # Required "metrics": {}, # Required "errors": [] # Required } ``` #### Issue: `Confidence must be between 0.0 and 1.0` **Cause:** Confidence out of valid range **Solution:** ```bash # Ensure confidence is 0.0-1.0: "confidence": 0.92 # ✓ Valid "confidence": 1.5 # ✗ Invalid (> 1.0) "confidence": -0.5 # ✗ Invalid (< 0.0) ``` #### Issue: Parser falls back to legacy parsing **Cause:** JSON not detected or invalid **Solution:** ```bash # Ensure JSON is on stdout (not stderr) cat << 'EOF_JSON' # ✓ Correct { "success": true, ... } EOF_JSON # Don't mix stdout and stderr echo "Processing..." >&2 # Logs to stderr cat << 'EOF_JSON' # JSON to stdout ... EOF_JSON ``` ## References ### Related Files - **Schema:** `schemas/skill-output-v1.schema.json` - **Parser:** `src/lib/skill-output-parser.ts` - **Tests:** `tests/skill-output-parser.test.ts` - **Migration Tool:** `scripts/migrate-skill-outputs.ts` - **Template:** `.claude/skills/SKILL_TEMPLATE.md` ### Related Documentation - **Agent Output Standards:** `docs/AGENT_OUTPUT_STANDARDS.md` - **Skill Content Standards:** `docs/SKILL_CONTENT_STANDARDS.md` - **Integration Standardization Plan:** `docs/INTEGRATION_STANDARDIZATION_PLAN.md` ### External References - [JSON Schema Specification](https://json-schema.org/) - [jq Manual](https://stedolan.github.io/jq/manual/) - [Bash Heredoc](https://www.gnu.org/software/bash/manual/html_node/Redirections.html) --- **Version:** 1.0.0 **Author:** CFN Team **Last Updated:** 2025-11-16 **Task:** 5.4 - Eliminate Bash Output Parsing