# Folder & Naming Pattern Guide This document defines the folder structure and naming conventions used in this codebase. ## File Naming Convention **All files use kebab-case** (lowercase with hyphens): ``` ✅ add-feature-dialog.tsx ✅ use-board-actions.ts ✅ board-view.tsx ❌ AddFeatureDialog.tsx ❌ useBoardActions.ts ❌ BoardView.tsx ``` ## Export Naming Convention While files use kebab-case, **exports use PascalCase for components and camelCase for hooks/functions**: ```tsx // File: add-feature-dialog.tsx export function AddFeatureDialog() { ... } // File: use-board-actions.ts export function useBoardActions() { ... } ``` ## View Folder Structure Each complex view should have its own folder with the following structure: ``` components/views/ ├── [view-name].tsx # Entry point (exports the main view) └── [view-name]/ # Subfolder for complex views ├── components/ # View-specific reusable components │ ├── index.ts # Barrel export │ └── [component].tsx # Individual components ├── dialogs/ # View-specific dialogs and modals │ ├── index.ts # Barrel export │ └── [dialog-name].tsx # Individual dialogs/modals ├── hooks/ # View-specific hooks │ ├── index.ts # Barrel export │ └── use-[name].ts # Individual hooks ├── shared/ # Shared utilities between components │ ├── index.ts # Barrel export │ └── [name].ts # Shared code ├── constants.ts # View constants ├── types.ts # View-specific types (optional) ├── utils.ts # View utilities (optional) └── [main-component].tsx # Main view components (e.g., kanban-board.tsx) ``` ## Example: board-view ``` components/views/ ├── board-view.tsx # Entry point └── board-view/ ├── components/ │ ├── index.ts │ ├── kanban-card.tsx │ └── kanban-column.tsx ├── dialogs/ │ ├── index.ts │ ├── add-feature-dialog.tsx │ ├── edit-feature-dialog.tsx │ ├── follow-up-dialog.tsx │ ├── delete-all-verified-dialog.tsx │ ├── delete-completed-feature-dialog.tsx │ ├── completed-features-modal.tsx │ ├── agent-output-modal.tsx │ └── feature-suggestions-dialog.tsx ├── hooks/ │ ├── index.ts │ ├── use-board-actions.ts │ ├── use-board-features.ts │ └── use-board-drag-drop.ts ├── shared/ │ ├── index.ts │ ├── model-constants.ts │ └── model-selector.tsx ├── constants.ts └── kanban-board.tsx ``` ## Global vs View-Specific Code ### Global (`src/hooks/`, `src/lib/`, etc.) Code that is used across **multiple views**: - `src/hooks/use-auto-mode.ts` - Used by board-view, agent-view, etc. - `src/hooks/use-keyboard-shortcuts.ts` - Used across the app - `src/lib/utils.ts` - Global utilities ### View-Specific (`[view-name]/hooks/`, `[view-name]/components/`) Code that is **only used within a single view**: - `board-view/hooks/use-board-actions.ts` - Only used by board-view - `board-view/components/kanban-card.tsx` - Only used by board-view ## Barrel Exports Use `index.ts` files to create clean import paths: ```tsx // board-view/hooks/index.ts export { useBoardActions } from "./use-board-actions"; export { useBoardFeatures } from "./use-board-features"; // Usage in board-view.tsx import { useBoardActions, useBoardFeatures } from "./board-view/hooks"; ``` ## When to Create a Subfolder Create a subfolder for a view when: 1. The view file exceeds ~500 lines 2. The view has 3+ related components 3. The view has 2+ custom hooks 4. Multiple dialogs/modals are specific to the view ## Dialogs Folder The `dialogs/` folder contains all dialog and modal components specific to a view: ### What goes in `dialogs/`: - Confirmation dialogs (e.g., `delete-all-verified-dialog.tsx`) - Form dialogs (e.g., `add-feature-dialog.tsx`, `edit-feature-dialog.tsx`) - Modal overlays (e.g., `agent-output-modal.tsx`, `completed-features-modal.tsx`) - Any component that renders as an overlay/popup ### Naming convention: - Use `-dialog.tsx` suffix for confirmation/form dialogs - Use `-modal.tsx` suffix for content-heavy modals ### Barrel export pattern: ```tsx // dialogs/index.ts export { AddFeatureDialog } from "./add-feature-dialog"; export { EditFeatureDialog } from "./edit-feature-dialog"; export { AgentOutputModal } from "./agent-output-modal"; // ... etc // Usage in view entry point import { AddFeatureDialog, EditFeatureDialog, AgentOutputModal, } from "./board-view/dialogs"; ``` ## Quick Reference | Location | File Naming | Export Naming | |----------|-------------|---------------| | Components | `kebab-case.tsx` | `PascalCase` | | Dialogs | `*-dialog.tsx` or `*-modal.tsx` | `PascalCase` | | Hooks | `use-kebab-case.ts` | `camelCase` | | Utils/Lib | `kebab-case.ts` | `camelCase` | | Types | `kebab-case.ts` | `PascalCase` | | Constants | `constants.ts` | `SCREAMING_SNAKE_CASE` |