claude-pangu 2.3.1 → 2.3.3

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.
@@ -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.3.1",
4
+ "version": "2.3.3",
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
@@ -920,6 +920,8 @@ model: sonnet
920
920
  - [x] v2.2.22 - **Hook 系统根本性修复** 🔧(stdin JSON 读取、PostToolUse 崩溃修复、WSL 符号链接保护)
921
921
  - [x] v2.3.0 - **oh-my-opencode v3.8.4 全面移植** 🚀(9 Agent 重写 + 6 新 Hook + 5 命令更新 + 4 技能升级)
922
922
  - [x] v2.3.1 - **Hook 注册修复** 🐛(syncHooksToSettings 完善 Wave 2 Hook 注册,新增 4 测试用例)
923
+ - [x] v2.3.2 - **Hook 无 jq 回退修复** 🐛(4 个 Hook 的 Windows/无 jq 环境兼容性修复)
924
+ - [x] v2.3.3 - **Hook 逻辑修复** 🐛(json-error-recovery 模式排序 + write-existing-file-guard 路径排除修复)
923
925
 
924
926
  ### v2.2.2 核心更新
925
927
 
@@ -32,7 +32,11 @@ if command -v jq > /dev/null 2>&1; then
32
32
  TOOL_INPUT=$(echo "$INPUT" | jq -c '.tool_input // empty' 2>/dev/null) || TOOL_INPUT=""
33
33
  else
34
34
  TOOL_NAME=$(echo "$INPUT" | grep -o '"tool_name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"tool_name"[[:space:]]*:[[:space:]]*"\([^"]*\)"/\1/' 2>/dev/null) || TOOL_NAME=""
