Xstate
pedronauck/skills
Comprehensive guide for XState v5 ecosystem including state machines, actors, @xstate/store, and TanStack Query integration.
XState v5 state machines, statecharts, and the actor model for complex, event-driven application logic.
$ npx skills add shepherdjerred/monorepo --skill xstate-helper -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install shepherdjerred/monorepo xstate-helper --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/shepherdjerred/monorepo.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/xstate-helper .claude/skills/xstate-helper && 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 "xstate-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/xstate-helper into .claude/skills/xstate-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "xstate-helper", 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/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/xstate-helperType 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 shepherdjerred/monorepo --skill xstate-helper -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install shepherdjerred/monorepo xstate-helper --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .agents/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/xstate-helper .agents/skills/xstate-helper && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "xstate-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/xstate-helper into .agents/skills/xstate-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "xstate-helper", 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 shepherdjerred/monorepo --skill xstate-helper -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install shepherdjerred/monorepo xstate-helper --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/xstate-helper .cursor/skills/xstate-helper && 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 "xstate-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/xstate-helper into .cursor/skills/xstate-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "xstate-helper", 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/shepherdjerred/monorepo.git --path packages/dotfiles/dot_agents/skills/xstate-helper--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 shepherdjerred/monorepo --skill xstate-helper -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install shepherdjerred/monorepo xstate-helper --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/xstate-helper .gemini/skills/xstate-helper && 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 "xstate-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/xstate-helper into .gemini/skills/xstate-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "xstate-helper", 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 shepherdjerred/monorepo xstate-helperInstalls 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 shepherdjerred/monorepo --skill xstate-helper -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .github/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/xstate-helper .github/skills/xstate-helper && 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 "xstate-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/xstate-helper into .github/skills/xstate-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "xstate-helper", 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 shepherdjerred/monorepo --skill xstate-helper -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install shepherdjerred/monorepo xstate-helper --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/xstate-helper .opencode/skills/xstate-helper && 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 "xstate-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/xstate-helper into .opencode/skills/xstate-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "xstate-helper", 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.
xstate-helperXState v5 state machines, statecharts, and the actor model for complex, event-driven application logic.
Xstate Helper is an agent skill from shepherdjerred/monorepo. XState v5 state machines, statecharts, and the actor model for complex, event-driven application logic. When user works with XState, state machines, statecharts, actors, createMachine/setup, createActor, @xstate/react, @xstate/store, useMachine/useActor/useSelector, invoke/spawn, guards/actions/assign, or needs to model complex async flows, wizards, and event-driven state.
Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `references/actors-and-machines.md`, `references/react-integration.md` and `references/testing-and-migration.md`).
It sits in Backend & APIs, covering Event-driven systems. It works with React. The repository describes itself as: Monorepo for all of my projects. The licence is GPL-3.0.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit bc57ca5. 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.
Shell commands in SKILL.md call:
bunFrom 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.
Xstate Helper loads about 3.9k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 97 tokens; SKILL.md has 1,068 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 shepherdjerred/monorepo at commit bc57ca5, republished under its GPL-3.0 licence (© shepherdjerred). 1,068 words, ~3,925 tokens.
.claude/skills/xstate-helper/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.Guidance for XState v5 — state machines, statecharts, and actors. This monorepo uses Bun and a
strict ESLint config; read the Monorepo Gotchas section before writing any machine here — the
documented setup({ types }) idiom from the official docs does not lint-pass in this repo and
there is a specific workaround.
| Package | Latest | Notes |
|---|---|---|
xstate | 5.32.0 | Core. In-repo use: discord-plays-pokemon/.../backend pins ^5.32.0 |
@xstate/react | 6.1.0 | React hooks. peer: react 16.8–19, xstate ^5.28 |
@xstate/store | 4.1.0 | Lightweight store (Zustand-like). React binding is a separate package |
@xstate/store-react | 2.0.0 | React binding for store v4 — @xstate/store/react was removed in v4 |
bun add xstate # core
bun add @xstate/react # React bindings
bun add @xstate/store @xstate/store-react # lightweight store + its React bindingRequires TypeScript 5.0+. In tsconfig.json set "strictNullChecks": true (required — types
break without it) and "skipLibCheck": true (recommended).
v5 made actors first-class, removed v4 magic (typegen, implicit string events, external-by-default
transitions), and added setup() for type safety. Recent 5.x minors:
actor.select(selector, eq?) (5.29) — derive a framework-agnostic Readable<T> off any actor's
snapshot; .get() + .subscribe() (only fires when the selected value changes). No hook needed.route: {} + explicit id is reachable from anywhere via
{ type: 'xstate.route', to: '#id' }. Routes accept a guard (string ref resolved since 5.31.1).getMicrosteps() / getInitialMicrosteps() (5.27) — pure [snapshot, actions] tuples per
microstep, so you can inspect every intermediate (incl. always) state without executing actions.maxIterations (5.31) — infinite-loop guard for eventless transitions (default Infinity).filterEvents (5.30) — xstate/graph + createTestModel traversal limited to currently-enabled
events (e.g. state.can(event)).setup().assign/raise/sendTo/emit/spawnChild/enqueueActions(...) (5.22) — type-bound action
helpers; no inline generics. Current best practice for typed enqueueActions/emit/spawnChild.setup.extend() (5.24) and setup().createStateConfig() (5.21) — composable, modular setups.mapState(snapshot, mapper) (5.31), getNextTransitions(snapshot) (5.26), partial descriptors
in assertEvent(event, 'FEEDBACK.*') (5.25).xstate/graph (@xstate/test is deprecated).@xstate/store v3/v4 — store.trigger.someEvent(...) typed API, .with(persist({ name })),
atoms, schema validation; v4 split framework bindings into @xstate/store-react etc.Everything is an actor. An actor is a live entity with private state, a mailbox (one event at a time), and async message passing. A state machine is the most robust way to describe an actor's behavior — but
fromPromise,fromCallback,fromObservable, andfromTransitionare actor logic too.
createActor(logic) makes a running actor.actor.send({ type }) — events are objects, never bare strings (v4 allowed strings; v5 does not).actor.getSnapshot() reads current state; actor.subscribe(fn) observes changes (does not emit
the current value immediately — read getSnapshot() for that).import { createMachine, createActor } from "xstate";
const toggleMachine = createMachine({
id: "toggle",
initial: "inactive",
states: {
inactive: { on: { toggle: { target: "active" } } },
active: { on: { toggle: { target: "inactive" } } },
},
});
const actor = createActor(toggleMachine);
actor.subscribe((snapshot) => console.log(snapshot.value));
actor.start(); // logs "inactive"
actor.send({ type: "toggle" }); // logs "active"
actor.stop();xstate) — many discrete states, guarded transitions, hierarchy/parallelism, async
orchestration. Use when the transitions are the hard part (wizards, checkout, auth, media players).@xstate/store) — a small, event-based shared-state container (Zustand-like) when you do
not need statecharts. See references/xstate-store.md.useReducer. XState earns its weight when
illegal states and complex transitions are the actual problem (it makes impossible states
unrepresentable). Don't reach for it to hold three booleans.setup({ types, actors, guards, actions, delays }) registers named implementations and types, then
.createMachine(config) references them by string. This is the v5 idiom (v5 has no typegen).
import { setup, assign, fromPromise } from "xstate";
// ⚠️ In THIS repo, do NOT inline `context: {} as Ctx` — see Monorepo Gotchas below.
const machine = setup({
types: {
context: {} as { count: number; user: string | undefined },
events: {} as { type: "inc"; by: number } | { type: "reset" } | { type: "LOAD" },
input: {} as { start: number },
},
actors: {
loadUser: fromPromise(async ({ input }: { input: { id: number } }) => {
const res = await fetch(`/api/users/${input.id}`);
return res.json();
}),
},
guards: {
canInc: ({ context }) => context.count < 100,
},
actions: {
increment: assign({ count: ({ context, event }) => {
// narrow the event to access its payload safely
return event.type === "inc" ? context.count + event.by : context.count;
} }),
},
}).createMachine({
id: "counter",
initial: "idle",
context: ({ input }) => ({ count: input.start, user: undefined }),
states: {
idle: {
on: {
inc: { guard: "canInc", actions: "increment" },
reset: { actions: assign({ count: 0 }) },
LOAD: { target: "loading" },
},
},
loading: {
invoke: {
src: "loadUser",
input: { id: 1 },
onDone: { target: "idle", actions: assign({ user: ({ event }) => event.output.name }) },
onError: { target: "idle" },
},
},
},
});
const actor = createActor(machine, { input: { start: 0 } }).start();
actor.send({ type: "inc", by: 5 });Override implementations per instance with machine.provide({ actions, actors, guards, delays })
(replaces v4 withConfig). See references/actors-and-machines.md for the full machine/actor surface
(hierarchical & parallel states, history, after, always, raise, enqueueActions, emit, spawn).
import { assign, raise, sendTo, enqueueActions, and, or, not, stateIn, assertEvent } from "xstate";
// assign — object or function form; context is immutable, only assign mutates it
assign({ count: ({ context }) => context.count + 1 });
assign(({ context, event }) => ({ count: context.count + 1 }));
// raise — send an event to SELF (optionally delayed)
raise({ type: "RETRY" }, { delay: 1000 });
// sendTo — send to another actor by id, ref, or resolver
sendTo("childId", { type: "PING" });
sendTo(({ context }) => context.someRef, { type: "PING" });
// enqueueActions — replaces v4 choose/pure; imperative composition of actions
enqueueActions(({ context, enqueue, check }) => {
enqueue.assign({ count: context.count + 1 });
if (check({ type: "someGuard" })) enqueue("namedAction");
enqueue.sendTo("childId", { type: "GO" });
});
// guards — string ref, params, or higher-order combinators
guard: and(["isValid", or(["isAdmin", "isGuest"]), not("isBanned")]);
guard: stateIn({ form: "submitting" }); // replaces v4 `in:`
// assertEvent — narrow event type inside an action/guard (throws if wrong)
entry: ({ event }) => {
assertEvent(event, "inc");
console.log(event.by); // typed
};Dynamic params make actions/guards reusable and decoupled from a specific machine — prefer them
over reading event directly:
const m = setup({
actions: { greet: (_, params: { name: string }) => console.log(`Hi ${params.name}`) },
}).createMachine({
entry: { type: "greet", params: ({ context }) => ({ name: context.user.name }) },
});import type { ActorRefFrom, SnapshotFrom, EventFromLogic } from "xstate";
type Ref = ActorRefFrom<typeof machine>; // strongly-typed actor reference (props, child refs)
type Snap = SnapshotFrom<typeof machine>; // typed snapshot
type Ev = EventFromLogic<typeof machine>; // union of all event typesAlso available: ContextFrom, InputFrom, OutputFrom. Use assertEvent instead of casting to
narrow event payloads — the repo bans as casts.
import { useMachine, useActor, useActorRef, useSelector } from "@xstate/react";
const [snapshot, send] = useMachine(machine); // [snapshot, send, actorRef]
const [snapshot2, send2] = useActor(machine); // useMachine is an alias of useActor
const actorRef = useActorRef(machine); // static ref, no re-render on change
const count = useSelector(actorRef, (s) => s.context.count); // re-renders only when count changesProvide per-instance implementations via machine.provide(...); share an actor across a tree with
createActorContext(machine) → { Provider, useSelector, useActorRef }. As of @xstate/react 6.1.0,
useActor/useSelector throw when the actor errors (caught by the nearest error boundary). Full
patterns (composition, createActorContext, persisted state, child→parent comms) in
references/react-integration.md.
A lightweight, type-safe, event-based store for when you don't need a full statechart.
import { createStore } from "@xstate/store";
const store = createStore({
context: { count: 0 },
on: {
// v3+ assigners return the WHOLE new context (spread it), or undefined to disallow
inc: (context, event: { by: number }) => ({ ...context, count: context.count + event.by }),
},
});
store.trigger.inc({ by: 1 }); // typed sugar for store.send({ type: "inc", by: 1 })
store.getSnapshot().context.count; // 1import { useSelector } from "@xstate/store-react"; // NOT "@xstate/store/react" in v4
function Counter() {
const count = useSelector(store, (s) => s.context.count);
return <button onClick={() => store.trigger.inc({ by: 1 })}>{count}</button>;
}See references/xstate-store.md for persist, atoms, schema validation, Immer, undo/redo, and
fromStore interop.
setup({ types }) vs the no-type-assertions ruleThe official docs write setup({ types: { context: {} as Ctx, events: {} as Ev } }). The as casts are
banned by this repo's custom-rules/no-type-assertions ESLint rule — and you cannot just suppress
them with an inline lint-disable directive, because the pre-commit quality-ratchet caps the total
number of allowed suppressions repo-wide, so adding one more fails the commit.
Fix: hoist the phantom types into a single explicitly-annotated holder variable. The annotation (not the literal values) drives XState's inference, so the full event union is preserved:
import { setup } from "xstate";
interface PlaybackContext { count: number }
type PlaybackEvent = { type: "PLAY" } | { type: "SKIP"; n: number } | { type: "STOP" };
interface PlaybackInput { start: number }
// ✅ ONE annotated object variable — annotation carries the union; values are throwaway defaults.
const machineTypes: {
context: PlaybackContext;
events: PlaybackEvent;
input: PlaybackInput;
} = {
context: { count: 0 },
events: { type: "SKIP", n: 1 }, // one member is fine; the annotation supplies the whole union
input: { start: 0 },
};
export const playbackMachine = setup({
types: machineTypes,
// actors, guards, actions...
}).createMachine({
context: ({ input }) => ({ count: input.start }),
// ...
});Pitfall: passing phantoms inline (types: { events: phantomEvent }) or via separate
per-field annotated consts does NOT work — XState's const-generic inference re-narrows events to
the single literal ({ type: "SKIP" }), which breaks actor.send and collapses state values to
never. The single annotated object variable is what locks it.
void genericimport { fromPromise } from "xstate";
// ✅ annotate the destructured param; void return is inferred cleanly
fromPromise(({ input, signal }: { input: { id: string }; signal: AbortSignal }) =>
fetch(`/api/x/${input.id}`, { signal }).then((r) => r.json()),
);
// ❌ fromPromise<void, TInput>(...) trips @typescript-eslint/no-invalid-void-typebun add xstate, never npm/yarn/pnpm. Run Vitest through Bun.as casts anywhere except as const / as unknown — use assertEvent, guards, and the
holder-variable pattern instead of casting.strict-clean; the base ESLint config applies strictTypeChecked.setup() first, then .createMachine() — strongly type context/events/input once; reference
actors/guards/actions by name. Use the holder-variable workaround in this repo.isLoading/isError/isSuccess flags. Illegal combinations become unrepresentable.invoke for a finite, state-bound async task (lifecycle tied to the state);
spawn for a dynamic/unknown number of actors (one per list item). See the actors reference.useSelector — select the slice you need so components re-render only when it changes,
instead of destructuring a whole useActor snapshot.children; wrap with
custom hooks to keep components decoupled.createTestModel(machine) from xstate/graph auto-generates paths
covering every reachable transition; filterEvents limits to currently-enabled events.@xstate/store when you want event-based shared state without a full statechart —
don't over-engineer simple global state into a machine.@xstate/store vs Zustand/Jotai/useReducer.references/testing-and-migration.md.© shepherdjerred, GPL-3.0. 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 4 other files (references) in packages/dotfiles/dot_agents/skills/xstate-helper of shepherdjerred/monorepo.
Open the folder on GitHubat commit bc57ca5
Xstate Helper 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 |
|---|---|---|---|---|---|---|
| Xstate Helper this skillshepherdjerred/monorepo | 112 | — | ~3.9k | Automated safety check: Pass | GPL-3.0 | |
| Xstatepedronauck/skills | 634 | — | ~2.8k | Automated safety check: Pass | None | |
| Structs StreamingLeoYeAI/openclaw-master-skills | 2.2k | — | ~4.3k | Automated safety check: Pass | MIT | |
| Evolutionary Modular Architecturetech-leads-club/agent-skills | 7k | — | ~3.7k | Automated safety check: Pass | CC-BY-4.0 | |
| React Useeffectviclafouch/meme-studio | 110 | — | ~375 | Automated safety check: Pass | None | |
| Effect TSpproenca/dot-skills | 215 | — | ~2k | Automated safety check: Pass | MIT |
pedronauck/skills
Comprehensive guide for XState v5 ecosystem including state machines, actors, @xstate/store, and TanStack Query integration.
LeoYeAI/openclaw-master-skills
Connects to the GRASS real-time event system via NATS WebSocket.
tech-leads-club/agent-skills
Guides design of modular-monolith platforms with DDD, flat-by-aggregate modules, anti-corruption layers, outbox events and resilience, plus an architecture document with SVG diagrams.
viclafouch/meme-studio
Audit React components for unnecessary useEffect hooks. An agent skill from viclafouch/meme-studio.
pproenca/dot-skills
Effect-TS library usage in TypeScript — Effect.gen generators, Schema.Struct/Schema.Class definitions, Layer/Context.Tag/Service patterns, Effect.pipe pipelines, Data.TaggedError/Data.Class error…
fossasia/eventyay
A skill your agent uses when the user wants to provision infrastructure or third-party services using Stripe Projects.
shepherdjerred/monorepo
Bun runtime APIs and current operational patterns for files, processes, modules, networking, databases, tests, and deployment.
shepherdjerred/monorepo
Current Bun test runner guidance for discovery, isolation, parallelism, sharding, changed tests, mocks, timers, snapshots, coverage, DOM Testing Library, and integration teardown.
shepherdjerred/monorepo
Current Bun workspace guidance for isolated and hoisted linkers, catalogs, filters, scripts, dependency classes, lockfiles, lifecycle trust, caches, publishing, TypeScript package exports, and…
shepherdjerred/monorepo
This skill should be used when the user asks to "deep research", "research this topic", "investigate thoroughly", "do a deep dive on", "comprehensive research on", "find everything about", "survey…
shepherdjerred/monorepo
This skill should be used when the user asks to "create a Figma design", "design in Figma", "make a Figma mockup", "create an app icon", "design UI", "render JSX to Figma", "export from Figma"…
shepherdjerred/monorepo
Current Fish shell scripting, functions, abbreviations, completions, variables, events, configuration, plugins, testing, and safety guidance.
Works with
Categories
XState v5 state machines, statecharts, and the actor model for complex, event-driven application logic. Xstate Helper is an agent skill from shepherdjerred/monorepo. XState v5 state machines, statecharts, and the actor model for complex, event-driven application logic.
Xstate Helper fits situations like: works with XState; createMachine/setup; useMachine/useActor/useSelector; guards/actions/assign.
Run `npx skills add shepherdjerred/monorepo --skill xstate-helper -a claude-code`. Or copy the skill folder (packages/dotfiles/dot_agents/skills/xstate-helper in shepherdjerred/monorepo) into .claude/skills/xstate-helper in your project. Claude Code loads it when a task matches its description.
Run `npx skills add shepherdjerred/monorepo --skill xstate-helper -a codex`. Or copy the skill folder (packages/dotfiles/dot_agents/skills/xstate-helper in shepherdjerred/monorepo) into .agents/skills/xstate-helper 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 shepherdjerred/monorepo --skill xstate-helper -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/xstate-helper, .gemini/skills/xstate-helper, .github/skills/xstate-helper and .opencode/skills/xstate-helper in your project.
Going by SKILL.md and its folder, Xstate Helper needs the command-line tools its instructions call (bun).
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.
Xstate Helper is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.9k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Xstate Helper: Xstate (pedronauck/skills, 634 stars), Structs Streaming (LeoYeAI/openclaw-master-skills, 2.2k stars), Evolutionary Modular Architecture (tech-leads-club/agent-skills, 7k stars) and React Useeffect (viclafouch/meme-studio, 110 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
shepherdjerred (a GitHub user) maintains it in shepherdjerred/monorepo, which has 112 GitHub stars. The repository holds 63 skills in this directory. The repository was last updated on October 9, 2026.
Source: shepherdjerred/monorepo on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.