use-prompt.sh 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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=gpt
  7. # ./scripts/prompts/use-prompt.sh --agent=openagent --variant=default
  8. #
  9. # What it does:
  10. # 1. If variant is "default", restores the canonical agent file (no-op, already default)
  11. # 2. Otherwise, copies the model-specific variant to the agent location
  12. #
  13. # New Architecture:
  14. # - Agent files (.opencode/agent/*.md) are the canonical defaults
  15. # - Prompt variants (.opencode/prompts/<agent>/<model>.md) are model-specific optimizations
  16. #
  17. set -e
  18. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  19. ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
  20. # Colors
  21. RED='\033[0;31m'
  22. GREEN='\033[0;32m'
  23. YELLOW='\033[1;33m'
  24. BLUE='\033[0;34m'
  25. NC='\033[0m'
  26. # Default values
  27. AGENT_NAME=""
  28. PROMPT_VARIANT=""
  29. # Paths
  30. PROMPTS_DIR="$ROOT_DIR/.opencode/prompts"
  31. AGENT_DIR="$ROOT_DIR/.opencode/agent"
  32. # Function to extract metadata from prompt file
  33. extract_metadata() {
  34. local file="$1"
  35. local key="$2"
  36. # Extract YAML frontmatter between --- markers
  37. awk -v key="$key" '
  38. /^---$/ { in_yaml = !in_yaml; next }
  39. in_yaml && $0 ~ "^" key ":" {
  40. sub("^" key ": *", "")
  41. gsub(/"/, "")
  42. print
  43. exit
  44. }
  45. ' "$file"
  46. }
  47. # Function to extract recommended models array from metadata
  48. extract_recommended_models() {
  49. local file="$1"
  50. # Extract recommended_models array from YAML
  51. awk '
  52. /^---$/ { in_yaml = !in_yaml; next }
  53. in_yaml && /^recommended_models:/ { in_models = 1; next }
  54. in_yaml && in_models && /^ - / {
  55. # Remove leading spaces, dash, and quotes
  56. gsub(/^ - /, "")
  57. gsub(/"/, "")
  58. # Remove comments
  59. sub(/ *#.*$/, "")
  60. # Trim whitespace
  61. gsub(/^ +| +$/, "")
  62. print
  63. }
  64. in_yaml && in_models && /^[a-z_]+:/ { exit }
  65. ' "$file"
  66. }
  67. usage() {
  68. echo "Usage: $0 --agent=<name> --variant=<name>"
  69. echo ""
  70. echo "Required:"
  71. echo " --agent=NAME Agent name (e.g., openagent, opencoder)"
  72. echo " --variant=NAME Prompt variant (default, gpt, gemini, grok, llama)"
  73. echo ""
  74. echo "Optional:"
  75. echo " --help, -h Show this help"
  76. echo ""
  77. echo -e "${BLUE}Architecture:${NC}"
  78. echo " • Agent files (.opencode/agent/*.md) = Canonical defaults"
  79. echo " • Prompt variants (.opencode/prompts/<agent>/<model>.md) = Model-specific"
  80. echo ""
  81. echo "Examples:"
  82. echo " # Use default (canonical agent file)"
  83. echo " $0 --agent=openagent --variant=default"
  84. echo ""
  85. echo " # Switch to GPT-optimized prompt"
  86. echo " $0 --agent=openagent --variant=gpt"
  87. echo ""
  88. echo " # Switch to Gemini-optimized prompt"
  89. echo " $0 --agent=openagent --variant=gemini"
  90. echo ""
  91. echo "Available prompts:"
  92. for agent_dir in "$PROMPTS_DIR"/*/; do
  93. [ -d "$agent_dir" ] || continue
  94. agent=$(basename "$agent_dir")
  95. echo " $agent:"
  96. echo " - default (canonical agent file)"
  97. for prompt in "$agent_dir"*.md; do
  98. if [[ -f "$prompt" ]] && [[ "$(basename "$prompt")" != "TEMPLATE.md" ]] && [[ "$(basename "$prompt")" != "README.md" ]]; then
  99. variant=$(basename "$prompt" .md)
  100. model_family=$(extract_metadata "$prompt" "model_family")
  101. if [[ -n "$model_family" ]]; then
  102. echo " - $variant ($model_family family)"
  103. else
  104. echo " - $variant"
  105. fi
  106. fi
  107. done
  108. done
  109. exit 1
  110. }
  111. # Parse arguments
  112. for arg in "$@"; do
  113. case $arg in
  114. --agent=*)
  115. AGENT_NAME="${arg#*=}"
  116. shift
  117. ;;
  118. --variant=*)
  119. PROMPT_VARIANT="${arg#*=}"
  120. shift
  121. ;;
  122. --help|-h)
  123. usage
  124. ;;
  125. *)
  126. echo -e "${RED}Unknown argument: $arg${NC}"
  127. echo ""
  128. usage
  129. ;;
  130. esac
  131. done
  132. # Validate arguments
  133. if [[ -z "$AGENT_NAME" ]] || [[ -z "$PROMPT_VARIANT" ]]; then
  134. echo -e "${RED}Error: Missing required arguments${NC}"
  135. echo ""
  136. usage
  137. fi
  138. AGENT_FILE="$AGENT_DIR/$AGENT_NAME.md"
  139. # Check agent exists
  140. if [[ ! -f "$AGENT_FILE" ]]; then
  141. echo -e "${RED}Error: Agent not found: $AGENT_FILE${NC}"
  142. echo ""
  143. echo "Available agents:"
  144. find "$AGENT_DIR" -maxdepth 1 -name "*.md" -exec basename {} .md \; || echo " (none found)"
  145. exit 1
  146. fi
  147. # Handle "default" variant - agent file is already the default
  148. if [[ "$PROMPT_VARIANT" == "default" ]]; then
  149. echo -e "${GREEN}✓${NC} Agent ${GREEN}$AGENT_NAME${NC} is using the ${GREEN}default${NC} prompt"
  150. echo ""
  151. echo " Location: $AGENT_FILE"
  152. echo ""
  153. echo -e "${BLUE}Note:${NC} In the new architecture, agent files are the canonical defaults."
  154. echo " No action needed - you're already using the default!"
  155. echo ""
  156. exit 0
  157. fi
  158. # For non-default variants, copy from prompts directory
  159. PROMPT_FILE="$PROMPTS_DIR/$AGENT_NAME/$PROMPT_VARIANT.md"
  160. # Check prompt exists
  161. if [[ ! -f "$PROMPT_FILE" ]]; then
  162. echo -e "${RED}Error: Prompt variant not found: $PROMPT_FILE${NC}"
  163. echo ""
  164. echo "Available variants for $AGENT_NAME:"
  165. echo " - default (canonical agent file)"
  166. if [[ -d "$PROMPTS_DIR/$AGENT_NAME" ]]; then
  167. find "$PROMPTS_DIR/$AGENT_NAME" -maxdepth 1 -name "*.md" -not -name "TEMPLATE.md" -not -name "README.md" -exec basename {} .md \; || echo " (no model variants found)"
  168. else
  169. echo " (no model variants found)"
  170. fi
  171. exit 1
  172. fi
  173. # Read metadata from prompt file
  174. MODEL_FAMILY=$(extract_metadata "$PROMPT_FILE" "model_family")
  175. RECOMMENDED_MODELS=$(extract_recommended_models "$PROMPT_FILE")
  176. STATUS=$(extract_metadata "$PROMPT_FILE" "status")
  177. # Copy prompt to agent location
  178. cp "$PROMPT_FILE" "$AGENT_FILE"
  179. echo -e "${GREEN}✓${NC} Now using ${GREEN}$PROMPT_VARIANT${NC} prompt for ${GREEN}$AGENT_NAME${NC}"
  180. echo ""
  181. echo " Source: $PROMPT_FILE"
  182. echo " Active: $AGENT_FILE"
  183. echo ""
  184. # Show metadata if available
  185. if [[ -n "$MODEL_FAMILY" ]]; then
  186. echo -e "${YELLOW}Prompt Info:${NC}"
  187. echo " Model Family: $MODEL_FAMILY"
  188. if [[ -n "$STATUS" ]]; then
  189. echo " Status: $STATUS"
  190. fi
  191. if [[ -n "$RECOMMENDED_MODELS" ]]; then
  192. echo " Recommended Models:"
  193. while IFS= read -r model; do
  194. echo " - $model"
  195. done <<< "$RECOMMENDED_MODELS"
  196. fi
  197. echo ""
  198. fi
  199. echo "To restore the default:"
  200. echo " ./scripts/prompts/use-prompt.sh --agent=$AGENT_NAME --variant=default"
  201. echo ""
  202. echo "To test this prompt:"
  203. echo " ./scripts/prompts/test-prompt.sh --agent=$AGENT_NAME --variant=$PROMPT_VARIANT"