Agent skill

Adobe Data ECS Plugin Rules

by paralleldrive in paralleldrive/aidd

Enforces @adobe/data/ecs practices when writing Database.Plugin definitions, including property order, plugin composition, services, components, resources and archetypes.

MITAuto-check passedDevelopment

Install Adobe Data ECS Plugin Rules

skills CLI
$ npx skills add paralleldrive/aidd --skill aidd-ecs -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install paralleldrive/aidd aidd-ecs --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/paralleldrive/aidd.git skills-src && mkdir -p .claude/skills && cp -r skills-src/ai/skills/aidd-ecs .claude/skills/aidd-ecs && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
aidd-ecs
GitHub stars
384
Token cost
~1.9k tokens
SKILL.md length
294 words
Files
3
Skills in repo
35
Repo updated
First seen
Licence
MIT

At a glance

Enforces @adobe/data/ecs practices when writing Database.Plugin definitions, including property order, plugin composition, services, components, resources and archetypes.

  • Creating or modifying a Database.Plugin definition
  • SKILL.md covers Property order (enforced at…, Composition, Property details and Naming conventions, plus 3 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md
  • Combining several ECS plugins into one app plugin

What it does

This skill applies whenever code imports @adobe/data/ecs or defines Database.Plugin plugins that deal with components, resources, transactions, actions, systems or services. Plugins are created with Database.Plugin.create, and their properties must appear in a fixed order that is enforced at runtime, starting with extends and services, though all of them are optional. Extending works with a single plugin, so Database.Plugin.combine merges several, and a final app plugin combines every feature plugin.

Property guidance covers services as singleton factories whose extended plugins initialize first; components as schema objects, with transient: true for values that cannot be persisted, such as DOM elements; resources as global state, typed with an as-Type cast, or a null-as-unknown cast when the value is set later in a system initializer; and archetypes for querying and inserting related components. A companion data-modeling.md file gives simple examples.

When your agent uses it

  • Creating or modifying a Database.Plugin definition
  • Combining several ECS plugins into one app plugin
  • Deciding how to declare resources, components or archetypes

Example prompts

  • “Create an auth plugin with Database.Plugin.create that extends the environment plugin.”
  • “Combine the theme, data and UI plugins into the app plugin.”
  • “Add a DOM element component that is excluded from serialization.”

Requirements

  • A project that uses @adobe/data/ecs

What it can do on your machine

Read from SKILL.md and the folder at commit 9a7c8e3. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript and sudolang).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Adobe Data ECS Plugin Rules loads about 1.9k tokens when it runs. Until then it costs about 61 tokens; SKILL.md has 294 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~61
When it runs · the whole SKILL.md, loaded when a task matches
~1.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from paralleldrive/aidd at commit 9a7c8e3, republished under its MIT licence (© paralleldrive). 294 words, ~1,893 tokens.

Download SKILL.mdSave it as .claude/skills/aidd-ecs/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
aidd-ecs
description
Enforces @adobe/data/ecs best practices. Use this whenever @adobe/data/ecs is imported, when creating or modifying Database.Plugin definitions, or when working with ECS components, resources, transactions, actions, systems, or services.

Database.Plugin authoring

Plugins are created with Database.Plugin.create() from @adobe/data/ecs.

Property order (enforced at runtime)

Properties must appear in this exact order. All are optional.

sudolang
PluginPropertyOrder [
  "extends — Plugin, base plugin to extend"
  "services — (db) => ServiceInstance, singleton service factories"
  "components — schema object, ECS component schemas"
  "resources — { default: value as Type }, global resource schemas"
  "archetypes — ['comp1', 'comp2'], standard ECS archetypes; storage tables for efficient insertions"
  "computed — (db) => Observe<T>, computed observables"
  "transactions — (store, payload) => void, synchronous deterministic atomic mutations"
  "actions — (db, payload) => T, general functions"
  "systems — { create: (db) => fn | void }, per-frame (60fps) or init-only"
]

Constraints {
  Properties must appear in this exact order; wrong order throws at runtime
}

Composition

Single extension — one plugin extends another:

