@hasna/terminal 2.2.0 → 2.3.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 (205) hide show
  1. package/dist/cli.js +29 -12
  2. package/package.json +1 -1
  3. package/src/ai.ts +50 -36
  4. package/src/cli.tsx +29 -12
  5. package/src/context-hints.ts +89 -0
  6. package/src/discover.ts +238 -0
  7. package/src/economy.ts +53 -0
  8. package/src/output-store.ts +65 -0
  9. package/src/providers/index.ts +4 -4
  10. package/src/sessions-db.ts +81 -0
  11. package/temp/rtk/.claude/agents/code-reviewer.md +221 -0
  12. package/temp/rtk/.claude/agents/debugger.md +519 -0
  13. package/temp/rtk/.claude/agents/rtk-testing-specialist.md +461 -0
  14. package/temp/rtk/.claude/agents/rust-rtk.md +511 -0
  15. package/temp/rtk/.claude/agents/technical-writer.md +355 -0
  16. package/temp/rtk/.claude/commands/diagnose.md +352 -0
  17. package/temp/rtk/.claude/commands/test-routing.md +362 -0
  18. package/temp/rtk/.claude/hooks/bash/pre-commit-format.sh +16 -0
  19. package/temp/rtk/.claude/hooks/rtk-rewrite.sh +70 -0
  20. package/temp/rtk/.claude/hooks/rtk-suggest.sh +152 -0
  21. package/temp/rtk/.claude/rules/cli-testing.md +526 -0
  22. package/temp/rtk/.claude/skills/issue-triage/SKILL.md +348 -0
  23. package/temp/rtk/.claude/skills/issue-triage/templates/issue-comment.md +134 -0
  24. package/temp/rtk/.claude/skills/performance.md +435 -0
  25. package/temp/rtk/.claude/skills/pr-triage/SKILL.md +315 -0
  26. package/temp/rtk/.claude/skills/pr-triage/templates/review-comment.md +71 -0
  27. package/temp/rtk/.claude/skills/repo-recap.md +206 -0
  28. package/temp/rtk/.claude/skills/rtk-tdd/SKILL.md +78 -0
  29. package/temp/rtk/.claude/skills/rtk-tdd/references/testing-patterns.md +124 -0
  30. package/temp/rtk/.claude/skills/security-guardian.md +503 -0
  31. package/temp/rtk/.claude/skills/ship.md +404 -0
  32. package/temp/rtk/.github/workflows/benchmark.yml +34 -0
  33. package/temp/rtk/.github/workflows/dco-check.yaml +12 -0
  34. package/temp/rtk/.github/workflows/release-please.yml +51 -0
  35. package/temp/rtk/.github/workflows/release.yml +343 -0
  36. package/temp/rtk/.github/workflows/security-check.yml +135 -0
  37. package/temp/rtk/.github/workflows/validate-docs.yml +78 -0
  38. package/temp/rtk/.release-please-manifest.json +3 -0
  39. package/temp/rtk/ARCHITECTURE.md +1491 -0
  40. package/temp/rtk/CHANGELOG.md +640 -0
  41. package/temp/rtk/CLAUDE.md +605 -0
  42. package/temp/rtk/CONTRIBUTING.md +199 -0
  43. package/temp/rtk/Cargo.lock +1668 -0
  44. package/temp/rtk/Cargo.toml +64 -0
  45. package/temp/rtk/Formula/rtk.rb +43 -0
  46. package/temp/rtk/INSTALL.md +390 -0
  47. package/temp/rtk/LICENSE +21 -0
  48. package/temp/rtk/README.md +386 -0
  49. package/temp/rtk/README_es.md +159 -0
  50. package/temp/rtk/README_fr.md +197 -0
  51. package/temp/rtk/README_ja.md +159 -0
  52. package/temp/rtk/README_ko.md +159 -0
  53. package/temp/rtk/README_zh.md +167 -0
  54. package/temp/rtk/ROADMAP.md +15 -0
  55. package/temp/rtk/SECURITY.md +217 -0
  56. package/temp/rtk/TEST_EXEC_TIME.md +102 -0
  57. package/temp/rtk/build.rs +57 -0
  58. package/temp/rtk/docs/AUDIT_GUIDE.md +432 -0
  59. package/temp/rtk/docs/FEATURES.md +1410 -0
  60. package/temp/rtk/docs/TROUBLESHOOTING.md +309 -0
  61. package/temp/rtk/docs/filter-workflow.md +102 -0
  62. package/temp/rtk/docs/images/gain-dashboard.jpg +0 -0
  63. package/temp/rtk/docs/tracking.md +583 -0
  64. package/temp/rtk/hooks/opencode-rtk.ts +39 -0
  65. package/temp/rtk/hooks/rtk-awareness.md +29 -0
  66. package/temp/rtk/hooks/rtk-rewrite.sh +61 -0
  67. package/temp/rtk/hooks/test-rtk-rewrite.sh +442 -0
  68. package/temp/rtk/install.sh +124 -0
  69. package/temp/rtk/release-please-config.json +10 -0
  70. package/temp/rtk/scripts/benchmark.sh +592 -0
  71. package/temp/rtk/scripts/check-installation.sh +162 -0
  72. package/temp/rtk/scripts/install-local.sh +37 -0
  73. package/temp/rtk/scripts/rtk-economics.sh +137 -0
  74. package/temp/rtk/scripts/test-all.sh +561 -0
  75. package/temp/rtk/scripts/test-aristote.sh +227 -0
  76. package/temp/rtk/scripts/test-tracking.sh +79 -0
  77. package/temp/rtk/scripts/update-readme-metrics.sh +32 -0
  78. package/temp/rtk/scripts/validate-docs.sh +73 -0
  79. package/temp/rtk/src/aws_cmd.rs +880 -0
  80. package/temp/rtk/src/binlog.rs +1645 -0
  81. package/temp/rtk/src/cargo_cmd.rs +1727 -0
  82. package/temp/rtk/src/cc_economics.rs +1157 -0
  83. package/temp/rtk/src/ccusage.rs +340 -0
  84. package/temp/rtk/src/config.rs +187 -0
  85. package/temp/rtk/src/container.rs +855 -0
  86. package/temp/rtk/src/curl_cmd.rs +134 -0
  87. package/temp/rtk/src/deps.rs +268 -0
  88. package/temp/rtk/src/diff_cmd.rs +367 -0
  89. package/temp/rtk/src/discover/mod.rs +274 -0
  90. package/temp/rtk/src/discover/provider.rs +388 -0
  91. package/temp/rtk/src/discover/registry.rs +2022 -0
  92. package/temp/rtk/src/discover/report.rs +202 -0
  93. package/temp/rtk/src/discover/rules.rs +667 -0
  94. package/temp/rtk/src/display_helpers.rs +402 -0
  95. package/temp/rtk/src/dotnet_cmd.rs +1771 -0
  96. package/temp/rtk/src/dotnet_format_report.rs +133 -0
  97. package/temp/rtk/src/dotnet_trx.rs +593 -0
  98. package/temp/rtk/src/env_cmd.rs +204 -0
  99. package/temp/rtk/src/filter.rs +462 -0
  100. package/temp/rtk/src/filters/README.md +52 -0
  101. package/temp/rtk/src/filters/ansible-playbook.toml +34 -0
  102. package/temp/rtk/src/filters/basedpyright.toml +47 -0
  103. package/temp/rtk/src/filters/biome.toml +45 -0
  104. package/temp/rtk/src/filters/brew-install.toml +37 -0
  105. package/temp/rtk/src/filters/composer-install.toml +40 -0
  106. package/temp/rtk/src/filters/df.toml +16 -0
  107. package/temp/rtk/src/filters/dotnet-build.toml +64 -0
  108. package/temp/rtk/src/filters/du.toml +16 -0
  109. package/temp/rtk/src/filters/fail2ban-client.toml +15 -0
  110. package/temp/rtk/src/filters/gcc.toml +49 -0
  111. package/temp/rtk/src/filters/gcloud.toml +22 -0
  112. package/temp/rtk/src/filters/hadolint.toml +24 -0
  113. package/temp/rtk/src/filters/helm.toml +29 -0
  114. package/temp/rtk/src/filters/iptables.toml +27 -0
  115. package/temp/rtk/src/filters/jj.toml +28 -0
  116. package/temp/rtk/src/filters/jq.toml +24 -0
  117. package/temp/rtk/src/filters/make.toml +41 -0
  118. package/temp/rtk/src/filters/markdownlint.toml +24 -0
  119. package/temp/rtk/src/filters/mix-compile.toml +27 -0
  120. package/temp/rtk/src/filters/mix-format.toml +15 -0
  121. package/temp/rtk/src/filters/mvn-build.toml +44 -0
  122. package/temp/rtk/src/filters/oxlint.toml +43 -0
  123. package/temp/rtk/src/filters/ping.toml +63 -0
  124. package/temp/rtk/src/filters/pio-run.toml +40 -0
  125. package/temp/rtk/src/filters/poetry-install.toml +50 -0
  126. package/temp/rtk/src/filters/pre-commit.toml +35 -0
  127. package/temp/rtk/src/filters/ps.toml +16 -0
  128. package/temp/rtk/src/filters/quarto-render.toml +41 -0
  129. package/temp/rtk/src/filters/rsync.toml +48 -0
  130. package/temp/rtk/src/filters/shellcheck.toml +27 -0
  131. package/temp/rtk/src/filters/shopify-theme.toml +29 -0
  132. package/temp/rtk/src/filters/skopeo.toml +45 -0
  133. package/temp/rtk/src/filters/sops.toml +16 -0
  134. package/temp/rtk/src/filters/ssh.toml +44 -0
  135. package/temp/rtk/src/filters/stat.toml +34 -0
  136. package/temp/rtk/src/filters/swift-build.toml +41 -0
  137. package/temp/rtk/src/filters/systemctl-status.toml +33 -0
  138. package/temp/rtk/src/filters/terraform-plan.toml +35 -0
  139. package/temp/rtk/src/filters/tofu-fmt.toml +16 -0
  140. package/temp/rtk/src/filters/tofu-init.toml +38 -0
  141. package/temp/rtk/src/filters/tofu-plan.toml +35 -0
  142. package/temp/rtk/src/filters/tofu-validate.toml +17 -0
  143. package/temp/rtk/src/filters/trunk-build.toml +39 -0
  144. package/temp/rtk/src/filters/ty.toml +50 -0
  145. package/temp/rtk/src/filters/uv-sync.toml +37 -0
  146. package/temp/rtk/src/filters/xcodebuild.toml +99 -0
  147. package/temp/rtk/src/filters/yamllint.toml +25 -0
  148. package/temp/rtk/src/find_cmd.rs +598 -0
  149. package/temp/rtk/src/format_cmd.rs +386 -0
  150. package/temp/rtk/src/gain.rs +723 -0
  151. package/temp/rtk/src/gh_cmd.rs +1651 -0
  152. package/temp/rtk/src/git.rs +2012 -0
  153. package/temp/rtk/src/go_cmd.rs +592 -0
  154. package/temp/rtk/src/golangci_cmd.rs +254 -0
  155. package/temp/rtk/src/grep_cmd.rs +288 -0
  156. package/temp/rtk/src/gt_cmd.rs +810 -0
  157. package/temp/rtk/src/hook_audit_cmd.rs +283 -0
  158. package/temp/rtk/src/hook_check.rs +171 -0
  159. package/temp/rtk/src/init.rs +1859 -0
  160. package/temp/rtk/src/integrity.rs +537 -0
  161. package/temp/rtk/src/json_cmd.rs +231 -0
  162. package/temp/rtk/src/learn/detector.rs +628 -0
  163. package/temp/rtk/src/learn/mod.rs +119 -0
  164. package/temp/rtk/src/learn/report.rs +184 -0
  165. package/temp/rtk/src/lint_cmd.rs +694 -0
  166. package/temp/rtk/src/local_llm.rs +316 -0
  167. package/temp/rtk/src/log_cmd.rs +248 -0
  168. package/temp/rtk/src/ls.rs +324 -0
  169. package/temp/rtk/src/main.rs +2482 -0
  170. package/temp/rtk/src/mypy_cmd.rs +389 -0
  171. package/temp/rtk/src/next_cmd.rs +241 -0
  172. package/temp/rtk/src/npm_cmd.rs +236 -0
  173. package/temp/rtk/src/parser/README.md +267 -0
  174. package/temp/rtk/src/parser/error.rs +46 -0
  175. package/temp/rtk/src/parser/formatter.rs +336 -0
  176. package/temp/rtk/src/parser/mod.rs +311 -0
  177. package/temp/rtk/src/parser/types.rs +119 -0
  178. package/temp/rtk/src/pip_cmd.rs +302 -0
  179. package/temp/rtk/src/playwright_cmd.rs +479 -0
  180. package/temp/rtk/src/pnpm_cmd.rs +573 -0
  181. package/temp/rtk/src/prettier_cmd.rs +221 -0
  182. package/temp/rtk/src/prisma_cmd.rs +482 -0
  183. package/temp/rtk/src/psql_cmd.rs +382 -0
  184. package/temp/rtk/src/pytest_cmd.rs +384 -0
  185. package/temp/rtk/src/read.rs +217 -0
  186. package/temp/rtk/src/rewrite_cmd.rs +50 -0
  187. package/temp/rtk/src/ruff_cmd.rs +402 -0
  188. package/temp/rtk/src/runner.rs +271 -0
  189. package/temp/rtk/src/summary.rs +297 -0
  190. package/temp/rtk/src/tee.rs +405 -0
  191. package/temp/rtk/src/telemetry.rs +248 -0
  192. package/temp/rtk/src/toml_filter.rs +1655 -0
  193. package/temp/rtk/src/tracking.rs +1416 -0
  194. package/temp/rtk/src/tree.rs +209 -0
  195. package/temp/rtk/src/tsc_cmd.rs +259 -0
  196. package/temp/rtk/src/utils.rs +432 -0
  197. package/temp/rtk/src/verify_cmd.rs +47 -0
  198. package/temp/rtk/src/vitest_cmd.rs +385 -0
  199. package/temp/rtk/src/wc_cmd.rs +401 -0
  200. package/temp/rtk/src/wget_cmd.rs +260 -0
  201. package/temp/rtk/tests/fixtures/dotnet/build_failed.txt +11 -0
  202. package/temp/rtk/tests/fixtures/dotnet/format_changes.json +31 -0
  203. package/temp/rtk/tests/fixtures/dotnet/format_empty.json +1 -0
  204. package/temp/rtk/tests/fixtures/dotnet/format_success.json +12 -0
  205. package/temp/rtk/tests/fixtures/dotnet/test_failed.txt +18 -0
