diff --git a/.github/workflows/publish-jetbrains.yml b/.github/workflows/publish-jetbrains.yml index bc1094b11fd..0b0f9244445 100644 --- a/.github/workflows/publish-jetbrains.yml +++ b/.github/workflows/publish-jetbrains.yml @@ -46,8 +46,10 @@ jobs: GH_REPO: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number }} - - name: Save reviewed changelog - run: cp packages/kilo-jetbrains/CHANGELOG.md "$RUNNER_TEMP/jetbrains-CHANGELOG.md" + - name: Save reviewed release metadata + run: | + cp packages/kilo-jetbrains/CHANGELOG.md "$RUNNER_TEMP/jetbrains-CHANGELOG.md" + cp packages/kilo-jetbrains/gradle.properties "$RUNNER_TEMP/jetbrains-gradle.properties" - name: Checkout release tag uses: actions/checkout@v6 @@ -55,8 +57,10 @@ jobs: fetch-depth: 0 ref: ${{ steps.release.outputs.tag }} - - name: Restore reviewed changelog - run: cp "$RUNNER_TEMP/jetbrains-CHANGELOG.md" packages/kilo-jetbrains/CHANGELOG.md + - name: Restore reviewed release metadata + run: | + cp "$RUNNER_TEMP/jetbrains-CHANGELOG.md" packages/kilo-jetbrains/CHANGELOG.md + cp "$RUNNER_TEMP/jetbrains-gradle.properties" packages/kilo-jetbrains/gradle.properties - name: Setup Node uses: actions/setup-node@v4 @@ -107,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 }} @@ -125,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/CHANGELOG.md b/packages/kilo-jetbrains/CHANGELOG.md index 6e145106e57..e30af42193d 100644 --- a/packages/kilo-jetbrains/CHANGELOG.md +++ b/packages/kilo-jetbrains/CHANGELOG.md @@ -2,7 +2,12 @@ ## [Unreleased] -## [0.0.0-dev] +## [7.0.1-rc.4] - 2026-05-29 ### Added -- Initial JetBrains plugin development builds. +- Initial JetBrains plugin release with a native Kilo Code tool window. +- Chat sessions with streamed responses, tool output, reasoning, markdown, todos, and plan follow-ups. +- Native mode/model selection, account sign-in, permission prompts, and question flows. +- Local and cloud session history with search, reopen, rename/delete local sessions, and repository filtering. +- Migration wizard for legacy JetBrains plugin settings and chat history. +- Bundled Kilo CLI runtime for macOS, Linux, and Windows. diff --git a/packages/kilo-jetbrains/RELEASING.md b/packages/kilo-jetbrains/RELEASING.md index 69bea003546..e08d34d98c0 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 cfba42d354d..06e65495e9d 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 d5066fb4c41..ec656f922ff 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/script/jetbrains-release-pr.ts b/script/jetbrains-release-pr.ts index 2c2c4d859b8..db9d329e7ba 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 f56f046d6a5..2cb64e6eb9c 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 +}