ts
export const authPlugin = Database.Plugin.create({
  extends: environmentPlugin,
  services: {
    auth: db => AuthService.createLazy({ services: db.services }),
  },
});

Combine — extends accepts only one plugin. To extend from multiple use Database.Plugin.combine:

ts
export const generationPlugin = Database.Plugin.create({
  extends: Database.Plugin.combine(aPlugin, bPlugin),
  computed: {
    max: db => Observe.withFilter(
        Observe.fromProperties({
            a: db.observe.resources.a,
            b: db.observe.resources.b
        }),
        ({ a, b }) => Math.max(a, b)
    )
  },
});

Final composition — combine all plugins into the app plugin:

ts
export const appPlugin = Database.Plugin.combine(
  corePlugin, themePlugin, dataPlugin,
  authPlugin, uiPlugin, featurePlugin
);

export type AppPlugin = typeof appPlugin;
export type AppDatabase = Database.Plugin.ToDatabase<AppPlugin>;

Property details

services

Factory functions creating singleton services. Extended plugin services initialize first, so db.services has access to them.

ts
services: {
  environment: _db => EnvironmentService.create(),
}
components

Schema objects defining ECS component data. Use schema imports from type namespaces or inline schemas. See data-modeling.md for a simple example.

ts
components: {
  layout: Layout.schema,
  layoutElement: { default: null as unknown as HTMLElement, transient: true },
  layoutLayer: F32.schema,
},

Non-persistable values (e.g. HTML elements, DOM refs) must use transient: true — excluded from serialization.

resources

Global state not tied to entities. Use as Type to provide the compile-time type — without it the value is treated as a const literal. See data-modeling.md for patterns.

ts
resources: {
  themeColor: { default: 'dark' as ThemeColor },
  themeScale: { default: 'medium' as ThemeScale },
},

Use null as unknown as Type for resources initialized later in a system initializer:

ts
resources: {
  connection: { default: null as unknown as WebSocket },
},
archetypes

Standard ECS archetypes. Used for querying and inserting related components. See data-modeling.md for a simple example.

ts
archetypes: {
  Layout: ['layout', 'layoutElement', 'layoutLayer'],
},
computed

Factory returning Observe<T> or (...args) => Observe<T>. Receives full db.

ts
computed: {
  max: db => Observe.withFilter(
    Observe.fromProperties({
      a: db.observe.resources.a,
      b: db.observe.resources.b,
    }),
    ({ a, b }) => Math.max(a, b)
  ),
},
transactions

Synchronous, deterministic atomic mutations. Receive store and a payload. Store allows direct, immediate mutation of all entities, components, and resources.

ts
transactions: {
  updateLayout: (store, { entity, layout }: { entity: Entity; layout: Layout }) => {
    store.update(entity, { layout });
  },
  setThemeColor: (store, color: ThemeColor) => {
    store.resources.themeColor = color;
  },
},
sudolang
StoreAPI {
  "store.update(entity, data)" = "update entity components"
  "store.resources.x = value" = "mutate resources"
  "store.get(entity, 'component')" = "read component value"
  "store.read(entity)" = "read all entity component values"
  "store.read(entity, archetype)" = "read entity component values in archetype"
  "store.select(archetype.components, { where })" = "query entities"
}
actions

General functions with access to the full db. Can return anything or nothing. UI components that call actions MUST never consume returned values — call for side effects only. Consuming return values violates unidirectional flow (data down via Observe, actions up as void). Call at most one transaction per action; multiple transactions corrupt the undo/redo stack.

ts
actions: {
  generateNewName: async (db) => {
    const generatedName = await db.services.nameGenerator.generateName();
    db.transactions.setName(generatedName);
  },
  getAuth: db => db.services.auth,
},
systems

create receives db and may optionally return a per-frame function (60fps) or just initialize values. Always called synchronously when database.extend(plugin) runs.

ts
systems: {
  ui_state_plugin_initialize: {
    create: db => {
      db.transactions.registerViews(views);
    },
  },
  layout_plugin__system: {
    create: db => {
      const observer = new ResizeObserver(/* ... */);
      Database.observeSelectDeep(db, db.archetypes.Layout.components)(entries => {
        // react to entity changes
      });
    },
  },
},

