Compare commits

...

2 Commits

Author SHA1 Message Date
Chris Farhood f896622b5b fix: add markdownlint config and auto-fix markdown errors
- Add .markdownlint-cli2.jsonc based on headlamp-agent-skills config
- Disable MD013 (line length), MD041 (first-line-heading), MD036
  (emphasis-as-heading), MD024 (no-duplicate-heading), MD040
  (fenced-code-language), MD060 (table-column-style), MD029
  (ol-prefix), MD033 (no-inline-html) — appropriate for plugin docs
- Run markdownlint-cli2 --fix to auto-fix MD022, MD031, MD032
- Manually fix remaining code block language annotations

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-04 04:54:28 +00:00
Chris Farhood a65743dea3 fix(e2e): grant CI runner read access to polaris namespace for RBAC pre-flight check
The RBAC pre-flight check workflow step (commit 46350c5) verifies that
polaris-dashboard-proxy-reader Role and RoleBinding exist in the polaris
namespace before running E2E tests. However, the CI runner's RBAC
(e2e-ci-runner-role in privilegedescalation-dev) did not include
permission to read roles/rolebindings in the polaris namespace, causing
the pre-flight check to fail with a generic kubectl error on all branches.

Fix: add rules to e2e-ci-runner-role allowing get on roles/rolebindings in
privilegedescalation-dev (for the pre-flight check itself), plus a new
Role + RoleBinding in the polaris namespace granting the runner read
access to rbac resources there.

