From fb6e241b9756d804a4d58359b45d1ab8a769f8c1 Mon Sep 17 00:00:00 2001 From: kirillk Date: Fri, 29 May 2026 12:14:43 -0400 Subject: [PATCH] fix(jetbrains): use gradle release metadata --- .github/workflows/publish-jetbrains.yml | 8 ++++---- packages/kilo-jetbrains/RELEASING.md | 8 ++++---- packages/kilo-jetbrains/build.gradle.kts | 9 +++++---- packages/kilo-jetbrains/gradle.properties | 1 + packages/kilo-jetbrains/package.json | 2 +- script/jetbrains-release-pr.ts | 19 +++++++++++-------- script/jetbrains-release-validate.ts | 12 ++++++++++-- script/publish-start.ts | 9 +-------- script/publish.ts | 9 +-------- .../upstream/transforms/preserve-versions.ts | 2 -- 10 files changed, 38 insertions(+), 41 deletions(-) diff --git a/.github/workflows/publish-jetbrains.yml b/.github/workflows/publish-jetbrains.yml index d72664c238..0b0f924444 100644 --- a/.github/workflows/publish-jetbrains.yml +++ b/.github/workflows/publish-jetbrains.yml @@ -49,7 +49,7 @@ jobs: - name: Save reviewed release metadata run: | cp packages/kilo-jetbrains/CHANGELOG.md "$RUNNER_TEMP/jetbrains-CHANGELOG.md" - cp packages/kilo-jetbrains/package.json "$RUNNER_TEMP/jetbrains-package.json" + cp packages/kilo-jetbrains/gradle.properties "$RUNNER_TEMP/jetbrains-gradle.properties" - name: Checkout release tag uses: actions/checkout@v6 @@ -60,7 +60,7 @@ jobs: - name: Restore reviewed release metadata run: | cp "$RUNNER_TEMP/jetbrains-CHANGELOG.md" packages/kilo-jetbrains/CHANGELOG.md - cp "$RUNNER_TEMP/jetbrains-package.json" packages/kilo-jetbrains/package.json + cp "$RUNNER_TEMP/jetbrains-gradle.properties" packages/kilo-jetbrains/gradle.properties - name: Setup Node uses: actions/setup-node@v4 @@ -111,7 +111,7 @@ jobs: - name: Verify plugin working-directory: packages/kilo-jetbrains - run: ./gradlew verifyPlugin -Pproduction=true -Pkilo.version="$VERSION" -Pkilo.channel="$CHANNEL" + run: ./gradlew verifyPlugin -Pproduction=true -Pkilo.channel="$CHANNEL" env: VERSION: ${{ steps.release.outputs.version }} CHANNEL: ${{ steps.release.outputs.marketplace_channel }} @@ -129,7 +129,7 @@ jobs: - name: Publish to JetBrains Marketplace working-directory: packages/kilo-jetbrains - run: ./gradlew publishPlugin -Pproduction=true -Pkilo.version="$VERSION" -Pkilo.channel="$CHANNEL" + run: ./gradlew publishPlugin -Pproduction=true -Pkilo.channel="$CHANNEL" env: VERSION: ${{ steps.release.outputs.version }} CHANNEL: ${{ steps.release.outputs.marketplace_channel }} diff --git a/packages/kilo-jetbrains/RELEASING.md b/packages/kilo-jetbrains/RELEASING.md index 69bea00354..e08d34d98c 100644 --- a/packages/kilo-jetbrains/RELEASING.md +++ b/packages/kilo-jetbrains/RELEASING.md @@ -58,12 +58,12 @@ The PR updates: | File | Purpose | |---|---| -| `packages/kilo-jetbrains/package.json` | JetBrains plugin package version. | +| `packages/kilo-jetbrains/gradle.properties` | JetBrains plugin version in `kilo.jetbrains.version`. | | `packages/kilo-jetbrains/CHANGELOG.md` | Release notes packaged into the plugin. | -Review and edit `packages/kilo-jetbrains/CHANGELOG.md` before merging. This changelog entry is rendered into JetBrains ``, so it appears on the Marketplace and inside IntelliJ plugin UI. +Review `packages/kilo-jetbrains/gradle.properties` and edit `packages/kilo-jetbrains/CHANGELOG.md` before merging. This changelog entry is rendered into JetBrains ``, so it appears on the Marketplace and inside IntelliJ plugin UI. -The PR can change release metadata such as `packages/kilo-jetbrains/package.json` and `packages/kilo-jetbrains/CHANGELOG.md`, but it does not change the tagged source code that will be built. +The PR can change release metadata such as `packages/kilo-jetbrains/gradle.properties` and `packages/kilo-jetbrains/CHANGELOG.md`, but it does not change the tagged source code that will be built. ## Merge and Publish @@ -84,7 +84,7 @@ Publishing behavior: | `x.y.z-rc.n` | `eap` | Prerelease | | `x.y.z` | default | Stable release | -The workflow checks out `jetbrains/v` for verification, signing, and Marketplace publishing. It overlays the reviewed `packages/kilo-jetbrains/CHANGELOG.md` from the merged PR before rendering release notes and before `publishPlugin`, so Marketplace metadata and the GitHub Release use the reviewed changelog. +The workflow checks out `jetbrains/v` for verification, signing, and Marketplace publishing. It overlays the reviewed `packages/kilo-jetbrains/gradle.properties` and `packages/kilo-jetbrains/CHANGELOG.md` from the merged PR before rendering release notes and before `publishPlugin`, so the Marketplace plugin version, Marketplace notes, and GitHub Release use the reviewed metadata. ## Installing RC Builds diff --git a/packages/kilo-jetbrains/build.gradle.kts b/packages/kilo-jetbrains/build.gradle.kts index cfba42d354..06e65495e9 100644 --- a/packages/kilo-jetbrains/build.gradle.kts +++ b/packages/kilo-jetbrains/build.gradle.kts @@ -42,10 +42,11 @@ fun gitTag(): String? { val release = providers.gradleProperty("production").map { it.toBoolean() }.orElse(false).get() val override = providers.gradleProperty("kilo.version").orNull?.trim()?.takeIf { it.isNotEmpty() } -val ver = override?.let(::checked) ?: if (release) checked( - gitTag()?.removePrefix("jetbrains/v") - ?: error("Missing JetBrains plugin version. Publish builds must run from a jetbrains/v tag."), -) else checked(gitTag()?.removePrefix("jetbrains/v") ?: "0.0.0-dev") +val prop = providers.gradleProperty("kilo.jetbrains.version").orNull?.trim()?.takeIf { it.isNotEmpty() } +val tag = gitTag()?.removePrefix("jetbrains/v") +val ver = override?.let(::checked) ?: prop?.let(::checked) ?: if (release) checked( + tag ?: error("Missing JetBrains plugin version. Publish builds must set kilo.jetbrains.version or run from a jetbrains/v tag."), +) else checked(tag ?: "0.0.0-dev") val channel = providers.gradleProperty("kilo.channel").map { it.trim() }.orElse("default") val splitPort = providers.gradleProperty("kilo.splitModeServerPort").orNull?.let(::port) ?: fallback() diff --git a/packages/kilo-jetbrains/gradle.properties b/packages/kilo-jetbrains/gradle.properties index d5066fb4c4..ec656f922f 100644 --- a/packages/kilo-jetbrains/gradle.properties +++ b/packages/kilo-jetbrains/gradle.properties @@ -1,4 +1,5 @@ kotlin.stdlib.default.dependency=false +kilo.jetbrains.version=7.0.1-rc.4 org.gradle.configuration-cache=true org.gradle.caching=true org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=512m diff --git a/packages/kilo-jetbrains/package.json b/packages/kilo-jetbrains/package.json index 01f1472a7a..b8a39255de 100644 --- a/packages/kilo-jetbrains/package.json +++ b/packages/kilo-jetbrains/package.json @@ -8,7 +8,7 @@ "test": "./gradlew test", "test:ci": "bun script/test-ci.ts" }, - "version": "7.0.1-rc.4", + "version": "7.3.17", "dependencies": {}, "devDependencies": {}, "peerDependencies": {} diff --git a/script/jetbrains-release-pr.ts b/script/jetbrains-release-pr.ts index 2c2c4d859b..db9d329e7b 100644 --- a/script/jetbrains-release-pr.ts +++ b/script/jetbrains-release-pr.ts @@ -5,7 +5,7 @@ import { $ } from "bun" import semver from "semver" import { parseArgs } from "util" -const pkgfile = new URL("../packages/kilo-jetbrains/package.json", import.meta.url).pathname +const props = new URL("../packages/kilo-jetbrains/gradle.properties", import.meta.url).pathname const log = new URL("../packages/kilo-jetbrains/CHANGELOG.md", import.meta.url).pathname const repo = process.env.GH_REPO ?? process.env.GITHUB_REPOSITORY ?? "Kilo-Org/kilocode" @@ -67,9 +67,9 @@ if (dry) { } await $`git checkout -B ${branch} ${sha}` -await writepkg(ver) +await writeprops(ver) await writelog(ver, entry) -await $`git add packages/kilo-jetbrains/package.json packages/kilo-jetbrains/CHANGELOG.md` +await $`git add packages/kilo-jetbrains/gradle.properties packages/kilo-jetbrains/CHANGELOG.md` const changed = await $`git diff --cached --quiet`.nothrow() if (changed.exitCode !== 0) await $`git commit -m ${`release(jetbrains): v${ver}`}` @@ -203,10 +203,13 @@ function entries(notes: string) { return groups } -async function writepkg(ver: string) { - const pkg = await Bun.file(pkgfile).json() - pkg.version = ver - await Bun.write(pkgfile, `${JSON.stringify(pkg, null, 2)}\n`) +async function writeprops(ver: string) { + const current = await Bun.file(props).text() + const line = `kilo.jetbrains.version=${ver}` + const next = current.match(/^kilo\.jetbrains\.version=/m) + ? current.replace(/^kilo\.jetbrains\.version=.*$/m, line) + : `${current.trim()}\n${line}\n` + await Bun.write(props, next.endsWith("\n") ? next : `${next}\n`) } async function writelog(ver: string, entry: string) { @@ -229,7 +232,7 @@ function regex(ver: string) { function body(ver: string, kind: string, from: string, tag: string, sha: string, notes: string) { return `## Summary - Prepare JetBrains ${kind} release ${ver}. -- Review and edit \`packages/kilo-jetbrains/CHANGELOG.md\` before merging. +- Review \`packages/kilo-jetbrains/gradle.properties\` and edit \`packages/kilo-jetbrains/CHANGELOG.md\` before merging. JetBrains-Version: ${ver} JetBrains-Kind: ${kind} diff --git a/script/jetbrains-release-validate.ts b/script/jetbrains-release-validate.ts index f56f046d6a..2cb64e6eb9 100644 --- a/script/jetbrains-release-validate.ts +++ b/script/jetbrains-release-validate.ts @@ -69,8 +69,8 @@ if (existing.exitCode !== 0) throw new Error(`${tag} does not exist`) const sha = (await $`git rev-list -n 1 ${tag}`.text()).trim() if (sha !== commit) throw new Error(`${tag} points at ${sha}, expected ${commit}`) -const pkg = await Bun.file("packages/kilo-jetbrains/package.json").json() -if (pkg.version !== ver) throw new Error(`packages/kilo-jetbrains/package.json version is ${pkg.version}, expected ${ver}`) +const prop = await props() +if (prop !== ver) throw new Error(`packages/kilo-jetbrains/gradle.properties kilo.jetbrains.version is ${prop}, expected ${ver}`) const changelog = await Bun.file("packages/kilo-jetbrains/CHANGELOG.md").text() if (!changelog.includes(`## [${ver}]`)) throw new Error(`CHANGELOG.md is missing section for ${ver}`) @@ -102,3 +102,11 @@ function need(body: string, key: string) { if (!value) throw new Error(`PR body is missing ${key}`) return value } + +async function props() { + const text = await Bun.file("packages/kilo-jetbrains/gradle.properties").text() + const line = text.split(/\r?\n/).find((item) => item.startsWith("kilo.jetbrains.version=")) + const value = line?.split("=", 2)[1]?.trim() + if (!value) throw new Error("packages/kilo-jetbrains/gradle.properties is missing kilo.jetbrains.version") + return value +} diff --git a/script/publish-start.ts b/script/publish-start.ts index fa6144f164..41333c6e64 100755 --- a/script/publish-start.ts +++ b/script/publish-start.ts @@ -50,14 +50,7 @@ const pkgjsons = await Array.fromAsync( new Bun.Glob("**/package.json").scan({ absolute: true, }), -).then((arr) => - arr.filter( - (x) => - !x.includes("node_modules") && - !x.includes("dist") && - !x.endsWith("/packages/kilo-jetbrains/package.json"), // kilocode_change - ), -) +).then((arr) => arr.filter((x) => !x.includes("node_modules") && !x.includes("dist"))) for (const file of pkgjsons) { let pkg = await Bun.file(file).text() diff --git a/script/publish.ts b/script/publish.ts index e9f1c8b713..9e676d0a13 100755 --- a/script/publish.ts +++ b/script/publish.ts @@ -42,14 +42,7 @@ const pkgjsons = await Array.fromAsync( new Bun.Glob("**/package.json").scan({ absolute: true, }), -).then((arr) => - arr.filter( - (x) => - !x.includes("node_modules") && - !x.includes("dist") && - !x.endsWith("/packages/kilo-jetbrains/package.json"), // kilocode_change - ), -) +).then((arr) => arr.filter((x) => !x.includes("node_modules") && !x.includes("dist"))) for (const file of pkgjsons) { let pkg = await Bun.file(file).text() diff --git a/script/upstream/transforms/preserve-versions.ts b/script/upstream/transforms/preserve-versions.ts index 0c5e9229f6..4fdd568ec8 100644 --- a/script/upstream/transforms/preserve-versions.ts +++ b/script/upstream/transforms/preserve-versions.ts @@ -76,8 +76,6 @@ export async function preserveAllVersions(options: PreserveOptions = {}): Promis info(`Target version: ${targetVersion}`) for await (const path of glob.scan({ absolute: true })) { - if (path.endsWith("/packages/kilo-jetbrains/package.json")) continue - // Skip excluded paths if (excludes.some((ex) => path.includes(ex.replace(/\*\*/g, "")))) { continue