System scheduling (optional):

ts
systems: {
  physics: {
    create: db => () => { /* per-tick work */ },
    schedule: {
      before: ['render'],
      after: ['input'],
      during: ['simulation'],
    },
  },
},
sudolang
Schedule {
  before: "hard ordering constraints"
  after: "hard ordering constraints"
  during: "soft preference for same execution tier"
}

Naming conventions

sudolang
PluginNaming {
  file: "*-plugin.ts (kebab-case) — e.g. layout-plugin.ts"
  export: "*Plugin (camelCase) — e.g. layoutPlugin"
  system: "plugin_name__system (snake_case, double underscore) — e.g. layout_plugin__system"
  initSystem: "plugin_name_initialize — e.g. ui_state_plugin_initialize"
}

Type utilities

ts
export type MyDatabase = Database.Plugin.ToDatabase<typeof myPlugin>;
export type MyStore = Database.Plugin.ToStore<typeof myPlugin>;

Execute

sudolang
fn whenCreatingOrModifyingPlugin() {
  Constraints {
    Verify property order matches (extends, services, components, resources, archetypes, computed, transactions, actions, systems)
    Use extends for single-parent; Database.Plugin.combine() for multiple peers
    Ensure services only access db.services from extended plugins (not forward references)
    Export type *Database = Database.Plugin.ToDatabase<typeof *Plugin> when consumers need typed db access
    Follow naming conventions for files, exports, and systems
  }
}

Additional resources

  • data-modeling.md — Components, resources, and archetypes (particle simulation example)

© paralleldrive, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 2 other files in ai/skills/aidd-ecs of paralleldrive/aidd.

  • SKILL.md
  • README.md
  • data-modeling.md

Open the folder on GitHubat commit 9a7c8e3

Compare with similar skills

Adobe Data ECS Plugin Rules next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Adobe Data ECS Plugin Rules compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Adobe Data ECS Plugin Rules this skillparalleldrive/aidd384—~1.9kAutomated safety check: PassMIT
RTK Rust Design Patternsrtk-ai/rtk83k—~1.9kAutomated safety check: PassApache-2.0
Effect Client WrapperUsefulSoftwareCo/executor4.1k1 repos~1.4kAutomated safety check: PassMIT
GitVersion .NET DevelopmentGitTools/GitVersion3.1k—~1.7kAutomated safety check: PassMIT
AST Visitor Pattern for Unionsprisma/orm48k—~830Automated safety check: PassApache-2.0
Typed Dependencies with fp-go EffectIBM/fp-go2k—~4.3kAutomated safety check: PassApache-2.0

Similar skills

  • Describes seven Rust design patterns for the RTK CLI filter modules, with when to use each, RTK examples, and notes on when a pattern is overkill.

    83k GitHub stars~1.9k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Effect Client Wrapper

    UsefulSoftwareCo/executor

    Pattern for wrapping third-party SDK clients (Stripe, Resend, AWS, etc.) with Effect.

    4.1k GitHub starsUsed in 1 repo~1.4k tokens
    DevelopmentAuto-check passed
  • GitVersion .NET Development

    GitTools/GitVersion

    Gives repository-specific .NET guidance for GitVersion: build and test commands, central package management, project layout and coding conventions.

    3.1k GitHub stars~1.7k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Official

    Replaces a plain TypeScript union plus switch statements with frozen subclasses and a visitor interface when several places dispatch on the same variants.

    48k GitHub stars~830 tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Teaches an agent to write fp-go v2 services with the Effect type, carrying dependencies in its type parameter instead of in context.Context or parameters.

    2k GitHub stars~4.3k tokensUpdated today
    DevelopmentAuto-check passed
  • Official

    Generates or hand-writes composable lenses for the fp-go library so nested Go structs can be read and updated immutably.

    2k GitHub stars~4.3k tokensUpdated today
    DevelopmentAuto-check passed

More from paralleldrive/aidd