35
- TOOL_INPUT=""
35
+ # 无 jq 时从 INPUT 原文提取文件路径用于路径排除
36
+ TOOL_INPUT=$(echo "$INPUT" | grep -o '"filePath"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"filePath"[[:space:]]*:[[:space:]]*"\([^"]*\)"/\1/' 2>/dev/null) || TOOL_INPUT=""
37
+ if [ -z "$TOOL_INPUT" ]; then
38
+ TOOL_INPUT=$(echo "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"\([^"]*\)"/\1/' 2>/dev/null) || TOOL_INPUT=""
39
+ fi
36
40
  fi
37
41
 
38
42
  # 只关注直接实现类工具(非探索/读取类)
@@ -41,6 +41,17 @@ CONTENT=""
41
41
  if command -v jq > /dev/null 2>&1; then
42
42
  # Write 工具: content 字段; Edit 工具: new_text/newString 字段
43
43
  CONTENT=$(echo "$INPUT" | jq -r '(.tool_input.content // .tool_input.new_text // .tool_input.newString // .tool_input.text // empty)' 2>/dev/null) || CONTENT=""
44
+ else
45
+ # 无 jq 时从 JSON 原文提取 content/text 字段
46
+ CONTENT=$(echo "$INPUT" | grep -o '"content"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"content"[[:space:]]*:[[:space:]]*"\([^"]*\)"/\1/' 2>/dev/null) || CONTENT=""
47
+ if [ -z "$CONTENT" ]; then
48
+ CONTENT=$(echo "$INPUT" | grep -o '"new_text"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"new_text"[[:space:]]*:[[:space:]]*"\([^"]*\)"/\1/' 2>/dev/null) || CONTENT=""
49
+ fi
50
+ if [ -z "$CONTENT" ]; then
51
+ CONTENT=$(echo "$INPUT" | grep -o '"text"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"text"[[:space:]]*:[[:space:]]*"\([^"]*\)"/\1/' 2>/dev/null) || CONTENT=""
52
+ fi
53
+ # 将 JSON 转义的 \\n 还原为真实换行
54
+ CONTENT=$(printf '%b' "$CONTENT" 2>/dev/null) || true
44
55
  fi
45
56
 
46
57
  # 没有内容可检查
@@ -47,7 +47,7 @@ detect_json_parse_error() {
47
47
  local output="$1"
48
48
 
49
49
  # 模式1: 标准 JSON 解析错误
50
- if echo "$output" | grep -qiE '(JSON\.parse|SyntaxError.*JSON|Unexpected token|JSON parse error|invalid json|json.*syntax)'; then
50
+ if echo "$output" | grep -qiE '(JSON\.parse|SyntaxError.*JSON|Unexpected token|JSON parse error|invalid json|json.*syntax|trailing comma|duplicate key)'; then
51
51
  return 0
52
52
  fi
53
53
 
@@ -67,27 +67,23 @@ detect_json_parse_error() {
67
67
  # 检测具体的 JSON 错误类型
68
68
  detect_specific_error() {
69
69
  local output="$1"
70
-
71
- if echo "$output" | grep -qiE 'Unexpected token.*position|at column'; then
72
- echo "POSITION"
73
- return
74
- fi
75
-
70
+ # STRING 检查必须在 POSITION 之前(POSITION 的 'at (column|position)' 会误匹配 STRING 类错误)
76
71
  if echo "$output" | grep -qiE 'Unterminated string|unclosed.*string'; then
77
72
  echo "STRING"
78
73
  return
79
74
  fi
80
-
81
75
  if echo "$output" | grep -qiE 'trailing comma|Expected.*}.*got.*,'; then
82
76
  echo "TRAILING_COMMA"
83
77
  return
84
78
  fi
85
-
79
+ if echo "$output" | grep -qiE 'Unexpected token.*position|at (column|position)|position [0-9]'; then
80
+ echo "POSITION"
81
+ return
82
+ fi
86
83
  if echo "$output" | grep -qiE 'Unexpected end|unexpected eof|incomplete'; then
87
84
  echo "INCOMPLETE"
88
85
  return
89
86
  fi
90
-
91
87
  echo "GENERIC"
92
88
  }
93
89
 
@@ -61,11 +61,11 @@ if command -v jq > /dev/null 2>&1; then
61
61
  # 获取未完成任务描述
62
62
  PENDING_TASKS=$(jq -r '[.todos // [] | .[] | select(.status == "pending" or .status == "in_progress") | .content] | join("\n - ")' "$TODO_FILE" 2>/dev/null) || PENDING_TASKS=""
63
63
  else
64
- # 无 jq 时使用 grep 粗略统计
65
- TOTAL_COUNT=$(grep -c '"status"' "$TODO_FILE" 2>/dev/null) || TOTAL_COUNT=0
66
- PENDING_COUNT=$(grep -c '"pending"' "$TODO_FILE" 2>/dev/null) || PENDING_COUNT=0
67
- IN_PROGRESS_COUNT=$(grep -c '"in_progress"' "$TODO_FILE" 2>/dev/null) || IN_PROGRESS_COUNT=0
68
- COMPLETED_COUNT=$(grep -c '"completed"' "$TODO_FILE" 2>/dev/null) || COMPLETED_COUNT=0
64
+ # 无 jq 时使用 grep -o 统计出现次数(而非 grep -c 统计行数,避免单行 JSON 计数错误)
65
+ TOTAL_COUNT=$(grep -o '"status"' "$TODO_FILE" 2>/dev/null | wc -l | tr -d ' ') || TOTAL_COUNT=0
66
+ PENDING_COUNT=$(grep -o '"pending"' "$TODO_FILE" 2>/dev/null | wc -l | tr -d ' ') || PENDING_COUNT=0
67
+ IN_PROGRESS_COUNT=$(grep -o '"in_progress"' "$TODO_FILE" 2>/dev/null | wc -l | tr -d ' ') || IN_PROGRESS_COUNT=0
68
+ COMPLETED_COUNT=$(grep -o '"completed"' "$TODO_FILE" 2>/dev/null | wc -l | tr -d ' ') || COMPLETED_COUNT=0
69
69
  fi
70
70
 
71
71
  # 计算未完成总数
@@ -78,7 +78,7 @@ fi
78
78
 
79
79
  # 允许对特定目录的文件覆写(内部管理文件)
80
80
  case "$FILE_PATH" in
81
- */.claude/*|*/oh-my-claude/*|*/.oh-my-claude/*|*/.sisyphus/*)
81
+ */.claude/*|*/.oh-my-claude/*|*/.sisyphus/*)
82
82
  exit 0
83
83
  ;;
84
84
  esac
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-pangu",
3
- "version": "2.3.1",
3
+ "version": "2.3.3",
4
4
  "description": "基于中国传统文化的 Claude Code 智能编排插件 - A Claude Code plugin inspired by Chinese traditional culture (原名 oh-my-claude)",
5
5
  "keywords": [
6
6
  "claude-code",