Skip to content

Commit 33d7b4f

Browse files
authored
chore(release): bump kimi-cli and kimi-code to 1.44.0 (#2262)
1 parent 6c0b949 commit 33d7b4f

18 files changed

Lines changed: 280 additions & 54 deletions

File tree

.agents/skills/release/SKILL.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,29 @@ The Rust implementation (`kagent`) lives in a separate repository and is **not**
4646

4747
Wait for explicit user approval before proceeding. If the user flags anything, fix it and re-confirm — do not push.
4848

49-
10. **Open the PR.** Commit all changes, push, and open a PR with `gh` describing the version bumps.
49+
10. **Open the PR.** Commit all changes, push, and open a PR with `gh`. The PR description must follow this structure (see https://github.com/MoonshotAI/kimi-cli/pull/2225 for reference):
50+
51+
```markdown
52+
## Summary
53+
- Bump <package> to <version>
54+
- Move the current release notes under <version>
55+
- (If applicable) Move breaking-change entries under <version>
56+
- (If applicable) Any additional noteworthy changes (dependency pin updates, etc.)
57+
58+
## Validation
59+
- uv run python scripts/check_version_tag.py --pyproject <pyproject> --expected-version <version>
60+
- (For root releases) uv run python scripts/check_version_tag.py --pyproject packages/kimi-code/pyproject.toml --expected-version <version>
61+
- uv run python scripts/check_kimi_dependency_versions.py --root-pyproject pyproject.toml --kosong-pyproject packages/kosong/pyproject.toml --pykaos-pyproject packages/kaos/pyproject.toml
62+
- make check
63+
64+
## Post-merge
65+
After this PR lands, create and push the release tag:
66+
67+
```sh
68+
git tag <tag>
69+
git push origin <tag>
70+
```
71+
```
5072

5173
11. **Hand off the tag step.** After merge, switch to `main`, pull latest, and tell the user the exact `git tag` command for the final release tag (pick the right tag pattern from the table above — e.g. `git tag 1.43.0` for a root release, `git tag kosong-0.54.0` for a kosong release). The user will run the tag and push tags themselves.
5274

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ Only write entries that are worth mentioning to users.
1111

1212
## Unreleased
1313

14+
## 1.44.0 (2026-05-13)
15+
16+
- Shell: Add slash command alias resolution — aliases such as `/h`, `?`, and `status` now resolve to their canonical commands (`/help`, `/usage`); the completer and help output display alias matches as `/name (alias)` for clarity
17+
- Shell: Fix `/usage` alias registration — the alias was incorrectly stored as `"/status"` instead of `"status"`, causing alias lookup to fail
18+
1419
## 1.43.0 (2026-05-12)
1520

1621
- Security: Bump pillow to 12.2.0 to address CVE-2026-25990 (out-of-bounds write when loading PSD images); unblocks installs in environments that gate on the older pinned version

docs/en/release-notes/breaking-changes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ This page documents breaking changes in Kimi Code CLI releases and provides migr
44

55
## Unreleased
66

7+
## 1.43.0
8+
79
### MCP OAuth token cache moved to `~/.kimi/mcp-oauth/`
810

911
Kimi Code CLI now uses FastMCP 3's persistent OAuth storage API for MCP servers and stores MCP OAuth tokens under `~/.kimi/mcp-oauth/`. Tokens from the old FastMCP 2.x cache location are not migrated automatically.

docs/en/release-notes/changelog.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ This page documents the changes in each Kimi Code CLI release.
44

55
## Unreleased
66

7+
## 1.44.0 (2026-05-13)
8+
9+
- Shell: Add slash command alias resolution — aliases such as `/h`, `?`, and `status` now resolve to their canonical commands (`/help`, `/usage`); the completer and help output display alias matches as `/name (alias)` for clarity
10+
- Shell: Fix `/usage` alias registration — the alias was incorrectly stored as `"/status"` instead of `"status"`, causing alias lookup to fail
11+
712
## 1.43.0 (2026-05-12)
813

914
- Security: Bump pillow to 12.2.0 to address CVE-2026-25990 (out-of-bounds write when loading PSD images); unblocks installs in environments that gate on the older pinned version

docs/zh/release-notes/breaking-changes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
## 未发布
66

7+
## 1.43.0
8+
79
### MCP OAuth token 缓存迁移到 `~/.kimi/mcp-oauth/`
810

911
Kimi Code CLI 现在为 MCP 服务器使用 FastMCP 3 的持久化 OAuth 存储 API,并将 MCP OAuth token 存储在 `~/.kimi/mcp-oauth/`。旧 FastMCP 2.x 缓存位置中的 token 不会自动迁移。

docs/zh/release-notes/changelog.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55
## 未发布
66

7+
## 1.44.0 (2026-05-13)
8+
9+
- Shell:新增斜杠命令别名解析——别名(如 `/h``?``status`)现在能正确解析到对应的正式命令(`/help``/usage`);补全器和帮助输出会将别名匹配项显示为 `/name (alias)`,方便识别
10+
- Shell:修复 `/usage` 的别名注册——别名原先被错误地登记为 `"/status"` 而非 `"status"`,导致别名查找失败
11+
712
## 1.43.0 (2026-05-12)
813

914
- Security:将 pillow 升级到 12.2.0 以修复 CVE-2026-25990(加载 PSD 图像时存在越界写入);解除在依赖审查严格的环境下因旧版本被阻断而无法安装的限制

packages/kimi-code/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
[project]
22
name = "kimi-code"
3-
version = "1.43.0"
3+
version = "1.44.0"
44
description = "Kimi Code is a CLI agent that lives in your terminal."
55
readme = "README.md"
66
requires-python = ">=3.12"
7-
dependencies = ["kimi-cli==1.43.0"]
7+
dependencies = ["kimi-cli==1.44.0"]
88

99
[project.scripts]
1010
kimi-code = "kimi_cli.__main__:main"

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "kimi-cli"
3-
version = "1.43.0"
3+
version = "1.44.0"
44
description = "Kimi Code CLI is your next CLI agent."
55
readme = "README.md"
66
requires-python = ">=3.12"

src/kimi_cli/ui/shell/__init__.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -200,17 +200,39 @@ def __init__(
200200
self._current_prompt_approval_request: ApprovalRequest | None = None
201201
self._approval_modal: ApprovalPromptDelegate | None = None
202202
self._exit_after_run = False
203+
soul_slash_commands = list(soul.available_slash_commands)
204+
shell_slash_commands = shell_slash_registry.list_commands()
203205
self._available_slash_commands: dict[str, SlashCommand[Any]] = {
204-
**{cmd.name: cmd for cmd in soul.available_slash_commands},
205-
**{cmd.name: cmd for cmd in shell_slash_registry.list_commands()},
206+
**{cmd.name: cmd for cmd in soul_slash_commands},
207+
**{cmd.name: cmd for cmd in shell_slash_commands},
206208
}
207-
"""Shell-level slash commands + soul-level slash commands. Name to command mapping."""
209+
"""Shell-level slash commands + soul-level slash commands. Primary name mapping."""
210+
self._available_slash_command_index = self._index_slash_commands(
211+
[*soul_slash_commands, *shell_slash_commands]
212+
)
213+
"""Shell-level slash commands + soul-level slash commands.
214+
Primary name and alias mapping.
215+
"""
208216

209217
@property
210218
def available_slash_commands(self) -> dict[str, SlashCommand[Any]]:
211219
"""Get all available slash commands, including shell-level and soul-level commands."""
212220
return self._available_slash_commands
213221

222+
@staticmethod
223+
def _index_slash_commands(commands: list[SlashCommand[Any]]) -> dict[str, SlashCommand[Any]]:
224+
indexed: dict[str, SlashCommand[Any]] = {}
225+
for command in commands:
226+
indexed[command.name] = command
227+
for alias in command.aliases:
228+
indexed[alias] = command
229+
return indexed
230+
231+
def _find_available_slash_command(self, name: str) -> SlashCommand[Any] | None:
232+
return self._available_slash_command_index.get(name) or self._available_slash_commands.get(
233+
name
234+
)
235+
214236
def _print_cwd_lost_crash(self) -> None:
215237
"""Print a crash report when the working directory is no longer accessible."""
216238
runtime = self.soul.runtime if isinstance(self.soul, KimiSoul) else None
@@ -631,14 +653,16 @@ def _can_auto_trigger_pending() -> bool:
631653
continue
632654

633655
if slash_cmd_call := self._agent_slash_command_call(user_input):
656+
available_command = self._find_available_slash_command(slash_cmd_call.name)
634657
is_soul_slash = (
635-
slash_cmd_call.name in self._available_slash_commands
658+
available_command is not None
636659
and shell_slash_registry.find_command(slash_cmd_call.name) is None
637660
)
638661
if is_soul_slash:
639662
from kimi_cli.telemetry import track
640663

641-
track("input_command", command=slash_cmd_call.name)
664+
assert available_command is not None
665+
track("input_command", command=available_command.name)
642666
background_autotrigger_armed = True
643667
resume_prompt.set()
644668
await self.run_soul_command(slash_cmd_call.raw_input)
@@ -752,7 +776,8 @@ async def _run_slash_command(self, command_call: SlashCommandCall) -> None:
752776
from kimi_cli.cli import Reload, SwitchToVis, SwitchToWeb
753777
from kimi_cli.telemetry import track
754778

755-
if command_call.name not in self._available_slash_commands:
779+
available_command = self._find_available_slash_command(command_call.name)
780+
if available_command is None:
756781
logger.info("Unknown slash command /{command}", command=command_call.name)
757782
track("input_command_invalid")
758783
console.print(
@@ -761,7 +786,7 @@ async def _run_slash_command(self, command_call: SlashCommandCall) -> None:
761786
)
762787
return
763788

764-
track("input_command", command=command_call.name)
789+
track("input_command", command=available_command.name)
765790

766791
command = shell_slash_registry.find_command(command_call.name)
767792
if command is None:

src/kimi_cli/ui/shell/prompt.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class CwdLostError(OSError):
8989
class SlashCommandCompleter(Completer):
9090
"""
9191
A completer that:
92-
- Shows one line per slash command using the canonical "/name"
92+
- Shows canonical matches as "/name" and alias matches as "/name (alias)"
9393
- Fuzzy-matches by primary name or any alias while inserting the canonical "/name"
9494
- Only activates when the current token starts with '/'
9595
"""
@@ -142,25 +142,32 @@ def get_completions(
142142
token = text[last_space + 1 :]
143143

144144
typed = token[1:]
145-
if typed and typed in self._command_lookup:
146-
return
147145
mention_doc = Document(text=typed, cursor_position=len(typed))
148146
candidates = list(self._fuzzy.get_completions(mention_doc, complete_event))
149147

150148
seen: set[str] = set()
151-
149+
candidate_triggers: list[str] = []
150+
if typed and typed in self._command_lookup:
151+
candidate_triggers.append(typed)
152152
for candidate in candidates:
153-
commands = self._command_lookup.get(candidate.text)
153+
if candidate.text not in candidate_triggers:
154+
candidate_triggers.append(candidate.text)
155+
156+
for trigger in candidate_triggers:
157+
commands = self._command_lookup.get(trigger)
154158
if not commands:
155159
continue
156160
for cmd in commands:
157161
if cmd.name in seen:
158162
continue
159163
seen.add(cmd.name)
164+
completion_text = f"/{cmd.name}"
165+
if trigger == cmd.name and typed == cmd.name:
166+
completion_text += " "
160167
yield Completion(
161-
text=f"/{cmd.name}",
168+
text=completion_text,
162169
start_position=-len(token),
163-
display=f"/{cmd.name}",
170+
display=cmd.display_name(trigger),
164171
display_meta=cmd.description,
165172
)
166173

0 commit comments

Comments
 (0)