Technical Documentation: Kilo-Org/kilocode
ℹ️ Provenance: Multi-Tier Ingestion · CodeWiki Reference
Overview (README.md)
Kilo Code is an AI coding agent that meets you everywhere you work: VS Code, JetBrains, and the CLI. It's open source with open pricing. You pick from 500+ models, switch between them mid-task, and pay the model provider's rate with zero markup. No API keys required to start.
Installation
Pick where you want to run Kilo.
VS Code
Install the Kilo Code extension directly, or grab it from the VS Code Marketplace. Create an account and you'll have access to 500+ models including GPT-6 Astra, Claude Fable 5.1, Gemini 3.8 Flash, Grok 4.6, and DeepSeek V4.1 Flash, all at provider pricing.
CLI
# npm
npm install @kilocode/cli
# curl
curl -fsSL https://kilo.ai/cli/install | bash
# pnpm
pnpm add @kilocode/cli
# bun
bun add -g @kilocode/cli
# Homebrew (macOS / Linux)
brew install Kilo-Org/tap/kilo
# Arch Linux (AUR)
paru -S kilo-binThen run kilo in any project directory to start.
JetBrains
Install the Kilo Code plugin from the JetBrains Marketplace, or search "Kilo Code" in Settings → Plugins inside any JetBrains IDE.
Cloud Agent
Run Kilo from the web, no local machine needed, at app.kilo.ai/cloud.
Code Reviews
Set up automated AI code reviews on your pull requests at app.kilo.ai/code-reviews.
Install the CLI from GitHub Releases (binaries)
Download the latest binary from the Releases page.
| Platform | Asset |
|---|---|
| Windows (most PCs) | kilo-windows-x64.zip |
| macOS (Apple Silicon) | kilo-darwin-arm64.zip |
| macOS (Intel) | kilo-darwin-x64.zip |
| Linux x64 | kilo-linux-x64.tar.gz |
| Linux ARM | kilo-linux-arm64.tar.gz |
Notes: x64-baseline is a compatibility build for older CPUs without AVX. musl is the statically linked build for Alpine or minimal Docker images without glibc. kilo-vscode-*.vsix is the VS Code extension package, not the CLI. Source code archives are for building from source.
Agents
Kilo ships with specialized agents you switch between depending on the task. You can also build your own custom agents.
- Code - The default. Implements and edits code from natural language.
- Plan - Designs architecture and writes implementation plans before any code gets written.
- Ask - Answers questions about your codebase without touching any files.
- Debug - Troubleshoots and traces issues.
Learn more about agents and custom agents.
What it does
- Code generation from natural language, across multiple files.
- Inline autocomplete with ghost-text suggestions and tab to accept.
- Self-checking so the agent reviews and corrects its own work.
- Terminal and browser control to run commands and automate the web.
- Kilo Marketplace to install agents, skills, MCP servers, and plugins that extend what the agent can do.
- 500+ models with mid-task switching, so you can match latency, cost, and reasoning to the job.
Autonomous Mode (CI/CD)
Run kilo run with --auto for fully autonomous operation with no prompts, built for CI/CD pipelines:
kilo run --auto "run tests and fix any failures"--auto auto-approves permission prompts unless a rule explicitly denies the action. Only use it in trusted environments.
Documentation
For configuration and everything else, head over to the docs.
Contributing
Contributions are welcome from developers, writers, and everyone in between. Start with the Contributing Guide for environment setup, coding standards, and how to open a pull request. See RELEASING.md for the VS Code extension and CLI release process, and packages/kilo-jetbrains/RELEASING.md for the JetBrains plugin.
Please review our Code of Conduct before getting involved.
License
MIT. You're free to use, modify, and distribute this code, including commercially, as long as you keep the attribution and license notices. See License.
FAQ
Where did Kilo CLI come from?
Kilo CLI is a fork of OpenCode, enhanced to work within the Kilo agentic engineering platform.
Join the community Discord | X | Reddit
Community Triage (`docs/community-triage.md`)
Community triage
How we handle pull requests and issues from people outside the Kilo team.
The goal is simple. Maintainers see the community work that matters, and contributors know what happens next.
Background: Slack discussion.
Overview
flowchart LR
A[PR or issue opened] --> B[community-label.yml]
B --> C[Labels: community, needs-triage,<br/>priority:*, first-time-contributor, area:*]
C --> D[community-sweep.yml<br/>Mon + Thu 17:00 UTC]
D --> E[Status labels synced]
D --> F[Queue posted to job summary and Slack]
F --> G[Tuesday: Bruno]
F --> H[Friday: Andrea]
G --> I[Review, label, comment]
H --> I
I --> DTwo workflows do the work. Both use script/kilocode/community-triage.ts. A third runs the tests of that script.
| Workflow | Runs | Does |
|---|---|---|
community-label.yml |
When a PR or issue opens or is edited | Adds community, needs-triage (new items only, not reopened ones), first-time-contributor, area:* and, for PRs, priority:* labels |
community-sweep.yml |
Monday and Thursday, 17:00 UTC, or by hand | Syncs status labels, first-time-contributor and quick-win, adds a missing priority, posts the queue |
community-triage-test.yml |
On PRs that change the script, its tests or the community workflows | Runs the unit tests |
The sweep runs the evening before each maintainer slot. Andrea starts Friday and Bruno starts Tuesday with a fresh queue.
Closing
Only one workflow closes PRs: kilo-auto-close.yml. The sweep and the label workflow close and remove nothing. They only add and remove labels, and the sweep posts the queue.
kilo-auto-close.yml runs every day at 06:00 UTC and is controlled by the single variable KILO_AUTO_CLOSE_ENABLED:
| PR | Closed when |
|---|---|
Has keep-open |
Never. Issues with keep-open are also skipped |
Has awaiting-contributor |
No activity for 14 days. A reply or a push resets the clock |
| Any other PR | No activity for 30 days |
Issues with no activity for 60 days are closed too. A close comment explains the reason.
KILO_AUTO_CLOSE_ENABLEDmust be exactlytrueto close. Any other value makes the workflow log what it would close, and do nothing else. A manual run uses its "dryRun" box instead.- The sweep sets
awaiting-contributor.keep-openis set by hand. The workflow reads both labels at run time, so a label that is a few days old does not close a PR that was active since.
Paused: opencode v2 migration
The team is migrating to opencode v2, and community reviews are paused until further notice. A community PR must not be closed because nobody had time to answer it. So KILO_AUTO_CLOSE_ENABLED must be kept set to false while the pause lasts. If it is set to true, kilo-auto-close.yml closes PRs, and the awaiting-contributor rule closes them after 14 days with no warning. Any other value, including unset, closes nothing.
- Labels, priorities and the queue keep working.
- To resume, set the variable to
true(gh variable set KILO_AUTO_CLOSE_ENABLED --body true) and remove this note. - To check what would be closed first, run "kilo-auto-close" by hand with "dryRun" ticked.
Who is a maintainer
An author or commenter is a maintainer when one of these is true:
- GitHub shows them as
OWNER,MEMBERorCOLLABORATOR. - The secret
COMMUNITY_TRIAGE_MEMBER_TOKEN(read:org) shows they are in the org. - Their login is in
.github/community-maintainers.json.
The default token cannot see private org members. They look like normal contributors. The member token fixes that, so it is needed. If the secret is missing or empty, the label job and the sweep fail with a clear message, so team PRs are not labeled as community. Org members are never listed in the file.
Bots are ignored.
The list of extra maintainers
.github/community-maintainers.json holds logins that count as maintainers but are not in the org: bot and agent accounts, and people outside the org. It has one key, logins, with a list of GitHub logins. The list must be sorted, in lower case and without duplicates. A test checks this.
{
"logins": ["some-agent-account", "someone-outside-the-org"]
}- Change the list with a normal PR.
- The file is public. Do not add org members. The member token finds them, and their membership may be private.
- One file serves every repo. The community dashboard reads the same file for its four repos, so the two tools agree on who is a maintainer.
- The dashboard's reviewer list is separate. It says who can be assigned reviews, not who counts as a maintainer.
Labels
Set by the workflows:
| Label | Meaning |
|---|---|
community |
Author is not a maintainer |
area:vscode, area:cli, area:agent-manager, area:jetbrains, area:desktop, area:docs, area:gateway, area:sdk, area:ui, area:i18n |
Part of the repo. Comes from the title scope (fix(vscode): ...), a product name in the title ("Kilo Desktop", "Agent Manager" or "JetBrains"), the changed paths, or the issue "Component" dropdown |
first-time-contributor |
First contribution to this repo. See First-time contributors |
quick-win |
Small, low-risk PR. See Quick wins |
priority:p1, priority:p2, priority:p3 |
Set from the title when a community PR opens. See Priority |
needs-triage |
A maintainer should look: a new PR, or the contributor replied or pushed |
awaiting-contributor |
A maintainer reacted last. After 14 days with no activity, kilo-auto-close.yml closes the PR, if closing is on |
Set by hand:
| Label | Meaning |
|---|---|
keep-open |
We want to keep this PR. It is never auto-closed. After 14 days of silence it shows in the digest under "Adopt" |
priority:p0 to priority:p3 |
Change the priority by hand. P0 (critical) is only ever set by hand. The sweep never changes an existing priority |
The sweep owns the status labels, first-time-contributor and quick-win. It adds and removes them on its own. Do not manage them by hand.
The sweep also removes community, first-time-contributor, quick-win and the status labels from open PRs whose author is a maintainer. This fixes labels set before the maintainer list was known. It only handles PRs.
area:* labels are only added, never removed. Fix a wrong one by hand. On every run the sweep also adds an area for a product name in the title of each open community PR.
Whose turn is it
The sweep reads the comments, reviews, review replies, commits and reopen events of each open community PR. Drafts are skipped. A reopen by the author counts as a reply. The sweep ignores commit dates more than 5 minutes in the future.
The sweep reads only the latest events. If it finds no maintainer reaction on a PR with more events than it can read, it labels the PR needs-triage so a person decides.
stateDiagram-v2
[*] --> triage: opened, no maintainer reaction
triage --> awaiting: maintainer comments or requests changes
triage --> approved: maintainer approves
awaiting --> review: contributor comments or pushes
review --> awaiting: maintainer comments or requests changes
review --> approved: maintainer approves
approved --> review: contributor pushes again
awaiting --> closed: 14 days, not keep-open, closing on
awaiting --> adopted: 14 days, keep-open
adopted --> [*]: team re-implements or fixes it
closed --> [*]| State | Label | Rule |
|---|---|---|
| triage | needs-triage |
No maintainer reaction yet, and no keep-open label |
| review | needs-triage |
The contributor acted after the last maintainer reaction, or a keep-open label exists |
| approved | none | The last maintainer reaction is an approval |
| awaiting | awaiting-contributor |
The last maintainer reaction asked for something and the contributor has not answered |
The 14 day clock starts at the time of the last maintainer reaction.
Priority
Every community PR gets a priority label when it opens, so the queue can be sorted at once. The label workflow sets it. The sweep adds it to PRs that have none. Other tools can read the same label.
The type of a PR decides the label:
| Type | Label |
|---|---|
| Fix | priority:p1 |
| Feature | priority:p2 |
| Other | priority:p2 |
| Docs | priority:p3 |
The first rule that fits decides the type:
- The title starts with
fix,fixes,bugfix,hotfixorrevert: fix. Or withdocsordocumentation: docs. Or withfeatorfeature: feature. - The PR has the label
bug: fix. Ordocumentationordocs: docs. Orenhancementorfeature: feature. area:docsis the only area label: docs.- The title starts with
add,adds,supportorimplement: feature. - Nothing fits: other.
So a PR titled Add docs for X with the documentation label is docs, not a feature. P0 is never automatic.
To change a priority, edit the label on GitHub. The sweep never changes an existing priority, even when the title changes. Priority does not mean the PR is triaged. A PR is triaged when a maintainer reacts, or when it has keep-open.
First-time contributors
A warm first reply matters most for people who are new here.
- GitHub marks an author as
FIRST_TIME_CONTRIBUTORorFIRST_TIMERuntil one of their PRs is merged. These PRs and issues getfirst-time-contributor. - The label is set when the item opens or is edited. The sweep keeps it in sync on PRs, and removes it after the first merge. Issues keep the label.
- The digest adds "first-time contributor" next to these PRs, and the Slack summary shows how many there are.
- First-time contributors often need a maintainer to approve their workflow runs before CI starts. Approve the runs early. Few checks on a PR can mean this.
Quick wins
quick-win marks PRs that are small and low-risk, so a maintainer can review them in minutes. It does not mean "merge without review". The sweep sets it when all of these are true:
- The PR is not a draft, its author is a community member, and it is not waiting for the contributor.
- The last commit has passing checks, and GitHub reports the PR as mergeable.
- No changed file is risky:
.github/,.kilo/,script/,patches/,packages/kilo-gateway/,package.jsonorbun.lock. - One of these shapes fits:
| Shape | Rule |
|---|---|
| Docs only | Every file is a .md or .mdx file, or is under docs/ or packages/kilo-docs/. Files under .kilo/ and .changeset/ do not count as docs. At most 150 changed lines |
| Tests only | Every file is a test file. At most 150 changed lines |
| Small change | At most 50 changed lines in at most 3 files |
The sweep removes the label when a PR stops fitting, for example after a new push or when checks fail. A PR that GitHub has not yet checked for conflicts misses the label until the next sweep.
A quick win can still need a decision. A new provider docs page is small, but the team still has to keep it up to date.
The digest lists quick wins in their own section, right after "Adopt".
The 14 day rule
When a PR has been awaiting-contributor for 14 days with no activity:
| PR | Result |
|---|---|
Has keep-open |
Stays open and shows in the digest under "Adopt". Add it to the standup doc and pick an owner |
| Anything else | Closed by kilo-auto-close.yml with a comment, when closing is on. See Closing |
The sweep itself closes nothing and posts no warning comment. The digest shows the days waiting, so a maintainer can still reply before day 14.
The digest
Each sweep writes a queue to the job summary, and to Slack. It lists the open community PRs in these sections. An empty section is left out. Each section shows at most 15 PRs, and a line with the number of the others.
| Section | PRs |
|---|---|
| Adopt | keep-open PRs with no contributor reply for 14 days. The team adopts them or lets them go |
| Quick wins | PRs with quick-win that are not waiting for the contributor |
| Needs triage | No maintainer has reacted yet |
| Contributor replied, needs review | The contributor answered after the last maintainer reaction |
| Approved, ready to merge | The last maintainer reaction is an approval |
| Waiting for contributor | Days waiting. Longest wait first |
A PR can be in "Quick wins" and in its state section. The digest marks first-time contributors and PRs with failing checks next to the PR. Adopt and Quick wins follow the keep-open and quick-win rules. The other sections use the same state rules as the status labels. needs-triage covers both "Needs triage" and "Contributor replied, needs review", because a maintainer should look in both cases.
The maintainer routine
Open the latest "Community sweep" run. The job summary has the queue. A copy goes to Slack when a Slack secret is set.
- Adopt: pick an owner and add the PR to the standup doc.
- Quick wins: review these first. They are the fastest way to clear the queue.
- Needs triage: decide. Comment on it, or add
keep-open. Change the priority if it is wrong. Not sure? Put it in the standup doc. - Needs review: the contributor replied. Review again.
- Approved: merge.
- Waiting for contributor: nothing to do.
Greet first-time contributors first, and approve their workflow runs.
Friday and Tuesday are three to four days apart. This gives contributors time to reply between reviews.
Useful searches:
- All community PRs:
is:pr is:open label:community - Needs a maintainer:
is:pr is:open label:needs-triage - One area:
is:pr is:open label:community label:area:vscode - Quick wins:
is:pr is:open label:quick-win - First-time contributors:
is:pr is:open label:first-time-contributor
Slack
The sweep can post the queue to Slack. Slack is optional.
- Bot token and channel set: the channel gets one short message with the title, a count per section and a link to the run. Each section is a reply in its thread.
- Only the webhook set: the channel gets the whole queue as one message.
- The bot post fails: the sweep still finishes and logs a warning with the Slack error. If not even the summary was posted, the whole queue goes through the webhook when one is set. If only a thread reply fails, the sweep warns and keeps the rest, so the queue is not posted twice.
- Manual runs: the "slack" box is ticked by default. Untick it to run without posting. Scheduled runs always post.
Issues
New issues get the community label, needs-triage, first-time-contributor for new authors and an area:* label. The area comes from the required "Component" dropdown in the bug and feature templates. If there is no answer, for example "Other / not sure" or an issue that skips the form, a product name in the title is used instead. The sweep only handles PRs, so older issues get their labels when they are edited, and needs-triage on an issue stays until you remove it by hand.
Setup
| Name | Kind | Needed | Purpose |
|---|---|---|---|
KILO_AUTO_CLOSE_ENABLED |
Variable | No | true lets kilo-auto-close.yml close PRs and issues. Set to false while community reviews are paused |
COMMUNITY_TRIAGE_MEMBER_TOKEN |
Secret | Yes | Token with read:org. Finds private org members |
COMMUNITY_TRIAGE_SLACK_TOKEN |
Secret | No | Slack bot token (xoxb-, scope chat:write). Posts a summary and threads the lists. The bot must be in the channel |
COMMUNITY_TRIAGE_SLACK_CHANNEL |
Secret | No | Channel ID (C...) for the bot token |
COMMUNITY_TRIAGE_SLACK_WEBHOOK |
Secret | No | Posts the whole queue as one message. Used when there is no bot token, or when the bot post fails |
Labels are created by the workflows, and their color and description are kept in line with the list in the script. Run "Community sweep" once by hand after merge to create them and label the open PRs.
Safety
community-label.ymlusespull_request_target. It checks out the base branch only. It never runs PR code.- The sweep and the label workflow close nothing. A test checks that the sweep script has no close call.
- Closed PRs can be reopened by the contributor.
Jetbrains Vscode Settings Parity (`docs/jetbrains-vscode-settings-parity.md`)
JetBrains ↔ VS Code Settings Parity: Easy Wins
How parity works here
Both clients edit the same shared kilo.json through the CLI. So any setting whose
behavior lives entirely in the CLI is an "easy win" for JetBrains: the CLI already does the
work, JetBrains just needs a UI row that writes the config key. No CLI changes, no new feature.
Structural gap: today JetBrains only has Models / Providers / Agent Behavior / Profile
settings pages. There is no General / Display / Experimental / Context / Checkpoints page.
The lift for most easy wins is:
- Add a new
Configurablepage (using existingsettings/base/primitives —BaseSettingsUi,SettingsRow,SettingsToggle,SettingsListPanel), register it inkilo.jetbrains.frontend.xml. - Extend the
buildConfigPatchallowlist inKiloCliDataParser.kt(currently onlymodel,small_model,subagent_model,subagent_variant,default_agent) and add
boolean/number JSON serialization — it currently only emits strings. - Add localized labels to
KiloBundle.properties.
No CLI/SDK change and no new runtime feature.
Excluded from "easy"
| Excluded | Reason |
|---|---|
| Agent Behavior, Auto-Approve | Skipped by request |
| Indexing, Sandboxing | Imply enabling new features |
| Browser Automation | Playwright feature not present in JetBrains |
| Autocomplete (provider/model/toggles) | No autocomplete feature (flags exist only as migration stubs) |
| Agent Manager (auto-branch, prefix) | VS Code-only feature |
| Notification/attention sounds | Client must implement sound playback |
maxCost alert |
Client must render the alert UI |
Commit message (commit_message.prompt, languageCommitMessage) |
No commit-message generation feature in JetBrains |
language, fontSize, diff.renderMarkdown, agentWorkStyle |
VS Code-webview/onboarding-specific |
Tier 1 — Genuinely easy (CLI does all the work; just add UI + config key)
| Setting | Config key | Type | Suggested page |
|---|---|---|---|
| Hide prompt-training models | hide_prompt_training_models |
bool | Models |
| Enable checkpoints | snapshot |
bool | new "Checkpoints" |
| Auto-compaction | compaction.auto |
bool | new "Context" |
| Compaction threshold % | compaction.threshold_percent |
number | Context |
| Prune on compaction | compaction.prune |
bool | Context |
| Watcher ignore patterns | watcher.ignore |
string[] | Context (list editor) |
| Display username | username |
string | new "Display/General" |
| Share mode | share |
enum (manual/auto/disabled) | new "Experimental" |
| Remote control on startup | remote_control |
bool | Experimental |
| Formatter integration | formatter |
bool | Experimental |
| LSP integration | lsp |
bool | Experimental |
| Batch tool | experimental.batch_tool |
bool | Experimental |
| Native notebook tools | experimental.native_notebook_tools |
bool | Experimental |
| Continue loop on deny | experimental.continue_loop_on_deny |
bool | Experimental |
| MCP timeout | experimental.mcp_timeout |
number | Experimental |
| Per-tool toggles | tools.<name> |
bool | Experimental |
Claude Code compatibility: lives under "Agent Behavior" in VS Code, but in JetBrains the
entire backend (KiloClaudeCompatSettings + RPC getter/setter + spawn-env wiring) already
exists with no UI. Exposing it is the single lowest-effort item — just a checkbox bound to the
existing RPC, no config plumbing.
⚠️ Hold back experimental.image_generation (adds a tool) — arguably "enabling a feature."
Tier 2 — Config is easy, but honoring it needs JetBrains rendering work
| Setting | Config key | Extra work |
|---|---|---|
| Reasoning blocks | reasoning_display (expanded/preview/headline); legacy auto_collapse_reasoning maps to preview |
Reasoning-card default state per mode |
| Terminal command display | terminal_command_display (expanded/collapsed) |
Tool-card default state |
| Code edit display | code_edit_display (expanded/collapsed) |
Edit-card default state |
Recommendation
Add a new "General/Display" page + "Experimental" page driven entirely by CLI config,
seeded with Tier 1 behavioral settings, plus wire the already-built Claude Code compat
toggle. This closes most of the non-feature gap with:
- zero CLI/SDK changes,
- one allowlist extension in
KiloCliDataParser.buildConfigPatch(add keys + boolean/number serialization), - reuse of existing
settings/base/UI primitives and test patterns (FakeAppRpcApi
frontend test +MockCliServerbackend body assertion).
Do Tier 2 (reasoning/terminal/edit display defaults) after Tier 1, since it touches the
session-rendering layer rather than being pure config.
Packages Kilo Vscode Docs Opencode Migration Plan (`packages/kilo-vscode/docs/opencode-migration-plan.md`)
Feature Parity Plan — Kilo Code VS Code Extension (Rebuild)
Overview
This extension is a ground-up rebuild of the old Kilo Code extension using Kilo CLI as the backend. Rather than migrating the old extension's codebase, we started fresh with a Solid.js webview, a CLI server manager, and a message-based protocol between extension host and webview. This new extension lives in the kilocode monorepo.
This document tracks remaining work needed for feature parity with the old extension. Each feature links to its detailed parity requirement doc. Features sourced from the GitHub project board include issue links.
Chat UI Feature Parity
| Feature | Remaining Work | Backend | Priority |
|---|---|---|---|
| Browser Session Controls | In-chat browser controls, action replay, screenshot viewing | CLI-side (if browser tool exists) + webview | P3 |
| Checkpoint & Task Management | Checkpoint restore UI, navigation, diff viewing, "See New Changes" buttons | CLI session undo/redo/fork + extension git integration | P1 |
| Mermaid Diagram Features | Mermaid rendering, "Fix with AI" button, copy, open-as-PNG | Webview-only (rendering); CLI for "Fix with AI" | P2 |
| Message Editing & Management | Inline editing, deletion, timestamp display, redo-previous-message (up-arrow) | CLI session fork/undo for edit semantics | P1 |
| Special Content Types | Copy button on error cards, dedicated MCP tool/resource rows, open-markdown-preview button | Mixed: CLI for MCP data; webview for rendering | P1 |
Non-Agent Feature Parity
| Feature | Remaining Work | Backend | Priority |
|---|---|---|---|
| Authentication & Enterprise | Org feature flags, MDM policy enforcement | CLI handles its auth; extension handles org/MDM | P1 |
| Auto-Purge | Scheduled cleanup of old session/task storage | Extension-side (storage ownership TBD) | P3 |
| Cloud Task Support | Upload local sessions to cloud, real-time sync, conflict resolution | Kilo cloud API + CLI; extension provides UI | P2 |
| Code Reviews | Local review mode, automated AI review of uncommitted/branch changes | CLI (partial); extension for VS Code review UX | P2 |
| Codebase Indexing & Semantic Search | Vector indexing, semantic search, embeddings infrastructure | CLI has grep/glob endpoints; semantic indexing is extension or cloud | P2 |
| Contribution Tracking | AI attribution tracking, line fingerprinting, reporting | Extension-side | P3 |
| Custom Commands | Slash command system, project-level command discovery, YAML frontmatter support | CLI has custom commands; extension provides UI entry points | P2 |
| Marketplace | Catalog, install, update capabilities (toolbar button exists but renders a stub) | Extension-side | P2 |
| MCP & MCP Hub | MCP configuration UI (add/edit/delete servers), tool allowlisting | CLI owns MCP lifecycle; extension provides config UI | P1 |
| Repository Initialization | /init command support for setting up agentic engineering | CLI /init endpoint; extension provides UI trigger | P3 |
| Rules & Workflows | Workflow management UI (rules subtab exists, workflows subtab is a stub) | CLI owns rules runtime; extension provides management UI | P3 |
| Settings Sync | VS Code Settings Sync allowlist registration | Extension-side (VS Code API) | P3 |
| Settings UI | Terminal and Prompts tabs (show "Not implemented"), Workflows subtab stub | CLI exposes config; extension provides settings forms | P1 |
| Skills System | Skill execution, discovery, hot-reload (config UI for paths/URLs exists) | CLI has skills runtime; extension provides packaging/UI | P2 |
| Speech-to-Text | Voice input, streaming STT | Webview (mic capture); CLI-compatible STT optional | P3 |
Agent Behaviour Tab Parity
The "Agent Behaviour" settings tab contains 5 sub-tabs in both the legacy and new extensions. The legacy tab was a combined 2800+ lines of UI; the new tab is ~820 lines. Each sub-tab has its own parity doc.
| Sub-Tab | Remaining Work | Priority |
|---|---|---|
| Modes / Agents | Core CRUD done (PR #7225). Remaining: when-to-use, system prompt preview, import/export, default variant, hidden/disable, org features | P2 |
| MCP Servers | Add/edit servers, restart, per-server timeout, expandable detail (tools/resources/logs/auth) | P2 |
| Rules & Workflows | Rules: description text, global/workspace separation, per-rule toggles, new file creation, auto-discovery. Workflows: entire sub-tab is a stub | P2/P3 |
| Skills | Minor gaps: project/global separation, mode badge per skill. Covered by Skills System | P2 |
Project Board Issues
Open issues from the GitHub project board not covered by the feature docs above. Each item has its own detailed doc.
UI Polish & Bugs
| Feature | Remaining Work | Priority |
|---|---|---|
| Markdown Rendering Improvements | Add CSS for heading sizes, weights, spacing so headings look different from body text | P1 |
| Approval Box Missing Full Path | Always show full absolute path for out-of-workspace permission requests | P1 |
| Profile View Missing Back Button | Add back button to Profile view header matching Settings view pattern | P2 |
| Chat Input Overflow on Narrow Sidebar | Make chat input toolbar wrap when sidebar is too narrow | P2 |
Features
| Feature | Remaining Work | Priority |
|---|---|---|
| File Attachments | Add non-image file attachment via button, drag-and-drop, or file picker | P2 |
| Remember Last Model Choice | Persist last-used model and pre-select it for new sessions | P2 |
| Expandable MCP Tools | Make MCP tool rows expandable to show inputs/outputs like regular tools | P2 |
| Session Preview Improvements | Evaluate showing first message snippet or improving title generation | P2 |
Error Handling & Reliability
| Feature | Remaining Work | Priority |
|---|---|---|
| Pre-Release Switch CPU Spike | Fix race condition / process conflict when switching release ↔ pre-release | P0 |
| Extension View Doesn't Refresh on Update | Force webview reload when extension version changes | P1 |
| Propagate CLI Errors to UI | Surface CLI stderr errors in chat or as VS Code notifications | P1 |
| CLI Startup Errors | Detect CLI process exit before connection; show error with details and retry | P1 |
| Autocomplete Settings Link Broken | Fix "settings" link in autocomplete broken notice; fix missing default model | P1 |
Infrastructure / Refactoring
| Feature | Remaining Work | Priority |
|---|---|---|
| Show Changelog on Update | Detect version change on activation and offer "What's New" notification | P3 |
| Publish to OpenVSX | Add ovsx publish step to CI/CD pipeline after VS Code Marketplace publish |
P3 |
| HTTP Request Timeouts | Add timeouts to SDK calls (only health check has timeout currently) | P1 |
| VSCode Error Notifications | Error notifications for CLI start failure, SSE disconnect | P1 |
| Dedicated Output Channel | General "Kilo Code" output channel and centralized logging utility | P2 |
CLI-Side (tracked here for awareness)
| Feature | Remaining Work | Priority |
|---|---|---|
| /init Pre-Commit Secret Check | Check for secret scanning hooks in /init; suggest adding one if missing |
P2 |
| Plan Mode Over-Prompting | Fix Plan mode system prompt so agent stops repeatedly asking to implement | P1 |
| Architect Mode / Plan Files | Export plan as .md to /plans/ directory from Plan mode |
P2 |
Pre-Production Checklist
Before publishing this extension to the VS Code Marketplace or deploying to users, verify every item below.
Security
- Review and tighten CSP — The current policy in
KiloProvider._getHtmlForWebview()has several areas to audit:style-src 'unsafe-inline'is broadly permissive — investigate whether nonce-based style loading is feasible now that kilo-ui styles are bundledconnect-src http://127.0.0.1:* http://localhost:*allows connections to any localhost port — tighten to the actual CLI server port once known at runtimeimg-src … https:allows images from any HTTPS origin — scope to${webview.cspSource} data:unless external images are explicitly needed'wasm-unsafe-eval'inscript-srcwas added for shiki — confirm it is still required and document the reasonws://connections to any localhost port — same concern asconnect-src
- Validate
openExternalURLs — TheopenExternalhandler passes any URL from the webview directly tovscode.env.openExternal()with no allowlist or scheme check. Restrict tohttps:(and possiblyvscode:) schemes, or allowlist specific hosts - Audit credential storage — CLI stores credentials as plaintext JSON with
chmod 0600. Evaluate whether VS Code'sSecretStorageAPI should be used for extension-side secrets, and document the threat model for CLI-managed credentials - Audit workspace path containment — CLI's path traversal checks are lexical only; symlinks and Windows cross-drive paths can escape the workspace boundary. Determine if additional hardening (realpath canonicalization) is needed before production
Reliability
- VS Code error notifications — Critical errors (CLI missing, server crash, connection lost) need VS Code-native notifications (details). Users get no feedback if the webview is hidden
- HTTP request timeouts — SDK calls need configurable timeouts (details)
Testing
- Test coverage — Only one test file exists (
extension.test.ts). Add integration tests for: server lifecycle, SSE event routing, message send/receive, permission flow, session management - Multi-theme visual check — Verify the webview renders correctly in at least one light theme, one dark theme, and one high-contrast theme
- Multi-platform smoke test — Test on macOS, Windows, and Linux. Particularly: CLI binary provisioning, path handling,
chmod-based credential protection on Windows
Packaging & Marketplace
- Bundle size audit — With kilo-ui and its transitive dependencies (shiki, marked, katex, dompurify, etc.) now bundled, measure
dist/webview.jssize and verify the total.vsixpackage size is acceptable -
.vscodeignorereview — Ensure only necessary files are included in the package (nodocs/,src/, test artifacts, or development scripts) - Marketplace metadata — Verify
README.md,CHANGELOG.md, publisher name, extension icon, andpackage.jsonfields (displayName,description,categories,keywords,repository) are production-ready -
activationEventsreview — Confirm the extension only activates when needed (not*), to avoid impacting VS Code startup time - Minimum VS Code version — Verify
engines.vscodeinpackage.jsonmatches the minimum API features actually used
Logging & Observability
- Dedicated output channel — All logging currently goes to
console.logmixed with other extensions (details). Create a dedicated "Kilo Code" output channel before production - Remove or guard verbose logging — Many
console.logcalls with emojis and debug detail exist inKiloProvider.ts. Gate behind a debug flag or move to the output channel at appropriate log levels
Implementation Notes
Architecture
- Solid.js (not React) powers the webview. JSX compiles via
esbuild-plugin-solid. All webview components use Solid's reactive primitives (signals, createEffect, etc.). - Two separate esbuild builds: extension (Node/CJS) and webview (browser/IIFE), configured in
esbuild.js. - No shared state between extension and webview. All communication is via
vscode.Webview.postMessage()with typed messages defined inmessages.ts. Provider hierarchy:ThemeProvider → DialogProvider → VSCodeProvider → ServerProvider → LanguageBridge → MarkedProvider → ProviderProvider → SessionProvider → DataBridge. - CLI backend owns: agent orchestration, MCP lifecycle, tool execution, search/grep/glob, session storage, permissions runtime, custom commands, skills, and fast edits.
- Extension owns: VS Code API integrations (code actions, inline completions, terminal, SCM, settings sync), webview rendering, auth mediation, and any feature not supported by CLI.
kilo-ui Shared Library
- kilo-ui shared library: The webview now heavily uses
@kilocode/kilo-uifor UI components. ADataBridgecomponent in App.tsx adapts the session store to kilo-ui'sDataProviderexpected shape, enabling shared components like<KiloMessage>to work with the extension's data model.
Key Differences from Old Extension
- No
Task.tsorwebviewMessageHandler.ts— the CLI server replaces the old in-process agent loop. - Permissions flow through CLI's ask/reply model, not extension-side approval queues. Permissions are rendered through kilo-ui's DataProvider pattern, not a standalone PermissionDialog.
- Session history is CLI-managed, not stored in VS Code global state.
- MCP servers are configured and managed by the CLI, not the extension.
Packages Kilo Vscode Docs Agent Behaviour Mcp Server Creation (`packages/kilo-vscode/docs/agent-behaviour/mcp-server-creation.md`)
MCP Servers Sub-Tab Parity
Priority: P2
The legacy MCP Servers sub-tab (842 lines) had full server lifecycle management. The new sub-tab supports viewing, removing, and toggling servers with live connection status.
Side-by-Side Comparison
| Feature | Legacy | New |
|---|---|---|
| View server list | Name + source badge + status dot | Name + command/URL |
| Add server | Via edit config file buttons | Not available |
| Remove server | Delete button + confirmation | Remove button + confirmation |
| Edit server config | Via edit config file buttons | Not available |
| Connection status | Colored dot (green/yellow/red) | Live status display |
| Enable/disable toggle | ToggleSwitch per server |
Connect/disconnect toggle |
| Restart/refresh | Per-server refresh button | Not available |
| Refresh all | "Refresh All MCP Servers" button | Not available |
| Edit Global MCP config | Button to open file | Not available |
| Edit Project MCP config | Button to open file | Not available |
| Network timeout | Per-server dropdown (15s–60min) | Not available |
| Server source badge | Shows "global" / "project" | Not displayed |
| Empty state | N/A | "No MCP servers configured. Edit the opencode config file..." |
Expandable Server Detail (Legacy Only)
When a server was connected and enabled, expanding it showed 5 tabs:
| Tab | Content |
|---|---|
| Tools | List of MCP tools with tool count |
| Resources | List of resources + resource templates with count |
| Instructions | Server-provided instruction text (if present) |
| Logs | Error/log entries sorted by timestamp with count |
| Auth | OAuth debug info: auth status, token expiration, scopes, refresh info |
The new extension has none of this expandable detail.
Remaining Work
Important (P2)
- Add MCP Server dialog: Form to define a new server with name, transport type (stdio/SSE), command+args or URL, environment variables. Write to CLI config via
updateConfig() - Edit MCP Server: Allow modifying existing server configurations
- Restart/refresh button: Per-server and "refresh all" buttons. Requires CLI endpoint to restart MCP servers
- Edit config file buttons: Quick links to open global/project MCP config in the editor
Nice to Have (P3)
- Expandable server detail: Show tools, resources, instructions, and logs per server when expanded. Requires CLI to expose per-server tool/resource/log data
- Network timeout per server: If CLI supports per-server timeout config, expose it
- Server source badge: Display whether server comes from global or project config
- OAuth/Auth tab: Display auth status for OAuth-based MCP servers (depends on CLI support)
Notes
The mcp-and-mcp-hub.md doc in non-agent-features/ tracks MCP configuration as a broader feature. This doc focuses specifically on the MCP Servers sub-tab within the Agent Behaviour settings tab. The Marketplace covers MCP server discovery and installation from a registry.
Packages Kilo Vscode Docs Agent Behaviour Modes Subtab Parity (`packages/kilo-vscode/docs/agent-behaviour/modes-subtab-parity.md`)
Modes / Agents Sub-Tab Parity
Priority: P2
The legacy "Modes" sub-tab was a 1794-line component with comprehensive mode management. The new "Agents" sub-tab now covers core CRUD (create, edit, delete) after PR #7225 but is still missing several legacy features.
Side-by-Side Comparison
Mode/Agent CRUD
| Feature | Legacy (Modes) | New (Agents) |
|---|---|---|
| View modes/agents list | List with name + slug | Interactive clickable list with name + description + "custom" badges |
| Select mode to configure | Popover/Command searchable combobox | Click-to-edit in agent list |
| Create new mode | Full dialog: name, slug, save location, role definition, description, when-to-use, tool groups, custom instructions | "Create New Mode" button with form: name (validated), description, system prompt |
| Delete custom mode | Confirmation dialog | Delete button with confirmation dialog |
| Rename custom mode | Inline text field with save/cancel | Not available — name is immutable after creation |
| Export mode | Export to file button | Not available |
| Import mode | Import dialog (project/global) | Not available (marketplace handles this) |
| Edit modes config (JSON) | Dropdown: "Edit Global Modes" / "Edit Project Modes" | Not available |
| Marketplace button | Opens mode marketplace | Not available |
Per-Mode/Agent Settings
| Setting | Legacy | New |
|---|---|---|
| API Configuration (provider profile) | <Select> dropdown of all API config profiles |
Not applicable (CLI uses per-agent model instead of profiles) |
| Role Definition / System Prompt | <TextArea> (5 rows) + reset button for built-ins |
Multiline auto-resizing textarea (edit view for custom; prompt override for built-in) |
| Description | <TextField> + reset button |
Editable text field in edit view |
| When to Use | <TextArea> (4 rows) + reset button |
Not available |
| Tools (tool groups) | Checkbox grid per group, file regex restrictions | Not applicable (CLI uses permission-based tool control) |
| Custom Instructions (per-mode) | <TextArea> (10 rows) + link to .kilocode/rules-{slug}/rules.md |
Not available as separate field (merged into system prompt) |
| Temperature | Not in legacy Modes sub-tab (was in provider profile) | <TextField> per agent |
| Top P | Not in legacy Modes sub-tab | <TextField> per agent |
| Max Steps | Not in legacy Modes sub-tab | <TextField> per agent |
| Model Override | Not in legacy Modes sub-tab (was via API config) | <TextField> per agent |
System Prompt Features
| Feature | Legacy | New |
|---|---|---|
| Preview System Prompt | Button to view full rendered prompt in slide-out panel | Not available |
| Copy System Prompt | Clipboard button | Not available |
| Override System Prompt | Advanced disclosure with link to .kilocode/system-prompt-{slug} |
Not available |
Global Custom Instructions
| Feature | Legacy | New |
|---|---|---|
| Global Custom Instructions field | <TextArea> (4 rows) inside Modes sub-tab |
Not available in Agents sub-tab (Rules sub-tab has instruction file paths instead) |
| Link to global rules file | Link to .kilocode/rules/rules.md |
Not available |
Organization Features
| Feature | Legacy | New |
|---|---|---|
| Share modes banner | KiloShareModesBanner component |
Not available |
| Organization mode warning | Warning when mode has source === "organization" |
Not available |
CLI Agent Fields Not Exposed
These are CLI capabilities beyond what the legacy had:
| CLI Field | Type | Description |
|---|---|---|
agent[name].variant |
string | Default thinking/reasoning variant (low/medium/high) |
agent[name].permission |
Permission | Per-agent tool permission overrides |
agent[name].hidden |
boolean | Hide agent from mode switcher |
agent[name].disable |
boolean | Fully disable agent |
agent[name].mode |
"subagent" / "primary" / "all" | Agent visibility context |
agent[name].color |
string | Agent identification color |
agent[name].options |
Record | Arbitrary key-value config |
Remaining Work
Important (P2)
- When to Use field: Add a text area for orchestrator routing hints (if CLI supports it)
- System prompt preview: Add a button to view the full rendered system prompt — requires a CLI endpoint to return the assembled prompt for an agent
- Import/Export: Add import (from file) and export (to file) for agent/mode definitions
- Default variant per agent: Expose
agent[name].variantfor persistent thinking effort defaults - Hidden/disable toggles: Add visibility controls for agents
Nice to Have (P3)
- Rename agent: Allow renaming custom agents (currently name is immutable after creation)
- Edit config JSON buttons: Quick links to open the raw config file for global/project agent config
- Marketplace integration: Button to open mode marketplace (covered by marketplace.md)
- Organization mode features: Share modes banner and org mode warning (depends on org feature implementation)
- Agent mode selector: Dropdown for subagent/primary/all
- Color picker: Visual agent identification
- Per-agent permissions: Collapsible permission override section per agent
- Copy system prompt: Clipboard button for the assembled prompt
Packages Kilo Vscode Docs Agent Behaviour Rules Workflows Subtab Parity (`packages/kilo-vscode/docs/agent-behaviour/rules-workflows-subtab-parity.md`)
Rules & Workflows Sub-Tabs Parity
Priority: P2 (Rules), P3 (Workflows)
The legacy extension had feature-complete Rules and Workflows sub-tabs with toggle lists, file creation, and global/workspace separation. The new extension has a simpler Rules sub-tab and a stub Workflows sub-tab.
Rules Sub-Tab Comparison
| Feature | Legacy | New |
|---|---|---|
| Description text + docs link | Yes | No |
| Global rules section | Toggle list of global rule files | Not separated — single flat list of instruction file paths |
| Workspace rules section | Toggle list of workspace rule files | Same flat list |
| Per-rule enable/disable toggle | ToggleSwitch per rule file |
Not available — paths are either in the list or removed |
| Create new rule file | Input field with validation (.md, .txt, or no extension) per section | Not available |
| Add instruction file path | Not available (auto-discovered from filesystem) | TextField + "Add" button |
| Rule source discovery | Auto-discovers from .kilocode/rules/, .kilocoderules, .roorules, .clinerules, mode-specific dirs, AGENTS.md |
Only shows explicitly configured paths in config.instructions |
Key Architectural Difference
The legacy extension auto-discovered rule files from well-known filesystem locations and displayed them with on/off toggles. The new extension treats instruction files as explicit config entries — you add paths to config.instructions and they're always active. There's no discovery or toggling.
Workflows Sub-Tab Comparison
| Feature | Legacy | New |
|---|---|---|
| Description text + docs link | Yes | Placeholder: "Not yet implemented." |
| Global workflows section | Toggle list of global workflow files | Not available |
| Workspace workflows section | Toggle list of workspace workflow files | Not available |
| Per-workflow enable/disable toggle | ToggleSwitch per workflow file |
Not available |
| Create new workflow file | Input field per section | Not available |
| Invoke workflow | Type /workflow-name in chat |
CLI has custom commands (similar concept) |
Remaining Work
Rules (P2)
- Description text: Add explanatory description with link to docs, matching the legacy pattern
- Global vs workspace separation: If the CLI distinguishes between global and workspace instruction files, separate them into two sections
- Enable/disable toggles: If rules can be toggled without removing them from config, add toggle switches per rule
- New rule file creation: Add a button/input to create a new rule file (not just add an existing path)
- Auto-discovery: Consider adding a section showing auto-discovered rule sources (
.kilocode/rules/,AGENTS.md) that the CLI loads regardless of explicitconfig.instructionsentries
Workflows (P3)
- Implement the sub-tab: Replace the placeholder with actual workflow management
- Determine CLI mapping: The CLI has custom commands — determine whether "workflows" maps to CLI custom commands or is a distinct concept
- Workflow file management: Add toggle list for global/workspace workflow files with create/enable/disable
- Description text: Add explanatory description matching the legacy pattern
Notes
The existing non-agent-features/rules-and-workflows.md doc covers workflows broadly. This doc adds the specific UI comparison for what the sub-tabs look like in the Agent Behaviour tab. The CLI's config.instructions array is a simpler model than the legacy's auto-discovered toggle list — the extension may need to augment it with discovery logic to match parity.
Packages Kilo Vscode Docs Chat Ui Features Browser Session Controls (`packages/kilo-vscode/docs/chat-ui-features/browser-session-controls.md`)
Browser Session Controls
Priority: P3
Remaining Work
- In-chat browser session controls (start/stop/navigate)
- Action replay and control buttons
- Screenshot viewing within chat messages
- Dedicated browser tool rendering (currently falls through to generic MCP tool display)
Packages Kilo Vscode Docs Chat Ui Features Checkpoint Task Management (`packages/kilo-vscode/docs/chat-ui-features/checkpoint-task-management.md`)
Checkpoint & Task Management
Priority: P1
CLI-side snapshot service is fully implemented (packages/opencode/src/snapshot/). Extension has a settings toggle. What's missing is the management UI.
Remaining Work
- Checkpoint restore dialogs
- Checkpoint navigation menu / timeline
- Diff viewing between checkpoints
- "See New Changes" buttons to view git diffs for completed tasks
- Integration with CLI session undo/redo/fork operations
- Consider reusing kilo-ui's
MessageNavcomponent - Evaluate whether CLI session undo/redo/revert maps to Kilo's checkpoint model or if extension needs its own git-based implementation
Packages Kilo Vscode Docs Chat Ui Features Mermaid Diagram Features (`packages/kilo-vscode/docs/chat-ui-features/mermaid-diagram-features.md`)
Mermaid Diagrams
Chat Markdown renders fenced mermaid code blocks as diagrams after a response finishes streaming.
Behavior
- Valid
mermaidfences render inline as SVG diagrams. - The original Mermaid source remains available through the existing code-block copy button.
- Rendered diagrams include Copy and Download menus for Mermaid source, SVG, and PNG formats.
- The Zoom action opens a fullscreen viewer with zoom in/out and reset controls, mouse-wheel zoom, drag-to-pan, and keyboard shortcuts (
+,-,0,Escape). - Invalid Mermaid syntax shows a contained error state and keeps the source visible.
- Diagrams are not rendered while a message is streaming, which avoids repeated parse/render work on every token.
- Diagram colors are derived from the active VS Code/Kilo CSS variables so light, dark, and high-contrast themes can render with matching backgrounds, text, borders, and link colors.
Limitations
- Mermaid is bundled by the current webview build, so bundle splitting remains a future optimization.
- Advanced legacy actions are not restored yet: AI syntax fixing.
Packages Kilo Vscode Docs Chat Ui Features Message Editing Management (`packages/kilo-vscode/docs/chat-ui-features/message-editing-management.md`)
Message Editing & Management
Priority: P1
Remaining Work
- Edit user messages inline (with full chat input features — mode selector, image attachments, cancel/save)
- Delete user messages from conversation
- Click-to-edit on message text
- Timestamp display on messages
- Redo previous message via up-arrow key
- Map edit/delete to CLI session operations (fork-from-message + re-run)
Packages Kilo Vscode Docs Chat Ui Features Special Content Types (`packages/kilo-vscode/docs/chat-ui-features/special-content-types.md`)
Special Content Types
Priority: P1
Remaining Work
- Copy button on error cards (error text displays but no dedicated copy action)
- Dedicated MCP tool/resource rows with specialized rendering (beyond generic fallback)
- "Open markdown preview" button (opens rendered markdown in VS Code's preview pane)
Packages Kilo Vscode Docs Cli Side Architect Mode Plan Files (`packages/kilo-vscode/docs/cli-side/architect-mode-plan-files.md`)
Re-add Architect Mode / Enhance Plan Mode to Write Plan Files
Priority: P2
Status: ❌ Not started
Issue: #6230
Problem
The old Kilo Code extension had an "Architect mode" that would write the resulting plan as a .md file into a /plans directory in the project root. Users adopted this workflow and now miss it.
The new extension has Plan mode, but plans are stored only inside .opencode/ — not as human-readable .md files in the project. Users can't see or reference their plans easily.
Remaining Work
Options (pick one or combine):
Enhance Plan mode — After a plan is finalized, automatically write it as a
.mdfile to a/plansdirectory in the project root. The filename could be based on the plan title or a timestamp. This happens in addition to the internal.opencode/storage.Re-add Architect mode — Add a distinct "Architect" mode that is specifically focused on writing plans as
.mdfiles to/plans.Prompt Plan mode — When finishing a plan, offer the user a choice: "Save plan to
/plans/plan-name.md?" with accept/dismiss.
Option 3 is the least disruptive. The recommended approach is to add an "Export plan" action button in the Plan mode UI that saves the current plan to /plans/.
Implementation Notes
- This requires CLI-side changes to the Plan mode behavior and/or an extension-side "export plan" button
- The plan content is available in the session; extracting it requires identifying what parts constitute the plan output
/plans/directory creation should be done safely (don't overwrite existing files without confirmation)
Packages Kilo Vscode Docs Cli Side Init Secret Check (`packages/kilo-vscode/docs/cli-side/init-secret-check.md`)
/init Pre-Commit Secret Check
Priority: P2
Issue: #6077
Remaining Work
- In the CLI's
/initcommand, after writing init files, check if the repository has:- A
.pre-commit-config.yamlwith a secret scanning hook - A
.git/hooks/pre-commitfile - A
detect-secretsbaseline file (.secrets.baseline)
- A
- If none found, output a recommendation with link to
detect-secretsorgitleaks - Optionally: offer to install
detect-secretsas part of init flow
Packages Kilo Vscode Docs Cli Side Plan Mode Over Prompting (`packages/kilo-vscode/docs/cli-side/plan-mode-over-prompting.md`)
Plan Mode Over-Prompting to Implement
Priority: P1
Issue: #6143
The plan mode prompt is verbose. The agent still tends to ask "Should I implement this?" repeatedly.
Remaining Work
- Review the Plan mode system prompt for language that encourages the agent to switch to implementation
- The prompt should make clear that in Plan mode, the agent's job is to help create and refine a plan — not implement
- "Should I implement this?" should be asked at most once, after the plan appears settled
- Coordinate with team on correct Plan mode behavior before changing the prompt
Packages Kilo Vscode Docs Error Handling Autocomplete Settings Link (`packages/kilo-vscode/docs/error-handling/autocomplete-settings-link.md`)
Autocomplete Broken Notice — Settings Link Not Clickable
Priority: P1
Issue: #6284
Autocomplete settings tab exists but the "settings" link in the broken notice may not navigate to it.
Remaining Work
- Fix the "settings" link in the autocomplete broken notice to navigate to the Autocomplete settings tab
- Investigate why autocomplete model selector shows "no model selected" by default — add a sensible fallback
- Check whether the "autocomplete broken" state is correctly detected and cleared
Packages Kilo Vscode Docs Error Handling Cli Startup Errors (`packages/kilo-vscode/docs/error-handling/cli-startup-errors.md`)
Surface CLI Startup Errors in the Extension
Priority: P1
Issue: #6209
StartupErrorBanner exists in webview but VS Code-native notifications for startup failures are missing.
Remaining Work
- Detect CLI process unexpected exit before port announced (
process.on('exit', ...)in ServerManager) - Capture last N lines of stderr
- Show error notification with "Show Logs" and "Retry" buttons
- Add
'failed'state toConnectionState - For malformed config: parse error and show human-readable hint
Packages Kilo Vscode Docs Error Handling Extension Refresh On Update (`packages/kilo-vscode/docs/error-handling/extension-refresh-on-update.md`)
Extension View Doesn't Refresh on Restart/Update
Priority: P1
Issue: #6086
Remaining Work
- Subscribe to
vscode.extensions.onDidChangeto detect extension updates - When Kilo Code is updated, force-reload the webview panel (dispose and recreate, or post reload message)
- Ensure panel is properly disposed and recreated on extension host restart
Packages Kilo Vscode Docs Error Handling Pre Release Switch Crash (`packages/kilo-vscode/docs/error-handling/pre-release-switch-crash.md`)
CPU Spike / Crash When Switching Pre-Release <> Release
Priority: P0
Issue: #6083
ServerManager has startup guards and process cleanup, but no explicit handling for version switch conflicts.
Remaining Work
- Reproduce and profile CPU usage during release <> pre-release switch
- Check if both versions attempt to spawn
kilo servesimultaneously causing port/race conflicts - Ensure
deactivate()fully terminates the server process before new version starts - Check for file lock conflicts on shared state (e.g.,
agent-manager.json, CLI config)
Packages Kilo Vscode Docs Error Handling Propagate Cli Errors To Ui (`packages/kilo-vscode/docs/error-handling/propagate-cli-errors-to-ui.md`)
Propagate All CLI Errors to the UI
Priority: P1
Issue: #6146
Remaining Work
- Intercept CLI error output (stderr) in
ServerManager/KiloConnectionService - Show VS Code error notification for critical/startup errors
- Inject error messages into chat UI as system messages for mid-session errors
- Ensure CLI's error SSE events are forwarded to the webview and rendered
- Distinguish between startup errors and runtime errors
Packages Kilo Vscode Docs Features Background Agent Visibility (`packages/kilo-vscode/docs/features/background-agent-visibility.md`)
Background Agent Visibility
Priority: P1
Background subagents are enabled by default, so a session can have several async agents running at once. The parent transcript shows a task card while the agent runs and injects the result when it finishes, but the card scrolls away. Once it is off screen there is no way to see that agents are still running, how many, or what they are doing.
The CLI already solves this. It keeps a per-session subagent list with status (running, done, cancelled, error), shows a subagents hint in the status line, and opens a subagent inspector tab. See packages/opencode/src/cli/cmd/run/subagent-data.ts and footer.command.tsx.
Goal
Give the VS Code extension the same observability, without inventing a new viewer. Clicking an agent must keep landing in the surfaces users already have:
- Agent Manager: the shared right-hand inspector (
SubagentPanel), reached with theagentManager.openSubagentevent. - Sidebar and Kilo tab: a dedicated editor tab, reached with the
openSubAgentViewermessage.
Placement
The indicator goes in the task header strip slot, directly above the existing to-do strip in TaskHeader.tsx.
┌──────────────────────────────────────────────┐
│ Upstream background agents… $6.72 26% ⌄ │ session header
├──────────────────────────────────────────────┤
│ ⟳ 3 agents ⌄ │ NEW strip, collapsed
├──────────────────────────────────────────────┤
│ ⌗ 0/1 to-dos done ⌃ │ existing to-do strip
├──────────────────────────────────────────────┤
│ …transcript… │├──────────────────────────────────────────────┤
│ ⟳ 3 agents ⌃ │
│ ⟳ Refactor task registry ↗ │
│ ⟳ Audit dependency versions ↗ │
│ ⟳ Research meaning of life ↗ │
├──────────────────────────────────────────────┤Why this slot:
- The to-do strip already proves the pattern: conditional, collapsible, sticky, one line when collapsed, full width when open.
- It costs zero vertical space when no agent runs.
- It cannot scroll away, which is the actual defect.
TaskHeaderis shared throughChatView, so the sidebar, the Kilo tab, and Agent Manager all get it.
Rejected: the action row above the composer (ChatView.renderActions). It is already full in a narrow sidebar, its buttons appear and disappear with session status, and it is an actions row rather than a status row.
State source
The webview uses the Kilo-owned background-job API for authoritative lifecycle state. A task-part fallback keeps running agents visible while the first request is loading:
| Need | Source |
|---|---|
| the current session's task parts | session.getSessionToolParts(id), the per-session tool index |
child session id, description, background flag |
background-job metadata and task tool part metadata |
| lifecycle state | GET /kilocode/background-jobs |
| per-agent cancellation | POST /kilocode/background-jobs/:jobID/cancel, resolved in the owning parent directory and cancelling the child session tree |
| foreground promotion | the existing experimental.session.background route |
| child permission/question attention | scoped session permission and question state |
| child sessions stay tracked while the card is closed | KiloProvider auto-adopts them from task parts |
The per-session tool index matters for correctness, not only cost. allParts() holds the parts of every loaded session, so deriving from it would make one session's strip list agents started by another session, which is wrong in Agent Manager where several sessions are loaded at once. The index is keyed by session, so the strip lists only agents this session started. Agents started by a sub-agent appear in that sub-agent's own header, not in the root strip.
An agent counts as running only when its child session status is busy or retry. This fails closed: a stale running part from a previous backend process does not produce a phantom spinner.
Implementation
packages/opencode/src/kilocode/server/httpapi/
Kilo-owned parent-scoped background-job list and cancellation routes.webview-ui/src/components/chat/open-subagent.ts
Shared helper holding the Agent Manager vs sidebar branch. Extracted fromTaskToolExpanded.openInTabso the task card and the strip cannot drift apart.webview-ui/src/components/chat/background-agents.ts
Pure derivation for backend lifecycle rows and the running-task fallback.webview-ui/src/components/chat/BackgroundAgents.tsx
The strip. Collapsed by default, opens an agent through the shared helper.TaskHeader.tsxrenders ``.styles/task-header.cssadds[data-component="task-header-agents"].i18n/*.tsadds the localizedtask.backgroundAgents.*strings.tests/unit/background-agents.test.tscovers lifecycle derivation, attention attribution, and promotion discovery.
Concurrency
Opening an agent from the strip while its task card is also open is safe. VisibleTaskStreams refcounts stream visibility per session, and only visible: false releases a child session, so two openers cannot cut each other's stream.
The strip itself does not sync any child session. It only reads status, so listing agents stays cheap and full part streaming happens on open.
Known limits
- The strip marks agents that need permission or question input, but the user must open the child inspector or editor tab to answer it.
- The strip has no elapsed-time counter or dedicated keyboard shortcut.
- Finished rows can be dismissed locally, but dismissal does not delete the child session or backend job record.
Packages Kilo Vscode Docs Features Expandable Mcp Tools (`packages/kilo-vscode/docs/features/expandable-mcp-tools.md`)
Expandable MCP Tools in Chat
Priority: P2
Issue: #6229
MCP tool calls render as non-expandable entries.
Remaining Work
- Make MCP tool call rows expandable, matching regular tool expand/collapse behavior
- Expanded view should show: tool name, MCP server name, input arguments (JSON), tool output/result
- Use same UI pattern as regular tools (chevron icon, collapsible section)
Packages Kilo Vscode Docs Features File Attachments (`packages/kilo-vscode/docs/features/file-attachments.md`)
File Attachments in Chat Input
Priority: P2
Issue: #6078
Image attachments and @file path mentions work. Non-image file content attachments are missing.
Supported Image Types
The following image formats are supported for paste and drag-and-drop:
- PNG (
image/png) - JPEG (
image/jpeg) - GIF (
image/gif) - WebP (
image/webp)
Drag-and-Drop (Shift Required)
VS Code disables webview pointer-events during drag operations so it can handle drops in the editor area. To drop images into the chat input, hold Shift while dragging. This re-enables the webview to receive drop events (VS Code 1.91+, see microsoft/vscode#182449).
Remaining Work
- Add a file attachment button to the chat input toolbar (paperclip icon or similar)
- Support drag-and-drop of non-image files onto the chat input area
- Support a file picker dialog via the button
- For text-based files: read content and include as a text part in the message
- For binary files: show an unsupported notice
- Show attached files as chips/tags above the input with remove button
- Limit attachment size with a clear error if exceeded
Packages Kilo Vscode Docs Features Remember Last Model (`packages/kilo-vscode/docs/features/remember-last-model.md`)
Remember Last Model Choice
Priority: P2
Issue: #6211
Model selection is in-memory only. No persistence across sessions/restarts.
Remaining Work
- On model change, persist choice to
globalState.update('lastModel', modelId) - On new session, pre-select last-used model via
globalState.get('lastModel') - Fall back to default gracefully if stored model is no longer available
Packages Kilo Vscode Docs Features Session Preview Improvements (`packages/kilo-vscode/docs/features/session-preview-improvements.md`)
Session Preview Improvements
Priority: P2
Issue: #6234
Session titles are often too short to distinguish sessions.
Remaining Work
- Evaluate options: show first message snippet as subtitle, improve title generation, show message count/timestamp
- Review the "recent sessions" cards on the start/home screen
- User testing preferred to determine most useful approach
Packages Kilo Vscode Docs Infrastructure Changelog On Update (`packages/kilo-vscode/docs/infrastructure/changelog-on-update.md`)
Show Changelog on Extension Update
Priority: P3
Issue: #6079
No version comparison or "What's New" notification exists.
Remaining Work
- On activation, compare current version against last-seen version in
globalState - If version changed, show notification with "What's New" and "Dismiss" options
- Update stored version after showing
- Do not show on first install
Packages Kilo Vscode Docs Infrastructure Dedicated Output Channel (`packages/kilo-vscode/docs/infrastructure/dedicated-output-channel.md`)
Dedicated Output Channel
Priority: P2
Agent Manager has its own output channel. No general "Kilo Code" output channel exists.
Remaining Work
- Create
vscode.window.createOutputChannel("Kilo Code")during activation - Centralized logging utility with log levels (debug, info, warn, error)
- Route all
[Kilo New]log messages to this channel - Dispose on deactivation
- Migrate existing
console.log("[Kilo New] ...")calls to the logger
Packages Kilo Vscode Docs Infrastructure Http Request Timeouts (`packages/kilo-vscode/docs/infrastructure/http-request-timeouts.md`)
HTTP Request Timeouts
Priority: P1
Health check has a 3s timeout via AbortController. SSE has a 15s heartbeat timeout. General SDK calls have no timeouts.
Remaining Work
- Add configurable request timeout (default: 60s) around SDK calls in KiloProvider
- Add shorter connect timeout where possible (default: 10s)
- Ensure timeout cleanup on successful response (no leaked timers)
Packages Kilo Vscode Docs Infrastructure Openvsx Publish (`packages/kilo-vscode/docs/infrastructure/openvsx-publish.md`)
Publish to OpenVSX
Priority: P3
Issue: #6080
Remaining Work
- Create OpenVSX publisher account
- Add
ovsx publishstep to CI/CD pipeline after VS Code Marketplace publish - Set up OpenVSX token as CI secret
- Test the publish manually first
Packages Kilo Vscode Docs Infrastructure Vscode Error Notifications (`packages/kilo-vscode/docs/infrastructure/vscode-error-notifications.md`)
VSCode Error Notifications for Critical Failures
Priority: P1
showErrorMessage is used in peripheral services (commit, Agent Manager, autocomplete). Core connection errors only go to console.error and webview postMessage.
Remaining Work
- Show
showErrorMessage()when CLI binary is missing or server fails to start - Show
showWarningMessage()when SSE connection is lost (with "Retry" action) - Avoid notification spam — throttle or deduplicate repeated errors
Packages Kilo Vscode Docs Nes Examples INSTRUCTIONS (`packages/kilo-vscode/docs/nes-examples/INSTRUCTIONS.md`)
NES Test Playground — Instructions
These tests are designed so that the source files contain no hints about what Mercury is supposed to predict. All cursor placements and expected behaviors live here. Don't open this file inside the Dev Host while testing — keep it in a separate window so the model can't see it.
One-time setup
bun run watchis already running for the kilocode extension.- In the kilocode VSCode window, press F5 → opens the Extension Development Host.
- In the Dev Host:
File → Open Folder…→packages/kilo-vscode/docs/nes-examples/inside this repo. - Open Settings (
Cmd+,), confirm:kilo-code.new.autocomplete.enableAutoTrigger→ ✓ (default true)kilo-code.new.autocomplete.model→ Mercury Next Edit (Inception) ← NOT "Mercury Edit 2", which is the classic FIM optionkilo-code.new.autocomplete.nextEdit.apiKey→ yoursk_...key- VSCode global
editor.inlineSuggest.enabled→ ✓
- To watch the pipeline live:
View → Output→ pick the "Kilo Code · Next Edit" channel.
Conventions used below
- Cursor placement: where to click in the file before waiting.
- Expected (editor): what should appear on screen.
- Expected (channel): a stripped-down line you should see in the Next Edit output channel.
- Path: which NES rendering path this exercises — same-line ghost / off-cursor replace / off-cursor insert / suppressed.
After each test, don't accept if you want to re-run it — the suggestion will edit the file. Either Cmd+Z after accept, or just navigate to the next test file.
Core tests (Python)
01 — Finish a function body *(path: same-line insert)*
- File:
01_finish_function_body.py - Cursor: the empty indented line at the end of
factorial(column 4). - Expected editor: ghost text proposing the recursive case.
- Expected channel:
diff at lines [N..N], cursor at line N, thenRENDER.
02 — Pattern continuation *(path: same-line ghost)*
- File:
02_pattern_continuation.py - Cursor: end of the last line (after
COLOR_BLUE =). - Expected editor: ghost text appending a hex color.
- Expected channel:
diff at lines [N..N], cursor at line N, thenRENDER.
03 — Mid-identifier completion *(path: same-line ghost)*
- File:
03_typo_completion.py - Cursor: end of the file (after
return tot). - Expected editor: ghost text completing the identifier.
- Path: same-line.
04 — Loop body inference *(path: same-line insert)*
- File:
04_loop_body.py - Cursor: the empty indented line inside the
forloop (column 8). - Expected editor: ghost text proposing the accumulator update.
05 — Sibling method body *(path: same-line insert)*
- File:
05_class_method.py - Cursor: empty indented line inside
pop(column 8). - Expected editor: ghost text proposing the pop body.
Advanced Python tests
07 — Multi-line rename refactor *(path: off-cursor replace)*
- File:
07_multiline_rename_refactor.py - Cursor: end of the line with
def compute_user_score(user_id, weight):(the renamed signature). The body below still uses the oldu/wnames. - Expected editor: strikethrough on the body lines + ghost showing the renamed body.
- Tab: jump, then apply.
08 — Mixed insert + replace *(path: off-cursor replace, multi-line)*
- File:
08_mixed_insert_and_replace.py - Cursor: end of line
total = 0. - Expected editor: a decoration spanning the for-loop area showing the corrected accumulator body. The proposed text is longer than the original.
10 — Mid-token completion *(path: same-line ghost)*
- File:
10_mid_token_completion.py - Cursor: end of the file (after
result = fib). - Expected editor: ghost extending the identifier and supplying a call.
11 — Stub method with implemented siblings *(path: same-line insert)*
- File:
11_fill_sibling_method.py - Cursor: empty indented line inside
dequeue(column 8). - Expected editor: ghost text filling in the FIFO body.
12 — Type annotation insertion *(path: same-line replace OR off-cursor replace)*
- File:
12_type_annotation_insertion.py - Cursor: on line
def add(a, b):(anywhere on that line works; end-of-line is easiest). - Expected editor: strikethrough + ghost showing the typed signature. May render as inline ghost depending on where you place the cursor on the line.
13 — Docstring generation *(path: same-line insert)*
- File:
13_docstring_generation.py - Cursor: empty indented line directly under
def parse_iso_date(s):(column 4). - Expected editor: ghost text starting with
"""and a one-line description.
14 — No-op suppression (NEGATIVE) *(path: suppressed)*
- File:
14_no_op_suppression.py - Cursor: end of
return a + b. - Expected editor: NOTHING. No ghost, no decoration.
- Expected channel: either
identical replacement — no-opor noRENDERline. - Fail mode: any visible suggestion is a false positive.
TypeScript
ts_07 — Array transform *(same-line)*
- File:
ts_07_array_transform.ts - Cursor: end of
return usersinsidegetActiveUserNames. - Expected editor: ghost text completing a
.filter(...).map(...)chain.
ts_08 — Param type annotations *(off-cursor replace)*
- File:
ts_08_param_types.ts - Cursor: end of file (after
main();). - Expected editor: strikethrough on
add(a, b)signature + ghost showing the typed version.
ts_09 — React event handler *(same-line insert)*
- File:
ts_09_jsx_handler.tsx - Cursor: empty indented line inside
handleClick(column 4). - Expected editor: ghost text incrementing
count.
Go
go_07 — Error handling *(same-line insert, multi-line)*
- File:
go_07_error_handling.go - Cursor: empty line right after
data, err := os.ReadFile(path). - Expected editor: ghost text proposing the canonical
if err != nil { return nil, err }block.
go_08 — Struct method body *(same-line insert)*
- File:
go_08_struct_method.go - Cursor: empty indented line inside
Area(). - Expected editor: ghost text computing area from
WidthandHeight.
go_09 — Goroutine + channel *(same-line insert, multi-line)*
- File:
go_09_goroutine_channel.go - Cursor: empty indented line inside the goroutine.
- Expected editor: ghost text producing values onto the channel and closing it.
Rust
rs_07 — Match-arm completion *(same-line)*
- File:
rs_07_match_arms.rs - Cursor: empty indented line inside the
match s {body, after theSquarearm (column 8). - Expected editor: ghost text proposing the missing
RectangleandTrianglearms.
rs_08 — Result chaining *(same-line ghost)*
- File:
rs_08_result_chain.rs - Cursor: end of the line
let n = s.trim()(no semicolon yet). - Expected editor: ghost text continuing the chain into a parsed
i32.
rs_09 — Lifetime annotation *(off-cursor replace)*
- File:
rs_09_lifetimes.rs - Cursor: end of the file (after
main's closing}). - Expected editor: strikethrough on the
fn longest(...)signature + ghost showing the lifetime-annotated version.
JavaScript
js_07 — Async/await *(same-line insert, multi-line)*
- File:
js_07_async_await.js - Cursor: empty indented line inside the
try {block (column 8). - Expected editor: ghost text completing fetch + json parse.
js_08 — Express route handler *(same-line insert, multi-line)*
- File:
js_08_express_route.js - Cursor: empty indented line inside the GET handler (column 4).
- Expected editor: ghost text implementing get-by-id (lookup, 404, json response).
SQL
sql_07 — JOIN clause *(same-line ghost)*
- File:
sql_07_join.sql - Cursor: end of the line
FROM orders o. - Expected editor: ghost text completing the JOIN against
customers.
sql_08 — WHERE filter *(same-line ghost)*
- File:
sql_08_where_filter.sql - Cursor: end of the bare
WHEREline. - Expected editor: ghost text proposing a predicate.
Markdown (negative)
md_07 — Prose, should stay quiet *(suppressed)*
- File:
md_07_prose_negative.md - Cursor: end of the last sentence.
- Expected editor: NOTHING (ideally). If Mercury does propose a continuation of the prose, note it as a soft fail — code models writing your README isn't the v0 product.
Troubleshooting
- No log lines appearing: confirm the output channel is "Kilo Code · Next Edit". Also confirm you reloaded the Dev Host after rebuilding.
[NES] skip — no API key resolved: setting wasn't saved. Re-paste the key, hit Enter, reload.[NES] <- 400: regression on prompt shape — capture the body in the channel and ping the integration owner.- Visible suggestion that's not in this doc: write it down. Unexpected wins (or false positives) are the most useful signal.
Packages Kilo Vscode Docs Nes Examples Md 07 Prose Negative (`packages/kilo-vscode/docs/nes-examples/md_07_prose_negative.md`)
Mercury Edit 2 — Quick Notes
Mercury Edit 2 is a small, fast model trained to predict the user's
next single edit given the current file, cursor position, and recent
edit history. It targets latency under 200 ms on typical files and
returns a unified-diff-like patch scoped to a window around the cursor.
Unlike chat-style completions, the model is biased toward minimal,
local changes — finishing a function body, fixing a typo, propagating
a rename — rather than generating new files from scratch.
Packages Kilo Vscode Docs Non Agent Features Authentication Organization Enterprise Enforcement (`packages/kilo-vscode/docs/non-agent-features/authentication-organization-enterprise-enforcement.md`)
Authentication / Organization / Enterprise Enforcement
Priority: P1
Remaining Work
- Dropdown to choose between org or personal account, passing the selection via
kilo serveto the backend when using the Kilo gateway - Organization feature flags (restrict features based on org plan/tier)
- MDM policy enforcement (managed device policies, enterprise admin controls, restriction enforcement)
Packages Kilo Vscode Docs Non Agent Features Auto Purge (`packages/kilo-vscode/docs/non-agent-features/auto-purge.md`)
Auto-Purge (Task Storage Cleanup)
Priority: P3
Remaining Work
- Scheduled cleanup of old task/history storage to prevent uncontrolled disk growth
- Decide storage ownership (CLI server vs extension) and implement purge accordingly
- Configurable retention period
- Safe deletion with user confirmation for bulk purge
Packages Kilo Vscode Docs Non Agent Features Cloud Task Support (`packages/kilo-vscode/docs/non-agent-features/cloud-task-support.md`)
Cloud Task Support
Priority: P2
Remaining Work
- Upload/sync local sessions to cloud
- Real-time sync between devices
- Conflict resolution when sessions are modified on multiple devices
Packages Kilo Vscode Docs Non Agent Features Code Reviews (`packages/kilo-vscode/docs/non-agent-features/code-reviews.md`)
Code Reviews (Local and Cloud Workflows)
Priority: P2
Remaining Work
- Local "Review Mode" for AI review of uncommitted changes
- Branch vs base branch review (main/master/develop detection)
- Automated AI review on PR open/update (cloud workflow)
- VS Code review UX integration
- Reuse CLI review templates/prompts where available
Packages Kilo Vscode Docs Non Agent Features Codebase Indexing Semantic Search (`packages/kilo-vscode/docs/non-agent-features/codebase-indexing-semantic-search.md`)
Codebase Indexing & Semantic Search
Priority: P2
Remaining Work
- Vector-based indexing with embeddings (local and/or cloud)
- Semantic search over the repository
- Incremental updates via file watchers and hashing
- Multiple embedding providers and storage backends
- Integration with existing CLI grep/glob for hybrid search
Primary Implementation Anchors (kilocode-legacy)
These exist in the kilocode-legacy repo, not in this extension:
src/services/code-index/
Packages Kilo Vscode Docs Non Agent Features Contribution Tracking (`packages/kilo-vscode/docs/non-agent-features/contribution-tracking.md`)
Contribution Tracking (AI Attribution)
Priority: P3
Remaining Work
- Track AI-assisted modifications for organizational reporting
- Formatting-aware diffing
- Line hashing/fingerprinting
- Token/JWT handling for attribution APIs
- Reporting UI
Primary Implementation Anchors (kilocode-legacy)
These exist in the kilocode-legacy repo, not in this extension:
src/services/contribution-tracking/
Packages Kilo Vscode Docs Non Agent Features Custom Command System (`packages/kilo-vscode/docs/non-agent-features/custom-command-system.md`)
Custom Command System
Priority: P2
Remaining Work
- Slash command input handling in chat (detect
/prefix, show command list) - Project-level command discovery (scan
.kilocode/commands/or similar) - YAML frontmatter metadata support
- Symlink-aware command discovery
- VS Code command palette entry points
- Wire to CLI's custom command system for execution
Primary Implementation Anchors (kilocode-legacy)
These exist in the kilocode-legacy repo, not in this extension:
src/services/command/
Packages Kilo Vscode Docs Non Agent Features Marketplace (`packages/kilo-vscode/docs/non-agent-features/marketplace.md`)
Marketplace (Installable Modes, MCP Servers, Skills)
Priority: P2
Toolbar button exists but renders a stub.
Remaining Work
- Catalog browsing (Modes, MCP servers, Skills)
- Install/uninstall/update capabilities
- Marketplace API endpoints (may need backend work)
- Search and filtering within the catalog
Packages Kilo Vscode Docs Non Agent Features Mcp And Mcp Hub (`packages/kilo-vscode/docs/non-agent-features/mcp-and-mcp-hub.md`)
MCP (Model Context Protocol) & MCP Hub
Priority: P1
Settings UI supports viewing, removing, and toggling MCP servers with live connection status. Add/edit is not yet available.
Remaining Work
- Add/edit MCP server controls in the settings UI
- Tool allowlisting/disablement per server
- Auto-reconnect and error history display
- MCP Hub for discovering available MCP servers
Packages Kilo Vscode Docs Non Agent Features Repository Initialization (`packages/kilo-vscode/docs/non-agent-features/repository-initialization.md`)
Repository Initialization
Priority: P3
Remaining Work
- Command or button to initialize a repository for agentic engineering
- Creates configuration files (e.g., AGENTS.md, .kilocode/ directory)
- Detects existing project structure and tailors initialization
- May scaffold rules, workflows, or skill configurations
- Accessible from VS Code command palette and/or chat UI
- Determine if this calls a CLI
/initendpoint or replicates CLI logic - Progress/status feedback during initialization
Packages Kilo Vscode Docs Non Agent Features Rules And Workflows (`packages/kilo-vscode/docs/non-agent-features/rules-and-workflows.md`)
Rules & Workflows
Priority: P3
Rules subtab exists and works. Workflows subtab is a stub.
Remaining Work
- Workflow management UI (currently a `` stub in AgentBehaviour settings)
- Workflow definition and execution format
- UI for browsing
.kilocode/rules/and similar rule sources - Determine CLI endpoints for workflow CRUD
Packages Kilo Vscode Docs Non Agent Features Settings Sync Integration (`packages/kilo-vscode/docs/non-agent-features/settings-sync-integration.md`)
Settings Sync Integration
Priority: P3
Remaining Work
- Register allowlist of extension state/settings for VS Code Settings Sync
- Determine which settings should sync (extension settings in
settings.jsonvs CLI config) - Optionally mirror a subset of settings into CLI config
Packages Kilo Vscode Docs Non Agent Features Settings Ui (`packages/kilo-vscode/docs/non-agent-features/settings-ui.md`)
Settings UI
Priority: P1
12 of 14 tabs are functional. Import/export settings is available in the About tab.
Remaining Work
- Terminal tab: Shows "Not implemented" message
- Prompts tab: Shows "Not implemented" message
- Workflows subtab (inside AgentBehaviour): Renders a `` with no functionality
Related Docs
- Agent Behaviour tab (all sub-tabs) → Agent Behaviour Tab Parity
- Workflows subtab → Rules & Workflows Sub-Tabs Parity
Packages Kilo Vscode Docs Non Agent Features Skills System (`packages/kilo-vscode/docs/non-agent-features/skills-system.md`)
Skills System
Priority: P2
Config UI for skill paths/URLs exists in AgentBehaviour settings.
Remaining Work
- Skill execution runtime integration in the extension
- Skill discovery (browse available skills)
- Hot-reload when skill files change
Packages Kilo Vscode Docs Non Agent Features Speech To Text (`packages/kilo-vscode/docs/non-agent-features/speech-to-text.md`)
Speech-to-Text (Voice Input)
Priority: P3
Remaining Work
- Microphone capture in webview
- Streaming STT integration
- Voice input button in prompt area
- Determine STT provider (browser API, CLI-compatible, or external service)
Primary Implementation Anchors (kilocode-legacy)
These exist in the kilocode-legacy repo, not in this extension:
src/services/stt/
Packages Kilo Vscode Docs Ui Polish Approval Box Full Path (`packages/kilo-vscode/docs/ui-polish/approval-box-full-path.md`)
Approval Box Missing Full Path for Out-of-Workspace Requests
Priority: P1
Issue: #6092
Permission prompt shows whatever CLI sends — no explicit full path display logic.
Remaining Work
- Always display the full absolute path for file system operations in the permission/approval rendering
- For paths inside the workspace, relative path is acceptable but append a visual indicator if outside the workspace
- For paths outside the workspace, never truncate — show the complete absolute path
- Consider truncating only the beginning of very long paths with an ellipsis
Packages Kilo Vscode Docs Ui Polish Chat Input Narrow Sidebar Overflow (`packages/kilo-vscode/docs/ui-polish/chat-input-narrow-sidebar-overflow.md`)
Chat Input Overflows on Narrow Sidebar
Priority: P2
Issue: #6273
Remaining Work
- Make the chat input toolbar responsive: wrap controls to a second row when sidebar is narrow
- Send button should always remain visible and anchored to the bottom-right
- Use CSS flexbox
flex-wrap: wrapor container queries /ResizeObserver - Test at sidebar widths of ~200px, ~280px, and ~350px
Packages Kilo Vscode Docs Ui Polish Markdown Rendering Improvements (`packages/kilo-vscode/docs/ui-polish/markdown-rendering-improvements.md`)
Markdown Rendering Improvements
Priority: P1
Issue: #6088
Headings h1-h6 render at the same visual size as body text. kilo-ui CSS only resets margins, no distinct font sizes/weights.
Remaining Work
- Add CSS rules for heading elements (
h1-h6) with distinct font sizes, weights, and vertical spacing - Scope heading styles to the markdown content area
- Verify styles across light, dark, and high-contrast VS Code themes
- Also verify: bullet lists, numbered lists, blockquotes, horizontal rules, and bold/italic
Packages Kilo Vscode Docs Ui Polish Profile View Back Button (`packages/kilo-vscode/docs/ui-polish/profile-view-back-button.md`)
Profile View Missing Back Button
Priority: P2
Issue: #6140
Profile now opens in a separate editor panel via SettingsEditorProvider, so navigation is handled by VS Code's tab system. Evaluate whether a back button is still needed or if this issue is resolved by the panel-based approach.
Remaining Work
- Determine if the editor panel approach resolves the original navigation issue
- If not, add a back button to the Profile view header matching the Settings view pattern
Packages Opencode Src Kilocode Docs Migration (`packages/opencode/src/kilocode/docs/migration.md`)
Kilocode Migration
This document explains how Kilocode configurations are automatically migrated to Opencode.
Table of Contents
- Modes Migration
- Skills Discovery
- Rules Migration
- Workflows Migration
- MCP Migration
- Kilo Notifications
Modes Migration
This section explains how Kilocode custom modes are automatically migrated to Opencode agents.
Overview
Kilocode stores custom modes in YAML files. When Opencode starts, it reads these files and converts them to Opencode's agent format, injecting them via the OPENCODE_CONFIG_CONTENT mechanism.
Source Locations
The migrator reads custom modes from these locations (in order, later entries override earlier ones):
Global Modes (VSCode Extension Storage)
| Platform | Path |
|---|---|
| macOS | ~/Library/Application Support/Code/User/globalStorage/kilocode.kilo-code/settings/custom_modes.yaml |
| Windows | %APPDATA%/Code/User/globalStorage/kilocode.kilo-code/settings/custom_modes.yaml |
| Linux | ~/.config/Code/User/globalStorage/kilocode.kilo-code/settings/custom_modes.yaml |
Project Modes
| Location | Description |
|---|---|
.kilocodemodes |
Project-specific modes in the workspace root |
Field Mapping
Migrated Fields
| Kilocode Field | Opencode Field | Notes |
|---|---|---|
slug |
Agent key | Used as the agent identifier |
roleDefinition |
prompt |
Combined with customInstructions |
customInstructions |
prompt |
Appended after roleDefinition with \n\n separator |
groups |
permission |
See permission mapping below |
description |
description |
Primary source for description |
whenToUse |
description |
Fallback if no description |
name |
description |
Final fallback |
Permission Mapping
Kilocode uses "groups" to define what tools a mode can access. These are converted to Opencode's permission system:
| Kilocode Group | Opencode Permission | Notes |
|---|---|---|
read |
read: "allow" |
File reading |
edit |
edit: "allow" |
File editing |
command |
bash: "allow" |
Shell commands |
browser |
bash: "allow" |
Browser actions (via bash) |
mcp |
mcp: "allow" |
MCP server access |
Important: Permissions that are NOT in the groups list are explicitly set to "deny". This ensures that a mode with only read and edit groups cannot run shell commands or access MCP servers.
File Restrictions
Kilocode supports restricting edit access to specific file patterns:
groups:
- read
- - edit
- fileRegex: "\\.md$"
description: "Markdown files only"This converts to:
{
"permission": {
"read": "allow",
"edit": {
"\\.md$": "allow",
"*": "deny"
},
"bash": "deny",
"mcp": "deny"
}
}Note: bash and mcp are explicitly denied because they weren't in the original groups list.
Default Modes
The following Kilocode default modes are skipped during migration because Opencode has native equivalents:
| Kilocode Mode | Reason |
|---|---|
code |
Maps to Opencode's build agent |
architect |
Maps to Opencode's plan agent |
ask |
Read-only exploration (use explore subagent) |
debug |
Debugging workflow (use build with debug instructions) |
orchestrator |
Redundant - all Opencode agents can spawn subagents |
Example Conversion
Kilocode Mode (YAML)
customModes:
- slug: translate
name: Translate
roleDefinition: You are a linguistic specialist focused on translation.
customInstructions: |
When translating:
- Maintain consistent terminology
- Preserve formatting
groups:
- read
- - edit
- fileRegex: "src/i18n/.*\\.json$"
description: "Translation files only"
description: Translate content between languagesOpencode Agent (JSON)
{
"agent": {
"translate": {
"mode": "primary",
"description": "Translate content between languages",
"prompt": "You are a linguistic specialist focused on translation.\n\nWhen translating:\n- Maintain consistent terminology\n- Preserve formatting",
"permission": {
"read": "allow",
"edit": {
"src/i18n/.*\\.json$": "allow",
"*": "deny"
}
}
}
}
}Not Migrated (Future Phases)
The following Kilocode features are not yet migrated:
| Feature | Status | Notes |
|---|---|---|
Rules (.kilocode/rules/) |
Phase 2 | Will map to instructions array |
Workflows (.kilocode/workflows/) |
Phase 2 | Will map to custom commands |
MCP Servers (mcp_settings.json) |
Phase 2 | Will map to mcp config |
| Provider Settings | Phase 2 | Will map to provider config |
| Mode-specific API configs | Phase 2 | Different models per mode |
| Organization modes | Not planned | source: organization not preserved |
Troubleshooting
Mode not appearing
- Check the file exists at the expected location
- Verify YAML syntax is valid
- Ensure the mode has a unique
slug - Check it's not a default mode (which are skipped)
Permissions not working
- Verify the
groupsarray is correctly formatted - For file restrictions, ensure
fileRegexis a valid regex - Check the permission mapping table above
Related Files
modes-migrator.ts- Core migration logicconfig-injector.ts- Config building and injection
Skills Discovery
Kilocode skills are automatically discovered and made available in Opencode. This is not a migration - skills remain in their original locations and can be managed independently by the Kilo VSCode extension.
How It Works
Kilo scans canonical .kilo/skill/ and .kilo/skills/ directories alongside legacy .kilocode/ equivalents. The KilocodePaths.skillDirectories() function provides these paths.
Source Locations
Skills are discovered from these locations (in order, later entries override earlier ones):
Project Skills (Walk-up Discovery)
The scanner walks up from the current directory to the git worktree root, finding all .kilocode/skills/ directories:
your-project/
├── .kilocode/
│ └── skills/
│ └── project-skill/
│ └── SKILL.md
└── packages/
└── my-package/ # If you run from here
└── .kilocode/
└── skills/
└── package-skill/
└── SKILL.mdRunning from packages/my-package/ discovers both package-skill and project-skill.
Global Skills
| Platform | Path |
|---|---|
| All | ~/.kilocode/skills/ |
VSCode Extension Storage (Marketplace Skills)
| Platform | Path |
|---|---|
| macOS | ~/Library/Application Support/Code/User/globalStorage/kilocode.kilo-code/skills/ |
| Windows | %APPDATA%/Code/User/globalStorage/kilocode.kilo-code/skills/ |
| Linux | ~/.config/Code/User/globalStorage/kilocode.kilo-code/skills/ |
Skill File Format
Skills use the same SKILL.md format as Opencode:
---
name: my-skill
description: When to use this skill
---
# Instructions
Detailed instructions for the agent...Priority / Override Behavior
When the same skill name exists in multiple locations, last one wins. Canonical .kilo/ skills take precedence over legacy .kilocode/ skills at the same project level. Explicit external skill paths and compatibility directories are loaded according to the configured scan order.
Mode-Specific Skills
Kilocode supports mode-specific skills in skills-{mode}/ directories (e.g., skills-code/, skills-architect/). These are not currently migrated to Opencode.
If you need mode-specific behavior, use Opencode's agent permission system:
{
"agent": {
"build": {
"permission": {
"skill": {
"translation": "deny"
}
}
}
}
}Symlink Support
Skills can be symlinked from a shared location:
.agents/skills/shared-skill/ # Actual skill
.kilocode/skills/shared-skill -> ... # Legacy symlink
.kilo/skill/shared-skill -> ... # Canonical symlinkThe scanner follows symlinks, so a skill installed once can be available to both Kilo VSCode and Opencode CLI.
Related Files
Rules Migration
Kilocode rules are migrated to Opencode's instructions array. See rules-migrator.ts.
Source Locations
| Location | Description |
|---|---|
.kilocoderules |
Legacy project rules file |
.kilocode/rules/*.md |
Project rules directory |
~/.kilocode/rules/*.md |
Global rules directory |
.kilocoderules-{mode} |
Mode-specific legacy rules |
.kilocode/rules-{mode}/*.md |
Mode-specific rules directory |
Workflows Migration
Kilocode workflows are migrated to Opencode commands. See workflows-migrator.ts.
Source Locations
| Location | Description |
|---|---|
.kilocode/workflows/*.md |
Project workflows |
~/.kilocode/workflows/*.md |
Global workflows |
| VSCode extension storage | Marketplace-installed workflows |
MCP Migration
Kilocode MCP server configurations are migrated to Opencode's mcp config. See mcp-migrator.ts.
Config file location
The CLI reads global config from ~/.config/kilo/ (see global/index.ts: Global.Path.config = xdgConfig + "kilo"). It merges, in order, config.json, opencode.json, and opencode.jsonc in that directory. You can put MCP config in opencode.json or opencode.jsonc.
- macOS / Linux:
~/.config/kilo/opencode.json(oropencode.jsonc) - Windows: Config directory depends on
xdg-basedir(often under%LOCALAPPDATA%or%USERPROFILE%); filename is stillopencode.jsonoropencode.jsonc.
Use a top-level "mcp" object. Each key is the server name. For a local server, value must have type: "local" and command: ["executable", "arg1", ...]. Optional: environment (env vars), enabled (boolean), timeout (ms). See Config.McpLocal in config.ts. Restart the CLI after editing.
Source Location (migration from Kilocode)
| Location | Description |
|---|---|
VSCode extension storage settings/cline_mcp_settings.json |
MCP server configurations |
Kilo Notifications
When connected to Kilo Gateway, the CLI fetches and displays notifications from the Kilo API. This allows Kilo to communicate important announcements, feature updates, and tips to users.
How It Works
- On startup, if the user is authenticated with Kilo Gateway, the CLI fetches notifications from
https://api.kilo.ai/api/users/notifications - Filtering: Only notifications with
showIncontaining"cli"(or noshowInrestriction) are displayed - Display: The first notification is shown as a toast notification after a 2-second delay
Notification Data Structure
interface KilocodeNotification {
id: string // Unique identifier
title: string // Notification title (e.g., "Agent skills now supported!")
message: string // Description text
action?: {
actionText: string // Link text (e.g., "Learn More")
actionURL: string // URL destination
}
showIn?: string[] // Target platforms: ["cli", "vscode"]
}Example Notification
Title: Agent skills now supported!
Message: Define reusable skills and workflows for your AI agent.
Action: Learn More -> https://docs.kilo.ai/skillsDisplay Conditions
| Condition | Notifications Shown |
|---|---|
| Connected to Kilo Gateway | Yes |
| Not connected to Kilo | No |
| No notifications from API | No |
Related Files
notifications.ts- Fetch function and typesroutes.ts- Server endpoint/kilo/notificationsapp.tsx- TUI notification display logic
Packages Opencode Src Kilocode Docs Rules Migration (`packages/opencode/src/kilocode/docs/rules-migration.md`)
Kilocode Rules Migration
This document explains how Kilocode rules are automatically migrated to Opencode's instructions config array.
Overview
Kilocode stores rules in various file locations. When Opencode starts, it reads these files and injects their paths into the instructions config array, which Opencode then loads as part of the system prompt.
Key Guarantees
1. Read-Only Migration
The migration never modifies project files. We only:
- Read existing rule files from disk
- Inject file paths into the config's
instructionsarray - Never write to the project or modify any files
2. Combines with Existing Config (Never Overwrites)
If you have existing opencode config with instructions, the Kilocode rules are combined, not replaced:
// Example: User has opencode.json with:
{ "instructions": ["AGENTS.md", "custom-rules.md"] }
// Kilocode rules add:
{ "instructions": [".kilocoderules", ".kilocode/rules/coding.md"] }
// Result (combined, deduplicated):
{ "instructions": ["AGENTS.md", "custom-rules.md", ".kilocoderules", ".kilocode/rules/coding.md"] }3. Restart to Pick Up Changes
If you change your Kilocode configuration (e.g., edit .kilocoderules), simply restart kilo-cli to pick up the new config. No manual migration or conversion needed.
Source Locations
The migrator reads rules from these locations:
Project Rules
| Location | Description |
|---|---|
.kilocoderules |
Legacy single-file rules in project root |
.kilocode/rules/*.md |
Directory-based rules (multiple markdown files) |
.kilocoderules-{mode} |
Mode-specific legacy rules (e.g., .kilocoderules-code) |
.kilocode/rules-{mode}/*.md |
Mode-specific rule directories |
Global Rules
| Location | Description |
|---|---|
~/.kilocode/rules/*.md |
Global rules directory |
File Mapping
| Kilocode Location | Opencode Equivalent |
|---|---|
.kilocoderules |
instructions: [".kilocoderules"] |
.kilocoderules-{mode} |
instructions: [".kilocoderules-{mode}"] |
.kilocode/rules/*.md |
instructions: [".kilocode/rules/file.md", ...] |
.kilocode/rules-{mode}/*.md |
instructions: [".kilocode/rules-{mode}/file.md", ...] |
~/.kilocode/rules/*.md |
instructions: ["~/.kilocode/rules/file.md", ...] |
AGENTS.md Compatibility
AGENTS.md is loaded natively by Opencode - no migration needed. Opencode automatically loads:
AGENTS.mdin project rootCLAUDE.mdin project root~/.config/kilo/AGENTS.md(global)
Not Migrated
The following are not migrated:
.roorules- Roo-specific rules.clinerules- Cline-specific rules
Only Kilocode-specific files (.kilocoderules, .kilocode/rules/) are migrated.
Mode-Specific Rules
Mode-specific rules (e.g., .kilocoderules-code, .kilocode/rules-architect/) are included by default. All mode-specific rules are loaded regardless of the current mode.
Warnings
The migrator generates warnings for:
- Legacy files: When
.kilocoderulesis found, a warning suggests migrating to.kilocode/rules/directory structure
Example
Before (Kilocode)
project/
├── .kilocoderules # Legacy rules
├── .kilocoderules-code # Code-mode specific
└── .kilocode/
└── rules/
├── coding.md # Coding standards
└── testing.md # Testing guidelinesAfter (Opencode Config)
{
"instructions": [
"/path/to/project/.kilocode/rules/coding.md",
"/path/to/project/.kilocode/rules/testing.md",
"/path/to/project/.kilocoderules",
"/path/to/project/.kilocoderules-code"
]
}Troubleshooting
Rules not appearing
- Check the file exists at the expected location
- Ensure markdown files have
.mdextension - Restart kilo-cli to pick up changes
Duplicate rules
The mergeConfigConcatArrays function automatically deduplicates the instructions array using Array.from(new Set([...])).
Related Files
rules-migrator.ts- Core migration logicconfig-injector.ts- Config building and injectionmodes-migration.md- Modes migration documentation
--- METRICS ---
- Files Extracted: 53
- Estimated Token Budget: ~29105 tokens
- Canonical Reference: https://codewiki.google/github.com/Kilo-Org/kilocode