Skip to content

Commit 71811d9

Browse files
lroolleclaude
andcommitted
feat(kimi): add Moonshot Kimi Code CLI as a launchable agent
First of two commits on this branch (kimi, then cloak). This commit is kimi plus the maintenance that rode with it. - kimi (#455): `deva.sh kimi`, oauth default + api-key. kimi reads no API key from the shell except the KIMI_MODEL_* family, so api-key mode synthesizes an in-memory provider from KIMI_CODE_API_KEY and nothing lands on disk. Pin, docs, CI/nightly/release wiring, tests. - refactor(trace): extract shared filter_trace_flag from the codex/grok inline --trace detection into agents/shared_auth.sh. - fix(#414): serialize the cctrace CA install under flock and exit 0 explicitly so set -e stops killing traced launches in baked images. - chore(pins): refresh CLI pins (claude 2.1.217, codex 0.145, gemini 0.51, grok 0.2.106, cctrace 0.19, ccx 0.11, playwright 1.61, go 1.26.5). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 5776806 commit 71811d9

36 files changed

Lines changed: 581 additions & 102 deletions

.deva.example

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ EPHEMERAL=false
6161
# Hybrid Agent Setup:
6262
#
6363
# Hybrid is the DEFAULT. deva walks every populated subdir under
64-
# ~/.config/deva/ (claude, codex, gemini, grok) and mounts each agent's
64+
# ~/.config/deva/ (claude, codex, gemini, grok, kimi) and mounts each agent's
6565
# canonical entries into the container. Populated = you either
6666
# hand-created the subdir or autolink symlinked it from legacy
67-
# ~/.claude, ~/.codex, ~/.gemini, ~/.grok on first run.
67+
# ~/.claude, ~/.codex, ~/.gemini, ~/.grok, ~/.kimi-code on first run.
6868
#
6969
# No .deva entries required for the common case. To opt OUT of
7070
# hybrid for a single invocation, pass --config-home DIR to

.github/workflows/ci.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ jobs:
8080
--build-arg CODEX_VERSION="${{ steps.pins.outputs.codex_version }}" \
8181
--build-arg GEMINI_CLI_VERSION="${{ steps.pins.outputs.gemini_cli_version }}" \
8282
--build-arg GROK_CLI_VERSION="${{ steps.pins.outputs.grok_cli_version }}" \
83+
--build-arg KIMI_CODE_VERSION="${{ steps.pins.outputs.kimi_code_version }}" \
8384
--build-arg CCX_VERSION="${{ steps.pins.outputs.ccx_version }}" \
8485
--build-arg COPILOT_API_VERSION="${{ steps.pins.outputs.copilot_api_version }}" \
8586
.
@@ -102,6 +103,7 @@ jobs:
102103
CODEX_VERSION="${{ steps.pins.outputs.codex_version }}" \
103104
GEMINI_CLI_VERSION="${{ steps.pins.outputs.gemini_cli_version }}" \
104105
GROK_CLI_VERSION="${{ steps.pins.outputs.grok_cli_version }}" \
106+
KIMI_CODE_VERSION="${{ steps.pins.outputs.kimi_code_version }}" \
105107
CCX_VERSION="${{ steps.pins.outputs.ccx_version }}" \
106108
COPILOT_API_VERSION="${{ steps.pins.outputs.copilot_api_version }}" \
107109
PLAYWRIGHT_VERSION="${{ steps.pins.outputs.playwright_version }}" \
@@ -127,6 +129,7 @@ jobs:
127129
deva.sh codex -Q -- --version
128130
deva.sh gemini -Q -- --version
129131
deva.sh grok -Q -- --version
132+
deva.sh kimi -Q -- --version
130133
131134
- name: Smoke Claude --chrome mount assembly
132135
shell: bash
@@ -166,6 +169,14 @@ jobs:
166169
set -euo pipefail
167170
./scripts/test-install-agent-tooling.sh
168171
172+
- name: Smoke kimi auth wiring
173+
shell: bash
174+
run: |
175+
set -euo pipefail
176+
DEVA_DOCKER_IMAGE=deva-smoke \
177+
DEVA_DOCKER_TAG=ci \
178+
./scripts/test-kimi-auth.sh
179+
169180
- name: Smoke version targets
170181
shell: bash
171182
run: |

.github/workflows/nightly-images.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ jobs:
5555
codex_version: ${{ steps.versions.outputs.codex_version }}
5656
gemini_cli_version: ${{ steps.versions.outputs.gemini_cli_version }}
5757
grok_cli_version: ${{ steps.versions.outputs.grok_cli_version }}
58+
kimi_code_version: ${{ steps.versions.outputs.kimi_code_version }}
5859
ccx_version: ${{ steps.versions.outputs.ccx_version }}
5960
copilot_api_version: ${{ steps.versions.outputs.copilot_api_version }}
6061
steps:
@@ -82,6 +83,7 @@ jobs:
8283
- Codex: \`${{ steps.versions.outputs.codex_version }}\`
8384
- Gemini CLI: \`${{ steps.versions.outputs.gemini_cli_version }}\`
8485
- Grok CLI: \`${{ steps.versions.outputs.grok_cli_version }}\`
86+
- Kimi Code: \`${{ steps.versions.outputs.kimi_code_version }}\`
8587
- ccx: \`${{ steps.versions.outputs.ccx_version }}\`
8688
- Copilot API: \`${{ steps.versions.outputs.copilot_api_version }}\`
8789
- Stamp: \`${{ steps.versions.outputs.stamp }}\`
@@ -143,6 +145,7 @@ jobs:
143145
CODEX_VERSION=${{ needs.resolve-versions.outputs.codex_version }}
144146
GEMINI_CLI_VERSION=${{ needs.resolve-versions.outputs.gemini_cli_version }}
145147
GROK_CLI_VERSION=${{ needs.resolve-versions.outputs.grok_cli_version }}
148+
KIMI_CODE_VERSION=${{ needs.resolve-versions.outputs.kimi_code_version }}
146149
CCX_VERSION=${{ needs.resolve-versions.outputs.ccx_version }}
147150
COPILOT_API_VERSION=${{ needs.resolve-versions.outputs.copilot_api_version }}
148151
@@ -197,6 +200,7 @@ jobs:
197200
CODEX_VERSION=${{ needs.resolve-versions.outputs.codex_version }}
198201
GEMINI_CLI_VERSION=${{ needs.resolve-versions.outputs.gemini_cli_version }}
199202
GROK_CLI_VERSION=${{ needs.resolve-versions.outputs.grok_cli_version }}
203+
KIMI_CODE_VERSION=${{ needs.resolve-versions.outputs.kimi_code_version }}
200204
CCX_VERSION=${{ needs.resolve-versions.outputs.ccx_version }}
201205
PLAYWRIGHT_VERSION=${{ needs.load-version-pins.outputs.playwright_version }}
202206
RUST_TOOLCHAINS=${{ needs.load-version-pins.outputs.rust_toolchains }}

.github/workflows/release.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ jobs:
5151
codex_version: ${{ steps.pins.outputs.codex_version }}
5252
gemini_cli_version: ${{ steps.pins.outputs.gemini_cli_version }}
5353
grok_cli_version: ${{ steps.pins.outputs.grok_cli_version }}
54+
kimi_code_version: ${{ steps.pins.outputs.kimi_code_version }}
5455
ccx_version: ${{ steps.pins.outputs.ccx_version }}
5556
copilot_api_version: ${{ steps.pins.outputs.copilot_api_version }}
5657
playwright_version: ${{ steps.pins.outputs.playwright_version }}
@@ -86,6 +87,7 @@ jobs:
8687
- Codex: \`${{ steps.pins.outputs.codex_version }}\`
8788
- Gemini CLI: \`${{ steps.pins.outputs.gemini_cli_version }}\`
8889
- Grok CLI: \`${{ steps.pins.outputs.grok_cli_version }}\`
90+
- Kimi Code: \`${{ steps.pins.outputs.kimi_code_version }}\`
8991
- ccx: \`${{ steps.pins.outputs.ccx_version }}\`
9092
- Copilot API: \`${{ steps.pins.outputs.copilot_api_version }}\`
9193
- Playwright: \`${{ steps.pins.outputs.playwright_version }}\`
@@ -150,6 +152,7 @@ jobs:
150152
CODEX_VERSION=${{ needs.load-version-pins.outputs.codex_version }}
151153
GEMINI_CLI_VERSION=${{ needs.load-version-pins.outputs.gemini_cli_version }}
152154
GROK_CLI_VERSION=${{ needs.load-version-pins.outputs.grok_cli_version }}
155+
KIMI_CODE_VERSION=${{ needs.load-version-pins.outputs.kimi_code_version }}
153156
CCX_VERSION=${{ needs.load-version-pins.outputs.ccx_version }}
154157
COPILOT_API_VERSION=${{ needs.load-version-pins.outputs.copilot_api_version }}
155158
@@ -206,6 +209,7 @@ jobs:
206209
CODEX_VERSION=${{ needs.load-version-pins.outputs.codex_version }}
207210
GEMINI_CLI_VERSION=${{ needs.load-version-pins.outputs.gemini_cli_version }}
208211
GROK_CLI_VERSION=${{ needs.load-version-pins.outputs.grok_cli_version }}
212+
KIMI_CODE_VERSION=${{ needs.load-version-pins.outputs.kimi_code_version }}
209213
CCX_VERSION=${{ needs.load-version-pins.outputs.ccx_version }}
210214
PLAYWRIGHT_VERSION=${{ needs.load-version-pins.outputs.playwright_version }}
211215
RUST_TOOLCHAINS=${{ needs.load-version-pins.outputs.rust_toolchains }}

CHANGELOG.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
- kimi agent (Moonshot Kimi Code CLI, #455): `deva.sh kimi` launches the
12+
official `@moonshot-ai/kimi-code` CLI like claude/codex/gemini/grok.
13+
`oauth` default (device-code `/login`, mounts `~/.kimi-code`) and
14+
`api-key`. kimi reads no API key from the shell — its only shell channel
15+
is the `KIMI_MODEL_*` family — so api-key mode maps `KIMI_CODE_API_KEY`
16+
onto `KIMI_MODEL_{NAME,API_KEY,PROVIDER_TYPE,BASE_URL}` (default model
17+
`k3`, coding endpoint `https://api.kimi.com/coding/v1`; override with
18+
`DEVA_KIMI_MODEL` / `DEVA_KIMI_BASE_URL`). The key is synthesized
19+
in-memory, never written to `config.toml`, so api-key mode mounts no
20+
`~/.kimi-code` and nothing lands on disk. Unlike grok, kimi's npm bin is
21+
a plain symlink (no self-update trampoline), so no binary-pinning guard
22+
is needed. `KIMI_CODE_VERSION` pinned at 0.28.0 through versions.env,
23+
Makefile, Dockerfile(+rust), version-pins/upgrade/update scripts,
24+
ci/nightly/release workflows; tests added (release-utils registry,
25+
version-upgrade mock, install-tooling, and `test-kimi-auth.sh`).
26+
27+
### Fixed
28+
- `--trace` launch killed by `cp: cannot create regular file
29+
'/usr/local/share/ca-certificates/cctrace-mitm.crt': File exists` (#414):
30+
the persistent-container flow runs the entrypoint's `setup_trace_ca`
31+
concurrently — once in PID 1 (`docker run -d ... tail -f /dev/null` boot)
32+
and once in the `docker exec` entrypoint that starts the agent — and GNU
33+
cp creates the destination `O_EXCL`, so the loser of the race died under
34+
`set -e`. The CA install is now serialized with `flock` and skips the
35+
copy when the installed cert is already current. The first cut of the
36+
flock subshell ended on `[ "$VERBOSE" = "true" ] && echo`, whose failed
37+
test became the subshell's exit status and `set -e` killed every
38+
non-verbose traced launch right after the banner; the subshell now
39+
exits 0 explicitly.
40+
1041
## [0.16.0] - 2026-07-14
1142

1243
### Added

DEV-LOGS.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,21 @@
1313
- Minimal markdown markers, no unnecessary formatting, minimal emojis.
1414
- Reference issue numbers in the format `#<issue-number>` for easy linking.
1515

16+
# [2026-07-21] Dev Log: traced launches die silently in freshly built images #414
17+
- Why: after rebuilding images, every `--trace` launch died with "failed to launch ephemeral container" and no error.
18+
- What:
19+
- The #414 flock rework ended the CA-install subshell on `[ "$VERBOSE" = "true" ] && echo ...`; with VERBOSE unset the failed test became the subshell's exit status, and under `set -e` the entrypoint died right after the agent banner — silently, only in freshly built images (the entrypoint is baked). Fix: explicit `exit 0` before the subshell closes. Verified A/B: baked image dies, overlay-fixed image runs `deva.sh claude --trace --rm -Q -- --version` end-to-end (cctrace MITM up, trace file written). Rebuild images to pick this up.
20+
- Result: traced launch verified live against the host daemon.
21+
22+
# [2026-07-20] Dev Log: add kimi agent (Moonshot Kimi Code CLI) #455
23+
- Why: Moonshot shipped an official coding-agent CLI (@moonshot-ai/kimi-code, bin `kimi`); deva should launch it like claude/codex/gemini/grok. Traced the grok integration (commit 93a59e0) via ccx as the template.
24+
- What:
25+
- agents/kimi.sh: oauth default (mount ~/.kimi-code; device-code `kimi login`, no browser needed) + api-key; appends `--yolo` (auto-approve tool calls, still allows clarifying questions — not `--auto`) since the container is the sandbox.
26+
- The auth divergence that broke the premise: kimi reads NO API key from the shell (docs: `export KIMI_API_KEY` does nothing; creds only from ~/.kimi-code/config.toml). The one shell channel is the `KIMI_MODEL_*` family, which synthesizes an in-memory provider. So api-key mode maps `KIMI_CODE_API_KEY` -> `KIMI_MODEL_{NAME=k3,API_KEY,PROVIDER_TYPE=kimi,BASE_URL=https://api.kimi.com/coding/v1}` (override via DEVA_KIMI_MODEL/DEVA_KIMI_BASE_URL). Verified end-to-end with a real sk-kim… key: the key auths only against api.kimi.com/coding/v1 (moonshot.ai rejects it), models k3/kimi-for-coding/highspeed, and the key is never persisted to config.toml -> no ~/.kimi-code mount in api-key mode, nothing on disk.
27+
- deva.sh: canonical entry .kimi-code, autolink ~/.kimi-code, KIMI_* env filtering, config-home mkdir/warn/dispatch. Simpler than grok — no default_credential_target_path (env-only key), so no auth.json overlay; kimi's npm bin is a plain symlink to dist/main.mjs (no self-update trampoline, native/ only darwin+win32), so no pin_platform_binary and no update-guard tmpfs.
28+
- KIMI_CODE_VERSION=0.28.0 pinned through versions.env, Makefile, Dockerfile(+rust), version-pins/upgrade/update scripts, release-utils TOOL_REGISTRY, ci/nightly/release workflows, install.sh + install-agent-tooling.sh. Tests: release-utils registry counts, version-upgrade mock (curl fixtures + outage label), install-tooling stub, and new scripts/test-kimi-auth.sh (12 assertions on the KIMI_MODEL_* wiring, redaction, naming, no-mount, overrides, missing-key error).
29+
- Result: deva.sh kimi works in both auth modes (DEVA_NO_DOCKER dry-run + local `kimi -p` through KIMI_MODEL_* verified); full test suite green. Docker image build not verifiable in this container (no daemon); the fan-out is validated by the version tooling + assertions. NOTE: docs/authentication.md documents the unique no-shell-env auth model so users don't hit the same KIMI_CODE_API_KEY confusion.
30+
1631
# [2026-07-10] Dev Log: deva-tmux — tmux as a built-in module, both transports #412
1732
- Why: tmux interaction was four loose scripts with zero deva.sh integration; #406 built the right transport (ssh) but deleted the socat fallback and stayed a loose script. Direction split matters: host->container (deva.sh shell) and agent<->agent (tmux-bridge) keep the sandbox; container->host breaks it and must be opt-in.
1833
- What:

Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,14 @@ ARG CLAUDE_CODE_VERSION=2.1.143
212212
ARG CODEX_VERSION=0.131.0
213213
ARG GEMINI_CLI_VERSION=0.42.0
214214
ARG GROK_CLI_VERSION=0.2.93
215+
ARG KIMI_CODE_VERSION=0.28.0
215216

216217
# Record key tool versions as labels for quick inspection
217218
LABEL org.opencontainers.image.claude_code_version=${CLAUDE_CODE_VERSION}
218219
LABEL org.opencontainers.image.codex_version=${CODEX_VERSION}
219220
LABEL org.opencontainers.image.gemini_cli_version=${GEMINI_CLI_VERSION}
220221
LABEL org.opencontainers.image.grok_cli_version=${GROK_CLI_VERSION}
222+
LABEL org.opencontainers.image.kimi_code_version=${KIMI_CODE_VERSION}
221223

222224
ARG CCX_VERSION=v0.7.0
223225

Dockerfile.rust

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ ARG CLAUDE_CODE_VERSION=2.1.143
1212
ARG CODEX_VERSION=0.131.0
1313
ARG GEMINI_CLI_VERSION=0.42.0
1414
ARG GROK_CLI_VERSION=0.2.93
15+
ARG KIMI_CODE_VERSION=0.28.0
1516
ARG CCX_VERSION=v0.7.0
1617
ARG PLAYWRIGHT_VERSION=1.60.0
1718
ARG RUST_TOOLCHAINS="stable"
@@ -22,6 +23,7 @@ LABEL org.opencontainers.image.claude_code_version=${CLAUDE_CODE_VERSION}
2223
LABEL org.opencontainers.image.codex_version=${CODEX_VERSION}
2324
LABEL org.opencontainers.image.gemini_cli_version=${GEMINI_CLI_VERSION}
2425
LABEL org.opencontainers.image.grok_cli_version=${GROK_CLI_VERSION}
26+
LABEL org.opencontainers.image.kimi_code_version=${KIMI_CODE_VERSION}
2527
LABEL org.opencontainers.image.ccx_version=${CCX_VERSION}
2628
LABEL org.opencontainers.image.playwright_version=${PLAYWRIGHT_VERSION}
2729

Makefile

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ CCTRACE_VERSION ?= 0.16.0
3535
CODEX_VERSION ?= 0.131.0
3636
GEMINI_CLI_VERSION ?= 0.42.0
3737
GROK_CLI_VERSION ?= 0.2.93
38+
KIMI_CODE_VERSION ?= 0.28.0
3839
CCX_VERSION ?= v0.1.4
3940
COPILOT_API_VERSION ?= 0ea08febdd7e3e055b03dd298bf57e669500b5c1
4041
PLAYWRIGHT_VERSION ?= 1.60.0
@@ -84,6 +85,7 @@ AGENT_BUILD_ARGS := \
8485
--build-arg CODEX_VERSION=$(CODEX_VERSION) \
8586
--build-arg GEMINI_CLI_VERSION=$(GEMINI_CLI_VERSION) \
8687
--build-arg GROK_CLI_VERSION=$(GROK_CLI_VERSION) \
88+
--build-arg KIMI_CODE_VERSION=$(KIMI_CODE_VERSION) \
8789
--build-arg CCX_VERSION=$(CCX_VERSION)
8890

8991
MAIN_BUILD_ARGS := $(TOOLCHAIN_BUILD_ARGS) $(AGENT_BUILD_ARGS) \
@@ -107,6 +109,7 @@ VERSION_QUERY_OVERRIDES := \
107109
$(if $(filter command line environment environment\ override override,$(origin CODEX_VERSION)),CODEX_VERSION=$(CODEX_VERSION)) \
108110
$(if $(filter command line environment environment\ override override,$(origin GEMINI_CLI_VERSION)),GEMINI_CLI_VERSION=$(GEMINI_CLI_VERSION)) \
109111
$(if $(filter command line environment environment\ override override,$(origin GROK_CLI_VERSION)),GROK_CLI_VERSION=$(GROK_CLI_VERSION)) \
112+
$(if $(filter command line environment environment\ override override,$(origin KIMI_CODE_VERSION)),KIMI_CODE_VERSION=$(KIMI_CODE_VERSION)) \
110113
$(if $(filter command line environment environment\ override override,$(origin CCX_VERSION)),CCX_VERSION=$(CCX_VERSION)) \
111114
$(if $(filter command line environment environment\ override override,$(origin COPILOT_API_VERSION)),COPILOT_API_VERSION=$(COPILOT_API_VERSION)) \
112115
$(if $(filter command line environment environment\ override override,$(origin PLAYWRIGHT_VERSION)),PLAYWRIGHT_VERSION=$(PLAYWRIGHT_VERSION)) \
@@ -150,14 +153,16 @@ build-main: build-network-check
150153
prev_codex=$$(docker inspect --format='{{ index .Config.Labels "org.opencontainers.image.codex_version" }}' $(MAIN_IMAGE) 2>/dev/null || true); \
151154
prev_gemini=$$(docker inspect --format='{{ index .Config.Labels "org.opencontainers.image.gemini_cli_version" }}' $(MAIN_IMAGE) 2>/dev/null || true); \
152155
prev_grok=$$(docker inspect --format='{{ index .Config.Labels "org.opencontainers.image.grok_cli_version" }}' $(MAIN_IMAGE) 2>/dev/null || true); \
156+
prev_kimi=$$(docker inspect --format='{{ index .Config.Labels "org.opencontainers.image.kimi_code_version" }}' $(MAIN_IMAGE) 2>/dev/null || true); \
153157
fmt() { v="$$1"; if [ -z "$$v" ] || [ "$$v" = "<no value>" ]; then echo "-"; else case "$$v" in v*) echo "$$v";; *) echo "v$$v";; esac; fi; }; \
154-
curC=$$(fmt "$$prev_claude"); curX=$$(fmt "$$prev_codex"); curG=$$(fmt "$$prev_gemini"); curK=$$(fmt "$$prev_grok"); \
155-
tgtC=$$(fmt "$(CLAUDE_CODE_VERSION)"); tgtX=$$(fmt "$(CODEX_VERSION)"); tgtG=$$(fmt "$(GEMINI_CLI_VERSION)"); tgtK=$$(fmt "$(GROK_CLI_VERSION)"); \
156-
if [ "$$curC" = "$$tgtC" ] && [ "$$curX" = "$$tgtX" ] && [ "$$curG" = "$$tgtG" ] && [ "$$curK" = "$$tgtK" ]; then \
158+
curC=$$(fmt "$$prev_claude"); curX=$$(fmt "$$prev_codex"); curG=$$(fmt "$$prev_gemini"); curK=$$(fmt "$$prev_grok"); curKi=$$(fmt "$$prev_kimi"); \
159+
tgtC=$$(fmt "$(CLAUDE_CODE_VERSION)"); tgtX=$$(fmt "$(CODEX_VERSION)"); tgtG=$$(fmt "$(GEMINI_CLI_VERSION)"); tgtK=$$(fmt "$(GROK_CLI_VERSION)"); tgtKi=$$(fmt "$(KIMI_CODE_VERSION)"); \
160+
if [ "$$curC" = "$$tgtC" ] && [ "$$curX" = "$$tgtX" ] && [ "$$curG" = "$$tgtG" ] && [ "$$curK" = "$$tgtK" ] && [ "$$curKi" = "$$tgtKi" ]; then \
157161
echo "Claude: $$tgtC (no change)"; \
158162
echo "Codex: $$tgtX (no change)"; \
159163
echo "Gemini: $$tgtG (no change)"; \
160164
echo "Grok: $$tgtK (no change)"; \
165+
echo "Kimi: $$tgtKi (no change)"; \
161166
echo "Already up-to-date"; \
162167
else \
163168
if [ "$$curC" = "$$tgtC" ]; then \
@@ -180,6 +185,11 @@ build-main: build-network-check
180185
else \
181186
echo "Grok: $$curK -> $$tgtK"; \
182187
fi; \
188+
if [ "$$curKi" = "$$tgtKi" ]; then \
189+
echo "Kimi: $$tgtKi (no change)"; \
190+
else \
191+
echo "Kimi: $$curKi -> $$tgtKi"; \
192+
fi; \
183193
fi
184194
@echo "Hint: override via GO_VERSION=... CLAUDE_CODE_VERSION=... or run 'make versions-pin'"
185195
docker build $(DOCKER_BUILD_FLAGS) -f $(DOCKERFILE) $(MAIN_BUILD_ARGS) -t $(MAIN_IMAGE) .
@@ -439,6 +449,7 @@ help:
439449
@echo " CODEX_VERSION Codex CLI version (default: $(CODEX_VERSION))"
440450
@echo " GEMINI_CLI_VERSION Gemini CLI version (default: $(GEMINI_CLI_VERSION))"
441451
@echo " GROK_CLI_VERSION Grok CLI version (default: $(GROK_CLI_VERSION))"
452+
@echo " KIMI_CODE_VERSION Kimi Code CLI version (default: $(KIMI_CODE_VERSION))"
442453
@echo " CCX_VERSION Atlas CLI version (default: $(CCX_VERSION))"
443454
@echo " PLAYWRIGHT_VERSION Playwright version (default: $(PLAYWRIGHT_VERSION))"
444455
@echo " RUST_TOOLCHAINS Rust toolchains to install (default: $(RUST_TOOLCHAINS))"

0 commit comments

Comments
 (0)