frontend-forge-fe-operations — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited frontend-forge-fe-operations (Agent Skill) and scored it 92/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 2 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 2 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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=publishedCreate or update:
kubectl apply -f <file.yaml>
kubectl apply -f config/samples/frontendextension-inspecttask.yamlFind 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 yamlForce a rebuild:
kubectl annotate fe <name> frontend-forge.kubesphere.io/rebuild-token="$(date +%s)" --overwriteInspect 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=200Deployment 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~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.