ci: store eval cases as evals/evals.json with per-case assertions
Feature-Sliced Design: Agent Skills
Agent skills that teach AI coding agents how to apply the Feature-Sliced Design (FSD) v2.1 methodology.
Installation
npx skills add feature-sliced/skills
Available skills
feature-sliced-design
Apply FSD v2.1 principles when structuring frontend projects. The agent learns layer hierarchy, import rules, the decision framework for code placement, and common patterns.
Its bias is pages-first: start with app/, pages/, and shared/, and open a features or entities boundary only when a stable shared responsibility has earned one. Code used in two places does not, by itself, earn a layer.
It follows the official FSD v2.1 documentation but is not a verbatim copy. Where two official guides answer the same question differently, it picks one and says which. Where an integration guide has fallen behind a framework's own docs, it follows the framework. It also folds in recent maintainer guidance so an agent decides consistently across tasks. Passages that depart from a guide say so inline.
Use when:
- Setting up or reorganizing a frontend project structure
- Deciding where code belongs across app, pages, features, entities, and shared
- Placing static assets (images, icons, fonts, PDFs) in the right slice or layer
- Grouping closely related slices into slice groups as the project grows
- Deciding where page layouts belong, or whether to use the widgets layer (discouraged)
- Resolving cross-import issues or evaluating the @x pattern
- Deciding whether to create or remove an entity, or whether to skip the entities layer entirely
- Migrating from FSD v2.0 or a non-FSD codebase
- Integrating FSD with Next.js (App Router or Pages Router), React Router, Nuxt, Vite, or Astro
- Implementing auth, API request handling, or state management (Redux, TanStack Query) within FSD
Examples:
Set up FSD project structure with Next.js App Router
This rule is used on two pages now. Should it become an entity?
Where should I put auth tokens and session state?
These two entities need to import from each other. How do I fix this?
Where should I put hero images for my landing page?
Skill structure
feature-sliced-design/
SKILL.md Core rules and decision framework
references/
layer-structure.md Detailed folder structures per layer (incl. slice groups)
growth-walkthrough.md One shop through four snapshots: which moments earn a layer
asset-handling.md Where to place images, icons, fonts, and other static assets
cross-import-patterns.md Cross-import resolution: 4 strategies for features/widgets, @x for entities
excessive-entities.md Keeping the entities layer clean: when to skip, what to extract
migration-guide.md v2.0→v2.1 and non-FSD migration
framework-integration.md Next.js, React Router, Nuxt, Vite, Astro setup
auth-and-api.md Auth, type definitions, API request handling
state-management.md Redux, TanStack Query (React Query)
evals/
README.md How to run and maintain the cases
evals.json Placement regression cases
SKILL.md is the entry point. It tells the agent to read a reference file only when the task calls for it, so the initial context stays small.
Contributing
Run the validator before opening a pull request:
node .github/scripts/validate-skills.mjs
It enforces this repository's skill-package rules, which are based in part on the guidance in vercel-labs/agent-skills AGENTS.md:
- The
SKILL.mdbody stays under 500 lines to keep the initial skill context lightweight. Frontmatter is excluded from the count. - The frontmatter
namematches the skill's directory name and is at most 64 characters. - The frontmatter contains a
descriptionof at most 1024 characters, the limits from the Agent Skills specification. - Every
references/<file>.mdpath, whether written inSKILL.mdor in another reference, resolves to an existing file. - Every file under
references/is routed from theConditional referencessection ofSKILL.md, so a reference that section forgets fails the build instead of shipping unreachable. Naming it elsewhere in the body, or inside a fenced example, does not count. A skill with no such section falls back to requiring a mention anywhere inSKILL.md. - Every numbered cross-reference resolves.
Section N,Section N-M, andRule N-Malways mean a numbered heading inSKILL.md, whichever file mentions them;Step N,Strategy X,Snapshot N,Part N, andQuestion Nmean a heading or bold label somewhere in the package. - A named rule such as "the request placement rule" that is cited from more than one file is a heading or bold label somewhere in the package, so renaming the anchor fails the build instead of stranding its readers.
- Each skill's
evals/evals.jsonis valid JSON whoseskill_namematches the skill directory and whoseevalsarray is non-empty; every case hasid,prompt,expected_output, a non-emptyassertionsarray,why,source, andrule, ids are unique, everysourcepath exists, and everyrulefragment resolves to a passage of the skill (seefeature-sliced-design/evals/README.md).
The validator has its own tests, which break one thing at a time in a copy of the repository and assert that it is reported:
node --test .github/scripts/validate-skills.test.mjs
References
License
MIT