Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions charts/openab/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,11 @@ app.kubernetes.io/component: {{ .agent }}
{{- end -}}
{{- end }}

{{/* Resolve image: agent-level string override → global default (repository:tag, tag defaults to appVersion).
Caveat: "contains :" treats registry ports (e.g. my-registry:5000/img) as tagged.
Not an issue for ghcr.io / Docker Hub; revisit if custom registries with ports are needed. */}}
{{/* Resolve image: agent-level string override → unified default (repository:<tag>-<agent>).
All agents use the same format: ghcr.io/openabdev/openab:<tag>-<agent>
There is no "default" agent — every agent must be explicitly identified in the tag.
Per-agent image override (string with ":") is used verbatim for full backward compat.
Call with: dict "ctx" $ "agent" $name "cfg" $cfg */}}
{{- define "openab.agentImage" -}}
{{- if and .cfg.image (kindIs "string" .cfg.image) (ne .cfg.image "") }}
{{- if contains ":" .cfg.image }}
Expand All @@ -68,7 +70,7 @@ app.kubernetes.io/component: {{ .agent }}
{{- end }}
{{- else }}
{{- $tag := default .ctx.Chart.AppVersion .ctx.Values.image.tag }}
{{- printf "%s:%s" .ctx.Values.image.repository $tag }}
{{- printf "%s:%s-%s" .ctx.Values.image.repository $tag .agent }}
{{- end }}
{{- end }}

Expand Down
53 changes: 53 additions & 0 deletions charts/openab/tests/agent-image_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
suite: agentImage unified tag format (no default agent)
templates:
- templates/deployment.yaml

tests:
- it: kiro resolves to openab:<appVersion>-kiro (no bare tag)
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: "ghcr.io/openabdev/openab:0.9.0-beta.1-kiro"

- it: non-kiro agent resolves to openab:<appVersion>-<agent>
set:
agents.kiro.enabled: false
agents.claude.command: claude-agent-acp
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: "ghcr.io/openabdev/openab:0.9.0-beta.1-claude"

- it: image.tag override applies to kiro with suffix
set:
image.tag: "beta"
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: "ghcr.io/openabdev/openab:beta-kiro"

- it: image.tag override applies to non-kiro agent with suffix
set:
image.tag: "beta"
agents.kiro.enabled: false
agents.codex.command: codex-acp
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: "ghcr.io/openabdev/openab:beta-codex"

- it: explicit per-agent image string with tag is used verbatim
set:
agents.kiro.image: "ghcr.io/custom/image:v1.0"
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: "ghcr.io/custom/image:v1.0"

