Review of PR #10 found examples and summaries that still taught the rules the branch removes. The auth section led with shared/auth as the simpler default and then captioned its entity example "entities layer exists, profile reuse is real", which is both removed heuristics in one line, ten lines under prose saying an existing entities layer is not a reason. Make shared/auth the default for tokens, refresh and expiry handling and the session, and let a user or session entity own that state only when it is an established boundary that genuinely owns it. An entities layer existing, a user entity existing, and profile reuse are none of them reasons to move credentials. Two places contradicted that and were not in the review. excessive-entities said tokens stay in shared/auth "either way", which forbids what the official Auth guide allows and contradicts the anti-pattern six lines below it in the same file. Its decision tree branched on whether an entities layer exists and then forbade entity-owned tokens; it now asks whether an established entity already owns the state rather than merely existing. Strategy B read "shared domain logic goes to entities" in SKILL.md and "move that domain-level flow into a domain slice" in cross-import-patterns, one sentence above a bullet excluding user-flow orchestration. Both now move a shared domain responsibility into the entity that owns it. The Quick placement table answered a multi-use product card with entity UI and no condition; the cell is now conditional on the entity owning it and the note carries the Section 6 caution. The iteration caption in excessive-entities still said "extracted only after reuse is real". README says the skill follows FSD v2.1 without being a verbatim copy: it picks one guide when two official ones differ, follows the framework where an integration guide has fallen behind, and folds in recent maintainer guidance.
5.4 KiB
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
cases.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 mentioned inSKILL.md, so no reference is orphaned. - 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.
evals/cases.jsonis valid JSON with at least one case; every case hasid,prompt,expect,why,source, andrule, ids are unique, everysourcepath exists, and everyrulefragment resolves to a passage of the skill (seeevals/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