All 35 skills in this repo
  • AIDD Skill Authoring Guide

    paralleldrive/aidd

    Guides creating, reviewing or refactoring AI-Driven Development skills so each one stays minimal, composable and named around a single clear function.

    384 GitHub stars~1.1k tokensUpdated 3 mo ago
    Auto-check passed
  • AIDD UI Layout Patterns

    paralleldrive/aidd

    Enforces a split of UI components into terminal and layout types, with layout components composing others through standard layout tokens, for cleaner structure and fewer re-renders.

    384 GitHub stars~562 tokensUpdated 3 mo ago
    Auto-check passed
  • Error Causes Handling

    paralleldrive/aidd

    Has your agent throw and catch JavaScript and TypeScript errors with the error-causes library, using named causes, preserved originals and routed handlers.

    384 GitHub stars~1.1k tokensUpdated 3 mo ago
    Auto-check passed
  • Teaches the saga pattern with call and put so network requests and side effects stay out of the logic and sagas can be tested without mocks.

    384 GitHub stars~587 tokensUpdated 3 mo ago
    Auto-check passed
  • Lit Element Authoring

    paralleldrive/aidd

    Rules for writing Lit elements in an AIDD project: binding elements on DatabaseElement, observed values, presentation components and action-style callbacks.

    384 GitHub stars~1.2k tokensUpdated 3 mo ago
    Auto-check passed
  • Epic Changelog Logger

    paralleldrive/aidd

    Adds completed epics to a changelog in reverse chronological order, one emoji-tagged line each, covering only significant user-facing work.

    384 GitHub stars~461 tokensUpdated 3 mo ago
    Auto-check passed

Categories

Questions about Adobe Data ECS Plugin Rules

What does Adobe Data ECS Plugin Rules do?

Enforces @adobe/data/ecs practices when writing Database.Plugin definitions, including property order, plugin composition, services, components, resources and archetypes. Plugin plugins that deal with components, resources, transactions, actions, systems or services.create, and their properties must appear in a fixed order that is enforced at runtime, starting with extends and services, though all of them are optional.

When should I use Adobe Data ECS Plugin Rules?

Adobe Data ECS Plugin Rules fits situations like: creating or modifying a Database.Plugin definition; combining several ECS plugins into one app plugin; deciding how to declare resources, components or archetypes.

How do I install Adobe Data ECS Plugin Rules in Claude Code?

Run `npx skills add paralleldrive/aidd --skill aidd-ecs -a claude-code`. Or copy the skill folder (ai/skills/aidd-ecs in paralleldrive/aidd) into .claude/skills/aidd-ecs in your project. Claude Code loads it when a task matches its description.

How do I install Adobe Data ECS Plugin Rules in Codex?

Run `npx skills add paralleldrive/aidd --skill aidd-ecs -a codex`. Or copy the skill folder (ai/skills/aidd-ecs in paralleldrive/aidd) into .agents/skills/aidd-ecs in your project. Codex loads it when a task matches its description.

Can I use Adobe Data ECS Plugin Rules in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add paralleldrive/aidd --skill aidd-ecs -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/aidd-ecs, .gemini/skills/aidd-ecs, .github/skills/aidd-ecs and .opencode/skills/aidd-ecs in your project.

What does Adobe Data ECS Plugin Rules need to run?

SKILL.md names no scripts, command-line tools or credentials: Adobe Data ECS Plugin Rules is instructions for the agent only. Our summary lists: A project that uses @adobe/data/ecs.

Does Adobe Data ECS Plugin Rules access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Adobe Data ECS Plugin Rules safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Adobe Data ECS Plugin Rules use?

Adobe Data ECS Plugin Rules is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Adobe Data ECS Plugin Rules use?

About 1.9k tokens (SKILL.md is roughly 7.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Adobe Data ECS Plugin Rules?

Skills that share tags, products or a category with Adobe Data ECS Plugin Rules: RTK Rust Design Patterns (rtk-ai/rtk, 83k stars), Effect Client Wrapper (UsefulSoftwareCo/executor, 4.1k stars), GitVersion .NET Development (GitTools/GitVersion, 3.1k stars) and AST Visitor Pattern for Unions (prisma/orm, 48k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Adobe Data ECS Plugin Rules?

paralleldrive (a GitHub organization) maintains it in paralleldrive/aidd, which has 384 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on June 12, 2026.

Source: paralleldrive/aidd on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.