Files
ermnvldmr.com/GEMINI.md
T
deytenit 4e4cac06a7 ci: add gemini-manual workflow and headless agent skills (#52)
### Overview
This PR introduces the headless Antigravity CLI remote GitHub Actions
workflow (`gemini - manual`) and associated repository skills to enable
remote development orchestration from GitHub Issues and Pull Requests.

### Key Changes
1. **GitHub Actions Workflow (`.github/workflows/gemini-manual.yml`)**:
   - Collaborator access guard (`OWNER`, `MEMBER`, `COLLABORATOR`).
   - Interactive emoji reactions (`eyes` and `rocket`).
- Multi-turn conversation persistence via `actions/cache@v4` on
`~/.gemini/antigravity-cli/conversations` and `brain/`.
   - Command dispatchers for `/plan`, `/implement`, and `/fix`.
   - Pre-push monorepo verification gates (`typecheck`, `lint`, `test`).
2. **Repository Skills (`.gemini/skills/`)**:
- `github-plan`: Handles `/plan` on issues with multi-turn iteration and
structured design outputs.
- `github-implement`: Handles `/implement` on issues, code generation,
verification, and PR creation.
- `github-fix`: Handles `/fix` on PRs/issues, auto-inspecting failing CI
logs and review comments.
3. **Project Guidelines (`GEMINI.md`)**:
   - Updated safety rules to allow automated GitOps workflows.

---
Disclosure: I'm an AI assistant helping deytenit; I'm not deytenit.
2026-08-30 00:26:31 +03:00

147 lines
10 KiB
Markdown

# AGENTS.md
Guidance and operational constraints for AI coding agents working on `ermnvldmr.com`.
## 1. System Overview & Tech Stack
`ermnvldmr.com` is a pnpm monorepo hosting personal web services, dividing applications into `services/` and shared packages into `packages/`. The primary website (`services/www`) and static pages (`services/static`) are built with React 19 and Rsbuild (Rspack). Build-time Static Site Generation is performed via `@ermnvldmr/ssg`, a custom Rsbuild plugin that pre-renders React entry points to HTML with inlined critical CSS (via Critters). The documentation service (`services/docs`) runs on Hugo with the Hextra theme.
Shared workspace packages provide the UI design system (`@ermnvldmr/ui`), application component kits (`@ermnvldmr/kits`), standard types library (`@ermnvldmr/stl`), localization utilities (`@ermnvldmr/i18n`), monorepo CLI tooling (`@ermnvldmr/cli`), static site generator (`@ermnvldmr/ssg`), and reusable presets for ESLint, Rsbuild, and Storybook. Design components utilize Tailwind CSS v4, Radix UI primitives, React-Aria, and CVA, validated using Vitest and Storybook 8.
| Technology | Version / Tool | Purpose |
| :--- | :--- | :--- |
| **Package Manager** | `pnpm` (>=9.12.3) | Workspace dependency and package management |
| **Runtime Engine** | Node.js (>=20) | Server and build runtime environment |
| **UI Library** | React 19 (`react`, `react-dom`) | Declarative UI rendering |
| **Bundler Engine** | Rsbuild / Rspack | Rust-powered bundling, hot module reloading, and build pipeline |
| **Static Site Generator** | `@ermnvldmr/ssg` / Hugo (>=0.110.0) | Build-time React HTML pre-rendering & Hugo docs engine |
| **UI Primitives & Icons** | React Aria, Radix UI, Lucide React | Accessible interactive primitives and icon system |
| **Styling & Utilities** | Tailwind CSS v4, CVA, `@ermnvldmr/stl` | Utility styling, component variant management, class utilities |
| **Internationalization** | `@ermnvldmr/i18n` | Multi-locale routing and localization strings (`en`, `ru`) |
| **Testing Framework** | Vitest, Testing Library, Playwright | Unit, integration, and Storybook interaction testing |
| **Component Workshop** | Storybook 8 | Isolated component development environment |
| **Static Analysis** | ESLint 9 (Flat Config), TypeScript 5.8 | Code linting, monorepo import boundary checks, strict typing |
| **Secrets Encryption** | `@dotenvx/dotenvx` | Public-key encrypted `.env.dev` secrets management |
## 2. Project Structure & Key Directories
```text
ermnvldmr.com/
├── ci/ # CI/CD pipelines, Docker containers, deployment scripts
├── docs/ # Architectural documentation and design specifications
├── packages/ # Monorepo shared packages and toolchain configurations
│ ├── cli/ # Monorepo CLI utility (`ermnvldmr-cli`) for tasks like S3 asset sync
│ ├── eslint-config/ # Shared flat ESLint rule sets and monorepo import restriction rules
│ ├── i18n/ # Localization engine, locale pathing, and translation keysets
│ ├── kits/ # High-level domain & layout component kits (BentoGrid, InfoCard, PageHead, Page, etc.)
│ ├── rsbuild-config/ # Shared Rsbuild and Rspack bundler configuration presets
│ ├── ssg/ # Build-time Static Site Generation plugin for Rsbuild React apps
│ ├── stl/ # Standard Types Library for core utilities, type definitions, and react helpers
│ ├── storybook-config/ # Shared Storybook workshop configurations
│ └── ui/ # Design system React component library, styles, and Storybook stories
├── services/ # Deployable web applications and services
│ ├── docs/ # Technical documentation site (Hugo + Hextra theme)
│ ├── static/ # Static landing pages service (Rsbuild + React 19)
│ └── www/ # Primary website (Rsbuild + React 19 + MDX + SSG)
├── .env.dev # Encrypted environment variable storage (tracked in git)
├── .env.keys # Private decryption keys (UNTRACKED - do not commit)
├── eslint.config.mjs # Root ESLint flat configuration extending `@ermnvldmr/eslint-config`
├── pnpm-workspace.yaml # Monorepo workspace package definitions
└── tsconfig.json # Root TypeScript configuration with workspace path aliases
```
## 3. Setup & Commands
### CLI Commands
- **Install dependencies**: `pnpm install`
- **Development servers**:
- Website (`services/www`): `pnpm www:dev` (or `pnpm dev:www`)
- Documentation (`services/docs`): `pnpm docs:dev` (or `pnpm dev:docs`)
- UI Component Storybook (`packages/ui`): `pnpm ui:storybook`
- Static landings (`services/static`): `pnpm static:dev` (or `pnpm dev:static`)
- UI package build watcher: `pnpm ui:dev`
- **Build**:
- Full workspace build: `pnpm build`
- Workspace package dependencies only: `pnpm build:deps`
- Individual package build: `pnpm --filter @ermnvldmr/ui build`
- **Linting & Formatting**:
- Lint workspace: `pnpm lint`
- Typecheck workspace: `pnpm typecheck`
- Format files: `pnpm format`
- **Testing**:
- Run full test suite: `pnpm test`
- Test single package: `pnpm --filter @ermnvldmr/ui test`
- Test single file: `pnpm --filter @ermnvldmr/ui exec vitest run src/components/Button/Button.test.tsx`
- Test coverage: `pnpm test:coverage`
### Environment Setup
- Environment variables are managed using `@dotenvx/dotenvx`.
- `.env.dev` contains encrypted values and is tracked in git.
- `.env.keys` contains local decryption keys (`DOTENV_PRIVATE_KEY`) and must never be committed.
- Environment variables:
- `LOCALE`: Target build language (`en` or `ru`, defaults to `en`).
- `RSDOCTOR`: Set `RSDOCTOR=true` during build to trigger Rsbuild bundle analysis.
- S3 static sync credentials: `COM_ERMNVLDMR_STATIC_S3_BUCKET`, `COM_ERMNVLDMR_STATIC_S3_REGION`, `COM_ERMNVLDMR_STATIC_S3_ENDPOINT_URL`, `COM_ERMNVLDMR_STATIC_AWS_ACCESS_KEY_ID`, `COM_ERMNVLDMR_STATIC_AWS_SECRET_ACCESS_KEY`.
## 4. Non-Negotiable Coding Rules & Patterns
### Typing & Documentation Rules
- **Strict TypeScript**: `strict: true` is enforced globally.
- **Forbidden Types**: `any` is strictly prohibited (`@typescript-eslint/no-explicit-any: error`).
- **Forbidden Assertions**: Type assertions (`as Type`) are strictly prohibited (`@typescript-eslint/consistent-type-assertions: ['error', { assertionStyle: 'never' }]`). Use explicit type guards or type casting helpers (e.g., `castRef` from `@ermnvldmr/stl`).
- **Forbidden Non-Null Assertion**: Non-null assertion operator (`!`) is prohibited (`@typescript-eslint/no-non-null-assertion: error`).
- **Explicit Type Imports**: Imports used strictly for types MUST use `import type` (`@typescript-eslint/consistent-type-imports: error`).
- **Interface Definitions**: Object shapes MUST use `interface`, not `type` aliases (`@typescript-eslint/consistent-type-definitions: ['error', 'interface']`).
- **TSDoc Requirements**: JSDoc comments are required on all exported function declarations, interfaces, and type declarations (`jsdoc/require-jsdoc: error`). A description string is mandatory (`jsdoc/require-description: error`).
### Component Architecture & Structure
- Component implementations in `packages/ui` MUST live in dedicated PascalCase subdirectories:
`packages/ui/src/components/<ComponentName>/`
- `<ComponentName>.tsx` — Component logic and JSX
- `<ComponentName>.stories.tsx` — Storybook stories
- `<ComponentName>.test.tsx` — Vitest unit tests
- **Styling**: Component variant logic must use `cva` (class-variance-authority). Utility class merging must use `cn(...)` from `@ermnvldmr/stl`.
- **Accessibility**: Interactive elements must leverage `react-aria` hooks (`useButton`, `useFocusRing`, `useHover`) to maintain accessibility standards.
- **Naming Conventions**:
- PascalCase for React component files and directories (`Button/Button.tsx`).
- camelCase for helper modules, hooks, and utilities (`path.ts`, `useTheme.ts`).
- kebab-case for configuration files (`eslint.config.mjs`, `postcss.config.mjs`).
### State Management & Import Rules
- **State Primitives**: Use standard React state (`useState`, `useReducer`, `useContext`) and `react-stately` / `react-aria` primitives. Do not introduce unapproved third-party state managers.
- **Monorepo Relative Imports**: Code inside a package or service MUST use relative paths when referencing files within that same package. Importing the package's own published name inside itself (e.g. `import ... from '@ermnvldmr/ui'` inside `packages/ui`) is strictly prohibited and fails ESLint checks.
### Anti-Patterns ("What NOT to do")
- **DO NOT** use `any`, `as Type` assertions, or `!` non-null assertions.
- **DO NOT** introduce Vite, Webpack, or Next.js configurations. Rsbuild (Rspack) is the monorepo's standardized React bundler.
- **DO NOT** use self-referential package imports within workspace packages; use relative paths.
- **DO NOT** suppress linter or compiler errors with `@ts-ignore`, `@ts-nocheck`, or inline eslint disables without explicit user approval.
- **DO NOT** commit unencrypted `.env` files or secret keys (`.env.keys`).
- **DO NOT** run destructive Git operations (such as force pushing to `main`/`next` or dropping uncommitted user work) without authorization.
## 5. Critical Workflows & Safety Directives
### Verification Workflow
Before completing any task, run and pass every step in the following sequence:
1. `pnpm typecheck` — 0 TypeScript compiler errors.
2. `pnpm lint` — 0 ESLint warnings (`--max-warnings 0`).
3. `pnpm test` — All unit and component tests passing.
4. `pnpm build` — Clean workspace compilation.
### Protected Boundaries
The agent MUST NOT modify the following files or directories unless explicitly requested by the user:
- `.env.keys` (untracked decryption keys).
- `pnpm-lock.yaml` (dependencies must be managed exclusively through `pnpm` CLI commands).
- `LICENSE` file.
- `services/docs/content/` and `services/www/content/` creative and literary works.