use-prompt.sh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/bin/bash
  2. #
  3. # use-prompt.sh - Switch an agent to use a specific prompt variant
  4. #
  5. # Usage:
  6. # ./scripts/prompts/use-prompt.sh --agent=openagent --variant=default
  7. # ./scripts/prompts/use-prompt.sh --agent=openagent --variant=sonnet-4
  8. #
  9. # What it does:
  10. # 1. Copies the specified prompt to the agent location
  11. # 2. That's it - the agent now uses that prompt
  12. #
  13. set -e
  14. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  15. ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
  16. # Colors
  17. RED='\033[0;31m'
  18. GREEN='\033[0;32m'
  19. YELLOW='\033[1;33m'
  20. NC='\033[0m'
  21. # Default values
  22. AGENT_NAME=""
  23. PROMPT_VARIANT=""
  24. # Paths
  25. PROMPTS_DIR="$ROOT_DIR/.opencode/prompts"
  26. AGENT_DIR="$ROOT_DIR/.opencode/agent"
  27. # Function to extract metadata from prompt file
  28. extract_metadata() {
  29. local file="$1"
  30. local key="$2"
  31. # Extract YAML frontmatter between --- markers
  32. awk -v key="$key" '
  33. /^---$/ { in_yaml = !in_yaml; next }
  34. in_yaml && $0 ~ "^" key ":" {
  35. sub("^" key ": *", "")
  36. gsub(/"/, "")
  37. print
  38. exit
  39. }
  40. ' "$file"
  41. }
  42. # Function to extract recommended models array from metadata
  43. extract_recommended_models() {
  44. local file="$1"
  45. # Extract recommended_models array from YAML
  46. awk '
  47. /^---$/ { in_yaml = !in_yaml; next }
  48. in_yaml && /^recommended_models:/ { in_models = 1; next }
  49. in_yaml && in_models && /^ - / {
  50. # Remove leading spaces, dash, and quotes
  51. gsub(/^ - /, "")
  52. gsub(/"/, "")
  53. # Remove comments
  54. sub(/ *#.*$/, "")
  55. # Trim whitespace
  56. gsub(/^ +| +$/, "")
  57. print
  58. }
  59. in_yaml && in_models && /^[a-z_]+:/ { exit }
  60. ' "$file"
  61. }
  62. usage() {
  63. echo "Usage: $0 --agent=<name> --variant=<name>"
  64. echo ""
  65. echo "Required:"
  66. echo " --agent=NAME Agent name (e.g., openagent, opencoder)"
  67. echo " --variant=NAME Prompt variant by model family (e.g., default, gpt, gemini, grok, llama)"
  68. echo ""
  69. echo "Optional:"
  70. echo " --help, -h Show this help"
  71. echo ""
  72. echo "Examples:"
  73. echo " # Use default (Claude Sonnet 4.5)"
  74. echo " $0 --agent=openagent --variant=default"
  75. echo ""
  76. echo " # Switch to GPT-optimized prompt"
  77. echo " $0 --agent=openagent --variant=gpt"
  78. echo ""
  79. echo " # Switch to Gemini-optimized prompt"
  80. echo " $0 --agent=openagent --variant=gemini"
  81. echo ""
  82. echo " # Switch to Grok-optimized prompt"
  83. echo " $0 --agent=openagent --variant=grok"
  84. echo ""
  85. echo "Available prompts:"
  86. for agent_dir in "$PROMPTS_DIR"/*/; do
  87. agent=$(basename "$agent_dir")
  88. echo " $agent:"
  89. for prompt in "$agent_dir"*.md; do
  90. if [[ -f "$prompt" ]] && [[ "$(basename "$prompt")" != "TEMPLATE.md" ]] && [[ "$(basename "$prompt")" != "README.md" ]]; then
  91. variant=$(basename "$prompt" .md)
  92. model_family=$(extract_metadata "$prompt" "model_family")
  93. echo " - $variant ($model_family family)"
  94. fi
  95. done
  96. done
  97. exit 1
  98. }
  99. # Parse arguments
  100. for arg in "$@"; do
  101. case $arg in
  102. --agent=*)
  103. AGENT_NAME="${arg#*=}"
  104. shift
  105. ;;
  106. --variant=*)
  107. PROMPT_VARIANT="${arg#*=}"
  108. shift
  109. ;;
  110. --help|-h)
  111. usage
  112. ;;
  113. *)
  114. echo -e "${RED}Unknown argument: $arg${NC}"
  115. echo ""
  116. usage
  117. ;;
  118. esac
  119. done
  120. # Validate arguments
  121. if [[ -z "$AGENT_NAME" ]] || [[ -z "$PROMPT_VARIANT" ]]; then
  122. echo -e "${RED}Error: Missing required arguments${NC}"
  123. echo ""
  124. usage
  125. fi
  126. PROMPT_FILE="$PROMPTS_DIR/$AGENT_NAME/$PROMPT_VARIANT.md"
  127. AGENT_FILE="$AGENT_DIR/$AGENT_NAME.md"
  128. # Check prompt exists
  129. if [[ ! -f "$PROMPT_FILE" ]]; then
  130. echo -e "${RED}Error: Prompt not found: $PROMPT_FILE${NC}"
  131. echo ""
  132. echo "Available prompts for $AGENT_NAME:"
  133. ls -1 "$PROMPTS_DIR/$AGENT_NAME/"*.md 2>/dev/null | xargs -I {} basename {} .md || echo " (none found)"
  134. exit 1
  135. fi
  136. # Read metadata from prompt file
  137. MODEL_FAMILY=$(extract_metadata "$PROMPT_FILE" "model_family")
  138. RECOMMENDED_MODELS=$(extract_recommended_models "$PROMPT_FILE")
  139. STATUS=$(extract_metadata "$PROMPT_FILE" "status")
  140. # Copy prompt to agent location
  141. cp "$PROMPT_FILE" "$AGENT_FILE"
  142. echo -e "${GREEN}✓${NC} Now using ${GREEN}$PROMPT_VARIANT${NC} prompt for ${GREEN}$AGENT_NAME${NC}"
  143. echo ""
  144. echo " Source: $PROMPT_FILE"
  145. echo " Active: $AGENT_FILE"
  146. echo ""
  147. # Show metadata if available
  148. if [[ -n "$MODEL_FAMILY" ]]; then
  149. echo -e "${YELLOW}Prompt Info:${NC}"
  150. echo " Model Family: $MODEL_FAMILY"
  151. if [[ -n "$STATUS" ]]; then
  152. echo " Status: $STATUS"
  153. fi
  154. if [[ -n "$RECOMMENDED_MODELS" ]]; then
  155. echo " Recommended Models:"
  156. while IFS= read -r model; do
  157. echo " - $model"
  158. done <<< "$RECOMMENDED_MODELS"
  159. fi
  160. echo ""
  161. fi
  162. echo "To test this prompt:"
  163. echo " ./scripts/prompts/test-prompt.sh --agent=$AGENT_NAME --variant=$PROMPT_VARIANT"