Agent skill

Xstate Helper

by shepherdjerred in shepherdjerred/monorepo

XState v5 state machines, statecharts, and the actor model for complex, event-driven application logic.

GPL-3.0Auto-check passedBackend & APIs

Install Xstate Helper

skills CLI
$ npx skills add shepherdjerred/monorepo --skill xstate-helper -a claude-code

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

GitHub CLI
$ gh skill install shepherdjerred/monorepo xstate-helper --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/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-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
xstate-helper
GitHub stars
112
Token cost
~3.9k tokens
SKILL.md length
1,068 words
Files
5 (incl. references)
Skills in repo
63
Repo updated
First seen
Licence
GPL-3.0

At a glance

XState v5 state machines, statecharts, and the actor model for complex, event-driven application logic.

  • Works in 3 steps: setup({ types }) vs the… → Promise actors — annotate the param,… → Repo conventions
  • Works with XState
  • SKILL.md covers Versions (verified mid-2026), What's New in XState v5…, Core Mental Model and setup() + createMachine — the…, plus 7 more sections
  • Calls bun

What it does

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.

When your agent uses it

  • Works with XState
  • CreateMachine/setup
  • UseMachine/useActor/useSelector
  • Guards/actions/assign

Example prompts

  • “/xstate-helper”

Workflow steps

3 steps, taken from the step headings in SKILL.md.

  1. setup({ types }) vs the no-type-assertions rule
  2. Promise actors — annotate the param, don't use a void generic
  3. Repo conventions

What it can do on your machine

Read from SKILL.md and the folder at commit bc57ca5. 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

    Shell commands in SKILL.md call:

    • bun

    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

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.

Always · name and description, kept in context so the agent knows when to use it
~97
When it runs · the whole SKILL.md, loaded when a task matches
~3.9k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~11k

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 shepherdjerred/monorepo at commit bc57ca5, republished under its GPL-3.0 licence (© shepherdjerred). 1,068 words, ~3,925 tokens.

Download SKILL.mdSave it as .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.
name
xstate-helper
description
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.

XState Helper Agent

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.

Versions (verified mid-2026)

PackageLatestNotes
xstate5.32.0Core. In-repo use: discord-plays-pokemon/.../backend pins ^5.32.0
@xstate/react6.1.0React hooks. peer: react 16.8–19, xstate ^5.28
@xstate/store4.1.0Lightweight store (Zustand-like). React binding is a separate package
@xstate/store-react2.0.0React binding for store v4 — @xstate/store/react was removed in v4
bash
bun add xstate                 # core
bun add @xstate/react          # React bindings
bun add @xstate/store @xstate/store-react   # lightweight store + its React binding

Requires TypeScript 5.0+. In tsconfig.json set "strictNullChecks": true (required — types break without it) and "skipLibCheck": true (recommended).

What's New in XState v5 (2024–2026)

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.
  • Routable states (5.28) — a state with 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).
  • Model-based testing moved into core — import from 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.

Core Mental Model

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, and fromTransition are actor logic too.

  • Logic (the machine/definition) is inert. 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).
ts
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();
Machine vs Store — pick the right tool
  • State machine (xstate) — many discrete states, guarded transitions, hierarchy/parallelism, async orchestration. Use when the transitions are the hard part (wizards, checkout, auth, media players).
  • Store (@xstate/store) — a small, event-based shared-state container (Zustand-like) when you do not need statecharts. See references/xstate-store.md.
  • Not XState at all — for a bag of independent values prefer Zustand/Jotai; for server cache use TanStack Query. A localized form/wizard reducer can just be 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() + createMachine — the typed entry point

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).

ts
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).

Context, Actions & Guards (quick reference)

ts
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:

ts
const m = setup({
  actions: { greet: (_, params: { name: string }) => console.log(`Hi ${params.name}`) },
}).createMachine({
  entry: { type: "greet", params: ({ context }) => ({ name: context.user.name }) },
});

TypeScript helpers

ts
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 types

Also available: ContextFrom, InputFrom, OutputFrom. Use assertEvent instead of casting to narrow event payloads — the repo bans as casts.

@xstate/react (summary)

tsx
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 changes

Provide 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.

Show full SKILL.md (432 more words)Show less

@xstate/store (summary)

A lightweight, type-safe, event-based store for when you don't need a full statechart.

