--- description: Core architecture principles for the Sim app globs: ["apps/sim/**"] --- # Sim App Architecture ## Core Principles 1. **Single Responsibility**: Each component, hook, store has one clear purpose 2. **Composition Over Complexity**: Break down complex logic into smaller pieces 3. **Type Safety First**: TypeScript interfaces for all props, state, return types 4. **Predictable State**: Zustand for global state, useState for UI-only concerns ## Root-Level Structure ``` apps/sim/ ├── app/ # Next.js app router (pages, API routes) ├── blocks/ # Block definitions and registry ├── components/ # Shared UI (emcn/, ui/) ├── executor/ # Workflow execution engine ├── hooks/ # Shared hooks (queries/, selectors/) ├── lib/ # App-wide utilities ├── providers/ # LLM provider integrations ├── stores/ # Zustand stores ├── tools/ # Tool definitions └── triggers/ # Trigger definitions ``` ## Feature Organization Features live under `app/workspace/[workspaceId]/`: ``` feature/ ├── components/ # Feature components ├── hooks/ # Feature-scoped hooks ├── utils/ # Feature-scoped utilities (2+ consumers) ├── feature.tsx # Main component └── page.tsx # Next.js page entry ``` ## Naming Conventions - **Components**: PascalCase (`WorkflowList`) - **Hooks**: `use` prefix (`useWorkflowOperations`) - **Files**: kebab-case (`workflow-list.tsx`) - **Stores**: `stores/feature/store.ts` - **Constants**: SCREAMING_SNAKE_CASE - **Interfaces**: PascalCase with suffix (`WorkflowListProps`) ## Utils Rules - **Never create `utils.ts` for single consumer** - inline it - **Create `utils.ts` when** 2+ files need the same helper - **Check existing sources** before duplicating (`lib/` has many utilities) - **Location**: `lib/` (app-wide) → `feature/utils/` (feature-scoped) → inline (single-use)