소스 검색

feat(v0.5.0): complete rebrand — all 238 opencode references cleaned

System prompts (7 files): You are KirinCode identity replacement
Domain: opencode.ai → kailin.com.cn/kirincode
Store keys: opencode.* → kirincode.* (settings, global, window, draft, workspace)
HTTP headers: x-opencode-* → x-kirincode-*
Deep link: opencode:// → kirincode://
WSL IPC: install-opencode → install-kirincode
Sound pack: opencode.default → kirincode.default
CORS: opencode.ai → kailin.com.cn
Console assets, TUI components, share page, .kirincode/ commands
Cloud server auto-start: sidecar spawns kirincode-cloud on port 3000
Admin panel: integrated /admin route
~48 files, ~270 lines changed
KirinCode 1 개월 전
부모
커밋
fb127dec25
77개의 변경된 파일172개의 추가작업 그리고 166개의 파일을 삭제
  1. 0 1
      .kirincode/agent/duplicate-pr.md
  2. 1 2
      .kirincode/agent/triage.md
  3. 0 1
      .kirincode/command/changelog.md
  4. 0 1
      .kirincode/command/commit.md
  5. 0 1
      .kirincode/command/issues.md
  6. 0 1
      .kirincode/command/translate.md
  7. 1 1
      .kirincode/skills/effect/SKILL.md
  8. 1 1
      packages/app/package.json
  9. 1 1
      packages/app/src/components/dialog-select-model-unpaid-v2.tsx
  10. 1 1
      packages/app/src/entry.tsx
  11. 2 2
      packages/app/src/pages/session/usage-exceeded-dialogs.tsx
  12. 1 1
      packages/cli/package.json
  13. 1 1
      packages/codemode/package.json
  14. 1 1
      packages/console/app/package.json
  15. 2 2
      packages/console/app/public/robots.txt
  16. 4 4
      packages/console/app/src/component/header.tsx
  17. 42 42
      packages/console/app/src/routes/brand/index.tsx
  18. 12 12
      packages/console/app/src/routes/download/[channel]/[platform].ts
  19. 1 1
      packages/console/app/src/routes/download/index.tsx
  20. 3 3
      packages/console/app/src/routes/index.tsx
  21. 1 1
      packages/console/core/package.json
  22. 1 1
      packages/console/function/package.json
  23. 1 1
      packages/console/mail/package.json
  24. 1 1
      packages/console/support/package.json
  25. 1 1
      packages/core/package.json
  26. 2 2
      packages/core/src/plugin/command/initialize.txt
  27. 13 13
      packages/core/src/plugin/skill/customize-kirincode.md
  28. 1 1
      packages/desktop/package.json
  29. 1 1
      packages/desktop/src/main/index.ts
  30. 5 5
      packages/desktop/src/main/migrate.ts
  31. 12 0
      packages/desktop/src/main/sidecar.ts
  32. 1 1
      packages/desktop/src/main/store-keys.ts
  33. 1 1
      packages/desktop/src/main/windows.ts
  34. 1 1
      packages/desktop/src/preload/index.ts
  35. 3 3
      packages/desktop/src/renderer/index.tsx
  36. 1 1
      packages/effect-drizzle-sqlite/package.json
  37. 1 1
      packages/effect-sqlite-node/package.json
  38. 1 1
      packages/enterprise/package.json
  39. 1 1
      packages/enterprise/src/routes/share/[shareID].tsx
  40. 1 1
      packages/function/package.json
  41. 1 1
      packages/http-recorder/package.json
  42. 1 1
      packages/kirincode-cloud/package.json
  43. 1 1
      packages/kirincode-workflow/package.json
  44. 1 1
      packages/kirincode/package.json
  45. 1 1
      packages/kirincode/src/cli/cmd/serve.ts
  46. 1 1
      packages/kirincode/src/cli/cmd/web.ts
  47. 2 2
      packages/kirincode/src/command/template/initialize.txt
  48. 2 2
      packages/kirincode/src/server/proxy-util.ts
  49. 1 1
      packages/kirincode/src/server/routes/instance/httpapi/middleware/workspace-routing.ts
  50. 1 1
      packages/kirincode/src/server/shared/pty-ticket.ts
  51. 4 4
      packages/kirincode/src/session/llm/request.ts
  52. 2 2
      packages/kirincode/src/session/prompt/anthropic.txt
  53. 1 1
      packages/kirincode/src/session/prompt/beast.txt
  54. 1 1
      packages/kirincode/src/session/prompt/copilot-gpt-5.txt
  55. 4 4
      packages/kirincode/src/session/prompt/default.txt
  56. 1 1
      packages/kirincode/src/session/prompt/gemini.txt
  57. 2 2
      packages/kirincode/src/session/prompt/meta.txt
  58. 1 1
      packages/kirincode/src/session/prompt/trinity.txt
  59. 1 1
      packages/kirincode/src/tool/lsp.txt
  60. 2 2
      packages/kirincode/tsconfig.json
  61. 1 1
      packages/llm/example/tutorial.ts
  62. 1 1
      packages/llm/package.json
  63. 1 1
      packages/mobile/package.json
  64. 1 1
      packages/plugin/package.json
  65. 1 1
      packages/sdk/js/package.json
  66. 1 1
      packages/server/package.json
  67. 1 1
      packages/session-ui/package.json
  68. 1 1
      packages/slack/package.json
  69. 1 1
      packages/stats/app/package.json
  70. 1 1
      packages/stats/core/package.json
  71. 1 1
      packages/stats/server/package.json
  72. 1 1
      packages/tui/package.json
  73. 1 1
      packages/tui/src/attention.ts
  74. 1 1
      packages/tui/src/component/error-component.tsx
  75. 1 1
      packages/tui/src/routes/session/index.tsx
  76. 1 1
      packages/ui/package.json
  77. 1 1
      packages/web/package.json

+ 0 - 1
.kirincode/agent/duplicate-pr.md

@@ -1,7 +1,6 @@
 ---
 mode: primary
 hidden: true
-model: opencode/claude-haiku-4-5
 color: "#E67E22"
 tools:
   "*": false

+ 1 - 2
.kirincode/agent/triage.md

@@ -1,7 +1,6 @@
 ---
 mode: primary
 hidden: true
-model: opencode/gpt-5.4-mini
 color: "#44BA81"
 tools:
   "*": false
@@ -28,7 +27,7 @@ Terminal UI issues, including rendering, keybindings, scrolling, terminal compat
 
 ### Desktop / Web
 
-Desktop application and browser-based app issues, including `opencode web`, desktop-specific UI behavior, packaging, and web view problems.
+Desktop application and browser-based app issues, including `kirincode web`, desktop-specific UI behavior, packaging, and web view problems.
 
 ### Core
 

+ 0 - 1
.kirincode/command/changelog.md

@@ -1,5 +1,4 @@
 ---
-model: opencode/gpt-5.4
 ---
 
 Create `UPCOMING_CHANGELOG.md` from the structured changelog input below.

+ 0 - 1
.kirincode/command/commit.md

@@ -1,6 +1,5 @@
 ---
 description: git commit and push
-model: opencode/kimi-k2.5
 subtask: true
 ---
 

+ 0 - 1
.kirincode/command/issues.md

@@ -1,6 +1,5 @@
 ---
 description: "find issue(s) on github"