ts
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;    // 1
tsx
import { 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.

⚠️ Monorepo Gotchas (read before writing a machine here)

1. setup({ types }) vs the no-type-assertions rule

The 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:

ts
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.

2. Promise actors — annotate the param, don't use a void generic
ts
import { 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-type
3. Repo conventions
  • Bun only — bun add xstate, never npm/yarn/pnpm. Run Vitest through Bun.
  • No as casts anywhere except as const / as unknown — use assertEvent, guards, and the holder-variable pattern instead of casting.
  • Keep examples strict-clean; the base ESLint config applies strictTypeChecked.

Best Practices

  1. setup() first, then .createMachine() — strongly type context/events/input once; reference actors/guards/actions by name. Use the holder-variable workaround in this repo.
  2. Eliminate boolean soup — model mutually-exclusive modes as finite states, not isLoading/isError/isSuccess flags. Illegal combinations become unrepresentable.
  3. Invoke vs spawn — 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.
  4. Read with useSelector — select the slice you need so components re-render only when it changes, instead of destructuring a whole useActor snapshot.
  5. Dynamic params in actions/guards — keep them reusable and decoupled from one machine.
  6. Keep actors small & composed — child refs live in the parent snapshot's children; wrap with custom hooks to keep components decoupled.
  7. Model-based testing — createTestModel(machine) from xstate/graph auto-generates paths covering every reachable transition; filterEvents limits to currently-enabled events.
  8. Reach for @xstate/store when you want event-based shared state without a full statechart — don't over-engineer simple global state into a machine.

When to Ask for Help

  • Whether a flow genuinely needs a statechart vs @xstate/store vs Zustand/Jotai/useReducer.
  • Designing hierarchy/parallelism for an ambiguous domain (many interacting modes).
  • Performance at scale (many spawned actors, frequent re-renders) and persistence/rehydration strategy.
  • Migrating a v4 machine — see the v4→v5 cheatsheet in 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

Files

SKILL.md and 4 other files (references) in packages/dotfiles/dot_agents/skills/xstate-helper of shepherdjerred/monorepo.

  • SKILL.md
  • references/actors-and-machines.md
  • references/react-integration.md
  • references/testing-and-migration.md
  • references/xstate-store.md

Open the folder on GitHubat commit bc57ca5

Compare with similar skills

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.

Xstate Helper compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Xstate Helper this skillshepherdjerred/monorepo112—~3.9kAutomated safety check: PassGPL-3.0
Xstatepedronauck/skills634—~2.8kAutomated safety check: PassNone
Structs StreamingLeoYeAI/openclaw-master-skills2.2k—~4.3kAutomated safety check: PassMIT
Evolutionary Modular Architecturetech-leads-club/agent-skills7k—~3.7kAutomated safety check: PassCC-BY-4.0
React Useeffectviclafouch/meme-studio110—~375Automated safety check: PassNone
Effect TSpproenca/dot-skills215—~2kAutomated safety check: PassMIT

Similar skills

  • Xstate

    pedronauck/skills

    Comprehensive guide for XState v5 ecosystem including state machines, actors, @xstate/store, and TanStack Query integration.

    634 GitHub stars~2.8k tokensUpdated 24 days ago
    Backend & APIsAuto-check passed
  • Structs Streaming

    LeoYeAI/openclaw-master-skills

    Connects to the GRASS real-time event system via NATS WebSocket.

    2.2k GitHub stars~4.3k tokensUpdated 2 mo ago
    Backend & APIsAuto-check passed
  • Evolutionary Modular Architecture

    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.

    7k GitHub stars~3.7k tokensUpdated today
    DevelopmentAuto-check passed
  • React Useeffect

    viclafouch/meme-studio

    Audit React components for unnecessary useEffect hooks. An agent skill from viclafouch/meme-studio.

    110 GitHub stars~375 tokensUpdated 6 mo ago
    Frontend & DesignAuto-check passed
  • Effect TS

    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…

    215 GitHub stars~2k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Stripe Projects

    fossasia/eventyay

    A skill your agent uses when the user wants to provision infrastructure or third-party services using Stripe Projects.

    1.7k GitHub starsUsed in 5 repos~2k tokens
    Backend & APIsAuto-check: notes

More from shepherdjerred/monorepo

All 63 skills in this repo
  • Bun Runtime Best Practices

    shepherdjerred/monorepo

    Bun runtime APIs and current operational patterns for files, processes, modules, networking, databases, tests, and deployment.

    112 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Bun Test Patterns

    shepherdjerred/monorepo

    Current Bun test runner guidance for discovery, isolation, parallelism, sharding, changed tests, mocks, timers, snapshots, coverage, DOM Testing Library, and integration teardown.

    112 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Bun Workspaces

    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…

    112 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Deep Research

    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…

    112 GitHub stars~4.7k tokensUpdated today
    Auto-check: notes
  • Figma Use

    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"…

    112 GitHub stars~946 tokensUpdated today
    Auto-check passed
  • Fish Helper

    shepherdjerred/monorepo

    Current Fish shell scripting, functions, abbreviations, completions, variables, events, configuration, plugins, testing, and safety guidance.

    112 GitHub stars~2k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Xstate Helper

What does Xstate Helper do?

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.

When should I use Xstate Helper?

Xstate Helper fits situations like: works with XState; createMachine/setup; useMachine/useActor/useSelector; guards/actions/assign.

How do I install Xstate Helper in Claude Code?

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.

How do I install Xstate Helper in Codex?

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.

Can I use Xstate Helper 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 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.

What does Xstate Helper need to run?

Going by SKILL.md and its folder, Xstate Helper needs the command-line tools its instructions call (bun).

Does Xstate Helper 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 Xstate Helper 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 Xstate Helper use?

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.

How many tokens does Xstate Helper use?

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.

What are the alternatives to Xstate Helper?

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.

Who maintains Xstate Helper?

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.