claude-pangu 2.1.4 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +2 -0
  3. package/hooks/agent-collaboration.sh +1 -1
  4. package/hooks/agent-handoff-prompt.sh +55 -39
  5. package/hooks/agent-usage-reminder.sh +22 -2
  6. package/hooks/agent-usage-tracker.sh +1 -1
  7. package/hooks/anthropic-context-window-limit-recovery.sh +1 -1
  8. package/hooks/ast-grep.sh +1 -1
  9. package/hooks/at-agent-summoner.sh +1 -1
  10. package/hooks/atlas.sh +1 -1
  11. package/hooks/auto-slash-command.sh +1 -1
  12. package/hooks/auto-update-checker.sh +1 -1
  13. package/hooks/background-compaction.sh +1 -1
  14. package/hooks/background-notification.sh +1 -1
  15. package/hooks/code-quality-checker.sh +1 -1
  16. package/hooks/context-compression.sh +1 -1
  17. package/hooks/context-smart-alert.sh +1 -1
  18. package/hooks/context-window-monitor.sh +1 -1
  19. package/hooks/delegate-task-retry.sh +1 -1
  20. package/hooks/directory-agents-injector.sh +1 -1
  21. package/hooks/directory-readme-injector.sh +1 -1
  22. package/hooks/edit-error-recovery.sh +1 -1
  23. package/hooks/empty-task-response-detector.sh +1 -1
  24. package/hooks/error-friendly-display.sh +55 -12
  25. package/hooks/error-recovery.sh +1 -1
  26. package/hooks/failure-transparency.sh +1 -1
  27. package/hooks/first-use-onboarding.sh +1 -1
  28. package/hooks/hook-performance-monitor.sh +1 -1
  29. package/hooks/interactive-bash-session.sh +1 -1
  30. package/hooks/keyword-detector.sh +25 -5
  31. package/hooks/lib/message-dedup.sh +1 -1
  32. package/hooks/lsp-tools.sh +1 -1
  33. package/hooks/operation-history.sh +1 -1
  34. package/hooks/output-truncator.sh +1 -1
  35. package/hooks/preemptive-compaction.sh +1 -1
  36. package/hooks/progress-notifier.sh +1 -1
  37. package/hooks/ralph-loop.sh +2 -2
  38. package/hooks/rules-injector.sh +1 -1
  39. package/hooks/session-recovery.sh +1 -1
  40. package/hooks/task-checkpointing.sh +1 -1
  41. package/hooks/think-mode.sh +1 -1
  42. package/hooks/thinking-block-validator.sh +1 -1
  43. package/hooks/todo-continuation.sh +2 -2
  44. package/hooks/tool-output-validator.sh +1 -1
  45. package/package.json +1 -1
  46. package/scripts/install.sh +6 -4
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://code.claude.com/plugin-schema.json",
3
3
  "name": "oh-my-claude",
4
- "version": "2.1.4",
4
+ "version": "2.1.6",
5
5
  "hooks": "./hooks/hooks.json",
6
6
  "description": "基于中国传统文化的 Claude Code 智能编排插件 - A Claude Code plugin inspired by Chinese traditional culture",
7
7
  "author": "ZDragon17",
package/README.md CHANGED
@@ -803,6 +803,8 @@ model: sonnet
803
803
  - [x] v2.1.2 - **用户体验简化** 🎯(`/do` 作为唯一入口、精简帮助输出)
804
804
  - [x] v2.1.3 - **版本检测修复** 🐛(plugin.json 版本同步)
805
805
  - [x] v2.1.4 - **用户体验第三轮** ✨(工作流模板、偏好设置、友好错误、自诊断)
806
+ - [x] v2.1.5 - **macOS 兼容性修复** 🍎(Shell 脚本跨平台兼容、grep 语法修复)
807
+ - [x] v2.1.6 - **稳定性与精准度优化** 🎯(关键词误判修复、愚公循环增强、Hook 去重)
806
808
 
807
809
  ## 🤝 贡献
808
810
 
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # agent-collaboration.sh - 多 Agent 协作协议处理器
4
4
  # 处理 @agent 调用语法,支持多 Agent 间的无缝协作
@@ -4,27 +4,11 @@
4
4
  #
5
5
  # 触发时机: PostToolUse (Task 工具完成后)
6
6
  # 功能: 根据完成的 Agent 类型,智能推荐下一步操作
7
+ #
8
+ # 兼容性: macOS (bash 3.2+), Linux (bash 4.0+), Windows (Git Bash)
7
9
 
