Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions .github/workflows/publish-jetbrains.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,21 @@ 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
with:
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
Expand Down Expand Up @@ -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 }}
Expand All @@ -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 }}
Expand Down
9 changes: 7 additions & 2 deletions packages/kilo-jetbrains/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
8 changes: 4 additions & 4 deletions packages/kilo-jetbrains/RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 `<change-notes>`, 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 `<change-notes>`, 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

Expand All @@ -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<version>` 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<version>` 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

Expand Down
9 changes: 5 additions & 4 deletions packages/kilo-jetbrains/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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<version> 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<version> 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()
Expand Down
1 change: 1 addition & 0 deletions packages/kilo-jetbrains/gradle.properties
Original file line number Diff line number Diff line change
@@ -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
Expand Down
19 changes: 11 additions & 8 deletions script/jetbrains-release-pr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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}`}`
Expand Down Expand Up @@ -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) {
Expand All @@ -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}
Expand Down
12 changes: 10 additions & 2 deletions script/jetbrains-release-validate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}`)
Expand Down Expand Up @@ -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
}
Loading