### 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.
10 KiB
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
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(orpnpm dev:www) - Documentation (
services/docs):pnpm docs:dev(orpnpm dev:docs) - UI Component Storybook (
packages/ui):pnpm ui:storybook - Static landings (
services/static):pnpm static:dev(orpnpm dev:static) - UI package build watcher:
pnpm ui:dev
- Website (
- Build:
- Full workspace build:
pnpm build - Workspace package dependencies only:
pnpm build:deps - Individual package build:
pnpm --filter @ermnvldmr/ui build
- Full workspace build:
- Linting & Formatting:
- Lint workspace:
pnpm lint - Typecheck workspace:
pnpm typecheck - Format files:
pnpm format
- Lint workspace:
- 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
- Run full test suite:
Environment Setup
- Environment variables are managed using
@dotenvx/dotenvx. .env.devcontains encrypted values and is tracked in git..env.keyscontains local decryption keys (DOTENV_PRIVATE_KEY) and must never be committed.- Environment variables:
LOCALE: Target build language (enorru, defaults toen).RSDOCTOR: SetRSDOCTOR=trueduring 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: trueis enforced globally. - Forbidden Types:
anyis 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.,castReffrom@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, nottypealiases (@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/uiMUST 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 usecn(...)from@ermnvldmr/stl. - Accessibility: Interactive elements must leverage
react-ariahooks (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).
- PascalCase for React component files and directories (
State Management & Import Rules
- State Primitives: Use standard React state (
useState,useReducer,useContext) andreact-stately/react-ariaprimitives. 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'insidepackages/ui) is strictly prohibited and fails ESLint checks.
Anti-Patterns ("What NOT to do")
- DO NOT use
any,as Typeassertions, 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
.envfiles or secret keys (.env.keys). - DO NOT run destructive Git operations (such as force pushing to
main/nextor 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:
pnpm typecheck— 0 TypeScript compiler errors.pnpm lint— 0 ESLint warnings (--max-warnings 0).pnpm test— All unit and component tests passing.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 throughpnpmCLI commands).LICENSEfile.services/docs/content/andservices/www/content/creative and literary works.