# AI Agent Instructions for OpenShift Console Plugin Template This document provides context and guidelines for AI coding assistants working on this codebase. ## Project Overview This is a **template repository** for creating OpenShift Console dynamic plugins. It's meant to be used via GitHub's "Use this template" feature, NOT forked. The template provides a minimal starting point for extending the OpenShift Console UI with custom pages and functionality. > **⚠️ WARNING:** > This repository is used by multiple large-scale enterprise web applications. Please proceed with caution when making any changes to this codebase. Changes here can affect downstream projects that depend on this template. > > **Only make changes that should be standard practice for ALL plugins created from this template.** If a change is specific to one plugin use case, it belongs in the instantiated plugin repository, not in this template. **Key Technologies:** - TypeScript + React 18 - PatternFly 6 (UI component library) - Webpack 5 with Module Federation - react-i18next for internationalization - Playwright for e2e testing - Helm for deployment **Compatibility:** Requires OpenShift 4.12+ (uses ConsolePlugin CRD v1 API) ## Architecture & Patterns ### Dynamic Plugin System This plugin uses webpack module federation to load at runtime into the OpenShift Console. Key files: - `console-extensions.json`: Declares what the plugin adds to console (routes, nav items, etc.) - `package.json` `consolePlugin` section: Plugin metadata and exposed modules mapping - `webpack.config.ts`: Configures module federation and build **Critical:** Any component referenced in `console-extensions.json` must have a corresponding entry in `package.json` under `consolePlugin.exposedModules`. ### Component Structure - Use functional components with hooks (NO class components) - All components should be TypeScript (`.tsx`) - Follow PatternFly component patterns - Use PatternFly CSS variables instead of hex colors (dark mode compatibility) ### Styling Constraints **IMPORTANT:** The `.stylelintrc.yaml` enforces strict rules to prevent breaking console: - **NO hex colors** - use PatternFly CSS variables (e.g., `var(--pf-v6-global-palette--blue-500)`) - **NO naked element selectors** (like `table`, `div`) - prevents overwriting console styles - **NO `.pf-` or `.co-` prefixed classes** - these are reserved for PatternFly and console - **Prefix all custom classes** with plugin name (e.g., `console-plugin-template__nice`) Don't disable these rules without understanding they protect against layout breakage! ## Internationalization (i18n) **Namespace Convention:** `plugin__` (e.g., `plugin__console-plugin-template`) ### In React Components: ```tsx const { t } = useTranslation('plugin__console-plugin-template'); return

{t('Hello, World!')}

; ``` ### In console-extensions.json: ```json "name": "%plugin__console-plugin-template~My Label%" ``` **After adding/changing messages:** Run `yarn i18n` to update locale files in `/locales` ## File Organization ``` src/ components/ # React components ExamplePage.tsx # Example page component *.css # Component styles (scoped with plugin prefix) console-extensions.json # Plugin extension declarations package.json # Plugin metadata in consolePlugin section tsconfig.json # TypeScript config (strict: false currently) webpack.config.ts # Module federation + build config locales/ # i18n translation files charts/ # Helm chart for deployment integration-tests/ # Playwright e2e tests ``` ## Development Workflow ### Local Development 1. `yarn install` - install dependencies 2. `yarn start` - starts webpack dev server on port 9001 with CORS 3. `yarn start-console` - runs OpenShift console in container (requires cluster login) 4. Navigate to http://localhost:9000/example ### Code Quality - `yarn lint` - runs eslint, prettier, and stylelint (with --fix) - Linting is mandatory before commits - Follow existing code patterns in the repo ### Testing - `yarn test` - runs Jest unit tests - `yarn test-e2e` - opens Playwright in headed mode - `yarn test-e2e-headless` - runs Playwright in headless mode - Add e2e tests for new pages/features ## TypeScript Configuration Current config has `strict: true` and enforces: - `noUnusedLocals: true` - All files should use `.tsx` extension ## Common Development Tasks ### Adding a New Page 1. Create component in `src/components/MyPage.tsx` 2. Add to `package.json` `exposedModules`: `"MyPage": "./components/MyPage"` 3. Add route in `console-extensions.json`: ```json { "type": "console.page/route", "properties": { "path": "/my-page", "component": { "$codeRef": "MyPage" } } } ``` 4. Optional: Add nav item in `console-extensions.json` 5. Run `yarn i18n` if you added translatable strings ### Adding a Navigation Item ```json { "type": "console.navigation/href", "properties": { "id": "my-nav-item", "name": "%plugin__console-plugin-template~My Page%", "href": "/my-page", "perspective": "admin", "section": "home" } } ``` ### Updating Plugin Name When instantiating from template, update: 1. `package.json` - `name` and `consolePlugin.name` 2. `package.json` - `consolePlugin.displayName` and `description` 3. All i18n namespace references (`plugin__`) 4. CSS class prefixes 5. Helm chart values ## Build & Deployment ### Building Image ```bash docker build -t quay.io/my-repository/my-plugin:latest . # For Apple Silicon: add --platform=linux/amd64 ``` ### Deploying via Helm ```bash helm upgrade -i my-plugin charts/openshift-console-plugin \ -n my-namespace \ --create-namespace \ --set plugin.image=my-plugin-image-location ``` **Note:** OpenShift 4.10 requires `--set plugin.securityContext.enabled=false` ## Important Constraints & Gotchas 1. **Template, not fork:** Users should use "Use this template", not fork 2. **i18n namespace must match ConsolePlugin resource name** with `plugin__` prefix 3. **CSS class prefixes prevent style conflicts** - always prefix with plugin name 4. **Module federation requires exact module mapping** - `exposedModules` must match `$codeRef` values 5. **PatternFly CSS variables only** - hex colors break dark mode 6. **No webpack HMR for extensions** - changes to `console-extensions.json` require restart 7. **React 18** - matches console's React version ## Extension Points See [Console Plugin SDK README](https://github.com/openshift/console/tree/master/frontend/packages/console-dynamic-plugin-sdk) for available extension types: - `console.page/route` - add new pages - `console.navigation/href` - add nav items - `console.navigation/section` - add nav sections - `console.tab` - add tabs to resource pages - `console.action/provider` - add actions to resources - `console.flag` - feature flags - Many more... ## Code Style Preferences - Functional components with hooks (NO classes) - TypeScript for all new files - Use PatternFly components whenever possible - Keep components focused and composable - Prefer named exports for components - Use `React.FC` or explicit return types - CSS-in-files (not CSS-in-JS) ## Testing Strategy - **E2E tests (Playwright):** For user flows and page rendering - **Unit tests (Jest):** For component logic and plugin metadata - **Test data attributes:** Use `data-test` attributes for selectors (`testIdAttribute` is configured in `playwright.config.ts`) - Run tests locally before opening PRs ## References - [Console Plugin SDK](https://github.com/openshift/console/tree/master/frontend/packages/console-dynamic-plugin-sdk) - [PatternFly React](https://www.patternfly.org/get-started/develop) - [Dynamic Plugin Enhancement Proposal](https://github.com/openshift/enhancements/blob/master/enhancements/console/dynamic-plugins.md) ## Quick Decision Guide **When should I...** - **Use this template?** When creating a NEW OpenShift Console plugin from scratch - **Add a page?** Update console-extensions.json + exposedModules + create component - **Style something?** Use PatternFly components and CSS variables, prefix custom classes - **Add translations?** Use `t()` function, run `yarn i18n` after - **Test changes?** Run locally with `yarn start` + `yarn start-console`, add Playwright tests - **Deploy?** Build image, push to registry, install via Helm chart