8
- # 错误处理设置
9
- set -o pipefail
10
-
11
- # 超时保护 (最大执行时间 1.5 秒)
12
- TIMEOUT_SECONDS=1.5
13
-
14
- # 超时处理函数
15
- timeout_handler() {
16
- # 静默退出,不影响用户体验
17
- exit 0
18
- }
19
-
20
- # 设置超时 trap (如果支持)
21
- if command -v timeout >/dev/null 2>&1; then
22
- # 使用 timeout 命令包装主逻辑
23
- TIMEOUT_AVAILABLE=true
24
- else
25
- # 没有 timeout 命令,使用简单的执行
26
- TIMEOUT_AVAILABLE=false
27
- fi
10
+ # 错误捕获:任何错误都静默退出,不影响用户体验
11
+ trap 'exit 0' ERR EXIT
28
12
 
29
13
  # 获取工具输出(带默认值保护)
30
14
  TOOL_OUTPUT="${CLAUDE_TOOL_OUTPUT:-}"
@@ -37,7 +21,8 @@ if [ -z "$TOOL_OUTPUT" ]; then
37
21
  fi
38
22
 
39
23
  # 安全检查:如果工具输出过长(超过 50KB),跳过处理以避免性能问题
40
- OUTPUT_LENGTH=${#TOOL_OUTPUT}
24
+ # 使用 wc -c 替代 ${#var},更兼容老版本
25
+ OUTPUT_LENGTH=$(printf '%s' "$TOOL_OUTPUT" | wc -c | tr -d ' ')
41
26
  if [ "$OUTPUT_LENGTH" -gt 51200 ]; then
42
27
  exit 0
43
28
  fi
@@ -379,39 +364,70 @@ EOF
379
364
  }
380
365
 
381
366
  # 检测最后使用的 Agent(从输出中推断)
