5.8 KiB
GEMINI.md
This document defines the architectural guidelines, file naming conventions, and coding standards for the WebUI project. All AI agents and developers should follow these rules when generating, refactoring, or analyzing code.
1. Project Architecture: Feature-Based
The project is transitioning from a flat file structure to a Feature-Based Architecture. All new development should follow this structure, and refactoring tasks should prioritize moving legacy files into their respective feature folders.
Directory Structure
.
├── dist/ # Build artifacts (embed target)
├── gen/ # Generated Protobuf/gRPC code (READ-ONLY)
├── public/ # Static assets (favicon.ico, robots.txt)
├── webui.go # Go backend entry point
├── src/
│ ├── api/ # API Layer & Interceptors (Wraps ../gen)
│ │ ├── client.ts # Central API client configuration
│ │ └── ... # Domain specific API wrappers
│ ├── app/ # App-wide Configuration
│ │ ├── App.tsx # Root Component & Routing Logic
│ │ ├── main.tsx # Entry point
│ │ └── provider.tsx # Global Context Providers (Theme, Auth)
│ ├── components/ # SHARED / GENERIC Components (Atomic/Molecules)
│ │ ├── ui/ # Design System primitives (Buttons, Inputs, Dialogs)
│ │ ├── layout/ # Structural components (PageTemplate, ActivityBar, Splitter)
│ │ └── common/ # Generic widgets (SyncStateIcon, SpinButton, ModalManager)
│ ├── features/ # DOMAIN SPECIFIC Logic (Organisms/Pages)
│ │ ├── auth/ # Authentication related components and logic
│ │ ├── dashboard/ # e.g., StatsPanel, SummaryDashboard
│ │ ├── operations/ # e.g., OperationListView, LogView, oplog.ts
│ │ ├── plans/ # e.g., PlanView, AddPlanModal
│ │ ├── repositories/ # e.g., RepoView, AddRepoModal, SnapshotBrowser
│ │ └── settings/ # e.g., SettingsModal
│ ├── hooks/ # Global generic hooks (useWindowSize, useTheme)
│ ├── lib/ # Stateless utilities (cronUtil, formatting, browserUtil)
│ ├── paraglide/ # Internationalization (Generated)
│ ├── state/ # Truly Global State
│ ├── constants.ts # Global constants
│ ├── custom.d.ts # TypeScript declaration overrides
│ └── index.sass # Global Styles
├── assets/ # Source assets imported in code (svgs, logos)
├── vite.config.ts
└── tsconfig.json
2. Naming Conventions
Strictly adhere to these casing rules to ensure consistency.
| File Type | Convention | Example | Reasoning |
|---|---|---|---|
| React Components | PascalCase | RunCommandModal.tsx |
Must match JSX tag usage. |
| Hooks | camelCase | useAuth.ts |
Required by React linter rules. |
| Utilities / Logic | camelCase | cronUtil.ts |
Matches the primary export/instance. |
| Global State | camelCase | peerStates.ts |
Matches the store instance. |
| Feature Folders | kebab-case | repo-management/ |
Avoids OS case-sensitivity issues. |
| Unit Tests | Match Target | cronUtil.test.ts |
|
| Go Files | snake_case | webui_test.go |
Standard Go convention. |
Specific Rules
- UI Components:
src/components/ui/may use kebab-case if generated by a CLI tool (e.g., shadcn), but PascalCase is preferred for custom components. - Abbreviations: Treat abbreviations as words (e.g.,
apiClient.tsnotAPIClient.ts).
3. Coding Standards
TypeScript & React
-
Components: Use Functional Components (
const Component = () => {}). -
Types: Always use strict typing. Avoid
any. Define interfaces/types for all Props. -
Naming: Variables and functions should be descriptive enough to avoid comments.
-
Bad:
const val = 10; // set max retry -
Good:
const maxRetries = 10; -
Comments: Add relatively few comments. Focus on high-quality variable naming and separation of concerns. Only comment "Why", not "What".
-
Helpers: Factor out complex logic into helper functions, but avoid over-abstraction (tiny helpers that disrupt reading flow).
Imports Ordering
- External: React, Third-party libraries (
import { useState } from 'react'). - Internal (Aliased): Global components/hooks (
import { Button } from '@/components/ui/button'). - Local (Relative): Sibling files (
import { SubComponent } from './SubComponent').
Internationalization (i18n)
- Library: Use Paraglide.
- Rule: Never hardcode user-facing strings.
- Usage: Import
mfromsrc/paraglide/messages. - Example:
<span>{m.welcome_message()}</span> - Declaring: Declare new strings as keys in
webui/messages/en.jsonand update generated code withnpm run translate.
Generated Code (gen/)
- Status: READ-ONLY.
- Modification: Never modify files in
gen/orsrc/paraglide/. These are generated by build tools. - Extensions: If you need to extend generated types, create wrapper functions in
src/lib/orsrc/api/.