@hasna/terminal 2.3.0 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.js +404 -0
- package/dist/Browse.js +79 -0
- package/dist/FuzzyPicker.js +47 -0
- package/dist/Onboarding.js +51 -0
- package/dist/Spinner.js +12 -0
- package/dist/StatusBar.js +49 -0
- package/dist/ai.js +322 -0
- package/dist/cache.js +41 -0
- package/dist/cli.js +64 -16
- package/dist/command-rewriter.js +64 -0
- package/dist/command-validator.js +86 -0
- package/dist/compression.js +107 -0
- package/dist/context-hints.js +275 -0
- package/dist/diff-cache.js +107 -0
- package/dist/discover.js +212 -0
- package/dist/economy.js +123 -0
- package/dist/expand-store.js +38 -0
- package/dist/file-cache.js +72 -0
- package/dist/file-index.js +62 -0
- package/dist/history.js +62 -0
- package/dist/lazy-executor.js +54 -0
- package/dist/line-dedup.js +59 -0
- package/dist/loop-detector.js +75 -0
- package/dist/mcp/install.js +98 -0
- package/dist/mcp/server.js +569 -0
- package/dist/noise-filter.js +86 -0
- package/dist/output-processor.js +129 -0
- package/dist/output-router.js +41 -0
- package/dist/output-store.js +111 -0
- package/dist/parsers/base.js +2 -0
- package/dist/parsers/build.js +64 -0
- package/dist/parsers/errors.js +101 -0
- package/dist/parsers/files.js +78 -0
- package/dist/parsers/git.js +99 -0
- package/dist/parsers/index.js +48 -0
- package/dist/parsers/tests.js +89 -0
- package/dist/providers/anthropic.js +39 -0
- package/dist/providers/base.js +4 -0
- package/dist/providers/cerebras.js +95 -0
- package/dist/providers/groq.js +95 -0
- package/dist/providers/index.js +73 -0
- package/dist/providers/xai.js +95 -0
- package/dist/recipes/model.js +20 -0
- package/dist/recipes/storage.js +136 -0
- package/dist/search/content-search.js +68 -0
- package/dist/search/file-search.js +61 -0
- package/dist/search/filters.js +34 -0
- package/dist/search/index.js +5 -0
- package/dist/search/semantic.js +320 -0
- package/dist/session-boot.js +59 -0
- package/dist/session-context.js +55 -0
- package/dist/sessions-db.js +173 -0
- package/dist/smart-display.js +286 -0
- package/dist/snapshots.js +51 -0
- package/dist/supervisor.js +112 -0
- package/dist/test-watchlist.js +131 -0
- package/dist/tool-profiles.js +122 -0
- package/dist/tree.js +94 -0
- package/dist/usage-cache.js +65 -0
- package/package.json +8 -1
- package/src/ai.ts +8 -0
- package/src/cli.tsx +57 -18
- package/src/output-processor.ts +6 -1
- package/src/output-store.ts +58 -12
- package/src/tool-profiles.ts +139 -0
- package/.claude/scheduled_tasks.lock +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -20
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -14
- package/CONTRIBUTING.md +0 -80
- package/benchmarks/benchmark.mjs +0 -115
- package/imported_modules.txt +0 -0
- package/temp/rtk/.claude/agents/code-reviewer.md +0 -221
- package/temp/rtk/.claude/agents/debugger.md +0 -519
- package/temp/rtk/.claude/agents/rtk-testing-specialist.md +0 -461
- package/temp/rtk/.claude/agents/rust-rtk.md +0 -511
- package/temp/rtk/.claude/agents/technical-writer.md +0 -355
- package/temp/rtk/.claude/commands/diagnose.md +0 -352
- package/temp/rtk/.claude/commands/test-routing.md +0 -362
- package/temp/rtk/.claude/hooks/bash/pre-commit-format.sh +0 -16
- package/temp/rtk/.claude/hooks/rtk-rewrite.sh +0 -70
- package/temp/rtk/.claude/hooks/rtk-suggest.sh +0 -152
- package/temp/rtk/.claude/rules/cli-testing.md +0 -526
- package/temp/rtk/.claude/skills/issue-triage/SKILL.md +0 -348
- package/temp/rtk/.claude/skills/issue-triage/templates/issue-comment.md +0 -134
- package/temp/rtk/.claude/skills/performance.md +0 -435
- package/temp/rtk/.claude/skills/pr-triage/SKILL.md +0 -315
- package/temp/rtk/.claude/skills/pr-triage/templates/review-comment.md +0 -71
- package/temp/rtk/.claude/skills/repo-recap.md +0 -206
- package/temp/rtk/.claude/skills/rtk-tdd/SKILL.md +0 -78
- package/temp/rtk/.claude/skills/rtk-tdd/references/testing-patterns.md +0 -124
- package/temp/rtk/.claude/skills/security-guardian.md +0 -503
- package/temp/rtk/.claude/skills/ship.md +0 -404
- package/temp/rtk/.github/workflows/benchmark.yml +0 -34
- package/temp/rtk/.github/workflows/dco-check.yaml +0 -12
- package/temp/rtk/.github/workflows/release-please.yml +0 -51
- package/temp/rtk/.github/workflows/release.yml +0 -343
- package/temp/rtk/.github/workflows/security-check.yml +0 -135
- package/temp/rtk/.github/workflows/validate-docs.yml +0 -78
- package/temp/rtk/.release-please-manifest.json +0 -3
- package/temp/rtk/ARCHITECTURE.md +0 -1491
- package/temp/rtk/CHANGELOG.md +0 -640
- package/temp/rtk/CLAUDE.md +0 -605
- package/temp/rtk/CONTRIBUTING.md +0 -199
- package/temp/rtk/Cargo.lock +0 -1668
- package/temp/rtk/Cargo.toml +0 -64
- package/temp/rtk/Formula/rtk.rb +0 -43
- package/temp/rtk/INSTALL.md +0 -390
- package/temp/rtk/LICENSE +0 -21
- package/temp/rtk/README.md +0 -386
- package/temp/rtk/README_es.md +0 -159
- package/temp/rtk/README_fr.md +0 -197
- package/temp/rtk/README_ja.md +0 -159
- package/temp/rtk/README_ko.md +0 -159
- package/temp/rtk/README_zh.md +0 -167
- package/temp/rtk/ROADMAP.md +0 -15
- package/temp/rtk/SECURITY.md +0 -217
- package/temp/rtk/TEST_EXEC_TIME.md +0 -102
- package/temp/rtk/build.rs +0 -57
- package/temp/rtk/docs/AUDIT_GUIDE.md +0 -432
- package/temp/rtk/docs/FEATURES.md +0 -1410
- package/temp/rtk/docs/TROUBLESHOOTING.md +0 -309
- package/temp/rtk/docs/filter-workflow.md +0 -102
- package/temp/rtk/docs/images/gain-dashboard.jpg +0 -0
- package/temp/rtk/docs/tracking.md +0 -583
- package/temp/rtk/hooks/opencode-rtk.ts +0 -39
- package/temp/rtk/hooks/rtk-awareness.md +0 -29
- package/temp/rtk/hooks/rtk-rewrite.sh +0 -61
- package/temp/rtk/hooks/test-rtk-rewrite.sh +0 -442
- package/temp/rtk/install.sh +0 -124
- package/temp/rtk/release-please-config.json +0 -10
- package/temp/rtk/scripts/benchmark.sh +0 -592
- package/temp/rtk/scripts/check-installation.sh +0 -162
- package/temp/rtk/scripts/install-local.sh +0 -37
- package/temp/rtk/scripts/rtk-economics.sh +0 -137
- package/temp/rtk/scripts/test-all.sh +0 -561
- package/temp/rtk/scripts/test-aristote.sh +0 -227
- package/temp/rtk/scripts/test-tracking.sh +0 -79
- package/temp/rtk/scripts/update-readme-metrics.sh +0 -32
- package/temp/rtk/scripts/validate-docs.sh +0 -73
- package/temp/rtk/src/aws_cmd.rs +0 -880
- package/temp/rtk/src/binlog.rs +0 -1645
- package/temp/rtk/src/cargo_cmd.rs +0 -1727
- package/temp/rtk/src/cc_economics.rs +0 -1157
- package/temp/rtk/src/ccusage.rs +0 -340
- package/temp/rtk/src/config.rs +0 -187
- package/temp/rtk/src/container.rs +0 -855
- package/temp/rtk/src/curl_cmd.rs +0 -134
- package/temp/rtk/src/deps.rs +0 -268
- package/temp/rtk/src/diff_cmd.rs +0 -367
- package/temp/rtk/src/discover/mod.rs +0 -274
- package/temp/rtk/src/discover/provider.rs +0 -388
- package/temp/rtk/src/discover/registry.rs +0 -2022
- package/temp/rtk/src/discover/report.rs +0 -202
- package/temp/rtk/src/discover/rules.rs +0 -667
- package/temp/rtk/src/display_helpers.rs +0 -402
- package/temp/rtk/src/dotnet_cmd.rs +0 -1771
- package/temp/rtk/src/dotnet_format_report.rs +0 -133
- package/temp/rtk/src/dotnet_trx.rs +0 -593
- package/temp/rtk/src/env_cmd.rs +0 -204
- package/temp/rtk/src/filter.rs +0 -462
- package/temp/rtk/src/filters/README.md +0 -52
- package/temp/rtk/src/filters/ansible-playbook.toml +0 -34
- package/temp/rtk/src/filters/basedpyright.toml +0 -47
- package/temp/rtk/src/filters/biome.toml +0 -45
- package/temp/rtk/src/filters/brew-install.toml +0 -37
- package/temp/rtk/src/filters/composer-install.toml +0 -40
- package/temp/rtk/src/filters/df.toml +0 -16
- package/temp/rtk/src/filters/dotnet-build.toml +0 -64
- package/temp/rtk/src/filters/du.toml +0 -16
- package/temp/rtk/src/filters/fail2ban-client.toml +0 -15
- package/temp/rtk/src/filters/gcc.toml +0 -49
- package/temp/rtk/src/filters/gcloud.toml +0 -22
- package/temp/rtk/src/filters/hadolint.toml +0 -24
- package/temp/rtk/src/filters/helm.toml +0 -29
- package/temp/rtk/src/filters/iptables.toml +0 -27
- package/temp/rtk/src/filters/jj.toml +0 -28
- package/temp/rtk/src/filters/jq.toml +0 -24
- package/temp/rtk/src/filters/make.toml +0 -41
- package/temp/rtk/src/filters/markdownlint.toml +0 -24
- package/temp/rtk/src/filters/mix-compile.toml +0 -27
- package/temp/rtk/src/filters/mix-format.toml +0 -15
- package/temp/rtk/src/filters/mvn-build.toml +0 -44
- package/temp/rtk/src/filters/oxlint.toml +0 -43
- package/temp/rtk/src/filters/ping.toml +0 -63
- package/temp/rtk/src/filters/pio-run.toml +0 -40
- package/temp/rtk/src/filters/poetry-install.toml +0 -50
- package/temp/rtk/src/filters/pre-commit.toml +0 -35
- package/temp/rtk/src/filters/ps.toml +0 -16
- package/temp/rtk/src/filters/quarto-render.toml +0 -41
- package/temp/rtk/src/filters/rsync.toml +0 -48
- package/temp/rtk/src/filters/shellcheck.toml +0 -27
- package/temp/rtk/src/filters/shopify-theme.toml +0 -29
- package/temp/rtk/src/filters/skopeo.toml +0 -45
- package/temp/rtk/src/filters/sops.toml +0 -16
- package/temp/rtk/src/filters/ssh.toml +0 -44
- package/temp/rtk/src/filters/stat.toml +0 -34
- package/temp/rtk/src/filters/swift-build.toml +0 -41
- package/temp/rtk/src/filters/systemctl-status.toml +0 -33
- package/temp/rtk/src/filters/terraform-plan.toml +0 -35
- package/temp/rtk/src/filters/tofu-fmt.toml +0 -16
- package/temp/rtk/src/filters/tofu-init.toml +0 -38
- package/temp/rtk/src/filters/tofu-plan.toml +0 -35
- package/temp/rtk/src/filters/tofu-validate.toml +0 -17
- package/temp/rtk/src/filters/trunk-build.toml +0 -39
- package/temp/rtk/src/filters/ty.toml +0 -50
- package/temp/rtk/src/filters/uv-sync.toml +0 -37
- package/temp/rtk/src/filters/xcodebuild.toml +0 -99
- package/temp/rtk/src/filters/yamllint.toml +0 -25
- package/temp/rtk/src/find_cmd.rs +0 -598
- package/temp/rtk/src/format_cmd.rs +0 -386
- package/temp/rtk/src/gain.rs +0 -723
- package/temp/rtk/src/gh_cmd.rs +0 -1651
- package/temp/rtk/src/git.rs +0 -2012
- package/temp/rtk/src/go_cmd.rs +0 -592
- package/temp/rtk/src/golangci_cmd.rs +0 -254
- package/temp/rtk/src/grep_cmd.rs +0 -288
- package/temp/rtk/src/gt_cmd.rs +0 -810
- package/temp/rtk/src/hook_audit_cmd.rs +0 -283
- package/temp/rtk/src/hook_check.rs +0 -171
- package/temp/rtk/src/init.rs +0 -1859
- package/temp/rtk/src/integrity.rs +0 -537
- package/temp/rtk/src/json_cmd.rs +0 -231
- package/temp/rtk/src/learn/detector.rs +0 -628
- package/temp/rtk/src/learn/mod.rs +0 -119
- package/temp/rtk/src/learn/report.rs +0 -184
- package/temp/rtk/src/lint_cmd.rs +0 -694
- package/temp/rtk/src/local_llm.rs +0 -316
- package/temp/rtk/src/log_cmd.rs +0 -248
- package/temp/rtk/src/ls.rs +0 -324
- package/temp/rtk/src/main.rs +0 -2482
- package/temp/rtk/src/mypy_cmd.rs +0 -389
- package/temp/rtk/src/next_cmd.rs +0 -241
- package/temp/rtk/src/npm_cmd.rs +0 -236
- package/temp/rtk/src/parser/README.md +0 -267
- package/temp/rtk/src/parser/error.rs +0 -46
- package/temp/rtk/src/parser/formatter.rs +0 -336
- package/temp/rtk/src/parser/mod.rs +0 -311
- package/temp/rtk/src/parser/types.rs +0 -119
- package/temp/rtk/src/pip_cmd.rs +0 -302
- package/temp/rtk/src/playwright_cmd.rs +0 -479
- package/temp/rtk/src/pnpm_cmd.rs +0 -573
- package/temp/rtk/src/prettier_cmd.rs +0 -221
- package/temp/rtk/src/prisma_cmd.rs +0 -482
- package/temp/rtk/src/psql_cmd.rs +0 -382
- package/temp/rtk/src/pytest_cmd.rs +0 -384
- package/temp/rtk/src/read.rs +0 -217
- package/temp/rtk/src/rewrite_cmd.rs +0 -50
- package/temp/rtk/src/ruff_cmd.rs +0 -402
- package/temp/rtk/src/runner.rs +0 -271
- package/temp/rtk/src/summary.rs +0 -297
- package/temp/rtk/src/tee.rs +0 -405
- package/temp/rtk/src/telemetry.rs +0 -248
- package/temp/rtk/src/toml_filter.rs +0 -1655
- package/temp/rtk/src/tracking.rs +0 -1416
- package/temp/rtk/src/tree.rs +0 -209
- package/temp/rtk/src/tsc_cmd.rs +0 -259
- package/temp/rtk/src/utils.rs +0 -432
- package/temp/rtk/src/verify_cmd.rs +0 -47
- package/temp/rtk/src/vitest_cmd.rs +0 -385
- package/temp/rtk/src/wc_cmd.rs +0 -401
- package/temp/rtk/src/wget_cmd.rs +0 -260
- package/temp/rtk/tests/fixtures/dotnet/build_failed.txt +0 -11
- package/temp/rtk/tests/fixtures/dotnet/format_changes.json +0 -31
- package/temp/rtk/tests/fixtures/dotnet/format_empty.json +0 -1
- package/temp/rtk/tests/fixtures/dotnet/format_success.json +0 -12
- package/temp/rtk/tests/fixtures/dotnet/test_failed.txt +0 -18
- package/tsconfig.json +0 -15
|
@@ -1,435 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: CLI performance optimization - startup time, memory usage, token savings benchmarking
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Performance Optimization Skill
|
|
6
|
-
|
|
7
|
-
Systematic performance analysis and optimization for RTK CLI tool, focusing on **startup time (<10ms)**, **memory usage (<5MB)**, and **token savings (60-90%)**.
|
|
8
|
-
|
|
9
|
-
## When to Use
|
|
10
|
-
|
|
11
|
-
- **Automatically triggered**: After filter changes, regex modifications, or dependency additions
|
|
12
|
-
- **Manual invocation**: When performance degradation suspected or before release
|
|
13
|
-
- **Proactive**: After any code change that could impact startup time or memory
|
|
14
|
-
|
|
15
|
-
## RTK Performance Targets
|
|
16
|
-
|
|
17
|
-
| Metric | Target | Verification Method | Failure Threshold |
|
|
18
|
-
|--------|--------|---------------------|-------------------|
|
|
19
|
-
| **Startup time** | <10ms | `hyperfine 'rtk <cmd>'` | >15ms = blocker |
|
|
20
|
-
| **Memory usage** | <5MB resident | `/usr/bin/time -l rtk <cmd>` (macOS) | >7MB = blocker |
|
|
21
|
-
| **Token savings** | 60-90% | Tests with `count_tokens()` | <60% = blocker |
|
|
22
|
-
| **Binary size** | <5MB stripped | `ls -lh target/release/rtk` | >8MB = investigate |
|
|
23
|
-
|
|
24
|
-
## Performance Analysis Workflow
|
|
25
|
-
|
|
26
|
-
### 1. Establish Baseline
|
|
27
|
-
|
|
28
|
-
Before making any changes, capture current performance:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
# Startup time baseline
|
|
32
|
-
hyperfine 'rtk git status' --warmup 3 --export-json /tmp/baseline_startup.json
|
|
33
|
-
|
|
34
|
-
# Memory usage baseline (macOS)
|
|
35
|
-
/usr/bin/time -l rtk git status 2>&1 | grep "maximum resident set size" > /tmp/baseline_memory.txt
|
|
36
|
-
|
|
37
|
-
# Memory usage baseline (Linux)
|
|
38
|
-
/usr/bin/time -v rtk git status 2>&1 | grep "Maximum resident set size" > /tmp/baseline_memory.txt
|
|
39
|
-
|
|
40
|
-
# Binary size baseline
|
|
41
|
-
ls -lh target/release/rtk | tee /tmp/baseline_binary_size.txt
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### 2. Make Changes
|
|
45
|
-
|
|
46
|
-
Implement optimization or feature changes.
|
|
47
|
-
|
|
48
|
-
### 3. Rebuild and Measure
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
# Rebuild with optimizations
|
|
52
|
-
cargo build --release
|
|
53
|
-
|
|
54
|
-
# Measure startup time
|
|
55
|
-
hyperfine 'target/release/rtk git status' --warmup 3 --export-json /tmp/after_startup.json
|
|
56
|
-
|
|
57
|
-
# Measure memory usage
|
|
58
|
-
/usr/bin/time -l target/release/rtk git status 2>&1 | grep "maximum resident set size" > /tmp/after_memory.txt
|
|
59
|
-
|
|
60
|
-
# Check binary size
|
|
61
|
-
ls -lh target/release/rtk | tee /tmp/after_binary_size.txt
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### 4. Compare Results
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
# Startup time comparison
|
|
68
|
-
hyperfine 'rtk git status' 'target/release/rtk git status' --warmup 3
|
|
69
|
-
|
|
70
|
-
# Example output:
|
|
71
|
-
# Benchmark 1: rtk git status
|
|
72
|
-
# Time (mean ± σ): 6.2 ms ± 0.3 ms [User: 4.1 ms, System: 1.8 ms]
|
|
73
|
-
# Benchmark 2: target/release/rtk git status
|
|
74
|
-
# Time (mean ± σ): 7.8 ms ± 0.4 ms [User: 5.2 ms, System: 2.1 ms]
|
|
75
|
-
#
|
|
76
|
-
# Summary
|
|
77
|
-
# 'rtk git status' ran 1.26 times faster than 'target/release/rtk git status'
|
|
78
|
-
|
|
79
|
-
# Memory comparison
|
|
80
|
-
diff /tmp/baseline_memory.txt /tmp/after_memory.txt
|
|
81
|
-
|
|
82
|
-
# Binary size comparison
|
|
83
|
-
diff /tmp/baseline_binary_size.txt /tmp/after_binary_size.txt
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### 5. Identify Regressions
|
|
87
|
-
|
|
88
|
-
**Startup time regression** (>15% increase or >2ms absolute):
|
|
89
|
-
```bash
|
|
90
|
-
# Profile with flamegraph
|
|
91
|
-
cargo install flamegraph
|
|
92
|
-
cargo flamegraph -- target/release/rtk git status
|
|
93
|
-
|
|
94
|
-
# Open flamegraph.svg
|
|
95
|
-
open flamegraph.svg
|
|
96
|
-
# Look for:
|
|
97
|
-
# - Regex compilation (should be in lazy_static init)
|
|
98
|
-
# - Excessive allocations
|
|
99
|
-
# - File I/O on startup (should be zero)
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
**Memory regression** (>20% increase or >1MB absolute):
|
|
103
|
-
```bash
|
|
104
|
-
# Profile allocations (requires nightly)
|
|
105
|
-
cargo +nightly build --release -Z build-std
|
|
106
|
-
RUSTFLAGS="-C link-arg=-fuse-ld=lld" cargo +nightly build --release
|
|
107
|
-
|
|
108
|
-
# Use DHAT for heap profiling
|
|
109
|
-
cargo install dhat
|
|
110
|
-
# Add to main.rs:
|
|
111
|
-
# #[global_allocator]
|
|
112
|
-
# static ALLOC: dhat::Alloc = dhat::Alloc;
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
**Token savings regression** (<60% savings):
|
|
116
|
-
```bash
|
|
117
|
-
# Run token accuracy tests
|
|
118
|
-
cargo test test_token_savings
|
|
119
|
-
|
|
120
|
-
# Example failure output:
|
|
121
|
-
# Git log filter: expected ≥60% savings, got 52.3%
|
|
122
|
-
|
|
123
|
-
# Fix: Improve filter condensation logic
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## Common Performance Issues
|
|
127
|
-
|
|
128
|
-
### Issue 1: Regex Recompilation
|
|
129
|
-
|
|
130
|
-
**Symptom**: Startup time >20ms, flamegraph shows regex compilation in hot path
|
|
131
|
-
|
|
132
|
-
**Detection**:
|
|
133
|
-
```bash
|
|
134
|
-
# Flamegraph shows Regex::new() calls during execution
|
|
135
|
-
cargo flamegraph -- target/release/rtk git log -10
|
|
136
|
-
# Look for "regex::Regex::new" in non-lazy_static sections
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
**Fix**:
|
|
140
|
-
```rust
|
|
141
|
-
// ❌ WRONG: Recompiled on every call
|
|
142
|
-
fn filter_line(line: &str) -> Option<&str> {
|
|
143
|
-
let re = Regex::new(r"pattern").unwrap(); // RECOMPILED!
|
|
144
|
-
re.find(line).map(|m| m.as_str())
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// ✅ RIGHT: Compiled once with lazy_static
|
|
148
|
-
use lazy_static::lazy_static;
|
|
149
|
-
|
|
150
|
-
lazy_static! {
|
|
151
|
-
static ref LINE_PATTERN: Regex = Regex::new(r"pattern").unwrap();
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
fn filter_line(line: &str) -> Option<&str> {
|
|
155
|
-
LINE_PATTERN.find(line).map(|m| m.as_str())
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### Issue 2: Excessive Allocations
|
|
160
|
-
|
|
161
|
-
**Symptom**: Memory usage >5MB, many small allocations in flamegraph
|
|
162
|
-
|
|
163
|
-
**Detection**:
|
|
164
|
-
```bash
|
|
165
|
-
# DHAT heap profiling
|
|
166
|
-
cargo +nightly build --release
|
|
167
|
-
valgrind --tool=dhat target/release/rtk git status
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
**Fix**:
|
|
171
|
-
```rust
|
|
172
|
-
// ❌ WRONG: Allocates Vec for every line
|
|
173
|
-
fn filter_lines(input: &str) -> String {
|
|
174
|
-
input.lines()
|
|
175
|
-
.map(|line| line.to_string()) // Allocates String
|
|
176
|
-
.collect::<Vec<_>>()
|
|
177
|
-
.join("\n")
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// ✅ RIGHT: Borrow slices, single allocation
|
|
181
|
-
fn filter_lines(input: &str) -> String {
|
|
182
|
-
input.lines()
|
|
183
|
-
.collect::<Vec<_>>() // Vec of &str (no String allocation)
|
|
184
|
-
.join("\n")
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### Issue 3: Startup I/O
|
|
189
|
-
|
|
190
|
-
**Symptom**: Startup time varies wildly (5ms to 50ms), flamegraph shows file reads
|
|
191
|
-
|
|
192
|
-
**Detection**:
|
|
193
|
-
```bash
|
|
194
|
-
# strace on Linux
|
|
195
|
-
strace -c target/release/rtk git status 2>&1 | grep -E "open|read"
|
|
196
|
-
|
|
197
|
-
# dtrace on macOS (requires SIP disabled)
|
|
198
|
-
sudo dtrace -n 'syscall::open*:entry { @[execname] = count(); }' &
|
|
199
|
-
target/release/rtk git status
|
|
200
|
-
sudo pkill dtrace
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
**Fix**:
|
|
204
|
-
```rust
|
|
205
|
-
// ❌ WRONG: File I/O on startup
|
|
206
|
-
fn main() {
|
|
207
|
-
let config = load_config().unwrap(); // Reads ~/.config/rtk/config.toml
|
|
208
|
-
// ...
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// ✅ RIGHT: Lazy config loading (only if needed)
|
|
212
|
-
fn main() {
|
|
213
|
-
// No I/O on startup
|
|
214
|
-
// Config loaded on-demand when first accessed
|
|
215
|
-
}
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### Issue 4: Dependency Bloat
|
|
219
|
-
|
|
220
|
-
**Symptom**: Binary size >5MB, many unused dependencies in `Cargo.toml`
|
|
221
|
-
|
|
222
|
-
**Detection**:
|
|
223
|
-
```bash
|
|
224
|
-
# Analyze dependency tree
|
|
225
|
-
cargo tree
|
|
226
|
-
|
|
227
|
-
# Find heavy dependencies
|
|
228
|
-
cargo install cargo-bloat
|
|
229
|
-
cargo bloat --release --crates
|
|
230
|
-
|
|
231
|
-
# Example output:
|
|
232
|
-
# File .text Size Crate
|
|
233
|
-
# 0.5% 2.1% 42.3KB regex
|
|
234
|
-
# 0.4% 1.8% 36.1KB clap
|
|
235
|
-
# ...
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
**Fix**:
|
|
239
|
-
```toml
|
|
240
|
-
# ❌ WRONG: Full feature set (bloat)
|
|
241
|
-
[dependencies]
|
|
242
|
-
clap = { version = "4", features = ["derive", "color", "suggestions"] }
|
|
243
|
-
|
|
244
|
-
# ✅ RIGHT: Minimal features
|
|
245
|
-
[dependencies]
|
|
246
|
-
clap = { version = "4", features = ["derive"], default-features = false }
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
## Optimization Techniques
|
|
250
|
-
|
|
251
|
-
### Technique 1: Lazy Static Initialization
|
|
252
|
-
|
|
253
|
-
**Use case**: Regex patterns, static configuration, one-time allocations
|
|
254
|
-
|
|
255
|
-
**Implementation**:
|
|
256
|
-
```rust
|
|
257
|
-
use lazy_static::lazy_static;
|
|
258
|
-
use regex::Regex;
|
|
259
|
-
|
|
260
|
-
lazy_static! {
|
|
261
|
-
static ref COMMIT_HASH: Regex = Regex::new(r"[0-9a-f]{7,40}").unwrap();
|
|
262
|
-
static ref AUTHOR_LINE: Regex = Regex::new(r"^Author: (.+)$").unwrap();
|
|
263
|
-
static ref DATE_LINE: Regex = Regex::new(r"^Date: (.+)$").unwrap();
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// All regex compiled once at startup, reused forever
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
**Impact**: ~5-10ms saved per regex pattern (if compiled at runtime)
|
|
270
|
-
|
|
271
|
-
### Technique 2: Zero-Copy String Processing
|
|
272
|
-
|
|
273
|
-
**Use case**: Filter output without allocating intermediate Strings
|
|
274
|
-
|
|
275
|
-
**Implementation**:
|
|
276
|
-
```rust
|
|
277
|
-
// ❌ WRONG: Allocates String for every line
|
|
278
|
-
fn filter(input: &str) -> String {
|
|
279
|
-
input.lines()
|
|
280
|
-
.filter(|line| !line.is_empty())
|
|
281
|
-
.map(|line| line.to_string()) // Allocates!
|
|
282
|
-
.collect::<Vec<_>>()
|
|
283
|
-
.join("\n")
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// ✅ RIGHT: Borrow slices, single final allocation
|
|
287
|
-
fn filter(input: &str) -> String {
|
|
288
|
-
input.lines()
|
|
289
|
-
.filter(|line| !line.is_empty())
|
|
290
|
-
.collect::<Vec<_>>() // Vec<&str> (no String alloc)
|
|
291
|
-
.join("\n") // Single allocation for joined result
|
|
292
|
-
}
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
**Impact**: ~1-2MB memory saved, ~1-2ms startup saved
|
|
296
|
-
|
|
297
|
-
### Technique 3: Minimal Dependencies
|
|
298
|
-
|
|
299
|
-
**Use case**: Reduce binary size and compile time
|
|
300
|
-
|
|
301
|
-
**Implementation**:
|
|
302
|
-
```toml
|
|
303
|
-
# Only include features you actually use
|
|
304
|
-
[dependencies]
|
|
305
|
-
clap = { version = "4", features = ["derive"], default-features = false }
|
|
306
|
-
serde = { version = "1", features = ["derive"], default-features = false }
|
|
307
|
-
|
|
308
|
-
# Avoid heavy dependencies
|
|
309
|
-
# ❌ Avoid: tokio (adds 5-10ms startup overhead)
|
|
310
|
-
# ❌ Avoid: full regex (use regex-lite if possible)
|
|
311
|
-
# ✅ Use: anyhow (lightweight error handling)
|
|
312
|
-
# ✅ Use: lazy_static (zero runtime overhead)
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
**Impact**: ~1-2MB binary size reduction, ~2-5ms startup saved
|
|
316
|
-
|
|
317
|
-
## Performance Testing Checklist
|
|
318
|
-
|
|
319
|
-
Before committing filter changes:
|
|
320
|
-
|
|
321
|
-
### Startup Time
|
|
322
|
-
- [ ] Benchmark with `hyperfine 'rtk <cmd>' --warmup 3`
|
|
323
|
-
- [ ] Verify <10ms mean time
|
|
324
|
-
- [ ] Check variance (σ) is small (<1ms)
|
|
325
|
-
- [ ] Compare against baseline (regression <2ms)
|
|
326
|
-
|
|
327
|
-
### Memory Usage
|
|
328
|
-
- [ ] Profile with `/usr/bin/time -l rtk <cmd>`
|
|
329
|
-
- [ ] Verify <5MB resident set size
|
|
330
|
-
- [ ] Compare against baseline (regression <1MB)
|
|
331
|
-
|
|
332
|
-
### Token Savings
|
|
333
|
-
- [ ] Run `cargo test test_token_savings`
|
|
334
|
-
- [ ] Verify all filters achieve ≥60% savings
|
|
335
|
-
- [ ] Check real fixtures used (not synthetic)
|
|
336
|
-
|
|
337
|
-
### Binary Size
|
|
338
|
-
- [ ] Check `ls -lh target/release/rtk`
|
|
339
|
-
- [ ] Verify <5MB stripped binary
|
|
340
|
-
- [ ] Run `cargo bloat --release --crates` if >5MB
|
|
341
|
-
|
|
342
|
-
## Continuous Performance Monitoring
|
|
343
|
-
|
|
344
|
-
### Pre-Commit Hook
|
|
345
|
-
|
|
346
|
-
Add to `.claude/hooks/bash/pre-commit-performance.sh`:
|
|
347
|
-
|
|
348
|
-
```bash
|
|
349
|
-
#!/bin/bash
|
|
350
|
-
# Performance regression check before commit
|
|
351
|
-
|
|
352
|
-
echo "🚀 Running performance checks..."
|
|
353
|
-
|
|
354
|
-
# Benchmark startup time
|
|
355
|
-
CURRENT_TIME=$(hyperfine 'rtk git status' --warmup 3 --export-json /tmp/perf.json 2>&1 | grep "Time (mean" | awk '{print $4}')
|
|
356
|
-
|
|
357
|
-
# Extract numeric value (remove "ms")
|
|
358
|
-
CURRENT_MS=$(echo $CURRENT_TIME | sed 's/ms//')
|
|
359
|
-
|
|
360
|
-
# Check if > 10ms
|
|
361
|
-
if (( $(echo "$CURRENT_MS > 10" | bc -l) )); then
|
|
362
|
-
echo "❌ Startup time regression: ${CURRENT_MS}ms (target: <10ms)"
|
|
363
|
-
exit 1
|
|
364
|
-
fi
|
|
365
|
-
|
|
366
|
-
# Check binary size
|
|
367
|
-
BINARY_SIZE=$(ls -l target/release/rtk | awk '{print $5}')
|
|
368
|
-
MAX_SIZE=$((5 * 1024 * 1024)) # 5MB
|
|
369
|
-
|
|
370
|
-
if [ $BINARY_SIZE -gt $MAX_SIZE ]; then
|
|
371
|
-
echo "❌ Binary size regression: $(($BINARY_SIZE / 1024 / 1024))MB (target: <5MB)"
|
|
372
|
-
exit 1
|
|
373
|
-
fi
|
|
374
|
-
|
|
375
|
-
echo "✅ Performance checks passed"
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
### CI/CD Integration
|
|
379
|
-
|
|
380
|
-
Add to `.github/workflows/ci.yml`:
|
|
381
|
-
|
|
382
|
-
```yaml
|
|
383
|
-
- name: Performance Regression Check
|
|
384
|
-
run: |
|
|
385
|
-
cargo build --release
|
|
386
|
-
cargo install hyperfine
|
|
387
|
-
|
|
388
|
-
# Benchmark startup time
|
|
389
|
-
hyperfine 'target/release/rtk git status' --warmup 3 --max-runs 10
|
|
390
|
-
|
|
391
|
-
# Check binary size
|
|
392
|
-
BINARY_SIZE=$(ls -l target/release/rtk | awk '{print $5}')
|
|
393
|
-
MAX_SIZE=$((5 * 1024 * 1024))
|
|
394
|
-
if [ $BINARY_SIZE -gt $MAX_SIZE ]; then
|
|
395
|
-
echo "Binary too large: $(($BINARY_SIZE / 1024 / 1024))MB"
|
|
396
|
-
exit 1
|
|
397
|
-
fi
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
## Performance Optimization Priorities
|
|
401
|
-
|
|
402
|
-
**Priority order** (highest to lowest impact):
|
|
403
|
-
|
|
404
|
-
1. **🔴 Lazy static regex** (5-10ms per pattern if compiled at runtime)
|
|
405
|
-
2. **🔴 Remove startup I/O** (10-50ms for config file reads)
|
|
406
|
-
3. **🟡 Zero-copy processing** (1-2MB memory, 1-2ms startup)
|
|
407
|
-
4. **🟡 Minimal dependencies** (1-2MB binary, 2-5ms startup)
|
|
408
|
-
5. **🟢 Algorithm optimization** (varies, measure first)
|
|
409
|
-
|
|
410
|
-
**When in doubt**: Profile first with `flamegraph`, then optimize the hottest path.
|
|
411
|
-
|
|
412
|
-
## Tools Reference
|
|
413
|
-
|
|
414
|
-
| Tool | Purpose | Command |
|
|
415
|
-
|------|---------|---------|
|
|
416
|
-
| **hyperfine** | Benchmark startup time | `hyperfine 'rtk <cmd>' --warmup 3` |
|
|
417
|
-
| **time** | Memory usage (macOS) | `/usr/bin/time -l rtk <cmd>` |
|
|
418
|
-
| **time** | Memory usage (Linux) | `/usr/bin/time -v rtk <cmd>` |
|
|
419
|
-
| **flamegraph** | CPU profiling | `cargo flamegraph -- rtk <cmd>` |
|
|
420
|
-
| **cargo bloat** | Binary size analysis | `cargo bloat --release --crates` |
|
|
421
|
-
| **cargo tree** | Dependency tree | `cargo tree` |
|
|
422
|
-
| **DHAT** | Heap profiling | `cargo +nightly build && valgrind --tool=dhat` |
|
|
423
|
-
| **strace** | System call tracing (Linux) | `strace -c target/release/rtk <cmd>` |
|
|
424
|
-
| **dtrace** | System call tracing (macOS) | `sudo dtrace -n 'syscall::open*:entry'` |
|
|
425
|
-
|
|
426
|
-
**Install tools**:
|
|
427
|
-
```bash
|
|
428
|
-
# macOS
|
|
429
|
-
brew install hyperfine
|
|
430
|
-
|
|
431
|
-
# Linux / cross-platform via cargo
|
|
432
|
-
cargo install hyperfine
|
|
433
|
-
cargo install flamegraph
|
|
434
|
-
cargo install cargo-bloat
|
|
435
|
-
```
|