From 988a92eae99e453f5a4fe260b0894d93b7271de9 Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Mon, 13 Jul 2026 12:38:48 +0200 Subject: [PATCH 1/2] fix(cli): resolve curl upgrade version from npm dist-tag instead of GitHub releases/latest --- .changeset/fix-upgrade-curl-version.md | 7 +++++++ packages/opencode/src/installation/index.ts | 12 +++++++++--- packages/opencode/src/kilocode/installation/index.ts | 1 - .../test/kilocode/installation/upgrade.test.ts | 6 +++--- 4 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 .changeset/fix-upgrade-curl-version.md diff --git a/.changeset/fix-upgrade-curl-version.md b/.changeset/fix-upgrade-curl-version.md new file mode 100644 index 00000000000..0b2cebb2b58 --- /dev/null +++ b/.changeset/fix-upgrade-curl-version.md @@ -0,0 +1,7 @@ +--- +" @kilocode/cli": patch +--- + +Fix `kilo upgrade` for curl installs resolving the wrong latest version + +The upgrade command's version resolution for curl-detected installations used GitHub's `/releases/latest` endpoint, which now returns JetBrains plugin releases (e.g. `jetbrains/v7.0.4`) instead of the latest CLI release. This caused `kilo upgrade` to fail for curl installs. Version resolution now uses the npm `latest` dist-tag, matching the install script fix. diff --git a/packages/opencode/src/installation/index.ts b/packages/opencode/src/installation/index.ts index 8e809e11177..a2f3ac47bd5 100644 --- a/packages/opencode/src/installation/index.ts +++ b/packages/opencode/src/installation/index.ts @@ -308,11 +308,17 @@ export const layer: Layer.Layer { () => "", (request) => { release.push(request.url) - return json({ tag_name: "v8.8.8" }) + return json({ version: "8.8.8" }) }, ), - ).effect("reads fallback versions from Kilo GitHub releases", () => + ).effect("reads fallback versions from the Kilo npm registry", () => Effect.gen(function* () { const result = yield* Installation.Service.use((svc) => svc.latest("unknown")) expect(result).toBe("8.8.8") - expect(release).toContain("https://api.github.com/repos/Kilo-Org/kilocode/releases/latest") + expect(release).toContain(`https://registry.npmjs.org/@kilocode%2fcli/${InstallationChannel}`) }), ) From dcbb107ee28ef26f1bc726d8e885d58797e6efa5 Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Mon, 13 Jul 2026 12:47:39 +0200 Subject: [PATCH 2/2] fix(cli): use public npm registry for curl fallback, fix tests and changeset --- .changeset/fix-upgrade-curl-version.md | 2 +- packages/opencode/src/installation/index.ts | 14 ++++++----- .../test/installation/installation.test.ts | 24 ++++++++++++------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/.changeset/fix-upgrade-curl-version.md b/.changeset/fix-upgrade-curl-version.md index 0b2cebb2b58..7b6b7c641fa 100644 --- a/.changeset/fix-upgrade-curl-version.md +++ b/.changeset/fix-upgrade-curl-version.md @@ -1,5 +1,5 @@ --- -" @kilocode/cli": patch +"@kilocode/cli": patch --- Fix `kilo upgrade` for curl installs resolving the wrong latest version diff --git a/packages/opencode/src/installation/index.ts b/packages/opencode/src/installation/index.ts index a2f3ac47bd5..0568ffb18ef 100644 --- a/packages/opencode/src/installation/index.ts +++ b/packages/opencode/src/installation/index.ts @@ -308,13 +308,15 @@ export const layer: Layer.Layer { describe("latest", () => { - testEffect(testLayer(() => jsonResponse({ tag_name: "v1.2.3" }))).effect( - "reads release version from GitHub releases", - () => - Effect.gen(function* () { - const result = yield* Installation.use.latest("unknown") - expect(result).toBe("1.2.3") - }), + // kilocode_change start - curl/unknown fallback now resolves from the public npm + // registry instead of GitHub /releases/latest (which is polluted by JetBrains releases) + const curlCalls: string[] = [] + testEffect( + testLayer((request) => { + curlCalls.push(request.url) + return jsonResponse({ version: "1.2.3" }) + }), + ).effect("reads release version from GitHub releases", () => + Effect.gen(function* () { + const result = yield* Installation.use.latest("unknown") + expect(result).toBe("1.2.3") + expect(curlCalls).toContain("https://registry.npmjs.org/@kilocode%2fcli/local") + }), ) - testEffect(testLayer(() => jsonResponse({ tag_name: "v4.0.0-beta.1" }))).effect( + testEffect(testLayer(() => jsonResponse({ version: "4.0.0-beta.1" }))).effect( "strips v prefix from GitHub release tag", () => Effect.gen(function* () { @@ -75,6 +82,7 @@ describe("installation", () => { expect(result).toBe("4.0.0-beta.1") }), ) + // kilocode_change end const npmCalls: string[] = [] testEffect(