Feature-folder layout, states/ convention, and data-flow rules for the Agenta mobile app (web/mobile). Use when creating or moving files under web/mobile, deciding where a component lives, adding a new feature or screen, or wiring data into mobile components.
The source of truth for how code is organized in web/mobile. Load it before
creating any file there.
web/mobile/
src/
pages/ # Pages Router route shells ONLY — no logic, no layout JSX
features/
<feature>/ # e.g. sessions/, chat/, agents/, settings/, nav/
<Component>.tsx # one component per file, named export = file name
use<Thing>.ts # feature hooks and plain .ts helpers sit beside the components
states/ # designed states for this feature
<X>Skeleton.tsx # mirrors the final layout geometry (no shift on swap)
<X>Empty.tsx # designed empty state with a call to action
<X>Error.tsx # error + retry affordance; preserves user input
components/ # app-wide shells: AgentaLogo, ContentRail, PageTitle,
# ScreenScaffold, StatusTag
ui/ # local shadcn registry components (see mobile-shadcn-conventions)
lib/ # cn util, motion presets, api glue, context resolution
styles/ # globals.css, theme.generated.css (generated)
scripts/ # generate-shadcn-tokens.ts (token bridge)features/.ChatStates.tsx,
HomeStates.tsx, ObservabilityStates.tsx, OrganizationStates.tsx), which
exports a few small state components together. New states get their own file.states/ siblings (skeleton, empty, error). A screen
is not done if any of its states is a browser default or an unstyled string.
Features with no data-bearing screens of their own (app/, context/,
nav/) have no states/ folder.@agenta/* packages
(@agenta/entities, @agenta/shared, @agenta/chat, @agenta/sessions, ...)
or thin fetchers in lib/. Many screens compose ready-made UI from the
@agenta/*-ui packages; check there before building a surface from scratch. NEVER import @/oss/*, @agenta/oss, @agenta/ee — the mobile
app has zero app-layer imports (lint enforces this)._app.tsx stays minimal and mounts
features/app/AppProviders.tsx (query client, jotai store, context sync,
auth gate, entity modals). Add a provider only when a concrete feature needs it,
scoped as narrowly as possible.src/features/<feature>/ with the screen component.states/ siblings for every data-bearing component.src/pages/ that renders the screen.useMotionPresets() for any transitions (see mobile-motion-patterns).pnpm --filter @agenta/mobile lint && pnpm --filter @agenta/mobile types:check.7a975fb
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.