run-haiku-test.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #!/bin/bash
  2. # Test with haiku model and user's CLAUDE.md
  3. # This tests whether a cheaper/faster model fails more easily
  4. set -e
  5. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  6. PLUGIN_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
  7. TIMESTAMP=$(date +%s)
  8. OUTPUT_DIR="/tmp/superpowers-tests/${TIMESTAMP}/explicit-skill-requests/haiku"
  9. mkdir -p "$OUTPUT_DIR"
  10. PROJECT_DIR="$OUTPUT_DIR/project"
  11. mkdir -p "$PROJECT_DIR/docs/superpowers/plans"
  12. mkdir -p "$PROJECT_DIR/.claude"
  13. echo "=== Haiku Model Test with User CLAUDE.md ==="
  14. echo "Output dir: $OUTPUT_DIR"
  15. echo "Plugin dir: $PLUGIN_DIR"
  16. echo ""
  17. cd "$PROJECT_DIR"
  18. # Copy user's CLAUDE.md to simulate real environment
  19. if [ -f "$HOME/.claude/CLAUDE.md" ]; then
  20. cp "$HOME/.claude/CLAUDE.md" "$PROJECT_DIR/.claude/CLAUDE.md"
  21. echo "Copied user CLAUDE.md"
  22. else
  23. echo "No user CLAUDE.md found, proceeding without"
  24. fi
  25. # Create a dummy plan file
  26. cat > "$PROJECT_DIR/docs/superpowers/plans/auth-system.md" << 'EOF'
  27. # Auth System Implementation Plan
  28. ## Task 1: Add User Model
  29. Create user model with email and password fields.
  30. ## Task 2: Add Auth Routes
  31. Create login and register endpoints.
  32. ## Task 3: Add JWT Middleware
  33. Protect routes with JWT validation.
  34. ## Task 4: Write Tests
  35. Add comprehensive test coverage.
  36. EOF
  37. echo ""
  38. # Turn 1: Start brainstorming
  39. echo ">>> Turn 1: Brainstorming request..."
  40. claude -p "I want to add user authentication to my app. Help me think through this." \
  41. --model haiku \
  42. --plugin-dir "$PLUGIN_DIR" \
  43. --dangerously-skip-permissions \
  44. --max-turns 3 \
  45. --output-format stream-json \
  46. > "$OUTPUT_DIR/turn1.json" 2>&1 || true
  47. echo "Done."
  48. # Turn 2: Answer questions
  49. echo ">>> Turn 2: Answering questions..."
  50. claude -p "Let's use JWT tokens with 24-hour expiry. Email/password registration." \
  51. --continue \
  52. --model haiku \
  53. --plugin-dir "$PLUGIN_DIR" \
  54. --dangerously-skip-permissions \
  55. --max-turns 3 \
  56. --output-format stream-json \
  57. > "$OUTPUT_DIR/turn2.json" 2>&1 || true
  58. echo "Done."
  59. # Turn 3: Ask to write a plan
  60. echo ">>> Turn 3: Requesting plan..."
  61. claude -p "Great, write this up as an implementation plan." \
  62. --continue \
  63. --model haiku \
  64. --plugin-dir "$PLUGIN_DIR" \
  65. --dangerously-skip-permissions \
  66. --max-turns 3 \
  67. --output-format stream-json \
  68. > "$OUTPUT_DIR/turn3.json" 2>&1 || true
  69. echo "Done."
  70. # Turn 4: Confirm plan looks good
  71. echo ">>> Turn 4: Confirming plan..."
  72. claude -p "The plan looks good. What are my options for executing it?" \
  73. --continue \
  74. --model haiku \
  75. --plugin-dir "$PLUGIN_DIR" \
  76. --dangerously-skip-permissions \
  77. --max-turns 2 \
  78. --output-format stream-json \
  79. > "$OUTPUT_DIR/turn4.json" 2>&1 || true
  80. echo "Done."
  81. # Turn 5: THE CRITICAL TEST
  82. echo ">>> Turn 5: Requesting subagent-driven-development..."
  83. FINAL_LOG="$OUTPUT_DIR/turn5.json"
  84. claude -p "subagent-driven-development, please" \
  85. --continue \
  86. --model haiku \
  87. --plugin-dir "$PLUGIN_DIR" \
  88. --dangerously-skip-permissions \
  89. --max-turns 2 \
  90. --output-format stream-json \
  91. > "$FINAL_LOG" 2>&1 || true
  92. echo "Done."
  93. echo ""
  94. echo "=== Results (Haiku) ==="
  95. # Check final turn
  96. SKILL_PATTERN='"skill":"([^"]*:)?subagent-driven-development"'
  97. if grep -q '"name":"Skill"' "$FINAL_LOG" && grep -qE "$SKILL_PATTERN" "$FINAL_LOG"; then
  98. echo "PASS: Skill was triggered"
  99. TRIGGERED=true
  100. else
  101. echo "FAIL: Skill was NOT triggered"
  102. TRIGGERED=false
  103. echo ""
  104. echo "Tools invoked in final turn:"
  105. grep '"type":"tool_use"' "$FINAL_LOG" | grep -o '"name":"[^"]*"' | head -10 || echo " (none)"
  106. fi
  107. echo ""
  108. echo "Skills triggered:"
  109. grep -o '"skill":"[^"]*"' "$FINAL_LOG" 2>/dev/null | sort -u || echo " (none)"
  110. echo ""
  111. echo "Final turn response (first 500 chars):"
  112. grep '"type":"assistant"' "$FINAL_LOG" | head -1 | jq -r '.message.content[0].text // .message.content' 2>/dev/null | head -c 500 || echo " (could not extract)"
  113. echo ""
  114. echo "Logs in: $OUTPUT_DIR"
  115. if [ "$TRIGGERED" = "true" ]; then
  116. exit 0
  117. else
  118. exit 1
  119. fi