v1.39.0
- Skill: Fix project-scope skills being ignored and user-scope skills silently winning name conflicts — the system prompt now groups discovered skills under
### Project/### User/### Extra/### Built-inheadings so the model can tell where each skill came from, and when the same name exists in multiple scopes the more specific scope wins (Project > User > Extra > Built-in) so a project's own.kimi/skills/fooor.claude/skills/foocorrectly overrides a user-level or bundledfooinstead of the other way around - Skill: Accept single-file
<name>.mdskills alongside the canonical<name>/SKILL.mdsubdirectory layout — useful when migrating a flat markdown collection into a skills directory;namedefaults to the filename stem (frontmattername:still wins if set), description follows the same three-step chain as subdirectory skills (frontmatterdescription:→ first non-empty body line, capped at 240 characters →"No description provided."placeholder), and if a flat and a subdirectory skill share a name in the same directory the subdirectory wins with a warning - Skill: Add
extra_skill_dirsconfig field for pulling in custom skill directories on top of the built-in / user / project auto-discovery — each entry may be an absolute path, a~-prefixed path (expanded against$HOME), or a path relative to the project root (the nearest.gitancestor of the work directory, not the current working directory); non-existent entries are silently skipped and symlink/trailing-slash duplicates canonicalize to a single root so a path listed twice or aliased to an already-discovered directory does not render twice in the system prompt - Skill: Harden discovery against
OSErrorfromis_dir/iterdir(for example when anextra_skill_dirsentry points at a directory with restricted permissions) — affected entries are logged and skipped instead of aborting the whole skill-discovery pass - Core: Fix DeepSeek V4 (and other OpenAI-compatible thinking-mode backends) returning 400
The reasoning_content in the thinking mode must be passed back to the APIwhen a tool call follows a reasoning turn —openai_legacyproviders now defaultreasoning_keyto"reasoning_content"so the response's reasoning is stored in history and round-tripped automatically on subsequent turns. An optionalreasoning_keyfield is also added toLLMProviderto override the field name (e.g."reasoning"for non-standard gateways) or disable round-tripping entirely by setting it to"" - Core: Add
skip_yolo_prompt_injectionconfig option to suppress the system reminder normally injected when yolo mode is active — useful when building custom applications on top ofKimiSoulthat do not need the non-interactive mode hint - Kimi: Add
KIMI_MODEL_THINKING_KEEPenvironment variable that forwards its value verbatim to the Moonshot API asthinking.keep, enabling Preserved Thinking (e.g.export KIMI_MODEL_THINKING_KEEP=allto retain historicalreasoning_contentacross turns); effective only for Moonshot models supporting Preserved Thinking (e.g.kimi-k2.6/kimi-k2-thinking), unset or empty string preserves the previous behavior and omits the field, and the override only applies when the current model is actually in thinking mode so the API never receives athinking.keepwithout the companionthinking.type. Note thatkeep=allincreases input tokens and API cost because history reasoning is resent - Kosong: Fix
Kimi.with_extra_bodysilently dropping previously setthinking.typewhen a later call added anotherthinking.*field — thethinkingsub-dict is now merged field-by-field instead of shallow-replaced, so composingwith_thinking(...)withwith_extra_body({"thinking": {...}})preserves both contributions - Kosong: Fix Kimi provider sending empty
contentalongsidetool_calls, which caused 400 "text content is empty" errors from the Moonshot API. When an assistant message has tool calls and its visible content is effectively empty (no text or only whitespace/think parts), thecontentfield is now omitted entirely - Shell: Fix approval request feedback text cursor rendering — the block cursor now correctly renders at the actual cursor position instead of always being pinned to the end of the line; when the cursor is in the middle of the text, the character under the cursor is drawn with reverse video (mimicking a terminal's native block cursor)
- Kosong: Fix Moonshot 400
At path 'properties.X': type is not definedwhen an MCP server exposes tools whose parameter schemas have enum-only or otherwise type-less properties (seen with the JetBrains Rider MCP'struncateMode) — the Kimi provider now patches each tool's schema in-flight to fill in a JSON Schematype(inferred fromenum/constvalues when possible, else defaulted to"string"), so the whole session no longer fails every request with a schema validation error; OpenAI and Anthropic paths are unaffected - Skill: Project-scope skill discovery now walks up to the nearest
.gitancestor before looking for.kimi/skills/.claude/skills/.codex/skills/.agents/skills, so skills defined at the repository root are picked up even when kimi-cli is launched from a subdirectory (for example inside a monorepo package). Falls back to the work directory itself when no.gitmarker is found, so we never walk up into an unrelated parent tree. - Skill: Change the default of
merge_all_available_skillsfromfalsetotrue. kimi-cli now merges all existing user- and project-level brand skill directories (.kimi/skills,.claude/skills,.codex/skills) by default instead of only using the first one found, so users who keep skills in multiple brand directories — for example both~/.kimi/skillsand~/.claude/skills— see every skill out of the box. Behavior change: users who previously relied on the first-match default can restore it by settingmerge_all_available_skills = falsein their config.
Fetched June 4, 2026


