@k2works/claude-code-booster 0.7.0 → 0.9.0
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.
- package/lib/assets/.claude/README.md +54 -136
- package/lib/assets/.claude/assets/.gitkeep +0 -0
- package/lib/assets/.claude/commands/git-commit.md +47 -0
- package/lib/assets/.claude/commands/ops.md +16 -16
- package/lib/assets/.claude/scripts/.gitkeep +0 -0
- package/lib/assets/.github/workflows/docker-publish.yml +77 -0
- package/lib/assets/README.md +122 -0
- package/lib/assets/apps/.gitkeep +0 -0
- package/package.json +1 -1
- package/lib/assets/.claude/agents/roles/analyzer.md +0 -267
- package/lib/assets/.claude/agents/roles/architect.md +0 -233
- package/lib/assets/.claude/agents/roles/backend.md +0 -303
- package/lib/assets/.claude/agents/roles/frontend.md +0 -294
- package/lib/assets/.claude/agents/roles/mobile.md +0 -309
- package/lib/assets/.claude/agents/roles/performance.md +0 -254
- package/lib/assets/.claude/agents/roles/qa.md +0 -266
- package/lib/assets/.claude/agents/roles/reviewer.md +0 -252
- package/lib/assets/.claude/agents/roles/security.md +0 -392
- package/lib/assets/.claude/assets/confirm.mp3 +0 -0
- package/lib/assets/.claude/assets/perfect.mp3 +0 -0
- package/lib/assets/.claude/assets/silent.wav +0 -0
- package/lib/assets/.claude/commands/analyze-dependencies.md +0 -158
- package/lib/assets/.claude/commands/analyze-performance.md +0 -116
- package/lib/assets/.claude/commands/check-fact.md +0 -104
- package/lib/assets/.claude/commands/check-github-ci.md +0 -53
- package/lib/assets/.claude/commands/check-prompt.md +0 -461
- package/lib/assets/.claude/commands/commit-message.md +0 -348
- package/lib/assets/.claude/commands/context7.md +0 -50
- package/lib/assets/.claude/commands/design-patterns.md +0 -186
- package/lib/assets/.claude/commands/explain-code.md +0 -75
- package/lib/assets/.claude/commands/fix-error.md +0 -258
- package/lib/assets/.claude/commands/multi-role.md +0 -291
- package/lib/assets/.claude/commands/next.md +0 -136
- package/lib/assets/.claude/commands/pr-auto-update.md +0 -460
- package/lib/assets/.claude/commands/pr-create.md +0 -249
- package/lib/assets/.claude/commands/pr-feedback.md +0 -143
- package/lib/assets/.claude/commands/pr-issue.md +0 -78
- package/lib/assets/.claude/commands/pr-list.md +0 -66
- package/lib/assets/.claude/commands/pr-review.md +0 -142
- package/lib/assets/.claude/commands/refactor.md +0 -147
- package/lib/assets/.claude/commands/role-debate.md +0 -571
- package/lib/assets/.claude/commands/role-help.md +0 -276
- package/lib/assets/.claude/commands/role.md +0 -360
- package/lib/assets/.claude/commands/screenshot.md +0 -103
- package/lib/assets/.claude/commands/search-gemini.md +0 -66
- package/lib/assets/.claude/commands/semantic-commit.md +0 -1129
- package/lib/assets/.claude/commands/sequential-thinking.md +0 -90
- package/lib/assets/.claude/commands/show-plan.md +0 -59
- package/lib/assets/.claude/commands/smart-review.md +0 -174
- package/lib/assets/.claude/commands/spec.md +0 -559
- package/lib/assets/.claude/commands/style-ai-writing.md +0 -186
- package/lib/assets/.claude/commands/task.md +0 -223
- package/lib/assets/.claude/commands/tech-debt.md +0 -87
- package/lib/assets/.claude/commands/ultrathink.md +0 -65
- package/lib/assets/.claude/commands/update-dart-doc.md +0 -202
- package/lib/assets/.claude/commands/update-doc-string.md +0 -306
- package/lib/assets/.claude/commands/update-flutter-deps.md +0 -105
- package/lib/assets/.claude/commands/update-node-deps.md +0 -105
- package/lib/assets/.claude/commands/update-rust-deps.md +0 -107
- package/lib/assets/.claude/scripts/auto-comment.sh +0 -16
- package/lib/assets/.claude/scripts/check-ai-commit.sh +0 -20
- package/lib/assets/.claude/scripts/check-continue.sh +0 -97
- package/lib/assets/.claude/scripts/check-locales.sh +0 -1080
- package/lib/assets/.claude/scripts/check-project-plan.sh +0 -25
- package/lib/assets/.claude/scripts/debug-hook.sh +0 -7
- package/lib/assets/.claude/scripts/deny-check.sh +0 -69
- package/lib/assets/.claude/scripts/install.sh +0 -174
- package/lib/assets/.claude/scripts/ja-space-exclusions.json +0 -18
- package/lib/assets/.claude/scripts/ja-space-format.sh +0 -45
- package/lib/assets/.claude/scripts/preserve-file-permissions.sh +0 -83
- package/lib/assets/.claude/scripts/statusline.sh +0 -153
- /package/lib/assets/{app → .claude/agents/roles}/.gitkeep +0 -0
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# 現在のセッションでプランが存在するかチェック
|
|
4
|
-
check_project_plan() {
|
|
5
|
-
local todos_dir="$HOME/.claude/todos"
|
|
6
|
-
|
|
7
|
-
# 現在のセッション ID を取得
|
|
8
|
-
local current_session_id="$CLAUDE_SESSION_ID"
|
|
9
|
-
if [ -z "$current_session_id" ]; then
|
|
10
|
-
return 1
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
# 現在のセッションの TODO ファイルが存在するかチェック
|
|
14
|
-
local plan_file="$todos_dir/$current_session_id.json"
|
|
15
|
-
if [ -f "$plan_file" ]; then
|
|
16
|
-
return 0 # 現在のセッションの TODO が存在
|
|
17
|
-
else
|
|
18
|
-
return 1 # 現在のセッションの TODO が存在しない
|
|
19
|
-
fi
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
# メイン処理
|
|
23
|
-
if check_project_plan; then
|
|
24
|
-
echo '{"continue": false, "stopReason": "💡 /show-plan でプランを確認"}'
|
|
25
|
-
fi
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# JSON 入力を読み取り、コマンドとツール名を抽出
|
|
4
|
-
input=$(cat)
|
|
5
|
-
command=$(echo "$input" | jq -r '.tool_input.command' 2>/dev/null || echo "")
|
|
6
|
-
tool_name=$(echo "$input" | jq -r '.tool_name' 2>/dev/null || echo "")
|
|
7
|
-
|
|
8
|
-
# Bash コマンドのみをチェック
|
|
9
|
-
if [ "$tool_name" != "Bash" ]; then
|
|
10
|
-
exit 0
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
# settings.json から拒否パターンを読み取り
|
|
14
|
-
settings_file="$HOME/.claude/settings.json"
|
|
15
|
-
|
|
16
|
-
# Bash コマンドの全拒否パターンを取得
|
|
17
|
-
deny_patterns=$(jq -r '.permissions.deny[] | select(startswith("Bash(")) | gsub("^Bash\\("; "") | gsub("\\)$"; "")' "$settings_file" 2>/dev/null)
|
|
18
|
-
|
|
19
|
-
# コマンドが拒否パターンにマッチするかチェックする関数
|
|
20
|
-
matches_deny_pattern() {
|
|
21
|
-
local cmd="$1"
|
|
22
|
-
local pattern="$2"
|
|
23
|
-
|
|
24
|
-
# 先頭・末尾の空白を削除
|
|
25
|
-
cmd="${cmd#"${cmd%%[![:space:]]*}"}" # 先頭の空白を削除
|
|
26
|
-
cmd="${cmd%"${cmd##*[![:space:]]}"}" # 末尾の空白を削除
|
|
27
|
-
|
|
28
|
-
# glob パターンマッチング(ワイルドカード対応)
|
|
29
|
-
[[ "$cmd" == $pattern ]]
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
# まずコマンド全体をチェック
|
|
33
|
-
while IFS= read -r pattern; do
|
|
34
|
-
# 空行をスキップ
|
|
35
|
-
[ -z "$pattern" ] && continue
|
|
36
|
-
|
|
37
|
-
# コマンド全体がパターンにマッチするかチェック
|
|
38
|
-
if matches_deny_pattern "$command" "$pattern"; then
|
|
39
|
-
echo "Error: コマンドが拒否されました: '$command' (パターン: '$pattern')" >&2
|
|
40
|
-
exit 2
|
|
41
|
-
fi
|
|
42
|
-
done <<<"$deny_patterns"
|
|
43
|
-
|
|
44
|
-
# コマンドを論理演算子で分割し、各部分もチェック
|
|
45
|
-
# セミコロン、&& と || で分割(パイプ | と単一 & は分割しない)
|
|
46
|
-
temp_command="${command//;/$'\n'}"
|
|
47
|
-
temp_command="${temp_command//&&/$'\n'}"
|
|
48
|
-
temp_command="${temp_command//\|\|/$'\n'}"
|
|
49
|
-
|
|
50
|
-
IFS=$'\n'
|
|
51
|
-
for cmd_part in $temp_command; do
|
|
52
|
-
# 空の部分をスキップ
|
|
53
|
-
[ -z "$(echo "$cmd_part" | tr -d '[:space:]')" ] && continue
|
|
54
|
-
|
|
55
|
-
# 各拒否パターンに対してチェック
|
|
56
|
-
while IFS= read -r pattern; do
|
|
57
|
-
# 空行をスキップ
|
|
58
|
-
[ -z "$pattern" ] && continue
|
|
59
|
-
|
|
60
|
-
# このコマンド部分がパターンにマッチするかチェック
|
|
61
|
-
if matches_deny_pattern "$cmd_part" "$pattern"; then
|
|
62
|
-
echo "Error: コマンドが拒否されました: '$cmd_part' (パターン: '$pattern')" >&2
|
|
63
|
-
exit 2
|
|
64
|
-
fi
|
|
65
|
-
done <<<"$deny_patterns"
|
|
66
|
-
done
|
|
67
|
-
|
|
68
|
-
# コマンドを許可
|
|
69
|
-
exit 0
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Language installation script
|
|
4
|
-
# Usage: ./scripts/install.sh <language>
|
|
5
|
-
# Example: ./scripts/install.sh en
|
|
6
|
-
# ./scripts/install.sh ja
|
|
7
|
-
# ./scripts/install.sh zh
|
|
8
|
-
|
|
9
|
-
set -e
|
|
10
|
-
|
|
11
|
-
# Show usage
|
|
12
|
-
show_usage() {
|
|
13
|
-
echo "Usage: $0 <language>"
|
|
14
|
-
echo ""
|
|
15
|
-
echo "Supported languages:"
|
|
16
|
-
echo " ja - Japanese (default)"
|
|
17
|
-
echo " en - English"
|
|
18
|
-
echo " zh-cn, zh, cn - Chinese"
|
|
19
|
-
echo " ko - Korean"
|
|
20
|
-
echo " pt - Portuguese"
|
|
21
|
-
echo " es - Spanish"
|
|
22
|
-
echo ""
|
|
23
|
-
echo "Examples:"
|
|
24
|
-
echo " $0 ja # Switch to Japanese (default)"
|
|
25
|
-
echo " $0 en # Switch to English"
|
|
26
|
-
echo " $0 zh-cn # Switch to Chinese"
|
|
27
|
-
echo " $0 ko # Switch to Korean"
|
|
28
|
-
echo " $0 pt # Switch to Portuguese"
|
|
29
|
-
echo " $0 es # Switch to Spanish"
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
# Argument check
|
|
33
|
-
if [ $# -eq 0 ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
|
|
34
|
-
show_usage
|
|
35
|
-
exit 0
|
|
36
|
-
fi
|
|
37
|
-
|
|
38
|
-
LANG_CODE="$1"
|
|
39
|
-
|
|
40
|
-
# Language support check
|
|
41
|
-
case "$LANG_CODE" in
|
|
42
|
-
ja | jp)
|
|
43
|
-
LANG_CODE="ja"
|
|
44
|
-
LANG_NAME="Japanese"
|
|
45
|
-
;;
|
|
46
|
-
en)
|
|
47
|
-
LANG_NAME="English"
|
|
48
|
-
;;
|
|
49
|
-
zh | cn | zh-cn)
|
|
50
|
-
LANG_CODE="zh-cn"
|
|
51
|
-
LANG_NAME="Chinese"
|
|
52
|
-
;;
|
|
53
|
-
ko | kr)
|
|
54
|
-
LANG_CODE="ko"
|
|
55
|
-
LANG_NAME="Korean"
|
|
56
|
-
;;
|
|
57
|
-
pt | br)
|
|
58
|
-
LANG_CODE="pt"
|
|
59
|
-
LANG_NAME="Portuguese"
|
|
60
|
-
;;
|
|
61
|
-
es)
|
|
62
|
-
LANG_NAME="Spanish"
|
|
63
|
-
;;
|
|
64
|
-
*)
|
|
65
|
-
echo "❌ Error: Unsupported language code '$LANG_CODE'"
|
|
66
|
-
echo ""
|
|
67
|
-
show_usage
|
|
68
|
-
exit 1
|
|
69
|
-
;;
|
|
70
|
-
esac
|
|
71
|
-
|
|
72
|
-
# Get script directory
|
|
73
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
74
|
-
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
75
|
-
|
|
76
|
-
echo "🔄 Setting language to ${LANG_NAME} (${LANG_CODE})..."
|
|
77
|
-
|
|
78
|
-
# Target directories
|
|
79
|
-
DIRS=("$PROJECT_ROOT/commands" "$PROJECT_ROOT/agents/roles")
|
|
80
|
-
|
|
81
|
-
# Success/failure counters
|
|
82
|
-
SUCCESS_COUNT=0
|
|
83
|
-
SKIP_COUNT=0
|
|
84
|
-
ERROR_COUNT=0
|
|
85
|
-
|
|
86
|
-
# Process each directory
|
|
87
|
-
for DIR in "${DIRS[@]}"; do
|
|
88
|
-
if [ ! -d "$DIR" ]; then
|
|
89
|
-
echo "⚠️ Directory does not exist: $DIR"
|
|
90
|
-
continue
|
|
91
|
-
fi
|
|
92
|
-
|
|
93
|
-
echo "📁 Processing: $DIR"
|
|
94
|
-
|
|
95
|
-
# Find all .md files (excluding language-specific ones)
|
|
96
|
-
while IFS= read -r BASE_FILE; do
|
|
97
|
-
# Get base filename and relative path
|
|
98
|
-
BASE_NAME=$(basename "$BASE_FILE" .md)
|
|
99
|
-
REL_PATH=${DIR#$PROJECT_ROOT/}
|
|
100
|
-
|
|
101
|
-
# For non-Japanese languages, copy from locales directory
|
|
102
|
-
if [ "$LANG_CODE" != "ja" ]; then
|
|
103
|
-
# Language-specific file path in locales directory
|
|
104
|
-
LANG_FILE="$PROJECT_ROOT/locales/$LANG_CODE/$REL_PATH/$BASE_NAME.md"
|
|
105
|
-
|
|
106
|
-
if [ -f "$LANG_FILE" ]; then
|
|
107
|
-
echo " 📝 Updating $BASE_NAME.md with ${LANG_NAME} version..."
|
|
108
|
-
|
|
109
|
-
# Overwrite base file with language version
|
|
110
|
-
cp "$LANG_FILE" "$BASE_FILE"
|
|
111
|
-
|
|
112
|
-
echo " ✅ Updated $BASE_NAME.md"
|
|
113
|
-
((SUCCESS_COUNT++))
|
|
114
|
-
else
|
|
115
|
-
echo " ⚠️ ${LANG_NAME} version does not exist: $LANG_FILE"
|
|
116
|
-
((SKIP_COUNT++))
|
|
117
|
-
fi
|
|
118
|
-
else
|
|
119
|
-
# For Japanese, restore from locales/ja if exists, otherwise keep current
|
|
120
|
-
JA_FILE="$PROJECT_ROOT/locales/ja/$REL_PATH/$BASE_NAME.md"
|
|
121
|
-
|
|
122
|
-
if [ -f "$JA_FILE" ]; then
|
|
123
|
-
echo " 📝 Restoring Japanese version of $BASE_NAME.md..."
|
|
124
|
-
cp "$JA_FILE" "$BASE_FILE"
|
|
125
|
-
echo " ✅ Restored $BASE_NAME.md"
|
|
126
|
-
((SUCCESS_COUNT++))
|
|
127
|
-
else
|
|
128
|
-
echo " ℹ️ Using existing Japanese version: $BASE_NAME.md"
|
|
129
|
-
((SKIP_COUNT++))
|
|
130
|
-
fi
|
|
131
|
-
fi
|
|
132
|
-
done < <(find "$DIR" -name "*.md" -type f)
|
|
133
|
-
done
|
|
134
|
-
|
|
135
|
-
# Copy CLAUDE.md and COMMAND_TEMPLATE.md files for the selected language (Japanese is default, no copy needed)
|
|
136
|
-
if [ "$LANG_CODE" != "ja" ]; then
|
|
137
|
-
# Copy CLAUDE.md
|
|
138
|
-
CLAUDE_FILE="$PROJECT_ROOT/CLAUDE.md"
|
|
139
|
-
LANG_CLAUDE="$PROJECT_ROOT/locales/$LANG_CODE/CLAUDE.md"
|
|
140
|
-
if [ -f "$LANG_CLAUDE" ]; then
|
|
141
|
-
echo "📝 Updating CLAUDE.md with ${LANG_NAME} version..."
|
|
142
|
-
cp "$LANG_CLAUDE" "$CLAUDE_FILE"
|
|
143
|
-
echo "✅ Updated CLAUDE.md"
|
|
144
|
-
else
|
|
145
|
-
echo "⚠️ ${LANG_NAME} version of CLAUDE.md does not exist"
|
|
146
|
-
fi
|
|
147
|
-
|
|
148
|
-
# Copy COMMAND_TEMPLATE.md
|
|
149
|
-
TEMPLATE_FILE="$PROJECT_ROOT/COMMAND_TEMPLATE.md"
|
|
150
|
-
LANG_TEMPLATE="$PROJECT_ROOT/locales/$LANG_CODE/COMMAND_TEMPLATE.md"
|
|
151
|
-
if [ -f "$LANG_TEMPLATE" ]; then
|
|
152
|
-
echo "📝 Updating COMMAND_TEMPLATE.md with ${LANG_NAME} version..."
|
|
153
|
-
cp "$LANG_TEMPLATE" "$TEMPLATE_FILE"
|
|
154
|
-
echo "✅ Updated COMMAND_TEMPLATE.md"
|
|
155
|
-
else
|
|
156
|
-
echo "⚠️ ${LANG_NAME} version of COMMAND_TEMPLATE.md does not exist"
|
|
157
|
-
fi
|
|
158
|
-
fi
|
|
159
|
-
|
|
160
|
-
echo ""
|
|
161
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
162
|
-
echo "🎉 Language configuration complete!"
|
|
163
|
-
echo " 🌍 Language: ${LANG_NAME} (${LANG_CODE})"
|
|
164
|
-
echo " ✅ Updated: $SUCCESS_COUNT files"
|
|
165
|
-
if [ $SKIP_COUNT -gt 0 ]; then
|
|
166
|
-
echo " ⏭️ Skipped: $SKIP_COUNT files"
|
|
167
|
-
fi
|
|
168
|
-
if [ $ERROR_COUNT -gt 0 ]; then
|
|
169
|
-
echo " ❌ Errors: $ERROR_COUNT files"
|
|
170
|
-
fi
|
|
171
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
172
|
-
echo ""
|
|
173
|
-
echo "💡 All commands are now available in ${LANG_NAME}"
|
|
174
|
-
echo " Examples: /plan, /commit-message, /refactor, etc."
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
# 日本語と半角英数字の間に半角スペースを挿入
|
|
5
|
-
|
|
6
|
-
# ファイルパス取得
|
|
7
|
-
if [ -n "${1:-}" ]; then
|
|
8
|
-
file_path="$1"
|
|
9
|
-
else
|
|
10
|
-
file_path=$(jq -r '.tool_input.file_path // empty' <<<"${CLAUDE_TOOL_INPUT:-$(cat)}")
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
# 基本チェック
|
|
14
|
-
[ -z "$file_path" ] || [ ! -f "$file_path" ] || [ ! -r "$file_path" ] || [ ! -w "$file_path" ] && exit 0
|
|
15
|
-
|
|
16
|
-
# 除外リスト
|
|
17
|
-
EXCLUSIONS_FILE="$(dirname "${BASH_SOURCE[0]}")/ja-space-exclusions.json"
|
|
18
|
-
|
|
19
|
-
# 一時ファイルで処理
|
|
20
|
-
temp_file=$(mktemp)
|
|
21
|
-
trap 'rm -f "$temp_file"' EXIT
|
|
22
|
-
|
|
23
|
-
# 基本的なスペース挿入
|
|
24
|
-
sed -E \
|
|
25
|
-
-e 's/([ぁ-ゟァ-ヿ一-鿿㐀-䶿])([a-zA-Z0-9])/\1 \2/g' \
|
|
26
|
-
-e 's/([a-zA-Z0-9])([ぁ-ゟァ-ヿ一-鿿㐀-䶿])/\1 \2/g' \
|
|
27
|
-
-e 's/([ぁ-ゟァ-ヿ一-鿿㐀-䶿])(\()/\1 \2/g' \
|
|
28
|
-
-e 's/(\))([ぁ-ゟァ-ヿ一-鿿㐀-䶿])/\1 \2/g' \
|
|
29
|
-
-e 's/(\))([a-zA-Z0-9])/\1 \2/g' \
|
|
30
|
-
-e 's/\$\(([^)]*)\) ([0-9])/\$(\1)\2/g' \
|
|
31
|
-
-e 's/(%)([ぁ-ゟァ-ヿ一-鿿㐀-䶿])/\1 \2/g' \
|
|
32
|
-
-e 's/([((\[{][^))\]}]*[))\]}])\s+(の|と|で|が|を|は|に)/\1\2/g' \
|
|
33
|
-
"$file_path" >"$temp_file"
|
|
34
|
-
|
|
35
|
-
# 除外リスト適用
|
|
36
|
-
if [ -f "$EXCLUSIONS_FILE" ] && command -v jq >/dev/null 2>&1; then
|
|
37
|
-
while IFS= read -r pattern; do
|
|
38
|
-
[ -z "$pattern" ] && continue
|
|
39
|
-
escaped="${pattern//[\[\\.^$()|*+?{]/\\&}"
|
|
40
|
-
spaced=$(sed -E 's/([ぁ-ゟァ-ヿ一-鿿㐀-䶿])([a-zA-Z0-9])/\1 \2/g; s/([a-zA-Z0-9])([ぁ-ゟァ-ヿ一-鿿㐀-䶿])/\1 \2/g' <<<"$escaped")
|
|
41
|
-
sed -i '' "s/$spaced/$pattern/g" "$temp_file"
|
|
42
|
-
done < <(jq -r '.exclusions[]' "$EXCLUSIONS_FILE" 2>/dev/null)
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
mv "$temp_file" "$file_path"
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# デバッグログ
|
|
4
|
-
DEBUG_LOG="/tmp/claude_permissions_debug.log"
|
|
5
|
-
|
|
6
|
-
# 権限を保存するための一時ファイル
|
|
7
|
-
PERMISSIONS_CACHE="/tmp/claude_file_permissions.txt"
|
|
8
|
-
|
|
9
|
-
# 標準入力から JSON を読み込み
|
|
10
|
-
input_json=$(cat)
|
|
11
|
-
|
|
12
|
-
# JSON から必要な情報を抽出
|
|
13
|
-
hook_type=$(echo "$input_json" | jq -r '.hook_event_name // ""')
|
|
14
|
-
tool_name=$(echo "$input_json" | jq -r '.tool_name // ""')
|
|
15
|
-
file_path=$(echo "$input_json" | jq -r '.tool_input.file_path // ""')
|
|
16
|
-
|
|
17
|
-
# デバッグ情報を記録
|
|
18
|
-
echo "[$(date)] Hook: $hook_type, Tool: $tool_name, File: $file_path" >>"$DEBUG_LOG"
|
|
19
|
-
|
|
20
|
-
# ファイル操作系のツールのみ対象
|
|
21
|
-
case "$tool_name" in
|
|
22
|
-
Write | Edit | MultiEdit) ;;
|
|
23
|
-
*)
|
|
24
|
-
# 何もせずに通過
|
|
25
|
-
echo "$input_json"
|
|
26
|
-
exit 0
|
|
27
|
-
;;
|
|
28
|
-
esac
|
|
29
|
-
|
|
30
|
-
# ファイルパスが空の場合は通過
|
|
31
|
-
if [ -z "$file_path" ]; then
|
|
32
|
-
echo "$input_json"
|
|
33
|
-
exit 0
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
if [ "$hook_type" = "PreToolUse" ]; then
|
|
37
|
-
# ファイルが存在する場合、現在の権限を記録
|
|
38
|
-
if [ -f "$file_path" ]; then
|
|
39
|
-
# 権限を取得(8 進数形式)
|
|
40
|
-
current_perms=$(stat -f "%OLp" "$file_path" 2>/dev/null || stat -c "%a" "$file_path" 2>/dev/null)
|
|
41
|
-
if [ -n "$current_perms" ]; then
|
|
42
|
-
# ファイルパスと権限を保存
|
|
43
|
-
echo "${file_path}:${current_perms}" >>"$PERMISSIONS_CACHE"
|
|
44
|
-
echo "Saved permissions for $file_path: $current_perms" >&2
|
|
45
|
-
echo "[$(date)] PreToolUse: Saved $file_path with permissions $current_perms" >>"$DEBUG_LOG"
|
|
46
|
-
fi
|
|
47
|
-
fi
|
|
48
|
-
|
|
49
|
-
elif [ "$hook_type" = "PostToolUse" ]; then
|
|
50
|
-
# 保存された権限があれば復元
|
|
51
|
-
if [ -f "$PERMISSIONS_CACHE" ]; then
|
|
52
|
-
# 該当ファイルの権限を検索
|
|
53
|
-
saved_entry=$(grep "^${file_path}:" "$PERMISSIONS_CACHE" | tail -1)
|
|
54
|
-
if [ -n "$saved_entry" ]; then
|
|
55
|
-
saved_perms=$(echo "$saved_entry" | cut -d: -f2)
|
|
56
|
-
if [ -n "$saved_perms" ] && [ -f "$file_path" ]; then
|
|
57
|
-
chmod "$saved_perms" "$file_path" 2>/dev/null
|
|
58
|
-
if [ $? -eq 0 ]; then
|
|
59
|
-
echo "Restored permissions for $file_path: $saved_perms" >&2
|
|
60
|
-
echo "[$(date)] PostToolUse: Restored $file_path to permissions $saved_perms" >>"$DEBUG_LOG"
|
|
61
|
-
|
|
62
|
-
# バックグラウンドで 3 秒待ってから再度権限を設定
|
|
63
|
-
(
|
|
64
|
-
sleep 3
|
|
65
|
-
chmod "$saved_perms" "$file_path" 2>/dev/null
|
|
66
|
-
if [ $? -eq 0 ]; then
|
|
67
|
-
echo "[$(date)] PostToolUse: Re-restored $file_path to permissions $saved_perms (delayed 3s)" >>"$DEBUG_LOG"
|
|
68
|
-
fi
|
|
69
|
-
) &
|
|
70
|
-
|
|
71
|
-
# キャッシュから該当エントリを削除
|
|
72
|
-
grep -v "^${file_path}:" "$PERMISSIONS_CACHE" >"${PERMISSIONS_CACHE}.tmp" || true
|
|
73
|
-
mv "${PERMISSIONS_CACHE}.tmp" "$PERMISSIONS_CACHE" 2>/dev/null || true
|
|
74
|
-
else
|
|
75
|
-
echo "Failed to restore permissions for $file_path" >&2
|
|
76
|
-
fi
|
|
77
|
-
fi
|
|
78
|
-
fi
|
|
79
|
-
fi
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
# 入力をそのまま出力(変更なし)
|
|
83
|
-
echo "$input_json"
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Constants
|
|
4
|
-
readonly MAX_CONTEXT=160000 # 200K * 0.8
|
|
5
|
-
readonly CACHE_FILE="/tmp/claude_statusline_cost_cache"
|
|
6
|
-
readonly CACHE_TTL=60 # seconds
|
|
7
|
-
|
|
8
|
-
# Calculate daily cost using ccusage
|
|
9
|
-
calculate_daily_cost() {
|
|
10
|
-
if ! command -v ccusage >/dev/null 2>&1; then
|
|
11
|
-
echo "0"
|
|
12
|
-
return
|
|
13
|
-
fi
|
|
14
|
-
|
|
15
|
-
local today
|
|
16
|
-
today=$(date +%Y%m%d)
|
|
17
|
-
|
|
18
|
-
local ccusage_output
|
|
19
|
-
ccusage_output=$(ccusage daily --json --since "$today" --until "$today" 2>/dev/null)
|
|
20
|
-
|
|
21
|
-
if [ -z "$ccusage_output" ]; then
|
|
22
|
-
echo "0"
|
|
23
|
-
return
|
|
24
|
-
fi
|
|
25
|
-
|
|
26
|
-
local cost
|
|
27
|
-
cost=$(echo "$ccusage_output" | jq -r ".daily | to_entries | .[0].value.totalCost // 0" 2>/dev/null)
|
|
28
|
-
|
|
29
|
-
if [ -n "$cost" ] && [ "$cost" != "0" ]; then
|
|
30
|
-
echo "$cost"
|
|
31
|
-
else
|
|
32
|
-
echo "0"
|
|
33
|
-
fi
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
# Get cached cost or recalculate
|
|
37
|
-
get_cached_cost() {
|
|
38
|
-
local today
|
|
39
|
-
today=$(date +%Y-%m-%d)
|
|
40
|
-
|
|
41
|
-
# Check if cache exists and is recent
|
|
42
|
-
if [ -f "$CACHE_FILE" ]; then
|
|
43
|
-
local cache_date cache_cost cache_age
|
|
44
|
-
cache_date=$(head -1 "$CACHE_FILE" 2>/dev/null)
|
|
45
|
-
cache_cost=$(tail -1 "$CACHE_FILE" 2>/dev/null)
|
|
46
|
-
cache_age=$(($(date +%s) - $(stat -f %m "$CACHE_FILE" 2>/dev/null || echo 0)))
|
|
47
|
-
|
|
48
|
-
# Use cache if it's from today and fresh
|
|
49
|
-
if [ "$cache_date" = "$today" ] && [ "$cache_age" -le "$CACHE_TTL" ]; then
|
|
50
|
-
echo "${cache_cost:-0.00}"
|
|
51
|
-
return
|
|
52
|
-
fi
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
# Calculate and cache new cost
|
|
56
|
-
local cost
|
|
57
|
-
cost=$(calculate_daily_cost)
|
|
58
|
-
cost="${cost:-0.00}"
|
|
59
|
-
|
|
60
|
-
# Update cache
|
|
61
|
-
echo "$today" >"$CACHE_FILE"
|
|
62
|
-
echo "$cost" >>"$CACHE_FILE"
|
|
63
|
-
|
|
64
|
-
echo "$cost"
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
# Calculate token usage percentage
|
|
68
|
-
calculate_usage_percentage() {
|
|
69
|
-
local total_tokens="$1"
|
|
70
|
-
|
|
71
|
-
if [ "$MAX_CONTEXT" -eq 0 ]; then
|
|
72
|
-
echo "0.0"
|
|
73
|
-
return
|
|
74
|
-
fi
|
|
75
|
-
|
|
76
|
-
local usage_percent
|
|
77
|
-
usage_percent=$(echo "scale=1; $total_tokens * 100 / $MAX_CONTEXT" | bc -l 2>/dev/null || echo "0")
|
|
78
|
-
|
|
79
|
-
# Cap at 100%
|
|
80
|
-
if (($(echo "$usage_percent > 100" | bc -l 2>/dev/null))); then
|
|
81
|
-
echo "100.0"
|
|
82
|
-
else
|
|
83
|
-
echo "$usage_percent"
|
|
84
|
-
fi
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
# Get token usage from transcript
|
|
88
|
-
get_token_usage() {
|
|
89
|
-
local session_id="$1"
|
|
90
|
-
local transcript_dir="$2"
|
|
91
|
-
local transcript_file="$transcript_dir/$session_id.jsonl"
|
|
92
|
-
|
|
93
|
-
if [ ! -f "$transcript_file" ]; then
|
|
94
|
-
echo "0"
|
|
95
|
-
return
|
|
96
|
-
fi
|
|
97
|
-
|
|
98
|
-
# Get last usage entry (cumulative)
|
|
99
|
-
local last_usage
|
|
100
|
-
last_usage=$(grep '"usage"' "$transcript_file" 2>/dev/null | tail -1 | jq '.message.usage' 2>/dev/null)
|
|
101
|
-
|
|
102
|
-
if [ -z "$last_usage" ] || [ "$last_usage" = "null" ]; then
|
|
103
|
-
echo "0"
|
|
104
|
-
return
|
|
105
|
-
fi
|
|
106
|
-
|
|
107
|
-
# Sum all token types
|
|
108
|
-
local input output cache_creation cache_read
|
|
109
|
-
input=$(echo "$last_usage" | jq -r '.input_tokens // 0')
|
|
110
|
-
output=$(echo "$last_usage" | jq -r '.output_tokens // 0')
|
|
111
|
-
cache_creation=$(echo "$last_usage" | jq -r '.cache_creation_input_tokens // 0')
|
|
112
|
-
cache_read=$(echo "$last_usage" | jq -r '.cache_read_input_tokens // 0')
|
|
113
|
-
|
|
114
|
-
echo $((input + output + cache_creation + cache_read))
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
# Main
|
|
118
|
-
main() {
|
|
119
|
-
# Read JSON from stdin
|
|
120
|
-
local json_input
|
|
121
|
-
json_input=$(cat)
|
|
122
|
-
|
|
123
|
-
# Extract fields
|
|
124
|
-
local model session_id current_dir
|
|
125
|
-
model=$(echo "$json_input" | jq -r '.model.display_name // .model // "unknown"' 2>/dev/null)
|
|
126
|
-
session_id=$(echo "$json_input" | jq -r '.session_id // ""' 2>/dev/null)
|
|
127
|
-
current_dir=$(echo "$json_input" | jq -r '.workspace.current_dir // .cwd // "~"' 2>/dev/null)
|
|
128
|
-
|
|
129
|
-
# Build project directory path
|
|
130
|
-
local project_name transcript_dir
|
|
131
|
-
project_name="${current_dir//[\/.]/-}"
|
|
132
|
-
transcript_dir="$HOME/.claude/projects/$project_name"
|
|
133
|
-
|
|
134
|
-
# Get token usage
|
|
135
|
-
local total_tokens=0
|
|
136
|
-
if [ -n "$session_id" ] && [ -d "$transcript_dir" ]; then
|
|
137
|
-
total_tokens=$(get_token_usage "$session_id" "$transcript_dir")
|
|
138
|
-
fi
|
|
139
|
-
|
|
140
|
-
# Calculate usage percentage
|
|
141
|
-
local usage_percent
|
|
142
|
-
usage_percent=$(calculate_usage_percentage "$total_tokens")
|
|
143
|
-
|
|
144
|
-
# Get today's cost
|
|
145
|
-
local today_cost
|
|
146
|
-
today_cost=$(get_cached_cost)
|
|
147
|
-
today_cost=$(printf "%.2f" "$today_cost")
|
|
148
|
-
|
|
149
|
-
# Output status line
|
|
150
|
-
printf "🤖 %s | 💰 $%s | 📊 %s%%\n" "$model" "$today_cost" "$usage_percent"
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
main "$@"
|
|
File without changes
|