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/thoughtpolice/a /tmp/a && cp -r /tmp/a/.claude/skills/buck2-target-determination ~/.claude/skills/a// tip: Run this command in your terminal to install the skill
name: buck2-target-determination description: 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.
Buck2 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
quicktdor target determination
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 (@$TARGETS)? Target lists can be extremely large (thousands of targets), exceeding command-line length limits. At-file syntax loads targets from a file.
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
depot//src/myproject/...todepot//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
root//prefix - Prevents cell reference errors - 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
$TARGETSfor multiple commands - Check target count -
wc -l $TARGETSto verify results - Run quality tests separately -
depot//buck/tests/...aren't in quicktd scope
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.
Repository
