@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,343 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ tag:
7
+ description: 'Tag to release'
8
+ required: true
9
+ type: string
10
+ workflow_dispatch:
11
+ inputs:
12
+ tag:
13
+ description: 'Tag to release (e.g., v0.1.0)'
14
+ required: true
15
+
16
+ permissions:
17
+ contents: write
18
+
19
+ env:
20
+ CARGO_TERM_COLOR: always
21
+
22
+ jobs:
23
+ build:
24
+ name: Build ${{ matrix.target }}
25
+ runs-on: ${{ matrix.os }}
26
+ strategy:
27
+ fail-fast: false
28
+ matrix:
29
+ include:
30
+ # macOS
31
+ - target: x86_64-apple-darwin
32
+ os: macos-latest
33
+ archive: tar.gz
34
+ - target: aarch64-apple-darwin
35
+ os: macos-latest
36
+ archive: tar.gz
37
+ # Linux
38
+ - target: x86_64-unknown-linux-musl
39
+ os: ubuntu-latest
40
+ archive: tar.gz
41
+ musl: true
42
+ - target: aarch64-unknown-linux-gnu
43
+ os: ubuntu-latest
44
+ archive: tar.gz
45
+ cross: true
46
+ # Windows
47
+ - target: x86_64-pc-windows-msvc
48
+ os: windows-latest
49
+ archive: zip
50
+
51
+ steps:
52
+ - name: Checkout
53
+ uses: actions/checkout@v4
54
+
55
+ - name: Install Rust
56
+ uses: dtolnay/rust-toolchain@stable
57
+ with:
58
+ targets: ${{ matrix.target }}
59
+
60
+ - name: Install cross-compilation tools
61
+ if: matrix.cross
62
+ run: |
63
+ sudo apt-get update
64
+ sudo apt-get install -y gcc-aarch64-linux-gnu
65
+ echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
66
+
67
+ - name: Install musl tools
68
+ if: matrix.musl
69
+ run: |
70
+ sudo apt-get update
71
+ sudo apt-get install -y musl-tools
72
+
73
+ - name: Build
74
+ run: cargo build --release --target ${{ matrix.target }}
75
+ env:
76
+ RTK_TELEMETRY_URL: ${{ vars.RTK_TELEMETRY_URL }}
77
+ RTK_TELEMETRY_TOKEN: ${{ secrets.RTK_TELEMETRY_TOKEN }}
78
+
79
+ - name: Package (Unix)
80
+ if: matrix.os != 'windows-latest'
81
+ run: |
82
+ cd target/${{ matrix.target }}/release
83
+ tar -czvf ../../../rtk-${{ matrix.target }}.${{ matrix.archive }} rtk
84
+ cd ../../..
85
+
86
+ - name: Package (Windows)
87
+ if: matrix.os == 'windows-latest'
88
+ run: |
89
+ cd target/${{ matrix.target }}/release
90
+ 7z a ../../../rtk-${{ matrix.target }}.${{ matrix.archive }} rtk.exe
91
+ cd ../../..
92
+
93
+ - name: Upload artifact
94
+ uses: actions/upload-artifact@v4
95
+ with:
96
+ name: rtk-${{ matrix.target }}
97
+ path: rtk-${{ matrix.target }}.${{ matrix.archive }}
98
+
99
+ build-deb:
100
+ name: Build DEB package
101
+ runs-on: ubuntu-latest
102
+ steps:
103
+ - name: Checkout
104
+ uses: actions/checkout@v4
105
+
106
+ - name: Install Rust
107
+ uses: dtolnay/rust-toolchain@stable
108
+
109
+ - name: Install cargo-deb
110
+ run: cargo install cargo-deb
111
+
112
+ - name: Build DEB
113
+ run: cargo deb
114
+ env:
115
+ RTK_TELEMETRY_URL: ${{ vars.RTK_TELEMETRY_URL }}
116
+ RTK_TELEMETRY_TOKEN: ${{ secrets.RTK_TELEMETRY_TOKEN }}
117
+
118
+ - name: Upload DEB
119
+ uses: actions/upload-artifact@v4
120
+ with:
121
+ name: rtk-deb
122
+ path: target/debian/*.deb
123
+
124
+ build-rpm:
125
+ name: Build RPM package
126
+ runs-on: ubuntu-latest
127
+ container: fedora:latest
128
+ steps:
129
+ - name: Checkout
130
+ uses: actions/checkout@v4
131
+
132
+ - name: Install dependencies
133
+ run: |
134
+ dnf install -y rust cargo rpm-build
135
+
136
+ - name: Install cargo-generate-rpm
137
+ run: cargo install cargo-generate-rpm
138
+
139
+ - name: Build release
140
+ run: cargo build --release
141
+ env:
142
+ RTK_TELEMETRY_URL: ${{ vars.RTK_TELEMETRY_URL }}
143
+ RTK_TELEMETRY_TOKEN: ${{ secrets.RTK_TELEMETRY_TOKEN }}
144
+
145
+ - name: Generate RPM
146
+ run: cargo generate-rpm
147
+
148
+ - name: Upload RPM
149
+ uses: actions/upload-artifact@v4
150
+ with:
151
+ name: rtk-rpm
152
+ path: target/generate-rpm/*.rpm
153
+
154
+ release:
155
+ name: Create Release
156
+ needs: [build, build-deb, build-rpm]
157
+ runs-on: ubuntu-latest
158
+ steps:
159
+ - name: Checkout
160
+ uses: actions/checkout@v4
161
+
162
+ - name: Download all artifacts
163
+ uses: actions/download-artifact@v4
164
+ with:
165
+ path: artifacts
166
+
167
+ - name: Get version
168
+ id: version
169
+ run: |
170
+ TAG="${{ inputs.tag }}"
171
+ if [ -z "$TAG" ]; then
172
+ TAG="${{ github.event.release.tag_name }}"
173
+ fi
174
+ echo "version=$TAG" >> $GITHUB_OUTPUT
175
+
176
+ - name: Flatten artifacts
177
+ run: |
178
+ mkdir -p release
179
+ find artifacts -type f \( -name "*.tar.gz" -o -name "*.zip" -o -name "*.deb" -o -name "*.rpm" \) -exec cp {} release/ \;
180
+
181
+ - name: Create version-agnostic package names
182
+ run: |
183
+ cd release
184
+ for f in *.deb; do
185
+ [ -f "$f" ] && cp "$f" "rtk_amd64.deb"
186
+ done
187
+ for f in *.rpm; do
188
+ [ -f "$f" ] && cp "$f" "rtk.x86_64.rpm"
189
+ done
190
+
191
+ - name: Create checksums
192
+ run: |
193
+ cd release
194
+ sha256sum * > checksums.txt
195
+
196
+ - name: Upload Release Assets
197
+ uses: softprops/action-gh-release@v2
198
+ with:
199
+ tag_name: ${{ steps.version.outputs.version }}
200
+ files: release/*
201
+ env:
202
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
203
+
204
+ notify-discord:
205
+ name: Notify Discord
206
+ needs: [release]
207
+ runs-on: ubuntu-latest
208
+ steps:
209
+ - name: Get version
210
+ id: version
211
+ run: |
212
+ TAG="${{ inputs.tag }}"
213
+ if [ -z "$TAG" ]; then
214
+ TAG="${{ github.event.release.tag_name }}"
215
+ fi
216
+ echo "tag=$TAG" >> $GITHUB_OUTPUT
217
+
218
+ - name: Send Discord notification
219
+ env:
220
+ DISCORD_WEBHOOK: ${{ secrets.RTK_DISCORD_RELEASE }}
221
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
222
+ run: |
223
+ TAG="${{ steps.version.outputs.tag }}"
224
+ RELEASE_URL="https://github.com/rtk-ai/rtk/releases/tag/${TAG}"
225
+
226
+ # Fetch release notes from GitHub API
227
+ NOTES=$(gh api "repos/rtk-ai/rtk/releases/tags/${TAG}" --jq '.body' 2>/dev/null | head -c 1800 || echo "")
228
+ DESC=$(echo "${NOTES:-No release notes}" | jq -Rs .)
229
+
230
+ jq -n \
231
+ --arg title "RTK ${TAG} released" \
232
+ --arg url "$RELEASE_URL" \
233
+ --argjson desc "$DESC" \
234
+ '{embeds: [{title: $title, url: $url, description: $desc, color: 5814783, footer: {text: "Rust Token Killer"}}]}' \
235
+ | curl -sf -H "Content-Type: application/json" -d @- "$DISCORD_WEBHOOK"
236
+
237
+ homebrew:
238
+ name: Update Homebrew formula
239
+ needs: [release]
240
+ runs-on: ubuntu-latest
241
+ steps:
242
+ - name: Get version
243
+ id: version
244
+ run: |
245
+ TAG="${{ inputs.tag }}"
246
+ if [ -z "$TAG" ]; then
247
+ TAG="${{ github.event.release.tag_name }}"
248
+ fi
249
+ VERSION="${TAG#v}"
250
+ echo "tag=$TAG" >> $GITHUB_OUTPUT
251
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
252
+
253
+ - name: Download checksums
254
+ run: |
255
+ gh release download "${{ steps.version.outputs.tag }}" \
256
+ --repo rtk-ai/rtk \
257
+ --pattern checksums.txt
258
+ env:
259
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
260
+
261
+ - name: Parse checksums
262
+ id: sha
263
+ run: |
264
+ echo "mac_arm=$(grep aarch64-apple-darwin.tar.gz checksums.txt | head -1 | awk '{print $1}')" >> $GITHUB_OUTPUT
265
+ echo "mac_intel=$(grep x86_64-apple-darwin.tar.gz checksums.txt | head -1 | awk '{print $1}')" >> $GITHUB_OUTPUT
266
+ echo "linux_arm=$(grep aarch64-unknown-linux-gnu.tar.gz checksums.txt | head -1 | awk '{print $1}')" >> $GITHUB_OUTPUT
267
+ echo "linux_intel=$(grep x86_64-unknown-linux-musl.tar.gz checksums.txt | head -1 | awk '{print $1}')" >> $GITHUB_OUTPUT
268
+
269
+ - name: Generate formula
270
+ run: |
271
+ cat > rtk.rb << 'FORMULA'
272
+ class Rtk < Formula
273
+ desc "Rust Token Killer - High-performance CLI proxy to minimize LLM token consumption"
274
+ homepage "https://www.rtk-ai.app"
275
+ version "VERSION_PLACEHOLDER"
276
+ license "MIT"
277
+
278
+ if OS.mac? && Hardware::CPU.arm?
279
+ url "https://github.com/rtk-ai/rtk/releases/download/TAG_PLACEHOLDER/rtk-aarch64-apple-darwin.tar.gz"
280
+ sha256 "SHA_MAC_ARM_PLACEHOLDER"
281
+ elsif OS.mac? && Hardware::CPU.intel?
282
+ url "https://github.com/rtk-ai/rtk/releases/download/TAG_PLACEHOLDER/rtk-x86_64-apple-darwin.tar.gz"
283
+ sha256 "SHA_MAC_INTEL_PLACEHOLDER"
284
+ elsif OS.linux? && Hardware::CPU.arm?
285
+ url "https://github.com/rtk-ai/rtk/releases/download/TAG_PLACEHOLDER/rtk-aarch64-unknown-linux-gnu.tar.gz"
286
+ sha256 "SHA_LINUX_ARM_PLACEHOLDER"
287
+ elsif OS.linux? && Hardware::CPU.intel?
288
+ url "https://github.com/rtk-ai/rtk/releases/download/TAG_PLACEHOLDER/rtk-x86_64-unknown-linux-musl.tar.gz"
289
+ sha256 "SHA_LINUX_INTEL_PLACEHOLDER"
290
+ end
291
+
292
+ def install
293
+ bin.install "rtk"
294
+ end
295
+
296
+ def caveats
297
+ <<~EOS
298
+ rtk is installed! Get started:
299
+
300
+ # Initialize for Claude Code
301
+ rtk init -g # Global hook-first setup (recommended)
302
+ rtk init # Add to ./CLAUDE.md (this project only)
303
+
304
+ # See all commands
305
+ rtk --help
306
+
307
+ # Measure your token savings
308
+ rtk gain
309
+
310
+ Full documentation: https://www.rtk-ai.app
311
+ EOS
312
+ end
313
+
314
+ test do
315
+ system "#{bin}/rtk", "--version"
316
+ end
317
+ end
318
+ FORMULA
319
+ sed -i "s/VERSION_PLACEHOLDER/${{ steps.version.outputs.version }}/g" rtk.rb
320
+ sed -i "s/TAG_PLACEHOLDER/${{ steps.version.outputs.tag }}/g" rtk.rb
321
+ sed -i "s/SHA_MAC_ARM_PLACEHOLDER/${{ steps.sha.outputs.mac_arm }}/g" rtk.rb
322
+ sed -i "s/SHA_MAC_INTEL_PLACEHOLDER/${{ steps.sha.outputs.mac_intel }}/g" rtk.rb
323
+ sed -i "s/SHA_LINUX_ARM_PLACEHOLDER/${{ steps.sha.outputs.linux_arm }}/g" rtk.rb
324
+ sed -i "s/SHA_LINUX_INTEL_PLACEHOLDER/${{ steps.sha.outputs.linux_intel }}/g" rtk.rb
325
+ # Remove leading spaces from heredoc
326
+ sed -i 's/^ //' rtk.rb
327
+
328
+ - name: Push to homebrew-tap
329
+ run: |
330
+ CONTENT=$(base64 -w 0 rtk.rb)
331
+ SHA=$(gh api repos/rtk-ai/homebrew-tap/contents/Formula/rtk.rb --jq '.sha' 2>/dev/null || echo "")
332
+ if [ -n "$SHA" ]; then
333
+ gh api -X PUT repos/rtk-ai/homebrew-tap/contents/Formula/rtk.rb \
334
+ -f message="rtk ${{ steps.version.outputs.version }}" \
335
+ -f content="$CONTENT" \
336
+ -f sha="$SHA"
337
+ else
338
+ gh api -X PUT repos/rtk-ai/homebrew-tap/contents/Formula/rtk.rb \
339
+ -f message="rtk ${{ steps.version.outputs.version }}" \
340
+ -f content="$CONTENT"
341
+ fi
342
+ env:
343
+ GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
@@ -0,0 +1,135 @@
1
+ name: Security Check
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [ master ]
6
+
7
+ permissions:
8
+ contents: read
9
+ pull-requests: write
10
+
11
+ env:
12
+ CARGO_TERM_COLOR: always
13
+
14
+ jobs:
15
+ security:
16
+ name: Security Scan
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - name: Checkout PR
20
+ uses: actions/checkout@v4
21
+ with:
22
+ fetch-depth: 0
23
+
24
+ - name: Install Rust
25
+ uses: dtolnay/rust-toolchain@stable
26
+
27
+ - name: Install cargo-audit
28
+ run: cargo install cargo-audit
29
+
30
+ - name: Cargo Audit (CVE check)
31
+ run: |
32
+ echo "## 🔍 Security Scan Results" >> $GITHUB_STEP_SUMMARY
33
+ echo "" >> $GITHUB_STEP_SUMMARY
34
+ echo "### 📦 Dependency Vulnerabilities" >> $GITHUB_STEP_SUMMARY
35
+ if cargo audit 2>&1 | tee audit.log; then
36
+ echo "✅ No known vulnerabilities detected" >> $GITHUB_STEP_SUMMARY
37
+ else
38
+ echo "⚠️ Vulnerabilities found:" >> $GITHUB_STEP_SUMMARY
39
+ echo '```' >> $GITHUB_STEP_SUMMARY
40
+ cat audit.log >> $GITHUB_STEP_SUMMARY
41
+ echo '```' >> $GITHUB_STEP_SUMMARY
42
+ echo "::warning::Dependency vulnerabilities detected - review required"
43
+ fi
44
+ echo "" >> $GITHUB_STEP_SUMMARY
45
+
46
+ - name: Critical files check
47
+ run: |
48
+ echo "### 🎯 Critical Files Modified" >> $GITHUB_STEP_SUMMARY
49
+ CRITICAL=$(git diff --name-only origin/master...HEAD | grep -E "(runner|summary|tracking|init|pnpm_cmd|container)\.rs|Cargo\.toml|workflows/.*\.yml" || true)
50
+ if [ -n "$CRITICAL" ]; then
51
+ echo "⚠️ **HIGH RISK**: The following critical files were modified:" >> $GITHUB_STEP_SUMMARY
52
+ echo '```' >> $GITHUB_STEP_SUMMARY
53
+ echo "$CRITICAL" >> $GITHUB_STEP_SUMMARY
54
+ echo '```' >> $GITHUB_STEP_SUMMARY
55
+ echo "" >> $GITHUB_STEP_SUMMARY
56
+ echo "**Required Actions:**" >> $GITHUB_STEP_SUMMARY
57
+ echo "- [ ] Manual security review by 2 maintainers" >> $GITHUB_STEP_SUMMARY
58
+ echo "- [ ] Verify no shell injection vectors" >> $GITHUB_STEP_SUMMARY
59
+ echo "- [ ] Check input validation remains intact" >> $GITHUB_STEP_SUMMARY
60
+ echo "::warning::Critical RTK files modified - enhanced review required"
61
+ else
62
+ echo "✅ No critical files modified" >> $GITHUB_STEP_SUMMARY
63
+ fi
64
+ echo "" >> $GITHUB_STEP_SUMMARY
65
+
66
+ - name: Dangerous patterns scan
67
+ run: |
68
+ echo "### 🚨 Dangerous Code Patterns" >> $GITHUB_STEP_SUMMARY
69
+ PATTERNS=$(git diff origin/master...HEAD | grep -E "Command::new\(\"sh\"|Command::new\(\"bash\"|\.env\(\"LD_PRELOAD|\.env\(\"PATH|reqwest::|std::net::|TcpStream|UdpSocket|unsafe \{|\.unwrap\(\) |panic!\(|todo!\(|unimplemented!\(" || true)
70
+ if [ -n "$PATTERNS" ]; then
71
+ echo "⚠️ **Potentially dangerous patterns detected:**" >> $GITHUB_STEP_SUMMARY
72
+ echo '```diff' >> $GITHUB_STEP_SUMMARY
73
+ echo "$PATTERNS" | head -30 >> $GITHUB_STEP_SUMMARY
74
+ echo '```' >> $GITHUB_STEP_SUMMARY
75
+ echo "" >> $GITHUB_STEP_SUMMARY
76
+ echo "**Security Concerns:**" >> $GITHUB_STEP_SUMMARY
77
+ echo "$PATTERNS" | grep -q "Command::new" && echo "- Shell command execution detected" >> $GITHUB_STEP_SUMMARY || true
78
+ echo "$PATTERNS" | grep -q "\.env\(\"" && echo "- Environment variable manipulation" >> $GITHUB_STEP_SUMMARY || true
79
+ echo "$PATTERNS" | grep -q "reqwest::\|std::net::\|TcpStream\|UdpSocket" && echo "- Network operations added" >> $GITHUB_STEP_SUMMARY || true
80
+ echo "$PATTERNS" | grep -q "unsafe" && echo "- Unsafe code blocks" >> $GITHUB_STEP_SUMMARY || true
81
+ echo "$PATTERNS" | grep -q "\.unwrap\(\)\|panic!\(" && echo "- Panic-inducing code" >> $GITHUB_STEP_SUMMARY || true
82
+ echo "::warning::Dangerous code patterns detected - manual review required"
83
+ else
84
+ echo "✅ No dangerous patterns detected" >> $GITHUB_STEP_SUMMARY
85
+ fi
86
+ echo "" >> $GITHUB_STEP_SUMMARY
87
+
88
+ - name: New dependencies check
89
+ run: |
90
+ echo "### 📚 Dependencies Changes" >> $GITHUB_STEP_SUMMARY
91
+ if git diff origin/master...HEAD Cargo.toml | grep -E "^\+.*=" | grep -v "^\+\+\+" > new_deps.txt; then
92
+ echo "⚠️ **New dependencies added:**" >> $GITHUB_STEP_SUMMARY
93
+ echo '```toml' >> $GITHUB_STEP_SUMMARY
94
+ cat new_deps.txt >> $GITHUB_STEP_SUMMARY
95
+ echo '```' >> $GITHUB_STEP_SUMMARY
96
+ echo "" >> $GITHUB_STEP_SUMMARY
97
+ echo "**Required Actions:**" >> $GITHUB_STEP_SUMMARY
98
+ echo "- [ ] Audit each new dependency on crates.io" >> $GITHUB_STEP_SUMMARY
99
+ echo "- [ ] Check maintainer reputation and download counts" >> $GITHUB_STEP_SUMMARY
100
+ echo "- [ ] Verify no typosquatting (e.g., 'reqwest' vs 'request')" >> $GITHUB_STEP_SUMMARY
101
+ echo "::warning::New dependencies require supply chain audit"
102
+ else
103
+ echo "✅ No new dependencies added" >> $GITHUB_STEP_SUMMARY
104
+ fi
105
+ echo "" >> $GITHUB_STEP_SUMMARY
106
+
107
+ - name: Clippy security lints
108
+ run: |
109
+ echo "### 🔧 Clippy Security Lints" >> $GITHUB_STEP_SUMMARY
110
+ if cargo clippy --all-targets -- -W clippy::unwrap_used -W clippy::panic -W clippy::expect_used 2>&1 | tee clippy.log | grep -E "warning:|error:"; then
111
+ echo "⚠️ Security-related lints triggered:" >> $GITHUB_STEP_SUMMARY
112
+ echo '```' >> $GITHUB_STEP_SUMMARY
113
+ grep -E "warning:|error:" clippy.log | head -20 >> $GITHUB_STEP_SUMMARY
114
+ echo '```' >> $GITHUB_STEP_SUMMARY
115
+ echo "::warning::Clippy security lints failed"
116
+ else
117
+ echo "✅ All security lints passed" >> $GITHUB_STEP_SUMMARY
118
+ fi
119
+ echo "" >> $GITHUB_STEP_SUMMARY
120
+
121
+ - name: Summary verdict
122
+ run: |
123
+ echo "---" >> $GITHUB_STEP_SUMMARY
124
+ echo "" >> $GITHUB_STEP_SUMMARY
125
+ echo "### 🎯 Security Review Verdict" >> $GITHUB_STEP_SUMMARY
126
+ echo "" >> $GITHUB_STEP_SUMMARY
127
+ echo "**This is an automated security scan. A human maintainer must:**" >> $GITHUB_STEP_SUMMARY
128
+ echo "1. Review all warnings above" >> $GITHUB_STEP_SUMMARY
129
+ echo "2. Verify PR intent matches actual code changes" >> $GITHUB_STEP_SUMMARY
130
+ echo "3. Check for subtle backdoors or logic bombs" >> $GITHUB_STEP_SUMMARY
131
+ echo "4. Use \`/rtk-pr-security\` skill for comprehensive analysis" >> $GITHUB_STEP_SUMMARY
132
+ echo "" >> $GITHUB_STEP_SUMMARY
133
+ echo "**For high-risk PRs (critical files modified):**" >> $GITHUB_STEP_SUMMARY
134
+ echo "- Require approval from 2 maintainers" >> $GITHUB_STEP_SUMMARY
135
+ echo "- Test in isolated environment before merge" >> $GITHUB_STEP_SUMMARY
@@ -0,0 +1,78 @@
1
+ name: Documentation Validation
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - 'src/**/*.rs'
7
+ - 'Cargo.toml'
8
+ - '**.md'
9
+ - '.claude/hooks/*.sh'
10
+ push:
11
+ branches:
12
+ - master
13
+ - feat/**
14
+
15
+ jobs:
16
+ validate:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Validate documentation consistency
22
+ run: bash scripts/validate-docs.sh
23
+
24
+ - name: Check module count consistency
25
+ run: |
26
+ MAIN_MODULES=$(grep -c '^mod ' src/main.rs)
27
+
28
+ # Check ARCHITECTURE.md if it exists
29
+ if [ -f "ARCHITECTURE.md" ]; then
30
+ ARCH_MODULES=$(grep 'Total:.*modules' ARCHITECTURE.md | grep -o '[0-9]\+' | head -1)
31
+ if [ -n "$ARCH_MODULES" ] && [ "$MAIN_MODULES" != "$ARCH_MODULES" ]; then
32
+ echo "❌ Module count mismatch"
33
+ echo "main.rs: $MAIN_MODULES modules"
34
+ echo "ARCHITECTURE.md: $ARCH_MODULES modules"
35
+ exit 1
36
+ fi
37
+ fi
38
+
39
+ echo "✅ Module count consistent: $MAIN_MODULES modules"
40
+
41
+ - name: Verify Python/Go commands documented
42
+ run: |
43
+ for cmd in ruff pytest pip go golangci; do
44
+ if ! grep -q "$cmd" README.md; then
45
+ echo "❌ README.md missing Python/Go command: $cmd"
46
+ exit 1
47
+ fi
48
+ if ! grep -q "$cmd" CLAUDE.md; then
49
+ echo "❌ CLAUDE.md missing Python/Go command: $cmd"
50
+ exit 1
51
+ fi
52
+ done
53
+ echo "✅ All Python/Go commands documented"
54
+
55
+ - name: Verify hook coverage
56
+ run: |
57
+ HOOK_FILE=".claude/hooks/rtk-rewrite.sh"
58
+ if [ ! -f "$HOOK_FILE" ]; then
59
+ echo "❌ Hook file not found: $HOOK_FILE"
60
+ exit 1
61
+ fi
62
+
63
+ # Since PR #241, the hook delegates to `rtk rewrite` (single source of truth).
64
+ # Command coverage is now in src/discover/registry.rs, not the hook bash script.
65
+ if ! grep -q "rtk rewrite" "$HOOK_FILE"; then
66
+ echo "❌ Hook does not delegate to 'rtk rewrite'"
67
+ exit 1
68
+ fi
69
+
70
+ # Verify all Python/Go commands are covered in the registry
71
+ # Since PR #241, constants live in src/discover/rules.rs (extracted from registry.rs)
72
+ for cmd in ruff pytest pip golangci; do
73
+ if ! grep -qr "\"$cmd\"" src/discover/; then
74
+ echo "❌ Registry missing rewrite_prefixes for: $cmd"
75
+ exit 1
76
+ fi
77
+ done
78
+ echo "✅ Hook delegates to rtk rewrite, registry covers all Python/Go commands"
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.29.0"
3
+ }