From tsal
Provides Bevy game engine expertise for ECS architecture, component design, systems, UI development, builds, debugging, and project organization.
npx claudepluginhub bfollington/terma --plugin tsalThis skill uses the workspace's default tool permissions.
A specialized skill for developing games and applications using the Bevy game engine, based on real-world experience building complex Bevy projects.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
A specialized skill for developing games and applications using the Bevy game engine, based on real-world experience building complex Bevy projects.
Invoke this skill when:
If working with Bevy 0.17, be aware of significant API changes:
MeshMaterial3d<T> (not Handle<T>)commands.trigger(), add_observer())See references/bevy_specific_tips.md for complete Bevy 0.17 migration guide and examples.
The registry examples are your bible. Always check them before implementing new features.
Location:
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy-0.17.1/examples
There are MANY examples covering all aspects of Bevy development. Review relevant examples to understand best practices and working patterns.
Break your app into discrete modules using plugins. This improves organization and makes code discoverable.
pub struct CombatPlugin;
impl Plugin for CombatPlugin {
fn build(&self, app: &mut App) {
app
.add_event::<DamageEvent>()
.add_systems(Update, (process_damage, check_death));
}
}
See references/bevy_specific_tips.md for detailed plugin patterns and examples.
Pure ECS demands careful data modeling. It's hard to search a massive list of systems in one file!
Before implementing:
See references/bevy_specific_tips.md for domain-driven design guidance.
Bevy is an Entity Component System (ECS) engine. Always think in terms of data (components) and transformations (systems), not objects and methods.
Separation of Concerns:
Keep components focused:
// ✅ GOOD: Small, focused components
#[derive(Component)]
pub struct Health { pub current: f32, pub max: f32 }
#[derive(Component)]
pub struct Armor { pub defense: f32 }
// ❌ BAD: Monolithic component
#[derive(Component)]
pub struct CombatStats {
pub health: f32,
pub armor: f32,
pub strength: f32,
// ... wastes memory for entities that only have some stats
}
Add helper methods via impl blocks:
impl Health {
pub fn is_alive(&self) -> bool {
self.current > 0.0
}
pub fn percentage(&self) -> f32 {
self.current / self.max
}
}
For detailed component patterns, see references/ecs_patterns.md.
Order systems by dependencies:
.add_systems(
Update,
(
// 1. Input processing
handle_input,
// 2. State changes
process_events,
update_state,
// 3. Derive properties from state
calculate_derived_values,
// 4. Visual updates
update_materials,
update_animations,
// 5. UI updates (must run last)
update_ui_displays,
),
)
Use change detection to optimize:
// Only process entities where Health changed
pub fn update_health_bar(
query: Query<(&Health, &mut HealthBar), Changed<Health>>,
) {
for (health, mut bar) in query.iter_mut() {
bar.width = health.percentage() * 100.0;
}
}
For detailed query patterns and system design, see references/ecs_patterns.md.
Development (faster iteration):
cargo build --features bevy/dynamic_linking
Quick Check:
cargo check
Release (production):
cargo build --release
DO NOT delete target binaries freely! Bevy takes minutes to rebuild from scratch.
cargo clean unless absolutely necessarySee references/bevy_specific_tips.md for detailed build optimization and version management.
cargo checkcargo check then cargo build --features bevy/dynamic_linkingValidation points - Let the user test at these milestones:
Bevy uses a flexbox-like layout system. Follow the marker component pattern:
1. Create marker components:
#[derive(Component)]
pub struct HealthBar;
#[derive(Component)]
pub struct ScoreDisplay;
2. Setup in Startup:
pub fn setup_ui(mut commands: Commands) {
commands.spawn((
HealthBar,
Node {
position_type: PositionType::Absolute,
left: Val::Px(10.0),
top: Val::Px(10.0),
width: Val::Px(200.0),
height: Val::Px(20.0),
..default()
},
BackgroundColor(Color::srgba(0.8, 0.2, 0.2, 0.9)),
));
}
3. Update in Update:
pub fn update_health_ui(
health: Query<&Health, With<Player>>,
mut ui: Query<&mut Node, With<HealthBar>>,
) {
if let (Ok(health), Ok(mut node)) = (health.get_single(), ui.get_single_mut()) {
node.width = Val::Px(health.percentage() * 200.0);
}
}
For detailed UI patterns including positioning, styling, and text updates, see references/ui_development.md.
Break features into phases:
Phase 1: Foundation - Core components and basic systems Phase 2: Content - Add entities and populate world Phase 3: Polish - UI improvements and visual effects Phase 4: Advanced Features - Complex mechanics and AI
1. Plan → 2. Implement → 3. Build → 4. Test → 5. Refine
↑ ↓
←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
Each phase should have:
For prototypes (7-100 entities):
For production (100+ entities):
Query<&Component, Changed<Component>>Query<&A, (With<B>, Without<C>)> instead of filtering in loopsCritical mistakes and their solutions are documented in references/common_pitfalls.md. Key pitfalls include:
main.rsget_many_mut for multiple mutations)Changed<T> for expensive operationsif let Ok() pattern)Review references/common_pitfalls.md before implementing complex features.
When implementing multi-step features, use the plan-implementer subagent with this structure:
Goal: [One sentence describing end state]
Current State: [What exists now]
Requirements: [Numbered list of what to build]
Implementation Steps: [Suggested approach]
Success Criteria: [How to verify it works]
Notes: [Important context, edge cases, design principles]
Example:
Implement Health System
Goal: Implement a health system with damage, healing, and death mechanics.
Current State:
- Player entity exists
- No health tracking yet
Requirements:
1. Create Health component with current/max values
2. Create DamageEvent for dealing damage
3. Create system to process damage events
4. Add death detection when health reaches 0
5. Add visual health bar UI
Implementation Steps:
1. Create Health component in src/components/properties.rs
2. Create DamageEvent in src/events.rs
3. Create process_damage system in src/systems/combat.rs
4. Create check_death system
5. Create health bar UI in src/systems/ui/health_bar.rs
6. Register all systems in main.rs in correct order
Success Criteria:
- Player spawns with Health component
- Damage events reduce health
- Health bar updates when health changes
- Entity despawns when health reaches 0
- Code compiles without errors
For details on recommended file organization, module structure, and component file patterns, see references/project_structure.md.
This skill includes detailed reference documentation:
references/bevy_specific_tips.md - START HERE: Registry examples, plugin structure, build optimization, version management, domain-driven design for ECSreferences/ecs_patterns.md - Component design patterns, query patterns, and common ECS design patterns (Derivation, State Machine, Threshold/Trigger, Event-Driven, Initialization)references/ui_development.md - Bevy UI hierarchy, component patterns, layout tips, positioning, styling, and text updatesreferences/common_pitfalls.md - Common mistakes and their solutions (system registration, borrowing conflicts, change detection, system ordering, entity queries, asset handles)references/project_structure.md - Recommended file organization, module structure, component file patterns, and change detectionLoad these references as needed to inform implementation decisions.
Bevy Documentation:
~/.cargo/registry/...)ECS Design Principles:
Remember: Think in terms of data (components) and transformations (systems), not objects and methods. Always consult registry examples and design your data model before diving into implementation. This is the key to effective Bevy development.