@k2works/claude-code-booster 0.8.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.
Files changed (71) hide show
  1. package/lib/assets/.claude/README.md +54 -136
  2. package/lib/assets/.claude/assets/.gitkeep +0 -0
  3. package/lib/assets/.claude/commands/git-commit.md +47 -0
  4. package/lib/assets/.claude/commands/ops.md +16 -16
  5. package/lib/assets/.claude/scripts/.gitkeep +0 -0
  6. package/lib/assets/README.md +76 -2
  7. package/lib/assets/apps/.gitkeep +0 -0
  8. package/package.json +1 -1
  9. package/lib/assets/.claude/agents/roles/analyzer.md +0 -267
  10. package/lib/assets/.claude/agents/roles/architect.md +0 -233
  11. package/lib/assets/.claude/agents/roles/backend.md +0 -303
  12. package/lib/assets/.claude/agents/roles/frontend.md +0 -294
  13. package/lib/assets/.claude/agents/roles/mobile.md +0 -309
  14. package/lib/assets/.claude/agents/roles/performance.md +0 -254
  15. package/lib/assets/.claude/agents/roles/qa.md +0 -266
  16. package/lib/assets/.claude/agents/roles/reviewer.md +0 -252
  17. package/lib/assets/.claude/agents/roles/security.md +0 -392
  18. package/lib/assets/.claude/assets/confirm.mp3 +0 -0
  19. package/lib/assets/.claude/assets/perfect.mp3 +0 -0
  20. package/lib/assets/.claude/assets/silent.wav +0 -0
  21. package/lib/assets/.claude/commands/analyze-dependencies.md +0 -158
  22. package/lib/assets/.claude/commands/analyze-performance.md +0 -116
  23. package/lib/assets/.claude/commands/check-fact.md +0 -104
  24. package/lib/assets/.claude/commands/check-github-ci.md +0 -53
  25. package/lib/assets/.claude/commands/check-prompt.md +0 -461
  26. package/lib/assets/.claude/commands/commit-message.md +0 -348
  27. package/lib/assets/.claude/commands/context7.md +0 -50
  28. package/lib/assets/.claude/commands/design-patterns.md +0 -186
  29. package/lib/assets/.claude/commands/explain-code.md +0 -75
  30. package/lib/assets/.claude/commands/fix-error.md +0 -258
  31. package/lib/assets/.claude/commands/multi-role.md +0 -291
  32. package/lib/assets/.claude/commands/next.md +0 -136
  33. package/lib/assets/.claude/commands/pr-auto-update.md +0 -460
  34. package/lib/assets/.claude/commands/pr-create.md +0 -249
  35. package/lib/assets/.claude/commands/pr-feedback.md +0 -143
  36. package/lib/assets/.claude/commands/pr-issue.md +0 -78
  37. package/lib/assets/.claude/commands/pr-list.md +0 -66
  38. package/lib/assets/.claude/commands/pr-review.md +0 -142
  39. package/lib/assets/.claude/commands/refactor.md +0 -147
  40. package/lib/assets/.claude/commands/role-debate.md +0 -571
  41. package/lib/assets/.claude/commands/role-help.md +0 -276
  42. package/lib/assets/.claude/commands/role.md +0 -360
  43. package/lib/assets/.claude/commands/screenshot.md +0 -103
  44. package/lib/assets/.claude/commands/search-gemini.md +0 -66
  45. package/lib/assets/.claude/commands/semantic-commit.md +0 -1129
  46. package/lib/assets/.claude/commands/sequential-thinking.md +0 -90
  47. package/lib/assets/.claude/commands/show-plan.md +0 -59
  48. package/lib/assets/.claude/commands/smart-review.md +0 -174
  49. package/lib/assets/.claude/commands/spec.md +0 -559
  50. package/lib/assets/.claude/commands/style-ai-writing.md +0 -186
  51. package/lib/assets/.claude/commands/task.md +0 -223
  52. package/lib/assets/.claude/commands/tech-debt.md +0 -87
  53. package/lib/assets/.claude/commands/ultrathink.md +0 -65
  54. package/lib/assets/.claude/commands/update-dart-doc.md +0 -202
  55. package/lib/assets/.claude/commands/update-doc-string.md +0 -306
  56. package/lib/assets/.claude/commands/update-flutter-deps.md +0 -105
  57. package/lib/assets/.claude/commands/update-node-deps.md +0 -105
  58. package/lib/assets/.claude/commands/update-rust-deps.md +0 -107
  59. package/lib/assets/.claude/scripts/auto-comment.sh +0 -16
  60. package/lib/assets/.claude/scripts/check-ai-commit.sh +0 -20
  61. package/lib/assets/.claude/scripts/check-continue.sh +0 -97
  62. package/lib/assets/.claude/scripts/check-locales.sh +0 -1080
  63. package/lib/assets/.claude/scripts/check-project-plan.sh +0 -25
  64. package/lib/assets/.claude/scripts/debug-hook.sh +0 -7
  65. package/lib/assets/.claude/scripts/deny-check.sh +0 -69
  66. package/lib/assets/.claude/scripts/install.sh +0 -174
  67. package/lib/assets/.claude/scripts/ja-space-exclusions.json +0 -18
  68. package/lib/assets/.claude/scripts/ja-space-format.sh +0 -45
  69. package/lib/assets/.claude/scripts/preserve-file-permissions.sh +0 -83
  70. package/lib/assets/.claude/scripts/statusline.sh +0 -153
  71. /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,7 +0,0 @@
1
- #!/bin/bash
2
-
3
- # Hook デバッグ用スクリプト
4
- echo "Hook executed at $(date)" >>/tmp/claude-hook-debug.log
5
- echo "Input data:" >>/tmp/claude-hook-debug.log
6
- cat >>/tmp/claude-hook-debug.log
7
- echo "---" >>/tmp/claude-hook-debug.log
@@ -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,18 +0,0 @@
1
- {
2
- "exclusions": [
3
- "ANAマイレージクラブ",
4
- "JALカード",
5
- "ANAカード",
6
- "JR東日本",
7
- "JR九州",
8
- "JR西日本",
9
- "SPY×FAMILY",
10
- "マンガMee",
11
- "コミックDAYS",
12
- "ジャンプTOON",
13
- "少年ジャンプ+",
14
- "少年ジャンプ+",
15
- "ジャンプSQ",
16
- "NTTドコモ"
17
- ]
18
- }
@@ -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 "$@"