Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
46c04f0
fix(cli): redirect deprecated /review to /local-review-uncommitted
maphew Jun 10, 2026
69e5c58
fix(cli): resolve review bot code issues and add changeset
maphew Jun 10, 2026
396845f
fix(cli): handle argument-based /review invocations in deprecated com…
kilo-code-bot[bot] Jun 11, 2026
66e9bbf
Merge branch 'main' into main
maphew Jun 12, 2026
6165acb
Merge branch 'main' into main
maphew Jun 15, 2026
4134243
Merge branch 'main' into main
maphew Jun 17, 2026
dfaca49
feat(opencode): unify local review commands under `/review`
maphew Jun 18, 2026
5978bf7
fix(cli): preserve legacy review command aliases
maphew Jun 19, 2026
04c8780
fix(cli): make /review the only review command
alex-alecu Jun 25, 2026
3e7e03d
Merge remote-tracking branch 'origin/main' into maphew/main
alex-alecu Jun 25, 2026
830199b
Merge branch 'main' into main
alex-alecu Jun 25, 2026
ef3c23c
fix(review): prefer commit refs
alex-alecu Jun 25, 2026
9818996
Merge branch 'main' into main
alex-alecu Jun 25, 2026
468190f
test(cli): refresh llm fixtures
alex-alecu Jun 25, 2026
b5525fd
Merge branch 'main' into main
alex-alecu Jun 26, 2026
8ea9628
fix(review): keep legacy aliases
alex-alecu Jun 30, 2026
a013741
fix(review): narrow dead code
alex-alecu Jun 30, 2026
c2636fb
fix(review): reject merge commits
alex-alecu Jun 30, 2026
7ddfc19
fix(review): validate base refs
alex-alecu Jun 30, 2026
fe3a763
feat(review): skip subagents on small diffs
alex-alecu Jun 30, 2026
496f743
Merge branch 'main' into main
alex-alecu Jun 30, 2026
cdd0137
refactor(cli): focus soul on personality
alex-alecu Jun 30, 2026
98ca191
test(cli): update review command expectations
alex-alecu Jun 30, 2026
b6d02fd
Merge branch 'main' into main
alex-alecu Jun 30, 2026
eb40da5
Merge branch 'main' into main
alex-alecu Jun 30, 2026
ac93273
fix(ci): harden visual regression installs
alex-alecu Jun 30, 2026
11c6b79
fix(ci): include setup action filter
alex-alecu Jun 30, 2026
2781d45
fix(cli): restore deprecated review aliases
alex-alecu Jun 25, 2026
8b7b69b
Merge branch 'main' into main
alex-alecu Jul 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/fix-review-command-issues.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@kilocode/cli": patch
---

