PHP project (>=8.2) with Symfony.
This project is a PHP library for using the Geocaching API.
- Official API Swagger: https://api.groundspeak.com/api-docs/v1/swagger
- Official documentation: https://api.groundspeak.com/documentation
- Uses PSR-7, PSR-17, PSR-18 for HTTP client agnosticism
- HTTPlug for HTTP client abstraction
- Plugin architecture with Http\Client\Common\Plugin
- Clients separated by business domain (GeocacheClient, UserClient, etc.)
- Production: https://api.groundspeak.com
- Staging: https://staging.api.groundspeak.com
- StatusClient uses absolute URLs to bypass auth
- GeocachingHttpLoggerPlugin available for HTTP request/response logging
- Automatic token masking in logs
- Configuration via Options::enableHttpLogging()
- PHPUnit 12 with PHP 8 attributes (#[DataProvider])
- Unit tests in tests/
- Test command: composer run phpunit
- Currently 234 tests, 902 assertions
- Query string concatenation: use ternary operator to avoid "Array to string conversion"
- Interface types: HttpMethodsClientInterface instead of HttpMethodsClient
- StatusClient bypasses auth/BaseUri plugins but keeps logging
All clients follow official Swagger patterns:
- /geocaches, /users, /adventures, /lists, /logs, /trackables, etc.
- Adventure anon endpoints: /adventures/anon/ (not /adventures/)
- Before flagging a "hand-rolled stdlib" or "unnecessary wrapper" finding, grep for actual call sites first. A one-line wrapper reused across many callers (e.g.
Enum/EnumTrait.php'sgetList()/getListId(), used by 11 enums) is DRY, not over-engineering — don't suggest removing it. RetryStrategyimplementations share eligibility logic inReliability/AbstractRetryStrategy.php(retryable exceptions/status codes,shouldRetry(),getMaxAttempts(),isRetryableStatusCode()). OnlygetDelay()differs per strategy (FixedDelayStrategy,ExponentialBackoffStrategy). Add new strategies by extending this base class, not by copy-pasting.- Don't flag public interfaces (e.g.
ClientBuilderInterface) as yagni just because this repo has one implementation — this is a library, and external consumers may type-hint or mock against public interfaces even with no in-repo evidence. - A method used only via a trait (e.g.
RateLimitAwareDelay::getRateLimitDelayMs()) must beprotected, notprivate, if any class using the trait is subclassed — PHP traits don't relax visibility across the class hierarchy the way you'd expect.
Always prefix commands with rtk. If RTK has a dedicated filter, it uses it. If not, it passes through unchanged. This means RTK is always safe to use.
Important: Even in command chains with &&, use rtk:
# ❌ Wrong
git add . && git commit -m "msg" && git push
# ✅ Correct
rtk git add . && rtk git commit -m "msg" && rtk git pushrtk cargo build # Cargo build output
rtk cargo check # Cargo check output
rtk cargo clippy # Clippy warnings grouped by file (80%)
rtk tsc # TypeScript errors grouped by file/code (83%)
rtk lint # ESLint/Biome violations grouped (84%)
rtk prettier --check # Files needing format only (70%)
rtk next build # Next.js build with route metrics (87%)rtk cargo test # Cargo test failures only (90%)
rtk go test # Go test failures only (90%)
rtk jest # Jest failures only (99.5%)
rtk vitest # Vitest failures only (99.5%)
rtk playwright test # Playwright failures only (94%)
rtk pytest # Python test failures only (90%)
rtk rake test # Ruby test failures only (90%)
rtk rspec # RSpec test failures only (60%)
rtk test <cmd> # Generic test wrapper - failures onlyrtk git status # Compact status
rtk git log # Compact log (works with all git flags)
rtk git diff # Compact diff (80%)
rtk git show # Compact show (80%)
rtk git add # Ultra-compact confirmations (59%)
rtk git commit # Ultra-compact confirmations (59%)
rtk git push # Ultra-compact confirmations
rtk git pull # Ultra-compact confirmations
rtk git branch # Compact branch list
rtk git fetch # Compact fetch
rtk git stash # Compact stash
rtk git worktree # Compact worktreeNote: Git passthrough works for ALL subcommands, even those not explicitly listed.
rtk gh pr view <num> # Compact PR view (87%)
rtk gh pr checks # Compact PR checks (79%)
rtk gh run list # Compact workflow runs (82%)
rtk gh issue list # Compact issue list (80%)
rtk gh api # Compact API responses (26%)rtk pnpm list # Compact dependency tree (70%)
rtk pnpm outdated # Compact outdated packages (80%)
rtk pnpm install # Compact install output (90%)
rtk npm run <script> # Compact npm script output
rtk npx <cmd> # Compact npx command output
rtk prisma # Prisma without ASCII art (88%)rtk ls <path> # Tree format, compact (65%)
rtk read <file> # Code reading with filtering (60%)
rtk grep <pattern> # Search grouped by file (75%). Format flags (-c, -l, -L, -o, -Z) run raw.
rtk find <pattern> # Find grouped by directory (70%)rtk err <cmd> # Filter errors only from any command
rtk log <file> # Deduplicated logs with counts
rtk json <file> # JSON structure without values
rtk deps # Dependency overview
rtk env # Environment variables compact
rtk summary <cmd> # Smart summary of command output
rtk diff # Ultra-compact diffsrtk docker ps # Compact container list
rtk docker images # Compact image list
rtk docker logs <c> # Deduplicated logs
rtk kubectl get # Compact resource list
rtk kubectl logs # Deduplicated pod logsrtk curl <url> # Compact HTTP responses (70%)
rtk wget <url> # Compact download output (65%)rtk gain # View token savings statistics
rtk gain --history # View command history with savings
rtk discover # Analyze Claude Code sessions for missed RTK usage
rtk proxy <cmd> # Run command without filtering (for debugging)
rtk init # Add RTK instructions to CLAUDE.md
rtk init --global # Add RTK to ~/.claude/CLAUDE.md| Category | Commands | Typical Savings |
|---|---|---|
| Tests | vitest, playwright, cargo test | 90-99% |
| Build | next, tsc, lint, prettier | 70-87% |
| Git | status, log, diff, add, commit | 59-80% |
| GitHub | gh pr, gh run, gh issue | 26-87% |
| Package Managers | pnpm, npm, npx | 70-90% |
| Files | ls, read, grep, find | 60-75% |
| Infrastructure | docker, kubectl | 85% |
| Network | curl, wget | 65-70% |
Overall average: 60-90% token reduction on common development operations.