ansible-automation-eng…
Ansible automation: playbooks, roles, collections, Molecule testing, Vault security.
**Scope**: GPU particles with @spd789562/pixi-v8-particle-emitter, wrestling presets, DOM particle replacement **Version range**: pixi.js ^8.5.0
$ npx -y skills add notque/vexjoy-agent --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
**Scope**: GPU particles with @spd789562/pixi-v8-particle-emitter, wrestling presets, DOM particle replacement **Version range**: pixi.js ^8.5.0
> **Scope**: GPU particles with @spd789562/pixi-v8-particle-emitter, wrestling presets, DOM particle replacement > **Version range**: pixi.js ^8.5.0
---
The `effects.ts` failure mode — `document.createElement` + `setTimeout` removal — causes reflow per particle. GPU particles via `ParticleContainer`: 1000 particles = 1 draw call, zero reflow.
---
`@spd789562/pixi-v8-particle-emitter` is on JSR (original `@pixi/particle-emitter` is v7 only):
npx jsr add @spd789562/particle-emitter
---
import { Emitter } from '@spd789562/particle-emitter';
import { ParticleContainer, Assets } from 'pixi.js';
export class ParticleManager {
private particleContainer: ParticleContainer;
private activeEmitters: Map<string, Emitter> = new Map();
constructor(parentContainer: Container) {
this.particleContainer = new ParticleContainer(5000, {
position: true, alpha: true, scale: true, rotation: true, tint: true,
});
parentContainer.addChild(this.particleContainer);
}
update(deltaMS: number): void {
for (const [id, emitter] of this.activeEmitters) {
emitter.update(deltaMS * 0.001);
if (!emitter.emit && emitter.particleCount === 0) {
emitter.destroy();
this.activeEmitters.delete(id);
}
}
}
async spawnEffect(type: WrestlingEffect, x: number, y: number): Promise<void> {
const config = EFFECT_CONFIGS[type];
if (!config) return;
const texture = await Assets.load(config.texturePath);
const emitter = new Emitter(this.particleContainer, { ...config.emitterConfig, pos: { x, y } });
this.activeEmitters.set(`${type}-${Date.now()}`, emitter);
}
destroy(): void {
for (const emitter of this.activeEmitters.values()) emitter.destroy();
this.activeEmitters.clear();
this.particleContainer.destroy();
}
}---
Key fields: `emitterLifetime: 0.05-0.15` = burst; `-1` = infinite. `maxParticles` = burst peak (silent drops if too low).
const STRIKE_CONFIG: EmitterConfig = {
lifetime: { min: 0.15, max: 0.3 }, frequency: 0.001, emitterLifetime: 0.05, maxParticles: 20,
pos: { x: 0, y: 0 },
behaviors: [
{ type: 'alpha', config: { alpha: { list: [{ value: 1, time: 0 }, { value: 0, time: 1 }] } } },
{ type: 'scale', config: { scale: { list: [{ value: 0.8, time: 0 }, { value: 0.1, time: 1 }] }, minMult: 0.5 } },
{ type: 'color', config: { color: { list: [{ value: 'ff9500', time: 0 }, { value: 'ffcc00', time: 0.5 }, { value: 'ffffff', time: 1 }] } } },
{ type: 'moveSpeedStatic', config: { min: 200, max: 400 } },
{ type: 'rotationStatic', config: { min: 0, max: 360 } },
{ type: 'spawnShape', config: { type: 'circle', data: { radius: 5 } } },
],
};const AERIAL_CONFIG: EmitterConfig = {
lifetime: { min: 0.3, max: 0.5 }, frequency: 0.002, emitterLifetime: 0.1, maxParticles: 25,
behaviors: [
{ type: 'alpha', config: { alpha: { list: [{ value: 0.8, time: 0 }, { value: 0, time: 1 }] } } },
{ type: 'scale', config: { scale: { list: [{ value: 0.3, time: 0 }, { value: 1.5, time: 1 }] } } },
{ type: 'color', config: { color: { list: [{ value: 'c8a882', time: 0 }, { value: '806040', time: 1 }] } } },
{ type: 'moveSpeedStatic', config: { min: 50, max: 150 } },
{ type: 'rotationStatic', config: { min: 0, max: 360 } },
{ type: 'spawnShape', config: { type: 'circle', data: { radius: 30 } } },
],
};const SUBMISSION_CONFIG: EmitterConfig = {
lifetime: { min: 0.5, max: 1.0 }, frequency: 0.05, emitterLifetime: -1, maxParticles: 60,
behaviors: [
{ type: 'alpha', config: { alpha: { list: [{ value: 0, time: 0 }, { value: 0.8, time: 0.2 }, { value: 0, time: 1 }] } } },
{ type: 'scale', config: { scale: { list: [{ value: 0.2, time: 0 }, { value: 0.6, time: 0.5 }, { value: 0.1, time: 1 }] }, minMult: 0.3 } },
{ type: 'color', config: { color: { list: [{ value: '00c8ff', time: 0 }, { value: '0080c0', time: 0.5 }, { value: '004080', time: 1 }] } } },
{ type: 'moveSpeedStatic', config: { min: 20, max: 80 } },
{ type: 'spawnShape', config: { type: 'circle', data: { radius: 15 } } },
],
};
// Stop: emitter.emit = false; let particles exhaustconst BLOCK_CONFIG: EmitterConfig = {
lifetime: { min: 0.1, max: 0.2 }, frequency: 0.001, emitterLifetime: 0.02, maxParticles: 15,
behaviors: [
{ type: 'alpha', config: { alpha: { list: [{ value: 1, time: 0 }, { value: 0, time: 1 }] } } },
{ type: 'scale', config: { scale: { list: [{ value: 1.0, time: 0 }, { value: 0.2, time: 1 }] } } },
{ type: 'color', config: { color: { list: [{ value: '80ffff', time: 0 }, { value: '0080ff', time: 1 }] } } },
{ type: 'moveSpeedStatic', config: { min: 100, max: 300 } },
{ type: 'rotationStatic', config: { min: 0, max: 360 } },
{ type: 'spawnShape', config: { type: 'circle', data: { radius: 10 } } },
],
};const FINISHER_CONFIG: EmitterConfig = {
lifetime: { min: 0.5, max: 1.0 }, frequency: 0.001, emitterLifetime: 0.15, maxParticles: 50,
behaviors: [
{ type: 'alpha', config: { alpha: { list: [{ value: 1, time: 0 }, { value: 0.8, time: 0.5 }, { value: 0, time: 1 }] } } },
{ type: 'scale', config: { scale: { list: [{ value: 1.5, time: 0 }, { value: 0.2, time: 1 }] }, minMult: 0.8 } },
{ type: 'color', config: { color: { list: [{ value: 'ffffff', time: 0 }, { value: 'ffdd00', time: 0.3 }, { value: 'ff8800', time: 0.7 }, { value: 'ff2200', time: 1 }] } } },
{ type: 'moveSpeedStatic', config: { min: 150, max: 500 } },
{ type: 'rotationStatic', config: { min: 0, max: 360 } },
{ type: 'spawnShape', config: { typEssays and writing behind this toolkit live at vexjoy.com. VexJoy Agent connects plain-English requests to specialist agents, skills, and workflows. /do selects the knowledge and tools needed for your task.
Repo: notque/vexjoy-agent
Ansible automation: playbooks, roles, collections, Molecule testing, Vault security.
**Scope**: Module selection patterns, builtin vs command/shell decisions, collection modules, and version-specific module changes **Version range**:…
**Scope**: Molecule test scenarios, ansible-lint rules, idempotency validation, and check-mode patterns **Version range**: Molecule 6.0+ / ansible-lint 6.0+ /…
Universal rules injected by /do at dispatch. Each agent's .md file supplies domain rules.
**Scope**: Failure modes in agent output style — over-reporting, self-congratulation, verbose narration, and hedging. Covers what to detect and how to fix…
Zero-dependency combat visual upgrades: CSS particle replacement, Framer Motion combat juice, CSS 3D card transforms.