manage-external-context.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #!/bin/bash
  2. # External Context Management Utility
  3. # Manages cached external documentation in .tmp/external-context/
  4. set -e
  5. EXTERNAL_CONTEXT_DIR=".tmp/external-context"
  6. MANIFEST_FILE="$EXTERNAL_CONTEXT_DIR/.manifest.json"
  7. # Colors for output
  8. RED='\033[0;31m'
  9. GREEN='\033[0;32m'
  10. YELLOW='\033[1;33m'
  11. BLUE='\033[0;34m'
  12. NC='\033[0m' # No Color
  13. # Helper functions
  14. print_header() {
  15. echo -e "${BLUE}=== $1 ===${NC}"
  16. }
  17. print_success() {
  18. echo -e "${GREEN}✓ $1${NC}"
  19. }
  20. print_error() {
  21. echo -e "${RED}✗ $1${NC}"
  22. }
  23. print_warning() {
  24. echo -e "${YELLOW}⚠ $1${NC}"
  25. }
  26. # List all cached external context
  27. list_cache() {
  28. print_header "Cached External Context"
  29. if [ ! -d "$EXTERNAL_CONTEXT_DIR" ]; then
  30. print_error "External context directory not found: $EXTERNAL_CONTEXT_DIR"
  31. return 1
  32. fi
  33. if [ ! -f "$MANIFEST_FILE" ]; then
  34. print_warning "Manifest file not found: $MANIFEST_FILE"
  35. return 1
  36. fi
  37. echo ""
  38. echo "Manifest:"
  39. cat "$MANIFEST_FILE" | jq '.' 2>/dev/null || cat "$MANIFEST_FILE"
  40. echo ""
  41. echo "Cached files:"
  42. find "$EXTERNAL_CONTEXT_DIR" -name "*.md" -type f | sort | while read -r file; do
  43. size=$(du -h "$file" | cut -f1)
  44. modified=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M:%S" "$file" 2>/dev/null || stat -c "%y" "$file" 2>/dev/null | cut -d' ' -f1-2)
  45. echo " $file ($size, modified: $modified)"
  46. done
  47. }
  48. # Show details of a specific cached file
  49. show_file() {
  50. local package=$1
  51. local topic=$2
  52. if [ -z "$package" ] || [ -z "$topic" ]; then
  53. print_error "Usage: $0 show <package-name> <topic>"
  54. return 1
  55. fi
  56. local file="$EXTERNAL_CONTEXT_DIR/$package/$topic.md"
  57. if [ ! -f "$file" ]; then
  58. print_error "File not found: $file"
  59. return 1
  60. fi
  61. print_header "File: $file"
  62. echo ""
  63. head -20 "$file"
  64. echo ""
  65. echo "... (showing first 20 lines)"
  66. }
  67. # Clean up old external context files
  68. cleanup_old() {
  69. local days=${1:-7}
  70. print_header "Cleaning up external context older than $days days"
  71. if [ ! -d "$EXTERNAL_CONTEXT_DIR" ]; then
  72. print_warning "External context directory not found"
  73. return 0
  74. fi
  75. local count=0
  76. while IFS= read -r file; do
  77. print_warning "Removing: $file"
  78. rm "$file"
  79. count=$((count + 1))
  80. done < <(find "$EXTERNAL_CONTEXT_DIR" -name "*.md" -type f -mtime +"$days")
  81. if [ "$count" -eq 0 ]; then
  82. print_success "No files older than $days days found"
  83. else
  84. print_success "Removed $count old files"
  85. # Update manifest
  86. regenerate_manifest
  87. fi
  88. }
  89. # Regenerate manifest from actual files
  90. regenerate_manifest() {
  91. print_header "Regenerating manifest"
  92. if [ ! -d "$EXTERNAL_CONTEXT_DIR" ]; then
  93. print_error "External context directory not found"
  94. return 1
  95. fi
  96. # Create new manifest (placeholder for future implementation)
  97. # local manifest
  98. # manifest="{\"last_updated\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\", \"version\": \"1.0\", \"packages\": {}}"
  99. # Find all packages and topics
  100. find "$EXTERNAL_CONTEXT_DIR" -name "*.md" -type f | grep -v README | while read -r file; do
  101. local package
  102. local topic
  103. package=$(basename "$(dirname "$file")")
  104. topic=$(basename "$file" .md)
  105. # Metadata extraction (placeholder for future implementation)
  106. # local fetched
  107. # local source
  108. # local library
  109. # local official_docs
  110. # fetched=$(stat -f "%Sm" -t "%Y-%m-%dT%H:%M:%SZ" "$file" 2>/dev/null || stat -c "%y" "$file" 2>/dev/null | cut -d' ' -f1-2)
  111. # source=$(grep "^source:" "$file" | cut -d: -f2- | xargs)
  112. # library=$(grep "^library:" "$file" | cut -d: -f2- | xargs)
  113. # official_docs=$(grep "^official_docs:" "$file" | cut -d: -f2- | xargs)
  114. echo " $package/$topic.md"
  115. done
  116. print_success "Manifest regenerated"
  117. }
  118. # Delete specific cached file
  119. delete_file() {
  120. local package=$1
  121. local topic=$2
  122. if [ -z "$package" ] || [ -z "$topic" ]; then
  123. print_error "Usage: $0 delete <package-name> <topic>"
  124. return 1
  125. fi
  126. local file="$EXTERNAL_CONTEXT_DIR/$package/$topic.md"
  127. if [ ! -f "$file" ]; then
  128. print_error "File not found: $file"
  129. return 1
  130. fi
  131. print_warning "Deleting: $file"
  132. rm "$file"
  133. # Remove empty directory
  134. if [ -z "$(ls -A "$EXTERNAL_CONTEXT_DIR/$package" 2>/dev/null)" ]; then
  135. rmdir "$EXTERNAL_CONTEXT_DIR/$package"
  136. print_success "Removed empty directory: $EXTERNAL_CONTEXT_DIR/$package"
  137. fi
  138. # Update manifest
  139. regenerate_manifest
  140. print_success "File deleted and manifest updated"
  141. }
  142. # Delete entire package cache
  143. delete_package() {
  144. local package=$1
  145. if [ -z "$package" ]; then
  146. print_error "Usage: $0 delete-package <package-name>"
  147. return 1
  148. fi
  149. local dir="$EXTERNAL_CONTEXT_DIR/$package"
  150. if [ ! -d "$dir" ]; then
  151. print_error "Package directory not found: $dir"
  152. return 1
  153. fi
  154. print_warning "Deleting entire package: $dir"
  155. rm -rf "$dir"
  156. # Update manifest
  157. regenerate_manifest
  158. print_success "Package deleted and manifest updated"
  159. }
  160. # Show usage
  161. usage() {
  162. cat << EOF
  163. External Context Management Utility
  164. Usage: $0 <command> [options]
  165. Commands:
  166. list List all cached external context
  167. show <package> <topic> Show details of a specific file
  168. cleanup-old [days] Remove files older than N days (default: 7)
  169. regenerate-manifest Regenerate manifest from actual files
  170. delete <package> <topic> Delete a specific file
  171. delete-package <package> Delete entire package cache
  172. help Show this help message
  173. Examples:
  174. $0 list
  175. $0 show drizzle-orm modular-schemas
  176. $0 cleanup-old 7
  177. $0 delete drizzle-orm modular-schemas
  178. $0 delete-package drizzle-orm
  179. EOF
  180. }
  181. # Main
  182. case "${1:-help}" in
  183. list)
  184. list_cache
  185. ;;
  186. show)
  187. show_file "$2" "$3"
  188. ;;
  189. cleanup-old)
  190. cleanup_old "${2:-7}"
  191. ;;
  192. regenerate-manifest)
  193. regenerate_manifest
  194. ;;
  195. delete)
  196. delete_file "$2" "$3"
  197. ;;
  198. delete-package)
  199. delete_package "$2"
  200. ;;
  201. help|--help|-h)
  202. usage
  203. ;;
  204. *)
  205. print_error "Unknown command: $1"
  206. usage
  207. exit 1
  208. ;;
  209. esac