# Repository Guidelines Rules for agents working in this repository. When a rule conflicts with what you find in the code, surface the conflict instead of silently deviating. ## Project Structure & Module Organization - Core application lives under `app/`, with App Router layouts in `app/(auth)/`, `app/(dashboard)/`. - Supporting UI atoms live in `components/`; shared hooks in `hooks/`, shared contexts in `contexts/`. - Configuration lives in `next.config.ts`, `app.config.ts` (if present), and `config/`. - Shared utilities and lib code are in `lib/`; type definitions in `types/`. - i18n locale files live under `i18n/locales/`; their structure must match the old project — do not alter i18n layout or keys arbitrarily. - Static assets belong in `public/` or `assets/`; tests in `tests/` (mirror source structure). - **UI vs feedback**: `components/ui/` holds presentational, declarative UI primitives (Button, Dialog). `lib/feedback/` holds global imperative APIs for toast and confirm dialogs. Use `@/lib/feedback/message` and `@/lib/feedback/dialog` for imperative feedback; use `@/components/ui/*` for declarative UI. ## Build, Test, and Development Commands Run `nvm use v22` before any `pnpm` command in this repository. - `pnpm dev` – start the dev server (applies theme overrides first). - `pnpm build` – production build (also type-checks); `pnpm start` – run it locally. - `pnpm lint` / `pnpm lint:fix` – run / auto-fix ESLint. - `pnpm type-check` – strict TypeScript check (applies theme overrides, then `tsc --noEmit`). - `pnpm format` / `pnpm format:check` – Prettier write / check. - `pnpm test:run` – run the test suite. ## Quality Gates — must pass before every commit 1. `pnpm install --frozen-lockfile` – lockfile in sync. After changing `package.json`, run `pnpm install` and commit the updated `pnpm-lock.yaml`; CI fails otherwise. 2. `pnpm type-check` – zero type errors. 3. `pnpm lint` – zero ESLint errors. 4. `pnpm format:check` – consistent formatting (fix with `pnpm format` or `pnpm lint:fix`). 5. `pnpm test:run` – all tests pass, and tests are updated to match the change (see Testing Guidelines). Never bypass hooks with `--no-verify`, never disable a failing test instead of fixing it, and never commit code that does not compile. ## Engineering Principles - **Code must be as concise and elegant as possible**: the smallest change that solves the problem; reuse existing utilities/components instead of duplicating logic; remove dead code as you go. Single responsibility per function/component; no premature abstraction, clever tricks, or gratuitous indirection — prefer the boring, obvious solution. - No TODO comments without an issue number. - Composition over inheritance; explicit data flow over implicit coupling; interfaces over singletons. - Before implementing, study 2–3 similar existing features and follow their patterns, libraries, and test styles (especially `console-old` during migration). Verify assumptions against real code. - Fail fast with descriptive errors, handle them at the appropriate level, and never silently swallow exceptions. - When multiple approaches are valid, prefer in order: testability, readability, consistency with project patterns, simplicity, reversibility. - Don't introduce new tools or dependencies without strong justification. ## Coding Style & Naming Conventions - Use Prettier defaults; run `pnpm lint:fix` or `pnpm format` after making changes. - React components are functional components with TypeScript; prefer hooks and custom hooks for shared logic. - Component files use **kebab-case** (`bucket-selector.tsx`); reference them with **PascalCase** in JSX (``). - Override shadcn primitives **outside** `components/ui/`; never edit files in that directory directly. Extend via wrapper components instead of forking primitives. - Render tabular data with the shared `DataTable` + `useDataTable` utilities unless a specific requirement makes them unsuitable. ### Component structure and naming - **Directories**: group by domain/feature; plural folder names (`buckets/`, `user/`, `object/`). - **File names**: kebab-case; do not repeat the directory name (under `buckets/` use `info.tsx`, `new-form.tsx` — not `bucket-info.tsx`). The path already provides context. - **Component names**: PascalCase, aligned with domain and purpose (`BucketInfo`, `UserDropdown`); may include the domain in JSX for clarity. - **Forms**: consistent per-domain patterns: `XxxNewForm` / `XxxEditForm` / `XxxForm` in `new-form.tsx`, `edit-form.tsx`, `form.tsx`. - **Placement**: single-domain components live in that domain folder; components reused by 3+ domains may live at root or `components/shared/` (document if so). ## Testing Guidelines - Add suites under `tests/`, mirroring source structure; name files `*.test.ts`. Note: `test:run` currently only picks up `tests/lib/*.test.{js,ts}` — extend its glob in `package.json` when adding suites elsewhere, or they will silently never run. - Test behavior, not implementation; clear scenario-describing names; one assertion per test when possible; deterministic; mock network calls through provided hooks or context; use existing test utilities. - **Every code change must include corresponding test updates**: new features get happy-path and edge-case coverage; modified behavior gets updated tests; removed features get their tests removed; bug fixes get regression tests. - Run `pnpm test:run` before submitting any changes. ## Workflow - Break complex work into 3–5 stages and implement incrementally so every commit compiles and passes tests. Prefer test-first for behavior changes (red → green → refactor). - Document a plan in `IMPLEMENTATION_PLAN.md` **only when explicitly requested** (see Documentation Restriction); if used, give each stage a Goal, Success Criteria, Tests, and Status, keep status current, and delete the file when done. - **Stop after 3 failed attempts** at the same problem. Then: document what failed and why, research 2–3 alternative implementations, question whether the abstraction or problem split is right, and try a different angle. ## Commit & Pull Request Guidelines - Conventional, action-oriented commit subjects (`feat: add bucket selector`, `fix: correct object list pagination`); message body explains _why_. Commit messages and PR titles in English. - Each PR includes: concise summary, linked issue or task, screenshots for UI work, and testing notes. Follow `.github/pull_request_template.md` strictly. - **Screenshot diffs**: whenever a PR touches anything user-visible, provide before/after page screenshots in the PR description (run the app locally, capture affected pages before and after, present as a before/after pair). If "before" is impractical (e.g. a brand-new page), include "after" screenshots of every affected state — empty, loaded, error, and mobile when relevant. - Keep PRs scoped; coordinate large refactors in advance. ## Multi-Role Adversarial Verification For every non-trivial change, verify from multiple independent roles before considering it done — each role actively tries to find problems rather than confirm success: - **Reviewer**: challenge correctness — edge cases, error handling, state/race issues, regressions in adjacent features. - **Tester**: try to break it — run type check, lint, tests; exercise affected pages/flows including empty, error, and loading states. - **UX auditor** (UI changes): check against `skills/rustfs-console-design-guide/SKILL.md` — layout, spacing, dark mode, responsiveness, i18n text. - **Simplifier**: ask whether the same result could be achieved with less code; remove anything not strictly needed. Scale rigor to the change: a one-line fix needs a quick reviewer + tester pass; a new feature or refactor deserves the full panel. When agent tooling supports it (subagents/workflows), run these roles as independent adversarial checks rather than a single self-review. ## UI Design & Theme - **Consistent style, best-practice interactions**: all UI shares one unified visual language — reuse existing components, spacing, typography, and color tokens instead of inventing variants; the same kind of element must look and behave the same everywhere. Follow established UX practices: clear loading/empty/error states, immediate feedback via `@/lib/feedback/*`, sensible focus and keyboard behavior, and confirmation before destructive actions. - For every Console UI, interaction, settings, form, dialog, table, responsive-layout, or visual-review change, read and follow `skills/rustfs-console-design-guide/SKILL.md` before editing. Use `skills/ui-audit/SKILL.md` as the audit workflow; the design guide is the source of design decisions. - Apply visual tweaks at usage sites via classes (e.g. `className="shadow-none"`). - Do not change base colors or theme variables defined in `console-new` unless explicitly required by the migration plan. - During migration: do not modify page text, add UI components, or change component positions without plan approval. ## Documentation Restriction **Unless explicitly requested**, do not create summary, plan, analysis, or report documents in the project — including `IMPLEMENTATION_PLAN.md`, `SUMMARY.md`, `PLAN.md`, `CHANGELOG.md`, migration summaries, progress reports, and `*_ANALYSIS*.md`. Create them only when the user explicitly asks. # This is NOT the Next.js you know This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. **Keep this block, including in commits.** It is part of the project's agent setup, maintained by `next dev` for every agent that works here. If it appears as an uncommitted change, that is intentional — commit it as-is. Do not remove it to clean up a diff; it will be regenerated.