Claude-skill-registry buck2-target-determination
This skill should be used when determining which Buck2 targets are affected by code changes for incremental builds and tests. Use this when users ask to test/build changed code, find affected targets, or run incremental workflows with jj revisions.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/buck2-target-determination" ~/.claude/skills/majiayu000-claude-skill-registry-buck2-target-determination && rm -rf "$T"
skills/data/buck2-target-determination/SKILL.mdBuck2 Target Determination
Overview
Target determination identifies which Buck2 targets are affected by code changes between two jj revisions. This enables incremental workflows that only build/test what changed, dramatically reducing build times (often 10-100x faster than full builds).
When to Use This Skill
Use this skill when:
- User wants to "test what changed" or "test my changes"
- User asks to "build only affected targets"
- User requests "incremental build/test"
- Setting up CI/CD workflows that should only test affected code
- Analyzing impact of changes before committing
- User mentions
or target determinationquicktd
How Target Determination Works
The
quicktd tool:
- Accepts two jj revsets (e.g.,
and'@-'
)'@' - Computes file changes between those revisions
- Builds Buck2 target graphs at both revisions
- Identifies targets whose BUILD files or sources changed
- Outputs affected targets to a file path
Critical: Always use the
root// cell prefix with quicktd to avoid ambiguous cell references.
Basic Usage Pattern
# Find targets affected between parent (@-) and current (@) TARGETS=$(buck2 run root//buck/tools/quicktd -- '@-' '@' depot//src/...) # Build affected targets buck2 build @$TARGETS # Test affected targets buck2 test @$TARGETS
Why at-file syntax (
)? Target lists can be extremely large (thousands of targets), exceeding command-line length limits. At-file syntax loads targets from a file.@$TARGETS
Common Revset Patterns
Development Workflows
# Changes in current commit (most common) buck2 run root//buck/tools/quicktd -- '@-' '@' depot//src/... # Changes since trunk buck2 run root//buck/tools/quicktd -- 'trunk()' '@' depot//src/... # Last 3 commits buck2 run root//buck/tools/quicktd -- '@---' '@' depot//src/... # Specific commit range buck2 run root//buck/tools/quicktd -- 'abc123' 'def456' depot//src/...
CI/CD Workflows
# Changes in pull request (compared to main) buck2 run root//buck/tools/quicktd -- 'trunk()' '@' depot//... # Full repository scan buck2 run root//buck/tools/quicktd -- 'root()' '@' depot//...
Scope Limiting
# Only specific directory buck2 run root//buck/tools/quicktd -- '@-' '@' depot//src/myproject/... # Multiple directories buck2 run root//buck/tools/quicktd -- '@-' '@' depot//src/... depot//tools/...
Complete Workflow Examples
Pre-Commit Testing
# 1. Make changes jj new -m "feat: implement feature" # ... edit files ... # 2. Find affected targets TARGETS=$(buck2 run root//buck/tools/quicktd -- '@-' '@' depot//src/...) # 3. Build affected targets buck2 build @$TARGETS # 4. Test affected targets buck2 test @$TARGETS # 5. If passing, commit jj commit -m "feat: implement feature"
Impact Analysis
# See what targets are affected TARGETS=$(buck2 run root//buck/tools/quicktd -- '@-' '@' depot//src/...) # Count affected targets wc -l $TARGETS # Show affected targets cat $TARGETS # Find which are tests buck2 query "kind('.*_test', set(@$TARGETS))" # Find which are binaries buck2 query "kind('.*_binary', set(@$TARGETS))"
Helper Script Usage
Use
scripts/quicktd_helper.py for simplified invocations:
# Interactive mode - prompts for revsets python3 scripts/quicktd_helper.py # Quick patterns python3 scripts/quicktd_helper.py --pattern current # '@-' to '@' python3 scripts/quicktd_helper.py --pattern trunk # 'trunk()' to '@' python3 scripts/quicktd_helper.py --pattern full # 'root()' to '@' # Custom revsets python3 scripts/quicktd_helper.py --from '@---' --to '@' --scope depot//src/myproject/... # Auto-build affected targets python3 scripts/quicktd_helper.py --pattern current --build # Auto-test affected targets python3 scripts/quicktd_helper.py --pattern current --test # Both build and test python3 scripts/quicktd_helper.py --pattern trunk --build --test
The helper provides:
- Better error messages
- Target count and preview
- Optional auto-build/test
- Common pattern shortcuts
Troubleshooting
"No targets affected"
Possible causes:
- No files changed (check
)jj diff - Changes only to files not in any BUILD target
- Scope too narrow (expand from
todepot//src/myproject/...
)depot//src/... - Files not committed to jj (Buck2 only sees committed files)
Solution:
# Check what changed jj diff # Verify files are committed jj status # Expand scope buck2 run root//buck/tools/quicktd -- '@-' '@' depot//...
"Could not find cell" error
The
root// prefix is missing. Always use:
# ✓ Correct buck2 run root//buck/tools/quicktd -- ... # ✗ Wrong buck2 run //buck/tools/quicktd -- ...
Large target lists cause failures
Use at-file syntax (
@filename) instead of passing targets directly:
# ✓ Correct TARGETS=$(buck2 run root//buck/tools/quicktd -- '@-' '@' depot//src/...) buck2 test @$TARGETS # ✗ Wrong (may exceed command-line limits) buck2 test $(cat $TARGETS)
Performance Benefits
Real-world example:
# Without target determination (builds everything) time buck2 test depot//src/... # → 1847 actions, 15m 23s # With target determination (1 file changed) TARGETS=$(buck2 run root//buck/tools/quicktd -- '@-' '@' depot//src/...) time buck2 test @$TARGETS # → 12 actions, 8.3s # → 111x faster!
Best Practices
- Always use
prefix - Prevents cell reference errorsroot// - Use at-file syntax - Required for large target lists
- Scope appropriately - Balance coverage vs speed
- Commit before testing - Buck2 only sees committed files
- Cache the output - Store
for multiple commands$TARGETS - Check target count -
to verify resultswc -l $TARGETS - Run quality tests separately -
aren't in quicktd scopedepot//buck/tests/...
Resources
scripts/quicktd_helper.py
Python helper script that wraps quicktd with common patterns and better output formatting.
references/revset_patterns.md
Comprehensive guide to jj revset patterns for use with quicktd.