The Plugin and Its Skill
One plugin, arcade-ecs, bundling one skill: arcade-ecs:babylonjsmarket. It fires by description match, so you rarely type its name.
Capability detection comes first
Before recommending anything, the skill runs a bundled detector that lists which @babylonjsmarket/* packages your project actually installs. It then only suggests APIs from those packages — if arcade isn't installed, it won't reach for arcade Components or viz panels; if nothing in the family is present, it says so instead of scaffolding against it. This is what keeps it from confidently recommending an API your project can't import.
What it carries
Authoritative API surface — the public methods and lifecycle hooks of World, Entity, Component, System, EventBus, and SceneLoader, with the rule that the installed .d.ts are the final word on raw signatures. Not training data.
The anti-pattern list — plausible-looking names that don't exist and show up in unguided generation:
entity.getOrThrow(C)→ useentity.get(C)!entity.getComponent(C)/entity.hasComponent(C)→ useentity.get(C)/entity.has(C)world.getAllEntities()→ useworld.getEntities()world.eventBus→ useworld.getEventBus()(the field isprotected)onAttachOverride/onDetachOverrideon a System → those are Component hooks; Systems useonInitialize/onShutdownthis.entities.find(...)→this.entitiesis aSet, not an Array; useworld.getEntity(id)for O(1) lookup
Conventions that the types can't express — event naming (a synonym silently breaks the bus), entity pooling for anything that spawns or dies during play, the .core.ts / .ts file split, storing runtime state off the Component so serialize() round-trips, and the renderer-adapter subpaths (@babylonjsmarket/ecs/babylon, /three, /testing).
Scaffolding — generating a new {Name}Component + {Name}System + events with subscriptions cleaned up correctly, and spinning up a new arcade game through npm create @babylonjsmarket/arcade.
Viz debug panels — the vizStore panel conventions (@babylonjsmarket/arcade/viz), when arcade is installed.
When it fires — and when it doesn't
It's scoped to writing or reviewing code that touches @babylonjsmarket/ecs / arcade — a class extending System/Component, scene JSON, a .viz.tsx panel, event names on the bus, or a scaffolding request. If you're on the website, an unrelated CLI, or anything outside the family, it stays quiet. That's intentional.
To force-invoke explicitly:
But in practice, describing what you want plainly is enough.
