releases.shpreview

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-in headings 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/foo or .claude/skills/foo correctly overrides a user-level or bundled foo instead of the other way around
  • Skill: Accept single-file <name>.md skills alongside the canonical <name>/SKILL.md subdirectory layout — useful when migrating a flat markdown collection into a skills directory; name defaults to the filename stem (frontmatter name: still wins if set), description follows the same three-step chain as subdirectory skills (frontmatter description: → 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_dirs config 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 .git ancestor 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 OSError from is_dir / iterdir (for example when an extra_skill_dirs entry 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 API when a tool call follows a reasoning turn — openai_legacy providers now default reasoning_key to "reasoning_content" so the response's reasoning is stored in history and round-tripped automatically on subsequent turns. An optional reasoning_key field is also added to LLMProvider to 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_injection config option to suppress the system reminder normally injected when yolo mode is active — useful when building custom applications on top of KimiSoul that do not need the non-interactive mode hint
  • Kimi: Add KIMI_MODEL_THINKING_KEEP environment variable that forwards its value verbatim to the Moonshot API as thinking.keep, enabling Preserved Thinking (e.g. export KIMI_MODEL_THINKING_KEEP=all to retain historical reasoning_content across 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 a thinking.keep without the companion thinking.type. Note that keep=all increases input tokens and API cost because history reasoning is resent
  • Kosong: Fix Kimi.with_extra_body silently dropping previously set thinking.type when a later call added another thinking.* field — the thinking sub-dict is now merged field-by-field instead of shallow-replaced, so composing with_thinking(...) with with_extra_body({"thinking": {...}}) preserves both contributions
  • Kosong: Fix Kimi provider sending empty content alongside tool_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), the content field 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 defined when an MCP server exposes tools whose parameter schemas have enum-only or otherwise type-less properties (seen with the JetBrains Rider MCP's truncateMode) — the Kimi provider now patches each tool's schema in-flight to fill in a JSON Schema type (inferred from enum/const values 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 .git ancestor 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 .git marker is found, so we never walk up into an unrelated parent tree.
  • Skill: Change the default of merge_all_available_skills from false to true. 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/skills and ~/.claude/skills — see every skill out of the box. Behavior change: users who previously relied on the first-match default can restore it by setting merge_all_available_skills = false in their config.

Fetched June 4, 2026