Without this fix, the pre-flight check exits 1 on every branch until someone
SSHs into the runner pod and manually applies the polaris RBAC manifest —
which they shouldn't need to do.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-03 15:13:03 +00:00
21 changed files with 313 additions and 16 deletions
+9 -3
View File
@@ -10,6 +10,7 @@ You are an agent installer that helps users browse and install Claude Code agent
## Your Capabilities ## Your Capabilities
You can: You can:
1. List all available agent categories 1. List all available agent categories
2. List agents within a category 2. List agents within a category
3. Search for agents by name or description 3. Search for agents by name or description
@@ -25,20 +26,23 @@ You can:
## Workflow ## Workflow
### When user asks to browse or list agents: ### When user asks to browse or list agents
1. Fetch categories from GitHub API using WebFetch or Bash with curl 1. Fetch categories from GitHub API using WebFetch or Bash with curl
2. Parse the JSON response to extract directory names 2. Parse the JSON response to extract directory names
3. Present categories in a numbered list 3. Present categories in a numbered list
4. When user selects a category, fetch and list agents in that category 4. When user selects a category, fetch and list agents in that category
### When user wants to install an agent: ### When user wants to install an agent
1. Ask if they want global installation (~/.claude/agents/) or local (.claude/agents/) 1. Ask if they want global installation (~/.claude/agents/) or local (.claude/agents/)
2. For local: Check if .claude/ directory exists, create .claude/agents/ if needed 2. For local: Check if .claude/ directory exists, create .claude/agents/ if needed
3. Download the agent .md file from GitHub raw URL 3. Download the agent .md file from GitHub raw URL
4. Save to the appropriate directory 4. Save to the appropriate directory
5. Confirm successful installation 5. Confirm successful installation
### When user wants to search: ### When user wants to search
1. Fetch the README.md which contains all agent listings 1. Fetch the README.md which contains all agent listings
2. Search for the term in agent names and descriptions 2. Search for the term in agent names and descriptions
3. Present matching results 3. Present matching results
@@ -47,6 +51,7 @@ You can:
**User:** "Show me available agent categories" **User:** "Show me available agent categories"
**You:** Fetch from GitHub API, then present: **You:** Fetch from GitHub API, then present:
``` ```
Available categories: Available categories:
1. Core Development (11 agents) 1. Core Development (11 agents)
@@ -57,6 +62,7 @@ Available categories:
**User:** "Install the python-pro agent" **User:** "Install the python-pro agent"
**You:** **You:**
1. Ask: "Install globally (~/.claude/agents/) or locally (.claude/agents/)?" 1. Ask: "Install globally (~/.claude/agents/) or locally (.claude/agents/)?"
2. Download from GitHub 2. Download from GitHub
3. Save to chosen directory 3. Save to chosen directory
+25
View File
@@ -8,12 +8,14 @@ model: sonnet
You are a senior agent organizer with expertise in assembling and coordinating multi-agent teams. Your focus spans task analysis, agent capability mapping, workflow design, and team optimization with emphasis on selecting the right agents for each task and ensuring efficient collaboration. You are a senior agent organizer with expertise in assembling and coordinating multi-agent teams. Your focus spans task analysis, agent capability mapping, workflow design, and team optimization with emphasis on selecting the right agents for each task and ensuring efficient collaboration.
When invoked: When invoked:
1. Query context manager for task requirements and available agents 1. Query context manager for task requirements and available agents
2. Review agent capabilities, performance history, and current workload 2. Review agent capabilities, performance history, and current workload
3. Analyze task complexity, dependencies, and optimization opportunities 3. Analyze task complexity, dependencies, and optimization opportunities
4. Orchestrate agent teams for maximum efficiency and success 4. Orchestrate agent teams for maximum efficiency and success
Agent organization checklist: Agent organization checklist:
- Agent selection accuracy > 95% achieved - Agent selection accuracy > 95% achieved
- Task completion rate > 99% maintained - Task completion rate > 99% maintained
- Resource utilization optimal consistently - Resource utilization optimal consistently
@@ -24,6 +26,7 @@ Agent organization checklist:
- Team synergy maximized effectively - Team synergy maximized effectively
Task decomposition: Task decomposition:
- Requirement analysis - Requirement analysis
- Subtask identification - Subtask identification
- Dependency mapping - Dependency mapping
@@ -34,6 +37,7 @@ Task decomposition:
- Success criteria - Success criteria
Agent capability mapping: Agent capability mapping:
- Skill inventory - Skill inventory
- Performance metrics - Performance metrics
- Specialization areas - Specialization areas
@@ -44,6 +48,7 @@ Agent capability mapping:
- Workload capacity - Workload capacity
Team assembly: Team assembly:
- Optimal composition - Optimal composition
- Skill coverage - Skill coverage
- Role assignment - Role assignment
@@ -54,6 +59,7 @@ Team assembly:
- Timeline synchronization - Timeline synchronization
Orchestration patterns: Orchestration patterns:
- Sequential execution - Sequential execution
- Parallel processing - Parallel processing
- Pipeline patterns - Pipeline patterns
@@ -64,6 +70,7 @@ Orchestration patterns:
- Failover strategies - Failover strategies
Workflow design: Workflow design:
- Process modeling - Process modeling
- Data flow planning - Data flow planning
- Control flow design - Control flow design
@@ -74,6 +81,7 @@ Workflow design:
- Result aggregation - Result aggregation
Agent selection criteria: Agent selection criteria:
- Capability matching - Capability matching
- Performance history - Performance history
- Cost considerations - Cost considerations
@@ -84,6 +92,7 @@ Agent selection criteria:
- Backup selection - Backup selection
Dependency management: Dependency management:
- Task dependencies - Task dependencies
- Resource dependencies - Resource dependencies
- Data dependencies - Data dependencies
@@ -94,6 +103,7 @@ Dependency management:
- Flow optimization - Flow optimization
Performance optimization: Performance optimization:
- Bottleneck identification - Bottleneck identification
- Load distribution - Load distribution
- Parallel execution - Parallel execution
@@ -104,6 +114,7 @@ Performance optimization:
- Cost minimization - Cost minimization
Team dynamics: Team dynamics:
- Optimal team size - Optimal team size
- Skill complementarity - Skill complementarity
- Communication overhead - Communication overhead
@@ -114,6 +125,7 @@ Team dynamics:
- Result integration - Result integration
Monitoring & adaptation: Monitoring & adaptation:
- Real-time tracking - Real-time tracking
- Performance metrics - Performance metrics
- Anomaly detection - Anomaly detection
@@ -130,6 +142,7 @@ Monitoring & adaptation:
Initialize agent organization by understanding task and team requirements. Initialize agent organization by understanding task and team requirements.
Organization context query: Organization context query:
```json ```json
{ {
"requesting_agent": "agent-organizer", "requesting_agent": "agent-organizer",
@@ -149,6 +162,7 @@ Execute agent organization through systematic phases:
Decompose and understand task requirements. Decompose and understand task requirements.
Analysis priorities: Analysis priorities:
- Task breakdown - Task breakdown
- Complexity assessment - Complexity assessment
- Dependency identification - Dependency identification
@@ -159,6 +173,7 @@ Analysis priorities:
- Quality standards - Quality standards
Task evaluation: Task evaluation:
- Parse requirements - Parse requirements
- Identify subtasks - Identify subtasks
- Map dependencies - Map dependencies
@@ -173,6 +188,7 @@ Task evaluation:
Assemble and coordinate agent teams. Assemble and coordinate agent teams.
Implementation approach: Implementation approach:
- Select agents - Select agents
- Assign roles - Assign roles
- Setup communication - Setup communication
@@ -183,6 +199,7 @@ Implementation approach:
- Optimize performance - Optimize performance
Organization patterns: Organization patterns:
- Capability-based selection - Capability-based selection
- Load-balanced assignment - Load-balanced assignment
- Redundant coverage - Redundant coverage
@@ -193,6 +210,7 @@ Organization patterns:
- Result validation - Result validation
Progress tracking: Progress tracking:
```json ```json
{ {
"agent": "agent-organizer", "agent": "agent-organizer",
@@ -211,6 +229,7 @@ Progress tracking:
Achieve optimal multi-agent coordination. Achieve optimal multi-agent coordination.
Excellence checklist: Excellence checklist:
- Tasks completed - Tasks completed
- Performance optimal - Performance optimal
- Resources efficient - Resources efficient
@@ -224,6 +243,7 @@ Delivery notification:
"Agent orchestration completed. Coordinated 12 agents across 47 tasks with 94% first-pass success rate. Average response time 3.2s with 67% resource utilization. Achieved 23% performance improvement through optimal team composition and workflow design." "Agent orchestration completed. Coordinated 12 agents across 47 tasks with 94% first-pass success rate. Average response time 3.2s with 67% resource utilization. Achieved 23% performance improvement through optimal team composition and workflow design."
Team composition strategies: Team composition strategies:
- Skill diversity - Skill diversity
- Redundancy planning - Redundancy planning
- Communication efficiency - Communication efficiency
@@ -234,6 +254,7 @@ Team composition strategies:
- Scalability design - Scalability design
Workflow optimization: Workflow optimization:
- Parallel execution - Parallel execution
- Pipeline efficiency - Pipeline efficiency
- Resource sharing - Resource sharing
@@ -244,6 +265,7 @@ Workflow optimization:
- Result synthesis - Result synthesis
Dynamic adaptation: Dynamic adaptation:
- Performance monitoring - Performance monitoring
- Bottleneck detection - Bottleneck detection
- Agent reallocation - Agent reallocation
@@ -254,6 +276,7 @@ Dynamic adaptation:
- Resource scaling - Resource scaling
Coordination excellence: Coordination excellence:
- Clear communication - Clear communication
- Efficient handoffs - Efficient handoffs
- Synchronized execution - Synchronized execution
@@ -264,6 +287,7 @@ Coordination excellence:
- Continuous improvement - Continuous improvement
Learning & improvement: Learning & improvement:
- Performance analysis - Performance analysis
- Pattern recognition - Pattern recognition
- Best practice extraction - Best practice extraction
@@ -274,6 +298,7 @@ Learning & improvement:
- Knowledge base update - Knowledge base update
Integration with other agents: Integration with other agents:
- Collaborate with context-manager on information sharing - Collaborate with context-manager on information sharing
- Support multi-agent-coordinator on execution - Support multi-agent-coordinator on execution
- Work with task-distributor on load balancing - Work with task-distributor on load balancing
+16
View File
@@ -40,6 +40,7 @@ owners:
``` ```
**How to get the repositoryID:** **How to get the repositoryID:**
1. Log into artifacthub.io 1. Log into artifacthub.io
2. Go to Control Panel → Repositories → Add 2. Go to Control Panel → Repositories → Add
3. Select repository kind: "Headlamp plugins" 3. Select repository kind: "Headlamp plugins"
@@ -99,6 +100,7 @@ annotations: # CRITICAL — Headlamp-specific
These annotations in `artifacthub-pkg.yml` are what make ArtifactHub treat the package as a Headlamp plugin: These annotations in `artifacthub-pkg.yml` are what make ArtifactHub treat the package as a Headlamp plugin:
### headlamp/plugin/archive-url ### headlamp/plugin/archive-url
**Required.** Direct download URL to the plugin tarball on GitHub Releases. **Required.** Direct download URL to the plugin tarball on GitHub Releases.
Format: `https://github.com/<owner>/<repo>/releases/download/v<VERSION>/<pkgname>-<VERSION>.tar.gz` Format: `https://github.com/<owner>/<repo>/releases/download/v<VERSION>/<pkgname>-<VERSION>.tar.gz`
@@ -108,6 +110,7 @@ Format: `https://github.com/<owner>/<repo>/releases/download/v<VERSION>/<pkgname
- The tarball is uploaded as a GitHub Release asset — NOT to ArtifactHub - The tarball is uploaded as a GitHub Release asset — NOT to ArtifactHub
### headlamp/plugin/archive-checksum ### headlamp/plugin/archive-checksum
**Recommended.** SHA256 checksum of the tarball. **Recommended.** SHA256 checksum of the tarball.
Format: `sha256:<hex-digest>` Format: `sha256:<hex-digest>`
@@ -117,14 +120,17 @@ Generated via: `sha256sum <tarball> | awk '{print $1}'`
Can be empty string if not yet computed (release workflow fills it in). Can be empty string if not yet computed (release workflow fills it in).
### headlamp/plugin/version-compat ### headlamp/plugin/version-compat
**Required.** Minimum Headlamp version the plugin works with. **Required.** Minimum Headlamp version the plugin works with.
Format: `>=X.Y.Z` (e.g., `>=0.20.0`, `>=0.26`) Format: `>=X.Y.Z` (e.g., `>=0.20.0`, `>=0.26`)
### headlamp/plugin/distro-compat ### headlamp/plugin/distro-compat
**Required.** Comma-separated list of supported Headlamp deployment targets. **Required.** Comma-separated list of supported Headlamp deployment targets.
Valid values: Valid values:
- `in-cluster` — Headlamp running inside a Kubernetes cluster - `in-cluster` — Headlamp running inside a Kubernetes cluster
- `web` — Web-based Headlamp deployment - `web` — Web-based Headlamp deployment
- `app` — Headlamp desktop application (Electron) - `app` — Headlamp desktop application (Electron)
@@ -138,6 +144,7 @@ Example: `"in-cluster,web,app"`
## ArtifactHub Categories ## ArtifactHub Categories
Valid `category` values for Headlamp plugins: Valid `category` values for Headlamp plugins:
- `security` — Secrets, RBAC, policy enforcement - `security` — Secrets, RBAC, policy enforcement
- `storage` — CSI drivers, persistent volumes, Ceph/Rook - `storage` — CSI drivers, persistent volumes, Ceph/Rook
- `monitoring-logging` — Metrics, GPU monitoring, observability - `monitoring-logging` — Metrics, GPU monitoring, observability
@@ -148,7 +155,9 @@ Valid `category` values for Headlamp plugins:
## Optional Fields ## Optional Fields
### containersImages ### containersImages
For plugins associated with a specific container/operator: For plugins associated with a specific container/operator:
```yaml ```yaml
containersImages: containersImages:
- name: <component-name> - name: <component-name>
@@ -156,14 +165,18 @@ containersImages:
``` ```
### recommendations ### recommendations
Link to related ArtifactHub packages: Link to related ArtifactHub packages:
```yaml ```yaml
recommendations: recommendations:
- url: https://artifacthub.io/packages/helm/<repo>/<chart> - url: https://artifacthub.io/packages/helm/<repo>/<chart>
``` ```
### install ### install
Custom installation instructions (markdown): Custom installation instructions (markdown):
```yaml ```yaml
install: | install: |
## Install via Headlamp Plugin Manager ## Install via Headlamp Plugin Manager
@@ -171,6 +184,7 @@ install: |
``` ```
### logoPath ### logoPath
Path to a logo image file in the repo (relative to root). Path to a logo image file in the repo (relative to root).
--- ---
@@ -196,6 +210,7 @@ This is the actual flow. There is NO other way to publish:
``` ```
**Key points:** **Key points:**
- Steps 1-9 happen in your GitHub Actions workflow - Steps 1-9 happen in your GitHub Actions workflow
- Step 10 is entirely controlled by ArtifactHub — you cannot trigger it - Step 10 is entirely controlled by ArtifactHub — you cannot trigger it
- The tarball lives on GitHub Releases, not ArtifactHub - The tarball lives on GitHub Releases, not ArtifactHub
@@ -233,6 +248,7 @@ The `<pkgname>` directory inside the tarball matches the `name` field from `pack
## Validating Metadata ## Validating Metadata
Before committing, check: Before committing, check:
1. `version` matches across `package.json` and `artifacthub-pkg.yml` 1. `version` matches across `package.json` and `artifacthub-pkg.yml`
2. `archive-url` version tag matches the `version` field 2. `archive-url` version tag matches the `version` field
3. `name` in `artifacthub-pkg.yml` matches `package.json` `name` 3. `name` in `artifacthub-pkg.yml` matches `package.json` `name`
@@ -99,6 +99,7 @@ class KubeObject<T extends KubeObjectInterface> {
### ResourceClasses ### ResourceClasses
All standard K8s resource types available (Secret, Namespace, Pod, etc.): All standard K8s resource types available (Secret, Namespace, Pod, etc.):
```typescript ```typescript
const [secrets, error, loading] = K8s.ResourceClasses.Secret.useList({ namespace: 'default' }); const [secrets, error, loading] = K8s.ResourceClasses.Secret.useList({ namespace: 'default' });
const [secret, error] = K8s.ResourceClasses.Secret.useGet('my-secret', 'default'); const [secret, error] = K8s.ResourceClasses.Secret.useGet('my-secret', 'default');
@@ -127,6 +128,7 @@ ApiProxy.apiFactory(group, version, resource): ApiClient
``` ```
**Service proxy URL** (accessing in-cluster services): **Service proxy URL** (accessing in-cluster services):
``` ```
/api/v1/namespaces/${ns}/services/http:${name}:${port}/proxy${path} /api/v1/namespaces/${ns}/services/http:${name}:${port}/proxy${path}
``` ```
@@ -146,6 +148,7 @@ From `@kinvolk/headlamp-plugin/lib/CommonComponents`:
`PercentageBar` — bar chart with `data` array of `{ name, value, fill }` `PercentageBar` — bar chart with `data` array of `{ name, value, fill }`
### SimpleTable (non-obvious props) ### SimpleTable (non-obvious props)
```typescript ```typescript
<SimpleTable <SimpleTable
data={items} data={items}
@@ -158,6 +161,7 @@ From `@kinvolk/headlamp-plugin/lib/CommonComponents`:
``` ```
### NameValueTable (non-obvious props) ### NameValueTable (non-obvious props)
```typescript ```typescript
<NameValueTable <NameValueTable
rows={[ rows={[
@@ -168,6 +172,7 @@ From `@kinvolk/headlamp-plugin/lib/CommonComponents`:
``` ```
### ConfigStore ### ConfigStore
```typescript ```typescript
import { ConfigStore } from '@kinvolk/headlamp-plugin/lib'; import { ConfigStore } from '@kinvolk/headlamp-plugin/lib';
const store = new ConfigStore<MyConfig>('plugin-name'); const store = new ConfigStore<MyConfig>('plugin-name');
@@ -177,6 +182,7 @@ store.useConfig(): () => MyConfig;
``` ```
### Pre-bundled (no package.json entry needed) ### Pre-bundled (no package.json entry needed)
react, react-dom, react-router-dom, @iconify/react, react-redux, @material-ui/core, @material-ui/styles, lodash, notistack, recharts, monaco-editor react, react-dom, react-router-dom, @iconify/react, react-redux, @material-ui/core, @material-ui/styles, lodash, notistack, recharts, monaco-editor
--- ---
@@ -264,6 +270,7 @@ vi.mock('@kinvolk/headlamp-plugin/lib/CommonComponents', () => ({
Headlamp supports light and dark themes. **Never hardcode colors.** Use CSS custom properties with light-mode fallbacks: Headlamp supports light and dark themes. **Never hardcode colors.** Use CSS custom properties with light-mode fallbacks:
### Required CSS variables for inline styles ### Required CSS variables for inline styles
```typescript ```typescript
// Text // Text
color: 'var(--mui-palette-text-primary)' color: 'var(--mui-palette-text-primary)'
@@ -289,6 +296,7 @@ color: 'var(--link-color, #1976d2)'
``` ```
### Common mistakes to avoid ### Common mistakes to avoid
- **NEVER** use raw `#fff`, `#000`, `#333`, `#666` etc. without wrapping in `var(--mui-palette-*)` - **NEVER** use raw `#fff`, `#000`, `#333`, `#666` etc. without wrapping in `var(--mui-palette-*)`
- **NEVER** use `rgba(0,0,0,0.5)` for overlays without a variable — this is the one exception where raw rgba is acceptable (backdrop overlays) - **NEVER** use `rgba(0,0,0,0.5)` for overlays without a variable — this is the one exception where raw rgba is acceptable (backdrop overlays)
- **NEVER** assume white backgrounds or dark text — always use `background-paper`/`text-primary` - **NEVER** assume white backgrounds or dark text — always use `background-paper`/`text-primary`
@@ -296,6 +304,7 @@ color: 'var(--link-color, #1976d2)'
- Fallback values after the comma are for environments where the variable isn't set — always use the light-mode default - Fallback values after the comma are for environments where the variable isn't set — always use the light-mode default
### Form inputs in custom components ### Form inputs in custom components
```typescript ```typescript
const inputStyle = { const inputStyle = {
border: '1px solid var(--mui-palette-divider, #ccc)', border: '1px solid var(--mui-palette-divider, #ccc)',
+25
View File
@@ -8,12 +8,14 @@ model: opus
You are a senior multi-agent coordinator with expertise in orchestrating complex distributed workflows. Your focus spans inter-agent communication, task dependency management, parallel execution control, and fault tolerance with emphasis on ensuring efficient, reliable coordination across large agent teams. You are a senior multi-agent coordinator with expertise in orchestrating complex distributed workflows. Your focus spans inter-agent communication, task dependency management, parallel execution control, and fault tolerance with emphasis on ensuring efficient, reliable coordination across large agent teams.
When invoked: When invoked:
1. Query context manager for workflow requirements and agent states 1. Query context manager for workflow requirements and agent states
2. Review communication patterns, dependencies, and resource constraints 2. Review communication patterns, dependencies, and resource constraints
3. Analyze coordination bottlenecks, deadlock risks, and optimization opportunities 3. Analyze coordination bottlenecks, deadlock risks, and optimization opportunities
4. Implement robust multi-agent coordination strategies 4. Implement robust multi-agent coordination strategies
Multi-agent coordination checklist: Multi-agent coordination checklist:
- Coordination overhead < 5% maintained - Coordination overhead < 5% maintained
- Deadlock prevention 100% ensured - Deadlock prevention 100% ensured
- Message delivery guaranteed thoroughly - Message delivery guaranteed thoroughly
@@ -24,6 +26,7 @@ Multi-agent coordination checklist:
- Performance optimal consistently - Performance optimal consistently
Workflow orchestration: Workflow orchestration:
- Process design - Process design
- Flow control - Flow control
- State management - State management
@@ -34,6 +37,7 @@ Workflow orchestration:
- Result aggregation - Result aggregation
Inter-agent communication: Inter-agent communication:
- Protocol design - Protocol design
- Message routing - Message routing
- Channel management - Channel management
@@ -44,6 +48,7 @@ Inter-agent communication:
- Backpressure handling - Backpressure handling
Dependency management: Dependency management:
- Dependency graphs - Dependency graphs
- Topological sorting - Topological sorting
- Circular detection - Circular detection
@@ -54,6 +59,7 @@ Dependency management:
- Race condition handling - Race condition handling
Coordination patterns: Coordination patterns:
- Master-worker - Master-worker
- Peer-to-peer - Peer-to-peer
- Hierarchical - Hierarchical
@@ -64,6 +70,7 @@ Coordination patterns:
- Consensus-based - Consensus-based
Parallel execution: Parallel execution:
- Task partitioning - Task partitioning
- Work distribution - Work distribution
- Load balancing - Load balancing
@@ -74,6 +81,7 @@ Parallel execution:
- Result merging - Result merging
Communication mechanisms: Communication mechanisms:
- Message passing - Message passing
- Shared memory - Shared memory
- Event streams - Event streams
@@ -84,6 +92,7 @@ Communication mechanisms:
- Queue systems - Queue systems
Resource coordination: Resource coordination:
- Resource allocation - Resource allocation
- Lock management - Lock management
- Semaphore control - Semaphore control
@@ -94,6 +103,7 @@ Resource coordination:
- Efficiency optimization - Efficiency optimization
Fault tolerance: Fault tolerance:
- Failure detection - Failure detection
- Timeout handling - Timeout handling
- Retry mechanisms - Retry mechanisms
@@ -104,6 +114,7 @@ Fault tolerance:
- Graceful degradation - Graceful degradation
Workflow management: Workflow management:
- DAG execution - DAG execution
- State machines - State machines
- Saga patterns - Saga patterns
@@ -114,6 +125,7 @@ Workflow management:
- Loop handling - Loop handling
Performance optimization: Performance optimization:
- Bottleneck analysis - Bottleneck analysis
- Pipeline optimization - Pipeline optimization
- Batch processing - Batch processing
@@ -130,6 +142,7 @@ Performance optimization:
Initialize multi-agent coordination by understanding workflow needs. Initialize multi-agent coordination by understanding workflow needs.
Coordination context query: Coordination context query:
```json ```json
{ {
"requesting_agent": "multi-agent-coordinator", "requesting_agent": "multi-agent-coordinator",
@@ -149,6 +162,7 @@ Execute multi-agent coordination through systematic phases:
Design efficient coordination strategies. Design efficient coordination strategies.
Analysis priorities: Analysis priorities:
- Workflow mapping - Workflow mapping
- Agent capabilities - Agent capabilities
- Communication needs - Communication needs
@@ -159,6 +173,7 @@ Analysis priorities:
- Optimization opportunities - Optimization opportunities
Workflow evaluation: Workflow evaluation:
- Map processes - Map processes
- Identify dependencies - Identify dependencies
- Analyze communication - Analyze communication
@@ -173,6 +188,7 @@ Workflow evaluation:
Orchestrate complex multi-agent workflows. Orchestrate complex multi-agent workflows.
Implementation approach: Implementation approach:
- Setup communication - Setup communication
- Configure workflows - Configure workflows
- Manage dependencies - Manage dependencies
@@ -183,6 +199,7 @@ Implementation approach:
- Optimize performance - Optimize performance
Coordination patterns: Coordination patterns:
- Efficient messaging - Efficient messaging
- Clear dependencies - Clear dependencies
- Parallel execution - Parallel execution
@@ -193,6 +210,7 @@ Coordination patterns:
- Continuous optimization - Continuous optimization
Progress tracking: Progress tracking:
```json ```json
{ {
"agent": "multi-agent-coordinator", "agent": "multi-agent-coordinator",
@@ -211,6 +229,7 @@ Progress tracking:
Achieve seamless multi-agent collaboration. Achieve seamless multi-agent collaboration.
Excellence checklist: Excellence checklist:
- Workflows smooth - Workflows smooth
- Communication efficient - Communication efficient
- Dependencies resolved - Dependencies resolved
@@ -224,6 +243,7 @@ Delivery notification:
"Multi-agent coordination completed. Orchestrated 87 agents processing 234K messages/minute with 94% workflow completion rate. Achieved 96% coordination efficiency with zero deadlocks and 99.9% message delivery guarantee." "Multi-agent coordination completed. Orchestrated 87 agents processing 234K messages/minute with 94% workflow completion rate. Achieved 96% coordination efficiency with zero deadlocks and 99.9% message delivery guarantee."
Communication optimization: Communication optimization:
- Protocol efficiency - Protocol efficiency
- Message batching - Message batching
- Compression strategies - Compression strategies
@@ -234,6 +254,7 @@ Communication optimization:
- Queue management - Queue management
Dependency resolution: Dependency resolution:
- Graph algorithms - Graph algorithms
- Priority scheduling - Priority scheduling
- Resource allocation - Resource allocation
@@ -244,6 +265,7 @@ Dependency resolution:
- Bottleneck removal - Bottleneck removal
Fault handling: Fault handling:
- Failure detection - Failure detection
- Isolation strategies - Isolation strategies
- Recovery procedures - Recovery procedures
@@ -254,6 +276,7 @@ Fault handling:
- Graceful degradation - Graceful degradation
Scalability patterns: Scalability patterns:
- Horizontal scaling - Horizontal scaling
- Vertical partitioning - Vertical partitioning
- Load distribution - Load distribution
@@ -264,6 +287,7 @@ Scalability patterns:
- Cluster coordination - Cluster coordination
Performance tuning: Performance tuning:
- Latency analysis - Latency analysis
- Throughput optimization - Throughput optimization
- Resource utilization - Resource utilization
@@ -274,6 +298,7 @@ Performance tuning:
- I/O optimization - I/O optimization
Integration with other agents: Integration with other agents:
- Collaborate with agent-organizer on team assembly - Collaborate with agent-organizer on team assembly
- Support context-manager on state synchronization - Support context-manager on state synchronization
- Work with workflow-orchestrator on process execution - Work with workflow-orchestrator on process execution
+20
View File
@@ -0,0 +1,20 @@
{
"config": {
// Line length — not enforced for docs with code examples
"MD013": false,
// First line heading — files use YAML frontmatter, not headings
"MD041": false,
// Emphasis as heading — common pattern for Option 1/2/3 sections
"MD036": false,
// No duplicate heading — changelog files repeat section names intentionally
"MD024": false,
// Fenced code language — not always applicable for diagram blocks
"MD040": false,
// Table column style — table alignment is visual, not semantic
"MD060": false,
// Ordered list item prefix — number resets are intentional in documents
"MD029": false,
// No inline HTML — each elements are valid in valid Markdown
"MD033": false
}
}
+49
View File
@@ -13,14 +13,17 @@ First stable release. The plugin API (routes, sidebar entries, settings schema,
now frozen — no breaking changes without a new major version. now frozen — no breaking changes without a new major version.
### Security ### Security
- Patched 8 of 9 npm audit vulnerabilities via `pnpm.overrides` (#92) - Patched 8 of 9 npm audit vulnerabilities via `pnpm.overrides` (#92)
### Added ### Added
- **Dual-approval CI check**: PRs now require approval from both CTO and QA before merging (#98, #76) - **Dual-approval CI check**: PRs now require approval from both CTO and QA before merging (#98, #76)
- **ExemptionManager test suite**: Full coverage of annotation-based exemption flows, exemption creation, and inline feedback (#82) - **ExemptionManager test suite**: Full coverage of annotation-based exemption flows, exemption creation, and inline feedback (#82)
- **RBAC preflight check**: `deploy-e2e-headlamp.sh` now verifies runner RBAC before attempting E2E deploy (#80) - **RBAC preflight check**: `deploy-e2e-headlamp.sh` now verifies runner RBAC before attempting E2E deploy (#80)
### Fixed ### Fixed
- **E2E infrastructure overhaul**: Replaced Dockerfile.e2e with ConfigMap volume mount for plugin loading; tests now run in the `privilegedescalation-dev` namespace (#73, #89, #94) - **E2E infrastructure overhaul**: Replaced Dockerfile.e2e with ConfigMap volume mount for plugin loading; tests now run in the `privilegedescalation-dev` namespace (#73, #89, #94)
- **E2E token auth**: Workflow uses GitHub App token auth and handles the `/token` redirect correctly (#97) - **E2E token auth**: Workflow uses GitHub App token auth and handles the `/token` redirect correctly (#97)
- **E2E HTTP readiness**: `deploy-e2e-headlamp.sh` waits for HTTP reachability after rollout before running tests (#104) - **E2E HTTP readiness**: `deploy-e2e-headlamp.sh` waits for HTTP reachability after rollout before running tests (#104)
@@ -28,6 +31,7 @@ now frozen — no breaking changes without a new major version.
- **Direct devDependencies**: Added `typescript`, `eslint`, `prettier`, and `@headlamp-k8s/eslint-config` as explicit direct devDependencies to prevent phantom-dep failures in clean installs (#95, #102) - **Direct devDependencies**: Added `typescript`, `eslint`, `prettier`, and `@headlamp-k8s/eslint-config` as explicit direct devDependencies to prevent phantom-dep failures in clean installs (#95, #102)
### Changed ### Changed
- **pnpm version pinned**: `packageManager` field in `package.json` pins the pnpm version used in CI (#103) - **pnpm version pinned**: `packageManager` field in `package.json` pins the pnpm version used in CI (#103)
- **GitHub Actions SHA pinning**: Renovate `pinDigests` enabled to SHA-pin all GitHub Actions (#105) - **GitHub Actions SHA pinning**: Renovate `pinDigests` enabled to SHA-pin all GitHub Actions (#105)
- **ArtifactHub metadata polish**: Improved `install` instructions and `changes` section formatting (#82) - **ArtifactHub metadata polish**: Improved `install` instructions and `changes` section formatting (#82)
@@ -35,12 +39,14 @@ now frozen — no breaking changes without a new major version.
## [0.6.0] - 2026-03-04 ## [0.6.0] - 2026-03-04
### Fixed ### Fixed
- **ExemptionManager apiVersion bug**: `apps` and `batch` resources now correctly use `/apis/{group}/v1/` instead of the broken `/api/v1/` path - **ExemptionManager apiVersion bug**: `apps` and `batch` resources now correctly use `/apis/{group}/v1/` instead of the broken `/api/v1/` path
- **Strict TypeScript**: Replaced `resource: any` in InlineAuditSection with proper `KubeResource` interface - **Strict TypeScript**: Replaced `resource: any` in InlineAuditSection with proper `KubeResource` interface
- **PolarisDataContext test mock**: Added missing `triggerRefresh` to mock, preventing silent `undefined` for `refresh` in context - **PolarisDataContext test mock**: Added missing `triggerRefresh` to mock, preventing silent `undefined` for `refresh` in context
- **DashboardView test**: Fixed `SimpleTable` mock that used `Array<any>` and didn't exercise column getters - **DashboardView test**: Fixed `SimpleTable` mock that used `Array<any>` and didn't exercise column getters
### Changed ### Changed
- **Dark mode / theming**: Replaced all `var(--mui-palette-*)` CSS variables with `useTheme()` + `theme.palette.*` across all components (DashboardView, NamespacesListView, InlineAuditSection, ExemptionManager, PolarisSettings, AppBarScoreBadge) - **Dark mode / theming**: Replaced all `var(--mui-palette-*)` CSS variables with `useTheme()` + `theme.palette.*` across all components (DashboardView, NamespacesListView, InlineAuditSection, ExemptionManager, PolarisSettings, AppBarScoreBadge)
- **Namespace drawer**: Replaced custom `<style>` block + positioned `<div>` with MUI `Drawer` component for proper accessibility (`role="dialog"`, `aria-modal`, Escape key handling via MUI) - **Namespace drawer**: Replaced custom `<style>` block + positioned `<div>` with MUI `Drawer` component for proper accessibility (`role="dialog"`, `aria-modal`, Escape key handling via MUI)
- **AppBarScoreBadge**: Uses `theme.palette.success/warning/error` with proper `contrastText` instead of hardcoded hex colors - **AppBarScoreBadge**: Uses `theme.palette.success/warning/error` with proper `contrastText` instead of hardcoded hex colors
@@ -48,6 +54,7 @@ now frozen — no breaking changes without a new major version.
- **URL construction**: Exported `getPolarisApiPath` and `isFullUrl` from `polaris.ts`; PolarisSettings now reuses them instead of duplicating logic - **URL construction**: Exported `getPolarisApiPath` and `isFullUrl` from `polaris.ts`; PolarisSettings now reuses them instead of duplicating logic
### Added ### Added
- **Error boundaries**: All registered components (routes, detail sections, app bar action) wrapped in `PolarisErrorBoundary` for graceful error rendering - **Error boundaries**: All registered components (routes, detail sections, app bar action) wrapped in `PolarisErrorBoundary` for graceful error rendering
- **Tests for InlineAuditSection** (7 tests): loading, unsupported kind, not found, score/summary, failing checks, link, exemption manager - **Tests for InlineAuditSection** (7 tests): loading, unsupported kind, not found, score/summary, failing checks, link, exemption manager
- **Tests for AppBarScoreBadge** (6 tests): loading, no data, score colors, navigation, aria-label - **Tests for AppBarScoreBadge** (6 tests): loading, no data, score colors, navigation, aria-label
@@ -55,6 +62,7 @@ now frozen — no breaking changes without a new major version.
- **Tests for checkMapping.ts** (11 tests): name/description/category/severity lookups, unknown checks, CHECK_MAPPING structure validation - **Tests for checkMapping.ts** (11 tests): name/description/category/severity lookups, unknown checks, CHECK_MAPPING structure validation
### Removed ### Removed
- **NamespaceDetailView.tsx**: Dead code with no registered route (replaced by drawer in NamespacesListView) - **NamespaceDetailView.tsx**: Dead code with no registered route (replaced by drawer in NamespacesListView)
- **NamespaceDetailView.test.tsx**: Tests for removed component - **NamespaceDetailView.test.tsx**: Tests for removed component
- **MockPolarisProvider in test-utils.tsx**: Unused mock provider (tests use `vi.mock` instead) - **MockPolarisProvider in test-utils.tsx**: Unused mock provider (tests use `vi.mock` instead)
@@ -63,9 +71,11 @@ now frozen — no breaking changes without a new major version.
## [0.3.5] - 2026-02-12 ## [0.3.5] - 2026-02-12
### Fixed ### Fixed
- Fixed drawer background remaining white in dark mode by using correct CSS variable (`--mui-palette-background-default`) - Fixed drawer background remaining white in dark mode by using correct CSS variable (`--mui-palette-background-default`)
### Documentation ### Documentation
- Added comprehensive Priority 2 documentation (ARCHITECTURE.md, DEPLOYMENT.md, SECURITY.md) - Added comprehensive Priority 2 documentation (ARCHITECTURE.md, DEPLOYMENT.md, SECURITY.md)
- Added CONTRIBUTING.md with development workflow, branching strategy, and code style guidelines - Added CONTRIBUTING.md with development workflow, branching strategy, and code style guidelines
- Added complete CHANGELOG.md documenting all releases from v0.0.1 to current - Added complete CHANGELOG.md documenting all releases from v0.0.1 to current
@@ -73,17 +83,20 @@ now frozen — no breaking changes without a new major version.
## [0.3.4] - 2026-02-12 ## [0.3.4] - 2026-02-12
### Fixed ### Fixed
- Removed all `@mui/material` and `@mui/icons-material` imports causing plugin load failure - Removed all `@mui/material` and `@mui/icons-material` imports causing plugin load failure
- Fixed plugin settings page registration (changed name from 'polaris' to 'headlamp-polaris-plugin') - Fixed plugin settings page registration (changed name from 'polaris' to 'headlamp-polaris-plugin')
- Added dark mode support using MUI CSS variables for proper theme adaptation - Added dark mode support using MUI CSS variables for proper theme adaptation
- Resolved TypeScript compilation errors in plugin registration calls - Resolved TypeScript compilation errors in plugin registration calls
### Changed ### Changed
- Replaced all MUI components with standard HTML elements and inline styles - Replaced all MUI components with standard HTML elements and inline styles
- Updated `registerDetailsViewSection` and `registerAppBarAction` to match Headlamp plugin API v0.13.0 - Updated `registerDetailsViewSection` and `registerAppBarAction` to match Headlamp plugin API v0.13.0
- App bar badge, settings buttons, and UI elements now use theme-aware CSS variables - App bar badge, settings buttons, and UI elements now use theme-aware CSS variables
### Infrastructure ### Infrastructure
- Added CI workflow for lint, type-check, build, and test - Added CI workflow for lint, type-check, build, and test
- Enhanced E2E testing documentation with comprehensive guides - Enhanced E2E testing documentation with comprehensive guides
- Added documentation-engineer subagent - Added documentation-engineer subagent
@@ -91,24 +104,28 @@ now frozen — no breaking changes without a new major version.
## [0.3.3] - 2026-02-12 ## [0.3.3] - 2026-02-12
### Fixed ### Fixed
- Corrected plugin settings registration name to match package.json - Corrected plugin settings registration name to match package.json
- Added displaySaveButton parameter to settings registration - Added displaySaveButton parameter to settings registration
## [0.3.2] - 2026-02-12 ## [0.3.2] - 2026-02-12
### Fixed ### Fixed
- Removed all MUI dependencies to fix plugin loading in Headlamp v0.39.0+ - Removed all MUI dependencies to fix plugin loading in Headlamp v0.39.0+
- Plugin now loads correctly in sidebar and routes - Plugin now loads correctly in sidebar and routes
## [0.3.1] - 2026-02-12 ## [0.3.1] - 2026-02-12
### Fixed ### Fixed
- TypeScript compilation errors in `registerDetailsViewSection` and `registerAppBarAction` calls - TypeScript compilation errors in `registerDetailsViewSection` and `registerAppBarAction` calls
- Test failures in DashboardView (added missing SimpleTable mock) - Test failures in DashboardView (added missing SimpleTable mock)
## [0.3.0] - 2026-02-11 ## [0.3.0] - 2026-02-11
### Added ### Added
- App bar badge displaying cluster Polaris score - App bar badge displaying cluster Polaris score
- Inline audit sections in resource detail views (Deployment, StatefulSet, DaemonSet, Job, CronJob) - Inline audit sections in resource detail views (Deployment, StatefulSet, DaemonSet, Job, CronJob)
- Exemption management UI (view/add exemptions via annotations) - Exemption management UI (view/add exemptions via annotations)
@@ -117,33 +134,39 @@ now frozen — no breaking changes without a new major version.
- Namespace drawer navigation with URL hash support - Namespace drawer navigation with URL hash support
### Changed ### Changed
- Migrated namespace detail to right-side drawer panel - Migrated namespace detail to right-side drawer panel
- Improved drawer keyboard navigation (Escape to close) - Improved drawer keyboard navigation (Escape to close)
- Enhanced settings page with connection testing - Enhanced settings page with connection testing
### Fixed ### Fixed
- Empty namespace crash handling - Empty namespace crash handling
- Drawer navigation pattern for better UX - Drawer navigation pattern for better UX
## [0.2.5] - 2025-12-XX ## [0.2.5] - 2025-12-XX
### Fixed ### Fixed
- Improved theming and settings visibility - Improved theming and settings visibility
## [0.2.4] - 2025-12-XX ## [0.2.4] - 2025-12-XX
### Changed ### Changed
- Increased namespace detail panel width to 1000px for better readability - Increased namespace detail panel width to 1000px for better readability
## [0.2.3] - 2025-12-XX ## [0.2.3] - 2025-12-XX
### Added ### Added
- Full URL support for custom Polaris dashboards - Full URL support for custom Polaris dashboards
- Support for external Polaris instances (not just service proxy) - Support for external Polaris instances (not just service proxy)
## [0.2.2] - 2025-12-XX ## [0.2.2] - 2025-12-XX
### Added ### Added
- Configurable Polaris dashboard URL setting - Configurable Polaris dashboard URL setting
- Settings page for plugin configuration - Settings page for plugin configuration
- Refresh interval configuration - Refresh interval configuration
@@ -151,136 +174,161 @@ now frozen — no breaking changes without a new major version.
## [0.2.1] - 2025-12-XX ## [0.2.1] - 2025-12-XX
### Infrastructure ### Infrastructure
- Migrated to GitHub as primary repository - Migrated to GitHub as primary repository
- Fixed v0.2.0 checksum in ArtifactHub metadata - Fixed v0.2.0 checksum in ArtifactHub metadata
## [0.2.0] - 2025-12-XX ## [0.2.0] - 2025-12-XX
### Added ### Added
- Namespace drawer navigation - Namespace drawer navigation
- URL hash-based routing for namespaces - URL hash-based routing for namespaces
- Keyboard shortcuts (Escape to close drawer) - Keyboard shortcuts (Escape to close drawer)
### Infrastructure ### Infrastructure
- GitHub release automation - GitHub release automation
- Improved CI/CD workflow - Improved CI/CD workflow
## [0.1.7] - 2025-11-XX ## [0.1.7] - 2025-11-XX
### Documentation ### Documentation
- Removed incorrect development installation instructions - Removed incorrect development installation instructions
## [0.1.6] - 2025-11-XX ## [0.1.6] - 2025-11-XX
### Fixed ### Fixed
- Plugin settings display name changed to "Polaris" - Plugin settings display name changed to "Polaris"
### Documentation ### Documentation
- Added tooltip to skipped count explaining limitation - Added tooltip to skipped count explaining limitation
- Documented skipped count limitation in README - Documented skipped count limitation in README
## [0.1.5] - 2025-11-XX ## [0.1.5] - 2025-11-XX
### Fixed ### Fixed
- Restored `:80` port in service proxy URL for correct dashboard access - Restored `:80` port in service proxy URL for correct dashboard access
## [0.1.4] - 2025-11-XX ## [0.1.4] - 2025-11-XX
### Added ### Added
- Playwright E2E smoke tests - Playwright E2E smoke tests
- Test coverage for sidebar, overview, namespaces, and detail views - Test coverage for sidebar, overview, namespaces, and detail views
### Fixed ### Fixed
- Empty namespace crash (graceful handling) - Empty namespace crash (graceful handling)
- Removed `:80` port suffix from service proxy URL for RBAC compatibility - Removed `:80` port suffix from service proxy URL for RBAC compatibility
## [0.1.3] - 2025-11-XX ## [0.1.3] - 2025-11-XX
### Fixed ### Fixed
- Service proxy URL format for consistent RBAC requirements - Service proxy URL format for consistent RBAC requirements
## [0.1.2] - 2025-11-XX ## [0.1.2] - 2025-11-XX
### Added ### Added
- Namespace filtering and sorting - Namespace filtering and sorting
- Enhanced resource table in namespace detail view - Enhanced resource table in namespace detail view
## [0.1.1] - 2025-11-XX ## [0.1.1] - 2025-11-XX
### Fixed ### Fixed
- Score calculation for resources with mixed results - Score calculation for resources with mixed results
- Percentage display formatting - Percentage display formatting
## [0.1.0] - 2025-11-XX ## [0.1.0] - 2025-11-XX
### Added ### Added
- Namespace detail view with resource-level audit results - Namespace detail view with resource-level audit results
- Drill-down navigation from namespace list - Drill-down navigation from namespace list
### Changed ### Changed
- Improved data fetching with error handling - Improved data fetching with error handling
- Better loading states - Better loading states
## [0.0.10] - 2025-11-XX ## [0.0.10] - 2025-11-XX
### Fixed ### Fixed
- **RBAC Documentation:** Corrected to use `services/proxy` permission instead of ConfigMap access - **RBAC Documentation:** Corrected to use `services/proxy` permission instead of ConfigMap access
### Documentation ### Documentation
- Updated README with accurate RBAC requirements - Updated README with accurate RBAC requirements
- Added minimal Role example - Added minimal Role example
## [0.0.9] - 2025-11-XX ## [0.0.9] - 2025-11-XX
### Added ### Added
- Refresh button for manual data reload - Refresh button for manual data reload
- Last updated timestamp display - Last updated timestamp display
## [0.0.8] - 2025-11-XX ## [0.0.8] - 2025-11-XX
### Added ### Added
- Skipped checks display in check summary - Skipped checks display in check summary
- Improved check categorization (pass/warning/danger/skipped) - Improved check categorization (pass/warning/danger/skipped)
## [0.0.7] - 2025-11-XX ## [0.0.7] - 2025-11-XX
### Changed ### Changed
- Enhanced overview dashboard layout - Enhanced overview dashboard layout
- Better visual hierarchy for cluster score - Better visual hierarchy for cluster score
## [0.0.6] - 2025-11-XX ## [0.0.6] - 2025-11-XX
### Added ### Added
- Namespace list view with per-namespace scores - Namespace list view with per-namespace scores
- Navigation between overview and namespace views - Navigation between overview and namespace views
## [0.0.5] - 2025-11-XX ## [0.0.5] - 2025-11-XX
### Fixed ### Fixed
- Data fetching error handling - Data fetching error handling
- API proxy path configuration - API proxy path configuration
## [0.0.4] - 2025-11-XX ## [0.0.4] - 2025-11-XX
### Added ### Added
- Check distribution visualization - Check distribution visualization
- Pass/Warning/Danger count display - Pass/Warning/Danger count display
## [0.0.3] - 2025-11-XX ## [0.0.3] - 2025-11-XX
### Changed ### Changed
- Improved cluster score calculation - Improved cluster score calculation
- Better result aggregation logic - Better result aggregation logic
## [0.0.2] - 2025-11-XX ## [0.0.2] - 2025-11-XX
### Added ### Added
- Cluster score display - Cluster score display
- Basic check summary table - Basic check summary table
## [0.0.1] - 2025-10-XX ## [0.0.1] - 2025-10-XX
### Added ### Added
- Initial release - Initial release
- Basic Polaris plugin structure - Basic Polaris plugin structure
- Sidebar entry "Polaris" - Sidebar entry "Polaris"
@@ -290,6 +338,7 @@ now frozen — no breaking changes without a new major version.
- React components using Headlamp CommonComponents - React components using Headlamp CommonComponents
### Infrastructure ### Infrastructure
- GitHub repository setup - GitHub repository setup
- ArtifactHub package registration - ArtifactHub package registration
- Automated release workflow - Automated release workflow
+3 -2
View File
@@ -33,7 +33,7 @@ All tests and `tsc` must pass before committing.
## Architecture ## Architecture
``` ```text
src/ src/
├── index.tsx # Plugin entry: registerRoute, registerSidebarEntry, registerDetailsViewSection, registerAppBarAction, registerPluginSettings; PolarisErrorBoundary ├── index.tsx # Plugin entry: registerRoute, registerSidebarEntry, registerDetailsViewSection, registerAppBarAction, registerPluginSettings; PolarisErrorBoundary
├── test-utils.tsx # Shared test fixtures (makeResult, makeAuditData) ├── test-utils.tsx # Shared test fixtures (makeResult, makeAuditData)
@@ -73,9 +73,10 @@ Data is fetched via `ApiProxy.request` to the Polaris dashboard service proxy an
## Testing ## Testing
Mock pattern for headlamp APIs: Mock pattern for headlamp APIs:
```typescript ```typescript
vi.mock('@kinvolk/headlamp-plugin/lib', () => ({ vi.mock('@kinvolk/headlamp-plugin/lib', () => ({
ApiProxy: { request: vi.fn().mockResolvedValue({}) }, ApiProxy: { request: vi.fn().mockResolvedValue({}) },
K8s: { ResourceClasses: {} }, K8s: { ResourceClasses: {} },
})); }));
``` ```
+16
View File
@@ -83,6 +83,7 @@ import { Box, Chip } from '@mui/material';
### Headlamp Component Issues ### Headlamp Component Issues
1. **StatusLabel with empty status** 1. **StatusLabel with empty status**
```typescript ```typescript
// ❌ Renders near-invisible (muted background) // ❌ Renders near-invisible (muted background)
<StatusLabel status="">{value}</StatusLabel> <StatusLabel status="">{value}</StatusLabel>
@@ -92,6 +93,7 @@ import { Box, Chip } from '@mui/material';
``` ```
2. **Link component crashes on plugin routes** 2. **Link component crashes on plugin routes**
```typescript ```typescript
// ❌ Headlamp Link crashes on plugin-registered routes // ❌ Headlamp Link crashes on plugin-registered routes
import { Link } from '@kinvolk/headlamp-plugin/lib/CommonComponents'; import { Link } from '@kinvolk/headlamp-plugin/lib/CommonComponents';
@@ -210,6 +212,7 @@ npm run format:check
### Commit Convention ### Commit Convention
Use Conventional Commits: Use Conventional Commits:
- `feat:` - New feature - `feat:` - New feature
- `fix:` - Bug fix - `fix:` - Bug fix
- `docs:` - Documentation only - `docs:` - Documentation only
@@ -220,6 +223,7 @@ Use Conventional Commits:
### PR Process ### PR Process
All PRs must pass: All PRs must pass:
1. Build (`npm run build`) 1. Build (`npm run build`)
2. Lint (`npm run lint`) 2. Lint (`npm run lint`)
3. Type-check (`npm run tsc`) 3. Type-check (`npm run tsc`)
@@ -276,6 +280,7 @@ npm run e2e
### CI Workflow (`.github/workflows/ci.yaml`) ### CI Workflow (`.github/workflows/ci.yaml`)
Runs on push to main and all PRs: Runs on push to main and all PRs:
1. Checkout 1. Checkout
2. `npm ci` 2. `npm ci`
3. `npm run build` 3. `npm run build`
@@ -289,6 +294,7 @@ Runner: `local-ubuntu-latest`
### E2E Workflow (`.github/workflows/e2e.yaml`) ### E2E Workflow (`.github/workflows/e2e.yaml`)
Runs on push, PR, and manual trigger: Runs on push, PR, and manual trigger:
1. Checkout 1. Checkout
2. `npm ci` 2. `npm ci`
3. `npm run e2e` 3. `npm run e2e`
@@ -306,6 +312,7 @@ gh workflow run release.yaml -f version=0.4.2
``` ```
Steps: Steps:
1. Validate version format (semver) 1. Validate version format (semver)
2. Bump `package.json` + `artifacthub-pkg.yml` 2. Bump `package.json` + `artifacthub-pkg.yml`
3. Build plugin 3. Build plugin
@@ -323,6 +330,7 @@ Steps:
### Version Bump Requirements ### Version Bump Requirements
**ALWAYS bump both files in the same commit**: **ALWAYS bump both files in the same commit**:
- `package.json` - `version` field - `package.json` - `version` field
- `artifacthub-pkg.yml` - `version` field + `digest` (checksum) + `archive.url` - `artifacthub-pkg.yml` - `version` field + `digest` (checksum) + `archive.url`
@@ -331,12 +339,14 @@ Steps:
### ⚠️ Headlamp v0.39.0 Known Issues ### ⚠️ Headlamp v0.39.0 Known Issues
**AutoSizer JavaScript Error** **AutoSizer JavaScript Error**
- **Symptom**: Console shows `TypeError: undefined is not an object (evaluating 'io.AutoSizer')` - **Symptom**: Console shows `TypeError: undefined is not an object (evaluating 'io.AutoSizer')`
- **Impact**: Cosmetic error in Settings page, doesn't break functionality - **Impact**: Cosmetic error in Settings page, doesn't break functionality
- **Root Cause**: Headlamp core bug, not plugin-related - **Root Cause**: Headlamp core bug, not plugin-related
- **Workaround**: None needed, can be ignored - **Workaround**: None needed, can be ignored
**Plugin Loading (RESOLVED)** **Plugin Loading (RESOLVED)**
- **Old Issue**: Previously thought `config.watchPlugins: false` was required - **Old Issue**: Previously thought `config.watchPlugins: false` was required
- **Resolution**: Plugins load correctly with default `watchPlugins: true` - **Resolution**: Plugins load correctly with default `watchPlugins: true`
- **Note**: If you see old docs mentioning `watchPlugins: false`, ignore them - **Note**: If you see old docs mentioning `watchPlugins: false`, ignore them
@@ -344,28 +354,34 @@ Steps:
### Polaris Dashboard Behavior ### Polaris Dashboard Behavior
**Stale Audit Data** **Stale Audit Data**
- **Symptom**: Plugin shows old audit timestamp - **Symptom**: Plugin shows old audit timestamp
- **Root Cause**: Polaris dashboard runs audit once at pod startup, then caches results - **Root Cause**: Polaris dashboard runs audit once at pod startup, then caches results
- **Does NOT**: Continuously re-audit in real-time - **Does NOT**: Continuously re-audit in real-time
- **Workaround**: Restart Polaris pods for fresh data - **Workaround**: Restart Polaris pods for fresh data
```bash ```bash
kubectl rollout restart deployment -n polaris polaris-dashboard kubectl rollout restart deployment -n polaris polaris-dashboard
``` ```
- **Load Balancing**: Service balances across multiple pods - each may have different audit timestamps - **Load Balancing**: Service balances across multiple pods - each may have different audit timestamps
- **Plugin Auto-Refresh**: Works correctly - just fetches whatever Polaris currently has cached - **Plugin Auto-Refresh**: Works correctly - just fetches whatever Polaris currently has cached
### Skipped Count Limitation ### Skipped Count Limitation
**What It Shows**: **What It Shows**:
- Only checks with `Severity: "ignore"` in Polaris API response - Only checks with `Severity: "ignore"` in Polaris API response
- Does NOT include annotation-based exemptions (`polaris.fairwinds.com/*-exempt`) - Does NOT include annotation-based exemptions (`polaris.fairwinds.com/*-exempt`)
**Why**: **Why**:
- Polaris omits exempted checks from `results.json` - Polaris omits exempted checks from `results.json`
- Plugin has no access to raw K8s resources to compute exemptions - Plugin has no access to raw K8s resources to compute exemptions
- By design: service proxy limitation - By design: service proxy limitation
**Workaround**: **Workaround**:
- Link to native Polaris dashboard for full exemption count - Link to native Polaris dashboard for full exemption count
- UI tooltip explains this limitation - UI tooltip explains this limitation
+26
View File
@@ -18,6 +18,7 @@ Thank you for your interest in contributing to the Headlamp Polaris Plugin! This
## Code of Conduct ## Code of Conduct
This project follows a standard code of conduct: This project follows a standard code of conduct:
- Be respectful and inclusive - Be respectful and inclusive
- Welcome newcomers and help them get started - Welcome newcomers and help them get started
- Focus on constructive feedback - Focus on constructive feedback
@@ -35,23 +36,27 @@ This project follows a standard code of conduct:
### Development Setup ### Development Setup
1. **Fork and clone the repository:** 1. **Fork and clone the repository:**
```bash ```bash
git clone https://github.com/YOUR_USERNAME/headlamp-polaris-plugin.git git clone https://github.com/YOUR_USERNAME/headlamp-polaris-plugin.git
cd headlamp-polaris-plugin cd headlamp-polaris-plugin
``` ```
2. **Install dependencies:** 2. **Install dependencies:**
```bash ```bash
npm install npm install
``` ```
3. **Start development mode:** 3. **Start development mode:**
```bash ```bash
npm start npm start
# Plugin will be available at http://localhost:4466 # Plugin will be available at http://localhost:4466
``` ```
4. **Run tests:** 4. **Run tests:**
```bash ```bash
# Unit tests # Unit tests
npm test npm test
@@ -61,6 +66,7 @@ This project follows a standard code of conduct:
``` ```
5. **Build the plugin:** 5. **Build the plugin:**
```bash ```bash
npm run build npm run build
``` ```
@@ -79,18 +85,21 @@ This project follows a standard code of conduct:
### Local Testing ### Local Testing
**Option 1: Development Mode** **Option 1: Development Mode**
```bash ```bash
npm start npm start
# Opens Headlamp at http://localhost:4466 with hot reload # Opens Headlamp at http://localhost:4466 with hot reload
``` ```
**Option 2: Production Build** **Option 2: Production Build**
```bash ```bash
npm run build npm run build
# Plugin bundle created in dist/ # Plugin bundle created in dist/
``` ```
**Option 3: E2E Testing** **Option 3: E2E Testing**
```bash ```bash
# Set up environment (see e2e/README.md) # Set up environment (see e2e/README.md)
export HEADLAMP_TOKEN=$(kubectl create token headlamp -n kube-system --duration=24h) export HEADLAMP_TOKEN=$(kubectl create token headlamp -n kube-system --duration=24h)
@@ -116,6 +125,7 @@ npm run e2e
- Chores: `chore/description` - Chores: `chore/description`
**Examples:** **Examples:**
```bash ```bash
feat/add-exemption-support feat/add-exemption-support
fix/dark-mode-theme-colors fix/dark-mode-theme-colors
@@ -127,16 +137,19 @@ chore/upgrade-dependencies
### Branching Rules ### Branching Rules
**✅ ALWAYS use feature branches for:** **✅ ALWAYS use feature branches for:**
- Code changes (new features, bug fixes, refactors) - Code changes (new features, bug fixes, refactors)
- Test updates - Test updates
- CI/CD workflow changes - CI/CD workflow changes
- Package updates - Package updates
**✅ MAY push directly to main for:** **✅ MAY push directly to main for:**
- Documentation-only changes (README.md, CLAUDE.md, comments) - Documentation-only changes (README.md, CLAUDE.md, comments)
- Version bump commits (`package.json` + `artifacthub-pkg.yml`) - Version bump commits (`package.json` + `artifacthub-pkg.yml`)
**❌ NEVER push directly to main for:** **❌ NEVER push directly to main for:**
- Any code changes to `src/` - Any code changes to `src/`
- Test file changes - Test file changes
- Workflow changes - Workflow changes
@@ -206,6 +219,7 @@ Co-Authored-By: Happy <yesreply@happy.engineering>
### Before Creating a PR ### Before Creating a PR
1. **Run all checks locally:** 1. **Run all checks locally:**
```bash ```bash
npm run build # Verify build succeeds npm run build # Verify build succeeds
npm run lint # Check for linting errors npm run lint # Check for linting errors
@@ -227,6 +241,7 @@ Co-Authored-By: Happy <yesreply@happy.engineering>
### Creating a PR ### Creating a PR
1. **Push your branch:** 1. **Push your branch:**
```bash ```bash
git push origin feat/your-feature git push origin feat/your-feature
``` ```
@@ -237,6 +252,7 @@ Co-Authored-By: Happy <yesreply@happy.engineering>
- Link related issues with `Fixes #123` or `Closes #456` - Link related issues with `Fixes #123` or `Closes #456`
3. **PR Title Format:** 3. **PR Title Format:**
``` ```
feat: add exemption management UI feat: add exemption management UI
fix: correct score calculation for skipped checks fix: correct score calculation for skipped checks
@@ -299,12 +315,14 @@ npm run format:check
### Import Organization ### Import Organization
Imports are automatically sorted by eslint. Order: Imports are automatically sorted by eslint. Order:
1. React imports 1. React imports
2. Third-party libraries 2. Third-party libraries
3. Headlamp plugin imports 3. Headlamp plugin imports
4. Local imports (components, API, types) 4. Local imports (components, API, types)
Example: Example:
```typescript ```typescript
import React from 'react'; import React from 'react';
import { SectionBox, StatusLabel } from '@kinvolk/headlamp-plugin/lib/CommonComponents'; import { SectionBox, StatusLabel } from '@kinvolk/headlamp-plugin/lib/CommonComponents';
@@ -330,6 +348,7 @@ import { computeScore } from '../api/polaris';
- Use descriptive test names - Use descriptive test names
Example: Example:
```typescript ```typescript
describe('countResults', () => { describe('countResults', () => {
it('counts passing, warning, and danger results correctly', () => { it('counts passing, warning, and danger results correctly', () => {
@@ -371,14 +390,17 @@ npm run e2e:headed
When making changes, update relevant documentation: When making changes, update relevant documentation:
#### Code Changes #### Code Changes
- **README.md:** User-facing features, installation, configuration - **README.md:** User-facing features, installation, configuration
- **CLAUDE.md:** Architecture, constraints, MCP integrations - **CLAUDE.md:** Architecture, constraints, MCP integrations
- **JSDoc:** All public APIs, components, hooks - **JSDoc:** All public APIs, components, hooks
#### Test Changes #### Test Changes
- **e2e/README.md:** New test scenarios or setup changes - **e2e/README.md:** New test scenarios or setup changes
#### Build/CI Changes #### Build/CI Changes
- **README.md:** Build commands, release process - **README.md:** Build commands, release process
- **.github/workflows/*.yaml:** Workflow comments - **.github/workflows/*.yaml:** Workflow comments
@@ -405,6 +427,7 @@ export function countResults(data: AuditData): ResultCounts {
### Version Numbering ### Version Numbering
We follow [Semantic Versioning](https://semver.org/): We follow [Semantic Versioning](https://semver.org/):
- **Major (1.0.0):** Breaking changes - **Major (1.0.0):** Breaking changes
- **Minor (0.1.0):** New features, backward compatible - **Minor (0.1.0):** New features, backward compatible
- **Patch (0.0.1):** Bug fixes, backward compatible - **Patch (0.0.1):** Bug fixes, backward compatible
@@ -416,6 +439,7 @@ We follow [Semantic Versioning](https://semver.org/):
1. **Merge feature PRs to main** 1. **Merge feature PRs to main**
2. **Bump version:** 2. **Bump version:**
```bash ```bash
# Edit package.json and artifacthub-pkg.yml # Edit package.json and artifacthub-pkg.yml
# Update version and archive-url # Update version and archive-url
@@ -425,6 +449,7 @@ We follow [Semantic Versioning](https://semver.org/):
``` ```
3. **Create and push tag:** 3. **Create and push tag:**
```bash ```bash
git tag vX.Y.Z git tag vX.Y.Z
git push origin vX.Y.Z git push origin vX.Y.Z
@@ -441,6 +466,7 @@ We follow [Semantic Versioning](https://semver.org/):
### Pre-release Versions ### Pre-release Versions
For testing before stable release: For testing before stable release:
- Use `-dev.N` suffix: `v0.3.5-dev.1` - Use `-dev.N` suffix: `v0.3.5-dev.1`
- Follow same process as stable releases - Follow same process as stable releases
- Mark as "pre-release" on GitHub - Mark as "pre-release" on GitHub
+48 -5
View File
@@ -13,10 +13,12 @@ This assessment identifies critical issues and improvement opportunities for the
## 🔴 Critical Issues (Must Fix Immediately) ## 🔴 Critical Issues (Must Fix Immediately)
### 1. TypeScript Compilation Errors ### 1. TypeScript Compilation Errors
**Severity:** CRITICAL **Severity:** CRITICAL
**Impact:** Build failures, type safety compromised **Impact:** Build failures, type safety compromised
**Issues:** **Issues:**
- `src/index.tsx:72` - `registerDetailsViewSection` expects 1 argument, got 2 - `src/index.tsx:72` - `registerDetailsViewSection` expects 1 argument, got 2
- `src/index.tsx:87` - `registerAppBarAction` expects 1 argument, got 2 - `src/index.tsx:87` - `registerAppBarAction` expects 1 argument, got 2
@@ -24,6 +26,7 @@ This assessment identifies critical issues and improvement opportunities for the
Update Headlamp plugin API calls to match the current version. Check @kinvolk/headlamp-plugin version compatibility. Update Headlamp plugin API calls to match the current version. Check @kinvolk/headlamp-plugin version compatibility.
**Action Items:** **Action Items:**
- [ ] Review Headlamp plugin API documentation - [ ] Review Headlamp plugin API documentation
- [ ] Update `registerDetailsViewSection` and `registerAppBarAction` calls - [ ] Update `registerDetailsViewSection` and `registerAppBarAction` calls
- [ ] Run `npm run tsc` to verify fixes - [ ] Run `npm run tsc` to verify fixes
@@ -32,6 +35,7 @@ Update Headlamp plugin API calls to match the current version. Check @kinvolk/he
--- ---
### 2. Production Plugin Loading Failure ### 2. Production Plugin Loading Failure
**Severity:** CRITICAL **Severity:** CRITICAL
**Impact:** Plugin is completely non-functional in production **Impact:** Plugin is completely non-functional in production
@@ -39,11 +43,13 @@ Update Headlamp plugin API calls to match the current version. Check @kinvolk/he
Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugins as "development directory" plugins, preventing frontend JavaScript execution. Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugins as "development directory" plugins, preventing frontend JavaScript execution.
**Current Status:** **Current Status:**
- Deployment patched to install plugins to `/headlamp/static-plugins` - Deployment patched to install plugins to `/headlamp/static-plugins`
- `watchPlugins: false` configured - `watchPlugins: false` configured
- Waiting for user to test if plugins now load - Waiting for user to test if plugins now load
**Action Items:** **Action Items:**
- [ ] Confirm plugins load after recent deployment changes - [ ] Confirm plugins load after recent deployment changes
- [ ] Document the fix in deployment guide - [ ] Document the fix in deployment guide
- [ ] Update MEMORY.md with final resolution - [ ] Update MEMORY.md with final resolution
@@ -52,15 +58,18 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
--- ---
### 3. Test Failures ### 3. Test Failures
**Severity:** HIGH **Severity:** HIGH
**Impact:** CI failures, reduced confidence in changes **Impact:** CI failures, reduced confidence in changes
**Current Status:** **Current Status:**
- 1 test file failing (DashboardView) - 1 test file failing (DashboardView)
- 49 tests passing - 49 tests passing
- Error related to `SimpleTable` component mock - Error related to `SimpleTable` component mock
**Action Items:** **Action Items:**
- [ ] Fix DashboardView test mocking - [ ] Fix DashboardView test mocking
- [ ] Ensure all tests pass before merging PRs - [ ] Ensure all tests pass before merging PRs
- [ ] Add test for top issues feature - [ ] Add test for top issues feature
@@ -71,16 +80,19 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
## 🟡 High Priority Improvements ## 🟡 High Priority Improvements
### 4. Type Safety Enhancements ### 4. Type Safety Enhancements
**Severity:** HIGH **Severity:** HIGH
**Impact:** Better developer experience, catch errors earlier **Impact:** Better developer experience, catch errors earlier
**Recommendations:** **Recommendations:**
- Enable stricter TypeScript checks in `tsconfig.json` - Enable stricter TypeScript checks in `tsconfig.json`
- Add type definitions for all Headlamp plugin APIs - Add type definitions for all Headlamp plugin APIs
- Ensure no `any` types in production code - Ensure no `any` types in production code
- Add JSDoc comments for complex types - Add JSDoc comments for complex types
**Action Items:** **Action Items:**
- [ ] Audit codebase for `any` types - [ ] Audit codebase for `any` types
- [ ] Enable `noImplicitAny` and `strictNullChecks` - [ ] Enable `noImplicitAny` and `strictNullChecks`
- [ ] Add type guards for API responses - [ ] Add type guards for API responses
@@ -89,21 +101,25 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
--- ---
### 5. Security Hardening ### 5. Security Hardening
**Severity:** HIGH **Severity:** HIGH
**Impact:** Prevent vulnerabilities, protect user data **Impact:** Prevent vulnerabilities, protect user data
**Current Risks:** **Current Risks:**
- Direct Kubernetes API access via service proxy - Direct Kubernetes API access via service proxy
- User input in exemption annotations (potential injection) - User input in exemption annotations (potential injection)
- External URL configuration for Polaris dashboard - External URL configuration for Polaris dashboard
**Recommendations:** **Recommendations:**
- Validate and sanitize all user inputs - Validate and sanitize all user inputs
- Implement input validation for dashboard URL - Implement input validation for dashboard URL
- Add CSRF protection for exemption management - Add CSRF protection for exemption management
- Audit dependencies for known vulnerabilities - Audit dependencies for known vulnerabilities
**Action Items:** **Action Items:**
- [ ] Add input validation utilities - [ ] Add input validation utilities
- [ ] Sanitize exemption annotation values - [ ] Sanitize exemption annotation values
- [ ] Validate URL format for dashboard configuration - [ ] Validate URL format for dashboard configuration
@@ -113,21 +129,25 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
--- ---
### 6. Error Handling & User Experience ### 6. Error Handling & User Experience
**Severity:** MEDIUM **Severity:** MEDIUM
**Impact:** Better error messages, improved debugging **Impact:** Better error messages, improved debugging
**Current Gaps:** **Current Gaps:**
- Generic error messages don't help users troubleshoot - Generic error messages don't help users troubleshoot
- No retry logic for transient API failures - No retry logic for transient API failures
- Missing loading states in some components - Missing loading states in some components
**Recommendations:** **Recommendations:**
- Provide specific, actionable error messages - Provide specific, actionable error messages
- Implement retry logic with exponential backoff - Implement retry logic with exponential backoff
- Add loading skeletons for all async operations - Add loading skeletons for all async operations
- Show connection test results with specific failure reasons - Show connection test results with specific failure reasons
**Action Items:** **Action Items:**
- [ ] Create error message constants with solutions - [ ] Create error message constants with solutions
- [ ] Add retry logic to API calls - [ ] Add retry logic to API calls
- [ ] Implement loading skeletons - [ ] Implement loading skeletons
@@ -138,21 +158,25 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
## 🟢 Medium Priority Enhancements ## 🟢 Medium Priority Enhancements
### 7. Testing Coverage ### 7. Testing Coverage
**Severity:** MEDIUM **Severity:** MEDIUM
**Impact:** Confidence in changes, regression prevention **Impact:** Confidence in changes, regression prevention
**Current Coverage:** **Current Coverage:**
- Unit tests: Good coverage for API utilities - Unit tests: Good coverage for API utilities
- Component tests: Some coverage, gaps exist - Component tests: Some coverage, gaps exist
- E2E tests: Minimal (Playwright configured but underutilized) - E2E tests: Minimal (Playwright configured but underutilized)
**Recommendations:** **Recommendations:**
- Add E2E tests for critical user flows - Add E2E tests for critical user flows
- Test error scenarios and edge cases - Test error scenarios and edge cases
- Add visual regression tests - Add visual regression tests
- Test RBAC permission denied scenarios - Test RBAC permission denied scenarios
**Action Items:** **Action Items:**
- [ ] Write E2E test for complete audit workflow - [ ] Write E2E test for complete audit workflow
- [ ] Add tests for error states - [ ] Add tests for error states
- [ ] Test exemption management flow - [ ] Test exemption management flow
@@ -161,16 +185,19 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
--- ---
### 8. Performance Optimization ### 8. Performance Optimization
**Severity:** MEDIUM **Severity:** MEDIUM
**Impact:** Faster load times, better UX **Impact:** Faster load times, better UX
**Opportunities:** **Opportunities:**
- Memoize expensive calculations (score computation) - Memoize expensive calculations (score computation)
- Lazy load namespace detail views - Lazy load namespace detail views
- Debounce search/filter operations - Debounce search/filter operations
- Cache Polaris data with stale-while-revalidate - Cache Polaris data with stale-while-revalidate
**Action Items:** **Action Items:**
- [ ] Add React.memo to pure components - [ ] Add React.memo to pure components
- [ ] Memoize score calculations - [ ] Memoize score calculations
- [ ] Implement data caching strategy - [ ] Implement data caching strategy
@@ -179,16 +206,19 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
--- ---
### 9. Code Quality & Maintainability ### 9. Code Quality & Maintainability
**Severity:** MEDIUM **Severity:** MEDIUM
**Impact:** Easier maintenance, onboarding **Impact:** Easier maintenance, onboarding
**Recommendations:** **Recommendations:**
- Extract magic strings to constants - Extract magic strings to constants
- Reduce component complexity - Reduce component complexity
- Add JSDoc comments for public APIs - Add JSDoc comments for public APIs
- Improve code organization - Improve code organization
**Action Items:** **Action Items:**
- [ ] Create constants file for check IDs - [ ] Create constants file for check IDs
- [ ] Split large components (DashboardView, NamespaceDetailView) - [ ] Split large components (DashboardView, NamespaceDetailView)
- [ ] Add comments for complex logic - [ ] Add comments for complex logic
@@ -199,16 +229,19 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
## 🔵 Low Priority / Future Enhancements ## 🔵 Low Priority / Future Enhancements
### 10. Documentation ### 10. Documentation
**Severity:** LOW **Severity:** LOW
**Impact:** Better onboarding, user adoption **Impact:** Better onboarding, user adoption
**Gaps:** **Gaps:**
- No architecture documentation - No architecture documentation
- Limited inline code comments - Limited inline code comments
- Missing troubleshooting guide - Missing troubleshooting guide
- No contributor guidelines - No contributor guidelines
**Action Items:** **Action Items:**
- [ ] Create architecture diagram - [ ] Create architecture diagram
- [ ] Document component hierarchy - [ ] Document component hierarchy
- [ ] Add troubleshooting section to README - [ ] Add troubleshooting section to README
@@ -217,16 +250,19 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
--- ---
### 11. CI/CD Pipeline Optimization ### 11. CI/CD Pipeline Optimization
**Severity:** LOW **Severity:** LOW
**Impact:** Faster feedback, automated releases **Impact:** Faster feedback, automated releases
**Opportunities:** **Opportunities:**
- Run tests in parallel - Run tests in parallel
- Cache npm dependencies - Cache npm dependencies
- Add automated security scanning - Add automated security scanning
- Implement semantic versioning - Implement semantic versioning
**Action Items:** **Action Items:**
- [ ] Parallelize test execution - [ ] Parallelize test execution
- [ ] Add npm cache to GitHub Actions - [ ] Add npm cache to GitHub Actions
- [ ] Integrate Dependabot - [ ] Integrate Dependabot
@@ -237,41 +273,48 @@ Headlamp v0.39.0 with default `watchPlugins: true` treats catalog-managed plugin
## Summary & Prioritization ## Summary & Prioritization
### Week 1 (Immediate) ### Week 1 (Immediate)
1. ✅ Fix TypeScript compilation errors 1. ✅ Fix TypeScript compilation errors
2. ✅ Resolve production plugin loading issue 2. ✅ Resolve production plugin loading issue
3. ✅ Fix failing DashboardView test 3. ✅ Fix failing DashboardView test
### Week 2 (High Priority) ### Week 2 (High Priority)
4. Enhance type safety (strict mode) 4. Enhance type safety (strict mode)
5. Implement security hardening 2. Implement security hardening
6. Improve error handling and UX 3. Improve error handling and UX
### Week 3-4 (Medium Priority) ### Week 3-4 (Medium Priority)
7. Increase test coverage to >80% 7. Increase test coverage to >80%
8. Optimize performance (memoization, caching) 2. Optimize performance (memoization, caching)
9. Refactor for maintainability 3. Refactor for maintainability
### Ongoing (Low Priority) ### Ongoing (Low Priority)
10. Documentation improvements 10. Documentation improvements
11. CI/CD optimizations 2. CI/CD optimizations
--- ---
## Success Metrics ## Success Metrics
**Code Quality:** **Code Quality:**
- ✅ Zero TypeScript errors - ✅ Zero TypeScript errors
- ✅ All tests passing - ✅ All tests passing
- 🎯 Test coverage >80% - 🎯 Test coverage >80%
- 🎯 No high/critical security vulnerabilities - 🎯 No high/critical security vulnerabilities
**Production Readiness:** **Production Readiness:**
- ✅ Plugin loads successfully in Headlamp - ✅ Plugin loads successfully in Headlamp
- ✅ All features functional - ✅ All features functional
- 🎯 Error rate <1% - 🎯 Error rate <1%
- 🎯 Average response time <500ms - 🎯 Average response time <500ms
**Developer Experience:** **Developer Experience:**
- ✅ Clear documentation - ✅ Clear documentation
- ✅ Easy local setup - ✅ Easy local setup
- 🎯 Fast CI/CD (<5 min) - 🎯 Fast CI/CD (<5 min)
+2 -2
View File
@@ -206,7 +206,7 @@ For complete testing guide including CI/CD integration, see **[docs/TESTING.md](
## Project Structure ## Project Structure
``` ```text
src/ src/
index.tsx -- Entry point. Registers sidebar entries, routes, and error boundaries. index.tsx -- Entry point. Registers sidebar entries, routes, and error boundaries.
test-utils.tsx -- Shared test fixtures (makeResult, makeAuditData). test-utils.tsx -- Shared test fixtures (makeResult, makeAuditData).
@@ -236,7 +236,7 @@ GET /api/v1/namespaces/polaris/services/polaris-dashboard/proxy/results.json
This endpoint is served by the `polaris-dashboard` ClusterIP service, which is created by the Polaris Helm chart when `dashboard.enabled: true`. The JSON response matches Polaris's `AuditData` schema (`pkg/validator/output.go`): This endpoint is served by the `polaris-dashboard` ClusterIP service, which is created by the Polaris Helm chart when `dashboard.enabled: true`. The JSON response matches Polaris's `AuditData` schema (`pkg/validator/output.go`):
``` ```text
AuditData AuditData
ClusterInfo -- nodes, pods, namespaces, controllers ClusterInfo -- nodes, pods, namespaces, controllers
Results[] -- per-workload results Results[] -- per-workload results
+10 -1
View File
@@ -17,7 +17,7 @@ The plugin performs **only read operations** via the Kubernetes API server's ser
### Data Flow ### Data Flow
``` ```text
User Browser User Browser
↓ (HTTPS) ↓ (HTTPS)
Headlamp Pod Headlamp Pod
@@ -152,6 +152,7 @@ spec:
Headlamp runs with a dedicated service account (`headlamp` in `kube-system`). All users share the same permissions defined by this service account's RBAC bindings. Headlamp runs with a dedicated service account (`headlamp` in `kube-system`). All users share the same permissions defined by this service account's RBAC bindings.
**Security Considerations:** **Security Considerations:**
- All users have identical access to the plugin - All users have identical access to the plugin
- Suitable for trusted internal environments - Suitable for trusted internal environments
- Simpler RBAC management - Simpler RBAC management
@@ -161,6 +162,7 @@ Headlamp runs with a dedicated service account (`headlamp` in `kube-system`). Al
Headlamp can be configured for OIDC authentication, where each user provides their own bearer token. RBAC is enforced per-user. Headlamp can be configured for OIDC authentication, where each user provides their own bearer token. RBAC is enforced per-user.
**Security Considerations:** **Security Considerations:**
- Fine-grained access control per user - Fine-grained access control per user
- Users without the `polaris-proxy-reader` role will see 403 errors - Users without the `polaris-proxy-reader` role will see 403 errors
- Requires OIDC provider integration - Requires OIDC provider integration
@@ -198,10 +200,12 @@ If you discover a security vulnerability in this plugin, please report it via:
2. **Email**: Create a GitHub issue and mark it as "security" if advisories are not available 2. **Email**: Create a GitHub issue and mark it as "security" if advisories are not available
**Please do not:** **Please do not:**
- Open public GitHub issues for security vulnerabilities - Open public GitHub issues for security vulnerabilities
- Disclose vulnerabilities publicly before a fix is available - Disclose vulnerabilities publicly before a fix is available
**Response Timeline:** **Response Timeline:**
- **Acknowledgment**: Within 48 hours - **Acknowledgment**: Within 48 hours
- **Initial Assessment**: Within 1 week - **Initial Assessment**: Within 1 week
- **Fix Timeline**: Depends on severity (critical: 1-2 weeks, high: 2-4 weeks, medium/low: next release cycle) - **Fix Timeline**: Depends on severity (critical: 1-2 weeks, high: 2-4 weeks, medium/low: next release cycle)
@@ -211,6 +215,7 @@ If you discover a security vulnerability in this plugin, please report it via:
### Dependency Scanning ### Dependency Scanning
The project uses: The project uses:
- **npm audit**: Runs automatically during `npm install` - **npm audit**: Runs automatically during `npm install`
- **Dependabot**: GitHub Dependabot monitors dependencies and creates PRs for updates - **Dependabot**: GitHub Dependabot monitors dependencies and creates PRs for updates
- **GitHub Actions**: CI workflow runs `npm audit` on every commit - **GitHub Actions**: CI workflow runs `npm audit` on every commit
@@ -262,6 +267,7 @@ The plugin's security posture depends on your cluster's security:
**Cause**: User or service account lacks `services/proxy` permission on `polaris-dashboard` **Cause**: User or service account lacks `services/proxy` permission on `polaris-dashboard`
**Resolution**: **Resolution**:
1. Verify RoleBinding exists in `polaris` namespace 1. Verify RoleBinding exists in `polaris` namespace
2. Check RoleBinding references correct subject (service account, group, or user) 2. Check RoleBinding references correct subject (service account, group, or user)
3. Confirm Role includes `resourceNames: ["polaris-dashboard"]` 3. Confirm Role includes `resourceNames: ["polaris-dashboard"]`
@@ -273,11 +279,13 @@ The plugin's security posture depends on your cluster's security:
**Question**: Can I expose Polaris dashboard via Ingress instead of using service proxy? **Question**: Can I expose Polaris dashboard via Ingress instead of using service proxy?
**Recommendation**: **Avoid exposing Polaris dashboard externally**. The service proxy approach: **Recommendation**: **Avoid exposing Polaris dashboard externally**. The service proxy approach:
- Enforces Kubernetes RBAC on every request - Enforces Kubernetes RBAC on every request
- Avoids exposing internal services to the internet - Avoids exposing internal services to the internet
- Prevents authentication bypass attacks - Prevents authentication bypass attacks
If you must expose Polaris externally: If you must expose Polaris externally:
- Use OAuth2 proxy or similar authentication layer - Use OAuth2 proxy or similar authentication layer
- Configure NetworkPolicies to restrict access - Configure NetworkPolicies to restrict access
- Enable TLS with valid certificates - Enable TLS with valid certificates
@@ -304,6 +312,7 @@ Users not in `team-a` will receive 403 errors when accessing the plugin, prevent
### Data Residency ### Data Residency
All data remains within your Kubernetes cluster. The plugin does not: All data remains within your Kubernetes cluster. The plugin does not:
- Send data to external services - Send data to external services
- Store data in browser localStorage (except refresh interval preference) - Store data in browser localStorage (except refresh interval preference)
- Use third-party analytics or tracking - Use third-party analytics or tracking
+13 -2
View File
@@ -1,19 +1,24 @@
# Headlamp Plugin Loading Issue - Root Cause and Fix # Headlamp Plugin Loading Issue - Root Cause and Fix
## Problem ## Problem
Headlamp v0.39.0 was not loading plugins installed via the plugin manager. Plugins appeared in Settings → Plugins but: Headlamp v0.39.0 was not loading plugins installed via the plugin manager. Plugins appeared in Settings → Plugins but:
- No sidebar entries appeared - No sidebar entries appeared
- No plugin settings were available - No plugin settings were available
- Plugin JavaScript was not being executed in the browser - Plugin JavaScript was not being executed in the browser
## Root Cause ## Root Cause
When `config.watchPlugins: true` (the default), Headlamp treats catalog-managed plugins in `/headlamp/plugins/` as "development directory" plugins. This causes: When `config.watchPlugins: true` (the default), Headlamp treats catalog-managed plugins in `/headlamp/plugins/` as "development directory" plugins. This causes:
- Backend serves plugin metadata correctly - Backend serves plugin metadata correctly
- Backend logs show "Treating catalog-installed plugin in development directory as user plugin" - Backend logs show "Treating catalog-installed plugin in development directory as user plugin"
- **Frontend does NOT execute the plugin JavaScript** - **Frontend does NOT execute the plugin JavaScript**
- Plugin registrations (`registerSidebarEntry`, `registerRoute`, etc.) never happen - Plugin registrations (`registerSidebarEntry`, `registerRoute`, etc.) never happen
## Solution ## Solution
Set `config.watchPlugins: false` in the Headlamp HelmRelease values: Set `config.watchPlugins: false` in the Headlamp HelmRelease values:
```yaml ```yaml
@@ -31,14 +36,18 @@ spec:
``` ```
## Why This Works ## Why This Works
With `watchPlugins: false`: With `watchPlugins: false`:
- Headlamp no longer treats catalog-managed plugins as "development" plugins - Headlamp no longer treats catalog-managed plugins as "development" plugins
- Frontend properly loads and executes plugin JavaScript on startup - Frontend properly loads and executes plugin JavaScript on startup
- Plugin registrations happen correctly - Plugin registrations happen correctly
- All plugin features (sidebar, routes, settings, etc.) work as expected - All plugin features (sidebar, routes, settings, etc.) work as expected
## Testing ## Testing
After applying this fix: After applying this fix:
1. Verify plugins are installed: `kubectl logs -n kube-system <headlamp-pod> -c headlamp-plugin` 1. Verify plugins are installed: `kubectl logs -n kube-system <headlamp-pod> -c headlamp-plugin`
2. Verify watchPlugins is false: `kubectl logs -n kube-system <headlamp-pod> -c headlamp | grep "Watch Plugins"` 2. Verify watchPlugins is false: `kubectl logs -n kube-system <headlamp-pod> -c headlamp | grep "Watch Plugins"`
3. Hard refresh browser (Cmd+Shift+R / Ctrl+Shift+F5) to clear cached JavaScript 3. Hard refresh browser (Cmd+Shift+R / Ctrl+Shift+F5) to clear cached JavaScript
@@ -46,13 +55,15 @@ After applying this fix:
5. Verify plugin functionality works 5. Verify plugin functionality works
## Additional Notes ## Additional Notes
- This appears to be a bug/limitation in Headlamp v0.39.0 - This appears to be a bug/limitation in Headlamp v0.39.0
- The `watchPlugins` feature is intended for development scenarios where plugins are being actively modified - The `watchPlugins` feature is intended for development scenarios where plugins are being actively modified
- For production deployments with catalog-managed plugins, `watchPlugins: false` is the correct configuration - For production deployments with catalog-managed plugins, `watchPlugins: false` is the correct configuration
- Once plugins are loaded, subsequent restarts or updates work correctly as long as `watchPlugins` remains false - Once plugins are loaded, subsequent restarts or updates work correctly as long as `watchPlugins` remains false
## References ## References
- Headlamp Helm Chart: https://github.com/headlamp-k8s/headlamp/tree/main/charts/headlamp
- Plugin Manager: https://github.com/headlamp-k8s/headlamp/tree/main/plugins/headlamp-plugin - Headlamp Helm Chart: <https://github.com/headlamp-k8s/headlamp/tree/main/charts/headlamp>
- Plugin Manager: <https://github.com/headlamp-k8s/headlamp/tree/main/plugins/headlamp-plugin>
- Issue discovered: 2026-02-11 - Issue discovered: 2026-02-11
- Fix applied: 2026-02-12 - Fix applied: 2026-02-12
+29
View File
@@ -30,6 +30,35 @@ rules:
- apiGroups: [""] - apiGroups: [""]
resources: ["serviceaccounts/token"] resources: ["serviceaccounts/token"]
verbs: ["create"] verbs: ["create"]
# RBAC pre-flight check: verify polaris namespace has proxy-reader Role + RoleBinding
# before running E2E tests. Required by the "RBAC pre-flight check" workflow step.
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["roles", "rolebindings"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: e2e-ci-runner-polaris-reader
namespace: polaris
rules:
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["roles", "rolebindings"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: e2e-ci-runner-polaris-reader-binding
namespace: polaris
subjects:
- kind: ServiceAccount
name: runners-privilegedescalation-gha-rs-no-permission
namespace: arc-runners
roleRef:
kind: Role
name: e2e-ci-runner-polaris-reader
apiGroup: rbac.authorization.k8s.io
--- ---
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding kind: RoleBinding
+1 -1
View File
@@ -129,7 +129,7 @@ docs/
### 3. CHANGELOG.md Standard ### 3. CHANGELOG.md Standard
**Format**: Keep a Changelog (https://keepachangelog.com/) **Format**: Keep a Changelog (<https://keepachangelog.com/>)
**Structure**: **Structure**:
+1
View File
@@ -703,6 +703,7 @@ If none of these solutions work, gather debugging information and open an issue:
``` ```
6. **RBAC Configuration**: 6. **RBAC Configuration**:
```bash ```bash
kubectl get role,rolebinding -n polaris kubectl get role,rolebinding -n polaris
``` ```
+1
View File
@@ -703,6 +703,7 @@ If none of these solutions work, gather debugging information and open an issue:
``` ```
6. **RBAC Configuration**: 6. **RBAC Configuration**:
```bash ```bash
kubectl get role,rolebinding -n polaris kubectl get role,rolebinding -n polaris
``` ```
+1
View File
@@ -286,6 +286,7 @@ localStorage.removeItem('polaris-plugin-dashboard-url');
2. Check for JavaScript errors 2. Check for JavaScript errors
3. Disable privacy mode or try different browser 3. Disable privacy mode or try different browser
4. Check if localStorage is enabled: 4. Check if localStorage is enabled:
```javascript ```javascript
console.log('localStorage available:', typeof localStorage !== 'undefined'); console.log('localStorage available:', typeof localStorage !== 'undefined');
``` ```
+2
View File
@@ -508,9 +508,11 @@ If using a log aggregator (e.g., Elasticsearch), create filters to exclude or do
Expected: `yes` Expected: `yes`
4. **Verify RoleBinding subjects match:** 4. **Verify RoleBinding subjects match:**
```bash ```bash
kubectl -n polaris get rolebinding headlamp-polaris-proxy -o yaml kubectl -n polaris get rolebinding headlamp-polaris-proxy -o yaml
``` ```
Check `subjects[].name` and `subjects[].namespace` match your Headlamp SA or user Check `subjects[].name` and `subjects[].namespace` match your Headlamp SA or user
### "404 Not Found" Error ### "404 Not Found" Error
+7
View File
@@ -115,6 +115,7 @@ These are smoke tests against real cluster data. They verify the plugin loads an
### Cluster Requirements ### Cluster Requirements
1. **Polaris Deployment** 1. **Polaris Deployment**
```bash ```bash
# Verify Polaris is running # Verify Polaris is running
kubectl -n polaris get pods kubectl -n polaris get pods
@@ -122,6 +123,7 @@ These are smoke tests against real cluster data. They verify the plugin loads an
``` ```
2. **Polaris Audit Data** 2. **Polaris Audit Data**
```bash ```bash
# Check if Polaris has generated audit results # Check if Polaris has generated audit results
kubectl get --raw /api/v1/namespaces/polaris/services/polaris-dashboard:80/proxy/results.json | jq '.AuditTime' kubectl get --raw /api/v1/namespaces/polaris/services/polaris-dashboard:80/proxy/results.json | jq '.AuditTime'
@@ -183,21 +185,25 @@ Tests automatically capture screenshots on failure in `test-results/`
### Common Issues ### Common Issues
**Auth fails with "Sign In button not found":** **Auth fails with "Sign In button not found":**
- Check HEADLAMP_URL is correct - Check HEADLAMP_URL is correct
- Verify Headlamp is accessible - Verify Headlamp is accessible
- Ensure OIDC is configured if using Authentik - Ensure OIDC is configured if using Authentik
**Polaris sidebar entry not found:** **Polaris sidebar entry not found:**
- Plugin may not be installed: Check Settings → Plugins in Headlamp - Plugin may not be installed: Check Settings → Plugins in Headlamp
- Plugin may have failed to load: Check browser console - Plugin may have failed to load: Check browser console
- Clear browser cache and hard refresh - Clear browser cache and hard refresh
**Cluster score not displayed:** **Cluster score not displayed:**
- Polaris may not have audit data yet - Polaris may not have audit data yet
- Check Polaris is running: `kubectl -n polaris get pods` - Check Polaris is running: `kubectl -n polaris get pods`
- Verify service proxy: `kubectl get --raw /api/v1/namespaces/polaris/services/polaris-dashboard:80/proxy/results.json` - Verify service proxy: `kubectl get --raw /api/v1/namespaces/polaris/services/polaris-dashboard:80/proxy/results.json`
**Namespace table empty:** **Namespace table empty:**
- Polaris hasn't run audit yet (wait a few minutes) - Polaris hasn't run audit yet (wait a few minutes)
- Check Polaris logs: `kubectl -n polaris logs -l app.kubernetes.io/name=polaris` - Check Polaris logs: `kubectl -n polaris logs -l app.kubernetes.io/name=polaris`
@@ -281,6 +287,7 @@ kubectl apply -f deployment/e2e-ci-runner-rbac.yaml
### Manual Trigger ### Manual Trigger
You can manually trigger E2E tests from GitHub Actions: You can manually trigger E2E tests from GitHub Actions:
1. Go to Actions → E2E Tests 1. Go to Actions → E2E Tests
2. Click "Run workflow" 2. Click "Run workflow"
3. Select branch and run 3. Select branch and run