Skip to content

Commit 4e38216

Browse files
authored
feat(chart): world-class Artifact Hub metadata + cosign chart signing (#78)
Brings hermes-operator's Helm chart to the same world-class bar as openclaw-operator. ## Changes - **Rich Chart.yaml metadata** — logo/icon, keywords, category, license, links, CRDs (HermesInstance/SelfConfig/ClusterDefaults, `v1`), crdsExamples, `artifacthub.io/images` (auto-bumping via `# x-release-please-version` + release-please generic updater), `artifacthub.io/changes`. - **`artifacthub-repo.yml`** added (ready to claim verified ownership under the paperclipinc org). - **Chart cosign signing** — `helm-release` keyless-signs the pushed chart artifact. - **OperatorHub submit hardened** — both `community-operators` and `community-operators-prod` jobs sync the fork via `gh repo sync` (avoids the `workflow`-scope push rejection). Verified: `helm lint` passes; rendered image tag == `artifacthub.io/images` (`0.1.14`); CRD version `v1` confirmed. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
1 parent 6989e6d commit 4e38216

5 files changed

Lines changed: 97 additions & 12 deletions

File tree

.github/workflows/operatorhub-submit.yaml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,13 @@ jobs:
8080
git config user.name "github-actions[bot]"
8181
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
8282
83-
git fetch upstream main
84-
git reset --hard upstream/main
85-
86-
git checkout -b "${BRANCH}"
83+
FORK_OWNER=$(gh api user --jq '.login')
84+
# Sync the fork's main with upstream SERVER-SIDE. gh repo sync is a
85+
# fast-forward via the API; reset+push would carry upstream .github/workflows
86+
# changes that a PAT without 'workflow' scope is refused.
87+
gh repo sync "${FORK_OWNER}/community-operators" --branch main --force
88+
git fetch origin main
89+
git checkout -B "${BRANCH}" origin/main
8790
8891
mkdir -p operators/hermes-operator
8992
cp -r ../submission/operators/hermes-operator/${VERSION} operators/hermes-operator/${VERSION}
@@ -180,9 +183,13 @@ jobs:
180183
cd community-operators-prod
181184
git config user.name "github-actions[bot]"
182185
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
183-
git fetch upstream main
184-
git reset --hard upstream/main
185-
git checkout -b "${BRANCH}"
186+
FORK_OWNER=$(gh api user --jq '.login')
187+
# Sync the fork's main with upstream SERVER-SIDE. gh repo sync is a
188+
# fast-forward via the API; reset+push would carry upstream .github/workflows
189+
# changes that a PAT without 'workflow' scope is refused.
190+
gh repo sync "${FORK_OWNER}/community-operators-prod" --branch main --force
191+
git fetch origin main
192+
git checkout -B "${BRANCH}" origin/main
186193
mkdir -p operators/hermes-operator
187194
cp -r ../submission/operators/hermes-operator/${VERSION} operators/hermes-operator/${VERSION}
188195
git add "operators/hermes-operator"

.github/workflows/release.yaml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,18 @@ jobs:
157157
with:
158158
version: latest
159159

160-
- name: Package and push Helm chart
160+
- name: Install Cosign
161+
uses: sigstore/cosign-installer@v3
162+
163+
- name: Package, push, and sign Helm chart
161164
run: |
162165
CHART_VERSION="${{ github.ref_name }}"
163166
CHART_VERSION="${CHART_VERSION#v}"
164167
helm package charts/hermes-operator \
165168
--version "${CHART_VERSION}" \
166169
--app-version "${{ github.ref_name }}"
167-
helm push hermes-operator-${CHART_VERSION}.tgz oci://ghcr.io/paperclipinc/charts
170+
PUSH_OUT=$(helm push "hermes-operator-${CHART_VERSION}.tgz" oci://ghcr.io/paperclipinc/charts 2>&1)
171+
echo "${PUSH_OUT}"
172+
DIGEST=$(echo "${PUSH_OUT}" | awk '/Digest:/ {print $2}')
173+
if [ -z "${DIGEST}" ]; then echo "::error::could not parse chart digest"; exit 1; fi
174+
cosign sign --yes "ghcr.io/paperclipinc/charts/hermes-operator@${DIGEST}"

artifacthub-repo.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Artifact Hub repository metadata. After this chart repo is added under the
2+
# paperclipinc organization on artifacthub.io, paste the generated repositoryID
3+
# here (above owners) to claim verified ownership.
4+
owners:
5+
- name: Jannes Stubbemann
6+
email: jannes@paperclip.inc

charts/hermes-operator/Chart.yaml

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,77 @@
11
apiVersion: v2
22
name: hermes-operator
3-
description: Kubernetes operator for nousresearch/hermes-agent
3+
description: >-
4+
A Kubernetes operator for deploying and managing Nous Research Hermes
5+
AI agent instances
46
type: application
57
version: 0.1.14
68
appVersion: 0.1.14
79
kubeVersion: '>=1.28.0-0'
8-
home: https://github.com/paperclipinc/hermes-operator
10+
keywords:
11+
- kubernetes
12+
- operator
13+
- hermes
14+
- ai
15+
- agent
16+
- llm
17+
- nous-research
18+
- automation
19+
home: https://paperclip.inc
20+
icon: https://paperclip.inc/favicon.svg
921
sources:
1022
- https://github.com/paperclipinc/hermes-operator
1123
maintainers:
1224
- name: paperclipinc
1325
email: jannes@paperclip.inc
26+
annotations:
27+
artifacthub.io/category: ai-machine-learning
28+
artifacthub.io/license: Apache-2.0
29+
artifacthub.io/operator: 'true'
30+
artifacthub.io/operatorCapabilities: Seamless Upgrades
31+
artifacthub.io/prerelease: 'false'
32+
artifacthub.io/links: |
33+
- name: Website
34+
url: https://paperclip.inc
35+
- name: Documentation
36+
url: https://paperclip.inc/docs/operators/hermes
37+
- name: OperatorHub
38+
url: https://artifacthub.io/packages/olm/community-operators/hermes-operator
39+
- name: support
40+
url: https://github.com/paperclipinc/hermes-operator/issues
41+
artifacthub.io/crds: |
42+
- kind: HermesInstance
43+
version: v1
44+
name: hermesinstances.hermes.agent
45+
displayName: Hermes Instance
46+
description: Represents a managed Nous Research Hermes AI agent instance
47+
- kind: HermesSelfConfig
48+
version: v1
49+
name: hermesselfconfigs.hermes.agent
50+
displayName: Hermes Self-Config
51+
description: A request from an agent to modify its own HermesInstance spec
52+
- kind: HermesClusterDefaults
53+
version: v1
54+
name: hermesclusterdefaults.hermes.agent
55+
displayName: Hermes Cluster Defaults
56+
description: Cluster-wide default settings applied to Hermes instances
57+
artifacthub.io/crdsExamples: |
58+
- apiVersion: hermes.agent/v1
59+
kind: HermesInstance
60+
metadata:
61+
name: my-hermes
62+
spec:
63+
image:
64+
repository: ghcr.io/paperclipinc/hermes-agent
65+
tag: v2026.5.29.2
66+
storage:
67+
persistence:
68+
enabled: true
69+
size: 10Gi
70+
artifacthub.io/images: |
71+
- name: hermes-operator
72+
image: ghcr.io/paperclipinc/hermes-operator:0.1.14 # x-release-please-version
73+
artifacthub.io/changes: |
74+
- kind: added
75+
description: World-class Artifact Hub metadata (logo, keywords, CRDs, images)
76+
- kind: added
77+
description: Helm chart OCI artifact is now cosign-signed (keyless)

release-please-config.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
{ "type": "yaml", "path": "charts/hermes-operator/Chart.yaml", "jsonpath": "$.version" },
2323
{ "type": "yaml", "path": "charts/hermes-operator/Chart.yaml", "jsonpath": "$.appVersion" },
2424
{ "type": "yaml", "path": "charts/hermes-operator/values.yaml", "jsonpath": "$.image.tag" },
25-
{ "type": "yaml", "path": "bundle/manifests/hermes-operator.clusterserviceversion.yaml", "jsonpath": "$.spec.version" }
25+
{ "type": "yaml", "path": "bundle/manifests/hermes-operator.clusterserviceversion.yaml", "jsonpath": "$.spec.version" },
26+
{ "type": "generic", "path": "charts/hermes-operator/Chart.yaml" }
2627
]
2728
}
2829
}

0 commit comments

Comments
 (0)