diff --git a/.changeset/autocomplete-not-set-default.md b/.changeset/autocomplete-not-set-default.md deleted file mode 100644 index 6888828276..0000000000 --- a/.changeset/autocomplete-not-set-default.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": minor ---- - -Add a "Not set (use server default)" option to the autocomplete model picker so users can follow the recommended default automatically. Users who previously had the default model pinned only because it was the only thing visible in the dropdown are migrated to "Not set" once. diff --git a/.changeset/calm-agent-variant-clear.md b/.changeset/calm-agent-variant-clear.md new file mode 100644 index 0000000000..9d29ee4c07 --- /dev/null +++ b/.changeset/calm-agent-variant-clear.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Allow clearing agent model and variant overrides from settings. diff --git a/.changeset/calm-background-process-scans.md b/.changeset/calm-background-process-scans.md new file mode 100644 index 0000000000..3b32864b9f --- /dev/null +++ b/.changeset/calm-background-process-scans.md @@ -0,0 +1,6 @@ +--- +"@kilocode/cli": patch +"kilo-code": patch +--- + +Skip inferred background-process port scanning in VS Code sessions to avoid unnecessary Bun subprocess polling. diff --git a/.changeset/calm-kilos-reconnect.md b/.changeset/calm-kilos-reconnect.md new file mode 100644 index 0000000000..950defda6b --- /dev/null +++ b/.changeset/calm-kilos-reconnect.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Show a retryable connection error and preserve unsent prompts when the VS Code background CLI process exits. diff --git a/.changeset/center-history-delete.md b/.changeset/center-history-delete.md deleted file mode 100644 index db671cea3b..0000000000 --- a/.changeset/center-history-delete.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Center local session history delete buttons within their rows. diff --git a/.changeset/history-context-menu-size.md b/.changeset/history-context-menu-size.md deleted file mode 100644 index 80a0fb90dd..0000000000 --- a/.changeset/history-context-menu-size.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Improve the size and readability of the local History session context menu. diff --git a/.changeset/isolate-indexing-worker.md b/.changeset/isolate-indexing-worker.md deleted file mode 100644 index 34f2c9fb10..0000000000 --- a/.changeset/isolate-indexing-worker.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Keep the extension responsive while semantic indexing processes large workspaces. diff --git a/.changeset/jetbrains-active-badges.md b/.changeset/jetbrains-active-badges.md deleted file mode 100644 index 89e19d5f70..0000000000 --- a/.changeset/jetbrains-active-badges.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Show question, permission, plan, and login-required badges for active JetBrains sessions in recent and history lists. diff --git a/.changeset/jetbrains-auto-approve.md b/.changeset/jetbrains-auto-approve.md deleted file mode 100644 index fbedb802c5..0000000000 --- a/.changeset/jetbrains-auto-approve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": minor ---- - -Support toggling auto-approve for permission prompts from the JetBrains chat input. diff --git a/.changeset/jetbrains-history-refresh.md b/.changeset/jetbrains-history-refresh.md deleted file mode 100644 index bf87fff84e..0000000000 --- a/.changeset/jetbrains-history-refresh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Refresh JetBrains history and recent-session rows when active session titles change, and keep pending inactive sessions alive when switching views. diff --git a/.changeset/jetbrains-question-scroll-overlay.md b/.changeset/jetbrains-question-scroll-overlay.md deleted file mode 100644 index ae3d2a9633..0000000000 --- a/.changeset/jetbrains-question-scroll-overlay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Show a question indicator on the JetBrains session scroll overlay when user input is needed. diff --git a/.changeset/jetbrains-resizing-prompt.md b/.changeset/jetbrains-resizing-prompt.md deleted file mode 100644 index 858eccf6a9..0000000000 --- a/.changeset/jetbrains-resizing-prompt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Resize the JetBrains prompt editor as prompt lines are added or removed. diff --git a/.changeset/jetbrains-session-hover.md b/.changeset/jetbrains-session-hover.md deleted file mode 100644 index 181ad76ac4..0000000000 --- a/.changeset/jetbrains-session-hover.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Refine JetBrains session transcript styling with subtler tool rows, prompt-styled user messages, and underlined read file links that open files in the IDE. diff --git a/.changeset/jetbrains-session-links.md b/.changeset/jetbrains-session-links.md deleted file mode 100644 index 63de324a81..0000000000 --- a/.changeset/jetbrains-session-links.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Support opening links in JetBrains session markdown transcripts. diff --git a/.changeset/jetbrains-session-scroll.md b/.changeset/jetbrains-session-scroll.md deleted file mode 100644 index d91e0ec1f9..0000000000 --- a/.changeset/jetbrains-session-scroll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Keep JetBrains chat scrolled to the latest prompt and question updates when following the bottom. diff --git a/.changeset/kilo-embedding-model-presets.md b/.changeset/kilo-embedding-model-presets.md deleted file mode 100644 index ae3e3f912e..0000000000 --- a/.changeset/kilo-embedding-model-presets.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"kilo-code": patch -"@kilocode/cli": patch -"@kilocode/kilo-indexing": patch -"@kilocode/sdk": patch ---- - -Use supported hosted model presets for Kilo indexing and clear obsolete model and dimension overrides. diff --git a/.changeset/mercury-next-edit.md b/.changeset/mercury-next-edit.md deleted file mode 100644 index 976b7990df..0000000000 --- a/.changeset/mercury-next-edit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": minor ---- - -Add Mercury Next Edit as an opt-in autocomplete mode. Predicts multi-line edits beyond the cursor (including off-cursor and pure-insertion edits) and surfaces them with a Tab-to-jump / Tab-to-apply affordance. Select "Mercury Next Edit" under the autocomplete model setting to enable it (requires an Inception API key). Thanks [@tfiras](https://github.com/tfiras)! diff --git a/.changeset/nextedit-via-kilo-gateway.md b/.changeset/nextedit-via-kilo-gateway.md deleted file mode 100644 index 7e6f8ad503..0000000000 --- a/.changeset/nextedit-via-kilo-gateway.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@kilocode/kilo-gateway": minor -"kilo-code": minor ---- - -Support Mercury Next Edit through the Kilo Gateway. The new "Mercury Next Edit via Kilo Gateway" autocomplete model routes Next Edit predictions through your Kilo account (no separate Inception API key required). diff --git a/.changeset/opus-4-8-adaptive-thinking.md b/.changeset/opus-4-8-adaptive-thinking.md new file mode 100644 index 0000000000..30b7026287 --- /dev/null +++ b/.changeset/opus-4-8-adaptive-thinking.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Fix Claude Opus 4.8 reasoning on Amazon Bedrock by treating it as an adaptive thinking model like Opus 4.7. This resolves the "thinking.type.enabled is not supported for this model" error and exposes the full low/medium/high/xhigh/max reasoning effort range. diff --git a/.changeset/quiet-agents-launch.md b/.changeset/quiet-agents-launch.md deleted file mode 100644 index 0fed527487..0000000000 --- a/.changeset/quiet-agents-launch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": minor ---- - -Make the Agent Manager tool available by default in VS Code. diff --git a/.changeset/quiet-dancers-breathe.md b/.changeset/quiet-dancers-breathe.md new file mode 100644 index 0000000000..f432d62cc1 --- /dev/null +++ b/.changeset/quiet-dancers-breathe.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Fix queued plan prompts stalling in VS Code after a completed turn. diff --git a/.changeset/quiet-indexing-startup.md b/.changeset/quiet-indexing-startup.md deleted file mode 100644 index 5a0260139b..0000000000 --- a/.changeset/quiet-indexing-startup.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Keep the extension usable on fresh startup when semantic indexing is enabled globally. diff --git a/.changeset/rename-session-titles.md b/.changeset/rename-session-titles.md deleted file mode 100644 index 03d77bce3f..0000000000 --- a/.changeset/rename-session-titles.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": minor ---- - -Allow renaming sessions with a consistent inline editor in the active chat header and History, using safe bounded titles. diff --git a/.changeset/soft-diff-highlights.md b/.changeset/soft-diff-highlights.md deleted file mode 100644 index 1687eb5e88..0000000000 --- a/.changeset/soft-diff-highlights.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Restore readable diff highlighting and collapsed unchanged sections in VS Code themes. diff --git a/.changeset/steady-indexing-provider.md b/.changeset/steady-indexing-provider.md deleted file mode 100644 index 9afaebdf81..0000000000 --- a/.changeset/steady-indexing-provider.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Prevent saved global indexing provider changes from temporarily reverting in active workspaces. diff --git a/.changeset/steady-review-scroll.md b/.changeset/steady-review-scroll.md new file mode 100644 index 0000000000..aba17d7672 --- /dev/null +++ b/.changeset/steady-review-scroll.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Preserve the Changes review scroll position while agents update files. diff --git a/.changeset/visible-turn-outcomes.md b/.changeset/visible-turn-outcomes.md deleted file mode 100644 index 9697024077..0000000000 --- a/.changeset/visible-turn-outcomes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Warn when a chat turn stops unexpectedly or ends while tracked to-dos remain unfinished. diff --git a/.changeset/witty-cabin.md b/.changeset/witty-cabin.md deleted file mode 100644 index 47dbc193d6..0000000000 --- a/.changeset/witty-cabin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Show running badges on active sessions in JetBrains recent and history lists. diff --git a/.github/workflows/prepare-jetbrains-release.yml b/.github/workflows/prepare-jetbrains-release.yml new file mode 100644 index 0000000000..e9da7833bc --- /dev/null +++ b/.github/workflows/prepare-jetbrains-release.yml @@ -0,0 +1,64 @@ +# kilocode_change - new file +name: prepare-jetbrains-release + +on: + workflow_dispatch: + inputs: + kind: + description: "Release kind" + required: true + type: choice + options: + - rc + - stable + version: + description: "Version, e.g. 7.3.13-rc.1 or 7.3.13" + required: true + type: string + from_tag: + description: "Optional previous tag for changelog range" + required: false + type: string + +permissions: + contents: write + pull-requests: write + +concurrency: + group: prepare-jetbrains-release-${{ inputs.version }} + cancel-in-progress: false + +jobs: + prepare: + if: github.repository == 'Kilo-Org/kilocode' + runs-on: blacksmith-4vcpu-ubuntu-2404 + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + persist-credentials: false + fetch-depth: 0 + + - name: Setup Bun + uses: ./.github/actions/setup-bun + + - name: Setup Git Committer + id: committer + uses: ./.github/actions/setup-git-committer + with: + kilo-maintainer-app-id: ${{ secrets.KILO_MAINTAINER_APP_ID }} + kilo-maintainer-app-secret: ${{ secrets.KILO_MAINTAINER_APP_SECRET }} + + - name: Create release tag and PR + run: | + args=(--kind "$KIND" --version "$VERSION") + if [[ -n "$FROM_TAG" ]]; then + args+=(--from-tag "$FROM_TAG") + fi + bun script/jetbrains-release-pr.ts "${args[@]}" + env: + GH_TOKEN: ${{ steps.committer.outputs.token }} + GH_REPO: ${{ github.repository }} + KIND: ${{ inputs.kind }} + VERSION: ${{ inputs.version }} + FROM_TAG: ${{ inputs.from_tag }} diff --git a/.github/workflows/publish-jetbrains.yml b/.github/workflows/publish-jetbrains.yml index 4db34d33be..0b0f924444 100644 --- a/.github/workflows/publish-jetbrains.yml +++ b/.github/workflows/publish-jetbrains.yml @@ -2,27 +2,65 @@ name: publish-jetbrains on: - push: - tags: - - "jetbrains/*" + pull_request: + types: + - closed + branches: + - main concurrency: - group: publish-jetbrains-${{ github.ref }} + group: publish-jetbrains-pr-${{ github.event.pull_request.number }} cancel-in-progress: false permissions: contents: write + pull-requests: read env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true jobs: publish: - if: github.repository == 'Kilo-Org/kilocode' + if: >- + github.repository == 'Kilo-Org/kilocode' && + github.event.pull_request.merged == true && + startsWith(github.event.pull_request.head.ref, 'jetbrains/release/') && + contains(github.event.pull_request.labels.*.name, 'jetbrains-release') && + github.event.pull_request.head.repo.full_name == github.repository runs-on: blacksmith-8vcpu-ubuntu-2404 steps: - - name: Checkout repository - uses: actions/checkout@v4 + - name: Checkout merged release PR + uses: actions/checkout@v6 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.merge_commit_sha }} + + - name: Setup Bun for validation + uses: ./.github/actions/setup-bun + + - name: Validate release PR and tag + id: release + run: bun script/jetbrains-release-validate.ts --pr "$PR_NUMBER" + env: + GH_TOKEN: ${{ github.token }} + GH_REPO: ${{ github.repository }} + PR_NUMBER: ${{ github.event.pull_request.number }} + + - 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 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 @@ -46,40 +84,6 @@ jobs: sudo apt-get update sudo apt-get install -y patchelf zip - - name: Validate version tag - id: version - run: | - tag="$GITHUB_REF_NAME" - if [[ "$tag" != jetbrains/v* ]]; then - echo "Unsupported tag '$tag'. Expected jetbrains/v." >&2 - exit 1 - fi - - version="${tag#jetbrains/v}" - if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+-rc\.[0-9]+$ ]]; then - { - echo "version=$version" - echo "kind=rc" - echo "marketplace_channel=eap" - echo "cli_channel=rc" - } >> "$GITHUB_OUTPUT" - exit 0 - fi - - if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - { - echo "version=$version" - echo "kind=stable" - echo "marketplace_channel=default" - echo "cli_channel=latest" - } >> "$GITHUB_OUTPUT" - echo "Stable JetBrains Marketplace publishing is implemented but intentionally disabled; use an rc tag such as jetbrains/v7.0.1-rc.1." >&2 - exit 1 - fi - - echo "Unsupported JetBrains plugin version '$version'. Expected jetbrains/vx.y.z-rc.n or jetbrains/vx.y.z." >&2 - exit 1 - - name: Validate publishing secrets run: | missing=0 @@ -100,8 +104,8 @@ jobs: working-directory: packages/kilo-jetbrains run: bun script/build.ts --production --prepare-cli env: - KILO_VERSION: ${{ steps.version.outputs.version }} - KILO_CHANNEL: ${{ steps.version.outputs.cli_channel }} + KILO_VERSION: ${{ steps.release.outputs.version }} + KILO_CHANNEL: ${{ steps.release.outputs.cli_channel }} GH_TOKEN: ${{ github.token }} GH_REPO: ${{ github.repository }} @@ -109,13 +113,26 @@ jobs: working-directory: packages/kilo-jetbrains run: ./gradlew verifyPlugin -Pproduction=true -Pkilo.channel="$CHANNEL" env: - CHANNEL: ${{ steps.version.outputs.marketplace_channel }} + VERSION: ${{ steps.release.outputs.version }} + CHANNEL: ${{ steps.release.outputs.marketplace_channel }} + + - name: Render release notes + working-directory: packages/kilo-jetbrains + run: | + if ! grep -Fq "## [$VERSION]" CHANGELOG.md; then + echo "Missing packages/kilo-jetbrains/CHANGELOG.md entry for $VERSION. Review and merge a release PR before publishing." >&2 + exit 1 + fi + ./gradlew getChangelog --project-version "$VERSION" --no-header --no-empty-sections --output-file=build/release-notes.md + env: + VERSION: ${{ steps.release.outputs.version }} - name: Publish to JetBrains Marketplace working-directory: packages/kilo-jetbrains run: ./gradlew publishPlugin -Pproduction=true -Pkilo.channel="$CHANNEL" env: - CHANNEL: ${{ steps.version.outputs.marketplace_channel }} + VERSION: ${{ steps.release.outputs.version }} + CHANNEL: ${{ steps.release.outputs.marketplace_channel }} JETBRAINS_MARKETPLACE_TOKEN: ${{ secrets.JETBRAINS_MARKETPLACE_TOKEN }} JETBRAINS_CERTIFICATE_CHAIN: ${{ secrets.JETBRAINS_CERTIFICATE_CHAIN }} JETBRAINS_PRIVATE_KEY: ${{ secrets.JETBRAINS_PRIVATE_KEY }} @@ -145,23 +162,30 @@ jobs: - name: Upload to GitHub Release run: | - tag="$GITHUB_REF_NAME" + tag="$TAG" title="JetBrains $VERSION" - notes="JetBrains plugin $VERSION." + flags=(--title "$title" --notes-file "$NOTES") + if [[ "$KIND" == "rc" ]]; then + flags+=(--prerelease) + fi if gh release view "$tag" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then gh release upload "$tag" "$ARCHIVE" --clobber --repo "$GITHUB_REPOSITORY" + gh release edit "$tag" "${flags[@]}" --repo "$GITHUB_REPOSITORY" exit 0 fi - gh release create "$tag" "$ARCHIVE" --title "$title" --notes "$notes" --prerelease --repo "$GITHUB_REPOSITORY" + gh release create "$tag" "$ARCHIVE" "${flags[@]}" --repo "$GITHUB_REPOSITORY" env: GH_TOKEN: ${{ github.token }} - VERSION: ${{ steps.version.outputs.version }} + TAG: ${{ steps.release.outputs.tag }} + VERSION: ${{ steps.release.outputs.version }} + KIND: ${{ steps.release.outputs.kind }} ARCHIVE: ${{ steps.archive.outputs.path }} + NOTES: packages/kilo-jetbrains/build/release-notes.md - name: Upload workflow artifact if: always() uses: actions/upload-artifact@v4 with: - name: kilo-jetbrains-${{ steps.version.outputs.version }} + name: kilo-jetbrains-${{ steps.release.outputs.version }} path: packages/kilo-jetbrains/build/distributions/*.zip if-no-files-found: ignore diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index b0604eb8eb..55f29db1a9 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -125,7 +125,7 @@ jobs: ./scripts/run_eval.sh \ -m kilo/anthropic/claude-sonnet-4.6 \ -d terminal-bench-sample \ - -t "log-summary-date-ranges" \ + --include-task-name "log-summary-date-ranges" \ --job-name smoke-test-log-summary \ --timeout-multiplier 2 diff --git a/.github/workflows/visual-regression.yml b/.github/workflows/visual-regression.yml index d059175adc..6717c0fff5 100644 --- a/.github/workflows/visual-regression.yml +++ b/.github/workflows/visual-regression.yml @@ -26,6 +26,7 @@ jobs: - "packages/kilo-vscode/.storybook/**" - "packages/kilo-vscode/tests/visual-regression*" - "packages/kilo-vscode/tests/permission-dock-dropdown*" + - "packages/kilo-vscode/tests/accessibility*" # kilocode_change - "packages/kilo-docs/public/img/screenshot-tests/**" - ".github/workflows/visual-regression.yml" - name: Check if PR is from a fork @@ -277,7 +278,7 @@ jobs: run: bun run build-storybook working-directory: packages/kilo-vscode - - name: Generate baselines for new/missing stories + - name: Generate baselines and enforce webview accessibility checks # kilocode_change run: bun run test:visual:update working-directory: packages/kilo-vscode env: diff --git a/.kilo/plans/1779979921672-mighty-river.md b/.kilo/plans/1779979921672-mighty-river.md new file mode 100644 index 0000000000..0e67f21ce0 --- /dev/null +++ b/.kilo/plans/1779979921672-mighty-river.md @@ -0,0 +1,37 @@ +# Sample Plan With Todos + +## Goal +Create a clear sample plan that breaks work into actionable todos. + +## Todos + +1. Define the objective + - Clarify the desired outcome. + - Identify the target audience. + - List success criteria. + +2. Gather requirements + - Collect relevant inputs. + - Note constraints and assumptions. + - Identify dependencies. + +3. Break down the work + - Split the goal into smaller tasks. + - Prioritize tasks by importance. + - Estimate effort for each task. + +4. Execute the tasks + - Complete the highest-priority items first. + - Track progress as todos are finished. + - Adjust the plan if new information appears. + +5. Review and validate + - Check that all todos are complete. + - Verify the result matches the goal. + - Document any follow-up work. + +## Acceptance Criteria +- The plan has a clear goal. +- The plan includes a list of actionable todos. +- The todos are ordered logically. +- The plan includes a way to confirm completion. diff --git a/.kilo/plans/1779979972859-crisp-comet.md b/.kilo/plans/1779979972859-crisp-comet.md new file mode 100644 index 0000000000..444d71b8da --- /dev/null +++ b/.kilo/plans/1779979972859-crisp-comet.md @@ -0,0 +1,38 @@ +# Sample Plan With Todos + +## Goal +Create a simple sample plan that demonstrates how to organize work into clear, actionable todos. + +## Implementation Steps + +1. Define the objective + - State the desired outcome in one sentence. + - Identify who the plan is for. + - List the criteria that indicate success. + +2. Gather requirements + - Capture relevant inputs and context. + - Note constraints, assumptions, and dependencies. + - Identify any missing information that may affect execution. + +3. Break down the work + - Split the objective into smaller tasks. + - Order tasks by dependency and priority. + - Keep each todo specific enough to complete independently. + +4. Execute the todos + - Work through the highest-priority tasks first. + - Mark todos complete as progress is made. + - Update the plan if new information changes the scope. + +5. Review the result + - Confirm every todo has been addressed. + - Verify the result matches the original objective. + - Record any follow-up work separately. + +## Acceptance Criteria + +- The plan has a clear goal. +- The plan includes actionable todos. +- The todos are ordered logically. +- The plan includes a review step to confirm completion. diff --git a/.kilo/plans/1779980012659-happy-circuit.md b/.kilo/plans/1779980012659-happy-circuit.md new file mode 100644 index 0000000000..9256b415dd --- /dev/null +++ b/.kilo/plans/1779980012659-happy-circuit.md @@ -0,0 +1,37 @@ +# Sample Plan: Add Todo-Based Workflow + +## Goal +Create a small, traceable workflow for implementing a feature with clear todos, validation steps, and completion criteria. + +## Scope +- Identify the affected package or feature area. +- Make the smallest correct code change. +- Add or update tests only where they verify behavior. +- Run the smallest relevant checks before completion. + +## Todos +- [ ] Inspect the relevant files and existing patterns. +- [ ] Confirm whether the change belongs in Kilo-owned code or shared upstream code. +- [ ] Implement the minimal code change. +- [ ] Add or update targeted tests if behavior changes. +- [ ] Run formatting or linting if the touched package requires it. +- [ ] Run the smallest relevant typecheck or test command. +- [ ] Fix any failures introduced by the change. +- [ ] Summarize changed files and verification results. + +## Implementation Notes +- Prefer Kilo-owned directories for Kilo-specific behavior. +- If shared upstream files must be edited, keep the change narrow and add `kilocode_change` markers where required. +- Avoid broad refactors unless they are necessary for the requested behavior. +- Preserve existing style, naming, and package conventions. + +## Verification +- Run the targeted test for the changed behavior when available. +- Run the package typecheck if TypeScript code changes. +- Run any repo-specific guard required by touched files, such as annotation or source-link checks. + +## Completion Criteria +- The requested behavior is implemented. +- Tests or checks relevant to the change pass, or any inability to run them is documented. +- No unrelated files are modified. +- The final response includes a concise summary and verification status. diff --git a/.kilo/plans/1779980572375-proud-river.md b/.kilo/plans/1779980572375-proud-river.md new file mode 100644 index 0000000000..bb790b5fdb --- /dev/null +++ b/.kilo/plans/1779980572375-proud-river.md @@ -0,0 +1,35 @@ +# Sample Plan + +## Goal +Create a small example feature or change using a clear implementation workflow and tracked todo list. + +## Scope +- Add or update a minimal code path. +- Add focused tests for the changed behavior. +- Run the smallest relevant verification command. +- Summarize the result and any follow-up work. + +## Todo +- [ ] Inspect the relevant files and existing patterns. +- [ ] Identify the smallest safe implementation approach. +- [ ] Make the code change. +- [ ] Add or update tests for the behavior. +- [ ] Run targeted tests or typecheck. +- [ ] Fix any failures introduced by the change. +- [ ] Provide a concise final summary with verification results. + +## Implementation Notes +- Prefer the smallest correct change over broad refactors. +- Preserve existing style and naming conventions. +- Avoid touching unrelated files. +- If shared upstream-owned files are involved, use the repository’s `kilocode_change` marker guidance. + +## Verification +Run the most specific applicable check for the touched area, such as: +- CLI: `bun test ./path/to/test.ts` from `packages/opencode/` +- VS Code extension: `bun run test:unit` from `packages/kilo-vscode/` +- Cross-package changes: `bun run typecheck` from the repo root + +## Risks +- The sample scope may need adjustment once the real target files are known. +- Verification commands depend on which package is touched. diff --git a/.kilo/plans/1779987162764-misty-rocket.md b/.kilo/plans/1779987162764-misty-rocket.md new file mode 100644 index 0000000000..441e2dedde --- /dev/null +++ b/.kilo/plans/1779987162764-misty-rocket.md @@ -0,0 +1,69 @@ +# Plan: Replace Internal SVGLoader Usage + +## Context + +The JetBrains plugin currently imports `com.intellij.util.SVGLoader` in `packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/SvgIconColorizer.kt` and calls `SVGLoader.load(ByteArrayInputStream(patch()), scale.toFloat())` from `SvgIcon.image(Graphics)`. + +Inspection reports this as an internal API usage because `SVGLoader` and its `load(InputStream, float)` method are marked `@ApiStatus.Internal`. + +I checked the local IntelliJ source reference via `$INTELLIJ_REPO=/Users/kirillk/products/intellij-community`: + +- `platform/util/ui/src/com/intellij/util/SVGLoader.kt` +- `platform/util/ui/src/com/intellij/ui/svg/svg.kt` +- `platform/util/ui/src/com/intellij/ui/svg/jsvg.kt` +- `libraries/jsvg/intellij.libraries.jsvg.iml` + +Important findings: + +- IntelliJ `SVGLoader.load(stream, scale)` delegates to internal `loadSvg(...)` in `com.intellij.ui.svg`. +- The actual renderer uses `com.github.weisj:jsvg:2.1.0` and renders into a `BufferedImage` with antialiasing, bicubic interpolation, and pure stroke control. +- Copying `SVGLoader.kt` directly would keep references to other internal IntelliJ APIs (`IconLoader`, `ScaleContext`, `ImageUtil`, `SvgAttributePatcher`, `createJSvgDocument`, `renderSvgWithSize`, cache classes, etc.) and would be broader than needed. + +## Implementation Plan + +1. Add Kilo-owned SVG rendering code under the frontend UI package, for example: + - `packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/SvgLoader.kt` + - Package: `ai.kilocode.client.ui` + - Suggested internal object name: `SvgLoader` + +2. Keep the copied implementation minimal and purpose-specific: + - Accept `InputStream` and `scale: Float`. + - Parse the SVG with `com.github.weisj.jsvg.parser.SVGLoader().load(stream)` or the equivalent public jsvg API available in version `2.1.0`. + - Determine image dimensions from the root SVG `width` and `height` already parsed by existing `SvgIconColorizer.size(...)`, or by passing dimensions into the loader if the public jsvg API does not expose reliable intrinsic size. + - Render into `BufferedImage(width * scale, height * scale, BufferedImage.TYPE_INT_ARGB)` using `Graphics2D` rendering hints matching IntelliJ’s `jsvg.kt`: + - `KEY_ANTIALIASING = VALUE_ANTIALIAS_ON` + - `KEY_INTERPOLATION = VALUE_INTERPOLATION_BICUBIC` + - `KEY_STROKE_CONTROL = VALUE_STROKE_PURE` + - Return `Image`/`BufferedImage`. + +3. If jsvg does not expose intrinsic size cleanly from public API, adjust the API to avoid duplicating SVG parsing: + - Add `width` and `height` parameters to the Kilo loader. + - In `SvgIcon.image(Graphics)`, call the loader with the already-computed `size.first` and `size.second`. + - This is the likely smallest stable solution because current icons already require explicit `width` and `height` for `SvgIconColorizer.size(...)`. + +4. Add the jsvg dependency explicitly to the plugin frontend module instead of relying on the IntelliJ-bundled library: + - In `packages/kilo-jetbrains/gradle/libs.versions.toml`, add `jsvg = "2.1.0"` and `jsvg = { module = "com.github.weisj:jsvg", version.ref = "jsvg" }`. + - In `packages/kilo-jetbrains/frontend/build.gradle.kts`, add `implementation(libs.jsvg)`. + - This follows the package instruction to bundle third-party libraries with the plugin rather than relying on IDE-bundled versions. + +5. Update `SvgIconColorizer.kt`: + - Remove `import com.intellij.util.SVGLoader`. + - Replace `SVGLoader.load(ByteArrayInputStream(patch()), scale.toFloat())` with the Kilo-owned loader call. + - Keep the existing color patching, cache key, scale calculation, and size parsing intact. + +6. Add a focused frontend unit test: + - New test file: `frontend/src/test/kotlin/ai/kilocode/client/ui/SvgIconColorizerTest.kt` or `SvgLoaderTest.kt`. + - Exercise the actual loader/colorizer with a small SVG resource or inline SVG bytes. + - Assert that rendering returns a non-empty image at scale `1f` and `2f`, and that scaled dimensions are correct. + - If testing the colorizer, paint the icon into a `BufferedImage` and verify at least one expected patched pixel color appears. + +7. Run verification from `packages/kilo-jetbrains/`: + - `./gradlew typecheck` + - A targeted frontend test if Gradle supports one cleanly, otherwise `./gradlew test`. + - The requested DevKit internal API inspection is IDE-based; note in final response that the code no longer references `com.intellij.util.SVGLoader`, and typecheck/tests were run. + +## Notes And Risks + +- The user said “copy SaveLoaer”; I interpret this as “copy `SVGLoader`”. The implementation should copy the relevant rendering behavior, not IntelliJ’s full internal `SVGLoader` object, because the full source depends on multiple other internal APIs and cache infrastructure. +- This change is in `packages/kilo-jetbrains/`, a Kilo-owned package, so `kilocode_change` markers are not needed. +- jsvg package names and constructors should be confirmed during implementation against the downloaded dependency/API available to Gradle. If the API differs from IntelliJ source usage, inspect the source jar or compile error and adapt the minimal wrapper accordingly. diff --git a/.kilo/plans/1779987392284-clever-river.md b/.kilo/plans/1779987392284-clever-river.md new file mode 100644 index 0000000000..bc4180b51f --- /dev/null +++ b/.kilo/plans/1779987392284-clever-river.md @@ -0,0 +1,60 @@ +# Remove JetBrains SVG Runtime Colorization + +## Goal +Stop runtime SVG recoloring in the JetBrains plugin and rely on IntelliJ's standard light/dark icon asset resolution. Ensure every SVG asset used by the plugin has a light/dark pair. + +## Findings +- Runtime colorization exists only in `frontend/src/main/kotlin/ai/kilocode/client/ui/SvgIconColorizer.kt`. +- The only production caller is `frontend/src/main/kotlin/ai/kilocode/client/session/scroll/ScrollButtonIcon.kt`. +- `ScrollButtonIcon` colorizes two icons at runtime: + - `/icons/scroll-bottom.svg` + - `/icons/scroll-question.svg` +- Both already have dark variants: + - `scroll-bottom_dark.svg` + - `scroll-question_dark.svg` +- Other used frontend icons already have light/dark pairs: + - `send.svg` / `send_dark.svg` + - `stop.svg` / `stop_dark.svg` + - `shield.svg` / `shield_dark.svg` + - `shield-filled.svg` / `shield-filled_dark.svg` + - `compress.svg` / `compress_dark.svg` + - `chevron-down.svg` / `chevron-down_dark.svg` + - `arrow-up.svg` / `arrow-up_dark.svg` + - `arrow-down-to-line.svg` / `arrow-down-to-line_dark.svg` + - `kilo.svg` / `kilo_dark.svg` + - `kilo-content.svg` / `kilo-content_dark.svg` + - `plus.svg` / `plus_dark.svg` exists, though no current direct source reference was found. + - `kilo@20x20.svg` / `kilo@20x20_dark.svg` exists, though no current direct source reference was found. +- `src/main/resources/META-INF/pluginIcon.svg` is present and has no `pluginIcon_dark.svg`. It is not referenced in source/XML, but JetBrains treats this filename conventionally as plugin metadata/marketplace icon, so it should be paired for completeness. +- The SVG assets use literal colors and no `currentColor`, `