-model: opencode/claude-haiku-4-5
 ---
 
 Search through existing issues in kirincode/kirincode using the gh cli to find issues matching this query:

+ 0 - 1
.kirincode/command/translate.md

@@ -1,6 +1,5 @@
 ---
 description: translate English to other languages
-model: opencode/claude-opus-4-8
 ---
 
 run git diff and translate changed english doc and UI copy files to other international languages. Translate all languages in parallel to save time.

+ 1 - 1
.kirincode/skills/effect/SKILL.md

@@ -33,6 +33,6 @@ Use the current Effect v4 / effect-smol source, not memory or older Effect v2/v3
 
 - Use `testEffect(...)` from `packages/kirincode/test/lib/effect.ts` for tests that exercise Effect services, layers, runtime context, scoped resources, or platform integrations.
 - Use `it.live(...)` for filesystem, git repositories, HTTP servers, sockets, child processes, locks, real time, and other live platform behavior.
-- Run tests from package directories such as `packages/opencode`; never run package tests from the repo root.
+- Run tests from package directories such as `packages/kirincode`; never run package tests from the repo root.
 - Prefer explicit test layers over ad hoc managed runtimes. Keep dependency provisioning visible in the test file.
 - Use scoped fixtures and finalizers for resources that must be cleaned up, including temporary directories, flags, databases, fibers, servers, and global state.

