claude-pangu 2.3.1 → 2.3.2

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.2",
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,7 @@ 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 环境兼容性修复)
923
924
 
924
925
  ### v2.2.2 核心更新
925
926
 
@@ -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
 
@@ -68,7 +68,7 @@ detect_json_parse_error() {
68
68
  detect_specific_error() {
69
69
  local output="$1"
70
70
 
71
- if echo "$output" | grep -qiE 'Unexpected token.*position|at column'; then
71
+ if echo "$output" | grep -qiE 'Unexpected token.*position|at (column|position)|position [0-9]'; then
72
72
  echo "POSITION"
73
73
  return
74
74
  fi
@@ -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
  # 计算未完成总数
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-pangu",
3
- "version": "2.3.1",
3
+ "version": "2.3.2",
4
4
  "description": "基于中国传统文化的 Claude Code 智能编排插件 - A Claude Code plugin inspired by Chinese traditional culture (原名 oh-my-claude)",
5
5
  "keywords": [
6
6
  "claude-code",