RTK Rust Design Patterns
rtk-ai/rtk
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.
Enforces @adobe/data/ecs practices when writing Database.Plugin definitions, including property order, plugin composition, services, components, resources and archetypes.
$ npx skills add paralleldrive/aidd --skill aidd-ecs -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install paralleldrive/aidd aidd-ecs --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "aidd-ecs" agent skill from https://github.com/paralleldrive/aidd/tree/main/ai/skills/aidd-ecs into .claude/skills/aidd-ecs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aidd-ecs", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/paralleldrive/aidd/tree/main/ai/skills/aidd-ecsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add paralleldrive/aidd --skill aidd-ecs -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install paralleldrive/aidd aidd-ecs --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/paralleldrive/aidd.git skills-src && mkdir -p .agents/skills && cp -r skills-src/ai/skills/aidd-ecs .agents/skills/aidd-ecs && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "aidd-ecs" agent skill from https://github.com/paralleldrive/aidd/tree/main/ai/skills/aidd-ecs into .agents/skills/aidd-ecs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aidd-ecs", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add paralleldrive/aidd --skill aidd-ecs -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install paralleldrive/aidd aidd-ecs --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/paralleldrive/aidd.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/ai/skills/aidd-ecs .cursor/skills/aidd-ecs && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "aidd-ecs" agent skill from https://github.com/paralleldrive/aidd/tree/main/ai/skills/aidd-ecs into .cursor/skills/aidd-ecs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aidd-ecs", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/paralleldrive/aidd.git --path ai/skills/aidd-ecs--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add paralleldrive/aidd --skill aidd-ecs -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install paralleldrive/aidd aidd-ecs --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/paralleldrive/aidd.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/ai/skills/aidd-ecs .gemini/skills/aidd-ecs && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "aidd-ecs" agent skill from https://github.com/paralleldrive/aidd/tree/main/ai/skills/aidd-ecs into .gemini/skills/aidd-ecs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aidd-ecs", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install paralleldrive/aidd aidd-ecsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add paralleldrive/aidd --skill aidd-ecs -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/paralleldrive/aidd.git skills-src && mkdir -p .github/skills && cp -r skills-src/ai/skills/aidd-ecs .github/skills/aidd-ecs && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "aidd-ecs" agent skill from https://github.com/paralleldrive/aidd/tree/main/ai/skills/aidd-ecs into .github/skills/aidd-ecs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aidd-ecs", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add paralleldrive/aidd --skill aidd-ecs -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install paralleldrive/aidd aidd-ecs --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/paralleldrive/aidd.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/ai/skills/aidd-ecs .opencode/skills/aidd-ecs && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "aidd-ecs" agent skill from https://github.com/paralleldrive/aidd/tree/main/ai/skills/aidd-ecs into .opencode/skills/aidd-ecs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aidd-ecs", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
aidd-ecsEnforces @adobe/data/ecs practices when writing Database.Plugin definitions, including property order, plugin composition, services, components, resources and archetypes.
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.
Read from SKILL.md and the folder at commit 9a7c8e3. It shows what the files ask for, not the result of running them.
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.
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.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from paralleldrive/aidd at commit 9a7c8e3, republished under its MIT licence (© paralleldrive). 294 words, ~1,893 tokens.
.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.Plugins are created with Database.Plugin.create() from @adobe/data/ecs.
Properties must appear in this exact order. All are optional.
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
}Single extension — one plugin extends another:
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:
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:
export const appPlugin = Database.Plugin.combine(
corePlugin, themePlugin, dataPlugin,
authPlugin, uiPlugin, featurePlugin
);
export type AppPlugin = typeof appPlugin;
export type AppDatabase = Database.Plugin.ToDatabase<AppPlugin>;Factory functions creating singleton services. Extended plugin services initialize first, so db.services has access to them.
services: {
environment: _db => EnvironmentService.create(),
}Schema objects defining ECS component data. Use schema imports from type namespaces or inline schemas. See data-modeling.md for a simple example.
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.
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.
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:
resources: {
connection: { default: null as unknown as WebSocket },
},Standard ECS archetypes. Used for querying and inserting related components. See data-modeling.md for a simple example.
archetypes: {
Layout: ['layout', 'layoutElement', 'layoutLayer'],
},Factory returning Observe<T> or (...args) => Observe<T>. Receives full db.
computed: {
max: db => Observe.withFilter(
Observe.fromProperties({
a: db.observe.resources.a,
b: db.observe.resources.b,
}),
({ a, b }) => Math.max(a, b)
),
},Synchronous, deterministic atomic mutations. Receive store and a payload. Store allows direct, immediate mutation of all entities, components, and resources.
transactions: {
updateLayout: (store, { entity, layout }: { entity: Entity; layout: Layout }) => {
store.update(entity, { layout });
},
setThemeColor: (store, color: ThemeColor) => {
store.resources.themeColor = color;
},
},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"
}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.
actions: {
generateNewName: async (db) => {
const generatedName = await db.services.nameGenerator.generateName();
db.transactions.setName(generatedName);
},
getAuth: db => db.services.auth,
},create receives db and may optionally return a per-frame function (60fps) or just initialize values. Always called synchronously when database.extend(plugin) runs.
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):
systems: {
physics: {
create: db => () => { /* per-tick work */ },
schedule: {
before: ['render'],
after: ['input'],
during: ['simulation'],
},
},
},Schedule {
before: "hard ordering constraints"
after: "hard ordering constraints"
during: "soft preference for same execution tier"
}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"
}export type MyDatabase = Database.Plugin.ToDatabase<typeof myPlugin>;
export type MyStore = Database.Plugin.ToStore<typeof myPlugin>;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
}
}© paralleldrive, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files in ai/skills/aidd-ecs of paralleldrive/aidd.
Open the folder on GitHubat commit 9a7c8e3
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Adobe Data ECS Plugin Rules this skillparalleldrive/aidd | 384 | — | ~1.9k | Automated safety check: Pass | MIT | |
| RTK Rust Design Patternsrtk-ai/rtk | 83k | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Effect Client WrapperUsefulSoftwareCo/executor | 4.1k | 1 repos | ~1.4k | Automated safety check: Pass | MIT | |
| GitVersion .NET DevelopmentGitTools/GitVersion | 3.1k | — | ~1.7k | Automated safety check: Pass | MIT | |
| AST Visitor Pattern for Unionsprisma/orm | 48k | — | ~830 | Automated safety check: Pass | Apache-2.0 | |
| Typed Dependencies with fp-go EffectIBM/fp-go | 2k | — | ~4.3k | Automated safety check: Pass | Apache-2.0 |
rtk-ai/rtk
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.
UsefulSoftwareCo/executor
Pattern for wrapping third-party SDK clients (Stripe, Resend, AWS, etc.) with Effect.
GitTools/GitVersion
Gives repository-specific .NET guidance for GitVersion: build and test commands, central package management, project layout and coding conventions.
prisma/orm
Replaces a plain TypeScript union plus switch statements with frozen subclasses and a visitor interface when several places dispatch on the same variants.
IBM/fp-go
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.
IBM/fp-go
Generates or hand-writes composable lenses for the fp-go library so nested Go structs can be read and updated immutably.
paralleldrive/aidd
Guides creating, reviewing or refactoring AI-Driven Development skills so each one stays minimal, composable and named around a single clear function.
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.
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.
paralleldrive/aidd
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.
paralleldrive/aidd
Rules for writing Lit elements in an AIDD project: binding elements on DatabaseElement, observed values, presentation components and action-style callbacks.
paralleldrive/aidd
Adds completed epics to a changelog in reverse chronological order, one emoji-tagged line each, covering only significant user-facing work.
Categories
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.