- it: explicit per-agent image string without tag gets appVersion appended
set:
agents.kiro.image: "ghcr.io/custom/image"
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: "ghcr.io/custom/image:0.9.0-beta.1"
12 changes: 6 additions & 6 deletions charts/openab/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ agents:
# nodeSelector: {}
# tolerations: []
# affinity: {}
# image: "ghcr.io/openabdev/openab-claude" # tag omitted → auto-appends appVersion
# image: "" # leave empty → auto-resolves to openab:<tag>-claude (unified format)
# opencode:
# command: opencode
# args:
Expand Down Expand Up @@ -125,7 +125,7 @@ agents:
# size: 1Gi
# agentsMd: ""
# resources: {}
# image: "ghcr.io/openabdev/openab-opencode:latest"
# image: "" # leave empty → auto-resolves to openab:<tag>-opencode
# pi:
# command: pi-acp
# discord:
Expand All @@ -152,7 +152,7 @@ agents:
# enabled: true
# storageClass: ""
# size: 1Gi
# image: "ghcr.io/openabdev/openab-pi:latest"
# image: "" # leave empty → auto-resolves to openab:<tag>-pi
# cursor:
# command: cursor-agent
# args:
Expand Down Expand Up @@ -183,7 +183,7 @@ agents:
# existingClaim: "" # set to reuse an existing PVC (skips PVC creation)
# storageClass: ""
# size: 1Gi
# image: "ghcr.io/openabdev/openab-cursor:latest"
# image: "" # leave empty → auto-resolves to openab:<tag>-cursor
# hermes:
# command: hermes-acp
# discord:
Expand All @@ -204,7 +204,7 @@ agents:
# enabled: true
# storageClass: ""
# size: 1Gi
# image: "ghcr.io/openabdev/openab-hermes"
# image: "" # leave empty → auto-resolves to openab:<tag>-hermes
# grok:
# command: grok
# args:
Expand Down Expand Up @@ -232,7 +232,7 @@ agents:
# enabled: true
# storageClass: ""
# size: 1Gi
# image: "ghcr.io/openabdev/openab-grok"
# image: "" # leave empty → auto-resolves to openab:<tag>-grok
image: ""
# configUrl: when set, openab uses `-c <URL>` to fetch config remotely
# instead of mounting the chart-generated ConfigMap. The ConfigMap and its
Expand Down
4 changes: 2 additions & 2 deletions docs/agentcore.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,10 @@ args = ["agentcore-bridge", "--runtime-arn", "arn:aws:...", "--region", "us-east

## Docker Image

Use `ghcr.io/openabdev/openab-agentcore` — a minimal image (~20MB) with only the OAB binary. No Python, no coding CLI bundled.
Use `ghcr.io/openabdev/openab:beta-agentcore` — a minimal image (~20MB) with only the OAB binary. No Python, no coding CLI bundled.

```bash
docker pull ghcr.io/openabdev/openab-agentcore:latest
docker pull ghcr.io/openabdev/openab:beta-agentcore
```

## Deploying a Kiro Runtime
Expand Down
4 changes: 1 addition & 3 deletions docs/antigravity.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,7 @@ agents:
command: "agy-acp"
args: []
workingDir: "/home/agent"
image:
repository: ghcr.io/openabdev/openab-antigravity
tag: "latest"
# image: leave empty — chart auto-resolves to openab:<tag>-antigravity
```

## Limitations
Expand Down
1 change: 0 additions & 1 deletion docs/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ helm install openab openab/openab \
--set agents.kiro.enabled=false \
--set agents.claude.discord.botToken="$DISCORD_BOT_TOKEN" \
--set-string 'agents.claude.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \
--set agents.claude.image=ghcr.io/openabdev/openab-claude:latest \
--set agents.claude.command=claude-agent-acp \
--set agents.claude.workingDir=/home/node
```
Expand Down
1 change: 0 additions & 1 deletion docs/codex.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ helm install openab openab/openab \
--set agents.codex.discord.enabled=true \
--set agents.codex.discord.botToken="$DISCORD_BOT_TOKEN" \
--set-string 'agents.codex.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \
--set agents.codex.image=ghcr.io/openabdev/openab-codex:latest \
--set agents.codex.command=codex-acp \
--set agents.codex.workingDir=/home/node
```
Expand Down
2 changes: 0 additions & 2 deletions docs/copilot.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ helm install openab-copilot openab/openab \
--set agents.copilot.discord.botToken="$DISCORD_BOT_TOKEN" \
--set-string 'agents.copilot.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \
--set agents.copilot.discord.enabled=true \
--set agents.copilot.image=ghcr.io/openabdev/openab-copilot \
--set agents.copilot.command=copilot \
--set 'agents.copilot.args={--acp,--stdio}' \
--set agents.copilot.persistence.enabled=true \
Expand Down Expand Up @@ -129,7 +128,6 @@ helm install openab-copilot openab/openab \
--set agents.copilot.discord.enabled=true \
--set agents.copilot.discord.botToken="$DISCORD_BOT_TOKEN" \
--set-string 'agents.copilot.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \
--set agents.copilot.image=ghcr.io/openabdev/openab-copilot \
--set agents.copilot.command=copilot \
--set 'agents.copilot.args={--acp,--stdio}' \
--set agents.copilot.persistence.enabled=true \
Expand Down
1 change: 0 additions & 1 deletion docs/cursor.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ helm install openab openab/openab \
--set agents.kiro.enabled=false \
--set agents.cursor.discord.botToken="$DISCORD_BOT_TOKEN" \
--set-string 'agents.cursor.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \
--set agents.cursor.image=ghcr.io/openabdev/openab-cursor:latest \
--set agents.cursor.command=cursor-agent \
--set 'agents.cursor.args={acp}' \
--set agents.cursor.persistence.enabled=true \
Expand Down
1 change: 0 additions & 1 deletion docs/gemini.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ helm install openab openab/openab \
--set agents.gemini.discord.enabled=true \
--set agents.gemini.discord.botToken="$DISCORD_BOT_TOKEN" \
--set-string 'agents.gemini.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \
--set agents.gemini.image=ghcr.io/openabdev/openab-gemini:latest \
--set agents.gemini.command=gemini \
--set agents.gemini.args='{--acp}' \
--set agents.gemini.workingDir=/home/node
Expand Down
1 change: 0 additions & 1 deletion docs/grok.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ helm install openab openab/openab \
--set agents.grok.discord.enabled=true \
--set agents.grok.discord.botToken="$DISCORD_BOT_TOKEN" \
--set-string 'agents.grok.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \
--set agents.grok.image=ghcr.io/openabdev/openab-grok:latest \
--set agents.grok.command=grok \
--set-string 'agents.grok.args[0]=agent' \
--set-string 'agents.grok.args[1]=stdio' \
Expand Down
1 change: 0 additions & 1 deletion docs/hermes.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ helm install openab openab/openab \
--set agents.hermes.discord.enabled=true \
--set agents.hermes.discord.botToken="$DISCORD_BOT_TOKEN" \
--set-string 'agents.hermes.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \
--set agents.hermes.image=ghcr.io/openabdev/openab-hermes:latest \
--set agents.hermes.command=hermes-acp \
--set agents.hermes.workingDir=/home/agent
```
Expand Down
75 changes: 53 additions & 22 deletions docs/image-tags.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,40 @@
# Docker Image Tagging Convention

## Core (`ghcr.io/openabdev/openab`)
## Unified Image Repository (`ghcr.io/openabdev/openab`)

| Tag | Points to | Updated when |
|-----|-----------|--------------|
| `0.8.3-beta.12` | Exact pre-release build | Pre-release tag pushed |
| `beta` | Latest pre-release | Every pre-release build |
| `0.8.3` | Promoted stable build | Stable tag pushed |
| `0.8` | Latest patch in minor | Stable promotion |
| `stable` | Latest stable | Stable promotion |
| `latest` | Latest stable (= `stable`) | Stable promotion |
All agent variants are published under a single image repository using tag-based variants.
**There is no default agent** — every image tag must explicitly specify the agent:

```
ghcr.io/openabdev/openab:<version>-<agent>
```

### Tag format

| Tag | Example | Points to | Updated when |
|-----|---------|-----------|--------------|
| `<version>-<agent>` | `0.9.0-beta.1-kiro` | Exact pre-release build | Pre-release tag pushed |
| `beta-<agent>` | `beta-claude` | Latest pre-release | Every pre-release build |
| `<version>-<agent>` | `0.9.0-codex` | Promoted stable build | Stable tag pushed |
| `<major.minor>-<agent>` | `0.9-gemini` | Latest patch in minor | Stable promotion |
| `stable-<agent>` | `stable-grok` | Latest stable | Stable promotion |

> **No `latest` tag.** Use `beta-<agent>` or `stable-<agent>` for floating tags,
> or pin to an exact version like `0.9.0-beta.1-kiro`.

Available agents: `kiro`, `claude`, `codex`, `copilot`, `cursor`, `gemini`, `grok`, `hermes`, `mimocode`, `opencode`, `antigravity`, `pi`, `native`, `agentcore`

### Migration from per-repo images (deprecated)

Previously, each agent had its own image repository (`ghcr.io/openabdev/openab-codex:beta`).
These are now replaced by the unified tag format.

Variant images (e.g. `-codex`, `-claude`, `-gemini`) follow the same convention with a suffix: `ghcr.io/openabdev/openab-codex:beta`.
| Old (deprecated) | New |
|------------------|-----|
| `ghcr.io/openabdev/openab:beta` | `ghcr.io/openabdev/openab:beta-kiro` |
| `ghcr.io/openabdev/openab:latest` | `ghcr.io/openabdev/openab:stable-kiro` (no more `latest`) |
| `ghcr.io/openabdev/openab-claude:beta` | `ghcr.io/openabdev/openab:beta-claude` |
| `ghcr.io/openabdev/openab-codex:0.8.5-beta.13` | `ghcr.io/openabdev/openab:0.8.5-beta.13-codex` |

## Gateway (`ghcr.io/openabdev/openab-gateway`)

Expand All @@ -25,31 +48,39 @@ Variant images (e.g. `-codex`, `-claude`, `-gemini`) follow the same convention

| Use case | Recommended tag |
|----------|----------------|
| Production (pinned) | Exact version (`0.8.3-beta.12`) |
| Helm chart default | `stable` or `beta` (channel-based) |
| Local dev / quick test | `beta` |
| CI | Exact version or SHA |
| Production (pinned) | Exact version (`0.9.0-beta.1-claude`) |
| Helm chart default | `beta` or `stable` — chart auto-appends `-<agent>` |
| Local dev / quick test | `beta-<agent>` |
| CI | Exact version or `<sha>-<agent>` |

## Release flow

```
release PR merged → tag-on-merge → v0.8.3-beta.12
release PR merged → tag-on-merge → v0.9.0-beta.1
build-operator.yml
┌──────────┴──────────┐
│ is_prerelease=true │
▼ │
tag: 0.8.3-beta.12 │
tag: beta │
openab:0.9.0-beta.1-kiro │
openab:0.9.0-beta.1-claude │
openab:0.9.0-beta.1-codex │
openab:beta-kiro │
openab:beta-claude │
openab:beta-codex │
... (all agents) │
┌──────────────────────┘
│ is_prerelease=false (stable)
promote latest beta image →
tag: 0.8.3
tag: 0.8
tag: stable
tag: latest
promote most recent beta images →
openab:0.9.0-kiro
openab:0.9.0-claude
openab:0.9-kiro
openab:0.9-claude
openab:stable-kiro
openab:stable-claude
... (all agents, no `latest`)
```
4 changes: 0 additions & 4 deletions docs/multi-agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ helm install openab openab/openab \
--set-string 'agents.kiro.discord.allowedChannels[0]=KIRO_CHANNEL_ID' \
--set agents.claude.discord.botToken="$CLAUDE_BOT_TOKEN" \
--set-string 'agents.claude.discord.allowedChannels[0]=CLAUDE_CHANNEL_ID' \
--set agents.claude.image=ghcr.io/openabdev/openab-claude:latest \
--set agents.claude.command=claude-agent-acp \
--set agents.claude.workingDir=/home/node
```
Expand All @@ -30,17 +29,14 @@ helm install openab openab/openab \
--set-string 'agents.kiro.discord.allowedChannels[0]=KIRO_CHANNEL_ID' \
--set agents.claude.discord.botToken="$CLAUDE_BOT_TOKEN" \
--set-string 'agents.claude.discord.allowedChannels[0]=CLAUDE_CHANNEL_ID' \
--set agents.claude.image=ghcr.io/openabdev/openab-claude:latest \
--set agents.claude.command=claude-agent-acp \
--set agents.claude.workingDir=/home/node \
--set agents.codex.discord.botToken="$CODEX_BOT_TOKEN" \
--set-string 'agents.codex.discord.allowedChannels[0]=CODEX_CHANNEL_ID' \
--set agents.codex.image=ghcr.io/openabdev/openab-codex:latest \
--set agents.codex.command=codex-acp \
--set agents.codex.workingDir=/home/node \
--set agents.gemini.discord.botToken="$GEMINI_BOT_TOKEN" \
--set-string 'agents.gemini.discord.allowedChannels[0]=GEMINI_CHANNEL_ID' \
--set agents.gemini.image=ghcr.io/openabdev/openab-gemini:latest \
--set agents.gemini.command=gemini \
--set agents.gemini.args='{--acp}' \
--set agents.gemini.workingDir=/home/node
Expand Down
1 change: 0 additions & 1 deletion docs/opencode.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ helm install openab openab/openab \
--set agents.opencode.enabled=true \
--set agents.opencode.command=opencode \
--set 'agents.opencode.args={acp}' \
--set agents.opencode.image=ghcr.io/openabdev/openab-opencode:latest \
--set agents.opencode.discord.botToken="$DISCORD_BOT_TOKEN" \
--set-string 'agents.opencode.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \
--set agents.opencode.workingDir=/home/node \
Expand Down
2 changes: 1 addition & 1 deletion docs/pi.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ agents:
- "YOUR_CHANNEL_ID"
command: pi-acp
workingDir: /home/node
image: "ghcr.io/openabdev/openab-pi:latest"
image: "ghcr.io/openabdev/openab:beta-pi"
```

## Authentication
Expand Down
6 changes: 3 additions & 3 deletions docs/refarch/cronjob_k8s_refarch.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Kubernetes CronJob
|
v
Ephemeral Job Pod
image: ghcr.io/openabdev/openab-codex:latest
image: ghcr.io/openabdev/openab:beta-codex
command: bash /opt/openab-project-screening/screen_once.sh
|
+--> read GitHub Project state via gh
Expand Down Expand Up @@ -91,7 +91,7 @@ spec:
- name: project-screening
# Pin to a specific tag in production (e.g. :0.8.0) to ensure
# reproducible runs. :latest is used here for illustration only.
image: ghcr.io/openabdev/openab-codex:latest
image: ghcr.io/openabdev/openab:beta-codex
command:
- bash
- /opt/openab-project-screening/screen_once.sh
Expand Down Expand Up @@ -308,7 +308,7 @@ projectScreening:
enabled: true
schedule: "*/30 * * * *"
# Pin to a specific tag in production (e.g. :0.8.0)
image: ghcr.io/openabdev/openab-codex:latest
image: ghcr.io/openabdev/openab:beta-codex
githubToken: "<token with project scope>"
codexAuthJson: |
<contents of ~/.codex/auth.json>
Expand Down
Loading
Loading