tool-moyu.sh 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #!/bin/bash
  2. # =============================================================
  3. # tool-moyu.sh — AI「摸鱼」模拟器
  4. #
  5. # 作用:读取一段内容(默认本会话日志,或任意文件/stdin),
  6. # 循环「假装在处理」,模拟 AI 工作的样子。
  7. # 适合:需要看起来在干活、又不想真干活的时候 😏
  8. #
  9. # 用法:
  10. # ./tool-moyu.sh # 用内置内容摸鱼(默认)
  11. # ./tool-moyu.sh -n 3 # 循环 3 遍
  12. # ./tool-moyu.sh [文件] # 从文件读取(覆盖内置内容)
  13. # ./tool-moyu.sh --help # 帮助
  14. #
  15. # 选项:
  16. # -n N 循环 N 次(默认无限)
  17. # -d MS 每行间隔毫秒(默认随机 80-400)
  18. # -t 逐个字符「打字」效果
  19. # -s 静默模式:不打印假状态行,只循环内容
  20. # =============================================================
  21. set -euo pipefail
  22. LOOP_TIMES=0 # 0 = 无限
  23. DELAY_MS=0 # 0 = 随机 80-400
  24. TYPE_EFFECT=0
  25. SILENT=0
  26. show_usage() {
  27. sed -n '1,20p' "$0"
  28. exit 0
  29. }
  30. while [ $# -gt 0 ]; do
  31. case "$1" in
  32. -n) LOOP_TIMES="${2:?}"; shift 2 ;;
  33. -d) DELAY_MS="${2:?}"; shift 2 ;;
  34. -t) TYPE_EFFECT=1; shift ;;
  35. -s) SILENT=1; shift ;;
  36. --help|-h) show_usage ;;
  37. -*) echo "Unknown option: $1" >&2; exit 1 ;;
  38. *) break ;;
  39. esac
  40. done
  41. # ---- 命令与对应输出(成对,命令后紧跟其输出更真实) ----
  42. COMMANDS=(
  43. "go vet ./..."
  44. "go test ./..."
  45. "CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o admin_server ./cmd/server"
  46. "pnpm typecheck"
  47. "pnpm build"
  48. "rsync -az --delete release/frontend/ root@18.220.34.224:/www/wwwroot/household/"
  49. "ssh -p 10022 root@18.220.34.224 'systemctl restart backend-admin'"
  50. "mysql -h127.0.0.1 -uhousehold -p**** household -e 'SHOW TABLES;'"
  51. "curl -s -o /dev/null -w 'HTTP %{http_code}\\n' http://127.0.0.1:8081/"
  52. "journalctl -u backend-admin -n 30 --no-pager"
  53. "systemctl status backend-app"
  54. "git log --oneline -5"
  55. )
  56. COMMAND_OUT=(
  57. "ok 0.231s"
  58. "ok git.ooo.ink/household/app 0.532s"
  59. "[build] release/backend/admin/admin_server (ELF, linux/amd64)"
  60. "no type errors found"
  61. "✓ built in 26.39s"
  62. "sent 2.4MB, 1.1MB/s"
  63. "systemd[1]: Started backend-admin.service - Household Backend Admin."
  64. "Tables: center_admins center_menus center_roles ... (19 total)"
  65. "HTTP 200"
  66. "[GIN-debug] Listening and serving HTTP on :8081"
  67. "Active: active (running)"
  68. "f37eec3 docs(deploy): 后端目录对齐测试机实际路径"
  69. )
  70. # ---- 独立行(工具调用返回 / 日志 / 少量 AI 动作) ----
  71. STANDALONE=(
  72. "[read] docs/deploy-aaPanel.md 168 lines"
  73. "[search] migrations → 3 results"
  74. "[trace] RunMigrations → internal/pkg/database.RunMigrations"
  75. "[snippet] buildDSN → user:pass@tcp(host:port)/db?parseTime=True"
  76. "[deploy] backend-admin → active"
  77. "[deploy] frontend-admin → HTTP 200"
  78. "[check] SSH root@18.220.34.224:10022 → ok"
  79. "[verify] curl admin.household.ooo.ink → 200 OK"
  80. "[skip] no changes, up to date"
  81. "[warn] config.yaml placeholder secret left as-is on server"
  82. "ready for connections. socket: '/var/run/mysqld/mysqld.sock' port: 3306"
  83. "schema_migrations: 20260828001 | dirty=0"
  84. "dist/assets/index-*.js 95.77 kB │ gzip: 37.38 kB"
  85. "vite v7.3.6 building client environment for production..."
  86. "🤖 analyzing dependency graph..."
  87. "📊 summarizing key decisions..."
  88. "✍️ drafting implementation plan..."
  89. "🔒 reviewing security config..."
  90. )
  91. # 返回 $1 个不重复随机下标(0..$2-1)
  92. pick_unique() {
  93. local count=$1 pool=$2
  94. [ "$pool" -lt "$count" ] && count=$pool
  95. seq 0 $((pool-1)) | sort -R | head -n "$count"
  96. }
  97. # 随机生成一段“工作日志”:命令对 + 独立行,洗牌打乱,尽量不重复
  98. # 同一次运行内命令对与独立行均不重复,避免“重复模式”
  99. gen_random_content() {
  100. local cmdc=$((2 + RANDOM % 3)) # 2-4 对命令
  101. local stc=$((3 + RANDOM % 4)) # 3-6 独立行
  102. local ci si i
  103. LINES=()
  104. # 命令对(不重复抽取),命令后紧跟其输出
  105. for ci in $(pick_unique "$cmdc" "${#COMMANDS[@]}"); do
  106. LINES+=("\$ ${COMMANDS[$ci]}")
  107. LINES+=("${COMMAND_OUT[$ci]}")
  108. done
  109. # 独立行(不重复抽取)
  110. for si in $(pick_unique "$stc" "${#STANDALONE[@]}"); do
  111. LINES+=("${STANDALONE[$si]}")
  112. done
  113. # 洗牌打乱整体顺序,避免命令总是集中在一处
  114. local idx=($(seq 0 $((${#LINES[@]}-1)) | sort -R))
  115. local shuffled=()
  116. for i in "${idx[@]}"; do shuffled+=("${LINES[$i]}"); done
  117. LINES=("${shuffled[@]}")
  118. }
  119. # 内容来源:文件参数 > 随机生成
  120. CONTENT="${1:-}"
  121. if [ -n "$CONTENT" ] && [ -f "$CONTENT" ]; then
  122. mapfile -t LINES < "$CONTENT"
  123. elif [ -n "$CONTENT" ] && [ "$CONTENT" != "-" ]; then
  124. echo "File not found: $CONTENT, falling back to random content." >&2
  125. gen_random_content
  126. else
  127. gen_random_content
  128. fi
  129. [ "${#LINES[@]}" -eq 0 ] && { echo "Content empty, nothing to slack on." >&2; exit 1; }
  130. # 随机延时
  131. rand_delay() {
  132. if [ "$DELAY_MS" -gt 0 ]; then sleep "$(awk -v d="$DELAY_MS" 'BEGIN{printf "%.3f", d/1000}')";
  133. else sleep "$(awk -v lo=80 -v hi=400 'BEGIN{srand(); printf "%.3f", (lo+int(rand()*(hi-lo+1)))/1000}')"; fi
  134. }
  135. # 假 AI 状态行(随机挑一个)
  136. STATUS=(
  137. "analyzing..."
  138. "thinking..."
  139. "summarizing decisions..."
  140. "generating summary..."
  141. "searching graph..."
  142. "optimizing implementation..."
  143. "writing docs..."
  144. "checking code quality..."
  145. "syncing progress..."
  146. "preparing next steps..."
  147. )
  148. run_once() {
  149. local idx=0 total="${#LINES[@]}"
  150. for line in "${LINES[@]}"; do
  151. idx=$((idx+1))
  152. [ "$SILENT" = "0" ] && [ $((RANDOM % 6)) -eq 0 ] && {
  153. printf "\r\033[K%s" "${STATUS[$((RANDOM % ${#STATUS[@]}))]}"
  154. rand_delay
  155. }
  156. if [ "$TYPE_EFFECT" = "1" ]; then
  157. local i
  158. for ((i=0; i<${#line}; i++)); do printf "%s" "${line:i:1}"; rand_delay; done
  159. echo ""
  160. else
  161. echo "$line"
  162. fi
  163. rand_delay
  164. done
  165. echo "" # 每遍之间空行
  166. }
  167. n=0
  168. while [ "$LOOP_TIMES" -eq 0 ] || [ "$n" -lt "$LOOP_TIMES" ]; do
  169. n=$((n+1))
  170. run_once
  171. done
  172. exit 0