kubesphere/frontend-forge-fe-operations
Operate FrontendExtension (FE) resources in frontend-forge: create, update, rebuild, inspect package artifacts, download packages, publish, unpublish, delete, and debug package/publish controller behavior. Use this skill whenever the user mentions FE operations, FrontendExtension lifecycle, extension package/download/publish/unpublish, artifact ConfigMaps, package Jobs, publisher Jobs, publish target ConfigMaps or Secrets, rebuild-token, package-state/publish-state labels, or troubleshooting FE status in a Kubernetes cluster.
npx skills add https://github.com/kubesphere/kubesphere --skill frontend-forge-fe-operations
Use this skill for operational work around FrontendExtension resources:
Packaging, Ready, and Failed, plus publish/unpublish phases such as Pending, Running, Succeeded, and FailedIf the task is about FrontendIntegration runtime JSBundle creation, use the FI operations skill instead. FE package/publish does not create a runtime JSBundle in the current cluster.
references/lifecycle.mdreferences/lifecycle.mdreferences/api.mdreferences/inspection.mdreferences/inspection.md, then check controller logsfrontendextensions.frontend-forge.kubesphere.io.extension-controller component.BUILD_SERVICE_BASE_URL is reachable from package Jobs.ConfigMap/ksbuilder-publish-config in extension-frontend-forge.Prefer live cluster state for operations and repo docs for expected behavior:
kubectl get fe <name> -o yamlkubectl get jobs -n <work-namespace> -l frontend-forge.kubesphere.io/fe-name=<name>spec/frontend-extension-design.mdspec/crds.mdspec/k8s-resources.mdconfig/samples/frontendextension-inspecttask.yamlcrates/api/src/fe.rscrates/frontend-extension-controllercrates/frontend-forge-extension-apiFrontendExtensionfeextension-frontend-forgefe-<fe-name>-package-<artifact-key-12>-a<attempt>extension-frontend-forgestatus.artifact.storage.refbinaryData["package.tgz"], data["artifact.json"], and data["files.json"]extension-frontend-forgefe-<fe-name>-publish-<request-id-hash-short>fe-<fe-name>-unpublish-<request-id-hash-short>ConfigMap or SecretConfigMap/ksbuilder-publish-config in the release namespaceDefault names and namespaces can change through Helm values and controller environment variables. Use FE status, Job labels, and controller deployment env vars before assuming defaults.
Inspect FE:
kubectl get fe <name> -o yaml
kubectl get fe <name> -o jsonpath='{.status}{"\n"}'
kubectl get fe <name> -o jsonpath='{.status.phase}{" "}{.status.publish.phase}{" "}{.status.unpublish.phase}{"\n"}'
kubectl get fe -l frontend-forge.kubesphere.io/package-state=ready
kubectl get fe -l frontend-forge.kubesphere.io/publish-state=published
Create or update:
kubectl apply -f <file.yaml>
kubectl apply -f config/samples/frontendextension-inspecttask.yaml
Find package Job and logs:
kubectl get fe <name> -o jsonpath='{.status.packageJob.namespace}{" "}{.status.packageJob.name}{"\n"}'
kubectl -n <job-namespace> get job <job-name> -o yaml
kubectl -n <job-namespace> logs job/<job-name>
Find artifact ConfigMap:
kubectl get fe <name> -o jsonpath='{.status.artifact.storage.ref.namespace}{" "}{.status.artifact.storage.ref.name}{" "}{.status.artifact.storage.key}{"\n"}'
kubectl -n <artifact-namespace> get cm <artifact-configmap-name> -o yaml
Force a rebuild:
kubectl annotate fe <name> frontend-forge.kubesphere.io/rebuild-token="$(date +%s)" --overwrite
Inspect publish or unpublish Jobs:
kubectl get jobs -n extension-frontend-forge -l frontend-forge.kubesphere.io/fe-name=<name>
kubectl get fe <name> -o jsonpath='{.status.publish.jobRef.namespace}{" "}{.status.publish.jobRef.name}{"\n"}'
kubectl get fe <name> -o jsonpath='{.status.unpublish.jobRef.namespace}{" "}{.status.unpublish.jobRef.name}{"\n"}'
kubectl -n <job-namespace> logs job/<job-name>
FE API operations:
KS_API=https://<kubesphere-host>
FE_API="$KS_API/kapis/frontend-forge-api.kubesphere.io/v1alpha1/frontendextensions"
curl -fS "$FE_API/<name>"
curl -fS -u "user:password" "$FE_API/<name>" # user runs this if /kapis returns 401/403
curl -fS "$FE_API/<name>/publish" # read publish status only
curl -fS -X POST -H 'Content-Type: application/json' --data '{"requestId":"manual-1","expectedArtifactDigest":"sha256:<digest>"}' "$FE_API/<name>/publish"
curl -fS "$FE_API/<name>/unpublish" # read unpublish status only
curl -fS -X POST -H 'Content-Type: application/json' --data '{"requestId":"manual-unpublish-1"}' "$FE_API/<name>/unpublish"
curl -fS -X POST -H 'Content-Type: application/json' --data '{"unpublish":true}' "$FE_API/<name>/delete"
curl -fS -u "user:password" -X POST -H 'Content-Type: application/json' --data '{"unpublish":true}' "$FE_API/<name>/delete"
curl -fL "$FE_API/<name>/download" -o <name>.tgz
-n with kubectl get fe; FrontendExtension is cluster-scoped./kapis/frontend-forge-api.kubesphere.io/v1alpha1/frontendextensions; use direct service port-forwarding mainly for local debugging./kapis returns 401 or 403, guide the user to run curl -u "user:password" ... or use their normal KubeSphere authenticated session. Do not ask them to paste credentials into the conversation.kubectl delete fe <name> to unpublish first. Use the FE API delete endpoint with {"unpublish":true} for that behavior.status.artifact.artifactKey as build cache identity, not package content digest. Use status.artifact.digest for the generated package digest.status.artifact.storage.ref unless the user has explicitly requested artifact cleanup and you have confirmed it is not the current artifact.Destructive operations:
.status.publish.phase, .status.publish.active, and .status.publish.artifactDigest.{"unpublish":true} so the controller can unpublish before deleting.kubectl delete fe <name> for published extensions unless the user explicitly wants to skip unpublish.Rebuild:
frontend-forge.kubesphere.io/rebuild-token, record current .status.observedSourceHash, .status.artifact.digest, .status.artifact.artifactKey, .status.publish, and frontend-forge.kubesphere.io/publish-fresh.--overwrite.Ready; republish only after confirming the new status.artifact.digest.Artifact ConfigMap:
binaryData["package.tgz"], data["artifact.json"], or data["files.json"] in place. A manual edit can make status, annotations, and digest disagree..status.artifact.storage.ref during normal troubleshooting. If cleanup is requested, first confirm the current FE artifact points somewhere else or the FE itself is being deleted.FE package state:
.status.phase.status.observedGeneration.status.observedSourceHash.status.observedRebuildToken.status.conditions.status.packageJob.status.artifact.status.downloadPublish state:
.status.publish.phase.status.publish.active.status.publish.requestId.status.publish.artifactDigest.status.publish.jobRef.status.publish.lastError.status.unpublish.phase.status.unpublish.requestId.status.unpublish.extensionName.status.unpublish.jobRef.status.unpublish.lastErrorLabels used for filtering:
frontend-forge.kubesphere.io/package-state: packaging, ready, failedfrontend-forge.kubesphere.io/publish-state: not-published, publishing, published, failedfrontend-forge.kubesphere.io/publish-fresh: true, falseStatus consistency with implementation:
Pending, Packaging, Ready, or Failed.Pending, Running, Succeeded, or Failed.NotRequested, Pending, Running, Succeeded, or Failed.NotRequested, Pending, Running, Succeeded, or Failed.SourceValid, ArtifactReady, DownloadReady, and PublishSucceeded.PublishFailed appears as a PublishSucceeded condition reason when status.publish.phase=Failed; it is not a top-level FE phase.Ready, inspect status.conditions, status.packageJob, package Job logs, build-service reachability, and artifact ConfigMap state.Ready but download fails, inspect status.download, status.artifact.storage, the artifact ConfigMap key, and digest consistency.status.publish or status.unpublish, publisher Job logs, target ConfigMap or Secret contents, and API responses. Use annotations as diagnostic evidence, not as the primary operation path.When status and Job logs are insufficient:
kubectl -n extension-frontend-forge logs deploy/frontend-forge-extension-controller --tail=200
kubectl -n extension-frontend-forge logs deploy/frontend-forge-extension-api --tail=200
Deployment names can vary by Helm release name. If those commands fail, list deployments with:
kubectl -n extension-frontend-forge get deploy -l app.kubernetes.io/component=extension-controller
kubectl -n extension-frontend-forge get deploy -l app.kubernetes.io/component=extension-api
Take kubesphere/frontend-forge-fe-operations from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.