diff --git a/.changeset/fix-upgrade-curl-version.md b/.changeset/fix-upgrade-curl-version.md new file mode 100644 index 00000000000..7b6b7c641fa --- /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..0568ffb18ef 100644 --- a/packages/opencode/src/installation/index.ts +++ b/packages/opencode/src/installation/index.ts @@ -308,11 +308,19 @@ 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( diff --git a/packages/opencode/test/kilocode/installation/upgrade.test.ts b/packages/opencode/test/kilocode/installation/upgrade.test.ts index 046e459441f..ecb5a957a21 100644 --- a/packages/opencode/test/kilocode/installation/upgrade.test.ts +++ b/packages/opencode/test/kilocode/installation/upgrade.test.ts @@ -59,14 +59,14 @@ describe("Kilo installation upgrade", () => { () => "", (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}`) }), )