Use `/review` as the single local review command, defaulting to staged, unstaged, and untracked changes while supporting guided uncommitted reviews, branch/base reviews, commits, and pull requests. Show deprecation notices for `/local-review` and `/local-review-uncommitted` that point to the matching `/review` modes.
28 changes: 3 additions & 25 deletions .github/workflows/visual-regression.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
matched=false
while IFS= read -r file; do
case "$file" in
packages/kilo-ui/*|packages/ui/*|packages/util/*|packages/sdk/js/*|packages/kilo-vscode/webview-ui/*|packages/kilo-vscode/.storybook/*|packages/kilo-vscode/tests/visual-regression*|packages/kilo-vscode/tests/permission-dock-dropdown*|packages/kilo-vscode/tests/accessibility*|packages/kilo-docs/public/img/screenshot-tests/*|.github/workflows/visual-regression.yml)
packages/kilo-ui/*|packages/ui/*|packages/util/*|packages/sdk/js/*|packages/kilo-vscode/webview-ui/*|packages/kilo-vscode/.storybook/*|packages/kilo-vscode/tests/visual-regression*|packages/kilo-vscode/tests/permission-dock-dropdown*|packages/kilo-vscode/tests/accessibility*|packages/kilo-docs/public/img/screenshot-tests/*|.github/actions/setup-bun/*|.github/workflows/visual-regression.yml)
matched=true
break
;;
Expand Down Expand Up @@ -76,18 +76,7 @@ jobs:
fi

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest

- name: Cache Bun modules
uses: actions/cache@v5 # kilocode_change
with:
path: ~/.bun/install/cache
key: bun-${{ hashFiles('bun.lock') }}

- name: Install dependencies
run: bun install
uses: ./.github/actions/setup-bun # kilocode_change
Comment thread
alex-alecu marked this conversation as resolved.

- name: Cache Playwright browsers
id: playwright-cache
Expand Down Expand Up @@ -244,18 +233,7 @@ jobs:
fi

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest

- name: Cache Bun modules
uses: actions/cache@v5 # kilocode_change
with:
path: ~/.bun/install/cache
key: bun-${{ hashFiles('bun.lock') }}

- name: Install dependencies
run: bun install
uses: ./.github/actions/setup-bun # kilocode_change

- name: Cache Playwright browsers
id: playwright-cache-vscode
Expand Down
8 changes: 5 additions & 3 deletions packages/kilo-docs/pages/automate/agent-manager-workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,12 +152,14 @@ Put the remaining project-specific setup in `.kilo/setup-script`, for example co
Layer review in before asking a teammate:

- **Diff panel** (`Cmd+D`) — live diff against the parent branch. Drag filenames into the chat input for `@file` mentions. Inline-comment the lines you want revisited, then **Send to chat** to iterate.
- **`/local-review-uncommitted`** — slash command, AI review of staged and unstaged changes in the worktree. Good as a last pass before committing.
- **`/local-review`** — slash command, AI review of the whole branch vs. its base.
- **`/review`** — slash command, AI review of staged, unstaged, and untracked changes in the worktree when run without arguments. Good as a last pass before committing.
- **`/review uncommitted [guidance]`** — explicitly review uncommitted changes, optionally focusing the review with guidance.
- **`/review branch [base] [guidance]`** — review the whole branch vs. its detected or specified base, with optional guidance.
- **`/review <commit-hash>` or `/review <PR URL or number>`** — review a specific commit or pull request.
- **`kilo review` in CI** — automated PR review. See [Code Reviews](/docs/automate/code-reviews/overview) for the setup.
- **Human review** — push the branch from the session terminal and `gh pr create`. The PR badge appears on the worktree and stays in sync with CI and reviews.

A typical sequence: self-review in the diff panel → `/local-review-uncommitted` → push → CI review → teammate review.
A typical sequence: self-review in the diff panel → `/review` → push → CI review → teammate review.

## Merging worktree and parent branch

Expand Down
18 changes: 12 additions & 6 deletions packages/kilo-docs/pages/automate/code-reviews/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,18 +120,24 @@ Code Reviewer is also available locally. This is valuable for developers who wan
{% tabs %}
{% tab label="VSCode" %}

Two slash commands are available for local code reviews:
Use `/review` for all local code reviews:

- **`/local-review`** — Review all changes on your current branch vs the base branch
- **`/local-review-uncommitted`** — Review uncommitted changes (staged + unstaged)
- **`/review`** — Review uncommitted changes (staged, unstaged, and untracked) when run without arguments
- **`/review uncommitted [guidance]`** — Review uncommitted changes with optional guidance
- **`/review branch [base] [guidance]`** — Review your current branch vs. its detected or specified base, with optional guidance
- **`/review <commit-hash>`** — Review a specific commit
- **`/review <PR URL or number>`** — Review a pull request

{% /tab %}
{% tab label="CLI" %}

Two slash commands are available for local code reviews:
Use `/review` for all local code reviews:

- **`/local-review`** — Review all changes on your current branch vs the base branch
- **`/local-review-uncommitted`** — Review uncommitted changes (staged + unstaged)
- **`/review`** — Review uncommitted changes (staged, unstaged, and untracked) when run without arguments
- **`/review uncommitted [guidance]`** — Review uncommitted changes with optional guidance
- **`/review branch [base] [guidance]`** — Review your current branch vs. its detected or specified base, with optional guidance
- **`/review <commit-hash>`** — Review a specific commit
- **`/review <PR URL or number>`** — Review a pull request

{% /tab %}
{% /tabs %}
Expand Down
10 changes: 6 additions & 4 deletions packages/kilo-docs/pages/code-with-ai/platforms/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,7 @@ For detailed help on every command and subcommand, see the [CLI Command Referenc
| Command | Description |
|---|---|
| `/init` | Create/update AGENTS.md file for the project |
| `/local-review` | Review code changes |
| `/local-review-uncommitted` | Review uncommitted changes |
| `/review` | Review code changes |

## Local Code Reviews

Expand All @@ -144,8 +143,11 @@ Review your code locally before pushing — catch issues early without waiting f

| Command | Description |
|---|---|
| `/local-review` | Review current branch changes vs base branch |
| `/local-review-uncommitted` | Review uncommitted changes (staged + unstaged) |
| `/review` | Review staged, unstaged, and untracked changes (the default with no arguments) |
| `/review uncommitted [guidance]` | Review uncommitted changes with optional guidance |
| `/review branch [base] [guidance]` | Review the current branch against its detected or specified base, with optional guidance |
| `/review <commit-hash>` | Review a specific commit |
| `/review <PR URL or number>` | Review a pull request |

## Config Reference

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ For Markdown files, use the eye/code toggle in the file header to switch between

### How do I do code reviews in the new extension?

You can now trigger local AI-powered code reviews directly by using two commands: **`/local-review`** to review all changes on your current branch vs the base branch, and **`/local-review-uncommitted`** to review staged and unstaged changes.
You can now trigger local AI-powered code reviews directly with **`/review`**. With no arguments, it reviews staged, unstaged, and untracked changes. Use **`/review uncommitted [guidance]`** for explicit uncommitted review, **`/review branch [base] [guidance]`** for branch review, **`/review <commit-hash>`** for a commit, or **`/review <PR URL or number>`** for a pull request.
See the [Code Reviews](/docs/automate/code-reviews/overview) documentation for the full setup and options.

### How can I see the cost of each model?
Expand Down
2 changes: 1 addition & 1 deletion packages/kilo-telemetry/src/telemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export interface TelemetryProperties {
vscodeVersion?: string
}

export type ReviewCommand = "review" | "local-review" | "local-review-uncommitted"
export type ReviewCommand = "review"

export interface IndexingTelemetryProperties extends Record<string, unknown> {
source: "scan" | "watcher"
Expand Down
6 changes: 3 additions & 3 deletions packages/kilo-vscode/tests/unit/kilo-provider-utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -621,8 +621,8 @@ describe("mapSSEEventToWebviewMessage", () => {
properties: {
id: "sug-1",
sessionID: "sess-1",
text: "Review changes?",
actions: [{ label: "Start", prompt: "/local-review-uncommitted" }],
text: "Run tests?",
actions: [{ label: "Run tests", prompt: "Run the test suite" }],
},
}
const msg = mapSSEEventToWebviewMessage(event, "sess-1")
Expand All @@ -636,7 +636,7 @@ describe("mapSSEEventToWebviewMessage", () => {
sessionID: "sess-1",
requestID: "sug-1",
index: 0,
action: { label: "Start", prompt: "/local-review-uncommitted" },
action: { label: "Run tests", prompt: "Run the test suite" },
},
}
const msg = mapSSEEventToWebviewMessage(event, "sess-1")
Expand Down
4 changes: 2 additions & 2 deletions packages/kilo-vscode/tests/unit/suggestion-recovery.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ function pending(id: string, sessionID: string): RecoverableSuggestion {
return {
id,
sessionID,
text: "Review changes?",
actions: [{ label: "Start", prompt: "/local-review-uncommitted" }],
text: "Run tests?",
actions: [{ label: "Run tests", prompt: "Run the test suite" }],
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ const reviewSuggestion: SuggestionRequest = {
id: "s-review-001",
sessionID: SESSION_ID,
text: "Start a code review of uncommitted changes?",
actions: [{ label: "Start review", description: "Run a local review now", prompt: "/local-review-uncommitted" }],
actions: [{ label: "Start review", description: "Run a local review now", prompt: "/review uncommitted" }],
tool: { messageID: "asst-msg-002", callID: "call-suggest-001" },
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ const blockSuggestions: SuggestionRequest[] = [
sessionID: SID,
text: "Run a local visual review after checking this block matrix.",
actions: [
{ label: "Review UI", prompt: "/local-review-uncommitted" },
{ label: "Review UI", prompt: "/review uncommitted" },
{ label: "Open Storybook", prompt: "Inspect the Tool Call Lab Block Matrix story" },
],
tool: { messageID: MID, callID: "matrix-call-suggest-active" },
Expand Down
31 changes: 8 additions & 23 deletions packages/opencode/src/command/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ import { Effect, Layer, Context, Schema } from "effect"
import { Config } from "@/config/config"
import { MCP } from "../mcp"
import { Skill } from "../skill"
import { localReviewCommand, localReviewUncommittedCommand } from "@/kilocode/review/command" // kilocode_change
import { legacyReviewCommand, reviewCommand } from "@/kilocode/review/command" // kilocode_change
import PROMPT_INITIALIZE from "./template/initialize.txt"
import PROMPT_REVIEW from "./template/review.txt"

type State = {
commands: Record<string, Info>
Expand Down Expand Up @@ -54,10 +53,6 @@ export function hints(template: string) {
export const Default = {
INIT: "init",
REVIEW: "review",
// kilocode_change start
LOCAL_REVIEW: "local-review",
LOCAL_REVIEW_UNCOMMITTED: "local-review-uncommitted",
// kilocode_change end
} as const

export interface Interface {
Expand Down Expand Up @@ -110,20 +105,10 @@ export const layer = Layer.effect(
},
hints: hints(PROMPT_INITIALIZE),
}
commands[Default.REVIEW] = {
name: Default.REVIEW,
description: "review changes [commit|branch|pr], defaults to uncommitted",
source: "command",
get template() {
return PROMPT_REVIEW.replace("${path}", ctx.worktree)
},
subtask: true,
hints: hints(PROMPT_REVIEW),
}

// kilocode_change start
commands[Default.LOCAL_REVIEW] = localReviewCommand()
commands[Default.LOCAL_REVIEW_UNCOMMITTED] = localReviewUncommittedCommand()
commands[Default.REVIEW] = reviewCommand()
commands["local-review"] = legacyReviewCommand("local-review")!
commands["local-review-uncommitted"] = legacyReviewCommand("local-review-uncommitted")!
// kilocode_change end

for (const [name, command] of Object.entries(cfg.command ?? {})) {
Expand Down Expand Up @@ -184,10 +169,10 @@ export const layer = Layer.effect(

const get = Effect.fn("Command.get")(function* (name: string) {
const s = yield* InstanceState.get(state)
// kilocode_change start
const exact = s.commands[name]
if (exact) return exact
// kilocode_change end
const exact = s.commands[name] // kilocode_change
if (exact) return exact // kilocode_change
const alias = legacyReviewCommand(name) // kilocode_change
if (alias) return alias // kilocode_change

// kilocode_change start
const target = skillName(name)
Expand Down
3 changes: 3 additions & 0 deletions packages/opencode/src/kilocode/cli/cmd/command-display.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { reviewCommandName } from "@/kilocode/review/command"

type Command = {
name: string
source?: "command" | "mcp" | "skill"
Expand All @@ -10,5 +12,6 @@ export function slashDisplay(cmd: Command) {
}

export function slashMatches(cmd: Command, name: string) {
if (cmd.name === "review" && reviewCommandName(name)) return true
Comment thread
alex-alecu marked this conversation as resolved.
return cmd.name === name || slashDisplay(cmd).slice(1) === name
}
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ export const KILO_TIPS: Tip[] = [
"Run {highlight}docker run -it --rm ghcr.io/kilo-org/kilocode{/highlight} for containerized use",
"Use {highlight}/connect{/highlight} with Kilo Gateway for curated, tested models",
"Commit your project's {highlight}AGENTS.md{/highlight} file to Git for team sharing",
"Use {highlight}/review{/highlight} to review uncommitted changes, branches, or PRs",
"Use {highlight}/review{/highlight} to review uncommitted changes, commits, branches, or PRs",
(shortcuts) => `Use ${commandText("/help", shortcuts.helpShow())} to show the help dialog`,
"Use {highlight}/rename{/highlight} to rename the current session",
...(process.platform === "win32"
Expand Down
2 changes: 1 addition & 1 deletion packages/opencode/src/kilocode/components/tips.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ const TIPS = [
"Press {highlight}Ctrl+X S{/highlight} or {highlight}/status{/highlight} to see config paths, MCP servers, and system info",
"Toggle username display in chat via command palette ({highlight}Ctrl+P{/highlight})",
"Commit your project's {highlight}AGENTS.md{/highlight} file to Git for team sharing",
"Use {highlight}/review{/highlight} to review uncommitted changes, branches, or PRs",
"Use {highlight}/review{/highlight} to review uncommitted changes, commits, branches, or PRs",
"Run {highlight}/help{/highlight} to show the help dialog",
"Use {highlight}/rename{/highlight} to rename the current session",
"Press {highlight}Ctrl+Z{/highlight} to suspend the terminal and return to your shell",
Expand Down
52 changes: 33 additions & 19 deletions packages/opencode/src/kilocode/review/command.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,52 @@
import type { Command } from "@/command"
import type { ReviewCommand } from "@kilocode/kilo-telemetry"
import LOCAL_REVIEW from "./local-review.txt"
import LOCAL_REVIEW_UNCOMMITTED from "./local-review-uncommitted.txt"
import REVIEW from "./review.txt"

const legacy = {
"local-review": {
description: "deprecated; use /review branch",
message: "/local-review is deprecated and no longer runs a review. Use /review branch instead.",
},
"local-review-uncommitted": {
description: "deprecated; use /review uncommitted",
message: "/local-review-uncommitted is deprecated and no longer runs a review. Use /review uncommitted instead.",
},
}

export function isReviewCommand(command: string | undefined): command is ReviewCommand {
return command === "review" || command === "local-review" || command === "local-review-uncommitted"
return command === "review"
Comment thread
alex-alecu marked this conversation as resolved.
}

export function reviewCommandName(command: string | undefined): ReviewCommand | undefined {
if (isReviewCommand(command)) return command
}

export function parseReviewCommand(prompt: string | undefined): ReviewCommand | undefined {
if (!prompt?.startsWith("/")) return
const name = prompt.slice(1).split(/\s/, 1)[0]
if (isReviewCommand(name)) return name
return reviewCommandName(name)
}

/**
* /local-review-uncommitted - local review (uncommitted changes)
*/
export function localReviewUncommittedCommand(): Command.Info {
export function reviewCommand(): Command.Info {
return {
name: "local-review-uncommitted",
description: "local review (uncommitted changes)",
template: LOCAL_REVIEW_UNCOMMITTED,
name: "review",
description: "review changes [uncommitted|commit|branch|pr]",
template: REVIEW,
hints: ["$ARGUMENTS"],
}
}

/**
* /local-review - local review (current branch vs base)
*/
export function localReviewCommand(): Command.Info {
export function legacyReviewMessage(name: string) {
return legacy[name as keyof typeof legacy]?.message
}

export function legacyReviewCommand(name: string): Command.Info | undefined {
const item = legacy[name as keyof typeof legacy]
if (!item) return
return {
name: "local-review",
description: "local review (current branch, optional base or instructions)",
template: LOCAL_REVIEW,
hints: ["$ARGUMENTS"],
name,
description: item.description,
template: item.message,
hints: [],
}
}
Loading
Loading