367
+ # 使用多个 grep 调用替代 \| 语法,提高 macOS 兼容性
382
368
  detect_agent() {
383
369
  local output="$1"
384
370
 
385
- # 检测常见的 Agent 标识
386
- if echo "$output" | grep -qi "扁鹊\|bianque\|诊断\|望闻问切"; then
371
+ # 检测常见的 Agent 标识(每个 Agent 使用独立的条件判断)
372
+ if echo "$output" | grep -qi "扁鹊" || \
373
+ echo "$output" | grep -qi "bianque" || \
374
+ echo "$output" | grep -qi "望闻问切"; then
387
375
  echo "bianque"
388
- elif echo "$output" | grep -qi "悟空\|wukong\|探索\|火眼金睛"; then
376
+ elif echo "$output" | grep -qi "悟空" || \
377
+ echo "$output" | grep -qi "wukong" || \
378
+ echo "$output" | grep -qi "火眼金睛"; then
389
379
  echo "wukong"
390
- elif echo "$output" | grep -qi "诸葛\|zhuge\|架构\|战略"; then
380
+ elif echo "$output" | grep -qi "诸葛" || \
381
+ echo "$output" | grep -qi "zhuge" || \
382
+ echo "$output" | grep -qi "架构设计"; then
391
383
  echo "zhuge"
392
- elif echo "$output" | grep -qi "鲁班\|luban\|实现\|巧匠"; then
384
+ elif echo "$output" | grep -qi "鲁班" || \
385
+ echo "$output" | grep -qi "luban" || \
386
+ echo "$output" | grep -qi "精工巧匠"; then
393
387
  echo "luban"
394
- elif echo "$output" | grep -qi "包拯\|baozheng\|测试\|TDD"; then
388
+ elif echo "$output" | grep -qi "包拯" || \
389
+ echo "$output" | grep -qi "baozheng" || \
390
+ echo "$output" | grep -qi "测试专家"; then
395
391
  echo "baozheng"
396
- elif echo "$output" | grep -qi "魏征\|weizheng\|审查\|review"; then
392
+ elif echo "$output" | grep -qi "魏征" || \
393
+ echo "$output" | grep -qi "weizheng" || \
394
+ echo "$output" | grep -qi "代码审查"; then
397
395
  echo "weizheng"
398
- elif echo "$output" | grep -qi "墨子\|mozi\|安全\|漏洞"; then
396
+ elif echo "$output" | grep -qi "墨子" || \
397
+ echo "$output" | grep -qi "mozi" || \
398
+ echo "$output" | grep -qi "安全审计"; then
399
399
  echo "mozi"
400
- elif echo "$output" | grep -qi "孙子\|sunzi\|性能\|优化"; then
400
+ elif echo "$output" | grep -qi "孙子" || \
401
+ echo "$output" | grep -qi "sunzi" || \
402
+ echo "$output" | grep -qi "性能优化"; then
401
403
  echo "sunzi"
402
- elif echo "$output" | grep -qi "李白\|libai\|需求\|用户故事"; then
404
+ elif echo "$output" | grep -qi "李白" || \
405
+ echo "$output" | grep -qi "libai" || \
406
+ echo "$output" | grep -qi "需求分析"; then
403
407
  echo "libai"
404
- elif echo "$output" | grep -qi "司马迁\|simaqian\|文档\|记录"; then
408
+ elif echo "$output" | grep -qi "司马迁" || \
409
+ echo "$output" | grep -qi "simaqian" || \
410
+ echo "$output" | grep -qi "文档撰写"; then
405
411
  echo "simaqian"
406
- elif echo "$output" | grep -qi "仓颉\|cangjie\|数据库\|SQL"; then
412
+ elif echo "$output" | grep -qi "仓颉" || \
413
+ echo "$output" | grep -qi "cangjie" || \
414
+ echo "$output" | grep -qi "数据库设计"; then
407
415
  echo "cangjie"
408
- elif echo "$output" | grep -qi "顾恺之\|gukaizhi\|UI\|界面"; then
416
+ elif echo "$output" | grep -qi "顾恺之" || \
417
+ echo "$output" | grep -qi "gukaizhi" || \
418
+ echo "$output" | grep -qi "界面美学"; then
409
419
  echo "gukaizhi"
410
- elif echo "$output" | grep -qi "李冰\|libing\|DevOps\|部署"; then
420
+ elif echo "$output" | grep -qi "李冰" || \
421
+ echo "$output" | grep -qi "libing" || \
422
+ echo "$output" | grep -qi "DevOps"; then
411
423
  echo "libing"
412
- elif echo "$output" | grep -qi "嫦娥\|change\|云\|serverless"; then
424
+ elif echo "$output" | grep -qi "嫦娥" || \
425
+ echo "$output" | grep -qi "change" || \
426
+ echo "$output" | grep -qi "云服务"; then
413
427
  echo "change"
414
- elif echo "$output" | grep -qi "老子\|laozi\|简化\|至简"; then
428
+ elif echo "$output" | grep -qi "老子" || \
429
+ echo "$output" | grep -qi "laozi" || \
430
+ echo "$output" | grep -qi "大道至简"; then
415
431
  echo "laozi"
416
432
  else
417
433
  echo "unknown"
@@ -435,8 +451,8 @@ main() {
435
451
  fi
436
452
  }
437
453
 
438
- # 错误捕获:如果发生错误,静默退出
439
- trap 'exit 0' ERR
454
+ # 移除 EXIT trap 以允许正常输出
455
+ trap - EXIT
440
456
 
441
457
  # 执行主函数
442
458
  main
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Agent Usage Reminder - Agent 使用提醒
4
4
  # ============================================================================
@@ -8,12 +8,17 @@
8
8
  # 1. 根据任务类型推荐合适的 Agent
9
9
  # 2. 提供 Agent 使用示例
10
10
  # 3. 避免过度提醒(有冷却期)
11
+ #
12
+ # 注意:
13
+ # - 此 Hook 优先级为 low,在 keyword-detector.sh 之后执行
14
+ # - 如果 keyword-detector 已经输出了推荐,此 Hook 不再重复
15
+ # - 主要用于补充 keyword-detector 未覆盖的场景
11
16
  # ============================================================================
12
17
 
13
18
  # 配置
14
19
  STATE_DIR=".claude"
15
20
  REMINDER_STATE_FILE="$STATE_DIR/agent-reminder-state.json"
16
- COOLDOWN_SECONDS=300 # 5 分钟冷却期
21
+ COOLDOWN_SECONDS=600 # 10 分钟冷却期(增加,避免打扰)
17
22
 
18
23
  # 获取用户输入
19
24
  user_input="${CLAUDE_USER_PROMPT:-}"
@@ -23,6 +28,21 @@ if [ -z "$user_input" ]; then
23
28
  exit 0
24
29
  fi
25
30
 
31
+ # 检查是否已经被 keyword-detector 覆盖(这些关键词 keyword-detector 已经处理)
32
+ # 如果匹配这些关键词,keyword-detector 已经给出了更详细的提示,此处跳过
33
+ if echo "$user_input" | grep -qiE '(愚公|移山|ultrawork|ulw|persist|yishan|yugong)'; then
34
+ exit 0
35
+ fi
36
+ if echo "$user_input" | grep -qiE '(扁鹊|bianque|debug|fix.*bug|报错|异常)'; then
37
+ exit 0
38
+ fi
39
+ if echo "$user_input" | grep -qiE '(墨子|mozi|security|安全|漏洞)'; then
40
+ exit 0
41
+ fi
42
+ if echo "$user_input" | grep -qiE '(孙子|sunzi|perf|性能|优化.*速度)'; then
43
+ exit 0
44
+ fi
45
+
26
46
  # 检查冷却期
27
47
  current_time=$(date +%s)
28
48
  last_reminder_time=0
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Agent 使用追踪器 - Agent Usage Tracker (PostToolUse Hook)
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # Anthropic Context Window Limit Recovery Hook
3
3
  # 功能:检测上下文窗口限制错误并提供恢复策略
4
4
  # 帮助在达到上下文限制时优雅地恢复工作
package/hooks/ast-grep.sh CHANGED
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # ast-grep.sh - AST-Grep 结构化代码搜索工具
4
4
  # 基于 AST (抽象语法树) 的代码搜索和重构
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # @Agent 召唤器 - At Agent Summoner Hook (UserPromptSubmit)
4
4
  # ============================================================================
package/hooks/atlas.sh CHANGED
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # Atlas Hook - 核心编排逻辑
3
3
  # 灵感来自希腊神话中托举天空的巨人阿特拉斯
4
4
  # 功能:提供工作流编排的核心指导和约束
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # 自动斜杠命令 - Auto Slash Command Hook (UserPromptSubmit)
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # auto-update-checker.sh - 自动更新检查器
4
4
  # 检查 oh-my-claude 是否有新版本可用
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # Background Compaction Hook
3
3
  # 功能:检测后台任务数量并建议清理完成的任务
4
4
  # 防止后台任务堆积导致资源浪费
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Background Notification Hook - 后台任务完成通知
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # code-quality-checker.sh - 代码质量检查器
4
4
  # 包含 comment-checker 和 thinking-block-validator 功能
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # context-compression.sh - 智能上下文压缩管理器
4
4
  # 解决 Claude 上下文限制,实现智能信息压缩和关键保留
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Context Smart Alert - 智能上下文预警 (Enhanced)
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Context Window Monitor - 上下文窗口监控器
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Delegate Task Retry Hook - 任务委派自动重试
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # directory-agents-injector.sh - 目录特定代理注入器
4
4
  # 根据当前工作目录自动注入相关的 Agent 配置
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # Directory README Injector Hook
3
3
  # 功能:检测当前目录的 README.md 并将关键信息注入上下文
4
4
  # 帮助 Agent 快速理解项目结构和约定
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # Edit Error Recovery Hook
3
3
  # 功能:检测编辑工具错误并提供恢复建议
4
4
  # 处理常见的 Edit 工具失败场景
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Empty Task Response Detector - 空任务响应检测器
4
4
  # ============================================================================
@@ -4,8 +4,12 @@
4
4
  #
5
5
  # 触发时机: PostToolUse
6
6
  # 功能: 检测错误并根据用户偏好显示友好的错误信息
7
+ #
8
+ # 兼容性: macOS (bash 3.2+), Linux (bash 4.0+), Windows (Git Bash)
7
9
 
10
+ # 遇到错误静默退出,不影响主流程
8
11
  set -e
12
+ trap 'exit 0' ERR
9
13
 
10
14
  # 获取输入
11
15
  TOOL_NAME="${CLAUDE_TOOL_NAME:-}"
@@ -33,65 +37,93 @@ get_verbosity() {
33
37
  }
34
38
 
35
39
  # 检测错误类型
40
+ # 使用多个 grep -qi 调用替代 -E 扩展正则,提高 macOS 兼容性
36
41
  detect_error_type() {
37
42
  local output="$1"
38
43
 
39
44
  # 权限错误
40
- if echo "$output" | grep -qiE "EACCES|EPERM|permission denied|access denied"; then
45
+ if echo "$output" | grep -qi "EACCES" || \
46
+ echo "$output" | grep -qi "EPERM" || \
47
+ echo "$output" | grep -qi "permission denied" || \
48
+ echo "$output" | grep -qi "access denied"; then
41
49
  echo "permission"
42
50
  return
43
51
  fi
44
52
 
45
53
  # 文件不存在
46
- if echo "$output" | grep -qiE "ENOENT|no such file|not found|does not exist"; then
54
+ if echo "$output" | grep -qi "ENOENT" || \
55
+ echo "$output" | grep -qi "no such file" || \
56
+ echo "$output" | grep -qi "not found" || \
57
+ echo "$output" | grep -qi "does not exist"; then
47
58
  echo "not_found"
48
59
  return
49
60
  fi
50
61
 
51
62
  # 网络错误
52
- if echo "$output" | grep -qiE "ECONNREFUSED|ETIMEDOUT|network|connection"; then
63
+ if echo "$output" | grep -qi "ECONNREFUSED" || \
64
+ echo "$output" | grep -qi "ETIMEDOUT" || \
65
+ echo "$output" | grep -qi "network" || \
66
+ echo "$output" | grep -qi "connection refused"; then
53
67
  echo "network"
54
68
  return
55
69
  fi
56
70
 
57
71
  # 语法错误
58
- if echo "$output" | grep -qiE "SyntaxError|ParseError|unexpected token|invalid syntax"; then
72
+ if echo "$output" | grep -qi "SyntaxError" || \
73
+ echo "$output" | grep -qi "ParseError" || \
74
+ echo "$output" | grep -qi "unexpected token" || \
75
+ echo "$output" | grep -qi "invalid syntax"; then
59
76
  echo "syntax"
60
77
  return
61
78
  fi
62
79
 
63
80
  # 类型错误
64
- if echo "$output" | grep -qiE "TypeError|cannot read|undefined is not|null is not"; then
81
+ if echo "$output" | grep -qi "TypeError" || \
82
+ echo "$output" | grep -qi "cannot read" || \
83
+ echo "$output" | grep -qi "undefined is not" || \
84
+ echo "$output" | grep -qi "null is not"; then
65
85
  echo "type"
66
86
  return
67
87
  fi
68
88
 
69
89
  # 内存错误
70
- if echo "$output" | grep -qiE "ENOMEM|out of memory|heap|allocation"; then
90
+ if echo "$output" | grep -qi "ENOMEM" || \
91
+ echo "$output" | grep -qi "out of memory" || \
92
+ echo "$output" | grep -qi "heap" || \
93
+ echo "$output" | grep -qi "allocation failed"; then
71
94
  echo "memory"
72
95
  return
73
96
  fi
74
97
 
75
98
  # 磁盘空间
76
- if echo "$output" | grep -qiE "ENOSPC|no space|disk full"; then
99
+ if echo "$output" | grep -qi "ENOSPC" || \
100
+ echo "$output" | grep -qi "no space" || \
101
+ echo "$output" | grep -qi "disk full"; then
77
102
  echo "disk"
78
103
  return
79
104
  fi
80
105
 
81
106
  # 超时
82
- if echo "$output" | grep -qiE "timeout|timed out|deadline exceeded"; then
107
+ if echo "$output" | grep -qi "timeout" || \
108
+ echo "$output" | grep -qi "timed out" || \
109
+ echo "$output" | grep -qi "deadline exceeded"; then
83
110
  echo "timeout"
84
111
  return
85
112
  fi
86
113
 
87
114
  # Git 错误
88
- if echo "$output" | grep -qiE "fatal:|error:.*git|conflict|merge"; then
115
+ if echo "$output" | grep -qi "^fatal:" || \
116
+ echo "$output" | grep -qi "git.*error" || \
117
+ echo "$output" | grep -qi "merge conflict"; then
89
118
  echo "git"
90
119
  return
91
120
  fi
92
121
 
93
122
  # 依赖错误
94
- if echo "$output" | grep -qiE "module not found|cannot find module|import error|no module named"; then
123
+ if echo "$output" | grep -qi "module not found" || \
124
+ echo "$output" | grep -qi "cannot find module" || \
125
+ echo "$output" | grep -qi "import error" || \
126
+ echo "$output" | grep -qi "no module named"; then
95
127
  echo "dependency"
96
128
  return
97
129
  fi
@@ -211,8 +243,19 @@ get_quick_fix() {
211
243
  main() {
212
244
  # 只处理有错误的情况
213
245
  if [ "$EXIT_CODE" = "0" ]; then
214
- # 检查输出中是否包含错误信息
215
- if ! echo "$TOOL_OUTPUT" | grep -qiE "error|failed|exception|fatal"; then
246
+ # 检查输出中是否包含错误信息(使用多个 grep 替代 -E)
247
+ has_error=false
248
+ if echo "$TOOL_OUTPUT" | grep -qi "error"; then
249
+ has_error=true
250
+ elif echo "$TOOL_OUTPUT" | grep -qi "failed"; then
251
+ has_error=true
252
+ elif echo "$TOOL_OUTPUT" | grep -qi "exception"; then
253
+ has_error=true
254
+ elif echo "$TOOL_OUTPUT" | grep -qi "^fatal:"; then
255
+ has_error=true
256
+ fi
257
+
258
+ if [ "$has_error" = "false" ]; then
216
259
  exit 0
217
260
  fi
218
261
  fi
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # error-recovery.sh - 任务恢复和错误重试机制
4
4
  # 实现智能错误检测、重试策略和任务恢复
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # 失败透明化 - Failure Transparency Hook (PostToolUse)
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # 渐进式引导检测 - Progressive Onboarding Hook (UserPromptSubmit)
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # Hook 性能监控
3
3
  # 追踪各 Hook 的执行时间,识别性能瓶颈
4
4
  # 触发时机: PostToolUse (周期性检查)
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Interactive Bash Session Hook - tmux 会话管理
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # 关键词检测器 - UserPromptSubmit Hook
3
3
  # 检测用户输入中的关键词并注入相应的上下文
4
4
  #
@@ -93,7 +93,12 @@ fi
93
93
  # 第五优先级:测试类(质量保障)
94
94
  # ============================================================================
95
95
 
96
- if echo "$prompt_lower" | grep -qE '(测试|单元测试|集成测试|test|unit[-_]?test|integration[-_]?test|tdd|jest|vitest|pytest|包拯|baozheng|开封|coverage|覆盖率|e2e|端到端)'; then
96
+ # 优化:移除单独的"测试"/"test",避免误触发
97
+ # "测试一下这个功能"不应触发测试模式
98
+ # 只有明确的测试开发需求才触发
99
+ if echo "$prompt_lower" | grep -qE '(单元测试|集成测试|unit[-_]?test|integration[-_]?test|tdd|jest|vitest|pytest|包拯|baozheng|开封|coverage|覆盖率|e2e|端到端|测试用例|test[-_]?case|测试覆盖|写测试|添加测试|补测试)' || \
100
+ echo "$prompt_lower" | grep -qE '(写|添加|补充|增加|创建).{0,5}测试' || \
101
+ echo "$prompt_lower" | grep -qE '测试.{0,5}(用例|覆盖|框架|策略)'; then
97
102
  cat << 'EOF'
98
103
  {
99
104
  "systemMessage": "\n\n⚖️ **包拯测试提示**\n\n检测到测试相关需求,建议:\n- 使用 /baozheng 命令进入测试模式\n- 包拯擅长:单元测试、集成测试、TDD、测试覆盖率分析\n"
@@ -119,7 +124,14 @@ fi
119
124
  # 第七优先级:性能类(慢就是问题)
120
125
  # ============================================================================
121
126
 
122
- if echo "$prompt_lower" | grep -qE '(性能|优化|慢|performance|optimize|slow|孙子|sunzi|perf|瓶颈|bottleneck|缓存|cache|内存|memory|cpu|加速)'; then
127
+ # 优化:移除单独的"优化"/"optimize",避免误触发
128
+ # "优化样式"、"优化布局"不应触发性能模式
129
+ # 只有明确的性能相关词才触发
130
+ if echo "$prompt_lower" | grep -qE '(性能|慢|slow|孙子|sunzi|perf|瓶颈|bottleneck|内存|memory|cpu|加速|响应时间|latency|qps|tps|并发|concurrent)' || \
131
+ echo "$prompt_lower" | grep -qE '优化.{0,5}(性能|速度|响应|延迟|内存|cpu|加载|渲染)' || \
132
+ echo "$prompt_lower" | grep -qE '(性能|速度|响应|延迟|加载|渲染).{0,5}优化' || \
133
+ echo "$prompt_lower" | grep -qE 'optimi[sz]e.{0,10}(performance|speed|memory|cpu|loading)' || \
134
+ echo "$prompt_lower" | grep -qE '(performance|speed|memory|cpu|loading).{0,10}optimi[sz]'; then
123
135
  cat << 'EOF'
124
136
  {
125
137
  "systemMessage": "\n\n⚔️ **孙子性能提示**\n\n检测到性能相关问题,建议:\n- 使用 /sunzi 命令进入性能优化模式\n- 孙子擅长:性能分析、瓶颈定位、优化策略\n"
@@ -132,7 +144,11 @@ fi
132
144
  # 第八优先级:API/集成类
133
145
  # ============================================================================
134
146
 
135
- if echo "$prompt_lower" | grep -qE '(api|接口|集成|对接|integrate|webhook|sdk|rest|graphql|grpc|郑和|zhenghe|西洋|第三方|openapi|swagger)'; then
147
+ # 优化:移除单独的"接口",避免误触发
148
+ # "接口报错了"应该触发扁鹊,不是郑和
149
+ # 只有明确的 API 开发/集成需求才触发
150
+ if echo "$prompt_lower" | grep -qE '(api|集成|对接|integrate|webhook|sdk|rest[-_]?api|graphql|grpc|郑和|zhenghe|西洋|第三方|openapi|swagger|调用.{0,5}接口|接口.{0,5}(设计|开发|封装|对接))' || \
151
+ echo "$prompt_lower" | grep -qE '(设计|开发|封装|对接|调用).{0,5}(api|接口)'; then
136
152
  cat << 'EOF'
137
153
  {
138
154
  "systemMessage": "\n\n⛵ **郑和 API 提示**\n\n检测到 API/集成相关需求,建议:\n- 使用 /zhenghe 命令进入 API 模式\n- 郑和擅长:API 集成、SDK 封装、外部服务对接\n"
@@ -249,7 +265,11 @@ fi
249
265
  # 第十七优先级:文档类
250
266
  # ============================================================================
251
267
 
252
- if echo "$prompt_lower" | grep -qE '(文档|注释|记录|document|comment|readme|changelog|history|司马迁|simaqian|史记|shiji|wiki)'; then
268
+ # 优化:移除单独的"记录",避免误触发
269
+ # "记录一下状态"不应触发文档模式
270
+ # 只有明确的文档撰写需求才触发
271
+ if echo "$prompt_lower" | grep -qE '(文档|注释|readme|changelog|司马迁|simaqian|史记|shiji|wiki|写.{0,3}(文档|注释)|添加.{0,3}注释|(api|接口).{0,3}文档|技术文档|使用文档)' || \
272
+ echo "$prompt_lower" | grep -qE '(撰写|编写|更新|完善).{0,5}文档'; then
253
273
  cat << 'EOF'
254
274
  {
255
275
  "systemMessage": "\n\n📜 **司马迁文档提示**\n\n检测到文档相关需求,建议:\n- 使用 /simaqian 命令进入文档模式\n- 司马迁擅长:技术文档撰写、变更记录、代码注释\n"
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # 消息去重工具库 - Message Deduplication Library
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # lsp-tools.sh - LSP (Language Server Protocol) 工具集成
4
4
  # 提供类型信息、符号定义、引用查找等 IDE 级别的代码分析能力
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # 操作历史记录 - Operation History Hook (PostToolUse)
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # output-truncator.sh - 输出管理和截断器
4
4
  # 智能截断大型输出,防止令牌溢出
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # preemptive-compaction.sh - 抢占式上下文压缩
4
4
  # 在达到令牌限制之前主动压缩上下文,避免硬性截断
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # 进度通知器 - Progress Notifier (PostToolUse Hook)
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Ralph Loop Hook - 自引用循环控制
4
4
  # ============================================================================
@@ -51,6 +51,6 @@ if [ -f "$RALPH_STATE_FILE" ]; then
51
51
  fi
52
52
 
53
53
  # 返回 JSON 阻止退出并注入继续指令
54
- printf '{"decision":"block","systemMessage":"\\n\\n🔄 **Ralph Loop 第 %d 次迭代**\\n\\n[自检] 任务是否完成?\\n\\n## 继续条件\\n- 检查 TODO 列表,如有未完成项则继续工作\\n- 验证所有要求都已满足\\n\\n## 完成条件\\n当所有任务完成后:\\n1. 输出: <promise>%s</promise>\\n2. 使用 /cancel-ralph 结束循环\\n\\n**如果任务未完成,继续工作。不要停止。**\\n"}\n' "$NEXT_ITERATION" "$COMPLETION_PROMISE"
54
+ printf '{"decision":"block","systemMessage":"\\n\\n🔄 **Ralph Loop 第 %d 次迭代**\\n\\n## 强制自检流程\\n\\n**必须执行以下步骤:**\\n\\n1. 调用 `mcp_todoread` 工具查看当前 TODO 列表\\n2. 检查是否有 `pending` 或 `in_progress` 状态的任务\\n3. 如果有未完成任务 → 继续工作,不要停止\\n4. 如果所有任务都是 `completed` → 执行结束流程\\n\\n## 结束方式\\n\\n当所有 TODO 完成后:\\n1. 向用户报告任务完成\\n2. 执行: `rm -f .claude/ralph-loop.local.md` 删除循环状态文件\\n3. 循环将自动结束\\n\\n**⚠️ 不要跳过 todoread 检查!**\\n"}\n' "$NEXT_ITERATION"
55
55
 
56
56
  exit 0
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # rules-injector.sh - 规则注入系统
4
4
  # 根据项目和目录自动注入自定义规则
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Session Recovery Hook - 会话恢复机制
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # task-checkpointing.sh - 任务断点续传管理器
4
4
  # 解决 Claude 上下文限制,实现长任务的智能断点和恢复
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # think-mode.sh - 思维模式 Hook
4
4
  # 启用深度思考和推理模式,增强复杂问题分析
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Thinking Block Validator - 思维块验证器
4
4
  # ============================================================================
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # TODO 续航检查器 (Todo Continuation Checker)
4
4
  # ============================================================================
@@ -44,6 +44,6 @@ fi
44
44
 
45
45
  # 返回 JSON 阻止退出
46
46
  # 注意:使用 printf 而不是 echo 来确保正确的 JSON 格式
47
- printf '{"decision":"block","systemMessage":"\\n\\n🏔️ **愚公移山 第 %d 次搬石**\\n\\n[自检] 检查 TODO 列表,如有未完成项则继续工作。\\n\\n如果所有任务已完成,请输出: <promise>移山完毕</promise>\\n然后使用 /cancel-yishan 结束循环。\\n"}\n' "$NEXT_ITERATION"
47
+ printf '{"decision":"block","systemMessage":"\\n\\n🏔️ **愚公移山 第 %d 次搬石**\\n\\n## 强制自检流程\\n\\n**必须执行以下步骤:**\\n\\n1. 调用 `mcp_todoread` 工具查看当前 TODO 列表\\n2. 检查是否有 `pending` 或 `in_progress` 状态的任务\\n3. 如果有未完成任务 → 继续工作,不要停止\\n4. 如果所有任务都是 `completed` → 执行结束流程\\n\\n## 结束方式\\n\\n当所有 TODO 完成后:\\n1. 向用户报告任务完成\\n2. 执行: `rm -f .claude/yishan-loop.local.md` 删除循环状态文件\\n3. 循环将自动结束\\n\\n**⚠️ 不要跳过 todoread 检查!**\\n"}\n' "$NEXT_ITERATION"
48
48
 
49
49
  exit 0
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
  # ============================================================================
3
3
  # Tool Output Validator - 工具输出验证器 (PostToolUse Hook)
4
4
  # ============================================================================
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-pangu",
3
- "version": "2.1.4",
3
+ "version": "2.1.6",
4
4
  "description": "基于中国传统文化的 Claude Code 智能编排插件 - A Claude Code plugin inspired by Chinese traditional culture (原名 oh-my-claude)",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -1,8 +1,10 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # oh-my-claude 一键安装脚本
4
4
  # 用法: curl -fsSL https://raw.githubusercontent.com/ZDragon17/oh-my-claude/main/scripts/install.sh | bash
5
5
  # 或者: wget -qO- https://raw.githubusercontent.com/ZDragon17/oh-my-claude/main/scripts/install.sh | bash
6
+ #
7
+ # 兼容性: macOS (bash 3.2+), Linux (bash 4.0+), Windows (Git Bash)
6
8
 
7
9
  set -e
8
10
 
@@ -41,13 +43,13 @@ show_banner() {
41
43
  check_dependencies() {
42
44
  info "检查依赖..."
43
45
 
44
- # 检查 git
45
- if ! command -v git &> /dev/null; then
46
+ # 检查 git (使用 >/dev/null 2>&1 替代 &> 以兼容 bash 3.2)
47
+ if ! command -v git >/dev/null 2>&1; then
46
48
  error "需要 git,请先安装: https://git-scm.com/"
47
49
  fi
48
50
 
49
51
  # 检查 Claude Code
50
- if ! command -v claude &> /dev/null; then
52
+ if ! command -v claude >/dev/null 2>&1; then
51
53
  warn "未检测到 Claude Code CLI"
52
54
  warn "请先安装 Claude Code: https://claude.ai/code"
53
55
  warn "安装后重新运行此脚本"