Files
rustfs-console/AGENTS.md
T

312 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Repository Guidelines
## 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/` (structure must match the old project).
- Static assets belong in `public/` or `assets/`.
- Tests belong in `tests/` (mirror source structure when tests exist).
- **UI vs feedback**: `components/ui/` holds presentational, declarative UI primitives (e.g. Button, Dialog). `lib/feedback/` holds global imperative APIs for toast and confirm dialogs (MessageProvider/useMessage, DialogProvider/useDialog). Use `@/lib/feedback/message` and `@/lib/feedback/dialog` for imperative feedback; use `@/components/ui/*` for declarative UI.
---
## Build, Test, and Development Commands
- **Node version requirement**: Before running `pnpm` commands (especially checks/tests), run `nvm use v22` in this repository.
- `pnpm dev` start the Next.js development server with hot reload.
- `pnpm build` create a production build.
- `pnpm start` run the production bundle locally.
- `pnpm lint` run ESLint.
- `pnpm test:run` run the test suite (when configured).
- `pnpm tsc --noEmit` perform a strict TypeScript type check (or rely on `next build` for type-checking).
---
## Mandatory Code Quality Checks
**⚠️ CRITICAL: These checks MUST pass before every commit.**
Before committing any code changes, you MUST run and pass:
1. **Lockfile Sync Check**: `pnpm install --frozen-lockfile`
- Ensures `pnpm-lock.yaml` is in sync with `package.json`
- **MUST run `pnpm install` after modifying `package.json` and commit the updated `pnpm-lock.yaml`**
- CI will fail if the lockfile is out of sync.
2. **TypeScript Type Check**: `pnpm tsc --noEmit` (or `pnpm build`)
- Ensures all TypeScript types are correct.
- Must have zero errors before committing.
3. **Lint Check**: `pnpm lint`
- Ensures code follows ESLint rules.
- Fix issues before committing.
4. **Format Check** (if Prettier is configured): `pnpm prettier --check .`
- Ensures consistent formatting.
- If it fails, run `pnpm lint:fix` or `pnpm format` (when available) to auto-fix.
5. **Test Coverage Check** (when tests exist): Review and update tests for code changes
- **MUST review test cases** when modifying code: add tests for new features, update tests for changed behavior, remove tests for removed features.
- Run `pnpm test:run` to ensure all tests pass.
- Ensure test cases accurately reflect the current implementation.
**Automated Enforcement**: If a pre-commit hook exists, it will run these checks. If any check fails, the commit will be blocked.
**Quick Fix**: If checks fail:
1. Run `pnpm install` to sync lockfile (if `package.json` changed).
2. Fix ESLint/Prettier issues.
3. Address TypeScript errors manually.
4. Review and update test cases as needed, then run `pnpm test:run` to verify.
---
## Coding Style & Naming Conventions
- Use Prettier defaults when configured; run `pnpm lint:fix` or `pnpm format` after making changes.
- React components use functional components with TypeScript; prefer hooks and custom hooks for shared logic.
- Component files use **kebab-case** (e.g. `bucket-selector.tsx`); reference them with **PascalCase** in JSX (e.g. `<BucketSelector />`).
- Override shadcn primitives **outside** `components/ui/`; never edit files in that directory directly.
- Render tabular data with the shared `DataTable` + `useDataTable` utilities unless a specific requirement makes them unsuitable.
- Language pack files must follow the structure used in the old project; do not alter i18n layout or keys arbitrarily.
### Component structure and naming
- **Directories**: Group by **domain/feature**; use plural for domain folders (e.g. `buckets/`, `user/`, `object/`).
- **File names**: kebab-case; **do not repeat the directory name** in the filename (e.g. under `buckets/` use `info.tsx`, `new-form.tsx`, `selector.tsx` instead of `bucket-info.tsx`, `bucket-new-form.tsx`). The path already provides context.
- **Component names**: PascalCase, aligned with the domain and purpose (e.g. `BucketInfo`, `UserDropdown`); component names may still include the domain when used in JSX for clarity.
- **Forms**: Use consistent patterns per domain: `XxxNewForm` / `XxxEditForm` or `XxxForm`; files can be `new-form.tsx`, `edit-form.tsx`, `form.tsx` under the domain folder.
- **Placement**: Components used only by one domain live in that domain folder; components reused by 3+ different domain pages may stay at root or under `components/shared/` (document if so).
---
## Testing Guidelines
- When tests are configured, add new suites under `tests/`, mirroring source structure.
- Name files `*.spec.ts` or `*.test.ts`.
- Keep tests deterministic; mock network calls through provided hooks or context.
- **⚠️ CRITICAL: Every code change MUST include corresponding test updates** when tests exist:
- **New features**: Add comprehensive test cases covering happy paths and edge cases.
- **Modified behavior**: Update existing tests to reflect new implementation.
- **Removed features**: Remove or update tests for deprecated/removed functionality.
- **Bug fixes**: Add regression tests to prevent future occurrences.
- Run `pnpm test:run` before submitting any changes.
---
## Commit & Pull Request Guidelines
- Follow conventional, action-oriented commit subjects (e.g. `feat: add bucket selector`, `fix: correct object list pagination`).
- Each pull request should include: a concise summary, linked issue or task, screenshots for UI work, and testing notes.
- Keep PRs scoped; large refactors should be coordinated in advance.
- Commit message and PR title must be in English.
- When a PR template exists (e.g. `.github/pull_request_template.md`), follow it strictly.
---
## UI Theme Overrides
- 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 and the Console design guide as the source of design decisions.
- Apply visual tweaks (e.g. removing shadows, altering colors) at usage sites via classes such as `class="shadow-none"`.
- When extending shadcn components, create wrapper components (e.g. `BucketSelector.tsx`) instead of forking primitives.
- Do not change base colors or theme variables defined in `console-new` unless explicitly required by the migration plan.
---
# Development Guidelines
## Philosophy
### Core Beliefs
- **Incremental progress over big bangs** Small changes that compile and pass tests.
- **Learning from existing code** Study and plan before implementing.
- **Pragmatic over dogmatic** Adapt to project reality.
- **Clear intent over clever code** Be boring and obvious.
### Simplicity Means
- Single responsibility per function/class.
- Avoid premature abstractions.
- No clever tricks choose the boring solution.
- If you need to explain it, its too complex.
---
## Process
### 1. Planning & Staging
Break complex work into 35 stages. Document in `IMPLEMENTATION_PLAN.md` **only when explicitly requested** (see Documentation Restriction):
```markdown
## Stage N: [Name]
**Goal**: [Specific deliverable]
**Success Criteria**: [Testable outcomes]
**Tests**: [Specific test cases]
**Status**: [Not Started|In Progress|Complete]
```
- Update status as you progress.
- Remove the file when all stages are done.
### 2. Implementation Flow
1. **Understand** Study existing patterns in the codebase.
2. **Test** Write tests first (red).
3. **Implement** Minimal code to pass (green).
4. **Refactor** Clean up with tests passing.
5. **Commit** With a clear message linking to the plan.
### 3. When Stuck (After 3 Attempts)
**CRITICAL**: Maximum 3 attempts per issue, then STOP.
1. **Document what failed**:
- What you tried.
- Specific error messages.
- Why you think it failed.
2. **Research alternatives**:
- Find 23 similar implementations.
- Note different approaches used.
3. **Question fundamentals**:
- Is this the right abstraction level?
- Can this be split into smaller problems?
- Is there a simpler approach entirely?
4. **Try a different angle**:
- Different library/framework feature?
- Different architectural pattern?
- Remove abstraction instead of adding?
---
## Technical Standards
### Architecture Principles
- **Composition over inheritance** Use dependency injection.
- **Interfaces over singletons** Enable testing and flexibility.
- **Explicit over implicit** Clear data flow and dependencies.
- **Test-driven when possible** Never disable tests; fix them.
### Code Quality
- **Every commit must**:
- Compile successfully.
- Pass all existing tests.
- Include tests for new functionality (when tests exist).
- Follow project formatting/linting.
- **Before committing**:
- Run formatters/linters.
- Self-review changes.
- Ensure commit message explains "why".
### Error Handling
- Fail fast with descriptive messages.
- Include context for debugging.
- Handle errors at the appropriate level.
- Never silently swallow exceptions.
---
## Decision Framework
When multiple valid approaches exist, choose based on:
1. **Testability** Can I easily test this?
2. **Readability** Will someone understand this in 6 months?
3. **Consistency** Does this match project patterns?
4. **Simplicity** Is this the simplest solution that works?
5. **Reversibility** How hard is it to change later?
---
## Project Integration
### Learning the Codebase
- Find 3 similar features/components.
- Identify common patterns and conventions.
- Use the same libraries/utilities when possible.
- Follow existing test patterns.
### Tooling
- Use the projects existing build system.
- Use the projects test framework.
- Use the projects formatter/linter settings.
- Dont introduce new tools without strong justification.
---
## Quality Gates
### Definition of Done
- [ ] Tests written and passing (when applicable).
- [ ] Code follows project conventions.
- [ ] No linter/formatter warnings.
- [ ] Commit messages are clear.
- [ ] Implementation matches plan.
- [ ] No TODOs without issue numbers.
### Test Guidelines
- Test behavior, not implementation.
- One assertion per test when possible.
- Clear test names describing the scenario.
- Use existing test utilities/helpers.
- Tests should be deterministic.
---
## Documentation Restriction
**Unless explicitly requested**, do not produce any summary-type, plan-type, analysis-type, or similar documentation in the project. This includes but is not limited to:
- `IMPLEMENTATION_PLAN.md`, `SUMMARY.md`, `PLAN.md`, `CHANGELOG.md`
- Migration summaries, progress reports, or task completion reports
- **Analysis documents** (e.g. refactor analysis, page/code analysis, architecture analysis, `*_ANALYSIS*.md`)
- Any document created proactively to describe or track work
Create such documents only when the user explicitly asks for them.
---
## Important Reminders
**NEVER**:
- Use `--no-verify` to bypass commit hooks.
- Disable tests instead of fixing them.
- Commit code that doesnt compile.
- Make assumptions verify with existing code.
- During migration: modify page text, add UI components, or change component positions without plan approval.
**ALWAYS**:
- Commit working code incrementally.
- Update plan documentation as you go.
- Learn from existing implementations if exists (especially `console-old`).
- Stop after 3 failed attempts and reassess.
<!-- BEGIN:nextjs-agent-rules -->
# 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.
<!-- END:nextjs-agent-rules -->