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.Agenta-AI/agenta
360d8f0
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.