Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f896622b5b | |||
| a65743dea3 |
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)',
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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,6 +73,7 @@ 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({}) },
|
||||||
|
|||||||
+16
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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**:
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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');
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user