Install any skill in seconds. Free to start, no credit card required.
Get Started Free →KubeSphere extension management Skill. Use when user requests to install, configure, upgrade, uninstall extensions, or query extension info/troubleshoot issues. Includes extension discovery, dependency management, install configuration, version management.
.claude/skills/kubesphere-kubesphere-extension-management/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 196% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 63% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 468% | 0% |
┌──────────────────────┐ ┌─────────────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ Extension Museum │ │ Extension │ │ InstallPlan │ │ Deployed Extension │
│ (Local Chart Repo) │───────▶│ - description │───────▶│ - extension │───────▶│ │
│ │ (sync) │ - status │ │ - config │ │ Namespace: <target> │
└──────────────────────┘ │ ExtensionVersion │ │ - clusterScheduling │ │ └── Pods, Services │
│ - version │ └──────────────────────┘ └──────────────────────┘
│ - chartURL │ │ (reconcile)
│ - externalDependencies │ |
│ - installationMode │ |
└─────────────────────────────┘ ▼
┌──────────────────────┐
│ Job │
│ helm-upgrade-<name> │
│ - helm install/ │
│ upgrade/uninstall │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Pod │
│ (Helm execution) │
└──────────────────────┘Metadata and status for available/installed extensions.
| Field | Description | Example | |-------|-------------|---------| | metadata.name | Extension name | whizard-monitoring | | spec.versions[] | Available versions | [1.2.0, 1.2.1] | | status.state | Current state | Installed/Upgrading/Failed | | status.enabled | Enabled status | true/false | | status.installedVersion | Installed version | 1.2.1 |
Version-specific details: Helm chart location, dependencies, requirements.
| Field | Description | Example | |-------|-------------|---------| | metadata.name | Version resource name | whizard-monitoring-1.2.1 | | spec.version | Version number | 1.2.1 | | spec.chartURL | Helm chart URL | https://extensions-museum.../whizard-monitoring-1.2.1.tgz | | spec.namespace | Target namespace | kubesphere-monitoring-system | | spec.installationMode | Install mode | Multicluster/HostOnly | | spec.ksVersion | Required KS version | >=4.2.0-0 | | spec.externalDependencies[] | Required extensions | [name: whizard-telemetry] |
Trigger for install/upgrade/uninstall. Creates Helm Job to deploy components.
Spec: | Field | Type | Required | Description | |-------|------|----------|-------------| | metadata.name | string | ✅ | Must match spec.extension.name | | spec.extension.name | string | ✅ | Extension name | | spec.extension.version | string | ✅ | Exact version to install | | spec.enabled | bool | ✅ | Enable extension | | spec.upgradeStrategy | string | ✅ | Use Manual for production | | spec.config | string | ❌ | Custom YAML config | | spec.clusterScheduling | object | ❌ | Multi-cluster config (Multicluster mode only) |
Status: | Field | Description | |-------|-------------| | status.state | Installed/Installing/Upgrading/Failed | | status.jobName | Helm upgrade Job name | | status.targetNamespace | Target namespace | | status.conditions[] | Status conditions with messages |
⚠️ CRITICAL:
metadata.name = spec.extension.nameenabled: true and upgradeStrategy: Manualbash# List all extensions kubectl get extensions # List by category for c in $(kubectl get categories.kubesphere.io -o jsonpath='{.items[*].metadata.name}'); do exts=$(kubectl get extensions.kubesphere.io -l kubesphere.io/category="$c" -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}') [ -n "$exts" ] && echo -e "$c:\n$exts" done # List extension available versions kubectl get extensionversions.kubesphere.io -l kubesphere.io/extension-ref=<extension-name> # View extension details kubectl describe extension <extension-name> kubectl describe extensionversion.kubesphere.io <extension-name>-<version>
⚠️ CRITICAL:
metadata.name MUST match spec.extension.namerecommendedVersion or latest)bash# Verify the extension and version exist before creating InstallPlan kubectl get extension <extension-name> kubectl get extensionversion <extension-name>-<version> # Get version details (check installationMode, namespace, dependencies, etc.) kubectl describe extension <extension-name> kubectl describe extensionversion <extension-name>-<version>
Based on the extension details above:
installationMode=Multicluster, specify clusters in placement.clustersyamlapiVersion: kubesphere.io/v1alpha1 kind: InstallPlan metadata: name: <extension-name> spec: # clusterScheduling: # Only for Multicluster extensions. # placement: # clusters: # - <cluster-name> # overrides: # host: |- # # Extension agent configuration: custom settings for the extension agent in the current cluster, with higher priority than the global extension configuration. # # custom: # key: override-value # config: | ## Omit if user didn't request custom config # # Custom configuration for the extension, serving as a global extension configuration that can override default settings. # # custom: # key: override-value enabled: true extension: name: <extension-name> # CRITICAL: MUST match metadata.name version: <version> # CRITICAL: Use EXACT version requested upgradeStrategy: Manual
bashkubectl apply -f installplan-<extension-name>.yaml
bash# Watch status kubectl get installplan <extension-name> -w # Get details kubectl describe installplan <extension-name> # Verify extension status kubectl describe extension <extension-name> # Check deployed resources NAMESPACE=$(kubectl get installplan <extension-name> -o jsonpath='{.status.targetNamespace}') kubectl get pods,svc -n $NAMESPACE
⚠️ CRITICAL: InstallPlan metadata.name MUST match spec.extension.name
spec.config or spec.clusterScheduling (version unchanged)spec.extension.version to new versionbash# Get current InstallPlan as template kubectl get installplan <extension-name> -o yaml > installplan-<extension-name>.yaml # Edit and apply: # - For Update: modify spec.config or spec.clusterScheduling # - For Upgrade: change spec.extension.version to target version kubectl apply -f installplan-<extension-name>.yaml kubectl get installplan <extension-name> -w
bashkubectl delete installplan <extension-name>
spec.config) unless custom values are neededupgradeStrategy: Manual for productionrecommendedVersion or latest)Symptoms: InstallPlan stuck in "Installing"/"Upgrading", Job pod shows Error/Failed
Diagnosis:
bash# Step 1: Check InstallPlan status kubectl describe installplan <extension-name> # Check status.state and status.conditions # Step 2: Check Job pod logs NAMESPACE=$(kubectl get installplan <extension-name> -o jsonpath='{.status.targetNamespace}') JOB_NAME=$(kubectl get installplan <extension-name> -o jsonpath='{.status.jobName}') kubectl logs -n $NAMESPACE -l job-name=$JOB_NAME --tail=100 # Step 3: For Multicluster - check cluster scheduling status kubectl get installplan <extension-name> -o jsonpath='{.status.clusterSchedulingStatuses}' | jq . # Check each cluster's state and conditions, then get job name and logs
Solutions:
Symptoms: Job pod completed successfully, but InstallPlan stays in "Installing"/"Upgrading"
Diagnosis:
bash# Check if job completed NAMESPACE=$(kubectl get installplan <extension-name> -o jsonpath='{.status.targetNamespace}') JOB_NAME=$(kubectl get installplan <extension-name> -o jsonpath='{.status.jobName}') kubectl get pods -n $NAMESPACE -l job-name=$JOB_NAME # Check job completion time vs current time kubectl get job $JOB_NAME -n $NAMESPACE -o jsonpath='{.status.completionTime}'
Cause: Clock skew between nodes (NTP not synchronized)
Solution: Check and synchronize NTP across all cluster nodes
| Action | Command | |--------|---------| | List all extensions | kubectl get extensions | | List extension versions | kubectl get extensionversions.kubesphere.io -l kubesphere.io/extension-ref=<name> | | View extension details | kubectl describe extension <name> | | View version details | kubectl describe extensionversion <name>-<version> | | Install extension | kubectl apply -f installplan-<name>.yaml | | Track installation | kubectl get installplan <name> -w | | Upgrade extension | Modify version in InstallPlan, then kubectl apply | | Uninstall extension | kubectl delete installplan <name> |
kubesphere-core - Core platform architecturekubesphere-cluster-management - Cluster operations| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 6,310 | 5,047 | -20% | 1 | 1 | 0% | 1,269 | 3,758 | +196% | 0 | 0 | — |
case-02 | fail→pass | 12,922 | 6,344 | -51% | 1 | 1 | 0% | 2,522 | 4,104 | +63% | 0 | 0 | — |
case-03 | fail→pass | 16,869 | 12,397 | -27% | 1 | 1 | 0% | 3,011 | 4,838 | +61% | 0 | 0 | — |
case-04 | pass→pass | 4,994 | 3,880 | -22% | 1 | 1 | 0% | 974 | 3,407 | +250% | 0 | 0 | — |
case-05 | pass→pass | 8,612 | 7,740 | -10% | 1 | 1 | 0% | 1,587 | 4,057 | +156% | 0 | 0 | — |
case-06 | pass→fail | 13,658 | 9,214 | -33% | 1 | 1 | 0% | 2,571 | 4,291 | +67% | 0 | 0 | — |
case-07 | fail→pass | 12,976 | 14,857 | +14% | 1 | 1 | 0% | 2,102 | 4,057 | +93% | 0 | 0 | — |
case-08 | fail→pass | 3,115 | 2,748 | -12% | 1 | 1 | 0% | 557 | 3,165 | +468% | 0 | 0 | — |
case-09 | pass→pass | 13,006 | 4,393 | -66% | 1 | 1 | 0% | 1,921 | 3,435 | +79% | 0 | 0 | — |
case-10 | pass→pass | 6,144 | 3,426 | -44% | 1 | 1 | 0% | 1,095 | 3,253 | +197% | 0 | 0 | — |
case-11 | fail→pass | 15,223 | 4,399 | -71% | 1 | 1 | 0% | 1,813 | 3,499 | +93% | 0 | 0 | — |
case-12 | fail→pass | 10,046 | 6,518 | -35% | 1 | 1 | 0% | 1,839 | 3,891 | +112% | 0 | 0 | — |
case-13 | pass→pass | 9,168 | 3,045 | -67% | 1 | 1 | 0% | 1,496 | 3,138 | +110% | 0 | 0 | — |
case-14 | fail→pass | 13,842 | 5,418 | -61% | 1 | 1 | 0% | 2,241 | 3,362 | +50% | 0 | 0 | — |
case-15 | fail→pass | 13,687 | 5,664 | -59% | 1 | 1 | 0% | 2,094 | 3,545 | +69% | 0 | 0 | — |
case-16 | fail→pass | 5,575 | 1,305 | -77% | 1 | 1 | 0% | 1,094 | 2,821 | +158% | 0 | 0 | — |
case-17 | fail→fail | 16,888 | 6,798 | -60% | 1 | 1 | 0% | 2,894 | 3,959 | +37% | 0 | 0 | — |
case-18 | pass→pass | 4,674 | 3,821 | -18% | 1 | 1 | 0% | 853 | 3,129 | +267% | 0 | 0 | — |
case-19 | fail→pass | 12,501 | 4,690 | -62% | 1 | 1 | 0% | 1,962 | 3,535 | +80% | 0 | 0 | — |
case-20 | fail→pass | 15,693 | 3,783 | -76% | 1 | 1 | 0% | 2,512 | 3,399 | +35% | 0 | 0 | — |
case-21 | pass→pass | 10,621 | 3,699 | -65% | 1 | 1 | 0% | 1,541 | 3,206 | +108% | 0 | 0 | — |
case-22 | fail→pass | 16,969 | 6,643 | -61% | 1 | 1 | 0% | 2,576 | 3,609 | +40% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +55 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.