@@ -0,0 +1,162 @@
1
+ #!/bin/bash
2
+ # RTK Installation Verification Script
3
+ # Helps diagnose if you have the correct rtk (Token Killer) installed
4
+
5
+ set -e
6
+
7
+ RED='\033[0;31m'
8
+ GREEN='\033[0;32m'
9
+ YELLOW='\033[1;33m'
10
+ NC='\033[0m' # No Color
11
+
12
+ echo "═══════════════════════════════════════════════════════════"
13
+ echo " RTK Installation Verification"
14
+ echo "═══════════════════════════════════════════════════════════"
15
+ echo ""
16
+
17
+ # Check 1: RTK installed?
18
+ echo "1. Checking if RTK is installed..."
19
+ if command -v rtk &> /dev/null; then
20
+ echo -e " ${GREEN}✅ RTK is installed${NC}"
21
+ RTK_PATH=$(which rtk)
22
+ echo " Location: $RTK_PATH"
23
+ else
24
+ echo -e " ${RED}❌ RTK is NOT installed${NC}"
25
+ echo ""
26
+ echo " Install with:"
27
+ echo " curl -fsSL https://github.com/rtk-ai/rtk/blob/master/install.sh| sh"
28
+ exit 1
29
+ fi
30
+ echo ""
31
+
32
+ # Check 2: RTK version
33
+ echo "2. Checking RTK version..."
34
+ RTK_VERSION=$(rtk --version 2>/dev/null || echo "unknown")
35
+ echo " Version: $RTK_VERSION"
36
+ echo ""
37
+
38
+ # Check 3: Is it Token Killer or Type Kit?
39
+ echo "3. Verifying this is Token Killer (not Type Kit)..."
40
+ if rtk gain &>/dev/null || rtk gain --help &>/dev/null; then
41
+ echo -e " ${GREEN}✅ CORRECT - You have Rust Token Killer${NC}"
42
+ CORRECT_RTK=true
43
+ else
44
+ echo -e " ${RED}❌ WRONG - You have Rust Type Kit (different project!)${NC}"
45
+ echo ""
46
+ echo " You installed the wrong package. Fix it with:"
47
+ echo " cargo uninstall rtk"
48
+ echo " curl -fsSL https://github.com/rtk-ai/rtk/blob/master/install.sh | sh"
49
+ CORRECT_RTK=false
50
+ fi
51
+ echo ""
52
+
53
+ if [ "$CORRECT_RTK" = false ]; then
54
+ echo "═══════════════════════════════════════════════════════════"
55
+ echo -e "${RED}INSTALLATION CHECK FAILED${NC}"
56
+ echo "═══════════════════════════════════════════════════════════"
57
+ exit 1
58
+ fi
59
+
60
+ # Check 4: Available features
61
+ echo "4. Checking available features..."
62
+ FEATURES=()
63
+ MISSING_FEATURES=()
64
+
65
+ check_command() {
66
+ local cmd=$1
67
+ local name=$2
68
+ if rtk --help 2>/dev/null | grep -qw "$cmd"; then
69
+ echo -e " ${GREEN}✅${NC} $name"
70
+ FEATURES+=("$name")
71
+ else
72
+ echo -e " ${YELLOW}⚠️${NC} $name (missing - upgrade to fork?)"
73
+ MISSING_FEATURES+=("$name")
74
+ fi
75
+ }
76
+
77
+ check_command "gain" "Token savings analytics"
78
+ check_command "git" "Git operations"
79
+ check_command "gh" "GitHub CLI"
80
+ check_command "pnpm" "pnpm support"
81
+ check_command "vitest" "Vitest test runner"
82
+ check_command "lint" "ESLint/linters"
83
+ check_command "tsc" "TypeScript compiler"
84
+ check_command "next" "Next.js"
85
+ check_command "prettier" "Prettier"
86
+ check_command "playwright" "Playwright E2E"
87
+ check_command "prisma" "Prisma ORM"
88
+ check_command "discover" "Discover missed savings"
89
+
90
+ echo ""
91
+
92
+ # Check 5: CLAUDE.md initialization
93
+ echo "5. Checking Claude Code integration..."
94
+ GLOBAL_INIT=false
95
+ LOCAL_INIT=false
96
+
97
+ if [ -f "$HOME/.claude/CLAUDE.md" ] && grep -q "rtk" "$HOME/.claude/CLAUDE.md"; then
98
+ echo -e " ${GREEN}✅${NC} Global CLAUDE.md initialized (~/.claude/CLAUDE.md)"
99
+ GLOBAL_INIT=true
100
+ else
101
+ echo -e " ${YELLOW}⚠️${NC} Global CLAUDE.md not initialized"
102
+ echo " Run: rtk init --global"
103
+ fi
104
+
105
+ if [ -f "./CLAUDE.md" ] && grep -q "rtk" "./CLAUDE.md"; then
106
+ echo -e " ${GREEN}✅${NC} Local CLAUDE.md initialized (./CLAUDE.md)"
107
+ LOCAL_INIT=true
108
+ else
109
+ echo -e " ${YELLOW}⚠️${NC} Local CLAUDE.md not initialized in current directory"
110
+ echo " Run: rtk init (in your project directory)"
111
+ fi
112
+ echo ""
113
+
114
+ # Check 6: Auto-rewrite hook
115
+ echo "6. Checking auto-rewrite hook (optional but recommended)..."
116
+ if [ -f "$HOME/.claude/hooks/rtk-rewrite.sh" ]; then
117
+ echo -e " ${GREEN}✅${NC} Hook script installed"
118
+ if [ -f "$HOME/.claude/settings.json" ] && grep -q "rtk-rewrite.sh" "$HOME/.claude/settings.json"; then
119
+ echo -e " ${GREEN}✅${NC} Hook enabled in settings.json"
120
+ else
121
+ echo -e " ${YELLOW}⚠️${NC} Hook script exists but not enabled in settings.json"
122
+ echo " See README.md 'Auto-Rewrite Hook' section"
123
+ fi
124
+ else
125
+ echo -e " ${YELLOW}⚠️${NC} Auto-rewrite hook not installed (optional)"
126
+ echo " Install: cp .claude/hooks/rtk-rewrite.sh ~/.claude/hooks/"
127
+ fi
128
+ echo ""
129
+
130
+ # Summary
131
+ echo "═══════════════════════════════════════════════════════════"
132
+ echo " SUMMARY"
133
+ echo "═══════════════════════════════════════════════════════════"
134
+
135
+ if [ ${#MISSING_FEATURES[@]} -gt 0 ]; then
136
+ echo -e "${YELLOW}⚠️ You have a basic RTK installation${NC}"
137
+ echo ""
138
+ echo "Missing features:"
139
+ for feature in "${MISSING_FEATURES[@]}"; do
140
+ echo " - $feature"
141
+ done
142
+ echo ""
143
+ echo "To get all features, install the fork:"
144
+ echo " cargo uninstall rtk"
145
+ echo " curl -fsSL https://github.com/rtk-ai/rtk/blob/master/install.sh | sh"
146
+ echo " cd rtk && git checkout feat/all-features"
147
+ echo " cargo install --path . --force"
148
+ else
149
+ echo -e "${GREEN}✅ Full-featured RTK installation detected${NC}"
150
+ fi
151
+
152
+ echo ""
153
+
154
+ if [ "$GLOBAL_INIT" = false ] && [ "$LOCAL_INIT" = false ]; then
155
+ echo -e "${YELLOW}⚠️ RTK not initialized for Claude Code${NC}"
156
+ echo " Run: rtk init --global (for all projects)"
157
+ echo " Or: rtk init (for this project only)"
158
+ fi
159
+
160
+ echo ""
161
+ echo "Need help? See docs/TROUBLESHOOTING.md"
162
+ echo "═══════════════════════════════════════════════════════════"
@@ -0,0 +1,37 @@
1
+ #!/bin/bash
2
+ # Install RTK from a local release build (builds from source, no network download).
3
+
4
+ set -euo pipefail
5
+
6
+ INSTALL_DIR="${1:-$HOME/.cargo/bin}"
7
+ INSTALL_PATH="${INSTALL_DIR}/rtk"
8
+ BINARY_PATH="./target/release/rtk"
9
+
10
+ if ! command -v cargo &>/dev/null; then
11
+ echo "error: cargo not found"
12
+ echo "install Rust: https://rustup.rs"
13
+ exit 1
14
+ fi
15
+
16
+ echo "installing to: $INSTALL_DIR"
17
+ if [ -f "$BINARY_PATH" ] && [ -z "$(find src/ Cargo.toml Cargo.lock -newer "$BINARY_PATH" -print -quit 2>/dev/null)" ]; then
18
+ echo "binary is up to date"
19
+ else
20
+ echo "building rtk (release)..."
21
+ cargo build --release
22
+ fi
23
+
24
+ mkdir -p "$INSTALL_DIR"
25
+ install -m 755 "$BINARY_PATH" "$INSTALL_PATH"
26
+
27
+ echo "installed: $INSTALL_PATH"
28
+ echo "version: $("$INSTALL_PATH" --version)"
29
+
30
+ case ":$PATH:" in
31
+ *":$INSTALL_DIR:"*) ;;
32
+ *) echo
33
+ echo "warning: $INSTALL_DIR is not in your PATH"
34
+ echo "add this to your shell profile:"
35
+ echo " export PATH=\"\$PATH:$INSTALL_DIR\""
36
+ ;;
37
+ esac
@@ -0,0 +1,137 @@
1
+ #!/bin/bash
2
+ # rtk-economics.sh
3
+ # Combine ccusage (tokens spent) with rtk (tokens saved) for economic analysis
4
+
5
+ set -euo pipefail
6
+
7
+ # Colors for output
8
+ RED='\033[0;31m'
9
+ GREEN='\033[0;32m'
10
+ YELLOW='\033[1;33m'
11
+ BLUE='\033[0;34m'
12
+ NC='\033[0m' # No Color
13
+
14
+ # Get current month
15
+ CURRENT_MONTH=$(date +%Y-%m)
16
+
17
+ echo -e "${BLUE}📊 RTK Economic Impact Analysis${NC}"
18
+ echo "════════════════════════════════════════════════════════════════"
19
+ echo
20
+
21
+ # Check if ccusage is available
22
+ if ! command -v ccusage &> /dev/null; then
23
+ echo -e "${RED}Error: ccusage not found${NC}"
24
+ echo "Install: npm install -g @anthropics/claude-code-usage"
25
+ exit 1
26
+ fi
27
+
28
+ # Check if rtk is available
29
+ if ! command -v rtk &> /dev/null; then
30
+ echo -e "${RED}Error: rtk not found${NC}"
31
+ echo "Install: cargo install --path ."
32
+ exit 1
33
+ fi
34
+
35
+ # Fetch ccusage data
36
+ echo -e "${YELLOW}Fetching token usage data from ccusage...${NC}"
37
+ if ! ccusage_json=$(ccusage monthly --json 2>/dev/null); then
38
+ echo -e "${RED}Failed to fetch ccusage data${NC}"
39
+ exit 1
40
+ fi
41
+
42
+ # Fetch rtk data
43
+ echo -e "${YELLOW}Fetching token savings data from rtk...${NC}"
44
+ if ! rtk_json=$(rtk gain --monthly --format json 2>/dev/null); then
45
+ echo -e "${RED}Failed to fetch rtk data${NC}"
46
+ exit 1
47
+ fi
48
+
49
+ echo
50
+
51
+ # Parse ccusage data for current month
52
+ ccusage_cost=$(echo "$ccusage_json" | jq -r ".monthly[] | select(.month == \"$CURRENT_MONTH\") | .totalCost // 0")
53
+ ccusage_input=$(echo "$ccusage_json" | jq -r ".monthly[] | select(.month == \"$CURRENT_MONTH\") | .inputTokens // 0")
54
+ ccusage_output=$(echo "$ccusage_json" | jq -r ".monthly[] | select(.month == \"$CURRENT_MONTH\") | .outputTokens // 0")
55
+ ccusage_total=$(echo "$ccusage_json" | jq -r ".monthly[] | select(.month == \"$CURRENT_MONTH\") | .totalTokens // 0")
56
+
57
+ # Parse rtk data for current month
58
+ rtk_saved=$(echo "$rtk_json" | jq -r ".monthly[] | select(.month == \"$CURRENT_MONTH\") | .saved_tokens // 0")
59
+ rtk_commands=$(echo "$rtk_json" | jq -r ".monthly[] | select(.month == \"$CURRENT_MONTH\") | .commands // 0")
60
+ rtk_input=$(echo "$rtk_json" | jq -r ".monthly[] | select(.month == \"$CURRENT_MONTH\") | .input_tokens // 0")
61
+ rtk_output=$(echo "$rtk_json" | jq -r ".monthly[] | select(.month == \"$CURRENT_MONTH\") | .output_tokens // 0")
62
+ rtk_pct=$(echo "$rtk_json" | jq -r ".monthly[] | select(.month == \"$CURRENT_MONTH\") | .savings_pct // 0")
63
+
64
+ # Estimate cost avoided (rough: $0.0001/token for mixed usage)
65
+ # More accurate would be to use ccusage's model-specific pricing
66
+ saved_cost=$(echo "scale=2; $rtk_saved * 0.0001" | bc 2>/dev/null || echo "0")
67
+
68
+ # Calculate total without rtk
69
+ total_without_rtk=$(echo "scale=2; $ccusage_cost + $saved_cost" | bc 2>/dev/null || echo "$ccusage_cost")
70
+
71
+ # Calculate savings percentage
72
+ if (( $(echo "$total_without_rtk > 0" | bc -l) )); then
73
+ savings_pct=$(echo "scale=1; ($saved_cost / $total_without_rtk) * 100" | bc 2>/dev/null || echo "0")
74
+ else
75
+ savings_pct="0"
76
+ fi
77
+
78
+ # Calculate cost per command
79
+ if [ "$rtk_commands" -gt 0 ]; then
80
+ cost_per_cmd_with=$(echo "scale=2; $ccusage_cost / $rtk_commands" | bc 2>/dev/null || echo "0")
81
+ cost_per_cmd_without=$(echo "scale=2; $total_without_rtk / $rtk_commands" | bc 2>/dev/null || echo "0")
82
+ else
83
+ cost_per_cmd_with="N/A"
84
+ cost_per_cmd_without="N/A"
85
+ fi
86
+
87
+ # Format numbers
88
+ format_number() {
89
+ local num=$1
90
+ if [ "$num" = "0" ] || [ "$num" = "N/A" ]; then
91
+ echo "$num"
92
+ else
93
+ echo "$num" | numfmt --to=si 2>/dev/null || echo "$num"
94
+ fi
95
+ }
96
+
97
+ # Display report
98
+ cat << EOF
99
+ ${GREEN}💰 Economic Impact Report - $CURRENT_MONTH${NC}
100
+ ════════════════════════════════════════════════════════════════
101
+
102
+ ${BLUE}Tokens Consumed (via Claude API):${NC}
103
+ Input tokens: $(format_number $ccusage_input)
104
+ Output tokens: $(format_number $ccusage_output)
105
+ Total tokens: $(format_number $ccusage_total)
106
+ ${RED}Actual cost: \$$ccusage_cost${NC}
107
+
108
+ ${BLUE}Tokens Saved by rtk:${NC}
109
+ Commands executed: $rtk_commands
110
+ Input avoided: $(format_number $rtk_input) tokens
111
+ Output generated: $(format_number $rtk_output) tokens
112
+ Total saved: $(format_number $rtk_saved) tokens (${rtk_pct}% reduction)
113
+ ${GREEN}Cost avoided: ~\$$saved_cost${NC}
114
+
115
+ ${BLUE}Economic Analysis:${NC}
116
+ Cost without rtk: \$$total_without_rtk (estimated)
117
+ Cost with rtk: \$$ccusage_cost (actual)
118
+ ${GREEN}Net savings: \$$saved_cost ($savings_pct%)${NC}
119
+ ROI: ${GREEN}Infinite${NC} (rtk is free)
120
+
121
+ ${BLUE}Efficiency Metrics:${NC}
122
+ Cost per command: \$$cost_per_cmd_without → \$$cost_per_cmd_with
123
+ Tokens per command: $(echo "scale=0; $rtk_input / $rtk_commands" | bc 2>/dev/null || echo "N/A") → $(echo "scale=0; $rtk_output / $rtk_commands" | bc 2>/dev/null || echo "N/A")
124
+
125
+ ${BLUE}12-Month Projection:${NC}
126
+ Annual savings: ~\$$(echo "scale=2; $saved_cost * 12" | bc 2>/dev/null || echo "0")
127
+ Commands needed: $(echo "$rtk_commands * 12" | bc 2>/dev/null || echo "0") (at current rate)
128
+
129
+ ════════════════════════════════════════════════════════════════
130
+
131
+ ${YELLOW}Note:${NC} Cost estimates use \$0.0001/token average. Actual pricing varies by model.
132
+ See ccusage for precise model-specific costs.
133
+
134
+ ${GREEN}Recommendation:${NC} Focus rtk usage on high-frequency commands (git, grep, ls)
135
+ for maximum cost reduction.
136
+
137
+ EOF