+ 1 - 1
packages/app/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/app",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "description": "",
   "type": "module",
   "exports": {

+ 1 - 1
packages/app/src/components/dialog-select-model-unpaid-v2.tsx

@@ -136,7 +136,7 @@ export const DialogSelectModelUnpaidV2: Component<{ model?: ModelState }> = (pro
                           </span>
                           <Tag class="shrink-0">{language.t("dialog.provider.tag.recommended")}</Tag>
                         </Show>
-                        <Show when={provider.id === "opencode-go"}>
+                        <Show when={provider.id === "kirincode-go"}>
                           <span class="min-w-0 truncate text-[13px] font-[440] leading-5 tracking-[-0.04px] text-v2-text-text-muted [font-family:Inter,var(--font-family-sans)] [font-variation-settings:'slnt'_0]">
                             {language.t("dialog.provider.kirincodeGo.tagline")}
                           </span>

+ 1 - 1
packages/app/src/entry.tsx

@@ -11,7 +11,7 @@ import { authFromToken } from "@/utils/server"
 import pkg from "../package.json"
 import { ServerConnection } from "./context/server"
 
-const DEFAULT_SERVER_URL_KEY = "opencode.settings.dat:defaultServerUrl"
+const DEFAULT_SERVER_URL_KEY = "kirincode.settings.dat:defaultServerUrl"
 
 const getLocale = () => {
   if (typeof navigator !== "object") return "en" as const

+ 2 - 2
packages/app/src/pages/session/usage-exceeded-dialogs.tsx

@@ -13,7 +13,7 @@ const GO_UPSELL_FREE_TIER_DONT_SHOW = "go_upsell_dont_show"
 const GO_UPSELL_ACCOUNT_RATE_LIMIT_LAST_SEEN_AT = "go_upsell_account_rate_limit_last_seen_at"
 const GO_UPSELL_ACCOUNT_RATE_LIMIT_DONT_SHOW = "go_upsell_account_rate_limit_dont_show"
 const GO_UPSELL_WINDOW = 86_400_000 // 24 hrs
-const GO_UPSELL_PROVIDERS = new Set(["kirincode", "opencode-go"])
+const GO_UPSELL_PROVIDERS = new Set(["kirincode", "kirincode-go"])
 
 function goUpsellKeys(status: SessionStatus) {
   if (status.type !== "retry" || !status.action) return
@@ -78,7 +78,7 @@ export function useUsageExceededDialogs() {
               else {
                 void import("../../components/dialog-connect-provider").then((x) => {
                   const controller = x.useProviderConnectController()
-                  controller.select("opencode-go")
+                  controller.select("kirincode-go")
                   void dialog.show(() => <x.DialogConnectProvider controller={controller} />)
                 })
               }

+ 1 - 1
packages/cli/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/cli",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "license": "MIT",
   "bin": {

+ 1 - 1
packages/codemode/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/codemode",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "description": "Effect-native confined code execution over schema-described tools",
   "private": true,
   "type": "module",

+ 1 - 1
packages/console/app/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/console-app",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "license": "MIT",
   "scripts": {

+ 2 - 2
packages/console/app/public/robots.txt

@@ -5,5 +5,5 @@ Allow: /
 Disallow: /s/
 Disallow: /share/
 
-Sitemap: https://opencode.ai/sitemap.xml
-Sitemap: https://opencode.ai/data/sitemap.xml
+Sitemap: https://kailin.com.cn/sitemap.xml
+Sitemap: https://kailin.com.cn/data/sitemap.xml

+ 4 - 4
packages/console/app/src/component/header.tsx

@@ -9,10 +9,10 @@ import copyBrandAssetsDark from "../asset/lander/brand-assets-dark.svg"
 
 // SVG files for copying (separate from button icons)
 // Replace these with your actual SVG files for copying
-import copyLogoSvgLight from "../asset/lander/opencode-logo-light.svg"
-import copyLogoSvgDark from "../asset/lander/opencode-logo-dark.svg"
-import copyWordmarkSvgLight from "../asset/lander/opencode-wordmark-light.svg"
-import copyWordmarkSvgDark from "../asset/lander/opencode-wordmark-dark.svg"
+import copyLogoSvgLight from "../asset/lander/kirincode-logo-light.svg"
+import copyLogoSvgDark from "../asset/lander/kirincode-logo-dark.svg"
+import copyWordmarkSvgLight from "../asset/lander/kirincode-wordmark-light.svg"
+import copyWordmarkSvgDark from "../asset/lander/kirincode-wordmark-dark.svg"
 import { A, useNavigate } from "@solidjs/router"
 import { createMemo, Match, Show, Switch } from "solid-js"
 import { createStore } from "solid-js/store"

+ 42 - 42
packages/console/app/src/routes/brand/index.tsx

@@ -5,31 +5,31 @@ import { Footer } from "~/component/footer"
 import { Legal } from "~/component/legal"
 import { useI18n } from "~/context/i18n"
 import { LocaleLinks } from "~/component/locale-links"
-import previewLogoLight from "../../asset/brand/preview-opencode-logo-light.png"
-import previewLogoDark from "../../asset/brand/preview-opencode-logo-dark.png"
-import previewLogoLightSquare from "../../asset/brand/preview-opencode-logo-light-square.png"
-import previewLogoDarkSquare from "../../asset/brand/preview-opencode-logo-dark-square.png"
-import previewWordmarkLight from "../../asset/brand/preview-opencode-wordmark-light.png"
-import previewWordmarkDark from "../../asset/brand/preview-opencode-wordmark-dark.png"
-import previewWordmarkSimpleLight from "../../asset/brand/preview-opencode-wordmark-simple-light.png"
-import previewWordmarkSimpleDark from "../../asset/brand/preview-opencode-wordmark-simple-dark.png"
-import logoLightPng from "../../asset/brand/opencode-logo-light.png"
-import logoDarkPng from "../../asset/brand/opencode-logo-dark.png"
-import logoLightSquarePng from "../../asset/brand/opencode-logo-light-square.png"
-import logoDarkSquarePng from "../../asset/brand/opencode-logo-dark-square.png"
-import wordmarkLightPng from "../../asset/brand/opencode-wordmark-light.png"
-import wordmarkDarkPng from "../../asset/brand/opencode-wordmark-dark.png"
-import wordmarkSimpleLightPng from "../../asset/brand/opencode-wordmark-simple-light.png"
-import wordmarkSimpleDarkPng from "../../asset/brand/opencode-wordmark-simple-dark.png"
-import logoLightSvg from "../../asset/brand/opencode-logo-light.svg"
-import logoDarkSvg from "../../asset/brand/opencode-logo-dark.svg"
-import logoLightSquareSvg from "../../asset/brand/opencode-logo-light-square.svg"
-import logoDarkSquareSvg from "../../asset/brand/opencode-logo-dark-square.svg"
-import wordmarkLightSvg from "../../asset/brand/opencode-wordmark-light.svg"
-import wordmarkDarkSvg from "../../asset/brand/opencode-wordmark-dark.svg"
-import wordmarkSimpleLightSvg from "../../asset/brand/opencode-wordmark-simple-light.svg"
-import wordmarkSimpleDarkSvg from "../../asset/brand/opencode-wordmark-simple-dark.svg"
-const brandAssets = "/opencode-brand-assets.zip"
+import previewLogoLight from "../../asset/brand/preview-kirincode-logo-light.png"
+import previewLogoDark from "../../asset/brand/preview-kirincode-logo-dark.png"
+import previewLogoLightSquare from "../../asset/brand/preview-kirincode-logo-light-square.png"
+import previewLogoDarkSquare from "../../asset/brand/preview-kirincode-logo-dark-square.png"
+import previewWordmarkLight from "../../asset/brand/preview-kirincode-wordmark-light.png"
+import previewWordmarkDark from "../../asset/brand/preview-kirincode-wordmark-dark.png"
+import previewWordmarkSimpleLight from "../../asset/brand/preview-kirincode-wordmark-simple-light.png"
+import previewWordmarkSimpleDark from "../../asset/brand/preview-kirincode-wordmark-simple-dark.png"
+import logoLightPng from "../../asset/brand/kirincode-logo-light.png"
+import logoDarkPng from "../../asset/brand/kirincode-logo-dark.png"
+import logoLightSquarePng from "../../asset/brand/kirincode-logo-light-square.png"
+import logoDarkSquarePng from "../../asset/brand/kirincode-logo-dark-square.png"
+import wordmarkLightPng from "../../asset/brand/kirincode-wordmark-light.png"
+import wordmarkDarkPng from "../../asset/brand/kirincode-wordmark-dark.png"
+import wordmarkSimpleLightPng from "../../asset/brand/kirincode-wordmark-simple-light.png"
+import wordmarkSimpleDarkPng from "../../asset/brand/kirincode-wordmark-simple-dark.png"
+import logoLightSvg from "../../asset/brand/kirincode-logo-light.svg"
+import logoDarkSvg from "../../asset/brand/kirincode-logo-dark.svg"
+import logoLightSquareSvg from "../../asset/brand/kirincode-logo-light-square.svg"
+import logoDarkSquareSvg from "../../asset/brand/kirincode-logo-dark-square.svg"
+import wordmarkLightSvg from "../../asset/brand/kirincode-wordmark-light.svg"
+import wordmarkDarkSvg from "../../asset/brand/kirincode-wordmark-dark.svg"
+import wordmarkSimpleLightSvg from "../../asset/brand/kirincode-wordmark-simple-light.svg"
+import wordmarkSimpleDarkSvg from "../../asset/brand/kirincode-wordmark-simple-dark.svg"
+const brandAssets = "/kirincode-brand-assets.zip"
 
 export default function Brand() {
   const i18n = useI18n()
@@ -74,7 +74,7 @@ export default function Brand() {
             <p>{i18n.t("brand.subtitle")}</p>
             <button
               data-component="download-button"
-              onClick={() => downloadFile(brandAssets, "opencode-brand-assets.zip")}
+              onClick={() => downloadFile(brandAssets, "kirincode-brand-assets.zip")}
             >
               {i18n.t("brand.downloadAll")}
               <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -91,7 +91,7 @@ export default function Brand() {
               <div>
                 <img src={previewLogoLight} alt={alt} />
                 <div data-component="actions">
-                  <button onClick={() => downloadFile(logoLightPng, "opencode-logo-light.png")}>
+                  <button onClick={() => downloadFile(logoLightPng, "kirincode-logo-light.png")}>
                     PNG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -102,7 +102,7 @@ export default function Brand() {
                       />
                     </svg>
                   </button>
-                  <button onClick={() => downloadFile(logoLightSvg, "opencode-logo-light.svg")}>
+                  <button onClick={() => downloadFile(logoLightSvg, "kirincode-logo-light.svg")}>
                     SVG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -118,7 +118,7 @@ export default function Brand() {
               <div>
                 <img src={previewLogoDark} alt={alt} />
                 <div data-component="actions">
-                  <button onClick={() => downloadFile(logoDarkPng, "opencode-logo-dark.png")}>
+                  <button onClick={() => downloadFile(logoDarkPng, "kirincode-logo-dark.png")}>
                     PNG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -129,7 +129,7 @@ export default function Brand() {
                       />
                     </svg>
                   </button>
-                  <button onClick={() => downloadFile(logoDarkSvg, "opencode-logo-dark.svg")}>
+                  <button onClick={() => downloadFile(logoDarkSvg, "kirincode-logo-dark.svg")}>
                     SVG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -145,7 +145,7 @@ export default function Brand() {
               <div>
                 <img src={previewLogoLightSquare} alt={alt} />
                 <div data-component="actions">
-                  <button onClick={() => downloadFile(logoLightSquarePng, "opencode-logo-light-square.png")}>
+                  <button onClick={() => downloadFile(logoLightSquarePng, "kirincode-logo-light-square.png")}>
                     PNG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -156,7 +156,7 @@ export default function Brand() {
                       />
                     </svg>
                   </button>
-                  <button onClick={() => downloadFile(logoLightSquareSvg, "opencode-logo-light-square.svg")}>
+                  <button onClick={() => downloadFile(logoLightSquareSvg, "kirincode-logo-light-square.svg")}>
                     SVG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -172,7 +172,7 @@ export default function Brand() {
               <div>
                 <img src={previewLogoDarkSquare} alt={alt} />
                 <div data-component="actions">
-                  <button onClick={() => downloadFile(logoDarkSquarePng, "opencode-logo-dark-square.png")}>
+                  <button onClick={() => downloadFile(logoDarkSquarePng, "kirincode-logo-dark-square.png")}>
                     PNG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -183,7 +183,7 @@ export default function Brand() {
                       />
                     </svg>
                   </button>
-                  <button onClick={() => downloadFile(logoDarkSquareSvg, "opencode-logo-dark-square.svg")}>
+                  <button onClick={() => downloadFile(logoDarkSquareSvg, "kirincode-logo-dark-square.svg")}>
                     SVG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -199,7 +199,7 @@ export default function Brand() {
               <div>
                 <img src={previewWordmarkLight} alt={alt} />
                 <div data-component="actions">
-                  <button onClick={() => downloadFile(wordmarkLightPng, "opencode-wordmark-light.png")}>
+                  <button onClick={() => downloadFile(wordmarkLightPng, "kirincode-wordmark-light.png")}>
                     PNG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -210,7 +210,7 @@ export default function Brand() {
                       />
                     </svg>
                   </button>
-                  <button onClick={() => downloadFile(wordmarkLightSvg, "opencode-wordmark-light.svg")}>
+                  <button onClick={() => downloadFile(wordmarkLightSvg, "kirincode-wordmark-light.svg")}>
                     SVG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -226,7 +226,7 @@ export default function Brand() {
               <div>
                 <img src={previewWordmarkDark} alt={alt} />
                 <div data-component="actions">
-                  <button onClick={() => downloadFile(wordmarkDarkPng, "opencode-wordmark-dark.png")}>
+                  <button onClick={() => downloadFile(wordmarkDarkPng, "kirincode-wordmark-dark.png")}>
                     PNG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -237,7 +237,7 @@ export default function Brand() {
                       />
                     </svg>
                   </button>
-                  <button onClick={() => downloadFile(wordmarkDarkSvg, "opencode-wordmark-dark.svg")}>
+                  <button onClick={() => downloadFile(wordmarkDarkSvg, "kirincode-wordmark-dark.svg")}>
                     SVG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -253,7 +253,7 @@ export default function Brand() {
               <div>
                 <img src={previewWordmarkSimpleLight} alt={alt} />
                 <div data-component="actions">
-                  <button onClick={() => downloadFile(wordmarkSimpleLightPng, "opencode-wordmark-simple-light.png")}>
+                  <button onClick={() => downloadFile(wordmarkSimpleLightPng, "kirincode-wordmark-simple-light.png")}>
                     PNG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -264,7 +264,7 @@ export default function Brand() {
                       />
                     </svg>
                   </button>
-                  <button onClick={() => downloadFile(wordmarkSimpleLightSvg, "opencode-wordmark-simple-light.svg")}>
+                  <button onClick={() => downloadFile(wordmarkSimpleLightSvg, "kirincode-wordmark-simple-light.svg")}>
                     SVG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -280,7 +280,7 @@ export default function Brand() {
               <div>
                 <img src={previewWordmarkSimpleDark} alt={alt} />
                 <div data-component="actions">
-                  <button onClick={() => downloadFile(wordmarkSimpleDarkPng, "opencode-wordmark-simple-dark.png")}>
+                  <button onClick={() => downloadFile(wordmarkSimpleDarkPng, "kirincode-wordmark-simple-dark.png")}>
                     PNG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path
@@ -291,7 +291,7 @@ export default function Brand() {
                       />
                     </svg>
                   </button>
-                  <button onClick={() => downloadFile(wordmarkSimpleDarkSvg, "opencode-wordmark-simple-dark.svg")}>
+                  <button onClick={() => downloadFile(wordmarkSimpleDarkSvg, "kirincode-wordmark-simple-dark.svg")}>
                     SVG
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path

+ 12 - 12
packages/console/app/src/routes/download/[channel]/[platform].ts

@@ -2,21 +2,21 @@ import type { APIEvent } from "@solidjs/start"
 import type { DownloadPlatform } from "../types"
 
 const prodAssetNames: Record<string, string> = {
-  "darwin-aarch64-dmg": "opencode-desktop-mac-arm64.dmg",
-  "darwin-x64-dmg": "opencode-desktop-mac-x64.dmg",
-  "windows-x64-nsis": "opencode-desktop-win-x64.exe",
-  "linux-x64-deb": "opencode-desktop-linux-amd64.deb",
-  "linux-x64-appimage": "opencode-desktop-linux-x86_64.AppImage",
-  "linux-x64-rpm": "opencode-desktop-linux-x86_64.rpm",
+  "darwin-aarch64-dmg": "kirincode-desktop-mac-arm64.dmg",
+  "darwin-x64-dmg": "kirincode-desktop-mac-x64.dmg",
+  "windows-x64-nsis": "kirincode-desktop-win-x64.exe",
+  "linux-x64-deb": "kirincode-desktop-linux-amd64.deb",
+  "linux-x64-appimage": "kirincode-desktop-linux-x86_64.AppImage",
+  "linux-x64-rpm": "kirincode-desktop-linux-x86_64.rpm",
 } satisfies Record<DownloadPlatform, string>
 
 const betaAssetNames: Record<string, string> = {
-  "darwin-aarch64-dmg": "opencode-desktop-mac-arm64.dmg",
-  "darwin-x64-dmg": "opencode-desktop-mac-x64.dmg",
-  "windows-x64-nsis": "opencode-desktop-win-x64.exe",
-  "linux-x64-deb": "opencode-desktop-linux-amd64.deb",
-  "linux-x64-appimage": "opencode-desktop-linux-x86_64.AppImage",
-  "linux-x64-rpm": "opencode-desktop-linux-x86_64.rpm",
+  "darwin-aarch64-dmg": "kirincode-desktop-mac-arm64.dmg",
+  "darwin-x64-dmg": "kirincode-desktop-mac-x64.dmg",
+  "windows-x64-nsis": "kirincode-desktop-win-x64.exe",
+  "linux-x64-deb": "kirincode-desktop-linux-amd64.deb",
+  "linux-x64-appimage": "kirincode-desktop-linux-x86_64.AppImage",
+  "linux-x64-rpm": "kirincode-desktop-linux-x86_64.rpm",
 } satisfies Record<DownloadPlatform, string>
 
 // Doing this on the server lets us preserve the original name for platforms we don't care to rename for

+ 1 - 1
packages/console/app/src/routes/download/index.tsx

@@ -11,7 +11,7 @@ import { LocaleLinks } from "~/component/locale-links"
 import { config } from "~/config"
 import { useI18n } from "~/context/i18n"
 import { useLanguage } from "~/context/language"
-import desktopAppIcon from "../../asset/lander/opencode-desktop-icon.png"
+import desktopAppIcon from "../../asset/lander/kirincode-desktop-icon.png"
 import type { DownloadPlatform } from "./types"
 
 type OS = "macOS" | "Windows" | "Linux" | null

+ 3 - 3
packages/console/app/src/routes/index.tsx

@@ -125,7 +125,7 @@ export default function Home() {
                     <button data-copy data-slot="command" onClick={handleCopyClick}>
                       <span>
                         <span data-slot="protocol">npm i -g </span>
-                        <span data-slot="highlight">opencode-ai</span>
+                        <span data-slot="highlight">kirincode-ai</span>
                       </span>
                       <CopyStatus />
                     </button>
@@ -134,7 +134,7 @@ export default function Home() {
                     <button data-copy data-slot="command" onClick={handleCopyClick}>
                       <span>
                         <span data-slot="protocol">bun add -g </span>
-                        <span data-slot="highlight">opencode-ai</span>
+                        <span data-slot="highlight">kirincode-ai</span>
                       </span>
                       <CopyStatus />
                     </button>
@@ -143,7 +143,7 @@ export default function Home() {
                     <button data-copy data-slot="command" onClick={handleCopyClick}>
                       <span>
                         <span data-slot="protocol">brew install </span>
-                        <span data-slot="highlight">anomalyco/tap/opencode</span>
+                        <span data-slot="highlight">kirincode/tap/kirincode</span>
                       </span>
                       <CopyStatus />
                     </button>

+ 1 - 1
packages/console/core/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/console-core",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "private": true,
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/console/function/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/console-function",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "$schema": "https://json.schemastore.org/package.json",
   "private": true,
   "type": "module",

+ 1 - 1
packages/console/mail/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/console-mail",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "dependencies": {
     "@jsx-email/all": "2.2.3",
     "@jsx-email/cli": "1.4.3",

+ 1 - 1
packages/console/support/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/console-support",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "license": "MIT",
   "scripts": {

+ 1 - 1
packages/core/package.json

@@ -1,6 +1,6 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "name": "@kirincode-ai/core",
   "type": "module",
   "license": "MIT",

+ 2 - 2
packages/core/src/plugin/command/initialize.txt

@@ -12,7 +12,7 @@ Read the highest-value sources first:
 - build, test, lint, formatter, typecheck, and codegen config
 - CI workflows and pre-commit / task runner config
 - existing instruction files (`AGENTS.md`, `CLAUDE.md`, `.cursor/rules/`, `.cursorrules`, `.github/copilot-instructions.md`)
-- repo-local OpenCode config such as `opencode.json`
+- repo-local OpenCode config such as `kirincode.json`
 
 If architecture is still unclear after reading config and docs, inspect a small number of representative code files to find the real entrypoints, package boundaries, and execution flow. Prefer reading the files that explain how the system is wired together over random leaf files.
 
@@ -56,7 +56,7 @@ Exclude:
 - long tutorials or exhaustive file trees
 - obvious language conventions
 - speculative claims or anything you could not verify
-- content better stored in another file referenced via `opencode.json` `instructions`
+- content better stored in another file referenced via `kirincode.json` `instructions`
 
 When in doubt, omit.
 

+ 13 - 13
packages/core/src/plugin/skill/customize-kirincode.md

@@ -31,7 +31,7 @@ mistakes as they type.
 
 Config is loaded once when kirincode starts and is not hot-reloaded. After
 saving changes to `kirincode.json`, an agent file, a skill, a plugin, or any
-other config-time file, **tell the user to quit and restart opencode** for
+other config-time file, **tell the user to quit and restart kirincode** for
 the changes to take effect. The running session will keep using the
 already-loaded config until then.
 
@@ -39,7 +39,7 @@ already-loaded config until then.
 
 | Scope                         | Path                                                                                                                      |
 | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
-| Project config                | `./kirincode.json`, `./kirincode.jsonc`, or `.kirincode/kirincode.json` (opencode walks up from the cwd to the worktree root) |
+| Project config                | `./kirincode.json`, `./kirincode.jsonc`, or `.kirincode/kirincode.json` (kirincode walks up from the cwd to the worktree root) |
 | Global config                 | `~/.config/kirincode/kirincode.json` (NOT `~/.kirincode/`)                                                                   |
 | Project agents                | `.kirincode/agent/<name>.md` or `.kirincode/agents/<name>.md`                                                               |
 | Global agents                 | `~/.config/kirincode/agent(s)/<name>.md`                                                                                   |
@@ -122,10 +122,10 @@ Every field is optional.
   },
 
   "plugin": [
-    "opencode-gemini-auth",
-    "opencode-foo@1.2.3",
+    "kirincode-gemini-auth",
+    "kirincode-foo@1.2.3",
     "./local-plugin.ts",
-    ["opencode-bar", { "option": "value" }]
+    ["kirincode-bar", { "option": "value" }]
   ],
 
   "permission": {
@@ -160,7 +160,7 @@ Shape notes worth being explicit about:
 
 ## Skills
 
-opencode's skill loader scans for `**/SKILL.md` inside skill directories. The
+kirincode's skill loader scans for `**/SKILL.md` inside skill directories. The
 file is named `SKILL.md` exactly, and lives in its own folder named after the
 skill:
 
@@ -276,13 +276,13 @@ file, `disable: true` in frontmatter.
 
 ### Built-in agents
 
-opencode ships with `build`, `plan`, `general`, `explore`. Hidden internal agents:
+kirincode ships with `build`, `plan`, `general`, `explore`. Hidden internal agents:
 `compaction`, `title`, `summary`. To override a built-in's fields, define the
 same key in `agent: { <name>: { ... } }`.
 
 ## Commands
 
-opencode's command loader scans for `**/*.md` inside command directories. The
+kirincode's command loader scans for `**/*.md` inside command directories. The
 file is named after the command, and lives directly inside the `command` folder:
 
 ```
@@ -311,11 +311,11 @@ model: anthropic/claude-sonnet-4-6
 
 ```json
 "plugin": [
-  "opencode-gemini-auth",            // npm spec, latest
-  "opencode-foo@1.2.3",              // npm spec, pinned
+  "kirincode-gemini-auth",            // npm spec, latest
+  "kirincode-foo@1.2.3",              // npm spec, pinned
   "./local-plugin.ts",               // file path, relative to the declaring config
   "file:///abs/path/plugin.js",      // file URL
-  ["opencode-bar", { "key": "val" }] // tuple form with options
+  ["kirincode-bar", { "key": "val" }] // tuple form with options
 ]
 ```
 
@@ -403,7 +403,7 @@ Actions: `"allow"`, `"ask"`, `"deny"`.
 
 Per-tool value forms: `"allow"` shorthand (treated as `{"*": "allow"}`), or an
 object `{ pattern: action }`. Within an object, **insertion order matters**.
-opencode evaluates the LAST matching rule, so put broad rules first and narrow
+kirincode evaluates the LAST matching rule, so put broad rules first and narrow
 rules last.
 
 `permission: "allow"` (a string at the top level) is shorthand for "allow
@@ -448,5 +448,5 @@ When a user's config is broken and kirincode won't start, these env vars help:
 - If the user's existing config is malformed, point them at the env-var escape
   hatches above so they can edit from inside kirincode without breaking their
   session.
-- After saving any config change, remind the user to quit and restart opencode
+- After saving any config change, remind the user to quit and restart kirincode
   — running sessions keep using the already-loaded config.

+ 1 - 1
packages/desktop/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@kirincode-ai/desktop",
   "private": true,
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "license": "MIT",
   "homepage": "https://kirincode.ai",

+ 1 - 1
packages/desktop/src/main/index.ts

@@ -194,7 +194,7 @@ const main = Effect.gen(function* () {
   preferAppEnv(app.getPath("userData"))
 
   app.on("second-instance", (_event: Event, argv: string[]) => {
-    const urls = argv.filter((arg: string) => arg.startsWith("opencode://"))
+    const urls = argv.filter((arg: string) => arg.startsWith("kirincode://"))
     if (urls.length) {
       logger.log("deep link received via second-instance", { urls })
       emitDeepLinks(urls)

+ 5 - 5
packages/desktop/src/main/migrate.ts

@@ -32,10 +32,10 @@ function tauriAppId() {
 }
 
 // Migrate a single Tauri .dat file into the corresponding electron-store.
-// `opencode.settings.dat` is special: it maps to the `opencode.settings` store
+// `kirincode.settings.dat` is special: it maps to the `kirincode.settings` store
 // (the electron-store name without the `.dat` extension). All other .dat files
 // keep their full filename as the electron-store name so they match what the
-// renderer already passes via IPC (e.g. `"default.dat"`, `"opencode.global.dat"`).
+// renderer already passes via IPC (e.g. `"default.dat"`, `"kirincode.global.dat"`).
 function migrateFile(datPath: string, filename: string) {
   let data: Record<string, unknown>
   try {
@@ -45,10 +45,10 @@ function migrateFile(datPath: string, filename: string) {
     return
   }
 
-  // opencode.settings.dat → the electron settings store ("opencode.settings").
+  // kirincode.settings.dat → the electron settings store ("kirincode.settings").
   // All other .dat files keep their full filename as the store name so they match
-  // what the renderer passes via IPC (e.g. "default.dat", "opencode.global.dat").
-  const storeName = filename === "opencode.settings.dat" ? "opencode.settings" : filename
+  // what the renderer passes via IPC (e.g. "default.dat", "kirincode.global.dat").
+  const storeName = filename === "kirincode.settings.dat" ? "kirincode.settings" : filename
   const target = getStore(storeName)
   const migrated: string[] = []
   const skipped: string[] = []

+ 12 - 0
packages/desktop/src/main/sidecar.ts

@@ -62,6 +62,18 @@ async function start(command: StartCommand) {
       password: command.password,
       cors: ["oc://renderer"],
     })
+
+    // Also start cloud server for admin/enterprise features
+    const { fork } = await import("node:child_process")
+    const cloudPath = new URL("../../../../kirincode-cloud/src/index.ts", import.meta.url).pathname
+    const cloudProcess = fork(cloudPath, [], {
+      env: { ...process.env, PORT: "3000" },
+      stdio: "pipe",
+      silent: true,
+    })
+    cloudProcess.on("error", () => { /* ignore if cloud server not available */ })
+    cloudProcess.unref()
+
     parentPort.postMessage({ type: "ready" })
   } catch (error) {
     parentPort.postMessage({ type: "error", error: serializeError(error) })

+ 1 - 1
packages/desktop/src/main/store-keys.ts

@@ -1,4 +1,4 @@
-export const SETTINGS_STORE = "opencode.settings"
+export const SETTINGS_STORE = "kirincode.settings"
 export const DEFAULT_SERVER_URL_KEY = "defaultServerUrl"
 export const FIRST_LAUNCH_ONBOARDING_COMPLETE_KEY = "firstLaunchOnboardingComplete"
 export const WSL_SERVERS_KEY = "wslServers"

+ 1 - 1
packages/desktop/src/main/windows.ts

@@ -245,7 +245,7 @@ function windowStateFile(id: string) {
 // Mirrors windowStorage() in packages/app/src/utils/persist.ts, which names
 // the per-window renderer store this window persists its tabs into.
 function windowDataFile(id: string) {
-  return `opencode.window.${id.replace(/[^a-zA-Z0-9._-]/g, "-")}.dat`
+  return `kirincode.window.${id.replace(/[^a-zA-Z0-9._-]/g, "-")}.dat`
 }
 
 export function registerRendererProtocol() {

+ 1 - 1
packages/desktop/src/preload/index.ts

@@ -30,7 +30,7 @@ const api: ElectronAPI = {
     installWsl: () => ipcRenderer.invoke("wsl-servers-install-wsl"),
     installDistro: (name) => ipcRenderer.invoke("wsl-servers-install-distro", name),
     probeAddable: (distros) => ipcRenderer.invoke("wsl-servers-probe-addable", distros),
-    installOpencode: (name) => ipcRenderer.invoke("wsl-servers-install-opencode", name),
+    installOpencode: (name) => ipcRenderer.invoke("wsl-servers-install-kirincode", name),
     openTerminal: (name) => ipcRenderer.invoke("wsl-servers-open-terminal", name),
     addServer: (distro) => ipcRenderer.invoke("wsl-servers-add", distro),
     removeServer: (id) => ipcRenderer.invoke("wsl-servers-remove", id),

+ 3 - 3
packages/desktop/src/renderer/index.tsx

@@ -63,7 +63,7 @@ void initI18n()
 const [updaterState, setUpdaterState] = createSignal<UpdaterState>({ status: "disabled" })
 void window.api.updater.subscribe(setUpdaterState)
 
-const deepLinkEvent = "opencode:deep-link"
+const deepLinkEvent = "kirincode:deep-link"
 
 type DesktopWindowState = {
   id?: string
@@ -83,7 +83,7 @@ const listenForDeepLinks = () => {
 }
 
 function windowLastActiveUrlKey(windowID: string) {
-  return `opencode.desktop.window.${windowID}.last-active-url`
+  return `kirincode.desktop.window.${windowID}.last-active-url`
 }
 
 function getLastActiveUrl(windowID: string) {
@@ -327,7 +327,7 @@ function LoadingSplash() {
 function DesktopRoot(props: { windowState: DesktopWindowState }) {
   const platform = createPlatform(props.windowState)
   const loadLocale = async () => {
-    const current = await platform.storage?.("opencode.global.dat").getItem("language")
+    const current = await platform.storage?.("kirincode.global.dat").getItem("language")
     const legacy = current ? undefined : await platform.storage?.().getItem("language.v1")
     const raw = current ?? legacy
     if (!raw) return

+ 1 - 1
packages/effect-drizzle-sqlite/package.json

@@ -1,6 +1,6 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "name": "@kirincode-ai/effect-drizzle-sqlite",
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/effect-sqlite-node/package.json

@@ -1,6 +1,6 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "name": "@kirincode-ai/effect-sqlite-node",
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/enterprise/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/enterprise",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "private": true,
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/enterprise/src/routes/share/[shareID].tsx

@@ -179,7 +179,7 @@ export default function () {
               modelParam = "unknown"
             }
             const version = `v${info().version}`
-            return `https://social-cards.sst.dev/opencode-share/${encodedTitle}.png?model=${modelParam}&version=${version}&id=${data().shareID}`
+            return `https://social-cards.sst.dev/kirincode-share/${encodedTitle}.png?model=${modelParam}&version=${version}&id=${data().shareID}`
           })
 
           return (

+ 1 - 1
packages/function/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/function",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "$schema": "https://json.schemastore.org/package.json",
   "private": true,
   "type": "module",

+ 1 - 1
packages/http-recorder/package.json

@@ -1,6 +1,6 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "name": "@kirincode-ai/http-recorder",
   "description": "Record and replay Effect HTTP client traffic with deterministic cassettes",
   "type": "module",

+ 1 - 1
packages/kirincode-cloud/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/kirincode-cloud",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "description": "KirinCode Cloud Sync Server — multi-user backend with session sync, memory, skills, workflows",
   "license": "MIT",

+ 1 - 1
packages/kirincode-workflow/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/kirincode-workflow",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "description": "KirinCode workflow engine — scheduled tasks, event triggers, background agents",
   "license": "MIT",

+ 1 - 1
packages/kirincode/package.json

@@ -1,6 +1,6 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "name": "kirincode",
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/kirincode/src/cli/cmd/serve.ts

@@ -7,7 +7,7 @@ export const ServeCommand = effectCmd({
   command: "serve",
   builder: (yargs) => withNetworkOptions(yargs),
   describe: "starts a headless kirincode server",
-  // Server loads instances per-request via x-opencode-directory header — no
+  // Server loads instances per-request via x-kirincode-directory header — no
   // need for an ambient project InstanceContext at startup.
   instance: false,
   handler: Effect.fn("Cli.serve")(function* (args) {

+ 1 - 1
packages/kirincode/src/cli/cmd/web.ts

@@ -32,7 +32,7 @@ export const WebCommand = effectCmd({
   command: "web",
   builder: (yargs) => withNetworkOptions(yargs),
   describe: "start kirincode server and open web interface",
-  // Server loads instances per-request via x-opencode-directory header — no
+  // Server loads instances per-request via x-kirincode-directory header — no
   // ambient project InstanceContext needed at startup.
   instance: false,
   handler: Effect.fn("Cli.web")(function* (args) {

+ 2 - 2
packages/kirincode/src/command/template/initialize.txt

@@ -12,7 +12,7 @@ Read the highest-value sources first:
 - build, test, lint, formatter, typecheck, and codegen config
 - CI workflows and pre-commit / task runner config
 - existing instruction files (`AGENTS.md`, `CLAUDE.md`, `.cursor/rules/`, `.cursorrules`, `.github/copilot-instructions.md`)
-- repo-local OpenCode config such as `opencode.json`
+- repo-local OpenCode config such as `kirincode.json`
 
 If architecture is still unclear after reading config and docs, inspect a small number of representative code files to find the real entrypoints, package boundaries, and execution flow. Prefer reading the files that explain how the system is wired together over random leaf files.
 
@@ -57,7 +57,7 @@ Exclude:
 - long tutorials or exhaustive file trees
 - obvious language conventions
 - speculative claims or anything you could not verify
-- content better stored in another file referenced via `opencode.json` `instructions`
+- content better stored in another file referenced via `kirincode.json` `instructions`
 
 When in doubt, omit.
 

+ 2 - 2
packages/kirincode/src/server/proxy-util.ts

@@ -14,8 +14,8 @@ const hop = new Set([
 function sanitize(out: Headers) {
   for (const key of hop) out.delete(key)
   out.delete("accept-encoding")
-  out.delete("x-opencode-directory")
-  out.delete("x-opencode-workspace")
+  out.delete("x-kirincode-directory")
+  out.delete("x-kirincode-workspace")
 }
 
 export function headers(input: Request | HeadersInit | Record<string, string>, extra?: HeadersInit) {

+ 1 - 1
packages/kirincode/src/server/routes/instance/httpapi/middleware/workspace-routing.ts

@@ -84,7 +84,7 @@ function selectedV2WorkspaceID(
 }
 
 function defaultDirectory(request: HttpServerRequest.HttpServerRequest, url: URL): string {
-  return url.searchParams.get("directory") || request.headers["x-opencode-directory"] || process.cwd()
+  return url.searchParams.get("directory") || request.headers["x-kirincode-directory"] || process.cwd()
 }
 
 function shouldStayOnControlPlane(request: HttpServerRequest.HttpServerRequest, url: URL): boolean {

+ 1 - 1
packages/kirincode/src/server/shared/pty-ticket.ts

@@ -1,5 +1,5 @@
 export const PTY_CONNECT_TICKET_QUERY = "ticket"
-export const PTY_CONNECT_TOKEN_HEADER = "x-opencode-ticket"
+export const PTY_CONNECT_TOKEN_HEADER = "x-kirincode-ticket"
 export const PTY_CONNECT_TOKEN_HEADER_VALUE = "1"
 
 const PTY_CONNECT_PATH = /^\/pty\/[^/]+\/connect$/

+ 4 - 4
packages/kirincode/src/session/llm/request.ts

@@ -187,10 +187,10 @@ export const prepare = Effect.fn("LLMRequestPrep.prepare")(function* (input: Pre
     headers: {
       ...(input.model.providerID.startsWith("kirincode")
         ? {
-            ...(opencodeProjectID ? { "x-opencode-project": opencodeProjectID } : {}),
-            "x-opencode-session": input.sessionID,
-            "x-opencode-request": input.user.id,
-            "x-opencode-client": input.flags.client,
+            ...(opencodeProjectID ? { "x-kirincode-project": opencodeProjectID } : {}),
+            "x-kirincode-session": input.sessionID,
+            "x-kirincode-request": input.user.id,
+            "x-kirincode-client": input.flags.client,
             "User-Agent": USER_AGENT,
           }
         : {

+ 2 - 2
packages/kirincode/src/session/prompt/anthropic.txt

@@ -7,9 +7,9 @@ IMPORTANT: You must NEVER generate or guess URLs for the user unless you are con
 If the user asks for help or wants to give feedback inform them of the following:
 - ctrl+p to list available actions
 - To give feedback, users should report the issue at
-  https://github.com/anomalyco/opencode
+  https://kailin.com.cn/kirincode
 
-When the user directly asks about OpenCode (eg. "can OpenCode do...", "does OpenCode have..."), or asks in second person (eg. "are you able...", "can you do..."), or asks how to use a specific OpenCode feature (eg. implement a hook, write a slash command, or install an MCP server), use the WebFetch tool to gather information to answer the question from OpenCode docs. The list of available docs is available at https://opencode.ai/docs
+When the user directly asks about OpenCode (eg. "can OpenCode do...", "does OpenCode have..."), or asks in second person (eg. "are you able...", "can you do..."), or asks how to use a specific OpenCode feature (eg. implement a hook, write a slash command, or install an MCP server), use the WebFetch tool to gather information to answer the question from OpenCode docs. The list of available docs is available at https://kailin.com.cn/kirincode
 
 # Tone and style
 - Only use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked.

+ 1 - 1
packages/kirincode/src/session/prompt/beast.txt

@@ -1,4 +1,4 @@
-You are opencode, an agent - please keep going until the user’s query is completely resolved, before ending your turn and yielding back to the user.
+You are KirinCode, an agent - please keep going until the user’s query is completely resolved, before ending your turn and yielding back to the user.
 
 Your thinking should be thorough and so it's fine if it's very long. However, avoid unnecessary repetition and verbosity. You should be concise, but thorough.
 

+ 1 - 1
packages/kirincode/src/session/prompt/copilot-gpt-5.txt

@@ -1,5 +1,5 @@
 You are an expert AI programming assistant
-Your name is opencode
+Your name is KirinCode
 Keep your answers short and impersonal.
 <gptAgentInstructions>
 You are a highly sophisticated coding agent with expert-level knowledge across programming languages and frameworks.

+ 4 - 4
packages/kirincode/src/session/prompt/default.txt

@@ -1,12 +1,12 @@
-You are opencode, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
+You are KirinCode, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
 
 IMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files.
 
 If the user asks for help or wants to give feedback inform them of the following:
-- /help: Get help with using opencode
-- To give feedback, users should report the issue at https://github.com/anomalyco/opencode/issues
+- /help: Get help with using KirinCode
+- To give feedback, users should report the issue at https://kailin.com.cn/kirincode
 
-When the user directly asks about opencode (eg 'can opencode do...', 'does opencode have...') or asks in second person (eg 'are you able...', 'can you do...'), first use the WebFetch tool to gather information to answer the question from opencode docs at https://opencode.ai
+When the user directly asks about opencode (eg 'can opencode do...', 'does opencode have...') or asks in second person (eg 'are you able...', 'can you do...'), first use the WebFetch tool to gather information to answer the question from opencode docs at https://kailin.com.cn
 
 # Tone and style
 You should be concise, direct, and to the point. When you run a non-trivial bash command, you should explain what the command does and why you are running it, to make sure the user understands what you are doing (this is especially important when you are running a command that will make changes to the user's system).

+ 1 - 1
packages/kirincode/src/session/prompt/gemini.txt

@@ -1,4 +1,4 @@
-You are opencode, an interactive CLI agent specializing in software engineering tasks. Your primary goal is to help users safely and efficiently, adhering strictly to the following instructions and utilizing your available tools.
+You are KirinCode, an interactive CLI agent specializing in software engineering tasks. Your primary goal is to help users safely and efficiently, adhering strictly to the following instructions and utilizing your available tools.
 
 # Core Mandates
 

+ 2 - 2
packages/kirincode/src/session/prompt/meta.txt

@@ -6,8 +6,8 @@ IMPORTANT: You must NEVER generate or guess URLs for the user unless you are con
 If the user asks for help or wants to give feedback inform them of the following:
 - ctrl+p to list available actions
 - To give feedback, users should report the issue at
-  https://github.com/anomalyco/opencode
-When the user directly asks about OpenCode (eg. "can OpenCode do...", "does OpenCode have..."), or asks in second person (eg. "are you able...", "can you do..."), or asks how to use a specific OpenCode feature (eg. implement a hook, write a slash command, or install an MCP server), use the WebFetch tool to gather information to answer the question from OpenCode docs. The list of available docs is available at https://opencode.ai/docs
+  https://kailin.com.cn/kirincode
+When the user directly asks about OpenCode (eg. "can OpenCode do...", "does OpenCode have..."), or asks in second person (eg. "are you able...", "can you do..."), or asks how to use a specific OpenCode feature (eg. implement a hook, write a slash command, or install an MCP server), use the WebFetch tool to gather information to answer the question from OpenCode docs. The list of available docs is available at https://kailin.com.cn/kirincode
 # Tone and style
 - Only use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked.
 - Your output will be displayed on a command line interface. Your responses should be short and concise. You can use GitHub-flavored markdown for formatting, and will be rendered in a monospace font using the CommonMark specification.

+ 1 - 1
packages/kirincode/src/session/prompt/trinity.txt

@@ -1,4 +1,4 @@
-You are opencode, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
+You are KirinCode, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
 
 # Tone and style
 You should be concise, direct, and to the point. When you run a non-trivial bash command, you should explain what the command does and why you are running it, to make sure the user understands what you are doing (this is especially important when you are running a command that will make changes to the user's system).

+ 1 - 1
packages/kirincode/src/tool/lsp.txt

@@ -19,6 +19,6 @@ All operations require:
 workspaceSymbol also accepts:
 - query: A query string to filter symbols by. Empty string requests all symbols.
 
-For workspaceSymbol, filePath is not sent in the LSP workspace/symbol request. It is used by opencode to select and start the matching LSP server.
+For workspaceSymbol, filePath is not sent in the LSP workspace/symbol request. It is used by KirinCode to select and start the matching LSP server.
 
 Note: LSP servers must be configured for the file type. If no server is available, an error will be returned.

+ 2 - 2
packages/kirincode/tsconfig.json

@@ -9,8 +9,8 @@
     "noUncheckedIndexedAccess": false,
     "customConditions": ["browser"],
     "paths": {
-      "@opencode-ai/plugin": ["./packages/plugin/src"],
-      "@opencode-ai/sdk": ["./packages/sdk/js/src"],
+      "@kirincode-ai/plugin": ["./packages/plugin/src"],
+      "@kirincode-ai/sdk": ["./packages/sdk/js/src"],
       "@/*": ["./src/*"],
       "@test/*": ["./test/*"]
     }

+ 1 - 1
packages/llm/example/tutorial.ts

@@ -57,7 +57,7 @@ const rawOverlayExample = LLM.request({
   prompt: "Show the final HTTP overlay shape.",
   http: {
     body: { metadata: { example: "tutorial" } },
-    headers: { "x-opencode-tutorial": "1" },
+    headers: { "x-kirincode-tutorial": "1" },
     query: { debug: "1" },
   },
 })

+ 1 - 1
packages/llm/package.json

@@ -1,6 +1,6 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "name": "@kirincode-ai/llm",
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/mobile/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/mobile",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "private": true,
   "scripts": {
     "start": "expo start",

+ 1 - 1
packages/plugin/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/plugin",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "license": "MIT",
   "scripts": {

+ 1 - 1
packages/sdk/js/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/sdk",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "license": "MIT",
   "scripts": {

+ 1 - 1
packages/server/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/server",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "private": true,
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/session-ui/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/session-ui",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "private": true,
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/slack/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/slack",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "license": "MIT",
   "scripts": {

+ 1 - 1
packages/stats/app/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/stats-app",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "private": true,
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/stats/core/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/stats-core",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "private": true,
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/stats/server/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/stats-server",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "private": true,
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/tui/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@kirincode-ai/tui",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "private": true,
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/tui/src/attention.ts

@@ -39,7 +39,7 @@ type TuiAttentionHost = TuiAttention & {
 }
 
 const DEFAULT_TITLE = "kirincode"
-const DEFAULT_PACK_ID = "opencode.default"
+const DEFAULT_PACK_ID = "kirincode.default"
 const KV_SOUND_PACK = "attention_sound_pack"
 const TITLE_LIMIT = 80
 const MESSAGE_LIMIT = 240

+ 1 - 1
packages/tui/src/component/error-component.tsx

@@ -206,7 +206,7 @@ function buildIssueURL(message: string, stack: string) {
   // the contributing-guidelines compliance check, which pushes for system info.
   const url = new URL("https://github.com/anomalyco/kirincode/issues/new?template=bug-report.yml")
   url.searchParams.set("title", `TUI crash: ${message}`)
-  url.searchParams.set("opencode-version", InstallationVersion)
+  url.searchParams.set("kirincode-version", InstallationVersion)
   url.searchParams.set("os", describeOS())
   url.searchParams.set("terminal", describeTerminal())
   url.searchParams.set(

+ 1 - 1
packages/tui/src/routes/session/index.tsx

@@ -90,7 +90,7 @@ const GO_UPSELL_FREE_TIER_DONT_SHOW = "go_upsell_dont_show"
 const GO_UPSELL_ACCOUNT_RATE_LIMIT_LAST_SEEN_AT = "go_upsell_account_rate_limit_last_seen_at"
 const GO_UPSELL_ACCOUNT_RATE_LIMIT_DONT_SHOW = "go_upsell_account_rate_limit_dont_show"
 const GO_UPSELL_WINDOW = 86_400_000 // 24 hrs
-const GO_UPSELL_PROVIDERS = new Set(["kirincode", "opencode-go"])
+const GO_UPSELL_PROVIDERS = new Set(["kirincode", "kirincode-go"])
 
 export const alwaysSeparate = new WeakSet<BoxRenderable>()
 

+ 1 - 1
packages/ui/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@kirincode-ai/ui",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "type": "module",
   "license": "MIT",
   "repository": {

+ 1 - 1
packages/web/package.json

@@ -2,7 +2,7 @@
   "name": "@kirincode-ai/web",
   "type": "module",
   "license": "MIT",
-  "version": "0.4.3",
+  "version": "0.5.0",
   "scripts": {
     "dev": "astro dev",
     "dev:remote": "VITE_API_URL=https://api.kirincode.ai astro dev",